mmdb-1.23.2.1/0000755000175100017510000000000011476204204007660 500000000000000mmdb-1.23.2.1/examples/0000755000175100017510000000000011476204204011476 500000000000000mmdb-1.23.2.1/examples/extr_exmp1.cpp0000644000175100017510000001270611471777425014243 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File extr_exmp1.cpp // // Example: // Extraction of atoms from MMDB. // // 16 Feb 2001 // // SGI make: f77 -o extr_exmp1 extr_exmp1.cpp mmdb.a -lm -lC // // ================================================================= // #include #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Extraction of atoms from MMDB.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "extr_exmp1 coor_file\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager; int RC,lcount; char S[500]; PCAtom A1,A2; if (argc<2) { PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); MMDBManager = NULL; // all pointers should be either NULL or allocated // 2. Create an instance of MMDB MMDBManager = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager->SetFlag ( MMDBF_PrintCIFWarnings ); // 3.2 MMDB provides the following function for reading // coordinate files with automatical format recognition: RC = MMDBManager->ReadCoorFile ( argv[1] ); // 3.3 Check for possible errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Extract atoms. Each atom is identified by model number // (1 if no models mentioned in coordinate file), chain ID // within the model, residue number and insertion code // within the chain and atom name (and chemical element name) // and alternate location indicator within the residue. // 4.1 GetAtom() has two forms. The first one takes the // atom identifying data from individual parameters // (check in file mmdb_coormngr.h). A1 = MMDBManager->GetAtom ( 1,"A",33,"","CA",NULL,"" ); if (!A1) { // atom not found, identify the reason: switch (MMDBManager->CoorIDCode) { case CID_NoModel : strcpy ( S,"Model not found" ); break; case CID_NoChain : strcpy ( S,"Chain not found in model" ); break; case CID_NoResidue : strcpy ( S,"Residue not found in chain" ); break; case CID_NoAtom : strcpy ( S,"Atom not found in residue" ); break; default : strcpy ( S,"Unknown error code" ); } printf ( " failed on atom #1: %s\n",S ); } else // class CAtom (cf. file mmdb_atom.h) allows for direct access // to atom parameters. It is Ok to read them, but editing // operations should be done through the mmdb interface to // ensure that internal links and tables are maintained // properly. printf ( " atom #1: x=%12g y=%12g z=%12g\n", A1->x,A1->y,A1->z ); // 4.2 Second form of GetAtom() takes the atom identifying data // from a string of a special syntax. Check this in file // mmdb_coormngr.h. A2 = MMDBManager->GetAtom ( "/1/B/131/C5" ); if (!A2) { // atom not found, identify the reason: switch (MMDBManager->CoorIDCode) { case CID_NoModel : strcpy ( S,"Model not found" ); break; case CID_NoChain : strcpy ( S,"Chain not found in model" ); break; case CID_NoResidue : strcpy ( S,"Residue not found in chain" ); break; case CID_NoAtom : strcpy ( S,"Atom not found in residue" ); break; case CID_WrongPath : strcpy ( S,"Wrong syntax of atom path" ); break; default : strcpy ( S,"Unknown error code" ); } printf ( " failed on atom #2: %s\n",S ); } else // see remark in similar place above. printf ( " atom #2: x=%12g y=%12g z=%12g\n", A2->x,A2->y,A2->z ); // 5. A formally correct style of programming requires you // to explicitely release any allocated memory before // your application quits. if (MMDBManager) delete MMDBManager; return 0; } mmdb-1.23.2.1/examples/sel_exmp4.cpp0000644000175100017510000001470511471777425014050 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File sel_exmp4.cpp // // Example: // Selection of atoms in a sphere. The parameters are chosen // such that the final selection includes the same atoms as // those contacting in sel_exmp1.cpp . // // 08 Mar 2001 // // SGI make: f77 -o sel_exmp4 sel_exmp4.cpp mmdb.a -lm -lC // // ================================================================= // #include #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Selecting atoms in a sphere.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "sel_exmp4 coor_file [sel_coor_file]\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format, [] means an optional parameter.\n" "\n" "If 'sel_coor_file' is given, it will receive selected\n" "atoms in PDB format.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager1,MMDBManager2; int RC,lcount; char S[500]; int selHnd,nSelAtoms,i; PPCAtom SelAtom; if (argc<2) { PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); MMDBManager1 = NULL; // all pointers should be either NULL or MMDBManager2 = NULL; // allocated // 2. Create an instance of MMDB MMDBManager1 = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager1->SetFlag ( MMDBF_PrintCIFWarnings ); // 3.2 MMDB provides the following function for reading // coordinate files with automatic format recognition // for PDB, mmCIF and MMDB BINary files: RC = MMDBManager1->ReadCoorFile ( argv[1] ); // 3.3 Check for possible reading errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager1->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager1; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager1->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Select atoms. // 4.1 Each _new_ selection starts with creation of selection // handle (a handle may be used in several selections) selHnd = MMDBManager1->NewSelection(); // 4.2 Select atoms as needed; first select C_alpha atoms. // Check the selection function and its parameters in file // mmdb_selmngr.h . MMDBManager1->SelectAtoms ( selHnd, 0,"A",ANY_RES,"*",ANY_RES,"*", "*","CA","C","*" ); // Retrieve the index of 1st selection: MMDBManager1->GetSelIndex ( selHnd, SelAtom,nSelAtoms ); // Now select only those of already selected which are // found within a 10-angstrom sphere centered at 34th // C_alpha atom. Check the selection function and its // parameters in file mmdb_selmngr.h . if (nSelAtoms<34) { printf ( " Chain 'A' is shorter than 34 residues.\n" ); delete MMDBManager1; return 2; } MMDBManager1->SelectSphere ( selHnd,STYPE_ATOM, SelAtom[33]->x, SelAtom[33]->y, SelAtom[33]->z, 10.0, SKEY_AND ); // 4.3 Selected atoms may be accessed through the selection // index. Selection index is merely a vector of pointers // on the selected atoms. Check the function and its // parameters in file mmdb_selmngr.h MMDBManager1->GetSelIndex ( selHnd, SelAtom,nSelAtoms ); printf ( " %i CA atoms selected in the sphere.\n",nSelAtoms ); // print the selection. for (i=0;iGetAtomID(S), SelAtom[i]->x,SelAtom[i]->y,SelAtom[i]->z ); if (argc>2) { // 5. An output file for selected atoms was specified. // Collect selected atoms in a separate instance of MMDB // and then purge them into the file. // 5.1 Create one more instance of MMDB MMDBManager2 = new CMMDBManager(); // 5.2 It looks like a good idea to copy the header and // crystallographic information into output file // as well. However this is not needed by MMDB to // function. Check the copy function and its parameters // in file mmdb_manager.h . MMDBManager2->Copy ( MMDBManager1,MMDBFCM_Title | MMDBFCM_Cryst ); // 5.3 Stuffing an empty MMDB with atoms. Check the // corresponding function and its parameters in file // mmdb_file.h . for (i=0;iPutAtom ( i+1,SelAtom[i] ); // 5.4 Purge the newly composed MMDB into the file printf ( " ...writing PDB file %s\n",argv[2] ); RC = MMDBManager2->WritePDBASCII ( argv[2] ); } // 6. A formally correct style of programming requires you // to explicitely release any allocated memory before // your application quits. // NOTE: we do not dispose the selection index SelAtom. // It will be disposed by its manager automatically, // therefore an attempt to dispose it from the application // will cause a crash. if (MMDBManager1) delete MMDBManager1; if (MMDBManager2) delete MMDBManager2; return 0; } mmdb-1.23.2.1/examples/spseatoms.cpp0000644000175100017510000001220411471777425014156 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File spseatoms.cpp // // Example: // Superposing two atom sets. // // 17 Sep 2002 // // SGI make: f77 -o spseatoms spseatoms.cpp mmdb.a -lm -lC // // ================================================================= // #include #include #include "mmdb_manager.h" void PrintInstructions ( pstr argv0 ) { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Superposing two atom sets.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "%s coor_file\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format.\n" "\n",argv0 ); } // =========================================================== int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager; int RC,lcount; char S[500]; mat44 T; realtype rmsd,dx,dy,dz; int i,j,nA; PPCAtom A1,A2; if (argc<2) { PrintInstructions ( argv[0] ); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); // 2. Create an instance of MMDB MMDBManager = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager->SetFlag ( MMDBF_PrintCIFWarnings ); // 3.2 MMDB provides the following function for reading // coordinate files with automatic format recognition // for PDB, mmCIF and MMDB BINary files: RC = MMDBManager->ReadCoorFile ( argv[1] ); // 3.3 Check for possible errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Get atoms to play with MMDBManager->GetAtomTable ( A2,nA ); // and copy them into a new set of atoms: A1 = new PCAtom[nA]; for (i=0;iCopy ( A2[i] ); } printf ( " --- %i atoms were selected for rotation.\n",nA ); // 5. Rotate the newly created set of atoms EulerRotation ( A1, nA, Pi/2.0, // Euler's alpha 0.0, // Euler's beta 0.0, // Euler's gamma 0.0, // x-center of rotation 0.0, // y-center of rotation 0.0 // z-center of rotation ); // 6. Calculate the rotational-translational matrix that // superposes A1 over A2 i = SuperposeAtoms ( T,A1,nA,A2,NULL ); printf ( " --- superposition done with return code %i.\n\n" " Rotational-translational matrix:\n\n",i ); for (i=0;i<4;i++) { for (j=0;j<4;j++) printf ( " %11.4g",T[i][j] ); printf ( "\n" ); } // 7. Apply the transormation matrix to A1 and calculate the // total RMS difference rmsd = 0.0; j = 0; for (i=0;iTer) { A1[i]->Transform ( T ); dx = A1[i]->x - A2[i]->x; dy = A1[i]->y - A2[i]->y; dz = A1[i]->z - A2[i]->z; rmsd += dx*dx + dy*dy + dz*dz; j++; } if (j>0) rmsd = sqrt(rmsd/j); printf ( "\n --- achieved rmsd %11.4g\n",rmsd ); // 8. Since array A1 was allocated by the application, the // application is responsible for its disposal. Array A2 // will be disposed by MMDB manager. for (i=0;i #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "Coordinate file conversions PDB<->CIF<->BIN<->PDB\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "coorfile -k input_file output_file\n" "\n" "where key 'k' specifies the format of output_file:\n" "\n" " key Format\n" " ------------------------------\n" " PDB PDB file\n" " CIF CIF file\n" " BIN MMDB binary file\n" " ------------------------------\n" "\n" "Format of input_file is detected automatically.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager; int kin,kout,RC,lcount; char S[500]; if (argc<4) { printf ( " ***** WRONG COMMAND LINE.\n" ); PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); // 2. Determine the format of output file kout = -10; if (!strcasecmp(argv[1],"-PDB")) kout = MMDB_FILE_PDB; if (!strcasecmp(argv[1],"-CIF")) kout = MMDB_FILE_CIF; if (!strcasecmp(argv[1],"-BIN")) kout = MMDB_FILE_Binary; if (kout<0) { printf ( " ***** WRONG OPERATION KEY.\n" ); PrintInstructions(); return 2; } // 3. Determine the format of input file. Although MMDB // provides a function for reading with automatical recgnition // of input file format (see e.g. example sel_exmp1.cpp), here // we demonstrate a conservative approach, which may be useful // for enforcing the input of incomplete files (doubtful, // honestly) or just checking the file format without actually // reading it. kin = isMMDBBIN ( argv[2] ); if (kin<0) { printf ( " ***** INPUT FILE\n\n %s\n\nDOES NOT EXIST.",argv[2] ); return 3; } if (kin==0) kin = MMDB_FILE_Binary; else if (isPDB(argv[2])==0) kin = MMDB_FILE_PDB; else if (isCIF(argv[2])==0) kin = MMDB_FILE_CIF; else { printf ( " ***** UNRECOGNIZABLE FORMAT OF INPUT FILE\n" " %s\n", argv[2] ); return 4; } // 4. Create an instance of MMDB MMDBManager = new CMMDBManager(); // 4. Read coordinate file. // 4.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager->SetFlag ( MMDBF_PrintCIFWarnings | MMDBF_FixSpaceGroup | MMDBF_IgnoreDuplSeqNum | MMDBF_IgnoreHash ); // 4.2 MMDB provides separate functions for reading the // coordinate files in each format (note that there is // a common function for all formats, see e.g. example // sel_exmp1.cpp): switch (kin) { default : case MMDB_FILE_PDB : printf ( " ...reading PDB file %s\n",argv[2] ); RC = MMDBManager->ReadPDBASCII ( argv[2] ); break; case MMDB_FILE_CIF : printf ( " ...reading CIF file %s\n",argv[2] ); RC = MMDBManager->ReadCIFASCII ( argv[2] ); break; case MMDB_FILE_Binary : printf ( " ...reading MMDB binary file %s\n",argv[2] ); RC = MMDBManager->ReadMMDBF ( argv[2] ); } // 4.3 Check for possible errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager->GetInputBuffer ( S, lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager; return 5; } else printf ( " --- Ok.\n" ); printf ( " Total %i atoms\n" " Space group %s\n" " Space group fix %s\n", MMDBManager->GetNumberOfAtoms(), MMDBManager->GetSpaceGroup (), MMDBManager->GetSpaceGroupFix() ); if (MMDBManager->isScaleMatrix()) printf ( " SCALE matrix is given\n" ); else printf ( " SCALE matrix is not given\n" ); mat44 RO,RF; MMDBManager->GetROMatrix ( RO ); Mat4Inverse ( RO,RF ); printf ( "\n Orthogonalisation matrix:\n\n" " %9.7f %9.7f %9.7f %9.7f\n" " %9.7f %9.7f %9.7f %9.7f\n" " %9.7f %9.7f %9.7f %9.7f\n\n\n", RF[0][0],RF[0][1],RF[0][2],RF[0][3], RF[1][0],RF[1][1],RF[1][2],RF[1][3], RF[2][0],RF[2][1],RF[2][2],RF[2][3] ); // 5. Now output the whole MMDB in the required format: switch (kout) { default : case MMDB_FILE_PDB : printf ( " ...writing PDB file %s\n",argv[3] ); RC = MMDBManager->WritePDBASCII ( argv[3] ); break; case MMDB_FILE_CIF : printf ( " ...writing CIF file %s\n",argv[3] ); RC = MMDBManager->WriteCIFASCII ( argv[3] ); break; case MMDB_FILE_Binary : printf ( " ...writing MMDB binary file %s\n",argv[3] ); RC = MMDBManager->WriteMMDBF ( argv[3] ); } // 6. Checking for write-file errors is obsolete, // but nevertheless ... if (RC) { printf ( " ***** ERROR #%i WRITE:\n\n %s\n\n", RC,GetErrorDescription(RC) ); delete MMDBManager; return 6; } else printf ( " --- Ok.\n" ); delete MMDBManager; return 0; } mmdb-1.23.2.1/examples/sel_exmp1.cpp0000644000175100017510000001673511471777425014052 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File sel_exmp1.cpp // // Example: // Selection of atoms and looking for contacts between on of // them and all others. // // 15 May 2001 // // SGI make: f77 -o sel_exmp1 sel_exmp1.cpp mmdb.a -lm -lC // // ================================================================= // #include #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Selecting atoms and looking for contacts between one of them\n" "and all others.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "sel_exmp1 coor_file [sel_coor_file]\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format, [] means an optional parameter.\n" "\n" "If 'sel_coor_file' is given, it will receive selected\n" "atoms in PDB format.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager1,MMDBManager2; int RC,lcount; char S[500]; int selHnd,nSelAtoms,i; PPCAtom SelAtom; PSContact contact; int ncontacts; if (argc<2) { PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); MMDBManager1 = NULL; // all pointers should be either NULL or MMDBManager2 = NULL; // allocated // 2. Create an instance of MMDB MMDBManager1 = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager1->SetFlag ( MMDBF_PrintCIFWarnings | MMDBF_IgnoreDuplSeqNum ); // 3.2 MMDB provides the following function for reading // coordinate files with automatic format recognition // for PDB, mmCIF and MMDB BINary files: RC = MMDBManager1->ReadCoorFile ( argv[1] ); // 3.3 Check for possible errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager1->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager1; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager1->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Select atoms. // 4.1 Each _new_ selection starts with creation of selection // handle (a handle may be used in several selections) selHnd = MMDBManager1->NewSelection(); // 4.2 Select atoms as needed. Check the selection function // and its parameters in file mmdb_selmngr.h MMDBManager1->SelectAtoms ( selHnd, 0,"A",ANY_RES,"*",ANY_RES,"*","*", "CA","C","*" ); // 4.3 Selected atoms may be accessed through the selection // index. Selection index is merely a vector of pointers // on the selected atoms. Check the function and its // parameters in file mmdb_selmngr.h MMDBManager1->GetSelIndex ( selHnd, SelAtom,nSelAtoms ); printf ( " %i atoms selected.\n",nSelAtoms ); if (nSelAtoms>0) { if (SelAtom[0]->isInSelection(selHnd)) printf ( " Atom '%s' is in selection\n",SelAtom[0]->name ); else printf ( " Atom->isInSelection() failed.\n" ); } // 4.4 Find contacts between one of the selected atoms and all // others. Here we use dynamical allocation of contacts' index. // See details and the function description in file // mmdb_selmngr.h contact = NULL; // this is a _must_ for dynamically allocated index MMDBManager1->SeekContacts ( SelAtom,nSelAtoms,33,0.0,10.0,0,contact, ncontacts ); printf ( " %i contacts found:\n",ncontacts ); // print contacts. Check with description of the structure SContact // in file mmdb_selmngr.h . for (i=0;i" " /%i/%s/%i(%s).%1s/%s[%s]:%1s %10.4f A\n", SelAtom[contact[i].id1]->GetModelNum(), SelAtom[contact[i].id1]->GetChainID(), SelAtom[contact[i].id1]->GetSeqNum(), SelAtom[contact[i].id1]->GetResName(), SelAtom[contact[i].id1]->GetInsCode(), SelAtom[contact[i].id1]->name, SelAtom[contact[i].id1]->element, SelAtom[contact[i].id1]->altLoc, SelAtom[contact[i].id2]->GetModelNum(), SelAtom[contact[i].id2]->GetChainID(), SelAtom[contact[i].id2]->GetSeqNum(), SelAtom[contact[i].id2]->GetResName(), SelAtom[contact[i].id2]->GetInsCode(), SelAtom[contact[i].id2]->name, SelAtom[contact[i].id2]->element, SelAtom[contact[i].id2]->altLoc, contact[i].dist ); // since the contact index was dynamically allocated, // the application must dispose it when it is no longer needed: if (contact) delete contact; if (argc>2) { // 5. An output file for selected atoms was specified. // Collect selected atoms in a separate instance of MMDB // and then purge them into the file. // 5.1 Create one more instance of MMDB MMDBManager2 = new CMMDBManager(); // 5.2 It looks like a good idea to copy the header and // crystallographic information into output file // as well. However this is not needed by MMDB to // function. Check the copy function and its parameters // in file mmdb_manager.h . MMDBManager2->Copy ( MMDBManager1,MMDBFCM_Title | MMDBFCM_Cryst ); // 5.3 Stuffing an empty MMDB with atoms. Check the // corresponding function and its parameters in file // mmdb_file.h . for (i=0;iPutAtom ( i+1,SelAtom[i] ); // 5.4 Purge the newly composed MMDB into the file printf ( " ...writing PDB file %s\n",argv[2] ); RC = MMDBManager2->WritePDBASCII( argv[2] ); } // 6. A formally correct style of programming requires you // to explicitely release any allocated memory before // your application quits. // NOTE: we do not dispose the selection index SelAtom. // It will be disposed by its manager automatically, // therefore an attempt to dispose it from the application // will cause a crash. if (MMDBManager1) delete MMDBManager1; if (MMDBManager2) delete MMDBManager2; return 0; } mmdb-1.23.2.1/examples/Makefile.am0000644000175100017510000000223011471777425013466 00000000000000## -*- mode: Makefile ; mode: font-lock -*- ## This file is to be processed by automake. AUTOMAKE_OPTIONS = foreign LIBMM = $(top_builddir)/src/libmmdb.la LDADD = $(LIBMM) INCLUDES = -I$(top_srcdir)/src noinst_PROGRAMS = coorfile sel_exmp1 sel_exmp2 sel_exmp3 sel_exmp4 sel_exmp5 \ sel_exmp6 extr_exmp1 spseatoms sse_exmp udatoms udd_exmp1 xml_exmp coorfile_SOURCES = coorfile.cpp #coorfile_LDADD = $(LIBMM) sel_exmp1_SOURCES = sel_exmp1.cpp #sel_exmp1_LDADD = $(LIBMM) sel_exmp2_SOURCES = sel_exmp2.cpp #sel_exmp2_LDADD = $(LIBMM) sel_exmp3_SOURCES = sel_exmp3.cpp #sel_exmp3_LDADD = $(LIBMM) sel_exmp4_SOURCES = sel_exmp4.cpp #sel_exmp4_LDADD = $(LIBMM) sel_exmp5_SOURCES = sel_exmp5.cpp #sel_exmp5_LDADD = $(LIBMM) sel_exmp6_SOURCES = sel_exmp6.cpp #sel_exmp6_LDADD = $(LIBMM) extr_exmp1_SOURCES = extr_exmp1.cpp #extr_exmp1_LDADD = $(LIBMM) spseatoms_SOURCES = spseatoms.cpp #spseatoms_LDADD = $(LIBMM) sse_exmp_SOURCES = spseatoms.cpp #sse_exmp_LDADD = $(LIBMM) udatoms_SOURCES = spseatoms.cpp #udatoms_LDADD = $(LIBMM) udd_exmp1_SOURCES = spseatoms.cpp #udd_exmp1_LDADD = $(LIBMM) xml_exmp_SOURCES = spseatoms.cpp #xml_exmp_LDADD = $(LIBMM) #### mmdb-1.23.2.1/examples/sel_exmp3.cpp0000644000175100017510000001425211471777425014044 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File sel_exmp3.cpp // // Example: // Selection of atoms and looking for contacts between two // selections. // // 15 May 2001 // // SGI make: f77 -o sel_exmp3 sel_exmp3.cpp mmdb.a -lm -lC // // ================================================================= // #include #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Selecting atoms and looking for contacts between two\n" "selections.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "sel_exmp3 coor_file\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager; int RC,lcount; char S[500],AID[100]; int selHnd1,selHnd2; int nSelAtoms1,nSelAtoms2,i; PPCAtom SelAtom1,SelAtom2; PSContact contact; int ncontacts; if (argc<2) { PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); // 2. Create an instance of MMDB MMDBManager = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager->SetFlag ( MMDBF_PrintCIFWarnings ); // 3.2 MMDB provides the following function for reading // coordinate files with automatic format recognition // for PDB, mmCIF and MMDB BINary files: RC = MMDBManager->ReadCoorFile ( argv[1] ); // 3.3 Check for possible errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Select atoms. // 4.1 Each _new_ selection starts with creation of selection // handle (a handle may be used in several selections) selHnd1 = MMDBManager->NewSelection(); selHnd2 = MMDBManager->NewSelection(); // 4.2 Select atoms as needed. Check the selection function // and its parameters in file mmdb_selmngr.h // first selection - C_alphas of chain A MMDBManager->SelectAtoms ( selHnd1, 1,"A",ANY_RES,"*",ANY_RES,"*", "*","CA","C","*" ); // second selection - sulphurs of all chains MMDBManager->SelectAtoms ( selHnd2, 1,"*",ANY_RES,"*",ANY_RES,"*", "*","*","S","*" ); // plus we add /1/A/34/CA to 2nd set to see that it will // produce the same selections like in examples 1 and 2 // (sel_exmp1.cpp and sel_exmp2.cpp): MMDBManager->SelectAtoms ( selHnd2, 1,"A",34,"",34,"","*","CA","*","*" ); // 4.3 Selected atoms may be accessed through the selection // index. Selection index is merely a vector of pointers // on the selected atoms. Check the function and its // parameters in file mmdb_selmngr.h MMDBManager->GetSelIndex ( selHnd1, SelAtom1,nSelAtoms1 ); MMDBManager->GetSelIndex ( selHnd2, SelAtom2,nSelAtoms2 ); printf ( " Selection #1: %i atoms.\n",nSelAtoms1 ); printf ( " Selection #2: %i atoms.\n",nSelAtoms2 ); // 4.4 Find contacts between 2 selected sets. Here we use // dynamical allocation of contacts' index. See details // and the function description in file mmdb_selmngr.h contact = NULL; // this is a _must_ for dynamically allocated index // here we put 2nd selection first because this allows us easier // to output all C_alpha contacts for each sulphur atoms plus // /1/A/34/CA . Otherwise we would obtain all sulphur contacts // plus /1/A/34/CA contacts for each /1/*/*/CA, which is the same // information just arranged differently in array 'contact'. MMDBManager->SeekContacts ( SelAtom2,nSelAtoms2, SelAtom1,nSelAtoms1, 0.0,10.0,0,contact,ncontacts ); printf ( " %i contacts found:\n",ncontacts ); // print contacts. Check with description of the structure SContact // in file mmdb_selmngr.h . for (i=0;i %s %10.4f A\n", SelAtom2[contact[i].id1]->GetAtomID(S), SelAtom1[contact[i].id2]->GetAtomID(AID), contact[i].dist ); // since the contact index was dynamically allocated, // the application must dispose it when it is no longer needed: if (contact) delete contact; // 5. A formally correct style of programming requires you // to explicitely release any allocated memory before // your application quits. // NOTE: we do not dispose the selection indices SelAtom1 // and SelAtom2. they will be disposed by their manager // (which is MMDBManager) automatically. An attempt to // dispose them from the application will cause a crash. if (MMDBManager) delete MMDBManager; return 0; } mmdb-1.23.2.1/examples/sel_exmp6.cpp0000644000175100017510000001564011471777425014051 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File sel_exmp6.cpp // // Example: // Selection of residues and chains. Parameters are chosen for // file rnase.pdb (entry 1sar). // // 04 May 2001 // // SGI make: f77 -o sel_exmp6 sel_exmp6.cpp mmdb.a -lm -lC // // ================================================================= // #include #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Selecting residues and chains.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "sel_exmp2 coor_file\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager; int RC,lcount; char S[500]; int selHnd,selHnd1,nSelResidues,nSelAtoms,nSelChains,i; PPCResidue SelResidue; PPCAtom SelAtom; PPCChain SelChain; if (argc<2) { PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); // 2. Create an instance of MMDB MMDBManager = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager->SetFlag ( MMDBF_PrintCIFWarnings ); // 3.2 MMDB provides the following function for reading // coordinate files with automatic format recognition // for PDB, mmCIF and MMDB BINary files: RC = MMDBManager->ReadCoorFile ( argv[1] ); // 3.3 Check for possible errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Select atoms. // 4.1 Each _new_ selection starts with creation of selection // handle (a handle may be used in several selections) selHnd = MMDBManager->NewSelection(); // 4.2 Select residues as needed. In this examples, we select only // residues of chain A containing sulphur. Check the function // and its parameters in file mmdb_selmngr.h MMDBManager->Select ( selHnd,STYPE_RESIDUE, 0,"A",ANY_RES,"*",ANY_RES,"*", "*","*","S","*",SKEY_NEW ); // 4.3 Selected residues may be accessed through the selection // index. Selection index is merely a vector of pointers // on the selected residues. Check the function and its // parameters in file mmdb_selmngr.h MMDBManager->GetSelIndex ( selHnd, SelResidue,nSelResidues ); printf ( " point 4.3 %i residues selected.\n",nSelResidues ); for (i=0;iGetResidueID(S) ); // 4.4 Add GLY and SER residues MMDBManager->Select ( selHnd,STYPE_RESIDUE, 0,"A",ANY_RES,"*",ANY_RES,"*", "GLY,SER","*","*","*",SKEY_OR ); MMDBManager->GetSelIndex ( selHnd, SelResidue,nSelResidues ); printf ( " point 4.4 %i residues selected.\n",nSelResidues ); for (i=0;iGetResidueID(S) ); // 4.5 Leave those falling into a sphere MMDBManager->SelectSphere ( selHnd,STYPE_RESIDUE, 60.5370,-0.2350,17.3250,10.0, SKEY_AND ); MMDBManager->GetSelIndex ( selHnd, SelResidue,nSelResidues ); printf ( " point 4.5 %i residues selected.\n",nSelResidues ); for (i=0;iGetResidueID(S) ); // 4.6 Select all atoms in selected residues selHnd1 = MMDBManager->NewSelection(); MMDBManager->Select ( selHnd1,STYPE_ATOM,selHnd,SKEY_NEW ); MMDBManager->GetSelIndex ( selHnd1, SelAtom,nSelAtoms ); printf ( " point 4.6 %i atoms selected.\n",nSelAtoms ); for (i=0;iGetAtomID(S) ); // 4.7 Select all Calpha atoms in selected residues. // This can be done in at least two ways; we // choose here not the most efficient one in // order to demonstrate the functionality // of the selection propagation function MMDBManager->Select ( selHnd1,STYPE_ATOM, 0,"A",ANY_RES,"*",ANY_RES,"*", "*","CA","C","*",SKEY_NEW ); MMDBManager->Select ( selHnd1,STYPE_ATOM,selHnd,SKEY_AND ); MMDBManager->GetSelIndex ( selHnd1, SelAtom,nSelAtoms ); printf ( " point 4.7 %i Calpha atoms selected.\n",nSelAtoms ); for (i=0;iGetAtomID(S),SelAtom[i]->x, SelAtom[i]->y,SelAtom[i]->z ); // 4.8 Select all the chain which contains selected // residues. Make a notice of using SKEY_NEW in // the following operator. MMDBManager->Select ( selHnd1,STYPE_CHAIN,selHnd,SKEY_NEW ); MMDBManager->GetSelIndex ( selHnd1, SelChain,nSelChains ); printf ( " point 4.8 %i chains selected.\n",nSelChains ); for (i=0;iGetChainID(S) ); // 5. A formally correct style of programming requires you // to explicitely release any allocated memory before // your application quits. // NOTE: we do not dispose the selection indices. // They will be disposed by their manager automatically, // therefore an attempt to dispose them from the application // will cause a crash. if (MMDBManager) delete MMDBManager; return 0; } mmdb-1.23.2.1/examples/sel_exmp2.cpp0000644000175100017510000001777111471777425014054 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File sel_exmp2.cpp // // Example: // Selection of atoms and looking for contacts between them and // a given atom. The selection and contacts found are exactly the // same as those in example sel_exmp1.cpp . // // 15 May 2001 // // SGI make: f77 -o sel_exmp2 sel_exmp2.cpp mmdb.a -lm -lC // // ================================================================= // #include #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Selecting atoms and looking for contacts between them\n" "and a given atom.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "sel_exmp2 coor_file [sel_coor_file]\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format, [] means an optional parameter.\n" "\n" "If 'sel_coor_file' is given, it will receive selected\n" "atoms in PDB format.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager1,MMDBManager2; char AtomID[50]; int RC,lcount; char S[500]; int selHnd,nSelAtoms,i; PPCAtom SelAtom; PCAtom A; PSContact contact; int ncontacts; if (argc<2) { PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); MMDBManager1 = NULL; // all pointers should be either NULL or MMDBManager2 = NULL; // allocated // 2. Create an instance of MMDB MMDBManager1 = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager1->SetFlag ( MMDBF_PrintCIFWarnings ); // 3.2 MMDB provides the following function for reading // coordinate files with automatic format recognition // for PDB, mmCIF and MMDB BINary files: RC = MMDBManager1->ReadCoorFile ( argv[1] ); // 3.3 Check for possible errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager1->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager1; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager1->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Select atoms. // 4.1 Each _new_ selection starts with creation of selection // handle (a handle may be used in several selections) selHnd = MMDBManager1->NewSelection(); // 4.2 Select atoms as needed. Check the selection function // and its parameters in file mmdb_selmngr.h MMDBManager1->SelectAtoms ( selHnd, 0,"A",ANY_RES,"*",ANY_RES,"*", "*","CA","C","*" ); // 4.3 Selected atoms may be accessed through the selection // index. Selection index is merely a vector of pointers // on the selected atoms. Check the function and its // parameters in file mmdb_selmngr.h MMDBManager1->GetSelIndex ( selHnd, SelAtom,nSelAtoms ); printf ( " %i atoms selected.\n",nSelAtoms ); // 4.4 Get 1st atom for contacts. There are two different ways // to extract a single atom from MMDB (cf. file extr_exmp1.cpp). // Here we prefer the method based on atom ID just because // it saves a few lines at making printouts. Check the function // and its parameters in file mmdb_coormngr.h . strcpy ( AtomID,"/1/A/34/CA[C]" ); A = MMDBManager1->GetAtom ( AtomID ); if (!A) { // atom not found, identify the reason: printf ( " Atom '%s' not found: ",AtomID ); switch (MMDBManager1->CoorIDCode) { case CID_NoModel : printf ( "no such model.\n" ); break; case CID_NoChain : printf ( "no such chain in model.\n" ); break; case CID_NoResidue : printf ( "no such residue in chain\n" ); break; case CID_NoAtom : printf ( "no such atom in residue\n" ); break; case CID_WrongPath : printf ( "wrong atom ID syntax\n" ); break; default : printf ( "unknown error code\n" ); } } else { // 4.5 Find contacts between just extracted atom and all selected // atoms. Here we use dynamical allocation of contacts' index. // See details and the function description in file // mmdb_selmngr.h contact = NULL; // this is a _must_ for dynamically allocated index MMDBManager1->SeekContacts ( A,SelAtom,nSelAtoms,0.0,10.0,0,contact, ncontacts ); printf ( " %i contacts found:\n",ncontacts ); // print contacts. Check with description of the structure SContact // in file mmdb_selmngr.h . for (i=0;i" " /%i/%s/%i(%s).%1s/%s[%s]:%1s %10.4f A\n", AtomID, SelAtom[contact[i].id2]->GetModelNum(), SelAtom[contact[i].id2]->GetChainID(), SelAtom[contact[i].id2]->GetSeqNum(), SelAtom[contact[i].id2]->GetResName(), SelAtom[contact[i].id2]->GetInsCode(), SelAtom[contact[i].id2]->name, SelAtom[contact[i].id2]->element, SelAtom[contact[i].id2]->altLoc, contact[i].dist ); // since the contact index was dynamically allocated, // the application must dispose it when it is no longer needed: if (contact) delete contact; } if (argc>2) { // 5. An output file for selected atoms was specified. // Collect selected atoms in a separate instance of MMDB // and then purge them into the file. // 5.1 Create one more instance of MMDB MMDBManager2 = new CMMDBManager(); // 5.2 It looks like a good idea to copy the header and // crystallographic information into output file // as well. However this is not needed by MMDB to // function. Check the copy function and its parameters // in file mmdb_manager.h . MMDBManager2->Copy ( MMDBManager1,MMDBFCM_Title | MMDBFCM_Cryst ); // 5.3 Stuffing an empty MMDB with atoms. Check the // corresponding function and its parameters in file // mmdb_file.h . for (i=0;iPutAtom ( i+1,SelAtom[i] ); // 5.4 Purge the newly composed MMDB into the file printf ( " ...writing PDB file %s\n",argv[2] ); RC = MMDBManager2->WritePDBASCII ( argv[2] ); } // 6. A formally correct style of programming requires you // to explicitely release any allocated memory before // your application quits. // NOTE: we do not dispose the selection index SelAtom. // It will be disposed by its manager automatically, // therefore an attempt to dispose it from the application // will cause a crash. if (MMDBManager1) delete MMDBManager1; if (MMDBManager2) delete MMDBManager2; return 0; } mmdb-1.23.2.1/examples/sel_exmp5.cpp0000644000175100017510000001304711471777425014047 00000000000000// // ================================================================= // // MacroMolecular Data Base (MMDB) // // File sel_exmp5.cpp // // Example: // Selection of atoms in a slab (on a certain distance // from a plane). The parameters are chosen such that // atoms are selected within a certain range of X only. // // 08 Mar 2001 // // SGI make: f77 -o sel_exmp5 sel_exmp5.cpp mmdb.a -lm -lC // // ================================================================= // #include #include "mmdb_manager.h" void PrintInstructions() { printf ( "\n" "A MacroMolecular Data Base (MMDB) example:\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "\n" "Selecting atoms in a slab.\n" "\n" "Command line syntax:\n" "~~~~~~~~~~~~~~~~~~~~\n" "\n" "sel_exmp5 coor_file sel_coor_file\n" "\n" "where 'coor_file' is a coordinate file in PDB, mmCIF or\n" "BINary format. 'sel_coor_file' will receive selected atoms" "in PDB format.\n" "\n" ); } int main ( int argc, char ** argv, char ** env ) { PCMMDBManager MMDBManager1,MMDBManager2; int RC,lcount; char S[500]; int selHnd,nSelAtoms,i; PPCAtom SelAtom; if (argc<3) { PrintInstructions(); return 1; } // 1. Make routine initializations, which must always be done // before working with MMDB InitMatType(); // 2. Create an instance of MMDB MMDBManager1 = new CMMDBManager(); // 3. Read coordinate file. // 3.1 Set all necessary read flags -- check with the top of // file mmdb_file.h as needed MMDBManager1->SetFlag ( MMDBF_PrintCIFWarnings ); // 3.2 MMDB provides the following function for reading // coordinate files with automatic format recognition // for PDB, mmCIF and MMDB BINary files: RC = MMDBManager1->ReadCoorFile ( argv[1] ); // 3.3 Check for possible reading errors: if (RC) { // An error was encountered. MMDB provides an error messenger // function for easy error message printing. printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) ); // Location of the error may be identified as precise as line // number and the line itself (PDB only. Errors in mmCIF are // located by category/item name. Errors of reading BINary files // are not locatable and the files are not editable). This // information is now retrieved from MMDB input buffer: MMDBManager1->GetInputBuffer ( S,lcount ); if (lcount>=0) printf ( " LINE #%i:\n%s\n\n",lcount,S ); else if (lcount==-1) printf ( " CIF ITEM: %s\n\n",S ); // dispose instance of MMDB and quit: delete MMDBManager1; return 2; } else { // MMDB allows to identify the type of file that has been just // read: switch (MMDBManager1->GetFileType()) { case MMDB_FILE_PDB : printf ( " PDB" ); break; case MMDB_FILE_CIF : printf ( " mmCIF" ); break; case MMDB_FILE_Binary : printf ( " MMDB binary" ); break; default : printf ( " Unknown (report as a bug!)" ); } printf ( " file %s has been read in.\n",argv[1] ); } // 4. Select atoms. // 4.1 Each _new_ selection starts with creation of selection // handle (a handle may be used in several selections) selHnd = MMDBManager1->NewSelection(); // 4.2 Select atoms as needed. Here we select atoms with // X-coordinates ranging from 45 to 55 angstroms, that // is 50 +/- 5 angstroms. The plane X=50 corresponds // to values (1.0,0,0,50.0) for parameters (a,b,c) which // specify the plane as a*x+b*y+c*z=d. Check the // selection function and its parameters in file // mmdb_selmngr.h . MMDBManager1->SelectSlab ( selHnd,STYPE_ATOM,1.0,0.0,0.0,50.0,5.0 ); // 4.3 Selected atoms may be accessed through the selection // index. Selection index is merely a vector of pointers // on the selected atoms. Check the function and its // parameters in file mmdb_selmngr.h MMDBManager1->GetSelIndex ( selHnd, SelAtom,nSelAtoms ); printf ( " %i atoms selected in the slab.\n",nSelAtoms ); // 5. An output file for selected atoms was specified. // Collect selected atoms in a separate instance of MMDB // and then purge them into the file. // 5.1 Create one more instance of MMDB MMDBManager2 = new CMMDBManager(); // 5.2 It looks like a good idea to copy the header and // crystallographic information into output file // as well. However this is not needed by MMDB to // function. Check the copy function and its parameters // in file mmdb_manager.h . MMDBManager2->Copy ( MMDBManager1,MMDBFCM_Title | MMDBFCM_Cryst ); // 5.3 Stuffing an empty MMDB with atoms. Check the // corresponding function and its parameters in file // mmdb_file.h . for (i=0;iPutAtom ( i+1,SelAtom[i] ); // 5.4 Purge the newly composed MMDB into the file printf ( " ...writing PDB file %s\n",argv[2] ); RC = MMDBManager2->WritePDBASCII ( argv[2] ); // 6. A formally correct style of programming requires you // to explicitely release any allocated memory before // your application quits. // NOTE: we do not dispose the selection index SelAtom. // It will be disposed by its manager automatically, // therefore an attempt to dispose it from the application // will cause a crash. delete MMDBManager1; delete MMDBManager2; return 0; } mmdb-1.23.2.1/examples/Makefile.in0000644000175100017510000004672711475672046013517 00000000000000# 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@ noinst_PROGRAMS = coorfile$(EXEEXT) sel_exmp1$(EXEEXT) \ sel_exmp2$(EXEEXT) sel_exmp3$(EXEEXT) sel_exmp4$(EXEEXT) \ sel_exmp5$(EXEEXT) sel_exmp6$(EXEEXT) extr_exmp1$(EXEEXT) \ spseatoms$(EXEEXT) sse_exmp$(EXEEXT) udatoms$(EXEEXT) \ udd_exmp1$(EXEEXT) xml_exmp$(EXEEXT) subdir = examples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_coorfile_OBJECTS = coorfile.$(OBJEXT) coorfile_OBJECTS = $(am_coorfile_OBJECTS) coorfile_LDADD = $(LDADD) coorfile_DEPENDENCIES = $(LIBMM) am_extr_exmp1_OBJECTS = extr_exmp1.$(OBJEXT) extr_exmp1_OBJECTS = $(am_extr_exmp1_OBJECTS) extr_exmp1_LDADD = $(LDADD) extr_exmp1_DEPENDENCIES = $(LIBMM) am_sel_exmp1_OBJECTS = sel_exmp1.$(OBJEXT) sel_exmp1_OBJECTS = $(am_sel_exmp1_OBJECTS) sel_exmp1_LDADD = $(LDADD) sel_exmp1_DEPENDENCIES = $(LIBMM) am_sel_exmp2_OBJECTS = sel_exmp2.$(OBJEXT) sel_exmp2_OBJECTS = $(am_sel_exmp2_OBJECTS) sel_exmp2_LDADD = $(LDADD) sel_exmp2_DEPENDENCIES = $(LIBMM) am_sel_exmp3_OBJECTS = sel_exmp3.$(OBJEXT) sel_exmp3_OBJECTS = $(am_sel_exmp3_OBJECTS) sel_exmp3_LDADD = $(LDADD) sel_exmp3_DEPENDENCIES = $(LIBMM) am_sel_exmp4_OBJECTS = sel_exmp4.$(OBJEXT) sel_exmp4_OBJECTS = $(am_sel_exmp4_OBJECTS) sel_exmp4_LDADD = $(LDADD) sel_exmp4_DEPENDENCIES = $(LIBMM) am_sel_exmp5_OBJECTS = sel_exmp5.$(OBJEXT) sel_exmp5_OBJECTS = $(am_sel_exmp5_OBJECTS) sel_exmp5_LDADD = $(LDADD) sel_exmp5_DEPENDENCIES = $(LIBMM) am_sel_exmp6_OBJECTS = sel_exmp6.$(OBJEXT) sel_exmp6_OBJECTS = $(am_sel_exmp6_OBJECTS) sel_exmp6_LDADD = $(LDADD) sel_exmp6_DEPENDENCIES = $(LIBMM) am_spseatoms_OBJECTS = spseatoms.$(OBJEXT) spseatoms_OBJECTS = $(am_spseatoms_OBJECTS) spseatoms_LDADD = $(LDADD) spseatoms_DEPENDENCIES = $(LIBMM) am_sse_exmp_OBJECTS = spseatoms.$(OBJEXT) sse_exmp_OBJECTS = $(am_sse_exmp_OBJECTS) sse_exmp_LDADD = $(LDADD) sse_exmp_DEPENDENCIES = $(LIBMM) am_udatoms_OBJECTS = spseatoms.$(OBJEXT) udatoms_OBJECTS = $(am_udatoms_OBJECTS) udatoms_LDADD = $(LDADD) udatoms_DEPENDENCIES = $(LIBMM) am_udd_exmp1_OBJECTS = spseatoms.$(OBJEXT) udd_exmp1_OBJECTS = $(am_udd_exmp1_OBJECTS) udd_exmp1_LDADD = $(LDADD) udd_exmp1_DEPENDENCIES = $(LIBMM) am_xml_exmp_OBJECTS = spseatoms.$(OBJEXT) xml_exmp_OBJECTS = $(am_xml_exmp_OBJECTS) xml_exmp_LDADD = $(LDADD) xml_exmp_DEPENDENCIES = $(LIBMM) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 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 $@ SOURCES = $(coorfile_SOURCES) $(extr_exmp1_SOURCES) \ $(sel_exmp1_SOURCES) $(sel_exmp2_SOURCES) $(sel_exmp3_SOURCES) \ $(sel_exmp4_SOURCES) $(sel_exmp5_SOURCES) $(sel_exmp6_SOURCES) \ $(spseatoms_SOURCES) $(sse_exmp_SOURCES) $(udatoms_SOURCES) \ $(udd_exmp1_SOURCES) $(xml_exmp_SOURCES) DIST_SOURCES = $(coorfile_SOURCES) $(extr_exmp1_SOURCES) \ $(sel_exmp1_SOURCES) $(sel_exmp2_SOURCES) $(sel_exmp3_SOURCES) \ $(sel_exmp4_SOURCES) $(sel_exmp5_SOURCES) $(sel_exmp6_SOURCES) \ $(spseatoms_SOURCES) $(sse_exmp_SOURCES) $(udatoms_SOURCES) \ $(udd_exmp1_SOURCES) $(xml_exmp_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ 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@ MMDB_LT_VERSION = @MMDB_LT_VERSION@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ 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@ AUTOMAKE_OPTIONS = foreign LIBMM = $(top_builddir)/src/libmmdb.la LDADD = $(LIBMM) INCLUDES = -I$(top_srcdir)/src coorfile_SOURCES = coorfile.cpp #coorfile_LDADD = $(LIBMM) sel_exmp1_SOURCES = sel_exmp1.cpp #sel_exmp1_LDADD = $(LIBMM) sel_exmp2_SOURCES = sel_exmp2.cpp #sel_exmp2_LDADD = $(LIBMM) sel_exmp3_SOURCES = sel_exmp3.cpp #sel_exmp3_LDADD = $(LIBMM) sel_exmp4_SOURCES = sel_exmp4.cpp #sel_exmp4_LDADD = $(LIBMM) sel_exmp5_SOURCES = sel_exmp5.cpp #sel_exmp5_LDADD = $(LIBMM) sel_exmp6_SOURCES = sel_exmp6.cpp #sel_exmp6_LDADD = $(LIBMM) extr_exmp1_SOURCES = extr_exmp1.cpp #extr_exmp1_LDADD = $(LIBMM) spseatoms_SOURCES = spseatoms.cpp #spseatoms_LDADD = $(LIBMM) sse_exmp_SOURCES = spseatoms.cpp #sse_exmp_LDADD = $(LIBMM) udatoms_SOURCES = spseatoms.cpp #udatoms_LDADD = $(LIBMM) udd_exmp1_SOURCES = spseatoms.cpp #udd_exmp1_LDADD = $(LIBMM) xml_exmp_SOURCES = spseatoms.cpp 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) --foreign examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/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-noinstPROGRAMS: @list='$(noinst_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 coorfile$(EXEEXT): $(coorfile_OBJECTS) $(coorfile_DEPENDENCIES) @rm -f coorfile$(EXEEXT) $(CXXLINK) $(coorfile_OBJECTS) $(coorfile_LDADD) $(LIBS) extr_exmp1$(EXEEXT): $(extr_exmp1_OBJECTS) $(extr_exmp1_DEPENDENCIES) @rm -f extr_exmp1$(EXEEXT) $(CXXLINK) $(extr_exmp1_OBJECTS) $(extr_exmp1_LDADD) $(LIBS) sel_exmp1$(EXEEXT): $(sel_exmp1_OBJECTS) $(sel_exmp1_DEPENDENCIES) @rm -f sel_exmp1$(EXEEXT) $(CXXLINK) $(sel_exmp1_OBJECTS) $(sel_exmp1_LDADD) $(LIBS) sel_exmp2$(EXEEXT): $(sel_exmp2_OBJECTS) $(sel_exmp2_DEPENDENCIES) @rm -f sel_exmp2$(EXEEXT) $(CXXLINK) $(sel_exmp2_OBJECTS) $(sel_exmp2_LDADD) $(LIBS) sel_exmp3$(EXEEXT): $(sel_exmp3_OBJECTS) $(sel_exmp3_DEPENDENCIES) @rm -f sel_exmp3$(EXEEXT) $(CXXLINK) $(sel_exmp3_OBJECTS) $(sel_exmp3_LDADD) $(LIBS) sel_exmp4$(EXEEXT): $(sel_exmp4_OBJECTS) $(sel_exmp4_DEPENDENCIES) @rm -f sel_exmp4$(EXEEXT) $(CXXLINK) $(sel_exmp4_OBJECTS) $(sel_exmp4_LDADD) $(LIBS) sel_exmp5$(EXEEXT): $(sel_exmp5_OBJECTS) $(sel_exmp5_DEPENDENCIES) @rm -f sel_exmp5$(EXEEXT) $(CXXLINK) $(sel_exmp5_OBJECTS) $(sel_exmp5_LDADD) $(LIBS) sel_exmp6$(EXEEXT): $(sel_exmp6_OBJECTS) $(sel_exmp6_DEPENDENCIES) @rm -f sel_exmp6$(EXEEXT) $(CXXLINK) $(sel_exmp6_OBJECTS) $(sel_exmp6_LDADD) $(LIBS) spseatoms$(EXEEXT): $(spseatoms_OBJECTS) $(spseatoms_DEPENDENCIES) @rm -f spseatoms$(EXEEXT) $(CXXLINK) $(spseatoms_OBJECTS) $(spseatoms_LDADD) $(LIBS) sse_exmp$(EXEEXT): $(sse_exmp_OBJECTS) $(sse_exmp_DEPENDENCIES) @rm -f sse_exmp$(EXEEXT) $(CXXLINK) $(sse_exmp_OBJECTS) $(sse_exmp_LDADD) $(LIBS) udatoms$(EXEEXT): $(udatoms_OBJECTS) $(udatoms_DEPENDENCIES) @rm -f udatoms$(EXEEXT) $(CXXLINK) $(udatoms_OBJECTS) $(udatoms_LDADD) $(LIBS) udd_exmp1$(EXEEXT): $(udd_exmp1_OBJECTS) $(udd_exmp1_DEPENDENCIES) @rm -f udd_exmp1$(EXEEXT) $(CXXLINK) $(udd_exmp1_OBJECTS) $(udd_exmp1_LDADD) $(LIBS) xml_exmp$(EXEEXT): $(xml_exmp_OBJECTS) $(xml_exmp_DEPENDENCIES) @rm -f xml_exmp$(EXEEXT) $(CXXLINK) $(xml_exmp_OBJECTS) $(xml_exmp_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coorfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extr_exmp1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel_exmp1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel_exmp2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel_exmp3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel_exmp4.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel_exmp5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel_exmp6.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spseatoms.Po@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 $(PROGRAMS) 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-noinstPROGRAMS \ 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-noinstPROGRAMS 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 #xml_exmp_LDADD = $(LIBMM) #### # 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: mmdb-1.23.2.1/COPYING0000644000175100017510000010530711472712533010646 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. Section 15 has been amended in accordance with Section 7a) above to address the requirements of UK law. 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 FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. Section 16 has been replaced in accordance with Section 7a) above to address the requirements of UK law. THE LICENSOR OR ANY THIRD PARTIES FROM WHOM IT HAS LICENSED ANY CODE WILL NOT BE LIABLE FOR: ANY LOSS OF PROFITS, LOSS OF REVENUE, LOSS OR CORRUPTION OF DATA, LOSS OF CONTRACTS OR OPPORTUNITY, LOSS OF SAVINGS OR THIRD PARTY CLAIMS (IN EACH CASE WHETHER DIRECT OR INDIRECT), ANY DIRECT OR INDIRECT LOSS OR DAMAGE ARISING OUT OF OR IN CONNECTION WITH THE PROGRAM, IN EACH CASE, WHETHER THAT LOSS ARISES AS A RESULT OF LICENSOR'S NEGLIGENCE, OR IN ANY OTHER WAY, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF THAT LOSS ARISING, OR IF IT WAS WITHIN LICENSOR'S CONTEMPLATION. NONE OF THESE PROVISION LIMITS OR EXCLUDES THE LICENSOR'S LIABILITY FOR DEATH OR PERSONAL INJURY CAUSED BY ITS NEGLIGENCE OR FOR ANY FRAUD, OR FOR ANY SORT OF LIABILITY THAT, BY LAW, CANNOT BE LIMITED OR EXCLUDED 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mmdb-1.23.2.1/README0000644000175100017510000000022111471214431010451 00000000000000 MMDB: A library for storage and manipulation of macromolecular models. Written by Eugene Krissinel. Released under the modified GNU LGPL v3. mmdb-1.23.2.1/src/0000755000175100017510000000000011476204204010447 500000000000000mmdb-1.23.2.1/src/mmdb_model.cpp0000644000175100017510000042476211476133164013217 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 30.04.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Model // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CHetCompound ( description of het compounds ) // ~~~~~~~~~ CHetCompounds ( HETNAM, HETSYN, FORMULA records ) // CSSContainer ( container for helixes and turns ) // CHelix ( helix info ) // CStrand ( strand info ) // CSheet ( sheet info ) // CSheets ( container for sheets ) // CTurn ( turn info ) // CLinkContainer ( container for link data ) // CLink ( link data ) // CLinkRContainer ( container for refmac link ) // CLinkR ( link data ) // CCisPepContainer ( container for CisPep data ) // CCisPep ( CisPep data ) // CModel ( PDB model ) // // Copyright (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MMDB_Model__ #include "mmdb_model.h" #endif #ifndef __MMDB_Manager__ #include "mmdb_manager.h" #endif #ifndef __MMDB_CIFDefs__ #include "mmdb_cifdefs.h" #endif // =================== CHetCompound ========================= CHetCompound::CHetCompound ( cpstr HetName ) : CStream() { InitHetCompound ( HetName ); } CHetCompound::CHetCompound ( RPCStream Object ) : CStream(Object) { InitHetCompound ( pstr("---") ); } CHetCompound::~CHetCompound() { FreeMemory(); } void CHetCompound::InitHetCompound ( cpstr HetName ) { strcpy_n0 ( hetID,HetName,sizeof(ResName) ); comment = NULL; nSynonyms = 0; hetSynonym = NULL; compNum = MinInt4; wc = ' '; Formula = NULL; } void CHetCompound::FreeMemory() { int i; if (comment) { delete[] comment; comment = NULL; } if (hetSynonym) { for (i=0;i53) { i = 0; while (p1[i] && (i<53) && (p1[i]!=' ')) i++; p2 = &(p1[i]); c = *p2; *p2 = char(0); } if (*p1) { strcat ( S,p1 ); PadSpaces ( S,80 ); f.WriteLine ( S ); } else N--; if (p2) { *p2 = c; if (c) p1 = p2+1; else p2 = NULL; } } while (p2); } void CHetCompound::HETSYN_PDBDump ( RCFile f ) { char S[100]; pstr p; char c; int N,k,i,l; if (!hetSynonym) return; N = 0; k = 0; p = &(hetSynonym[0][0]); do { N++; if (N==1) sprintf ( S,"HETSYN %3s " ,hetID ); else sprintf ( S,"HETSYN %2i %3s ",N,hetID ); i = 0; do { l = strlen(p)+2; if (i+l<54) { strcat ( S,p ); if (k51) { i--; while ((i>0) && (p[i]!=' ')) i--; } if (i<2) i = 51; // no spaces! c = p[i]; p[i] = char(0); strcat ( S,p ); p[i] = c; p = &(p[i]); while (*p==' ') p++; } i = 60; // break loop } } while (i<54); PadSpaces ( S,80 ); f.WriteLine ( S ); } while (kMinInt4) { if (N==1) sprintf ( S,"FORMUL %2i %3s " ,compNum,hetID ); else sprintf ( S,"FORMUL %2i %3s %2i ",compNum,hetID,N ); } else { if (N==1) sprintf ( S,"FORMUL %3s " ,hetID ); else sprintf ( S,"FORMUL %3s %2i ",hetID,N ); } S[18] = wc; p2 = strchr(p1,'\n'); if (p2) { c = *p2; *p2 = char(0); } else if (strlen(p1)>50) { while (*p1==' ') p1++; i = 0; while (p1[i] && (i<50) && (p1[i]!=' ')) i++; p2 = &(p1[i]); c = *p2; *p2 = char(0); } strcat ( S,p1 ); if (p2) { *p2 = c; p1 = p2+1; } PadSpaces ( S,80 ); f.WriteLine ( S ); } while (p2); } void CHetCompound::FormComString ( pstr & F ) { pstr p; int i; if (F) { delete[] F; F = NULL; } if (comment) { CreateCopy ( F,comment ); i = 0; p = comment; while (*p) { p++; if (*p=='\n') i = 0; else i++; if (i>68) { F[i] = char(0); CreateConcat ( F,pstr("\n"),p ); i = 0; } } } } void CHetCompound::FormSynString ( pstr & F ) { pstr p; char c; int i,k,l; if (F) { delete[] F; F = NULL; } if (hetSynonym) { CreateCopy ( F,pstr(" ") ); k = 0; p = &(hetSynonym[0][0]); do { l = strlen(p)+2; if (l<=60) { if (k60) { i--; while ((i>0) && (p[i]!=' ')) i--; } if (i<2) i = 60; // no spaces! c = p[i]; p[i] = char(0); CreateConcat ( F,p,pstr("\n ") ); p[i] = c; p = &(p[i]); while (*p==' ') p++; } } while (k68) { F[i] = char(0); CreateConcat ( F,pstr("\n"),p ); i = 0; } } } } void CHetCompound::Copy ( PCHetCompound HetCompound ) { int i; FreeMemory (); strcpy ( hetID ,HetCompound->hetID ); CreateCopy ( comment,HetCompound->comment ); nSynonyms = HetCompound->nSynonyms; if (nSynonyms>0) { hetSynonym = new pstr[nSynonyms]; for (i=0;ihetSynonym[i] ); } } compNum = HetCompound->compNum; wc = HetCompound->wc; CreateCopy ( Formula,HetCompound->Formula ); } void CHetCompound::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( hetID,False ); f.CreateWrite ( comment ); f.WriteInt ( &nSynonyms ); for (i=0;i0) { hetSynonym = new pstr[nSynonyms]; for (i=0;i12) { strcpy_n0 ( hetID,&(S[11]),3 ); i = AddHetName ( hetID ); if (l>15) { if (hetCompound[i]->comment) strcpy ( L,"\n" ); else L[0] = char(0); strcat ( L,&(S[15]) ); CutSpaces ( L,SCUTKEY_END ); CreateConcat ( hetCompound[i]->comment,L ); } } } void CHetCompounds::ConvertHETSYN ( cpstr S ) { ResName hetID; char L[100]; int l,i,j,k; l = strlen(S); if (l>12) { strcpy_n0 ( hetID,&(S[11]),3 ); i = AddHetName ( hetID ); if (l>15) { j = 15; do { while (S[j]==' ') j++; k = 0; if (S[j]) { while (S[j] && (S[j]!=';')) L[k++] = S[j++]; L[k--] = char(0); while ((k>0) && (L[k]==' ')) L[k--] = char(0); if (L[0]) { hetCompound[i]->AddKeyWord ( L,Closed ); Closed = (S[j]==';'); } if (S[j]) j++; } } while (S[j]); /* p1 = &(S[15]); do { p2 = strchr ( p1,';' ); if (p2) { c = *p2; *p2 = char(0); } strcpy_css ( L,p1 ); if (L[0]) hetCompound[i]->AddKeyWord ( L,Closed ); if (p2) { if (L[0]) Closed = True; *p2 = c; p1 = p2+1; } else if (L[0]) Closed = False; } while (p2); */ } } } void CHetCompounds::ConvertFORMUL ( cpstr S ) { ResName hetID; char L[100]; int l,i; l = strlen(S); if (l>13) { strcpy_n0 ( hetID,&(S[12]),3 ); i = AddHetName ( hetID ); if (l>18) { GetInteger ( hetCompound[i]->compNum,&(S[9]),2 ); hetCompound[i]->wc = S[18]; if (strlen(S)>19) { if (hetCompound[i]->Formula) strcpy ( L,"\n" ); else L[0] = char(0); strcat ( L,&(S[19]) ); CutSpaces ( L,SCUTKEY_END ); CreateConcat ( hetCompound[i]->Formula,L ); } } } } int CHetCompounds::AddHetName ( cpstr H ) { PPCHetCompound HC1; int i; i = 0; while (ihetID,H)) break; } i++; } if (i>=nHets) { HC1 = new PCHetCompound[nHets+1]; for (i=0;iHETNAM_PDBDump ( f ); for (i=0;iHETSYN_PDBDump ( f ); for (i=0;iFORMUL_PDBDump ( f ); } void CHetCompounds::MakeCIF ( PCMMCIFData CIF ) { PCMMCIFLoop Loop; pstr F; int RC; int i; if (!hetCompound) return; RC = CIF->AddLoop ( CIFCAT_CHEM_COMP,Loop ); if (RC!=CIFRC_Ok) { Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_NAME ); Loop->AddLoopTag ( CIFTAG_NDB_SYNONYMS ); Loop->AddLoopTag ( CIFTAG_NDB_COMPONENT_NO ); Loop->AddLoopTag ( CIFTAG_FORMULA ); } F = NULL; for (i=0;iAddString ( hetCompound[i]->hetID ); hetCompound[i]->FormComString ( F ); Loop->AddString ( F ); hetCompound[i]->FormSynString ( F ); Loop->AddString ( F ); if (hetCompound[i]->compNum>MinInt4) Loop->AddInteger ( hetCompound[i]->compNum ); else Loop->AddNoData ( CIF_NODATA_QUESTION ); hetCompound[i]->FormForString ( F ); Loop->AddString ( F ); } if (F) delete[] F; } void CHetCompounds::GetCIF ( PCMMCIFData CIF ) { PCMMCIFLoop Loop; char L[100]; ResName hetID; pstr F,p1,p2; char c; int i,l,k,RC; FreeMemory(); Loop = CIF->GetLoop ( CIFCAT_CHEM_COMP ); if (!Loop) return; l = Loop->GetLoopLength(); F = NULL; for (i=0;iGetString ( hetCompound[k]->comment,CIFTAG_NAME,i,True ); RC = Loop->GetInteger ( hetCompound[k]->compNum, CIFTAG_NDB_COMPONENT_NO,i,True ); if (RC) hetCompound[i]->compNum = MinInt4; Loop->GetString ( hetCompound[k]->Formula,CIFTAG_FORMULA,i,True ); RC = Loop->GetString ( F,CIFTAG_NDB_SYNONYMS,i,True ); if ((!RC) && F ) { p1 = &(F[0]); while (*p1) { if (*p1=='\n') *p1 = ' '; p1++; } p1 = &(F[0]); do { p2 = strchr ( p1,';' ); if (p2) { c = *p2; *p2 = char(0); } strcpy_css ( L,p1 ); hetCompound[i]->AddKeyWord ( L,True ); if (p2) { *p2 = c; p1 = p2+1; } } while (p2); } hetCompound[i]->wc = ' '; } if (F) delete[] F; } void CHetCompounds::Copy ( PCHetCompounds HetCompounds ) { int i; FreeMemory(); nHets = HetCompounds->nHets; if (nHets>0) { hetCompound = new PCHetCompound[nHets]; for (i=0;iCopy ( HetCompounds->hetCompound[i] ); } } } void CHetCompounds::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nHets ); for (i=0;iwrite ( f ); } void CHetCompounds::read ( RCFile f ) { int i; byte Version; FreeMemory(); f.ReadByte ( &Version ); f.ReadInt ( &nHets ); if (nHets>0) { hetCompound = new PCHetCompound[nHets]; for (i=0;iread ( f ); } } } MakeStreamFunctions(CHetCompounds) // ==================== CSSContainer ========================= PCContainerClass CSSContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return CClassContainer::MakeContainerClass(ClassID); case ClassID_Helix : return new CHelix(); case ClassID_Turn : return new CTurn (); } } MakeStreamFunctions(CSSContainer) // ================ CHelix =================== CHelix::CHelix() : CContainerClass() { InitHelix(); } CHelix::CHelix ( cpstr S ) : CContainerClass() { InitHelix(); ConvertPDBASCII ( S ); } CHelix::CHelix ( RPCStream Object ) : CContainerClass(Object) { InitHelix(); } CHelix::~CHelix() { if (comment) delete[] comment; } void CHelix::InitHelix() { serNum = 0; // serial number strcpy ( helixID ,"---" ); // helix ID strcpy ( initResName,"---" ); // name of the helix's initial residue strcpy ( initChainID,"" ); // chain ID for the chain // containing the helix initSeqNum = 0; // sequence number of the initial // residue strcpy ( initICode ,"" ); // insertion code of the initial // residue strcpy ( endResName ,"---" ); // name of the helix's terminal residue strcpy ( endChainID ,"" ); // chain ID for the chain // containing the helix endSeqNum = 0; // sequence number of the terminal // residue strcpy ( endICode ,"" ); // insertion code of the terminal // residue helixClass = 0; // helix class comment = NULL; // comment about the helix length = 0; // length of the helix } void CHelix::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB OBSLTE line number N // from the class' data strcpy ( S,"HELIX" ); PadSpaces ( S,80 ); PutInteger ( &(S[7]) ,serNum ,3 ); strcpy_n1 ( &(S[11]),helixID ,3 ); strcpy_n1 ( &(S[15]),initResName,3 ); if (initChainID[0]) S[19] = initChainID[0]; PutIntIns ( &(S[21]),initSeqNum ,4,initICode ); strcpy_n1 ( &(S[27]),endResName ,3 ); if (endChainID[0]) S[31] = endChainID[0]; PutIntIns ( &(S[33]),endSeqNum ,4,endICode ); PutInteger ( &(S[38]),helixClass ,2 ); if (comment) strcpy_n ( &(S[40]),comment ,30 ); PutInteger ( &(S[71]),length ,5 ); } void AddStructConfTags ( PCMMCIFLoop Loop ) { Loop->AddLoopTag ( CIFTAG_CONF_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_PDB_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB ); Loop->AddLoopTag ( CIFTAG_END_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_END_LABEL_INS_CODE_PDB ); Loop->AddLoopTag ( CIFTAG_NDB_HELIX_CLASS_PDB ); Loop->AddLoopTag ( CIFTAG_DETAILS ); Loop->AddLoopTag ( CIFTAG_NDB_LENGTH ); } #define HelixTypeID "HELX_P" void CHelix::MakeCIF ( PCMMCIFData CIF, int N ) { UNUSED_ARGUMENT(N); PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_CONF,Loop ); if (RC!=CIFRC_Ok) // the category was (re)created, provide tags AddStructConfTags ( Loop ); Loop->AddString ( pstr(HelixTypeID) ); Loop->AddInteger ( serNum ); Loop->AddString ( helixID ); Loop->AddString ( initResName ); Loop->AddString ( initChainID ); Loop->AddInteger ( initSeqNum ); Loop->AddString ( initICode,True ); Loop->AddString ( endResName ); Loop->AddString ( endChainID ); Loop->AddInteger ( endSeqNum ); Loop->AddString ( endICode ,True ); Loop->AddInteger ( helixClass ); Loop->AddString ( comment ); Loop->AddInteger ( length ); } int CHelix::ConvertPDBASCII ( cpstr S ) { char L[100]; GetInteger ( serNum ,&(S[7]) ,3 ); strcpy_ncss ( helixID ,&(S[11]),3 ); strcpy_ncss ( initResName,&(S[15]),3 ); strcpy_ncss ( initChainID,&(S[19]),1 ); GetIntIns ( initSeqNum,initICode,&(S[21]),4 ); strcpy_ncss ( endResName ,&(S[27]),3 ); strcpy_ncss ( endChainID ,&(S[31]),1 ); GetIntIns ( endSeqNum ,endICode ,&(S[33]),4 ); GetInteger ( helixClass ,&(S[38]),2 ); strcpy_ncss ( L ,&(S[40]),30 ); CreateCopy ( comment ,L ); GetInteger ( length ,&(S[71]),5 ); return 0; } void CHelix::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; int RC,l; pstr F; Boolean Done; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONF ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } l = Loop->GetLoopLength(); Done = Signal>=l; while (!Done) { F = Loop->GetString ( CIFTAG_CONF_TYPE_ID,Signal,RC ); if ((!RC) && F) Done = (strcmp(F,HelixTypeID)==0); else Done = False; if (!Done) { Signal++; Done = Signal>=l; } } if (Signal>=l) { Signal = -1; // finish processing of Helix return; } Loop->DeleteField ( CIFTAG_CONF_TYPE_ID,Signal ); if (CIFGetInteger(serNum,Loop,CIFTAG_ID,Signal)) return; CIFGetString ( helixID ,Loop,CIFTAG_PDB_ID, Signal,sizeof(helixID),pstr(" ") ); CIFGetString ( initResName,Loop,CIFTAG_BEG_LABEL_COMP_ID, Signal,sizeof(initResName),pstr(" ") ); CIFGetString ( initChainID,Loop,CIFTAG_BEG_LABEL_ASYM_ID, Signal,sizeof(initChainID),pstr("") ); CIFGetString ( initICode ,Loop,CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB, Signal,sizeof(initICode),pstr("") ); if (CIFGetInteger(initSeqNum,Loop,CIFTAG_BEG_LABEL_SEQ_ID,Signal)) return; CIFGetString ( endResName,Loop,CIFTAG_END_LABEL_COMP_ID, Signal,sizeof(endResName),pstr(" ") ); CIFGetString ( endChainID,Loop,CIFTAG_END_LABEL_ASYM_ID, Signal,sizeof(endChainID),pstr("") ); CIFGetString ( endICode ,Loop,CIFTAG_NDB_END_LABEL_INS_CODE_PDB, Signal,sizeof(endICode),pstr("") ); if (CIFGetInteger(endSeqNum,Loop,CIFTAG_END_LABEL_SEQ_ID,Signal)) return; if (CIFGetInteger(helixClass,Loop, CIFTAG_NDB_HELIX_CLASS_PDB,Signal)) return; CreateCopy ( comment,Loop->GetString(CIFTAG_DETAILS,Signal,RC)); Loop->DeleteField ( CIFTAG_DETAILS,Signal ); if (CIFGetInteger(length,Loop,CIFTAG_NDB_LENGTH,Signal)) return; Signal++; } void CHelix::Copy ( PCContainerClass Helix ) { serNum = PCHelix(Helix)->serNum; initSeqNum = PCHelix(Helix)->initSeqNum; endSeqNum = PCHelix(Helix)->endSeqNum; helixClass = PCHelix(Helix)->helixClass; length = PCHelix(Helix)->length; strcpy ( helixID ,PCHelix(Helix)->helixID ); strcpy ( initResName,PCHelix(Helix)->initResName ); strcpy ( initChainID,PCHelix(Helix)->initChainID ); strcpy ( initICode ,PCHelix(Helix)->initICode ); strcpy ( endResName ,PCHelix(Helix)->endResName ); strcpy ( endChainID ,PCHelix(Helix)->endChainID ); strcpy ( endICode ,PCHelix(Helix)->endICode ); CreateCopy ( comment,PCHelix(Helix)->comment ); } void CHelix::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteInt ( &initSeqNum ); f.WriteInt ( &endSeqNum ); f.WriteInt ( &helixClass ); f.WriteInt ( &length ); f.WriteTerLine ( helixID ,False ); f.WriteTerLine ( initResName,False ); f.WriteTerLine ( initChainID,False ); f.WriteTerLine ( initICode ,False ); f.WriteTerLine ( endResName ,False ); f.WriteTerLine ( endChainID ,False ); f.WriteTerLine ( endICode ,False ); f.CreateWrite ( comment ); } void CHelix::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadInt ( &initSeqNum ); f.ReadInt ( &endSeqNum ); f.ReadInt ( &helixClass ); f.ReadInt ( &length ); f.ReadTerLine ( helixID ,False ); f.ReadTerLine ( initResName,False ); f.ReadTerLine ( initChainID,False ); f.ReadTerLine ( initICode ,False ); f.ReadTerLine ( endResName ,False ); f.ReadTerLine ( endChainID ,False ); f.ReadTerLine ( endICode ,False ); f.CreateRead ( comment ); } MakeStreamFunctions(CHelix) // ================ CStrand ===================== CStrand::CStrand () : CStream() { InitStrand(); } CStrand::CStrand ( RPCStream Object ) : CStream(Object) { InitStrand(); } CStrand::~CStrand() { } void CStrand::InitStrand() { initSeqNum = MinInt4; endSeqNum = MinInt4; sense = 0; curResSeq = MinInt4; prevResSeq = MinInt4; strandNo = 0; strcpy ( sheetID ,"sheet_0" ); strcpy ( initResName," " ); strcpy ( initChainID,"" ); strcpy ( initICode ,"" ); strcpy ( endResName ," " ); strcpy ( endChainID ,"" ); strcpy ( endICode ,"" ); strcpy ( curAtom ," " ); strcpy ( curResName ," " ); strcpy ( curChainID ,"" ); strcpy ( curICode ,"" ); strcpy ( prevAtom ," " ); strcpy ( prevResName," " ); strcpy ( prevChainID,"" ); strcpy ( prevICode ,"" ); } void CStrand::PDBASCIIDump ( pstr S ) { // Finishes making the ASCII PDB SHEET line number N // from the class' data. Making is initiated by CSheet. strcpy_n1 ( &(S[17]),initResName,3 ); if (initChainID[0]) S[21] = initChainID[0]; PutIntIns ( &(S[22]),initSeqNum ,4,initICode ); strcpy_n1 ( &(S[28]),endResName ,3 ); if (endChainID[0]) S[32] = endChainID[0]; PutIntIns ( &(S[33]),endSeqNum ,4,endICode ); PutInteger ( &(S[38]),sense ,2 ); strcpy_n1 ( &(S[41]),curAtom ,4 ); strcpy_n1 ( &(S[45]),curResName ,3 ); if (curChainID[0]) S[49] = curChainID[0]; PutIntIns ( &(S[50]),curResSeq ,4,curICode ); strcpy_n1 ( &(S[56]),prevAtom ,4 ); strcpy_n1 ( &(S[60]),prevResName,3 ); if (prevChainID[0]) S[64] = prevChainID[0]; PutIntIns ( &(S[65]),prevResSeq ,4,prevICode ); } void CStrand::MakeCIF ( PCMMCIFData CIF ) { PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_SHEET_RANGE,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_BEG_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB ); Loop->AddLoopTag ( CIFTAG_END_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_END_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_END_LABEL_INS_CODE_PDB ); } Loop->AddString ( sheetID ); Loop->AddInteger ( strandNo ); Loop->AddString ( initResName ); Loop->AddString ( initChainID ); Loop->AddInteger ( initSeqNum ); Loop->AddString ( initICode,True ); Loop->AddString ( endResName ); Loop->AddString ( endChainID ); Loop->AddInteger ( endSeqNum ); Loop->AddString ( endICode ,True ); } int CStrand::ConvertPDBASCII ( cpstr S ) { GetInteger ( strandNo ,&(S[7]) ,3 ); strcpy_ncss ( sheetID ,&(S[11]) ,3 ); strcpy_ncss ( initResName,&(S[17]) ,3 ); strcpy_ncss ( initChainID,&(S[21]) ,1 ); GetIntIns ( initSeqNum ,initICode,&(S[22]),4 ); strcpy_ncss ( endResName ,&(S[28]) ,3 ); strcpy_ncss ( endChainID ,&(S[32]) ,1 ); GetIntIns ( endSeqNum ,endICode ,&(S[33]),4 ); GetInteger ( sense ,&(S[38]) ,2 ); GetString ( curAtom ,&(S[41]) ,4 ); strcpy_ncss ( curResName ,&(S[45]) ,3 ); strcpy_ncss ( curChainID ,&(S[49]) ,1 ); GetIntIns ( curResSeq ,curICode ,&(S[50]),4 ); GetString ( prevAtom ,&(S[56]) ,4 ); strcpy_ncss ( prevResName,&(S[60]) ,3 ); strcpy_ncss ( prevChainID,&(S[64]) ,1 ); GetIntIns ( prevResSeq ,prevICode,&(S[65]),4 ); return 0; } int CStrand::GetCIF ( PCMMCIFData CIF, cpstr sheet_id ) { PCMMCIFLoop Loop; int RC,l,i,sNo; pstr F; Loop = CIF->GetLoop ( CIFCAT_STRUCT_SHEET_RANGE ); if (Loop) { l = Loop->GetLoopLength(); i = 0; while (iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheet_id)) { strcpy ( sheetID,sheet_id ); if (CIFGetInteger(sNo,Loop,CIFTAG_ID,i)) return i; if (sNo==strandNo) { CIFGetString ( initResName,Loop,CIFTAG_BEG_LABEL_COMP_ID, i,sizeof(initResName),pstr(" ") ); CIFGetString ( initChainID,Loop,CIFTAG_BEG_LABEL_ASYM_ID, i,sizeof(initChainID),pstr("") ); CIFGetString ( initICode,Loop, CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB, i,sizeof(initICode),pstr("") ); if (CIFGetInteger(initSeqNum,Loop, CIFTAG_BEG_LABEL_SEQ_ID,i)) return i; CIFGetString ( endResName,Loop,CIFTAG_END_LABEL_COMP_ID, i,sizeof(endResName),pstr(" ") ); CIFGetString ( endChainID,Loop,CIFTAG_END_LABEL_ASYM_ID, i,sizeof(endChainID),pstr("") ); CIFGetString ( endICode ,Loop, CIFTAG_NDB_END_LABEL_INS_CODE_PDB, i,sizeof(endICode),pstr("") ); if (CIFGetInteger(endSeqNum,Loop, CIFTAG_END_LABEL_SEQ_ID,i)) return i; Loop->DeleteRow ( i ); i = l+100; // break the loop } } } i++; } } return 0; } void CStrand::Copy ( PCStrand Strand ) { initSeqNum = Strand->initSeqNum; endSeqNum = Strand->endSeqNum; sense = Strand->sense; curResSeq = Strand->curResSeq; prevResSeq = Strand->prevResSeq; strcpy ( initResName,Strand->initResName ); strcpy ( initChainID,Strand->initChainID ); strcpy ( initICode ,Strand->initICode ); strcpy ( endResName ,Strand->endResName ); strcpy ( endChainID ,Strand->endChainID ); strcpy ( endICode ,Strand->endICode ); strcpy ( curAtom ,Strand->curAtom ); strcpy ( curResName ,Strand->curResName ); strcpy ( curChainID ,Strand->curChainID ); strcpy ( curICode ,Strand->curICode ); strcpy ( prevAtom ,Strand->prevAtom ); strcpy ( prevResName,Strand->prevResName ); strcpy ( prevChainID,Strand->prevChainID ); strcpy ( prevICode ,Strand->prevICode ); } void CStrand::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &initSeqNum ); f.WriteInt ( &endSeqNum ); f.WriteInt ( &sense ); f.WriteInt ( &curResSeq ); f.WriteInt ( &prevResSeq ); f.WriteTerLine ( initResName,False ); f.WriteTerLine ( initChainID,False ); f.WriteTerLine ( initICode ,False ); f.WriteTerLine ( endResName ,False ); f.WriteTerLine ( endChainID ,False ); f.WriteTerLine ( endICode ,False ); f.WriteTerLine ( curAtom ,False ); f.WriteTerLine ( curResName ,False ); f.WriteTerLine ( curChainID ,False ); f.WriteTerLine ( curICode ,False ); f.WriteTerLine ( prevAtom ,False ); f.WriteTerLine ( prevResName,False ); f.WriteTerLine ( prevChainID,False ); f.WriteTerLine ( prevICode ,False ); } void CStrand::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &initSeqNum ); f.ReadInt ( &endSeqNum ); f.ReadInt ( &sense ); f.ReadInt ( &curResSeq ); f.ReadInt ( &prevResSeq ); f.ReadTerLine ( initResName,False ); f.ReadTerLine ( initChainID,False ); f.ReadTerLine ( initICode ,False ); f.ReadTerLine ( endResName ,False ); f.ReadTerLine ( endChainID ,False ); f.ReadTerLine ( endICode ,False ); f.ReadTerLine ( curAtom ,False ); f.ReadTerLine ( curResName ,False ); f.ReadTerLine ( curChainID ,False ); f.ReadTerLine ( curICode ,False ); f.ReadTerLine ( prevAtom ,False ); f.ReadTerLine ( prevResName,False ); f.ReadTerLine ( prevChainID,False ); f.ReadTerLine ( prevICode ,False ); } MakeStreamFunctions(CStrand) // ================ CSheet =================== CSheet::CSheet() : CStream() { InitSheet(); } CSheet::CSheet ( RPCStream Object ) : CStream(Object) { InitSheet(); } CSheet::~CSheet() { FreeMemory(); } void CSheet::InitSheet() { nStrands = 0; sheetID[0] = char(0); Strand = NULL; } void CSheet::FreeMemory() { int i; if (Strand) { for (i=0;iPDBASCIIDump ( S ); f.WriteLine ( S ); } } void CSheet::OrderSheet() { int i,k; PPCStrand Strand1; k = 0; for (i=0;iAddLoop ( CIFCAT_STRUCT_SHEET,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_NUMBER_STRANDS ); } Loop->AddString ( sheetID ); Loop->AddInteger ( nStrands ); for (i=0;iMakeCIF ( CIF ); if (Strand[i]->sense!=0) isSense = True; } if (nStrands>1) { if (isSense) { RC = CIF->AddLoop ( CIFCAT_STRUCT_SHEET_ORDER,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_1 ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_2 ); Loop->AddLoopTag ( CIFTAG_SENSE ); } for (i=1;iAddString ( sheetID ); Loop->AddInteger ( Strand[i-1]->strandNo ); Loop->AddInteger ( Strand[i] ->strandNo ); if (Strand[i]->sense>0) Loop->AddString ( pstr("parallel") ); else Loop->AddString ( pstr("anti-parallel") ); } } RC = CIF->AddLoop ( CIFCAT_STRUCT_SHEET_HBOND,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_SHEET_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_1 ); Loop->AddLoopTag ( CIFTAG_RANGE_ID_2 ); Loop->AddLoopTag ( CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE ); Loop->AddLoopTag ( CIFTAG_RANGE_1_END_LABEL_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_RANGE_1_END_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE ); } for (i=1;iAddString ( sheetID ); Loop->AddInteger ( Strand[i-1]->strandNo ); Loop->AddInteger ( Strand[i]->strandNo ); Loop->AddString ( Strand[i]->curAtom ); Loop->AddString ( Strand[i]->curResName ); Loop->AddString ( Strand[i]->curChainID ); Loop->AddInteger ( Strand[i]->curResSeq ); Loop->AddString ( Strand[i]->curICode ,True ); Loop->AddString ( Strand[i]->prevAtom ); Loop->AddString ( Strand[i]->prevResName ); Loop->AddString ( Strand[i]->prevChainID ); Loop->AddInteger ( Strand[i]->prevResSeq ); Loop->AddString ( Strand[i]->prevICode,True ); } } } int CSheet::ConvertPDBASCII ( cpstr S ) { int i,k,ns; SheetID SID; PPCStrand Strand1; GetInteger ( k ,&(S[7]) ,3 ); strcpy_ncss ( SID,&(S[11]),3 ); GetInteger ( ns ,&(S[14]),2 ); // if (!SID[0]) return Error_NoSheetID; if (!sheetID[0]) strcpy ( sheetID,SID ); else if (strcmp(sheetID,SID)) return Error_WrongSheetID; if (k<=0) return Error_WrongStrandNo; ns = IMax(k,ns); if (!Strand) { Strand = new PCStrand[ns]; for (i=0;inStrands) { Strand1 = new PCStrand[ns]; for (i=0;iConvertPDBASCII ( S ); } void CSheet::TryStrand ( int strand_no ) { int i,k; PPCStrand Strand1; k = -1; for (i=0;(istrandNo==strand_no) k = i; if (k<0) { Strand1 = new PCStrand[nStrands+1]; for (i=0;istrandNo = strand_no; nStrands++; } } void CSheet::CIFFindStrands ( PCMMCIFData CIF, cpstr Category ) { // just look for all strands mentioned for the sheet PCMMCIFLoop Loop; pstr F; int RC,i,l,sNo; Loop = CIF->GetLoop ( Category ); if (Loop) { l = Loop->GetLoopLength(); for (i=0;iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { if (!Loop->GetInteger(sNo,CIFTAG_ID,i)) TryStrand ( sNo ); if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i)) TryStrand ( sNo ); if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_2,i)) TryStrand ( sNo ); } } } } } int CSheet::GetStrand ( int strand_no ) { int i; for (i=0;istrandNo==strand_no) return i; } return -1; } int CSheet::GetCIF ( PCMMCIFData CIF ) { PCMMCIFLoop Loop; int i,ns,l,k,k2,RC,sNo; pstr F; ivector pair; Boolean Ok; pair = NULL; // First find all strands and create // the corresponding classes. The CIF fields // are not removed at this stage. CIFFindStrands ( CIF,CIFCAT_STRUCT_SHEET_ORDER ); CIFFindStrands ( CIF,CIFCAT_STRUCT_SHEET_RANGE ); CIFFindStrands ( CIF,CIFCAT_STRUCT_SHEET_HBOND ); // Check number of strands Loop = CIF->GetLoop ( CIFCAT_STRUCT_SHEET ); if (Loop) { l = Loop->GetLoopLength(); i = 0; while (iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { RC = CIFGetInteger1 ( ns,Loop,CIFTAG_NUMBER_STRANDS,i ); if ((!RC) && (ns!=nStrands)) return Error_WrongNumberOfStrands; Loop->DeleteRow ( i ); i = l+100; // break loop } } i++; } } // Read each strand RC = 0; for (i=0;(iGetCIF ( CIF,sheetID ); if (RC) return RC; if (nStrands>1) { GetVectorMemory ( pair,nStrands,0 ); for (i=0;iGetLoop ( CIFCAT_STRUCT_SHEET_ORDER ); if (Loop) { Ok = True; l = Loop->GetLoopLength(); for (i=0;(iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i)) { k = GetStrand ( sNo ); if ((k>=0) && (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_2,i))) { pair[k] = GetStrand ( sNo ); if (pair[k]>=0) { F = Loop->GetString ( CIFTAG_SENSE,i,RC ); if (F && (!RC)) { if (!strcasecmp(F,"anti-parallel")) Strand[pair[k]]->sense = -1; else if (!strcasecmp(F,"parallel")) Strand[pair[k]]->sense = 1; } Loop->DeleteRow ( i ); } else Ok = False; } else Ok = False; } else Ok = False; } } } if (!Ok) { FreeVectorMemory ( pair,0 ); return Error_WrongSheetOrder; } } Loop = CIF->GetLoop ( CIFCAT_STRUCT_SHEET_HBOND ); if (Loop) { Ok = True; l = Loop->GetLoopLength(); for (i=0;(iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { if (!strcmp(F,sheetID)) { if (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i)) { k = GetStrand ( sNo ); if ((k>=0) && (!Loop->GetInteger(sNo,CIFTAG_RANGE_ID_1,i))) { k2 = GetStrand ( sNo ); if (k2>=0) { if (pair[k]==k2) { CIFGetString ( Strand[k2]->curAtom,Loop, CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID, i,sizeof(Strand[k2]->curAtom), pstr(" ") ); CIFGetString ( Strand[k2]->curResName,Loop, CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID, i,sizeof(Strand[k2]->curResName), pstr(" ") ); CIFGetString ( Strand[k2]->curChainID,Loop, CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID, i,sizeof(Strand[k2]->curChainID), pstr(" ") ); if (CIFGetInteger(Strand[k2]->curResSeq,Loop, CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID,i)) { FreeVectorMemory ( pair,0 ); return i; } CIFGetString ( Strand[k2]->curICode,Loop, CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE, i,sizeof(Strand[k2]->curICode), pstr(" ") ); CIFGetString ( Strand[k2]->prevAtom,Loop, CIFTAG_RANGE_1_END_LABEL_ATOM_ID, i,sizeof(Strand[k2]->prevAtom), pstr(" ") ); CIFGetString ( Strand[k2]->prevResName,Loop, CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID, i,sizeof(Strand[k2]->prevResName), pstr(" ") ); CIFGetString ( Strand[k2]->prevChainID,Loop, CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID, i,sizeof(Strand[k2]->prevChainID), pstr(" ") ); if (CIFGetInteger(Strand[k2]->prevResSeq,Loop, CIFTAG_RANGE_1_END_LABEL_SEQ_ID,i)) { FreeVectorMemory ( pair,0 ); return i; } CIFGetString ( Strand[k2]->prevICode,Loop, CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE, i,sizeof(Strand[k2]->prevICode), pstr(" ") ); Loop->DeleteRow ( i ); } else Ok = False; } else Ok = False; } else Ok = False; } else Ok = False; } } } if (!Ok) { FreeVectorMemory ( pair,0 ); return Error_HBondInconsistency; } } } FreeVectorMemory ( pair,0 ); return 0; } void CSheet::Copy ( PCSheet Sheet ) { int i; FreeMemory(); nStrands = Sheet->nStrands; if (nStrands>0) { Strand = new PCStrand[nStrands]; for (i=0;iStrand[i]) { Strand[i] = new CStrand(); Strand[i]->Copy ( Sheet->Strand[i] ); } else Strand[i] = NULL; } strcpy ( sheetID,Sheet->sheetID ); } void CSheet::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nStrands ); for (i=0;i0) { Strand = new PCStrand[nStrands]; for (i=0;iPDBASCIIDump ( f ); } void CSheets::MakeCIF ( PCMMCIFData CIF ) { int i; if (Sheet) for (i=0;iMakeCIF ( CIF ); } int CSheets::ConvertPDBASCII ( cpstr S ) { SheetID sheetID; int i,k; PPCSheet Sheet1; strcpy_ncss ( sheetID,&(S[11]),3 ); // if (!sheetID[0]) return Error_NoSheetID; k = -1; for (i=0;isheetID)) { k = i; break; } } if (k<0) { Sheet1 = new PCSheet[nSheets+1]; for (i=0;iConvertPDBASCII ( S ); } void CSheets::CIFFindSheets ( PCMMCIFData CIF, cpstr Category ) { PCMMCIFLoop Loop; int RC,i,j,k,l; pstr F; PPCSheet Sheet1; Loop = CIF->GetLoop ( Category ); if (Loop) { l = Loop->GetLoopLength(); for (i=0;iGetString ( CIFTAG_SHEET_ID,i,RC ); if (F && (!RC)) { k = -1; j = 0; while ((jsheetID)) k = j; } j++; } if (k<0) { Sheet1 = new PCSheet[nSheets+1]; for (i=0;isheetID,F ); nSheets++; } } } } } int CSheets::GetCIF ( PCMMCIFData CIF ) { int i,RC; FreeMemory(); // First find all sheet names and create // the corresponding classes. The CIF fields // are not removed at this stage. CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET ); CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET_ORDER ); CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET_RANGE ); CIFFindSheets ( CIF,CIFCAT_STRUCT_SHEET_HBOND ); // Read each sheet i = 0; RC = 0; while ((iGetCIF ( CIF ); i++; } return RC; } void CSheets::Copy ( PCSheets Sheets ) { int i; FreeMemory(); if (Sheets->nSheets>0) { nSheets = Sheets->nSheets; Sheet = new PCSheet[nSheets]; for (i=0;iSheet[i]) { Sheet[i] = new CSheet(); Sheet[i]->Copy ( Sheets->Sheet[i] ); } else Sheet[i] = NULL; } } void CSheets::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nSheets ); for (i=0;i0) { Sheet = new PCSheet[nSheets]; for (i=0;iAddLoop ( CIFCAT_STRUCT_CONF,Loop ); if (RC!=CIFRC_Ok) // the category was (re)created, provide tags AddStructConfTags ( Loop ); Loop->AddString ( pstr(TurnTypeID) ); Loop->AddInteger ( serNum ); Loop->AddString ( turnID ); Loop->AddString ( initResName ); Loop->AddString ( initChainID ); Loop->AddInteger ( initSeqNum ); Loop->AddString ( initICode,True ); Loop->AddString ( endResName ); Loop->AddString ( endChainID ); Loop->AddInteger ( endSeqNum ); Loop->AddString ( endICode ,True ); Loop->AddNoData ( CIF_NODATA_QUESTION ); Loop->AddString ( comment ); Loop->AddNoData ( CIF_NODATA_QUESTION ); } int CTurn::ConvertPDBASCII ( cpstr S ) { char L[100]; GetInteger ( serNum ,&(S[7]) ,3 ); strcpy_ncss ( turnID ,&(S[11]),3 ); strcpy_ncss ( initResName,&(S[15]),3 ); strcpy_ncss ( initChainID,&(S[19]),1 ); GetIntIns ( initSeqNum,initICode,&(S[20]),4 ); strcpy_ncss ( endResName ,&(S[26]),3 ); strcpy_ncss ( endChainID ,&(S[30]),1 ); GetIntIns ( endSeqNum ,endICode ,&(S[31]),4 ); strcpy_ncss ( L ,&(S[40]),30 ); CreateCopy ( comment ,L ); return 0; } void CTurn::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; int RC,l; pstr F; Boolean Done; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONF ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } l = Loop->GetLoopLength(); Done = Signal>=l; while (!Done) { F = Loop->GetString ( CIFTAG_CONF_TYPE_ID,Signal,RC ); if ((!RC) && F) Done = (strcmp(F,TurnTypeID)==0); else Done = False; if (!Done) { Signal++; Done = Signal>=l; } } if (Signal>=l) { Signal = -1; // finish processing of Turn return; } Loop->DeleteField ( CIFTAG_CONF_TYPE_ID,Signal ); if (CIFGetInteger(serNum,Loop,CIFTAG_ID,Signal)) return; CIFGetString ( turnID,Loop,CIFTAG_PDB_ID,Signal, sizeof(turnID),pstr(" ") ); CIFGetString ( initResName,Loop,CIFTAG_BEG_LABEL_COMP_ID, Signal,sizeof(initResName),pstr(" ") ); CIFGetString ( initChainID,Loop,CIFTAG_BEG_LABEL_ASYM_ID, Signal,sizeof(initChainID),pstr(" ") ); CIFGetString ( initICode ,Loop,CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB, Signal,sizeof(initICode),pstr(" ") ); if (CIFGetInteger(initSeqNum,Loop,CIFTAG_BEG_LABEL_SEQ_ID,Signal)) return; CIFGetString ( endResName,Loop,CIFTAG_END_LABEL_COMP_ID, Signal,sizeof(endResName),pstr(" ") ); CIFGetString ( endChainID,Loop,CIFTAG_END_LABEL_ASYM_ID, Signal,sizeof(endChainID),pstr(" ") ); CIFGetString ( endICode ,Loop,CIFTAG_NDB_END_LABEL_INS_CODE_PDB, Signal,sizeof(endICode),pstr(" ") ); if (CIFGetInteger(endSeqNum,Loop,CIFTAG_END_LABEL_SEQ_ID,Signal)) return; CreateCopy ( comment,Loop->GetString(CIFTAG_DETAILS,Signal,RC)); Loop->DeleteField ( CIFTAG_DETAILS,Signal ); Signal++; } void CTurn::Copy ( PCContainerClass Turn ) { serNum = PCTurn(Turn)->serNum; initSeqNum = PCTurn(Turn)->initSeqNum; endSeqNum = PCTurn(Turn)->endSeqNum; strcpy ( turnID ,PCTurn(Turn)->turnID ); strcpy ( initResName,PCTurn(Turn)->initResName ); strcpy ( initChainID,PCTurn(Turn)->initChainID ); strcpy ( initICode ,PCTurn(Turn)->initICode ); strcpy ( endResName ,PCTurn(Turn)->endResName ); strcpy ( endChainID ,PCTurn(Turn)->endChainID ); strcpy ( endICode ,PCTurn(Turn)->endICode ); CreateCopy ( comment,PCTurn(Turn)->comment ); } void CTurn::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteInt ( &initSeqNum ); f.WriteInt ( &endSeqNum ); f.WriteTerLine ( turnID ,False ); f.WriteTerLine ( initResName,False ); f.WriteTerLine ( initChainID,False ); f.WriteTerLine ( initICode ,False ); f.WriteTerLine ( endResName ,False ); f.WriteTerLine ( endChainID ,False ); f.WriteTerLine ( endICode ,False ); f.CreateWrite ( comment ); } void CTurn::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadInt ( &initSeqNum ); f.ReadInt ( &endSeqNum ); f.ReadTerLine ( turnID ,False ); f.ReadTerLine ( initResName,False ); f.ReadTerLine ( initChainID,False ); f.ReadTerLine ( initICode ,False ); f.ReadTerLine ( endResName ,False ); f.ReadTerLine ( endChainID ,False ); f.ReadTerLine ( endICode ,False ); f.CreateRead ( comment ); } MakeStreamFunctions(CTurn) // =================== CLinkContainer ======================== PCContainerClass CLinkContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return CClassContainer::MakeContainerClass(ClassID); case ClassID_Link : return new CLink(); } } MakeStreamFunctions(CLinkContainer) // ======================== CLink =========================== CLink::CLink() : CContainerClass() { InitLink(); } CLink::CLink ( cpstr S ) : CContainerClass() { InitLink(); ConvertPDBASCII ( S ); } CLink::CLink ( RPCStream Object ) : CContainerClass(Object) { InitLink(); } CLink::~CLink() {} void CLink::InitLink() { strcpy ( atName1 ,"----" ); // name of 1st linked atom strcpy ( aloc1 ," " ); // alternative location of 1st atom strcpy ( resName1,"---" ); // residue name of 1st linked atom strcpy ( chainID1," " ); // chain ID of 1st linked atom seqNum1 = 0; // sequence number of 1st linked atom strcpy ( insCode1," " ); // insertion code of 1st linked atom strcpy ( atName2 ,"----" ); // name of 2nd linked atom strcpy ( aloc2 ," " ); // alternative location of 2nd atom strcpy ( resName2,"---" ); // residue name of 2nd linked atom strcpy ( chainID2," " ); // chain ID of 2nd linked atom seqNum2 = 0; // sequence number of 2nd linked atom strcpy ( insCode2," " ); // insertion code of 2nd linked atom s1 = 1; // sym id of 1st atom i1 = 5; j1 = 5; k1 = 5; s2 = 1; // sym id of 2nd atom i2 = 5; j2 = 5; k2 = 5; } void CLink::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB OBSLTE line number N // from the class' data strcpy ( S,"LINK" ); PadSpaces ( S,80 ); strcpy_n1 ( &(S[12]),atName1 ,4 ); strcpy_n1 ( &(S[16]),aloc1 ,1 ); strcpy_n1 ( &(S[17]),resName1,3 ); strcpy_n1 ( &(S[21]),chainID1,1 ); PutIntIns ( &(S[22]),seqNum1 ,4,insCode1 ); strcpy_n1 ( &(S[42]),atName2 ,4 ); strcpy_n1 ( &(S[46]),aloc2 ,1 ); strcpy_n1 ( &(S[47]),resName2,3 ); strcpy_n1 ( &(S[51]),chainID2,1 ); PutIntIns ( &(S[52]),seqNum2 ,4,insCode2 ); PutInteger ( &(S[59]),s1,3 ); PutInteger ( &(S[62]),i1,1 ); PutInteger ( &(S[63]),j1,1 ); PutInteger ( &(S[64]),k1,1 ); PutInteger ( &(S[66]),s2,3 ); PutInteger ( &(S[69]),i2,1 ); PutInteger ( &(S[70]),j2,1 ); PutInteger ( &(S[71]),k2,1 ); } #define LinkTypeID "LINK" void AddStructConnTags ( PCMMCIFLoop Loop ) { Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_CONN_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_SYMMETRY ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_SYMMETRY ); } void CLink::MakeCIF ( PCMMCIFData CIF, int N ) { UNUSED_ARGUMENT(N); PCMMCIFLoop Loop; char S[100]; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_CONN,Loop ); if (RC!=CIFRC_Ok) // the category was (re)created, provide tags AddStructConnTags ( Loop ); Loop->AddString ( "1" ); // should be a counter Loop->AddString ( pstr(LinkTypeID) ); Loop->AddString ( atName1 ); Loop->AddString ( aloc1 ); Loop->AddString ( resName1 ); Loop->AddString ( chainID1 ); Loop->AddInteger ( seqNum1 ); Loop->AddString ( insCode1 ); Loop->AddString ( atName2 ); Loop->AddString ( aloc2 ); Loop->AddString ( resName2 ); Loop->AddString ( chainID2 ); Loop->AddInteger ( seqNum2 ); Loop->AddString ( insCode2 ); sprintf ( S,"%i%i%i%i",s1,i1,j1,k1 ); Loop->AddString ( S ); sprintf ( S,"%i%i%i%i",s2,i2,j2,k2 ); Loop->AddString ( S ); } int CLink::ConvertPDBASCII ( cpstr S ) { GetString ( atName1 ,&(S[12]),4 ); strcpy_ncss ( aloc1 ,&(S[16]),1 ); strcpy_ncss ( resName1,&(S[17]),3 ); strcpy_ncss ( chainID1,&(S[21]),1 ); GetIntIns ( seqNum1,insCode1,&(S[22]),4 ); GetString ( atName2 ,&(S[42]),4 ); strcpy_ncss ( aloc2 ,&(S[46]),1 ); strcpy_ncss ( resName2,&(S[47]),3 ); strcpy_ncss ( chainID2,&(S[51]),1 ); GetIntIns ( seqNum2,insCode2,&(S[52]),4 ); GetInteger ( s1,&(S[59]),3 ); GetInteger ( i1,&(S[62]),1 ); GetInteger ( j1,&(S[63]),1 ); GetInteger ( k1,&(S[64]),1 ); GetInteger ( s2,&(S[66]),3 ); GetInteger ( i2,&(S[69]),1 ); GetInteger ( j2,&(S[70]),1 ); GetInteger ( k2,&(S[71]),1 ); return 0; } void CLink::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; pstr F; char S[100]; int RC,l; Boolean Done; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONN ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } l = Loop->GetLoopLength(); Done = (Signal>=l); while (!Done) { F = Loop->GetString ( CIFTAG_CONN_TYPE_ID,Signal,RC ); if ((!RC) && F) Done = (strcmp(F,LinkTypeID)==0); else Done = False; if (!Done) { Signal++; Done = (Signal>=l); } } if (Signal>=l) { Signal = -1; // finish processing of Turn return; } Loop->DeleteField ( CIFTAG_CONN_TYPE_ID,Signal ); // CIFGetInteger ( l,Loop,CIFTAG_ID,Signal ); CIFGetString ( atName1,Loop,CIFTAG_CONN_PTNR1_AUTH_ATOM_ID,Signal, sizeof(atName1),pstr(" ") ); CIFGetString ( aloc1,Loop,CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID,Signal, sizeof(aloc1),pstr(" ") ); CIFGetString ( resName1,Loop,CIFTAG_CONN_PTNR1_AUTH_COMP_ID,Signal, sizeof(resName1),pstr(" ") ); CIFGetString ( chainID1,Loop,CIFTAG_CONN_PTNR1_AUTH_ASYM_ID,Signal, sizeof(chainID1),pstr(" ") ); if (CIFGetInteger(seqNum1,Loop,CIFTAG_CONN_PTNR1_AUTH_SEQ_ID,Signal)) return; CIFGetString ( insCode1,Loop,CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE, Signal,sizeof(insCode1),pstr(" ") ); CIFGetString ( atName2,Loop,CIFTAG_CONN_PTNR2_AUTH_ATOM_ID,Signal, sizeof(atName2),pstr(" ") ); CIFGetString ( aloc2,Loop,CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID,Signal, sizeof(aloc2),pstr(" ") ); CIFGetString ( resName2,Loop,CIFTAG_CONN_PTNR2_AUTH_COMP_ID,Signal, sizeof(resName2),pstr(" ") ); CIFGetString ( chainID2,Loop,CIFTAG_CONN_PTNR2_AUTH_ASYM_ID,Signal, sizeof(chainID2),pstr(" ") ); if (CIFGetInteger(seqNum2,Loop,CIFTAG_CONN_PTNR2_AUTH_SEQ_ID,Signal)) return; CIFGetString ( insCode2,Loop,CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE, Signal,sizeof(insCode2),pstr(" ") ); CIFGetString ( S,Loop,CIFTAG_CONN_PTNR1_SYMMETRY,Signal, sizeof(S),pstr("") ); if (S[0]) { l = strlen(S)-1; k1 = int(S[l--]) - int('0'); j1 = int(S[l--]) - int('0'); i1 = int(S[l--]) - int('0'); S[l] = char(0); s1 = atoi(S); } CIFGetString ( S,Loop,CIFTAG_CONN_PTNR2_SYMMETRY,Signal, sizeof(S),pstr("") ); if (S[0]) { l = strlen(S)-1; k2 = int(S[l--]) - int('0'); j2 = int(S[l--]) - int('0'); i2 = int(S[l--]) - int('0'); S[l] = char(0); s2 = atoi(S); } Signal++; } void CLink::Copy ( PCContainerClass Link ) { strcpy ( atName1 ,PCLink(Link)->atName1 ); strcpy ( aloc1 ,PCLink(Link)->aloc1 ); strcpy ( resName1,PCLink(Link)->resName1 ); strcpy ( chainID1,PCLink(Link)->chainID1 ); seqNum1 = PCLink(Link)->seqNum1; strcpy ( insCode1,PCLink(Link)->insCode1 ); strcpy ( atName2 ,PCLink(Link)->atName2 ); strcpy ( aloc2 ,PCLink(Link)->aloc2 ); strcpy ( resName2,PCLink(Link)->resName2 ); strcpy ( chainID2,PCLink(Link)->chainID2 ); seqNum2 = PCLink(Link)->seqNum2; strcpy ( insCode2,PCLink(Link)->insCode2 ); s1 = PCLink(Link)->s1; i1 = PCLink(Link)->i1; j1 = PCLink(Link)->j1; k1 = PCLink(Link)->k1; s2 = PCLink(Link)->s2; i2 = PCLink(Link)->i2; j2 = PCLink(Link)->j2; k2 = PCLink(Link)->k2; } void CLink::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( atName1 ,False ); f.WriteTerLine ( aloc1 ,False ); f.WriteTerLine ( resName1,False ); f.WriteTerLine ( chainID1,False ); f.WriteInt ( &seqNum1 ); f.WriteTerLine ( insCode1,False ); f.WriteTerLine ( atName2 ,False ); f.WriteTerLine ( aloc2 ,False ); f.WriteTerLine ( resName2,False ); f.WriteTerLine ( chainID2,False ); f.WriteInt ( &seqNum2 ); f.WriteTerLine ( insCode2,False ); f.WriteInt ( &s1 ); f.WriteInt ( &i1 ); f.WriteInt ( &j1 ); f.WriteInt ( &k1 ); f.WriteInt ( &s2 ); f.WriteInt ( &i2 ); f.WriteInt ( &j2 ); f.WriteInt ( &k2 ); } void CLink::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( atName1 ,False ); f.ReadTerLine ( aloc1 ,False ); f.ReadTerLine ( resName1,False ); f.ReadTerLine ( chainID1,False ); f.ReadInt ( &seqNum1 ); f.ReadTerLine ( insCode1,False ); f.ReadTerLine ( atName2 ,False ); f.ReadTerLine ( aloc2 ,False ); f.ReadTerLine ( resName2,False ); f.ReadTerLine ( chainID2,False ); f.ReadInt ( &seqNum2 ); f.ReadTerLine ( insCode2,False ); f.ReadInt ( &s1 ); f.ReadInt ( &i1 ); f.ReadInt ( &j1 ); f.ReadInt ( &k1 ); f.ReadInt ( &s2 ); f.ReadInt ( &i2 ); f.ReadInt ( &j2 ); f.ReadInt ( &k2 ); } MakeStreamFunctions(CLink) // =================== CLinkRContainer ======================= PCContainerClass CLinkRContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return CClassContainer::MakeContainerClass(ClassID); case ClassID_LinkR : return new CLinkR(); } } MakeStreamFunctions(CLinkRContainer) // ======================== CLinkR =========================== CLinkR::CLinkR() : CContainerClass() { InitLinkR(); } CLinkR::CLinkR ( cpstr S ) : CContainerClass() { InitLinkR(); ConvertPDBASCII ( S ); } CLinkR::CLinkR ( RPCStream Object ) : CContainerClass(Object) { InitLinkR(); } CLinkR::~CLinkR() {} void CLinkR::InitLinkR() { strcpy ( linkRID ,"----" ); // link name strcpy ( atName1 ,"----" ); // name of 1st linked atom strcpy ( aloc1 ," " ); // alternative location of 1st atom strcpy ( resName1,"---" ); // residue name of 1st linked atom strcpy ( chainID1," " ); // chain ID of 1st linked atom seqNum1 = 0; // sequence number of 1st linked atom strcpy ( insCode1," " ); // insertion code of 1st linked atom strcpy ( atName2 ,"----" ); // name of 2nd linked atom strcpy ( aloc2 ," " ); // alternative location of 2nd atom strcpy ( resName2,"---" ); // residue name of 2nd linked atom strcpy ( chainID2," " ); // chain ID of 2nd linked atom seqNum2 = 0; // sequence number of 2nd linked atom strcpy ( insCode2," " ); // insertion code of 2nd linked atom dist = 0.0; // link distance } /* LINK LYS A 27 PLP A 255 PLPLYS LINK MAN S 3 MAN S 4 BETA1-4 LINK C6 BBEN B 1 O1 BMAF S 2 BEN-MAF LINK OE2 AGLU A 320 C1 AMAF S 2 GLU-MAF LINK OE2 GLU A 67 1.895 ZN ZN R 5 GLU-ZN LINK NE2 HIS A 71 2.055 ZN ZN R 5 HIS-ZN LINK O ARG A 69 2.240 NA NA R 9 ARG-NA 012345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 */ void CLinkR::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB OBSLTE line number N // from the class' data strcpy ( S,"LINKR" ); PadSpaces ( S,80 ); strcpy_n1 ( &(S[12]),atName1 ,4 ); strcpy_n1 ( &(S[16]),aloc1 ,1 ); strcpy_n1 ( &(S[17]),resName1,3 ); strcpy_n1 ( &(S[21]),chainID1,1 ); PutIntIns ( &(S[22]),seqNum1 ,4,insCode1 ); if (dist>0.0) PutRealF ( &(S[32]),dist,7,3 ); strcpy_n1 ( &(S[42]),atName2 ,4 ); strcpy_n1 ( &(S[46]),aloc2 ,1 ); strcpy_n1 ( &(S[47]),resName2,3 ); strcpy_n1 ( &(S[51]),chainID2,1 ); PutIntIns ( &(S[52]),seqNum2 ,4,insCode2 ); strcpy_ns ( &(S[72]),linkRID,8 ); } #define LinkRTypeID "LINKR" void AddStructConnLinkRTags ( PCMMCIFLoop Loop ) { Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_CONN_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR1_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_DIST ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ATOM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_COMP_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PTNR2_AUTH_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_CONN_NAME ); } void CLinkR::MakeCIF ( PCMMCIFData CIF, int N ) { UNUSED_ARGUMENT(N); PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_LINKR,Loop ); if (RC!=CIFRC_Ok) // the category was (re)created, provide tags AddStructConnLinkRTags ( Loop ); Loop->AddString ( "1" ); // should be a counter Loop->AddString ( pstr(LinkTypeID) ); Loop->AddString ( atName1 ); Loop->AddString ( aloc1 ); Loop->AddString ( resName1 ); Loop->AddString ( chainID1 ); Loop->AddInteger ( seqNum1 ); Loop->AddString ( insCode1 ); Loop->AddReal ( dist ); Loop->AddString ( atName2 ); Loop->AddString ( aloc2 ); Loop->AddString ( resName2 ); Loop->AddString ( chainID2 ); Loop->AddInteger ( seqNum2 ); Loop->AddString ( insCode2 ); Loop->AddString ( linkRID ); } int CLinkR::ConvertPDBASCII ( cpstr S ) { GetString ( atName1 ,&(S[12]),4 ); strcpy_ncss ( aloc1 ,&(S[16]),1 ); strcpy_ncss ( resName1,&(S[17]),3 ); strcpy_ncss ( chainID1,&(S[21]),1 ); GetIntIns ( seqNum1,insCode1,&(S[22]),4 ); if (!GetReal(dist,&(S[32]),7)) dist = 0.0; GetString ( atName2 ,&(S[42]),4 ); strcpy_ncss ( aloc2 ,&(S[46]),1 ); strcpy_ncss ( resName2,&(S[47]),3 ); strcpy_ncss ( chainID2,&(S[51]),1 ); GetIntIns ( seqNum2,insCode2,&(S[52]),4 ); strcpy_ncss ( linkRID,&(S[72]),8 ); return 0; } void CLinkR::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; pstr F; int RC,l; Boolean Done; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONN ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } l = Loop->GetLoopLength(); Done = (Signal>=l); while (!Done) { F = Loop->GetString ( CIFTAG_CONN_TYPE_ID,Signal,RC ); if ((!RC) && F) Done = (strcmp(F,LinkTypeID)==0); else Done = False; if (!Done) { Signal++; Done = (Signal>=l); } } if (Signal>=l) { Signal = -1; // finish processing of Turn return; } Loop->DeleteField ( CIFTAG_CONN_TYPE_ID,Signal ); // CIFGetInteger ( l,Loop,CIFTAG_ID,Signal ); CIFGetString ( atName1,Loop,CIFTAG_CONN_PTNR1_AUTH_ATOM_ID,Signal, sizeof(atName1),pstr(" ") ); CIFGetString ( aloc1,Loop,CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID,Signal, sizeof(aloc1),pstr(" ") ); CIFGetString ( resName1,Loop,CIFTAG_CONN_PTNR1_AUTH_COMP_ID,Signal, sizeof(resName1),pstr(" ") ); CIFGetString ( chainID1,Loop,CIFTAG_CONN_PTNR1_AUTH_ASYM_ID,Signal, sizeof(chainID1),pstr(" ") ); if (CIFGetInteger(seqNum1,Loop,CIFTAG_CONN_PTNR1_AUTH_SEQ_ID,Signal)) return; CIFGetString ( insCode1,Loop,CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE, Signal,sizeof(insCode1),pstr(" ") ); if (CIFGetReal(dist,Loop,CIFTAG_CONN_DIST,Signal)) return; CIFGetString ( atName2,Loop,CIFTAG_CONN_PTNR2_AUTH_ATOM_ID,Signal, sizeof(atName2),pstr(" ") ); CIFGetString ( aloc2,Loop,CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID,Signal, sizeof(aloc2),pstr(" ") ); CIFGetString ( resName2,Loop,CIFTAG_CONN_PTNR2_AUTH_COMP_ID,Signal, sizeof(resName2),pstr(" ") ); CIFGetString ( chainID2,Loop,CIFTAG_CONN_PTNR2_AUTH_ASYM_ID,Signal, sizeof(chainID2),pstr(" ") ); if (CIFGetInteger(seqNum2,Loop,CIFTAG_CONN_PTNR2_AUTH_SEQ_ID,Signal)) return; CIFGetString ( insCode2,Loop,CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE, Signal,sizeof(insCode2),pstr(" ") ); CIFGetString ( linkRID,Loop,CIFTAG_CONN_NAME,Signal, sizeof(linkRID),pstr(" ") ); Signal++; } void CLinkR::Copy ( PCContainerClass LinkR ) { strcpy ( atName1 ,PCLinkR(LinkR)->atName1 ); strcpy ( aloc1 ,PCLinkR(LinkR)->aloc1 ); strcpy ( resName1,PCLinkR(LinkR)->resName1 ); strcpy ( chainID1,PCLinkR(LinkR)->chainID1 ); seqNum1 = PCLinkR(LinkR)->seqNum1; strcpy ( insCode1,PCLinkR(LinkR)->insCode1 ); dist = PCLinkR(LinkR)->dist; strcpy ( atName2 ,PCLinkR(LinkR)->atName2 ); strcpy ( aloc2 ,PCLinkR(LinkR)->aloc2 ); strcpy ( resName2,PCLinkR(LinkR)->resName2 ); strcpy ( chainID2,PCLinkR(LinkR)->chainID2 ); seqNum2 = PCLinkR(LinkR)->seqNum2; strcpy ( insCode2,PCLinkR(LinkR)->insCode2 ); strcpy ( linkRID,PCLinkR(LinkR)->linkRID ); } void CLinkR::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( atName1 ,False ); f.WriteTerLine ( aloc1 ,False ); f.WriteTerLine ( resName1,False ); f.WriteTerLine ( chainID1,False ); f.WriteInt ( &seqNum1 ); f.WriteTerLine ( insCode1,False ); f.WriteReal ( &dist ); f.WriteTerLine ( atName2 ,False ); f.WriteTerLine ( aloc2 ,False ); f.WriteTerLine ( resName2,False ); f.WriteTerLine ( chainID2,False ); f.WriteInt ( &seqNum2 ); f.WriteTerLine ( insCode2,False ); f.WriteTerLine ( linkRID,False ); } void CLinkR::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( atName1 ,False ); f.ReadTerLine ( aloc1 ,False ); f.ReadTerLine ( resName1,False ); f.ReadTerLine ( chainID1,False ); f.ReadInt ( &seqNum1 ); f.ReadTerLine ( insCode1,False ); f.ReadReal ( &dist ); f.ReadTerLine ( atName2 ,False ); f.ReadTerLine ( aloc2 ,False ); f.ReadTerLine ( resName2,False ); f.ReadTerLine ( chainID2,False ); f.ReadInt ( &seqNum2 ); f.ReadTerLine ( insCode2,False ); f.ReadTerLine ( linkRID,False ); } MakeStreamFunctions(CLinkR) // =================== CCisPepContainer ====================== PCContainerClass CCisPepContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return CClassContainer::MakeContainerClass(ClassID); case ClassID_CisPep : return new CCisPep(); } } MakeStreamFunctions(CCisPepContainer) // ======================== CCisPep ========================== CCisPep::CCisPep() : CContainerClass() { InitCisPep(); } CCisPep::CCisPep ( cpstr S ) : CContainerClass() { InitCisPep(); ConvertPDBASCII ( S ); } CCisPep::CCisPep ( RPCStream Object ) : CContainerClass(Object) { InitCisPep(); } CCisPep::~CCisPep() {} void CCisPep::InitCisPep() { serNum = 1; // record serial number strcpy ( pep1 ,"---" ); // residue name strcpy ( chainID1," " ); // chain identifier 1 seqNum1 = 0; // residue sequence number 1 strcpy ( icode1 ," " ); // insertion code 1 strcpy ( pep2 ,"---" ); // residue name 2 strcpy ( chainID2," " ); // chain identifier 2 seqNum2 = 0; // residue sequence number 2 strcpy ( icode2 ," " ); // insertion code 2 modNum = 0; // model number measure = 0.0; // measure of the angle in degrees. } void CCisPep::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); strcpy ( S,"CISPEP" ); PadSpaces ( S,80 ); PutInteger ( &(S[7]),serNum,3 ); strcpy_n1 ( &(S[11]),pep1 ,3 ); strcpy_n1 ( &(S[15]),chainID1,1 ); PutIntIns ( &(S[17]),seqNum1 ,4,icode1 ); strcpy_n1 ( &(S[25]),pep2 ,3 ); strcpy_n1 ( &(S[29]),chainID2,1 ); PutIntIns ( &(S[31]),seqNum2 ,4,icode1 ); PutInteger ( &(S[43]),modNum,3 ); PutRealF ( &(S[53]),measure,6,2 ); } int CCisPep::ConvertPDBASCII ( cpstr S ) { GetInteger ( serNum ,&(S[7]) ,3 ); strcpy_ncss ( pep1 ,&(S[11]),3 ); strcpy_ncss ( chainID1,&(S[15]),1 ); GetIntIns ( seqNum1,icode1,&(S[17]),4 ); strcpy_ncss ( pep2 ,&(S[25]),3 ); strcpy_ncss ( chainID2,&(S[29]),1 ); GetIntIns ( seqNum2,icode2,&(S[31]),4 ); GetInteger ( modNum ,&(S[43]),3 ); GetReal ( measure ,&(S[53]),6 ); return 0; } void CCisPep::Copy ( PCContainerClass CisPep ) { serNum = PCCisPep(CisPep)->serNum; strcpy ( pep1 ,PCCisPep(CisPep)->pep1 ); strcpy ( chainID1,PCCisPep(CisPep)->chainID1 ); seqNum1 = PCCisPep(CisPep)->seqNum1; strcpy ( icode1 ,PCCisPep(CisPep)->icode1 ); strcpy ( pep2 ,PCCisPep(CisPep)->pep2 ); strcpy ( chainID2,PCCisPep(CisPep)->chainID2 ); seqNum2 = PCCisPep(CisPep)->seqNum2; strcpy ( icode2 ,PCCisPep(CisPep)->icode2 ); modNum = PCCisPep(CisPep)->modNum; measure = PCCisPep(CisPep)->measure; } void CCisPep::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteTerLine ( pep1 ,False ); f.WriteTerLine ( chainID1,False ); f.WriteInt ( &seqNum1 ); f.WriteTerLine ( icode1 ,False ); f.WriteTerLine ( pep2 ,False ); f.WriteTerLine ( chainID2,False ); f.WriteInt ( &seqNum2 ); f.WriteTerLine ( icode2 ,False ); f.WriteInt ( &modNum ); f.WriteReal ( &measure ); } void CCisPep::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadTerLine ( pep1 ,False ); f.ReadTerLine ( chainID1,False ); f.ReadInt ( &seqNum1 ); f.ReadTerLine ( icode1 ,False ); f.ReadTerLine ( pep2 ,False ); f.ReadTerLine ( chainID2,False ); f.ReadInt ( &seqNum2 ); f.ReadTerLine ( icode2 ,False ); f.ReadInt ( &modNum ); f.ReadReal ( &measure ); } MakeStreamFunctions(CCisPep) // ===================== CModel ======================= CModel::CModel() : CProModel() { InitModel(); } CModel::CModel ( PCMMDBManager MMDBM, int serialNum ) : CProModel() { InitModel(); manager = MMDBM; serNum = serialNum; } CModel::CModel ( RPCStream Object ) : CProModel(Object) { InitModel(); } void CModel::InitModel() { serNum = 0; nChains = 0; nChainsAlloc = 0; Chain = NULL; manager = NULL; Exclude = True; } CModel::~CModel() { FreeMemory(); if (manager) manager->_ExcludeModel ( serNum ); } void CModel::FreeMemory() { DeleteAllChains(); if (Chain) delete[] Chain; Chain = NULL; nChains = 0; nChainsAlloc = 0; RemoveSecStructure(); RemoveHetInfo (); RemoveLinks (); RemoveLinkRs (); RemoveCisPeps (); } void CModel::SetMMDBManager ( PCMMDBManager MMDBM, int serialNum ) { manager = MMDBM; serNum = serialNum; } void CModel::CheckInAtoms() { int i; if (manager) for (i=0;iCheckInAtoms(); } int CModel::GetNumberOfAtoms ( Boolean countTers ) { // returns number of atoms in the model int i,na; na = 0; for (i=0;iGetNumberOfAtoms ( countTers ); return na; } int CModel::GetNumberOfResidues() { // returns number of residues in the model PCChain chain; int ic,ir,nr; nr = 0; for (ic=0;icnResidues;ir++) if (chain->Residue[ir]) nr++; } return nr; } // ---------------- Extracting chains -------------------------- int CModel::GetNumberOfChains() { return nChains; } PCChain CModel::GetChain ( int chainNo ) { if ((0<=chainNo) && (chainNo=nChainsAlloc) { nChainsAlloc = nOfChains+10; Chain1 = new PCChain[nChainsAlloc]; for (i=0;ichainID[0]) { chain = Chain[i]; if (chain->GetNumberOfResidues()>0) k++; } } if (k) sprintf ( chainID,"%s%i",chID,k-1 ); else if (!chain) strcpy ( chainID,chID ); // chain is absent else return chain; // the only empty chain } else { if (chID[0]) { for (i=0;(ichainID)) chain = Chain[i]; // it is there; just return the pointer } } else { for (i=0;(ichainID[0]) chain = Chain[i]; // it is there; just return the pointer } } if (chain) return chain; strcpy ( chainID,chID ); } ExpandChainArray ( nChains ); // create new chain Chain[nChains] = newCChain(); Chain[nChains]->SetChain ( chainID ); Chain[nChains]->SetModel ( this ); nChains++; return Chain[nChains-1]; } PCChain CModel::CreateChain ( const ChainID chID ) { // CreateChain() creates a new chain with chain ID regardless // the presence of same-ID chains in the model. This function // was introduced only for compatibility with older CCP4 // applications and using it in any new developments should be // strictly discouraged. ExpandChainArray ( nChains ); // create new chain Chain[nChains] = newCChain(); Chain[nChains]->SetChain ( chID ); Chain[nChains]->SetModel ( this ); nChains++; return Chain[nChains-1]; } void CModel::GetChainTable ( PPCChain & chainTable, int & NumberOfChains ) { chainTable = Chain; NumberOfChains = nChains; } Boolean CModel::GetNewChainID ( ChainID chID, int length ) { int i,k; Boolean found; memset ( chID,0,sizeof(ChainID) ); chID[0] = 'A'; do { found = False; for (i=0;(ichainID)); if (found) { k = 0; while (kchainID)) return Chain[i]; // it is there; just return the pointer } } else { for (i=0;ichainID[0]) return Chain[i]; // it is there; just return the pointer } } return NULL; } // ------------------ Deleting chains -------------------------- int CModel::DeleteChain ( int chainNo ) { if ((0<=chainNo) && (chainNochainID)) { Exclude = False; delete Chain[i]; Chain[i] = NULL; Exclude = True; return 1; } } } else { for (i=0;ichainID[0]) { Exclude = False; delete Chain[i]; Chain[i] = NULL; Exclude = True; return 1; } } } return 0; } int CModel::DeleteAllChains() { int i,k; Exclude = False; k = 0; for (i=0;iisSolventChain()) { delete Chain[i]; Chain[i] = NULL; k++; } } Exclude = True; return k; } void CModel::TrimChainTable() { int i,j; Exclude = False; j = 0; for (i=0;inResidues>0) { if (jnResidues; return 0; } int CModel::GetNumberOfResidues ( int chainNo ) { if ((0<=chainNo) && (chainNonResidues; } return 0; } PCResidue CModel::GetResidue ( const ChainID chainID, int seqNo, const InsCode insCode ) { PCChain chain; chain = GetChain ( chainID ); if (chain) return chain->GetResidue ( seqNo,insCode ); return NULL; } PCResidue CModel::GetResidue ( const ChainID chainID, int resNo ) { PCChain chain; chain = GetChain ( chainID ); if (chain) { if ((0<=resNo) && (resNonResidues)) return chain->Residue[resNo]; } return NULL; } PCResidue CModel::GetResidue ( int chainNo, int seqNo, const InsCode insCode ) { if ((0<=chainNo) && (chainNoGetResidue ( seqNo,insCode ); } return NULL; } PCResidue CModel::GetResidue ( int chainNo, int resNo ) { if ((0<=chainNo) && (chainNonResidues)) return Chain[chainNo]->Residue[resNo]; } } return NULL; } int CModel::GetResidueNo ( const ChainID chainID, int seqNo, const InsCode insCode ) { PCChain chain; chain = GetChain ( chainID ); if (chain) return chain->GetResidueNo ( seqNo,insCode ); return -2; } int CModel::GetResidueNo ( int chainNo, int seqNo, const InsCode insCode ) { if ((0<=chainNo) && (chainNoGetResidueNo ( seqNo,insCode ); } return -2; } void CModel::GetResidueTable ( PPCResidue & resTable, int & NumberOfResidues ) { // resTable has to be NULL or it will be reallocated. The application // is responsible for deallocating the resTable (but not of its // residues!). This does not apply to other GetResidueTable // functions. PPCChain chain; PPCResidue res; int i,j,k,nChns,nResidues; if (resTable) { delete[] resTable; resTable = NULL; } NumberOfResidues = 0; GetChainTable ( chain,nChns ); for (i=0;iGetResidueTable ( res,nResidues ); NumberOfResidues += nResidues; } if (NumberOfResidues>0) { resTable = new PCResidue[NumberOfResidues]; k = 0; GetChainTable ( chain,nChns ); for (i=0;iGetResidueTable ( res,nResidues ); for (j=0;jResidue; NumberOfResidues = chain->nResidues; } } void CModel::GetResidueTable ( int chainNo, PPCResidue & resTable, int & NumberOfResidues ) { resTable = NULL; NumberOfResidues = 0; if ((0<=chainNo) && (chainNoResidue; NumberOfResidues = Chain[chainNo]->nResidues; } } } int CModel::DeleteResidue ( const ChainID chainID, int seqNo, const InsCode insCode ) { PCChain chain; chain = GetChain ( chainID ); if (chain) return chain->DeleteResidue ( seqNo,insCode ); return 0; } int CModel::DeleteResidue ( const ChainID chainID, int resNo ) { PCChain chain; chain = GetChain ( chainID ); if (chain) return chain->DeleteResidue ( resNo ); return 0; } int CModel::DeleteResidue ( int chainNo, int seqNo, const InsCode insCode ) { if ((0<=chainNo) && (chainNoDeleteResidue ( seqNo,insCode ); } return 0; } int CModel::DeleteResidue ( int chainNo, int resNo ) { if ((0<=chainNo) && (chainNoDeleteResidue ( resNo ); } return 0; } int CModel::DeleteAllResidues ( const ChainID chainID ) { PCChain chain; chain = GetChain ( chainID ); if (chain) return chain->DeleteAllResidues(); return 0; } int CModel::DeleteAllResidues ( int chainNo ) { if ((0<=chainNo) && (chainNoDeleteAllResidues(); } return 0; } int CModel::DeleteAllResidues() { int i,k; k = 0; for (i=0;iDeleteAllResidues(); return k; } int CModel::DeleteSolvent() { int i,k; Exclude = False; k = 0; for (i=0;iDeleteSolvent(); Chain[i]->TrimResidueTable(); if (Chain[i]->nResidues<=0) { delete Chain[i]; Chain[i] = NULL; } } Exclude = True; return k; } int CModel::AddResidue ( const ChainID chainID, PCResidue res ) { PCChain chain; chain = GetChain ( chainID ); if (chain) return chain->AddResidue ( res ); return 0; } int CModel::AddResidue ( int chainNo, PCResidue res ) { if ((0<=chainNo) && (chainNoAddResidue ( res ); } return 0; } int CModel::_ExcludeChain ( const ChainID chainID ) { // _ExcludeChain(..) excludes (but does not dispose!) a chain // from the model. Returns 1 if the model gets empty and 0 otherwise. int i,k; if (!Exclude) return 0; // find the chain k = -1; for (i=0;(ichainID)) k = i; if (k>=0) { for (i=k+1;iGetChainID(), (PPCChain(data))[j]->GetChainID() ); if (diff>0) diff = 1; if (diff<0) diff = -1; if (sKey==SORT_CHAIN_ChainID_Desc) return -diff; return diff; } void CSortChains::Swap ( int i, int j ) { PCChain chn; chn = ((PPCChain)data)[i]; ((PPCChain)data)[i] = ((PPCChain)data)[j]; ((PPCChain)data)[j] = chn; } void CSortChains::Sort ( PPCChain chain, int nChains, int sortKey ) { sKey = sortKey; CQuickSort::Sort ( &(chain[0]),nChains ); } void CModel::SortChains ( int sortKey ) { CSortChains SC; TrimChainTable(); SC.Sort ( Chain,nChains,sortKey ); } // -------------------- Extracting atoms ----------------------- int CModel::GetNumberOfAtoms ( const ChainID chainID, int seqNo, const InsCode insCode ) { PCChain chain; PCResidue res; chain = GetChain ( chainID ); if (chain) { res = chain->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } return 0; } int CModel::GetNumberOfAtoms ( int chainNo, int seqNo, const InsCode insCode ) { PCChain chain; PCResidue res; chain = GetChain ( chainNo ); if (chain) { res = chain->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } return 0; } int CModel::GetNumberOfAtoms ( const ChainID chainID, int resNo ) { PCChain chain; PCResidue res; chain = GetChain ( chainID ); if (chain) { if ((0<=resNo) && (resNonResidues)) { res = chain->Residue[resNo]; if (res) return res->nAtoms; } } return 0; } int CModel::GetNumberOfAtoms ( int chainNo, int resNo ) { PCChain chain; PCResidue res; if ((0<=chainNo) && (chainNonResidues)) { res = chain->Residue[resNo]; if (res) return res->nAtoms; } } } return 0; } PCAtom CModel::GetAtom ( const ChainID chID, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCChain chn; PCResidue res; chn = GetChain ( chID ); if (chn) { res = chn->GetResidue ( seqNo,insCode ); if (res) return res->GetAtom ( aname,elmnt,aloc ); } return NULL; } PCAtom CModel::GetAtom ( const ChainID chID, int seqNo, const InsCode insCode, int atomNo ) { PCChain chn; PCResidue res; chn = GetChain ( chID ); if (chn) { res = chn->GetResidue ( seqNo,insCode ); if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } return NULL; } PCAtom CModel::GetAtom ( const ChainID chID, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCChain chn; PCResidue res; chn = GetChain ( chID ); if (chn) { if ((0<=resNo) && (resNonResidues)) { res = chn->Residue[resNo]; if (res) return res->GetAtom ( aname,elmnt,aloc ); } } return NULL; } PCAtom CModel::GetAtom ( const ChainID chID, int resNo, int atomNo ) { PCChain chn; PCResidue res; chn = GetChain ( chID ); if (chn) { if ((0<=resNo) && (resNonResidues)) { res = chn->Residue[resNo]; if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } } return NULL; } PCAtom CModel::GetAtom ( int chNo, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCResidue res; if ((0<=chNo) && (chNoGetResidue ( seqNo,insCode ); if (res) return res->GetAtom ( aname,elmnt,aloc ); } } return NULL; } PCAtom CModel::GetAtom ( int chNo, int seqNo, const InsCode insCode, int atomNo ) { PCResidue res; if ((0<=chNo) && (chNoGetResidue ( seqNo,insCode ); if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } } return NULL; } PCAtom CModel::GetAtom ( int chNo, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCResidue res; if ((0<=chNo) && (chNonResidues)) { res = Chain[chNo]->Residue[resNo]; if (res) return res->GetAtom ( aname,elmnt,aloc ); } } } return NULL; } PCAtom CModel::GetAtom ( int chNo, int resNo, int atomNo ) { PCResidue res; if ((0<=chNo) && (chNonResidues)) { res = Chain[chNo]->Residue[resNo]; if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } } } } return NULL; } void CModel::GetAtomTable ( const ChainID chainID, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainID,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void CModel::GetAtomTable ( int chainNo, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainNo,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void CModel::GetAtomTable ( const ChainID chainID, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainID,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void CModel::GetAtomTable ( int chainNo, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( chainNo,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void CModel::GetAtomTable1 ( const ChainID chainID, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = GetResidue ( chainID,seqNo,insCode ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CModel::GetAtomTable1 ( int chainNo, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = GetResidue ( chainNo,seqNo,insCode ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CModel::GetAtomTable1 ( const ChainID chainID, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = GetResidue ( chainID,resNo ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CModel::GetAtomTable1 ( int chainNo, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = GetResidue ( chainNo,resNo ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } int CModel::DeleteAtom ( const ChainID chID, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( seqNo,insCode,aname,elmnt,aloc ); return 0; } int CModel::DeleteAtom ( const ChainID chID, int seqNo, const InsCode insCode, int atomNo ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( seqNo,insCode,atomNo ); return 0; } int CModel::DeleteAtom ( const ChainID chID, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( resNo,aname,elmnt,aloc ); return 0; } int CModel::DeleteAtom ( const ChainID chID, int resNo, int atomNo ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAtom ( resNo,atomNo ); return 0; } int CModel::DeleteAtom ( int chNo, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=chNo) && (chNoDeleteAtom ( seqNo,insCode,aname, elmnt,aloc ); } return 0; } int CModel::DeleteAtom ( int chNo, int seqNo, const InsCode insCode, int atomNo ) { if ((0<=chNo) && (chNoDeleteAtom ( seqNo,insCode,atomNo ); } return 0; } int CModel::DeleteAtom ( int chNo, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=chNo) && (chNoDeleteAtom ( resNo,aname,elmnt,aloc ); } return 0; } int CModel::DeleteAtom ( int chNo, int resNo, int atomNo ) { if ((0<=chNo) && (chNoDeleteAtom ( resNo,atomNo ); } return 0; } int CModel::DeleteAllAtoms ( const ChainID chID, int seqNo, const InsCode insCode ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAllAtoms ( seqNo,insCode ); return 0; } int CModel::DeleteAllAtoms ( const ChainID chID, int resNo ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAllAtoms ( resNo ); return 0; } int CModel::DeleteAllAtoms ( const ChainID chID ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->DeleteAllAtoms(); return 0; } int CModel::DeleteAllAtoms ( int chNo, int seqNo, const InsCode insCode ) { if ((0<=chNo) && (chNoDeleteAllAtoms ( seqNo,insCode ); } return 0; } int CModel::DeleteAllAtoms ( int chNo, int resNo ) { if ((0<=chNo) && (chNoDeleteAllAtoms ( resNo ); } return 0; } int CModel::DeleteAllAtoms ( int chNo ) { if ((0<=chNo) && (chNoDeleteAllAtoms(); } return 0; } int CModel::DeleteAllAtoms() { int i,k; k = 0; for (i=0;iDeleteAllAtoms(); return k; } int CModel::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted. All tables remain // untrimmed, so that explicit trimming or calling FinishStructEdit() // is required. int i,n; n = 0; for (i=0;iDeleteAltLocs(); return n; } int CModel::AddAtom ( const ChainID chID, int seqNo, const InsCode insCode, PCAtom atom ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->AddAtom ( seqNo,insCode,atom ); return 0; } int CModel::AddAtom ( const ChainID chID, int resNo, PCAtom atom ) { PCChain chn; chn = GetChain ( chID ); if (chn) return chn->AddAtom ( resNo,atom ); return 0; } int CModel::AddAtom ( int chNo, int seqNo, const InsCode insCode, PCAtom atom ) { if ((0<=chNo) && (chNoAddAtom ( seqNo,insCode,atom ); } return 0; } int CModel::AddAtom ( int chNo, int resNo, PCAtom atom ) { if ((0<=chNo) && (chNoAddAtom ( resNo,atom ); } return 0; } void CModel::GetAtomStatistics ( RSAtomStat AS ) { AS.Init(); CalcAtomStatistics ( AS ); AS.Finish(); } void CModel::CalcAtomStatistics ( RSAtomStat AS ) { int i; for (i=0;iCalcAtomStatistics ( AS ); } int CModel::ConvertPDBString ( pstr PDBString ) { // Interprets PDB records DBREF, SEQADV, SEQRES, MODRES. // Returns zero if the line was converted, otherwise returns a // non-negative value of Error_XXXX. // PDBString must be not shorter than 81 characters. ChainID chainID; PCChain chain; PCHelix helix; PCTurn turn; PCLink link; PCLinkR linkR; PCCisPep cispep; int RC; // pad input line with spaces, if necessary PadSpaces ( PDBString,80 ); chainID[0] = char(0); chainID[1] = char(0); if (!strncmp(PDBString,"DBREF ",6)) { if (PDBString[12]!=' ') chainID[0] = PDBString[12]; chain = GetChainCreate ( chainID,False ); return chain->ConvertDBREF ( PDBString ); } else if (!strncmp(PDBString,"SEQADV",6)) { if (PDBString[16]!=' ') chainID[0] = PDBString[16]; chain = GetChainCreate ( chainID,False ); return chain->ConvertSEQADV ( PDBString ); } else if (!strncmp(PDBString,"SEQRES",6)) { if (PDBString[11]!=' ') chainID[0] = PDBString[11]; chain = GetChainCreate ( chainID,False ); return chain->ConvertSEQRES ( PDBString ); } else if (!strncmp(PDBString,"MODRES",6)) { if (PDBString[16]!=' ') chainID[0] = PDBString[16]; chain = GetChainCreate ( chainID,False ); return chain->ConvertMODRES ( PDBString ); } else if (!strncmp(PDBString,"HET ",6)) { if (PDBString[12]!=' ') chainID[0] = PDBString[12]; chain = GetChainCreate ( chainID,False ); return chain->ConvertHET ( PDBString ); } else if (!strncmp(PDBString,"HETNAM",6)) { HetCompounds.ConvertHETNAM ( PDBString ); return 0; } else if (!strncmp(PDBString,"HETSYN",6)) { HetCompounds.ConvertHETSYN ( PDBString ); return 0; } else if (!strncmp(PDBString,"FORMUL",6)) { HetCompounds.ConvertFORMUL ( PDBString ); return 0; } else if (!strncmp(PDBString,"HELIX ",6)) { helix = new CHelix(); RC = helix->ConvertPDBASCII(PDBString); if (RC==0) Helices.AddData ( helix ); else delete helix; return RC; } else if (!strncmp(PDBString,"SHEET ",6)) { return Sheets.ConvertPDBASCII ( PDBString ); } else if (!strncmp(PDBString,"TURN ",6)) { turn = new CTurn(); RC = turn->ConvertPDBASCII(PDBString); if (RC==0) Turns.AddData ( turn ); else delete turn; return RC; } else if (!strncmp(PDBString,"LINK ",6)) { link = new CLink(); RC = link->ConvertPDBASCII(PDBString); if (RC==0) Links.AddData ( link ); else delete link; return RC; } else if (!strncmp(PDBString,"LINKR ",6)) { linkR = new CLinkR(); RC = linkR->ConvertPDBASCII(PDBString); if (RC==0) LinkRs.AddData ( linkR ); else delete linkR; return RC; } else if (!strncmp(PDBString,"CISPEP",6)) { cispep = new CCisPep(); RC = cispep->ConvertPDBASCII(PDBString); if (RC==0) CisPeps.AddData ( cispep ); else delete cispep; return RC; } else return Error_WrongSection; } void CModel::PDBASCIIDumpPS ( RCFile f ) { int i; for (i=0;iDBReference.PDBASCIIDump ( f ); for (i=0;iSeqAdv.PDBASCIIDump ( f ); for (i=0;iSeqRes.PDBASCIIDump ( f ); for (i=0;iModRes.PDBASCIIDump ( f ); for (i=0;iHet.PDBASCIIDump ( f ); HetCompounds.PDBASCIIDump ( f ); Helices .PDBASCIIDump ( f ); Sheets .PDBASCIIDump ( f ); Turns .PDBASCIIDump ( f ); Links .PDBASCIIDump ( f ); LinkRs .PDBASCIIDump ( f ); } void CModel::PDBASCIIDumpCP ( RCFile f ) { CisPeps.PDBASCIIDump ( f ); } void CModel::PDBASCIIDump ( RCFile f ) { char S[100]; int i; Boolean singleModel = True; if (manager) singleModel = (manager->nModels<=1); if (!singleModel) { strcpy ( S,"MODEL " ); PadSpaces ( S,80 ); PutInteger ( &(S[10]),serNum,4 ); f.WriteLine ( S ); } for (i=0;iPDBASCIIAtomDump ( f ); if (!singleModel) { strcpy ( S,"ENDMDL" ); PadSpaces ( S,80 ); f.WriteLine ( S ); } } void CModel::MakeAtomCIF ( PCMMCIFData CIF ) { int i; for (i=0;iMakeAtomCIF ( CIF ); } void CModel::MakePSCIF ( PCMMCIFData CIF ) { int i; for (i=0;iDBReference.MakeCIF ( CIF ); for (i=0;iSeqAdv.MakeCIF ( CIF ); for (i=0;iSeqRes.MakeCIF ( CIF ); for (i=0;iModRes.MakeCIF ( CIF ); for (i=0;iHet.MakeCIF ( CIF ); HetCompounds.MakeCIF ( CIF ); Helices .MakeCIF ( CIF ); Sheets .MakeCIF ( CIF ); Turns .MakeCIF ( CIF ); Links .MakeCIF ( CIF ); LinkRs .MakeCIF ( CIF ); } int CModel::GetCIFPSClass ( PCMMCIFData CIF, int ClassID ) { CChainContainer PSClass; PCChainContainer Dest; int RC; cpstr chainID; PCChain chain; PSClass.SetChain ( NULL ); RC = PSClass.GetCIF ( CIF,ClassID ); if (RC) return RC; chainID = PSClass.Get1stChainID(); while (chainID) { chain = GetChainCreate ( chainID,False ); switch (ClassID) { case ClassID_DBReference : Dest = &(chain->DBReference); break; case ClassID_SeqAdv : Dest = &(chain->SeqAdv); break; case ClassID_ModRes : Dest = &(chain->ModRes); break; case ClassID_Het : Dest = &(chain->Het); break; default : Dest = NULL; } if (Dest) { PSClass.MoveByChainID ( chainID,Dest ); Dest->SetChain ( chain ); } else printf ( " **** PROGRAM ERROR: wrong call to" " CModel::GetCIFPSClass(..)\n" ); chainID = PSClass.Get1stChainID(); } return 0; } int CModel::GetCIF ( PCMMCIFData CIF ) { CSeqRes SeqRes; int RC; PCChain chain; RC = GetCIFPSClass ( CIF,ClassID_DBReference ); if (RC) return RC; RC = GetCIFPSClass ( CIF,ClassID_SeqAdv ); if (RC) return RC; RC = SeqRes.GetCIF ( CIF ); while (!RC) { chain = GetChainCreate ( SeqRes.chainID,False ); chain->SeqRes.Copy ( &SeqRes ); RC = SeqRes.GetCIF ( CIF ); } RC = GetCIFPSClass ( CIF,ClassID_ModRes ); if (RC) return RC; RC = GetCIFPSClass ( CIF,ClassID_Het ); if (RC) return RC; HetCompounds.GetCIF ( CIF ); Helices .GetCIF ( CIF,ClassID_Helix ); Sheets .GetCIF ( CIF ); Turns .GetCIF ( CIF,ClassID_Turn ); Links .GetCIF ( CIF,ClassID_Link ); LinkRs .GetCIF ( CIF,ClassID_LinkR ); return RC; } cpstr CModel::GetEntryID() { if (manager) return manager->Title.idCode; else return pstr(""); } void CModel::SetEntryID ( const IDCode idCode ) { if (manager) manager->SetEntryID ( idCode ); } int CModel::GetNumberOfAllAtoms() { if (manager) return manager->nAtoms; else return 0; } int CModel::GetSerNum() { return serNum; } PCAtom * CModel::GetAllAtoms() { if (manager) return manager->Atom; else return NULL; } cpstr CModel::GetModelID ( pstr modelID ) { modelID[0] = char(0); sprintf ( modelID,"/%i",serNum ); return modelID; } int CModel::GetNumberOfModels() { if (manager) return manager->nModels; else return 0; } void CModel::Copy ( PCModel Model ) { // modify both CModel::_copy and CModel::Copy methods simultaneously! int i; FreeMemory(); if (Model) { serNum = Model->serNum; nChains = Model->nChains; nChainsAlloc = nChains; if (nChains>0) { Chain = new PCChain[nChainsAlloc]; for (i=0;iChain[i]) { Chain[i] = newCChain(); Chain[i]->SetModel ( this ); Chain[i]->Copy ( Model->Chain[i] ); } else Chain[i] = NULL; } } HetCompounds.Copy ( &(Model->HetCompounds) ); Helices .Copy ( &(Model->Helices) ); Sheets .Copy ( &(Model->Sheets) ); Turns .Copy ( &(Model->Turns) ); Links .Copy ( &(Model->Links) ); LinkRs .Copy ( &(Model->LinkRs) ); CisPeps .Copy ( &(Model->CisPeps) ); } } void CModel::CopyHets ( PCModel Model ) { if (Model) HetCompounds.Copy ( &(Model->HetCompounds) ); } void CModel::CopySecStructure ( PCModel Model ) { if (Model) { Helices.Copy ( &(Model->Helices) ); Sheets .Copy ( &(Model->Sheets) ); Turns .Copy ( &(Model->Turns) ); } } void CModel::CopyLinks ( PCModel Model ) { if (Model) Links.Copy ( &(Model->Links) ); } void CModel::CopyLinkRs ( PCModel Model ) { if (Model) LinkRs.Copy ( &(Model->LinkRs) ); } void CModel::CopyCisPeps ( PCModel Model ) { if (Model) CisPeps.Copy ( &(Model->CisPeps) ); } void CModel::_copy ( PCModel Model ) { // modify both CModel::_copy and CModel::Copy methods simultaneously! int i; FreeMemory(); if (Model) { serNum = Model->serNum; nChains = Model->nChains; nChainsAlloc = nChains; if (nChains>0) { Chain = new PCChain[nChainsAlloc]; for (i=0;iChain[i]) { Chain[i] = newCChain(); Chain[i]->SetModel ( this ); Chain[i]->_copy ( Model->Chain[i] ); } else Chain[i] = NULL; } } HetCompounds.Copy ( &(Model->HetCompounds) ); Helices .Copy ( &(Model->Helices) ); Sheets .Copy ( &(Model->Sheets) ); Turns .Copy ( &(Model->Turns) ); Links .Copy ( &(Model->Links) ); LinkRs .Copy ( &(Model->LinkRs) ); CisPeps .Copy ( &(Model->CisPeps) ); } } void CModel::_copy ( PCModel Model, PPCAtom atom, int & atom_index ) { // modify both CModel::_copy and CModel::Copy methods simultaneously! // // _copy(PCModel,PPCAtom,int&) does copy atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. int i; FreeMemory(); if (Model) { serNum = Model->serNum; nChains = Model->nChains; nChainsAlloc = nChains; if (nChains>0) { Chain = new PCChain[nChainsAlloc]; for (i=0;iChain[i]) { Chain[i] = newCChain(); Chain[i]->SetModel ( this ); Chain[i]->_copy ( Model->Chain[i],atom,atom_index ); } else Chain[i] = NULL; } } HetCompounds.Copy ( &(Model->HetCompounds) ); Helices .Copy ( &(Model->Helices) ); Sheets .Copy ( &(Model->Sheets) ); Turns .Copy ( &(Model->Turns) ); Links .Copy ( &(Model->Links) ); LinkRs .Copy ( &(Model->LinkRs) ); } } int CModel::AddChain ( PCChain chain ) { // modify both CModel::Copy methods simultaneously! // // Copy(PCModel,PPCAtom,int&) copies atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. PCModel model1; int i; for (i=0;iGetCoordHierarchy()) { // The chain is associated with a coordinate hierarchy. It should // remain there, therefore we physically copy all its residues // and atoms. Chain[nChains] = newCChain(); Chain[nChains]->SetModel ( this ); if (manager) { // get space for new atoms manager->AddAtomArray ( chain->GetNumberOfAtoms(True) ); Chain[nChains]->_copy ( chain,manager->Atom,manager->nAtoms ); } else { for (i=0;inResidues;i++) Chain[nChains]->AddResidue ( chain->Residue[i] ); } } else { // The chain is not associated with a coordinate hierarchy. Such // unregistered objects are simply taken over, i.e. moved into // the new destination (model). Chain[nChains] = chain; // remove chain from its model: model1 = chain->GetModel(); if (model1) for (i=0;inChains;i++) if (model1->Chain[i]==chain) { model1->Chain[i] = NULL; break; } Chain[nChains]->SetModel ( this ); if (manager) Chain[nChains]->CheckInAtoms(); } nChains++; } return nChains; } void CModel::MoveChain ( PCChain & m_chain, PPCAtom m_atom, PPCAtom atom, int & atom_index, int chain_ext ) { // MoveChain(..) adds chain m_chain on the top Chain array. // The pointer on chain is then set to NULL (m_chain=NULL). // If chain_ext is greater than 0, the moved chain will be // forcefully renamed; the new name is composed as the previous // one + underscore + chain_ext (e.g. A_1). If thus generated // name duplicates any of existing chain IDs, or if chain_ext // was set to 0 and there is a duplication of chain IDs, the // name is again modified as above, with the extension number // generated automatically (this may result in IDs like // A_1_10). // m_atom must give pointer to the Atom array, from which // the atoms belonging to m_chain, are moved to Atom array // given by 'atom', starting from poisition 'atom_index'. // 'atom_index' is then automatically updated to the next // free position in 'atom'. // Note1: the moved atoms will occupy a continuous range // in 'atom' array; no checks on whether the corresponding // cells are occupied or not, are performed. // Note2: the 'atom_index' is numbered from 0 on, i.e. // it is equal to atom[atom_index]->index-1; atom[]->index // is assigned automatically. ChainID chainID; int i,j,k,Ok; PPCChain Chain1; PCResidue crRes; if (!m_chain) return; // modify chain ID with the extension given if (chain_ext>0) sprintf ( chainID,"%s_%i",m_chain->chainID,chain_ext ); else strcpy ( chainID,m_chain->chainID ); // Choose the chain ID. If a chain with such ID is // already present in the model, it will be assigned // a new ID 'ID_n', where 'ID' stands for the original // chain ID and 'n' is the minimum (integer) number // chosen such that 'name_n' represents a new chain ID // (in the model). k = 0; do { Ok = True; for (i=0;(ichainID)) Ok = False; if (!Ok) { k++; if (chain_ext>0) sprintf ( chainID,"%s_%i_%i",m_chain->chainID, chain_ext,k ); else sprintf ( chainID,"%s_%i",m_chain->chainID,k ); } } while (!Ok); // add chain on the top of Chain array. strcpy ( m_chain->chainID,chainID ); if (nChains>=nChainsAlloc) { nChainsAlloc = nChains+10; Chain1 = new PCChain[nChainsAlloc]; k = 0; for (i=0;iSetModel ( this ); nChains++; // Move all atoms of the chain. While residues belong // atoms belong to the chain's manager class. Therefore // they should be moved from one manager to another. for (i=0;inResidues;i++) { crRes = m_chain->Residue[i]; if (crRes) for (j=0;jnAtoms;j++) if (crRes->atom[j]) { k = crRes->atom[j]->index-1; atom[atom_index] = m_atom[k]; atom[atom_index]->index = atom_index+1; atom_index++; m_atom[k] = NULL; // moved! } } m_chain = NULL; // moved! } void CModel::GetAIndexRange ( int & i1, int & i2 ) { PCChain chain; PCResidue res; int ic,ir,ia; i1 = MaxInt4; i2 = MinInt4; for (ic=0;icnResidues;ir++) { res = chain->Residue[ir]; if (res) { for (ia=0;ianAtoms;ia++) if (res->atom[ia]) { if (res->atom[ia]->indexatom[ia]->index; if (res->atom[ia]->index>i2) i2 = res->atom[ia]->index; } } } } } } void CModel::MaskAtoms ( PCMask Mask ) { int i; for (i=0;iMaskAtoms ( Mask ); } void CModel::MaskResidues ( PCMask Mask ) { int i; for (i=0;iMaskResidues ( Mask ); } void CModel::MaskChains ( PCMask Mask ) { int i; for (i=0;iSetMask ( Mask ); } void CModel::UnmaskAtoms ( PCMask Mask ) { int i; for (i=0;iUnmaskAtoms ( Mask ); } void CModel::UnmaskResidues ( PCMask Mask ) { int i; for (i=0;iUnmaskResidues ( Mask ); } void CModel::UnmaskChains ( PCMask Mask ) { int i; for (i=0;iRemoveMask ( Mask ); } // ------ Getting Secondary Structure Elements int CModel::GetNumberOfHelices() { return Helices.Length(); } int CModel::GetNumberOfSheets() { return Sheets.nSheets; } PCHelix CModel::GetHelix ( int serialNum ) { return (PCHelix)Helices.GetContainerClass ( serialNum-1 ); } void CModel::GetSheetID ( int serialNum, SheetID sheetID ) { if ((1<=serialNum) && (serialNum<=Sheets.nSheets)) { if (Sheets.Sheet[serialNum-1]) { strcpy ( sheetID,Sheets.Sheet[serialNum-1]->sheetID ); return; } } sheetID[0] = char(0); } PCSheet CModel::GetSheet ( int serialNum ) { if ((1<=serialNum) && (serialNum<=Sheets.nSheets)) return Sheets.Sheet[serialNum-1]; else return NULL; } PCSheet CModel::GetSheet ( const SheetID sheetID ) { int i; for (i=0;isheetID,sheetID)) return Sheets.Sheet[i]; } return NULL; } int CModel::GetNumberOfStrands ( int sheetSerNum ) { if ((1<=sheetSerNum) && (sheetSerNum<=Sheets.nSheets)) { if (Sheets.Sheet[sheetSerNum-1]) return Sheets.Sheet[sheetSerNum-1]->nStrands; } return 0; } int CModel::GetNumberOfStrands ( const SheetID sheetID ) { int i; for (i=0;isheetID,sheetID)) return Sheets.Sheet[i]->nStrands; } return 0; } PCStrand CModel::GetStrand ( int sheetSerNum, int strandSerNum ) { PCSheet Sheet; if ((1<=sheetSerNum) && (sheetSerNum<=Sheets.nSheets)) { Sheet = Sheets.Sheet[sheetSerNum-1]; if (Sheet) { if ((1<=strandSerNum) && (strandSerNum<=Sheet->nStrands)) return Sheet->Strand[strandSerNum-1]; } } return NULL; } PCStrand CModel::GetStrand ( const SheetID sheetID, int strandSerNum ) { int i; PCSheet Sheet; for (i=0;isheetID,sheetID)) { Sheet = Sheets.Sheet[i]; if (Sheet) { if ((1<=strandSerNum) && (strandSerNum<=Sheet->nStrands)) return Sheet->Strand[strandSerNum-1]; } } } return NULL; } void CModel::RemoveSecStructure() { Helices.FreeContainer(); Sheets .FreeMemory (); Turns .FreeContainer(); } void CModel::RemoveHetInfo() { HetCompounds.FreeMemory(); } int CModel::GetNumberOfLinks() { return Links.Length(); } PCLink CModel::GetLink ( int serialNum ) { return (PCLink)Links.GetContainerClass ( serialNum-1 ); } void CModel::RemoveLinks() { Links.FreeContainer(); } void CModel::AddLink ( PCLink Link ) { Links.AddData ( Link ); } int CModel::GetNumberOfLinkRs() { return LinkRs.Length(); } PCLinkR CModel::GetLinkR ( int serialNum ) { return (PCLinkR)LinkRs.GetContainerClass ( serialNum-1 ); } void CModel::RemoveLinkRs() { LinkRs.FreeContainer(); } void CModel::AddLinkR ( PCLinkR LinkR ) { LinkRs.AddData ( LinkR ); } int CModel::GetNumberOfCisPeps() { return CisPeps.Length(); } PCCisPep CModel::GetCisPep ( int CisPepNum ) { return (PCCisPep)CisPeps.GetContainerClass ( CisPepNum-1 ); } void CModel::RemoveCisPeps() { CisPeps.FreeContainer(); } void CModel::AddCisPep ( PCCisPep CisPep ) { CisPeps.AddData ( CisPep ); } void CModel::ApplyTransform ( mat44 & TMatrix ) { // transforms all coordinates by multiplying with matrix TMatrix int i; for (i=0;iApplyTransform ( TMatrix ); } Boolean CModel::isInSelection ( int selHnd ) { PCMask Mask; if (manager) { Mask = PCMMDBFile(manager)->GetSelMask ( selHnd ); if (Mask) return CheckMask ( Mask ); } return False; } // ------- user-defined data handlers int CModel::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_MODEL) return CUDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CModel::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_MODEL) return CUDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CModel::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_MODEL) return CUDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int CModel::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_MODEL) return CUDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CModel::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_MODEL) return CUDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CModel::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_MODEL) return CUDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int CModel::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_MODEL) return CUDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } // ------- calculation of Secondary Structure int CModel::CalcSecStructure ( Boolean flagBulge, int aminoSelHnd ) { // This function is contributed by Liz Potterton, University of York //------------------------------------------------------------------ // Define a secondary structure type of each amino acid residue in the // structure. // Procedure: // Find all amino acids // Find all pairs of amino acids which have inter-Ca distance < 10.0A // Test for hydrogen bonds between the main chain N and O of the close // residues and store the information in the hbonds matrix // Analyse the info in hbonds matrix to assign secondary structure to // secstr vector PPCResidue Res; PPCAtom Ca; PCChain chain; PSContact contact; imatrix hbonds; PPCAtom * hbond_atoms; int nres, ncontacts; int ir1,ir2, irdif; int i,j,k,l; // 1a. Get protein residues from selection handle if (aminoSelHnd>=0) { manager->GetSelIndex(aminoSelHnd,Res,nres); // printf ( " nres %3i " ,nres ); if (nres<=0) return SSERC_noResidues; } else { // 1b. Get all protein residues nres = 0; for (i=0;inResidues; if (nres<=0) return SSERC_noResidues; Res = new PCResidue[nres]; nres = 0; for (i=0;inResidues; for (j=0;jResidue[j]; } } if (nres<=0) { delete[] Res; return SSERC_noResidues; } } // 2. Get C-alphas of all aminoacids Ca = new PCAtom[nres]; k = 0; for (i=0;i=0 || Res[i]->isAminoacid()) { Ca[i] = Res[i]->GetAtom("CA", " C", "*"); k++; } else Ca[i] = NULL; Res[i]->SSE = SSE_None; } else Ca[i] = NULL; if (k<=0) { delete[] Res; delete[] Ca; return SSERC_noAminoacids; } // 3. Find all close Calphas - i.e. find the contacts between // the two equivalent sets of Ca atoms contact = NULL; ncontacts = 0; manager->SeekContacts ( Ca,nres, Ca,nres, 2.0,10.0, 2, contact,ncontacts,0 ); if (ncontacts<=0) { delete[] Res; delete[] Ca; if (contact) delete[] contact; return SSERC_noSSE; } // 4. Get and initialize memory for analysing the SSE GetMatrixMemory ( hbonds,nres,3,0,0 ); hbond_atoms = new PPCAtom[nres]; for (i=0;i2) { // test if there is donor Hbond from residue ir1 if (Res[ir1]->isMainchainHBond(Res[ir2])) { k = 0; while ((hbonds[ir1][k]!=0) && (k<2)) k++; hbonds [ir1][k] = -irdif; hbond_atoms[ir1][k] = Res[ir1]->GetAtom ( "N" ); hbond_atoms[ir1][k+3] = Res[ir2]->GetAtom ( "O" ); } // test if there is donor Hbond from residue ir2 if (Res[ir2]->isMainchainHBond(Res[ir1])) { k = 0; while ((hbonds[ir2][k]!=0) && (k<2)) k++; hbonds [ir2][k] = irdif; hbond_atoms[ir2][k] = Res[ir2]->GetAtom ( "N" ); hbond_atoms[ir2][k+3] = Res[ir1]->GetAtom ( "O" ); } } } // 6. Assign the turns - if there is bifurcated bond then the 4-turn // takes precedence - read the paper to make sense of this for (i=0;iSSE = SSE_5Turn; Res[i-2]->SSE = SSE_5Turn; Res[i-3]->SSE = SSE_5Turn; Res[i-4]->SSE = SSE_5Turn; } if (hbonds[i][k]==-3) { Res[i-1]->SSE = SSE_3Turn; Res[i-2]->SSE = SSE_3Turn; } k++; } } for (i=0;iSSE = SSE_4Turn; Res[i-2]->SSE = SSE_4Turn; Res[i-3]->SSE = SSE_4Turn; } k++; } } // 7. Look for consecutive 4-turns which make alpha helix for (i=1;iSSE==SSE_Helix) || (Res[i ]->SSE==SSE_4Turn)) && ((Res[i+1]->SSE==SSE_Helix) || (Res[i+1]->SSE==SSE_4Turn)) && ((Res[i+2]->SSE==SSE_Helix) || (Res[i+2]->SSE==SSE_4Turn)) && ((Res[i+3]->SSE==SSE_Helix) || (Res[i+3]->SSE==SSE_4Turn))) for (j=i;j<=i+3;j++) Res[j]->SSE = SSE_Helix; } for (i=0;iSSE = SSE_Strand; Res[j]->SSE = SSE_Strand; } // Parallel strand if (hbonds[j][l]==-irdif-2) { Res[i-1]->SSE = SSE_Strand; Res[j ]->SSE = SSE_Strand; } // Parallel beta bulge if (hbonds[j][l]==-irdif-3) { if (flagBulge) { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Bulge; if (Res[i-2]->SSE==SSE_None) Res[i-2]->SSE = SSE_Bulge; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Bulge; } else { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Strand; if (Res[i-2]->SSE==SSE_None) Res[i-2]->SSE = SSE_Strand; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Strand; } } l++; } // Test for 'wide' hbond j = i + hbonds[i][k] + 2; if (jSSE = SSE_Strand; Res[j-1]->SSE = SSE_Strand; } // Parallel strands if (hbonds[j][l]==-irdif-2) { Res[i ]->SSE = SSE_Strand; Res[j-1]->SSE = SSE_Strand; } l++; } } // test for anti-parallel B-bulge between 'close' hbonds j = i + hbonds[i][k] - 1; if (j>=0) { l = 0; while ((l<=2) && (hbonds[j][l]!=0)) { if (hbonds[j][l]==-irdif+1) { if (flagBulge) { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Bulge; if (Res[j+1]->SSE==SSE_None) Res[j+1]->SSE = SSE_Bulge; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Bulge; } else { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Strand; if (Res[j+1]->SSE==SSE_None) Res[j+1]->SSE = SSE_Strand; if (Res[j ]->SSE==SSE_None) Res[j ]->SSE = SSE_Strand; } } l++; } } // test for anti-parallel B-bulge between 'wide' hbonds j = i + hbonds[i][k] + 3; if (j0)) { if (flagBulge) { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Bulge; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Bulge; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Bulge; } else { if (Res[i-1]->SSE==SSE_None) Res[i-1]->SSE = SSE_Strand; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Strand; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Strand; } } else if (hbonds[j][l]==-irdif-3) { // and bulge in parallel strand if (flagBulge) { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Bulge; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Bulge; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Bulge; } else { if (Res[i ]->SSE==SSE_None) Res[i ]->SSE = SSE_Strand; if (Res[j-1]->SSE==SSE_None) Res[j-1]->SSE = SSE_Strand; if (Res[j-2]->SSE==SSE_None) Res[j-2]->SSE = SSE_Strand; } } l++; } } k++; } // Finish looping over Hbonds for residue (k loop) } // Finish looping over residues ( i loop) // 8. Free memory if (hbond_atoms) { for (i=0;iwrite ( f ); } HetCompounds.write ( f ); Helices .write ( f ); Sheets .write ( f ); Turns .write ( f ); Links .write ( f ); LinkRs .write ( f ); } void CModel::read ( RCFile f ) { int i,k; byte Version; FreeMemory(); f.ReadByte ( &Version ); CProModel::read ( f ); f.ReadInt ( &serNum ); f.ReadInt ( &nChains ); nChainsAlloc = nChains; if (nChains>0) { Chain = new PCChain[nChainsAlloc]; for (i=0;iSetModel ( this ); Chain[i]->read ( f ); } } } HetCompounds.read ( f ); Helices .read ( f ); Sheets .read ( f ); Turns .read ( f ); if (Version>1) Links .read ( f ); if (Version>2) LinkRs.read ( f ); } MakeFactoryFunctions(CModel) mmdb-1.23.2.1/src/hybrid_36.cpp0000644000175100017510000002005211475665501012675 00000000000000 // // This is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // /*! C port of the hy36encode() and hy36decode() functions in the hybrid_36.py Python prototype/reference implementation. See the Python script for more information. This file has no external dependencies, NOT even standard C headers. Optionally, use hybrid_36_c.h, or simply copy the declarations into your code. This file is unrestricted Open Source (cctbx.sf.net). Please send corrections and enhancements to cctbx@cci.lbl.gov . See also: http://cci.lbl.gov/hybrid_36/ Ralf W. Grosse-Kunstleve, Feb 2007. */ /* The following #include may be commented out. It is here only to enforce consistency of the declarations and the definitions. */ #ifndef IOTBX_PDB_HYBRID_36_C_H #include "hybrid_36.h" #endif /* All static functions below are implementation details (and not accessible from other translation units). */ static const char* digits_upper() { return "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } static const char* digits_lower() { return "0123456789abcdefghijklmnopqrstuvwxyz"; } static const char* value_out_of_range() { return "value out of range."; } static const char* invalid_number_literal() { return "invalid number literal."; } static const char* unsupported_width() { return "unsupported width."; } static void fill_with_stars(unsigned width, char* result) { while (width) { *result++ = '*'; width--; } *result = '\0'; } static void encode_pure( const char* digits, unsigned digits_size, unsigned width, int value, char* result) { char buf[16]; int rest; unsigned i, j; i = 0; j = 0; if (value < 0) { j = 1; value = -value; } while (1) { rest = value / digits_size; buf[i++] = digits[value - rest * digits_size]; if (rest == 0) break; value = rest; } if (j) buf[i++] = '-'; for(j=i;j 127) { *result = 0; return invalid_number_literal(); } if (si == ' ') { if (!have_non_blank) continue; value *= digits_size; } else if (si == '-') { if (have_non_blank) { *result = 0; return invalid_number_literal(); } have_non_blank = 1; have_minus = 1; continue; } else { have_non_blank = 1; dv = digits_values[si]; if (dv < 0 || dv >= (int)digits_size) { *result = 0; return invalid_number_literal(); } value *= digits_size; value += dv; } } if (have_minus) value = -value; *result = value; return 0; } /*! hybrid-36 encoder: converts integer value to string result width: must be 4 (e.g. for residue sequence numbers) or 5 (e.g. for atom serial numbers) value: integer value to be converted result: pointer to char array of size width+1 or greater on return result is null-terminated return value: pointer to error message, if any, or 0 on success Example usage (from C++): char result[4+1]; const char* errmsg = hy36encode(4, 12345, result); if (errmsg) throw std::runtime_error(errmsg); */ const char* hy36encode(unsigned width, int value, char* result) { int i = value; if (width == 4U) { if (i >= -999) { if (i < 10000) { encode_pure(digits_upper(), 10U, 4U, i, result); return 0; } i -= 10000; if (i < 1213056 /* 26*36**3 */) { i += 466560 /* 10*36**3 */; encode_pure(digits_upper(), 36U, 0U, i, result); return 0; } i -= 1213056; if (i < 1213056) { i += 466560; encode_pure(digits_lower(), 36U, 0U, i, result); return 0; } } } else if (width == 5U) { if (i >= -9999) { if (i < 100000) { encode_pure(digits_upper(), 10U, 5U, i, result); return 0; } i -= 100000; if (i < 43670016 /* 26*36**4 */) { i += 16796160 /* 10*36**4 */; encode_pure(digits_upper(), 36U, 0U, i, result); return 0; } i -= 43670016; if (i < 43670016) { i += 16796160; encode_pure(digits_lower(), 36U, 0U, i, result); return 0; } } } else { fill_with_stars(width, result); return unsupported_width(); } fill_with_stars(width, result); return value_out_of_range(); } /*! hybrid-36 decoder: converts string s to integer result width: must be 4 (e.g. for residue sequence numbers) or 5 (e.g. for atom serial numbers) s: string to be converted does not have to be null-terminated s_size: size of s must be equal to width, or an error message is returned otherwise result: integer holding the conversion result return value: pointer to error message, if any, or 0 on success Example usage (from C++): int result; const char* errmsg = hy36decode(width, "A1T5", 4, &result); if (errmsg) throw std::runtime_error(errmsg); */ const char* hy36decode(unsigned width, const char* s, unsigned s_size, int* result) { static int first_call = 1; static int digits_values_upper[128U]; static int digits_values_lower[128U]; static const char* ie_range = "internal error hy36decode: integer value out of range."; unsigned i; int di; const char* errmsg; if (first_call) { first_call = 0; for(i=0;i<128U;i++) digits_values_upper[i] = -1; for(i=0;i<128U;i++) digits_values_lower[i] = -1; for(i=0;i<36U;i++) { di = digits_upper()[i]; if (di < 0 || di > 127) { *result = 0; return ie_range; } digits_values_upper[di] = i; } for(i=0;i<36U;i++) { di = digits_lower()[i]; if (di < 0 || di > 127) { *result = 0; return ie_range; } digits_values_lower[di] = i; } } if (s_size == width) { di = s[0]; if (di >= 0 && di <= 127) { if (digits_values_upper[di] >= 10) { errmsg = decode_pure(digits_values_upper, 36U, s, s_size, result); if (errmsg == 0) { /* result - 10*36**(width-1) + 10**width */ if (width == 4U) (*result) -= 456560; else if (width == 5U) (*result) -= 16696160; else { *result = 0; return unsupported_width(); } return 0; } } else if (digits_values_lower[di] >= 10) { errmsg = decode_pure(digits_values_lower, 36U, s, s_size, result); if (errmsg == 0) { /* result + 16*36**(width-1) + 10**width */ if (width == 4U) (*result) += 756496; else if (width == 5U) (*result) += 26973856; else { *result = 0; return unsupported_width(); } return 0; } } else { errmsg = decode_pure(digits_values_upper, 10U, s, s_size, result); if (errmsg) return errmsg; if (!(width == 4U || width == 5U)) { *result = 0; return unsupported_width(); } return 0; } } } *result = 0; return invalid_number_literal(); } mmdb-1.23.2.1/src/mmdb_ficif.h0000644000175100017510000003020711475666363012642 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 15.12.02 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_FICIF // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_FICIF__ #define __MMDB_FICIF__ #ifndef __Machine__ #include "machine_.h" #endif // ==================== FORTRAN INTERFACE ======================== FORTRAN_SUBR ( MMDB_FCIF_INIT, mmdb_fcif_init,(),(),() ); FORTRAN_SUBR ( MMDB_FCIF_QUIT, mmdb_fcif_quit,(),(),() ); FORTRAN_SUBR ( MMDB_FCIF_CREATE, mmdb_fcif_create, ( // lengths-at-end list fpstr DataName, // file name int DataName_len // fortran-hidden length of DataName ), ( // lengths-in-structure list fpstr DataName ), ( // lengths-follow list fpstr DataName, int DataName_len ) ); FORTRAN_SUBR ( MMDB_FCIF_WRITE, mmdb_fcif_write, ( // lengths-at-end list fpstr FileName, // file name int * iRet, // return code int FileName_len // fortran-hidden length of FileName ), ( // lengths-in-structure list fpstr FileName, int *iRet ), ( // lengths-follow list fpstr FileName, int FileName_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTDATE, mmdb_fcif_putdate, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTDOT, mmdb_fcif_putdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTQUESTION, mmdb_fcif_putquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTSTRING, mmdb_fcif_putstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTREAL, mmdb_fcif_putreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTINTEGER, mmdb_fcif_putinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPDOT, mmdb_fcif_putloopdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPQUESTION, mmdb_fcif_putloopquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPSTRING, mmdb_fcif_putloopstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPREAL, mmdb_fcif_putloopreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPINTEGER, mmdb_fcif_putloopinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ); // ==================== C INTERFACE ======================== extern "C" void MMDB_CCIF_Init(); extern "C" void MMDB_CCIF_Quit(); extern "C" void MMDB_CCIF_Create ( pstr DataName ); extern "C" int MMDB_CCIF_Write ( pstr FileName ); extern "C" int MMDB_CCIF_PutDate ( pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutDot ( pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutQuestion ( pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutString ( pstr Data, pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutReal ( realtype V, pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutInteger ( int I, pstr CatName, pstr Tag ); extern "C" int MMDB_CCIF_PutLoopDot ( pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopQuestion ( pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopString ( pstr Data, pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopReal ( realtype V, pstr CatName, pstr Tag, int nrow ); extern "C" int MMDB_CCIF_PutLoopInteger ( int I, pstr CatName, pstr Tag, int nrow ); #endif mmdb-1.23.2.1/src/mmdb_cryst.h0000644000175100017510000003727111475666363012736 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Cryst // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CCrystContainer ( container for cryst. data ) // ~~~~~~~~~ CNCSMatrix ( non-cryst. symm. matrix class ) // CTVect ( translation vector class ) // CMMDBCryst ( MMDB cryst. section class ) // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_Cryst__ #define __MMDB_Cryst__ #ifndef __Stream__ #include "stream_.h" #endif #ifndef __MMDB_SymOp__ #include "mmdb_symop.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_Utils__ #include "mmdb_utils.h" #endif // ==================== CCrystContainer ====================== DefineClass(CCrystContainer) DefineStreamFunctions(CCrystContainer) class CCrystContainer : public CClassContainer { public : CCrystContainer () : CClassContainer() {} CCrystContainer ( RPCStream Object ) : CClassContainer ( Object ) {} ~CCrystContainer() {} PCContainerClass MakeContainerClass ( int ClassID ); int AddMTRIXLine ( cpstr S ); }; // ================== CNCSMatrix ======================== #define NCSMSET_Matrix1 0x00000001 #define NCSMSET_Matrix2 0x00000002 #define NCSMSET_Matrix3 0x00000004 #define NCSMSET_All 0x00000007 DefineClass(CNCSMatrix) DefineStreamFunctions(CNCSMatrix) class CNCSMatrix : public CContainerClass { friend class CMMDBCryst; public : int serNum; // serial number mat33 m; // non-crystallographic symmetry matrix vect3 v; // translational part of ncs matrix int iGiven; // iGiven flag (see PDB format) CNCSMatrix (); CNCSMatrix ( cpstr S ); CNCSMatrix ( RPCStream Object ); ~CNCSMatrix(); Boolean PDBASCIIDump1 ( RCFile f ); int ConvertPDBASCII ( cpstr S ); void MakeCIF ( PCMMCIFData CIF, int N ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_NCSMatrix; } void SetNCSMatrix ( int serialNum, mat33 & ncs_m, vect3 & ncs_v, int i_Given ); void Copy ( PCContainerClass NCSMatrix ); void write ( RCFile f ); void read ( RCFile f ); protected : word WhatIsSet; // mask field // 0x0001 MTRIX1 was converted // 0x0002 MTRIX2 was converted // 0x0004 MTRIX3 was converted void Init(); }; // ================== CTVect ======================== DefineClass(CTVect) DefineStreamFunctions(CTVect) class CTVect : public CContainerClass { public : int serNum; // serial number vect3 t; // translation vector pstr comment; // comment CTVect (); CTVect ( cpstr S ); CTVect ( RPCStream Object ); ~CTVect(); void PDBASCIIDump ( pstr S, int N ); int ConvertPDBASCII ( cpstr S ); void MakeCIF ( PCMMCIFData CIF, int N ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_TVect; } void Copy ( PCContainerClass TVect ); void write ( RCFile f ); void read ( RCFile f ); protected : void Init(); }; // ================= CMMDBCryst ======================= DefineClass(CMMDBCryst) DefineStreamFunctions(CMMDBCryst) // constants for the CellCheck field #define CCHK_Ok 0x00000000 #define CCHK_NoCell 0x00000001 #define CCHK_Error 0x00000002 #define CCHK_Disagreement 0x00000004 #define CCHK_NoOrthCode 0x00000008 #define CCHK_Translations 0x00000010 #define CCHK_Unchecked 0x00001000 // constants for the WhatIsSet field #define CSET_CellParams1 0x00000001 #define CSET_CellParams2 0x00000002 #define CSET_CellParams 0x00000003 #define CSET_SpaceGroup 0x00000004 #define CSET_ZValue 0x00000008 #define CSET_CrystCard 0x0000000F #define CSET_OrigMatrix1 0x00000010 #define CSET_OrigMatrix2 0x00000020 #define CSET_OrigMatrix3 0x00000040 #define CSET_OrigMatrix 0x00000070 #define CSET_ScaleMatrix1 0x00000080 #define CSET_ScaleMatrix2 0x00000100 #define CSET_ScaleMatrix3 0x00000200 #define CSET_ScaleMatrix 0x00000380 #define CSET_Transforms 0x00000400 #define CSET_DummyCell 0x00001000 extern cpstr OrthCode[6]; class CMMDBCryst : public CStream { friend class CChannel; public : realtype a,b,c; // cell parameters realtype alpha,beta,gamma; // cell parameters mat44 RO,RF; // orthogonal-fractional recalculation // matrices mat44 ROU,RFU; // ort-frac recalc matrices for // anisotr. t-fac mat633 RR; // standard orthogonalizations realtype Vol; // cell volume int NCode; // code of orthogonalization matrix SymGroup spaceGroup; // group of space symmetry as read // from file SymGroup spaceGroupFix; // actually used space group int Z; // Z-value mat33 o; // orthogonal transformation matrix vect3 t; // translation orthogonal vector mat33 s; // scale matrix vect3 u; // translation part of the scale matrix word CellCheck; // 0x0000 - Ok // 0x0001 - no cell stored // 0x0002 - some error in cell volume // 0x0004 - disagreement between // cell and PDB // 0x0008 - no orth code derived // 0x0010 - translations also specified // 0x1000 - the check was not done word WhatIsSet; // indicator of the fields set Boolean ignoreScalei; // flag to ignore SCALEi cards CMMDBCryst (); CMMDBCryst ( RPCStream Object ); ~CMMDBCryst(); void FreeMemory(); void Reset (); // ConvertPDBString(..) interprets an ASCII PDB line and fills // the corresponding data fields. It returns zero if the line was // successfully converted, otherwise returns a non-negative value // of Error_XXXX. // PDBString must be not shorter than 81 characters. int ConvertPDBString ( pstr PDBString, Boolean fixSpaceGroup ); // RWBROOKReadPrintout() may be invoked after reading PDB file // for simulating the old RWBROOK messages and warnings void RWBROOKReadPrintout(); void SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ); void PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ); void GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol ); void GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols ); void SetSyminfoLib ( cpstr syminfoLib ); pstr GetSyminfoLib (); int SetSpaceGroup ( cpstr spGroup ); pstr GetSpaceGroup (); pstr GetSpaceGroupFix(); // CalcCoordTransforms() should be called once after all data // relevant to the crystallographic information, are read and // converted. Field CellCheck will then have bits set if there // are errors, e.g. bit CCHK_NoCell means that the coordinate // transformations cannot be performed. void CalcCoordTransforms(); // A PDB ASCII dump void PDBASCIIDump ( RCFile f ); int GetCIF ( PCMMCIFData CIF, Boolean fixSpaceGroup ); void MakeCIF ( PCMMCIFData CIF ); Boolean areMatrices(); // returns True if the orthogonal-to- // fractional and fractional-to-orthogonal // matrices are defined // Frac2Orth(..) and Orth2Frac(..) transform between fractional // and orthogonal coordinates, if areMatrices() returns True. // If the transformation matrices were not set, the functions just // copy the coordinates. Returns True if the transformation was // done; False return means that transformation matrices were not // calculated Boolean Frac2Orth ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ); Boolean Orth2Frac ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ); // Below, F and T are transformation matrices in fractional and // orthogonal coordinates, respectively. Boolean Frac2Orth ( mat44 & F, mat44 & T ); Boolean Orth2Frac ( mat44 & T, mat44 & F ); // Cryst2Orth(..) and Orth2Cryst(..) transform between fractional // and orthogonal anisotropic temperature factors, if areMatrices() // returns True. If the transformation matrices were not set, the // functions leave the factors unchanged. // Vector U is composed as follows: // U[0]=u11 U[1]=u22 U[2]=u33 // U[3]=u12 U[4]=u13 U[5]=u23 // Returns True if the transformation was done; False retuen // means that transformation matrices were not calculated Boolean Cryst2Orth ( rvector U ); Boolean Orth2Cryst ( rvector U ); void CalcOrthMatrices(); // calculates RR, AC, cella's and Vol Boolean isNCSMatrix (); Boolean isScaleMatrix (); Boolean isCellParameters(); int GetNumberOfSymOps(); pstr GetSymOp ( int Nop ); int GetNumberOfNCSMatrices(); int GetNumberOfNCSMates (); // Returns the number of // NCS mates not given in // the file (iGiven==0) Boolean GetNCSMatrix ( int NCSMatrixNo, mat33 & ncs_m, vect3 & ncs_v ); Boolean GetNCSMatrix ( int NCSMatrixNo, mat44 & ncs_m, int & iGiven ); // no=0..N-1 int AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ); // GetTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop and places // them into unit cell shifted by cellshift_a a's, cellshift_b // b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c, PCSymOps symOpers=NULL ); // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation Nop. Translation part // of the matrix is being chosen such that point (x,y,z) has // least distance to the center of primary (333) unit cell, // and then it is shifted by cellshift_a a's, cellshift_b b's // and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // int GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c, PCSymOps symOpers=NULL ); // GetFractMatrix(..) calculates and returns the coordinate // transformation matrix, which converts fractional coordinates // according to the symmetry operation number Nop and places them // into unit cell shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetFractMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c, PCSymOps symOpers=NULL ); // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // int GetSymOpMatrix ( mat44 & TMatrix, int Nop ); void Copy ( PCMMDBCryst Cryst ); void write ( RCFile f ); // writes header to PDB binary file void read ( RCFile f ); // reads header from PDB binary file protected : CCrystContainer NCSMatrix; // non-cryst. symm. matrices CCrystContainer TVect; // translation vectors realtype as,bs,cs; // calculated 'cell parameters' realtype alphas,betas,gammas; // calculated 'cell parameters' realtype AC[6]; realtype VolChk,VolErr; pstr syminfo_lib; // path to syminfo.lib CSymOps SymOps; // symmetry operations void Init ( Boolean fullInit ); int FixSpaceGroup(); }; extern cpstr getOrthCodeName ( int NCode ); /* extern void TestCryst(); // reads from 'in.cryst', writes into // 'out.cryst' and 'abin.cryst' */ #endif mmdb-1.23.2.1/src/mmdb_rwbrook.cpp0000644000175100017510000030477311475666363013616 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_RWBrook // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CChannel ( I/O unit class ) // ~~~~~~~~~ // **** Functions : mmdb_f_init_ ( initializer ) // ~~~~~~~~~~~ mmdb_f_quit_ ( disposer ) // autoserials_ ( switch to the autoserials regime ) // setreadcoords_ ( switch for reading coordinates ) // simrwbrook_ ( simulates old RWBROOK printout ) // mmdb_f_openl_ ( associates a unit with a file ) // mmdb_f_open_ ( associates a unit with a file ) // mmdb_f_copy_ ( copies contents of units ) // mmdb_f_delete_ ( deletes part of a unit ) // mmdb_f_settype_ ( changes type of file and r/w mode ) // mmdb_f_setname_ ( changes file name ) // mmdb_f_write_ ( writes a data structure into file ) // mmdb_f_close_ ( closes and disposes a data str-re ) // mmdb_f_advance_ ( advances the internal pointer ) // mmdb_f_rewd_ ( sets internal pointer on the top ) // mmdb_f_bksp_ ( shifts int-l pointer 1 atom back ) // mmdb_f_atom_ ( reads/writes atom properties ) // mmdb_f_coord_ ( reads/writes atom coordinates ) // mmdb_f_setcell_ ( sets the crystal cell parameters ) // mmdb_f_wbspgrp_ ( sets the space group ) // mmdb_f_rbspgrp_ ( gets the space group ) // mmdb_f_wbcell_ ( sets the crystal cell parameters ) // mmdb_f_rbcell_ ( gets the crystal cell parameters ) // mmdb_f_rbcelln_ ( gets the crystal cell parameters ) // mmdb_f_rbrcel_ ( gets the recipricol cell ) // mmdb_f_rborf_ ( returns or fill transf. matrices ) // mmdb_f_orthmat_ ( calc. standard othogonalisations ) // mmdb_f_cvanisou_ ( converts between cryst-c units ) // mmdb_f_wremark_ ( writes a remark statement ) // mmdb_f_setter // mmdb_f_sethet // rberrstop_ ( error messenger ) // rbcheckerr_ ( a simple error messenger ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // // Note: what if the orthogonalization code is not defined? // #ifndef __STRING_H #include "string.h" #endif #ifndef __STDLIB_H #include "stdlib.h" #endif #ifndef __MATH_H #include "math.h" #endif #ifndef __MMDB_RWBrook__ #include "mmdb_rwbrook.h" #endif #ifndef __MMDB_Manager__ #include "mmdb_manager.h" #endif #ifndef __MMDB_Tables__ #include "mmdb_tables.h" #endif // ========================== CChannel =========================== DefineClass(CChannel) class CChannel { public : int nUnit; // unit number int nType; // unit type: 0- PDB; 1- CIF; 2- binary int nRead; // 0: input, 1: output PCMMDBManager MMDBManager; // MMDB manager pstr FName; // file name int fPos; // "position" in the file int ErrCode; // error code of last operation Boolean FAutoSer; // autoserials flag for reading PDB Boolean FReadCoords; // flag to read coordinate section Boolean FSimRWBROOK; // flag to simulate old RWBROOK's printout CChannel (); ~CChannel(); void Dispose(); void Init (); void SetFileType ( pstr FType ); void SetFileName ( pstr FileName, int FNameLen ); void IdentifyFile( pstr ExistingFName ); Boolean EndOfFile (); PCAtom * GetAtomArray(); PCAtom GetAtomI ( int index ); PCMMDBCryst GetCryst (); Boolean areCrystMatrices(); void Frac2Orth ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ); void Orth2Frac ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ); void Cryst2Orth ( rvector U ); void Orth2Cryst ( rvector U ); int SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ); int PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ); int SetSpGroup ( pstr spGroup ); int GetSpGroup ( pstr spGroup ); int GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & cell_v, int & OrthCode ); int GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & cell_vs ); void MakeCoordStructure(); void Read (); void Write(); void GetInputBuffer ( pstr Line, int & count ); protected : void TranslateError(); }; CChannel::CChannel() { Init(); } CChannel::~CChannel() { Dispose(); } void CChannel::Init() { nUnit = -1; nType = -1; nRead = 0; MMDBManager = NULL; FName = NULL; ErrCode = 0; fPos = 0; FAutoSer = False; FReadCoords = True; FSimRWBROOK = False; } void CChannel::Dispose() { if (MMDBManager) delete MMDBManager; if (FName) delete[] FName; MMDBManager = NULL; FName = NULL; nUnit = -1; nType = -1; nRead = 0; ErrCode = 0; fPos = 0; } void CChannel::SetFileType ( pstr FType ) { switch (FType[0]) { default : case ' ' : if (nRead==0) nType = -1; // auto at reading else if (MMDBManager) nType = MMDBManager->FType; // auto at writing else nType = -1; break; case 'P' : nType = 0; break; // PDB case 'C' : nType = 1; break; // CIF case 'B' : nType = 2; break; // BIN } } void CChannel::IdentifyFile ( pstr ExistingFName ) { if (nType==-1) { if (ExistingFName) { if (isMMDBBIN(ExistingFName)==0) nType = 2; else if (isPDB(ExistingFName,GZM_CHECK,True)==0) nType = 0; else if (isCIF(ExistingFName)==0) nType = 1; else nType = -2; // unidentified } else { if (MMDBManager) { if (MMDBManager->FType<0) nType = 0; // PDB else nType = MMDBManager->FType; // same as it was on last input } else nType = 0; } } } void CChannel::SetFileName ( pstr FileName, int FNameLen ) { if (FName) delete[] FName; FName = new char[FNameLen+1]; strncpy ( FName,FileName,FNameLen ); FName[FNameLen] = char(0); } void CChannel::MakeCoordStructure() { if (MMDBManager) MMDBManager->Delete ( MMDBFCM_All ); else { MMDBManager = new CMMDBManager(); MMDBManager->SetFlag ( MMDBF_AllowDuplChainID ); } } void CChannel::Read() { int RC; ErrCode = -2; if (!FName) return; MakeCoordStructure(); IdentifyFile ( FName ); if (FAutoSer) MMDBManager->SetFlag ( MMDBF_AutoSerials ); else MMDBManager->RemoveFlag ( MMDBF_AutoSerials ); if (FReadCoords) MMDBManager->RemoveFlag ( MMDBF_NoCoordRead ); else MMDBManager->SetFlag ( MMDBF_NoCoordRead ); if (FSimRWBROOK) MMDBManager->SetFlag ( MMDBF_SimRWBROOK ); else MMDBManager->RemoveFlag ( MMDBF_SimRWBROOK ); MMDBManager->SetFlag ( MMDBF_IgnoreDuplSeqNum | MMDBF_IgnoreBlankLines | MMDBF_IgnoreRemarks | MMDBF_IgnoreNonCoorPDBErrors | MMDBF_AllowDuplChainID ); switch (nType) { default : nType = 0; // nType=-2: unidentified: try PDB case 0 : ErrCode = MMDBManager->ReadPDBASCII ( FName ); break; case 1 : ErrCode = MMDBManager->ReadCIFASCII ( FName ); break; case 2 : ErrCode = MMDBManager->ReadMMDBF ( FName ); break; } if (ErrCode==0) { RC = MMDBManager->CrystReady(); switch (RC) { case CRRDY_NoTransfMatrices : ErrCode = RWBERR_NoMatrices; break; case CRRDY_Unchecked : ErrCode = RWBERR_NoCheck; break; case CRRDY_Ambiguous : ErrCode = RWBERR_Disagreement; break; case CRRDY_NoCell : ErrCode = RWBERR_NoCellParams; break; default : ; } } fPos = 0; // begining of the file TranslateError(); } void CChannel::Write() { ErrCode = -3; if ((!MMDBManager) || (!FName)) return; IdentifyFile ( FName ); switch (nType) { default : nType = 0; // nType=-2: unidentified: make PDB case 0 : ErrCode = MMDBManager->WritePDBASCII ( FName ); break; case 1 : ErrCode = MMDBManager->WriteCIFASCII ( FName ); break; case 2 : ErrCode = MMDBManager->WriteMMDBF ( FName ); break; } // we do not change fPos here! TranslateError(); } void CChannel::TranslateError() { switch (ErrCode) { case Error_CantOpenFile : ErrCode = RWBERR_CantOpenFile; break; case Error_UnrecognizedInteger : ErrCode = RWBERR_WrongInteger; break; case Error_NoData : ErrCode = RWBERR_NotACIFFile; break; case Error_WrongModelNo : ErrCode = RWBERR_WrongModelNo; break; case Error_DuplicatedModel : ErrCode = RWBERR_DuplicatedModel; break; case Error_ForeignFile : ErrCode = RWBERR_ForeignFile; break; case Error_WrongEdition : ErrCode = RWBERR_WrongEdition; break; case Error_ATOM_Unrecognized : ErrCode = RWBERR_ATOM_Unrecognd; break; case Error_ATOM_AlreadySet : ErrCode = RWBERR_ATOM_AlreadySet; break; case Error_ATOM_NoResidue : ErrCode = RWBERR_ATOM_NoResidue; break; case Error_ATOM_Unmatch : ErrCode = RWBERR_ATOM_Unmatch; break; case Error_NotACIFFile : ErrCode = RWBERR_NotACIFFile; break; case Error_UnrecognCIFItems : ErrCode = RWBERR_UnrecognCIFItems; break; case Error_MissingCIFField : ErrCode = RWBERR_MissingCIFField; break; case Error_EmptyCIFLoop : ErrCode = RWBERR_EmptyCIFLoop; break; case Error_UnexpEndOfCIF : ErrCode = RWBERR_UnexpEndOfCIF; break; case Error_MissgCIFLoopField : ErrCode = RWBERR_MissgCIFLoopField; break; case Error_NotACIFStructure : ErrCode = RWBERR_NotACIFStructure; break; case Error_NotACIFLoop : ErrCode = RWBERR_NotACIFLoop; break; case Error_UnrecognizedReal : ErrCode = RWBERR_WrongReal; break; case Error_Ok : ErrCode = RWBERR_Ok; break; case Error_WrongChainID : ErrCode = RWBERR_WrongChainID; break; case Error_WrongEntryID : ErrCode = RWBERR_WrongEntryID; break; case Error_SEQRES_serNum : ErrCode = RWBERR_SEQRES_serNum; break; case Error_SEQRES_numRes : ErrCode = RWBERR_SEQRES_numRes; break; case Error_SEQRES_extraRes : ErrCode = RWBERR_SEQRES_exraRes; break; case Error_NCSM_Unrecognized : ErrCode = RWBERR_NCSM_Unrecogn; break; case Error_NCSM_AlreadySet : ErrCode = RWBERR_NCSM_AlreadySet; break; case Error_NCSM_WrongSerial : ErrCode = RWBERR_NCSM_WrongSerial; break; case Error_NCSM_UnmatchIG : ErrCode = RWBERR_NCSM_UnmatchIG; break; case Error_NoModel : ErrCode = RWBERR_NoModel; break; case Error_NoSheetID : ErrCode = RWBERR_NoSheetID; break; case Error_WrongSheetID : ErrCode = RWBERR_WrongSheetID; break; case Error_WrongStrandNo : ErrCode = RWBERR_WrongStrandNo; break; case Error_WrongNumberOfStrands : ErrCode = RWBERR_WrongNofStrands; break; case Error_WrongSheetOrder : ErrCode = RWBERR_WrongSheetOrder; break; case Error_HBondInconsistency : ErrCode = RWBERR_HBondInconsis; break; case Error_EmptyResidueName : ErrCode = RWBERR_EmptyResidueName; break; case Error_DuplicateSeqNum : ErrCode = RWBERR_DuplicateSeqNum; break; case Error_NoLogicalName : ErrCode = RWBERR_NoLogicalName; break; case Error_GeneralError1 : ErrCode = RWBERR_GeneralError1; break; default : ; } } Boolean CChannel::EndOfFile() { int nA; if (MMDBManager) { nA = MMDBManager->GetNumberOfAtoms(); if (fPos>nA) { fPos = nA+1; return True; } } else return True; return False; } PCAtom * CChannel::GetAtomArray() { if (MMDBManager) return MMDBManager->GetAtomArray(); else return NULL; } PCAtom CChannel::GetAtomI ( int index ) { // returns index-th atom, as counted from the // top of file if (MMDBManager) return MMDBManager->GetAtomI ( index ); else return NULL; } PCMMDBCryst CChannel::GetCryst() { if (MMDBManager) return &(MMDBManager->Cryst); else return NULL; } Boolean CChannel::areCrystMatrices() { if (MMDBManager) return MMDBManager->Cryst.areMatrices(); else return False; } void CChannel::Frac2Orth ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ) { if (MMDBManager) MMDBManager->Cryst.Frac2Orth ( x,y,z,xx,yy,zz ); else { xx = x; yy = y; zz = z; } } void CChannel::Orth2Frac ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ) { if (MMDBManager) MMDBManager->Cryst.Orth2Frac ( x,y,z,xx,yy,zz ); else { xx = x; yy = y; zz = z; } } void CChannel::Cryst2Orth ( rvector U ) { if (MMDBManager) MMDBManager->Cryst.Cryst2Orth ( U ); } void CChannel::Orth2Cryst ( rvector U ) { if (MMDBManager) MMDBManager->Cryst.Orth2Cryst ( U ); } int CChannel::PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { if (MMDBManager) { MMDBManager->Cryst.PutCell ( cell_a,cell_b,cell_c, cell_alpha,cell_beta,cell_gamma, OrthCode ); if ((cell_a!=0.0) || (OrthCode>0)) { if (MMDBManager->Cryst.CellCheck & CCHK_Disagreement) return RWBERR_Disagreement; if (MMDBManager->Cryst.CellCheck & CCHK_NoOrthCode) return RWBERR_NoOrthCode; if (MMDBManager->Cryst.CellCheck & CCHK_Unchecked) return RWBERR_NoCheck; } return RWBERR_Ok; } else return RWBERR_NoFile; } int CChannel::SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { if (MMDBManager) { MMDBManager->Cryst.SetCell ( cell_a,cell_b,cell_c, cell_alpha,cell_beta,cell_gamma, OrthCode ); if (MMDBManager->Cryst.CellCheck & CCHK_Disagreement) return RWBERR_Disagreement; if (MMDBManager->Cryst.CellCheck & CCHK_NoOrthCode) return RWBERR_NoOrthCode; if (MMDBManager->Cryst.CellCheck & CCHK_Unchecked) return RWBERR_NoCheck; return RWBERR_Ok; } else return RWBERR_NoFile; } int CChannel::SetSpGroup ( pstr spGroup ) { if (MMDBManager) { MMDBManager->SetSpaceGroup(spGroup); return RWBERR_Ok; } else return RWBERR_NoFile; } int CChannel::GetSpGroup ( pstr spGroup ) { if (MMDBManager) { if (MMDBManager->Cryst.WhatIsSet & CSET_SpaceGroup) strcpy ( spGroup,MMDBManager->Cryst.spaceGroup ); else strcpy ( spGroup," " ); return RWBERR_Ok; } else return RWBERR_NoFile; } int CChannel::GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & cell_v, int & OrthCode ) { if (MMDBManager) { cell_a = MMDBManager->Cryst.a; cell_b = MMDBManager->Cryst.b; cell_c = MMDBManager->Cryst.c; cell_alpha = MMDBManager->Cryst.alpha; cell_beta = MMDBManager->Cryst.beta; cell_gamma = MMDBManager->Cryst.gamma; cell_v = MMDBManager->Cryst.Vol; OrthCode = MMDBManager->Cryst.NCode; if (!(MMDBManager->Cryst.WhatIsSet & CSET_CellParams)) return RWBERR_NoCellParams; if (!(MMDBManager->Cryst.WhatIsSet & CSET_Transforms)) return RWBERR_NoCheck; // if (MMDBManager->Cryst.CellCheck & CCHK_NoOrthCode) // return RWBERR_NoOrthCode; return RWBERR_Ok; } else return RWBERR_NoFile; } int CChannel::GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & cell_vs ) { if (MMDBManager) { MMDBManager->Cryst.GetRCell ( cell_as,cell_bs,cell_cs, cell_alphas,cell_betas,cell_gammas, cell_vs ); if (!(MMDBManager->Cryst.WhatIsSet & CSET_CellParams)) return RWBERR_NoCellParams; if (!(MMDBManager->Cryst.WhatIsSet & CSET_Transforms)) return RWBERR_NoCheck; return RWBERR_Ok; } else return RWBERR_NoFile; } void CChannel::GetInputBuffer ( pstr Line, int & count ) { if (MMDBManager) MMDBManager->GetInputBuffer ( Line,count ); else { strcpy ( Line,"" ); count = -1; } } // ======================== static data =========================== static int nChannels; // number of channels in processing static PCChannel * Channel; // array of channels in processing static Boolean FAutoSer; // flag to automatically generate // serial numbers at reading PDB files static Boolean FReadCoords; // flag to read coordinates; if set to // False, only the header of PDB file // is read static Boolean FSimRWBROOK; // flag to simulate old RWBROOK printout // as closely as possible static char LastFunc[80]; // name of the last called function static int LastUnit; // number of the last unit called static int LastRC; // last return code static int LastSer; // last serial number kept for // certain warnings // ======================== RWBrook API =========================== FORTRAN_SUBR ( MMDB_F_INIT, mmdb_f_init,(),(),() ) { InitMatType(); nChannels = 0; Channel = NULL; strcpy ( LastFunc,"MMDB_F_Init" ); LastUnit = -1; LastRC = 0; LastSer = 0; FAutoSer = False; FReadCoords = True; FSimRWBROOK = False; } FORTRAN_SUBR ( MMDB_F_QUIT, mmdb_f_quit,(),(),() ) { int i; for (i=0;inUnit==iUnit) return i; } return -1; } int MakeChannel ( int iUnit ) { // If iUnit-th unit already exists, it is // reinitialized. Otherwise the function looks // for a not used channel, and if there is one, // associates the new iUnit-th unit with it. // If there is no unused channels, the new one // is created and the new iUnit-th unit is // associated with it. // Returns serial number of the channel // associated with the newly reinitialized // or created unit. int i,m; PCChannel * Channel1; m = GetChannel ( iUnit ); if (m>=0) { // such channel already exists Channel[m]->Dispose(); // clear it first Channel[m]->Init(); // reinitialize it Channel[m]->nUnit = iUnit; return m; } for (i=0;inUnit = iUnit; return m; } FORTRAN_SUBR ( MMDB_F_OPEN, mmdb_f_open, ( // lengths-at-end list fpstr FName, // file name fpstr RWStat, // "INPUT" or "OUTPUT" fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int FName_len, // fortran-hidden length of FName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list fpstr FName, fpstr RWStat, fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list fpstr FName, int FName_len, fpstr RWStat, int RWStat_len, fpstr FType, int FType_len, int * iUnit, int * iRet ) ) { UNUSED_ARGUMENT(RWStat_len); UNUSED_ARGUMENT(FType_len); int k; char L[500]; #ifdef WIN32 GetStrTerWin32File ( L,FTN_STR(FName),0,sizeof(L),FTN_LEN(FName) ); #else GetStrTer ( L,FTN_STR(FName),0,sizeof(L),FTN_LEN(FName) ); #endif strcpy ( LastFunc,"MMDB_F_Open" ); LastUnit = *iUnit; if (*iUnit==0) { // generate unit number *iUnit = 1; do { k = GetChannel ( *iUnit ); if (k>=0) *iUnit = *iUnit+1; } while (k>=0); } // create channel k = MakeChannel ( *iUnit ); if (k>=0) { if (FTN_STR(RWStat)[0]=='I') { Channel[k]->nRead = 0; Channel[k]->FAutoSer = FAutoSer; Channel[k]->FReadCoords = FReadCoords; Channel[k]->FSimRWBROOK = FSimRWBROOK; } else Channel[k]->nRead = 1; // store file name Channel[k]->SetFileName ( L,sizeof(L) ); // store unit type Channel[k]->SetFileType ( FTN_STR(FType) ); Channel[k]->IdentifyFile( L ); if (FSimRWBROOK) { switch (Channel[k]->nType) { default : printf ( " unknown-format" ); break; case 0 : printf ( " PDB" ); break; case 1 : printf ( " mmCIF" ); break; case 2 : printf ( " MMDB BINARY" ); } printf ( " file is being opened on unit %i",*iUnit ); if (FTN_STR(RWStat)[0]=='I') printf ( " for INPUT.\n\n" ); else printf ( " for OUTPUT.\n\n" ); } if (FTN_STR(RWStat)[0]=='I') { Channel[k]->Read(); *iRet = Channel[k]->ErrCode; } else { Channel[k]->MakeCoordStructure(); Channel[k]->fPos = 1; *iRet = RWBERR_Ok; } } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_OPENL, mmdb_f_openl, ( // lengths-at-end list fpstr LName, // logical name fpstr RWStat, // "INPUT" or "OUTPUT" fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int LName_len, // fortran-hidden length of LName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list fpstr LName, fpstr RWStat, fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list fpstr LName, int LName_len, fpstr RWStat, int RWStat_len, fpstr FType, int FType_len, int * iUnit, int * iRet ) ) { char L[200]; pstr S; char_struct(FName) strcpy ( LastFunc,"MMDB_F_Openl" ); GetStrTer ( L,FTN_STR(LName),0,sizeof(L),FTN_LEN(LName) ); S = getenv ( L ); if (S) { fill_char_struct(FName,S) } else if (FTN_STR(RWStat)[0]=='O') { // The user may not have assigned a logical // for output, so that the program should write file "XYZOUT". This // is allowed as a convenience when user is not really interested // in output file. fill_char_struct(FName,L) } else { *iRet = RWBERR_NoLogicalName; return; } printf ( "\n Logical name: %s File name: %s\n",L,FName ); FORTRAN_CALL ( MMDB_F_OPEN, mmdb_f_open, ( FName,RWStat,FType,iUnit,iRet, FName_len,RWStat_len,FType_len ), ( &FName,RWStat,FType,iUnit,iRet ), ( FName,FName_len,RWStat,RWStat_len, FType,FType_len,iUnit,iRet ) ); } FORTRAN_SUBR ( MMDB_F_COPY, mmdb_f_copy, ( // lengths-at-end list int * iUnit1, // destination unit int * iUnit2, // source unit int * copyKey, // copy key: // = 1 copy all // = 2 copy all except coordinates // = 3 copy title section only // = 4 copy crystallographic // section only // = 5 copy coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist ), ( // lengths-in-structure list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ), ( // lengths-follow list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ) ) { int k1,k2; word copyMask; strcpy ( LastFunc,"MMDB_F_Copy" ); LastUnit = *iUnit1; k1 = GetChannel ( LastUnit ); if (k1>=0) { if (Channel[k1]->MMDBManager) { LastUnit = *iUnit2; k2 = GetChannel ( LastUnit ); if (k2>=0) { if (Channel[k2]->MMDBManager) { switch (*copyKey) { case 1 : copyMask = MMDBFCM_All; break; case 2 : copyMask = MMDBFCM_Top; break; case 3 : copyMask = MMDBFCM_Title; break; case 4 : copyMask = MMDBFCM_Cryst; break; case 5 : copyMask = MMDBFCM_Coord; break; default : copyMask = 0x0000; } Channel[k1]->MMDBManager->Copy ( Channel[k2]->MMDBManager, copyMask ); *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoFile; } else *iRet = RWBERR_NoChannel; } else *iRet = RWBERR_NoFile; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_DELETE, mmdb_f_delete, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" int * delKey, // delete key: // = 1 delete all // = 2 delete all except coordinates // = 3 delete title section only // = 4 delete crystallographic // section only // = 5 delete coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist // =RWBERR_NoFile if a unit // was not opened ), ( // lengths-in-structure list int * iUnit, int * delKey, int * iRet ), ( // lengths-follow list int * iUnit, int * delKey, int * iRet ) ) { int k; word delMask; strcpy ( LastFunc,"MMDB_F_Delete" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k>=0) { if (Channel[k]->MMDBManager) { switch (*delKey) { case 1 : delMask = MMDBFCM_All; break; case 2 : delMask = MMDBFCM_Top; break; case 3 : delMask = MMDBFCM_Title; break; case 4 : delMask = MMDBFCM_Cryst; break; case 5 : delMask = MMDBFCM_Coord; break; default : delMask = 0x0000; } Channel[k]->MMDBManager->Delete ( delMask ); *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoFile; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETTYPE, mmdb_f_settype, ( // lengths-at-end list int * iUnit, // unit number fpstr FType, // "PDB", "CIF", "BIN" or " " fpstr RWStat, // "INPUT" or "OUTPUT" int * iRet, // returns -1 if unit not found, // otherwise 0 int FType_len, // fortran-hidden length of FType int RWStat_len // fortran-hidden length of RWStat ), ( // lengths-in-structure list int * iUnit, fpstr FType, fpstr RWStat, int * iRet ), ( // length-follow list int * iUnit, fpstr FType, int FType_len, fpstr RWStat, int RWStat_len, int * iRet ) ) { UNUSED_ARGUMENT(FType_len); UNUSED_ARGUMENT(RWStat_len); int k; strcpy ( LastFunc,"MMDB_F_SetType" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k>=0) { // store unit type Channel[k]->SetFileType ( FTN_STR(FType) ); // store unit mode if (FTN_STR(RWStat)[0]=='I') Channel[k]->nRead = 0; else Channel[k]->nRead = 1; *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETNAME, mmdb_f_setname, ( // lengths-at-end list int * iUnit, // unit number fpstr FName, // file name int * iRet, // returns -1 if unit not found, // otherwise 0 int FName_len // fortran-hidden length of FName ), ( // lengths-in-structure list int * iUnit, fpstr FName, int * iRet ), ( // lengths-follow list int * iUnit, fpstr FName, int FName_len, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_SetName" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { // store file name Channel[k]->SetFileName ( FTN_STR(FName),FTN_LEN(FName) ); *iRet = RWBERR_Ok; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WRITE, mmdb_f_write, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_Write" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { Channel[k]->Write(); *iRet = Channel[k]->ErrCode; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_CLOSE, mmdb_f_close, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_Close" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else if (Channel[k]->nRead==1) { Channel[k]->Write(); *iRet = Channel[k]->ErrCode; if (!(*iRet)) { delete Channel[k]; Channel[k] = NULL; } } else { delete Channel[k]; Channel[k] = NULL; *iRet = RWBERR_Ok; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_ADVANCE, mmdb_f_advance, ( // lengths-at-end list int * iUnit, // unit number int * iOut, // output echo file int * iTer, // FLAG =1, return iRet=1 if 'ter' card found // =0, do not return on 'ter' card int * iRet // =0 if normal return // =1 if return on 'ter' card (iTer=1) // =2 if return on end of file // =3 if return on 'hetatm' card // =RWBERR_NoChannel if unit does not exist // =RWBERR_NoAdvance if pointer was not // advanced ), ( // lengths-in-structure list int * iUnit, int * iOut, int * iTer, int * iRet ), ( // lengths-follow list int * iUnit, int * iOut, int * iTer, int * iRet ) ) { UNUSED_ARGUMENT(iOut); int k; PCAtom atom; strcpy ( LastFunc,"mmdb_f_advance" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) *iRet = RWBERR_NoChannel; else if (Channel[k]->nRead==0) { // in the input file, try to get pointer on the next atom do { Channel[k]->fPos++; // advance the pointer on Atom array if (Channel[k]->EndOfFile()) { atom = NULL; break; } atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); if (atom) { if ((atom->Ter) && (*iTer==0)) { // ignore 'ter' card if iTer is set to 0 atom = NULL; } } } while (!atom); if (!atom) *iRet = 2; // no atom found == end of file else if (atom->Ter) *iRet = 1; // 'ter' card encountered else if (atom->Het) *iRet = 3; // 'hetatm' card encountered else *iRet = 0; // advance ok; normal return } else { // in the output file, just advance the pointer if (Channel[k]->fPos==0) { Channel[k]->fPos++; *iRet = 0; } else { atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); if (atom) { // the previous atom was set -- advance the pointer Channel[k]->fPos++; *iRet = 0; } else // no atom was set; make no advancement *iRet = RWBERR_NoAdvance; } } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_REWD, mmdb_f_rewd, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_Rewd" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k>=0) { Channel[k]->fPos = 0; if (Channel[k]->nRead!=0) *iRet = RWBWAR_RewOutput; else *iRet = RWBERR_Ok; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_BKSP, mmdb_f_bksp, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_BkSp" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k>=0) { *iRet = RWBERR_Ok; if (Channel[k]->fPos==0) *iRet |= RWBWAR_FileTop; else Channel[k]->fPos--; if (Channel[k]->nRead!=0) *iRet |= RWBWAR_RewOutput; } else *iRet = RWBERR_NoChannel; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SEEK, mmdb_f_seek, ( // lengths-at-end list int * iUnit, // unit number int * fPos, // position to set int * iRet // return code: // 0 Ok // 1 'ter' card met // 2 end of file // 3 'hetatm' card met // <0 error: // RWBERR_NoChannel // iUnit was not // initialized // RWBERR_EmptyPointer // fPos-th position ), ( // lengths-in-structure list int * iUnit, int * fPos, int * iRet ), ( // lengths-follow list int * iUnit, int * fPos, int * iRet ) ) { int k; PCAtom atom; strcpy ( LastFunc,"MMDB_F_Seek" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { // set the pointer Channel[k]->fPos = IMax(0,*fPos); if (*fPos==0) *iRet = RWBWAR_FileTop; else *iRet = RWBERR_Ok; if (Channel[k]->nRead==0) { // in the input file, check the end-of-file state // and analyze the atom if (Channel[k]->EndOfFile()) *iRet = 2; atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); if (!atom) *iRet = RWBERR_EmptyPointer; // empty place else if (atom->Ter) *iRet = 1; // 'ter' card encountered else if (atom->Het) *iRet = 3; // 'hetatm' card encountered } // in the output file, there is nothing to do } LastRC = *iRet; } void Make_AN_ID_IZ ( PCAtom atom, pstr AtNam, int AtNam_L, pstr ID, int ID_L, int * IZ, int * iRet ) { char chrg[10]; int i,k; if (atom->Ter) { strcpy_ns ( AtNam,pstr(" "),AtNam_L ); strcpy_ns ( ID ,pstr(" "),ID_L ); *IZ = 7; } else { if (atom->name[0]==' ') strcpy_ns ( AtNam,&(atom->name[1]),4 ); else strcpy_ns ( AtNam,atom->name,4 ); // first try to identify the atom with the element name strcpy_ns ( ID,atom->element,ID_L ); // not more than ID_L symbols // from element until but not including // the terminated null are copied into // ID, and the latter is padded with // spaces up to the length of ID_L if (ID_L>3) { // if length permits, add ID with atom charge // (always 2 symbols). atom->GetAtomCharge(chrg); ID[2] = chrg[0]; ID[3] = chrg[1]; } k = 0; while ((kelement[0]!=ElementName[k][0]) || (atom->element[1]!=ElementName[k][1]))) k++; if (k>=nElementNames) { // no match for atom ID -- make sure to set it blank strcpy_ns ( ID,pstr(" "),ID_L ); // try to identify the atom using the atom name k = 0; while ((kname[0]!=ElementName[k][0]) || (atom->name[1]!=ElementName[k][1]))) k++; // try to identify a heteroatom i = 0; while ((i=nElementNames)) { if ((atom->name[0]==HydAtomName[i][0]) && (atom->name[1]==HydAtomName[i][1])) k = 0; i++; } if (k>=nElementNames) { // unknown or ambiguous formfactor k = -1; if ((atom->name[0]==' ') && (atom->name[1]=='A')) k = 6; if (k==-1) *iRet |= RWBWAR_UnkFormFactor; else *iRet |= RWBWAR_AmbFormFactor; } } *IZ = k+1; if (*IZ==0) strcpy_ns ( ID,pstr(" "),ID_L ); else { if (ID_L>3) { if (ID[0]==' ') { if ((AtNam[2]=='+') || (AtNam[2]=='-')) { ID[2] = AtNam[2]; ID[3] = AtNam[3]; } } else if ((ID[2]!='+') && (ID[2]!='-')) { ID[2] = ' '; ID[3] = ' '; } } strcpy_ns ( ID,ElementName[k],IMin(2,ID_L) ); } } } FORTRAN_SUBR ( MMDB_F_ATOM, mmdb_f_atom, ( // lengths-at-end list int * iUnit, // unit number int * iSer, // atom serial number fpstr AtNam, // atom name (left justified) fpstr ResNam, // residue name fpstr ChnNam, // chain name int * iResN, // residue number as an integer fpstr ResNo, // residue number as character (input only) fpstr InsCod, // the insertion code fpstr AltCod, // the alternate conformation code fpstr segID, // segment ID int * IZ, // atomic number (input only, returned as // 7 from ambiguous atoms) fpstr ID, // atomic ID related to atomic number // (element symbol right justified), plus // the ionic state +2, +3 etc.. // int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_Error1 internal error #1 // RWBERR_Error2 internal error #2 // RWBERR_Error3 internal error #3 // // >=0 : success, warning flags: // RWBWAR_WrongSerial if serial number // differs from the position // number in the file // RWBWAR_UnkFormFactor unknown formfactor // RWBWAR_AmbFormFactor ambiguous formfactor // int AtNam_len, // fortran-hidden length of AtNam int ResNam_len, // fortran-hidden length of ResNam int ChnNam_len, // fortran-hidden length of ChnNam int ResNo_len, // fortran-hidden length of ResNo int InsCod_len, // fortran-hidden length of InsCod int AltCod_len, // fortran-hidden length of AltCod int segID_len, // fortran-hidden length of SegID int ID_len // fortran-hidden length of ID ), ( // lengths-in-structure list int * iUnit, int * iSer, fpstr AtNam, fpstr ResNam, fpstr ChnNam, int * iResN, fpstr ResNo, fpstr InsCod, fpstr AltCod, fpstr segID, int * IZ, fpstr ID, int * iRet ), ( // lengths-follow list int * iUnit, int * iSer, fpstr AtNam, int AtNam_len, fpstr ResNam, int ResNam_len, fpstr ChnNam, int ChnNam_len, int * iResN, fpstr ResNo, int ResNo_len, fpstr InsCod, int InsCod_len, fpstr AltCod, int AltCod_len, fpstr segID, int segID_len, int * IZ, fpstr ID, int ID_len, int * iRet ) ) { int k,RC; ChainID chainID; ResName resName; InsCode insCode; AtomName atomName; AltLoc altLoc; SegID sgID; Element element; PCAtom atom; char charge[10]; strcpy ( LastFunc,"MMDB_F_Atom" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = RWBERR_Ok; if (Channel[k]->nRead==0) { // reading the atom characteristics atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); if (!atom) { // atom position was not advanced properly *iRet = RWBERR_EmptyPointer; LastRC = *iRet; return; } *iSer = atom->serNum; if (*iSer!=Channel[k]->fPos) *iRet |= RWBWAR_WrongSerial; LastSer = *iSer; Make_AN_ID_IZ ( atom,FTN_STR(AtNam),FTN_LEN(AtNam), FTN_STR(ID),FTN_LEN(ID),IZ,iRet ); if (atom->residue) { strcpy_ns ( FTN_STR(ResNam),atom->residue->name,FTN_LEN(ResNam) ); *iResN = atom->residue->seqNum; PutInteger ( FTN_STR(ResNo),*iResN,IMin(4,FTN_LEN(ResNo)) ); strcpy_ns ( FTN_STR(InsCod),atom->residue->insCode,FTN_LEN(InsCod) ); strcpy_ns ( &(FTN_STR(ResNo)[4]),FTN_STR(InsCod),FTN_LEN(ResNo)-4 ); strcpy_ns ( FTN_STR(ChnNam),atom->GetChainID(),FTN_LEN(ChnNam) ); } else { strcpy_ns ( FTN_STR(ResNam),pstr(" "),FTN_LEN(ResNam) ); strcpy_ns ( FTN_STR(ChnNam),pstr(" ") ,FTN_LEN(ChnNam) ); *iResN = 0; strcpy_ns ( FTN_STR(ResNo) ,pstr("0") ,FTN_LEN(ResNo) ); strcpy_ns ( FTN_STR(InsCod),pstr(" ") ,FTN_LEN(InsCod) ); } strcpy_ns ( FTN_STR(AltCod),atom->altLoc,FTN_LEN(AltCod) ); strcpy_ns ( FTN_STR(segID) ,atom->segID ,FTN_LEN(segID) ); } else { // storing the atom characteristics if (!Channel[k]->MMDBManager) { *iRet = RWBERR_Error1; // should never happen LastRC = *iRet; return; } GetStrTer ( chainID,FTN_STR(ChnNam),1,sizeof(chainID),FTN_LEN(ChnNam) ); GetStrTer ( resName,FTN_STR(ResNam),3,sizeof(resName),FTN_LEN(ResNam) ); GetStrTer ( insCode,FTN_STR(InsCod),1,sizeof(insCode),FTN_LEN(InsCod) ); GetStrTer ( altLoc ,FTN_STR(AltCod),1,sizeof(altLoc) ,FTN_LEN(AltCod) ); GetStrTer ( sgID ,FTN_STR(segID) ,4,sizeof(sgID) ,FTN_LEN(segID) ); element[0] = FTN_STR(ID)[0]; element[1] = FTN_STR(ID)[1]; element[2] = char(0); if (FTN_LEN(ID)>3) { charge [0] = FTN_STR(ID)[2]; charge [1] = FTN_STR(ID)[3]; charge [2] = char(0); } else charge [0] = char(0); if (FTN_STR(ID)[0]==' ') { atomName[0] = char(0); // if ((FTN_STR(AtNam)[1]=='H') || // ((FTN_STR(AtNam)[1]=='D') && (FTN_STR(ID)[2]=='D'))) { // int i = 0; // while ((iMMDBManager->PutAtom ( Channel[k]->fPos,*iSer, atomName,resName,chainID,*iResN, insCode,altLoc,sgID,element ); if (RC) { *iRet = RWBERR_Error2; // should never happen LastRC = *iRet; return; } DelSpaces ( charge ); if (charge[0]) { atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); if (!atom) { *iRet = RWBERR_EmptyPointer; // should never be so LastRC = *iRet; return; } atom->SetCharge ( charge ); } if (*iSer!=Channel[k]->fPos) { *iRet |= RWBWAR_WrongSerial; // this is not the right thing at all atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); if (!atom) { *iRet = RWBERR_EmptyPointer; // should never be so LastRC = *iRet; return; } // atom->serNum = *iSer; // - we allow for a mess in serials } LastSer = *iSer; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETTER, mmdb_f_setter, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; PCAtom atom; strcpy ( LastFunc,"MMDB_F_SetTer" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced properly LastRC = *iRet; return; } atom->Ter = True; atom->WhatIsSet |= ASET_Coordinates; } FORTRAN_SUBR ( MMDB_F_SETHET, mmdb_f_sethet, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ) { int k; PCAtom atom; strcpy ( LastFunc,"MMDB_F_SetHet" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced properly LastRC = *iRet; return; } atom->Het = True; atom->WhatIsSet |= ASET_Coordinates; } FORTRAN_SUBR ( MMDB_F_GETHET, mmdb_f_gethet, ( int * iUnit, int * isHet, int * iRet ), ( int * iUnit, int * isHet, int * iRet ), ( int * iUnit, int * isHet, int * iRet ) ) { int k; PCAtom atom; strcpy ( LastFunc,"MMDB_F_GetHet" ); LastUnit = *iUnit; *isHet = 0; // no HETATM record k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advance properly LastRC = *iRet; return; } if (atom->Het) *isHet = 1; // HETATM } FORTRAN_SUBR ( MMDB_F_COPYATOM, mmdb_f_copyatom, ( int * iUnit1, int * iUnit2, int * iRet ), ( int * iUnit1, int * iUnit2, int * iRet ), ( int * iUnit1, int * iUnit2, int * iRet ) ) { int k1,k2,RC; PCAtom atom; strcpy ( LastFunc,"mmdb_f_copyatom" ); LastUnit = *iUnit1; k1 = GetChannel ( *iUnit1 ); if (k1<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } k2 = GetChannel ( *iUnit2 ); if (k2<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = Channel[k1]->GetAtomI ( Channel[k1]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced // properly LastRC = *iRet; return; } RC = Channel[k2]->MMDBManager->PutAtom ( Channel[k2]->fPos,atom, atom->serNum ); if (RC) { *iRet = RWBERR_Error2; // should never happen LastRC = *iRet; return; } LastSer = atom->serNum; } FORTRAN_SUBR ( MMDB_F_COORD, mmdb_f_coord, ( // lengths-at-end list int * iUnit, // unit number fpstr XFlag, // "F" or "O" flag for the fractional // or orthogonal coordinates x,y,z // for output files XFlag may also be // set to "HF" or "HO", where "F" and // "O" have the same meaning as before // and "H" indicates that the atom // should be marked as heteroatom fpstr BFlag , // "F" or "O" flag for temperature // factor in fractional or orthogonal // Us apireal * x, // x-coordinate apireal * y, // y-coordinate apireal * z, // z-coordinate apireal * occ, // occupancy apireal * BIso, // isotropic temperature factor apireal * U, // array(6) of the anisotr. t-factor int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_NoMatrices if transformation // matrices are // undefined // RWBERR_NoCoordinates if coordinates were // not set in the atom // // >=0 : success, warning flags: // RWBERR_NoOccupancy if occupancy was // not set in the atom // RWBERR_NoTempFactor if temp. factor was // not set in the atom // int XFlag_len, // fortran-hidden length of XFlag int BFlag_len // fortran-hidden length of BFlag ), ( // lengths-in-structure list int * iUnit, fpstr XFlag, fpstr BFlag, apireal * x, apireal * y, apireal * z, apireal * occ, apireal * BIso, apireal * U, int * iRet ), ( // lengths-follow list int * iUnit, fpstr XFlag, int XFlag_len, fpstr BFlag, int BFlag_len, apireal * x, apireal * y, apireal * z, apireal * occ, apireal * BIso, apireal * U, int * iRet ) ) { UNUSED_ARGUMENT(XFlag_len); UNUSED_ARGUMENT(BFlag_len); realtype AU[6]; realtype xx,yy,zz; int k,i,m; PCAtom atom; strcpy ( LastFunc,"MMDB_F_Coord" ); LastUnit = *iUnit; k = GetChannel ( *iUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } atom = Channel[k]->GetAtomI ( Channel[k]->fPos ); *iRet = RWBERR_Ok; if (!atom) { *iRet = RWBERR_EmptyPointer; // atom position was not advanced properly LastRC = *iRet; return; } if ((FTN_STR(XFlag)[0]=='H') || (FTN_STR(XFlag)[0]=='h')) m = 1; else m = 0; if (Channel[k]->nRead==0) { // reading the atomic coordinates if (atom->Ter) { *x = 0.0; *y = 0.0; *z = 0.0; *occ = 1.0; *BIso = 1.0; U[0] = 1.0; U[1] = 0.0; U[2] = 0.0; U[3] = 0.0; U[4] = 0.0; U[5] = 0.0; } else { if (atom->WhatIsSet & ASET_Coordinates) { if ((FTN_STR(XFlag)[m]=='F') || (FTN_STR(XFlag)[m]=='f')) { // receive fractional coordinates if (Channel[k]->areCrystMatrices()) { Channel[k]->Orth2Frac ( atom->x,atom->y,atom->z,xx,yy,zz ); *x = (apireal)xx; *y = (apireal)yy; *z = (apireal)zz; } else { *x = (apireal)atom->x; *y = (apireal)atom->y; *z = (apireal)atom->z; *iRet = RWBERR_NoMatrices; } } else { // receive orthogonal coordinates *x = (apireal)atom->x; *y = (apireal)atom->y; *z = (apireal)atom->z; } } else { *x = 0.0; *y = 0.0; *z = 0.0; *iRet = RWBERR_NoCoordinates; } // calculate isotropic Uf from Uo, and convert it // if necessary if (atom->WhatIsSet & ASET_Anis_tFac) { AU[0] = atom->u11; // this intermediate array is AU[1] = atom->u22; // required because of possible AU[2] = atom->u33; // type difference between AU[3] = atom->u12; // 'apireal' and 'realtype' AU[4] = atom->u13; AU[5] = atom->u23; *BIso = (apireal)(8.0*Pi*Pi*(AU[0]+AU[1]+AU[2])/3.0); if ((FTN_STR(BFlag)[0]=='F') || (FTN_STR(BFlag)[0]=='f')) { if (Channel[k]->areCrystMatrices()) Channel[k]->Orth2Cryst ( AU ); else if (*iRet==RWBERR_Ok) *iRet = RWBERR_NoMatrices; } for (i=0;i<6;i++) U[i] = (apireal)AU[i]; } else { for (i=0;i<6;i++) U[i] = 0.0; if (atom->WhatIsSet & ASET_tempFactor) U[0] = (apireal)atom->tempFactor; else if (*iRet>=RWBERR_Ok) *iRet |= RWBWAR_NoTempFactor; *BIso = U[0]; } // get occupancy now if (atom->WhatIsSet & ASET_Occupancy) *occ = (apireal)atom->occupancy; else { *occ = 0.0; if (*iRet>=RWBERR_Ok) *iRet |= RWBWAR_NoOccupancy; } } } else { // storing the atomic coordinates if (atom->Ter) { atom->x = 0.0; atom->y = 0.0; atom->z = 0.0; atom->WhatIsSet |= ASET_Coordinates; atom->occupancy = 1.0; atom->tempFactor = 1.0; atom->u11 = 0.0; atom->u22 = 0.0; atom->u33 = 0.0; atom->u12 = 0.0; atom->u13 = 0.0; atom->u23 = 0.0; } else { if ((FTN_STR(XFlag)[m]=='F') || (FTN_STR(XFlag)[m]=='f')) { // convert fractional coordinates if (Channel[k]->areCrystMatrices()) { xx = *x; yy = *y; zz = *z; Channel[k]->Frac2Orth ( xx,yy,zz,atom->x,atom->y,atom->z ); atom->WhatIsSet |= ASET_Coordinates; } else { atom->x = *x; atom->y = *y; atom->z = *z; *iRet = RWBERR_NoMatrices; atom->WhatIsSet &= ~ASET_Coordinates; } } else { // store orthogonal coordinates atom->x = *x; atom->y = *y; atom->z = *z; atom->WhatIsSet |= ASET_Coordinates; } atom->Het = (m>0); // calculate isotropic Uf from Uo, and convert it // if necessary if ((U[1]!=0.0) || (U[2]!=0.0)) { for (i=0;i<6;i++) AU[i] = U[i]; if ((FTN_STR(BFlag)[0]=='F') || (FTN_STR(BFlag)[0]=='f')) { if (Channel[k]->areCrystMatrices()) Channel[k]->Cryst2Orth ( AU ); else *iRet = RWBERR_NoMatrices; } *BIso = (apireal)(8.0*Pi*Pi*(AU[0]+AU[1]+AU[2])/3.0); atom->tempFactor = *BIso; atom->u11 = AU[0]; atom->u22 = AU[1]; atom->u33 = AU[2]; atom->u12 = AU[3]; atom->u13 = AU[4]; atom->u23 = AU[5]; atom->WhatIsSet |= ASET_tempFactor | ASET_Anis_tFac; } else { *BIso = U[0]; atom->tempFactor = *BIso; atom->u11 = 0.0; atom->u22 = 0.0; atom->u33 = 0.0; atom->u12 = 0.0; atom->u13 = 0.0; atom->u23 = 0.0; atom->WhatIsSet |= ASET_tempFactor; } // store occupancy now atom->occupancy = *occ; atom->WhatIsSet |= ASET_Occupancy; } } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_SETCELL, mmdb_f_setcell, ( // lengths-at-end list int * iUnit, // unit number apireal * a, // cell parameter a, angstroms apireal * b, // cell parameter b, angstroms apireal * c, // cell parameter c, angstroms apireal * alpha, // cell parameter alpha, degrees apireal * beta, // cell parameter beta, degrees apireal * gamma, // cell parameter gamma, degrees int * ArgNCode, // orthogonalization code, 1-6 int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Disagreement if a // disagreement in // cell parameters // was found // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * a, apireal * b, apireal * c, apireal * alpha, apireal * beta, apireal * gamma, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * a, apireal * b, apireal * c, apireal * alpha, apireal * beta, apireal * gamma, int * ArgNCode, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_SetCell" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else *iRet = Channel[k]->SetCell ( *a,*b,*c,*alpha,*beta,*gamma, *ArgNCode ); LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WBSPGRP, mmdb_f_wbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, fpstr spGroup, int spGroup_len, int * iRet ) ) { int k; SymGroup spaceGroup; strcpy ( LastFunc,"MMDB_F_WBSpGrp" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else { // GetStrTer ( spaceGroup,FTN_STR(spGroup),0, // sizeof(spaceGroup),FTN_LEN(spGroup) ); strcpy_ncss(spaceGroup,FTN_STR(spGroup),IMin(FTN_LEN(spGroup), sizeof(spaceGroup)-1) ); *iRet = Channel[k]->SetSpGroup ( spaceGroup ); } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBSPGRP, mmdb_f_rbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, fpstr spGroup, int spGroup_len, int * iRet ) ) { int k; char SpaceGroup[100]; strcpy ( LastFunc,"MMDB_F_RBSpGrp" ); if (*iUnit>0) LastUnit = *iUnit; SpaceGroup[0] = char(0); k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else *iRet = Channel[k]->GetSpGroup ( SpaceGroup ); // all extra "superficial spaces" are killed in the following CutSpaces ( SpaceGroup,SCUTKEY_BEGEND ); strcpy_ns ( FTN_STR(spGroup),SpaceGroup,FTN_LEN(spGroup) ); LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WBCELL , mmdb_f_wbcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * ArgCell, // array to accept the cell parameters // if ArgCell(1) is set to 0, then // the cell does not change int * ArgNCode, // orthogonalisation code // if ArgNCode is set to 0, then // the orthogonalisation matrices // do not change int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed ), ( // lengths-in-structure list int * iUnit, apireal * ArgCell, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * ArgCell, int * ArgNCode, int * iRet ) ) { int k; strcpy ( LastFunc,"MMDB_F_WBCell" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) *iRet = RWBERR_NoChannel; else *iRet = Channel[k]->PutCell ( ArgCell[0],ArgCell[1],ArgCell[2], ArgCell[3],ArgCell[4],ArgCell[5], *ArgNCode ); LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBCELL, mmdb_f_rbcell, ( // lengths-at-end list int * iUnit, // unit number apireal * celld, // array to accept the cell parameters apireal * cvol, // returns the cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * celld, apireal * cvol, int * iRet ), ( // lengths-follow list int * iUnit, apireal * celld, apireal * cvol, int * iRet ) ) { realtype p[6]; realtype v; int k,i,nc; strcpy ( LastFunc,"MMDB_F_RBCell" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = Channel[k]->GetCell ( p[0],p[1],p[2],p[3],p[4],p[5],v,nc ); if (*iRet==RWBERR_Ok) { for (i=0;i<6;i++) celld[i] = (apireal)p[i]; *cvol = (apireal)v; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBCELLN, mmdb_f_rbcelln, ( // lengths-at-end list int * iUnit, // unit number apireal * celld, // array to accept the cell parameters apireal * cvol, // returns the cell volume int * ArgNCode, // returns the orthogonalization code, 1-6 int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * celld, apireal * cvol, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * celld, apireal * cvol, int * ArgNCode, int * iRet ) ) { realtype p[6]; realtype v; int k,i,nc; strcpy ( LastFunc,"MMDB_F_RBCellN" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = Channel[k]->GetCell ( p[0],p[1],p[2],p[3],p[4],p[5],v,nc ); if (*iRet==RWBERR_Ok) { for (i=0;i<6;i++) celld[i] = (apireal)p[i]; *cvol = (apireal)v; *ArgNCode = nc; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBRCEL, mmdb_f_rbrcel, ( // lengths-at-end list int * iUnit, // unit number apireal * rcell, // array to accept the reciprocal // cell parameters apireal * rvol, // returns the reciprocal cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * rcell, apireal * rvol, int * iRet ), ( // lengths-follow list int * iUnit, apireal * rcell, apireal * rvol, int * iRet ) ) { realtype p[6]; realtype v; int k,i; strcpy ( LastFunc,"MMDB_F_RBRCel" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } *iRet = Channel[k]->GetRCell ( p[0],p[1],p[2],p[3],p[4],p[5],v ); if (*iRet==RWBERR_Ok) { for (i=0;i<6;i++) rcell[i] = (apireal)p[i]; *rvol = (apireal)v; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_RBORF, mmdb_f_rborf, ( // lengths-at-end list int * iUnit, // unit number apireal * RO, // array for orthogonalising matrix apireal * RF, // array for fractionalising matrix int * LCode, // buffer for orthogonalisation code int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, apireal * RO, apireal * RF, int * LCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * RO, apireal * RF, int * LCode, int * iRet ) ) { int i,j,k,l; PCMMDBCryst Cryst; strcpy ( LastFunc,"MMDB_F_RBORF" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } Cryst = Channel[k]->GetCryst(); if (Cryst==NULL) { *iRet = RWBERR_NoFile; LastRC = *iRet; return; } *iRet = RWBERR_Ok; l = 0; if (RO[0]<=0.0000000001) { for (j=0;j<4;j++) for (i=0;i<4;i++) { RF[l] = (apireal)Cryst->RF[i][j]; RO[l] = (apireal)Cryst->RO[i][j]; l++; } *LCode = Cryst->NCode; if (!(Cryst->WhatIsSet & CSET_Transforms)) *iRet = RWBERR_NoMatrices; } else { for (j=0;j<4;j++) for (i=0;i<4;i++) { Cryst->RF[i][j] = RF[l]; Cryst->RO[i][j] = RO[l]; l++; } Cryst->NCode = *LCode; Cryst->WhatIsSet |= CSET_Transforms; } LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_ORTHMAT, mmdb_f_orthmat, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * Cell, // array of cell parameters: // Cell(1) - a Cell(4) - alpha // Cell(2) - b Cell(5) - beta // Cell(3) - c Cell(6) - gamma apireal * Vol, // returns cell volume apireal * RRR, // array (3,3,6), returns // orthogonalisation matrices int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, apireal * Cell, apireal * Vol, apireal * RRR, int * iRet ), ( // lengths-follow list int * iUnit, apireal * Cell, apireal * Vol, apireal * RRR, int * iRet ) ) { int i,j,k,l,m; PCMMDBCryst Cryst; realtype CelDel; strcpy ( LastFunc,"MMDB_F_OrthMat" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } Cryst = Channel[k]->GetCryst(); if (Cryst==NULL) { *iRet = RWBERR_NoFile; LastRC = *iRet; return; } CelDel = 0.0; if (Cell[0]>0.0) { if ((Cryst->WhatIsSet & CSET_CellParams)==CSET_CellParams) { CelDel = fabs((Cell[0]-Cryst->a)/Cell[0]); if (Cell[1]!=0.0) CelDel = RMax(CelDel,fabs((Cell[1]-Cryst->b)/Cell[1])); if (Cell[2]!=0.0) CelDel = RMax(CelDel,fabs((Cell[2]-Cryst->c)/Cell[2])); if (Cell[3]!=0.0) CelDel = RMax(CelDel,fabs((Cell[3]-Cryst->alpha)/Cell[3])); if (Cell[4]!=0.0) CelDel = RMax(CelDel,fabs((Cell[4]-Cryst->beta )/Cell[4])); if (Cell[5]!=0.0) CelDel = RMax(CelDel,fabs((Cell[5]-Cryst->gamma)/Cell[5])); if (FSimRWBROOK && (CelDel>0.01)) printf ( "\n Inconsistency in Cell Dimensions" " - replacing old:\n" " Old cell: " "%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f\n" " New cell: " "%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f\n", Cryst->a,Cryst->b,Cryst->c, Cryst->alpha,Cryst->beta,Cryst->gamma, Cell[0],Cell[1],Cell[2],Cell[3],Cell[4],Cell[5] ); } Cryst->a = Cell[0]; Cryst->b = Cell[1]; Cryst->c = Cell[2]; Cryst->alpha = Cell[3]; Cryst->beta = Cell[4]; Cryst->gamma = Cell[5]; Cryst->WhatIsSet |= CSET_CellParams; } else { Cell[0] = (apireal)Cryst->a; Cell[1] = (apireal)Cryst->b; Cell[2] = (apireal)Cryst->c; Cell[3] = (apireal)Cryst->alpha; Cell[4] = (apireal)Cryst->beta; Cell[5] = (apireal)Cryst->gamma; } if ((Cryst->WhatIsSet & CSET_CellParams)!=CSET_CellParams) { *iRet = RWBERR_NoCellParams; LastRC = *iRet; return; } *iRet = RWBERR_Ok; // Cryst->CalcOrthMatrices(); <-- old version, changed 09.01.2004 Cryst->CalcCoordTransforms(); Cryst->WhatIsSet |= CSET_Transforms; if (CelDel>0.01) *Vol = -(apireal)Cryst->Vol; else *Vol = (apireal)Cryst->Vol; l = 0; for (j=0;j<3;j++) for (i=0;i<3;i++) for (m=0;m<6;m++) RRR[l++] = (apireal)Cryst->RR[m][j][i]; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_CVANISOU, mmdb_f_cvanisou, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * U, // array of coordinates to convert int * iFlag, // =0: convert from fract. to orthog. // =1: convert from orthog. to fract. int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, apireal * U, int * iFlag, int * iRet ), ( // lengths-follow list int * iUnit, apireal * U, int * iFlag, int * iRet ) ) { int k,i; PCMMDBCryst Cryst; realtype U1[6]; strcpy ( LastFunc,"MMDB_F_CVAnisou" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } Cryst = Channel[k]->GetCryst(); if (Cryst==NULL) { *iRet = RWBERR_NoFile; LastRC = *iRet; return; } *iRet = RWBERR_Ok; for (i=0;i<6;i++) U1[i] = U[i]; if (iFlag==0) { if (!Cryst->Cryst2Orth(U1)) *iRet = RWBERR_NoMatrices; } else { if (!Cryst->Orth2Cryst(U1)) *iRet = RWBERR_NoMatrices; } if (*iRet==RWBERR_Ok) for (i=0;i<6;i++) U[i] = (apireal)U1[i]; LastRC = *iRet; } FORTRAN_SUBR ( MMDB_F_WREMARK, mmdb_f_wremark, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" fpstr Line, // line to be added int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // other return codea are those // returned by xyzopen1_(..) int Line_len // fortran-hidden length of Line ), ( // lengths-in-structure list int * iUnit, fpstr Line, int * iRet ), ( // lengths-follow list int * iUnit, fpstr Line, int Line_len, int *iRet ) ) { int k; char S[500]; strcpy ( LastFunc,"MMDB_F_WRemark" ); if (*iUnit>0) LastUnit = *iUnit; k = GetChannel ( LastUnit ); if (k<0) { *iRet = RWBERR_NoChannel; LastRC = *iRet; return; } if (Channel[k]->MMDBManager) { GetStrTer ( S,FTN_STR(Line),FTN_LEN(Line),sizeof(S),FTN_LEN(Line) ); *iRet = Channel[k]->MMDBManager->PutPDBString ( S ); } else *iRet = RWBERR_NoFile; LastRC = *iRet; } /* FORTRAN_SUBR ( RBRINV, rbrinv, ( apireal * A, apireal * AI ), ( apireal * A, apireal * AI ), ( apireal * A, apireal * AI ) ) { mat44 A1,AI1; int i,j,k; k = 0; for (j=0;j<4;j++) for (i=0;i<4;i++) A1[j][i] = A[k++]; Mat4Inverse ( A1,AI1 ); k = 0; for (j=0;j<4;j++) for (i=0;i<4;i++) AI[k++] = AI1[j][i]; } */ /* FORTRAN_SUBR ( RES3TO1, res3to1, ( // lengths-at-end list fpstr ResNm3, // 3-char name, 4th char // will be set blank fpstr ResNm1, // 1-char name int ResNm3_len, // fortran-hidden length of ResNm3 int ResNm1_len // fortran-hidden length of ResNm3 ), ( // lengths-in-structure list fpstr ResNm3, fpstr ResNm1 ), ( // lengths-follow list fpstr ResNm3, int ResNm3_len, fpstr ResNm1, int ResNm1_len ) ) { int i; if (FTN_STR(ResNm3)[0]==' ') { for (i=0;i=0) printf ( " *** file : %s\n",Channel[k]->FName ); for (i=0;i0) printf ( " *** position %i, serial number %i\n", Channel[k]->fPos,LastSer ); else printf ( " *** position unavailable, serial number %i\n", LastSer ); } } if (!Msg) printf ( " *** warning: unknown warning code" ); return; } else Msg = MSG_Unknown; } if ((k>=0) && ( ((*iRet<=RWBERR_WrongInteger) && (*iRet>=RWBERR_DuplicatedModel)) || ((*iRet<=RWBERR_ATOM_Unrecognd) && (*iRet>=RWBERR_ATOM_Unmatch)) || ((*iRet<=RWBERR_NoData) && (*iRet>=RWBERR_DuplicateSeqNum)) )) Channel[k]->GetInputBuffer ( ErrLine,lcount ); printf ( " \n *** RWBROOK error: point code unit function\n" ); printf ( " *** %5i %4i %4i %s\n",*iPlace,*iRet, *iUnit,LastFunc ); k = GetChannel(*iUnit); if (k>=0) printf ( " *** file : %s\n",Channel[k]->FName ); printf ( " *** reason : %s\n",Msg ); if (lcount>=0) printf ( " *** at input line #%i:\n" " %s\n",lcount,ErrLine ); else if (lcount==-1) printf ( " *** at taking the following data from CIF:\n" " %s\n",ErrLine ); if (*iStop==0) { // will stop it printf ( " *** Execution stopped.\n \n" ); FORTRAN_CALL ( MMDB_F_QUIT, mmdb_f_quit,(),(),() ); // xyzquit_(); exit(0); } else // just warn, but no guarantee that it will not crash printf ( " *** continue running, may crash ...\n \n" ); } FORTRAN_SUBR ( RBCHECKERR, rbcheckerr, ( // lengths-at-end list int * iPlace, // (unique) identificator inside an application int * iStop // if 0 then stop if error ), ( // lengths-in-structure list int * iPlace, int * iStop ), ( // lengths-follow list int * iPlace, int * iStop ) ) { FORTRAN_CALL ( RBERRSTOP, rberrstop, ( iPlace,&LastRC,&LastUnit,iStop ), ( iPlace,&LastRC,&LastUnit,iStop ), ( iPlace,&LastRC,&LastUnit,iStop ) ); } mmdb-1.23.2.1/src/mmdb_sbase.h0000644000175100017510000001310111475666364012652 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 21.02.06 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_sbase // ~~~~~~~~~ // **** Classes : CSBase ( structure base manager ) // ~~~~~~~~~ CSBAtom ( SB atom class ) // CSBBond ( SB bond class ) // CSBStructure ( SB structure (monomer) class ) // CSBIndex ( SB index class ) // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_SBase__ #define __MMDB_SBase__ #ifndef __MMDB_Manager__ #include "mmdb_manager.h" #endif #ifndef __MMDB_SBase0__ #include "mmdb_sbase0.h" #endif // =========================== CSBase ============================ DefineStructure(SAtomPair) struct SAtomPair { PCAtom a1,a2; }; DefineClass(CSBase) class CSBase : public CSBase0 { public : CSBase (); ~CSBase(); // CalcHBonds(..) calculates hydrogen bonds and salt bridges // between atoms of residues given in Res1[0..nres1-1] and // Res2[0..nres2-1]. H-bonds are returned in HBond[0..nHBonds-1] // and salt bridges are returned in SBridge[0..nSBridges-1]. // // On input: // Res1, Res2 must belong to the same MMDB // HBond, SBridge should be set NULL, otherwise the // function attempts to deallocate them // nHBonds, nSBridges ignored // structFile may be a pointer to open SBase stucture // file in order to save on file open // operation. If structFile is set NULL, // the function will open the SBase // structure file by itself // altLoc specifies the alternative location for // donors and acceptors. // altLoc==NULL the highest occupancy // atoms are taken. If all // occupancies are equal // equal then atom with // first altLoc taken // altLoc!=NULL atoms with given altLoc // are taken. If such // altLoc is not found, // the function acts as // if NULL value for altLoc // were given. // ignoreNegSigOcc if it is set True, then the function // ignores atoms with negative occupancy // standard deviation. Such atoms may be // hydrogens added by // CSBase0::AddHydrogen(..) function, in // general any atoms added by // CSBAtom::MakeCAtom(..) function. Such // added hydrogens are note guaranteed to // be in correct place, therefore the // function may mistake on some hydrogen // bonds if they are not neglected. // // On output: // Allocated arrays HBond[0..nHBonds-1] and // SBridge[0..nSBridges-1]. If no bonds/bridges were found, // the corresponding array is not allocated and set NULL. // Application is responsible for deallocation of the arrays, // when not needed, using statements // if (HBond) delete[] HBond; // if (SBridge) delete[] SBridge; // HBond[i].a1, SBridge[i].a1 always refer atom from Res1[], // and HBond[i].a2, SBridge[i].a2 always refer atom from // Res2[]. // int CalcHBonds ( PPCResidue Res1, int nres1, PPCResidue Res2, int nres2, RPSAtomPair HBond, int & nHBonds, RPSAtomPair SBridge, int & nSBridges, PCFile structFile=NULL, pstr altLoc=NULL, Boolean ignoreNegSigOcc=False ); protected : // Geometry parameters for H-bond calculations realtype minDAdist,maxSBdist,maxDAdist,maxHAdist2; realtype maxDHAcos,maxHAAcos,maxDAAcos,maxDDAcos; void InitSBase (); void FreeMemory(); }; #endif mmdb-1.23.2.1/src/machine_.h0000644000175100017510000003173411475666363012334 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : machine_ // ~~~~~~~~~ // **** Functions : GetMachineID - returns ID code for the machine // ~~~~~~~~~~~ GetMachineName - returns name of a machine // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __Machine__ #define __Machine__ #ifndef __MatType__ #include "mattype_.h" #endif /* // Programs written in plain C, should define __PlainC each time // this header is invoked. #ifdef __PlainC # undef __CPlusPlus #else # define __CPlusPlus #endif */ // ================== List of known machines ======================== #define MACHINE_SGI 1 #define MACHINE_RS6000 2 #define MACHINE_ALLIANT 3 #define MACHINE_ARDENT 4 #define MACHINE_TITAN 5 #define MACHINE_STARDENT 6 #define MACHINE_CONVEX 7 #define MACHINE_ESV 8 #define MACHINE_HP9000 9 #define MACHINE_SOLBOURNE 10 #define MACHINE_SOLARIS 11 #define MACHINE_ALPHA 12 #define MACHINE_VMS 13 #define MACHINE_MVS 14 #define MACHINE_F2C_G77 15 #define MACHINE_LINUX 16 #define MACHINE_UNKNOWN 100 // ================ Identification of the machine =================== // IBM Unix RS/6000 #if defined(_AIX) || defined(___AIX) # define CALL_LIKE_HPUX 1 // Alliant #elif defined(alliant) # define CALL_LIKE_SUN 1 // Ardent, Stardent/Titan #elif defined(ardent) # define CALL_LIKE_STARDENT 1 #elif defined(titan) # define CALL_LIKE_STARDENT 2 #elif defined(stardent) # define CALL_LIKE_STARDENT 3 // Convex #elif defined(__convex__) || defined(__convexc__) # define CALL_LIKE_SUN 2 // Evans and Sutherland #elif defined(ESV) # define CALL_LIKE_SUN 3 // Hewlett Packard 9000/750 (RISC) models #elif defined(__hpux) # define CALL_LIKE_HPUX 2 // Silicon Graphics IRIX systems, Iris'es, Indigo's, Crimson's etc. #elif defined(__sgi) || defined(sgi) # define CALL_LIKE_SUN 4 // Solbourne's are Sun clones. #elif defined(solbourne) # define CALL_LIKE_SUN 5 // Solaris 1 and 2 #elif defined(sun) || defined(__sun) # define CALL_LIKE_SUN 6 // DEC, OSF/1, Alpha and Ultrix #elif defined(ultrix) || defined(__OSF1__) || defined(__osf__) # define CALL_LIKE_SUN 7 // VMS #elif defined(vms) || defined(__vms) || defined(__VMS) # define CALL_LIKE_VMS 1 // MVS stands for Microsoft Visual Studio #elif defined(_MVS) # define CALL_LIKE_MVS 1 #elif defined(F2C) || defined(G77) # define CALL_LIKE_SUN 8 #elif defined(linux) # define CALL_LIKE_SUN 9 #else //# error System type is not known -- see the Installation Guide # define CALL_LIKE_SUN 100 #endif // ================= Machine-dependent definitions ================== #ifdef CALL_LIKE_STARDENT // SStrParam is used in Ardent-like machines' fortran calls // for passing a string parameter DefineStructure(SStrPar) struct SStrPar { pstr S; int len; int id; }; #endif // // Macro FORTRAN_SUBR(NAME,name,p_send,p_sstruct,p_sflw) // makes function header statements that allow for linking with // programs written in FORTRAN. // // Parameters: // // NAME name of the FORTRAN subroutine in capital letters // name name of the FORTRAN subroutine in small letters // p_send parameter list (in brackets) with string lengths // attached to the end of it (see below) // p_sstruct parameter list (in brackets) with strings passed // as complex parameters, or structures // p_sflw parameter list (in brackets) with string lengths // following immediately the string parameters // (see below) // // All non-string parameters must be passed as pointers, in // the same order as they enter the FORTRAN call. Rules for // the string parameters are as follows. // // 1. All strings should be specified as of 'fpstr' type. // The 'fpstr' type is defined below and depends on the // platform: // // a) whenever length of string is passed as a separate // parameter ( CALL_LIKE_SUN, CALL_LIKE_HPUX, // CALL_LIKE_MVS ) 'fpstr' is identical to 'pstr'. // You may choose arbitrary name for the string, // but you MUST use the same name, appended with // suffix '_len', for its length (see example below). // // b) whenever string and its length are passed as // complex parameter, 'fpstr' is identical to the // pointer on the corresponding structure: // CALL_LIKE_STARDENT : // 'fpstr' is identical to 'PSStrPar' // CALL_LIKE_VMS : // 'fpstr' is identical to 'dsc$descriptor_s *' // // With 'fpstr' type, two important macro definition come: // // i) FTN_STR(s) - returns pointer to fortran-passed // string s. This pointer is always // of 'pstr' type // ii) FTN_LEN(s) - returns integer length of fortran- // passed string s. For this macro to // work properly with SUN- and MVS-like // machines, always use suffix '_len' // for the string length parameters as // described in a) above. // // 2. Three parameter lists, each enclosed in brackets, should // be given. These lists retain the general order of // parameters in the corresponding fortran call. Non-string // parameters are passed as pointers. String parameters // and their lengths are passed differently in different // lists: // // p_send strings enter their place in the list as in // the corresponding FORTRAN call, having 'fpstr' // parameter type. Their lengths are appended as // 'int' to the end of the list. They should // retain the order in which the strings appear // in the list. // // p_sstruct strings enter their place in the list as in // the corresponding FORTRAN call, having 'fpstr' // parameter type. // // p_sflw strings enter their place in the list as in // the corresponding FORTRAN call, having 'fpstr' // type and being immediately followed by their // lengths as 'int' parameters. // // // // Example: // // FORTRAN statement // // subroutine SomeSub ( k,s1,a,s2,m ) // integer k,m // real a // character*(*) s1,s2 // // is translated to // // FORTRAN_SUBR ( SOMESUB, somesub, // ( int * k, fpstr s1, float * a, fpstr s2, int * m, // int s1_len, int s2_len ), // ( int * k, fpstr s1, float * a, fpstr s2, int * m ), // ( int * k, fpstr s1, int s1_len, float * a, // fpstr s2, int s2_len, int * m ) ) // // // The macro should replace ordinary function header // statements to assure compatibility with FORTRAN links. // In header files, do not forget to add semicolumn: // // FORTRAN_SUBR ( .... ); // // while in source files use simply // // FORTRAN_SUBR ( .... ) { // // } // // // // Macro FORTRAN_CALL(NAME,name,p_send,p_sstruct,p_sflw) // calls function defined with macro FORTRAN_SUBR(...), from // a C/C++ application. Its parameters and their meaning are // exactly identical to those of FORTRAN_SUBR(...). // FORTRAN_CALL(...) should be followed by semicolon. // // **** type of real numbers in the API functions // comment or uncomment the proper string typedef float apireal; // FORTRAN real*4 /* typedef double apireal; // FORTRAN real*8 */ #if defined(CALL_LIKE_SUN) typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void name##_ p_sun # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ name##_ p_sun # elif defined(CALL_LIKE_HPUX) typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name p_sun # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void name p_sun # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name p_sun # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ name p_sun #elif defined(CALL_LIKE_STARDENT) typedef PStrPar fpstr; # define FTN_STR(s) s->S # define FTN_LEN(s) s->len # define char_struct(s) \ SStrPar s; # define fill_char_struct(s,str) \ s.S = str; \ s.len = strlen(FName); \ s.id = 0; # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_send,p_sstruct,p_sflw) \ extern "C" void NAME p_stardent # else # define FORTRAN_SUBR(NAME,name,p_send,p_sstruct,p_sflw) \ void NAME p_stardent # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_stardent # define FORTRAN_CALL(NAME,name,p_send,p_sstruct,p_sflw) \ NAME p_stardent #elif defined(CALL_LIKE_VMS) typedef dsc$descriptor_s * fpstr; # define FTN_STR(s) s->dsc$a_pointer; # define FTN_LEN(s) s->dsc$w_length; # define character(s) \ dsc$descriptor_s s; # define fill_char_struct(s,str) \ s.dsc$a_pointer = str; \ s.dsc$w_length = strlen(str); \ s.dsc$b_dtype = DSC$K_DTYPE_T; \ s.dsc$b_class = DSC$K_CLASS_S; # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_stardent # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void NAME p_stardent # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_stardent # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ NAME p_stardent #elif defined(CALL_LIKE_MVS) typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void __stdcall NAME p_mvs # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void __stdcall NAME p_mvs # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void NAME p_mvs # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ NAME p_mvs #else # error Unknown machine!!! typedef pstr fpstr; # define FTN_STR(s) s # define FTN_LEN(s) s##_len # define char_struct(s) \ pstr s; \ int s##_len; # define fill_char_struct(s,str) \ s = str; \ s##_len = strlen(str); # ifdef __cplusplus # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # else # define FORTRAN_SUBR(NAME,name,p_sun,p_stardent,p_mvs) \ void name##_ p_sun # endif # define FORTRAN_EXTERN(NAME,name,p_sun,p_stardent,p_mvs) \ extern "C" void name##_ p_sun # define FORTRAN_CALL(NAME,name,p_sun,p_stardent,p_mvs) \ name##_ p_sun #endif // ================ Machine-dependent functions ================= extern int GetMachineID (); extern cpstr GetMachineName (); extern cpstr GetMachineName ( int MachineID ); #endif mmdb-1.23.2.1/src/mmdb_cifdefs.cpp0000644000175100017510000001052611475665501013513 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.12.00 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Defs // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // CIF Definitions // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_CIFDefs__ #include "mmdb_cifdefs.h" #endif // ------------------------------------------------------------------ pstr CIFName ( int NameID, int Mode ) { // Gives CIF name according to CIF Mode. switch (Mode) { case CIF_NDB : switch (NameID) { case CAT_POLY_SEQ_SCHEME : return CIFCAT_NDB_POLY_SEQ_SCHEME; case TAG_ID_CODE : return CIFTAG_NDB_PDB_ID_CODE; case TAG_CHAIN_ID : return CIFTAG_NDB_CHAIN_ID; case TAG_SEQ_ALIGN_BEG : return CIFTAG_SEQ_ALIGN_BEG; case TAG_SEQ_ALIGN_BEG_INS_CODE : return CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE; case TAG_SEQ_ALIGN_END : return CIFTAG_SEQ_ALIGN_END; case TAG_SEQ_ALIGN_END_INS_CODE : return CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE; case TAG_DB_ACCESSION : return CIFTAG_NDB_DB_ACCESSION; case TAG_DB_ALIGN_BEG : return CIFTAG_DB_ALIGN_BEG; case TAG_DB_ALIGN_BEG_INS_CODE : return CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE; case TAG_DB_ALIGN_END : return CIFTAG_DB_ALIGN_END; case TAG_DB_ALIGN_END_INS_CODE : return CIFTAG_NDB_DB_ALIGN_END_INS_CODE; case TAG_SEQ_CHAIN_ID : return CIFTAG_ID; default : return pstr("ERROR_IN_CIF_NAME_1"); } case CIF_PDBX : switch (NameID) { case CAT_POLY_SEQ_SCHEME : return CIFCAT_PDBX_POLY_SEQ_SCHEME; case TAG_ID_CODE : return CIFTAG_PDBX_PDB_ID_CODE; case TAG_CHAIN_ID : return CIFTAG_PDBX_STRAND_ID; case TAG_SEQ_ALIGN_BEG : return CIFTAG_SEQ_ALIGN_BEG; case TAG_SEQ_ALIGN_BEG_INS_CODE : return CIFTAG_PDBX_SEQ_ALIGN_BEG_INS_CODE; case TAG_SEQ_ALIGN_END : return CIFTAG_SEQ_ALIGN_END; case TAG_SEQ_ALIGN_END_INS_CODE : return CIFTAG_PDBX_SEQ_ALIGN_END_INS_CODE; case TAG_DB_ACCESSION : return CIFTAG_PDBX_DB_ACCESSION; case TAG_DB_ALIGN_BEG : return CIFTAG_DB_ALIGN_BEG; case TAG_DB_ALIGN_BEG_INS_CODE : return CIFTAG_PDBX_DB_ALIGN_BEG_INS_CODE; case TAG_DB_ALIGN_END : return CIFTAG_DB_ALIGN_END; case TAG_DB_ALIGN_END_INS_CODE : return CIFTAG_PDBX_DB_ALIGN_END_INS_CODE; case TAG_SEQ_CHAIN_ID : return CIFTAG_ASYM_ID; default : return pstr("ERROR_IN_CIF_NAME_2"); } default : return pstr("ERROR_IN_CIF_NAME_3"); } } mmdb-1.23.2.1/src/hybrid_36.h0000644000175100017510000000077411472573005012345 00000000000000/* If you change the include guards, please be sure to also rename the functions below. Otherwise your project will clash with the original iotbx declarations and definitions. */ #ifndef IOTBX_PDB_HYBRID_36_C_H #define IOTBX_PDB_HYBRID_36_C_H #ifdef __cplusplus extern "C" { #endif const char* hy36encode(unsigned width, int value, char* result); const char* hy36decode(unsigned width, const char* s, unsigned s_size, int* result); #ifdef __cplusplus } #endif #endif /* IOTBX_PDB_HYBRID_36_C_H */ mmdb-1.23.2.1/src/mmdb_chain.h0000644000175100017510000005276511475666363012661 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Chain // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CProModel ( a virtue of CModel ) // ~~~~~~~~~ CChainContainer ( container of in-chain classes ) // CContainerChain ( chain containered class template) // CDBReference ( DBREF records ) // CSeqAdv ( SEQADV records ) // CSeqRes ( SEQRES records ) // CModRes ( MODRES records ) // CHetRec ( HET records ) // CChain ( chain class ) // // Copyright (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MMDB_Chain__ #define __MMDB_Chain__ #ifndef __Stream__ #include "stream_.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_Utils__ #include "mmdb_utils.h" #endif #ifndef __MMDB_Atom__ #include "mmdb_atom.h" #endif // ==================== CProModel ====================== // This class is a virtue needed only for defining certain // functions of CModel, which are used by CChain and // CResidue DefineClass(CProModel) DefineStreamFunctions(CProModel) DefineClass(CMMDBManager) class CProModel : public CUDData { friend class CChain; public : CProModel () : CUDData () {} CProModel ( RPCStream Object ) : CUDData ( Object ) {} ~CProModel () {} virtual cpstr GetEntryID () { return ""; } virtual void SetEntryID ( const IDCode ) {} virtual int AddChain ( PCChain ) { return 0; } // returns pointer to CMMDBFile virtual PCMMDBManager GetCoordHierarchy() { return NULL; } // GetNumberOfModels() returns TOTAL number of models virtual int GetNumberOfModels() { return 0; } // GetNumberOfAllAtoms() returns TOTAL number of atoms in // all models virtual int GetNumberOfAllAtoms() { return 0; } // returns pointer to the general Atom array virtual PPCAtom GetAllAtoms() { return NULL; } virtual int GetSerNum () { return 0; } virtual void ExpandAtomArray ( int ) {} virtual void AddAtomArray ( int ) {} protected : virtual int _ExcludeChain ( const ChainID ) { return 0; } }; // ==================== CChainContainer ====================== DefineClass(CChainContainer) DefineStreamFunctions(CChainContainer) class CChainContainer : public CClassContainer { public : CChainContainer () : CClassContainer () {} CChainContainer ( RPCStream Object ) : CClassContainer ( Object ) {} ~CChainContainer () {} PCContainerClass MakeContainerClass ( int ClassID ); void SetChain ( PCChain Chain_Owner ); // must be set before using // the Container // special functions used in CModel::GetCIF(..) cpstr Get1stChainID (); void MoveByChainID ( const ChainID chainID, PCChainContainer ChainContainer ); protected : PCChain Chain; }; // ================== CContainerChain ===================== DefineClass(CContainerChain) DefineStreamFunctions(CContainerChain) class CContainerChain : public CContainerClass { friend class CChainContainer; public : CContainerChain (); CContainerChain ( PCChain Chain_Owner ); CContainerChain ( RPCStream Object ) : CContainerClass(Object){} void SetChain ( PCChain Chain_Owner ); protected : PCChain Chain; ChainID chainID; // just a copy of Chain->chainID }; // ================== CDBReference ======================== DefineClass(CDBReference) DefineStreamFunctions(CDBReference) class CDBReference : public CContainerChain { public : int seqBeg; // initial seq num of the PDB seq-ce segment InsCode insBeg; // initial ins code of the PDB seq-ce segm-t int seqEnd; // ending seq number of the PDB seq-ce segm-t InsCode insEnd; // ending ins code of the PDB seq-ce segment DBName database; // sequence database name DBAcCode dbAccession; // sequence database accession code DBIdCode dbIdCode; // sequence database identification code int dbseqBeg; // initial seq number of the database segment InsCode dbinsBeg; // ins code of initial residue of the segment int dbseqEnd; // ending seq number of the database segment InsCode dbinsEnd; // ins code of the ending residue of the seg-t CDBReference (); CDBReference ( PCChain Chain_Owner ); CDBReference ( PCChain Chain_Owner, cpstr S ); CDBReference ( RPCStream Object ); ~CDBReference(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_DBReference; } void Copy ( PCContainerClass DBRef ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitDBReference(); }; // ==================== CSeqAdv =========================== DefineClass(CSeqAdv) DefineStreamFunctions(CSeqAdv) class CSeqAdv : public CContainerChain { public : ResName resName; // residue name in conflict int seqNum; // residue sequence number InsCode insCode; // residue insertion code DBName database; // sequence database name DBAcCode dbAccession; // sequence database accession code ResName dbRes; // sequence database residue name int dbSeq; // sequence database sequence number pstr conflict; // conflict comment CSeqAdv (); CSeqAdv ( PCChain Chain_Owner ); CSeqAdv ( PCChain Chain_Owner, cpstr S ); CSeqAdv ( RPCStream Object ); ~CSeqAdv(); void PDBASCIIDump ( pstr S, int N ); int ConvertPDBASCII ( cpstr S ); void MakeCIF ( PCMMCIFData CIF, int N ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_SeqAdv; } void Copy ( PCContainerClass SeqAdv ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitSeqAdv(); }; // ================== CSeqRes ======================== DefineClass(CSeqRes) DefineStreamFunctions(CSeqRes) class CSeqRes : public CStream { friend class CModel; friend class CChain; public : int numRes; // number of residues in the chain PResName resName; // residue names CSeqRes (); CSeqRes ( RPCStream Object ); ~CSeqRes(); void SetChain ( PCChain Chain_Owner ); void PDBASCIIDump ( RCFile f ); int ConvertPDBASCII ( cpstr S ); void MakeCIF ( PCMMCIFData CIF ); int GetCIF ( PCMMCIFData CIF ); void Copy ( PCSeqRes SeqRes ); void write ( RCFile f ); void read ( RCFile f ); protected : PCChain Chain; ChainID chainID; int serNum; void InitSeqRes(); void FreeMemory(); }; // ================== CModRes ======================== DefineClass(CModRes) DefineStreamFunctions(CModRes) class CModRes : public CContainerChain { public : ResName resName; // residue name used int seqNum; // residue sequence number InsCode insCode; // residue insertion code ResName stdRes; // standard residue name pstr comment; // description of the residue modification CModRes (); CModRes ( PCChain Chain_Owner ); CModRes ( PCChain Chain_Owner, cpstr S ); CModRes ( RPCStream Object ); ~CModRes(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_ModRes; } void Copy ( PCContainerClass ModRes ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitModRes(); }; // ================== CHetRec =========================== DefineClass(CHetRec) DefineStreamFunctions(CHetRec) class CHetRec : public CContainerChain { public : ResName hetID; // Het identifier (right-justified) int seqNum; // sequence number InsCode insCode; // insertion code int numHetAtoms; // number of HETATM records for the // group present in the entry pstr comment; // text describing Het group CHetRec (); CHetRec ( PCChain Chain_Owner ); CHetRec ( PCChain Chain_Owner, cpstr S ); CHetRec ( RPCStream Object ); ~CHetRec(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_Het; } void Copy ( PCContainerClass Het ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitHetRec(); }; // ================= CChain ======================= DefineFactoryFunctions(CChain) class CChain : public CUDData { friend class CDBReference; friend class CSeqAdv; friend class CSeqRes; friend class CModRes; friend class CHetRec; friend class CResidue; friend class CAtom; friend class CModel; friend class CMMDBFile; friend class CMMDBSelManager; friend class CMMDBBondManager; friend class CMMDBCoorManager; friend class CMMDBManager; public : CChainContainer DBReference; // database reference CChainContainer SeqAdv; // SEQADV records CSeqRes SeqRes; // Sequence residues, SEQRES records CChainContainer ModRes; // modification descriptions CChainContainer Het; // non-standard residues descriptions CChain (); // SetModel() MUST be used after this constructor! CChain ( PCProModel Model, const ChainID chID ); CChain ( RPCStream Object ); ~CChain(); void FreeAnnotations(); void SetModel ( PCProModel Model ); void SetChain ( const ChainID chID ); PCMMDBManager GetCoordHierarchy(); // PCMMDBFile // ConvertXXXXX(..) functions do not check for record name // and assume that PDBString is at least 81 symbols long // (including the terminating null). int ConvertDBREF ( cpstr PDBString ); int ConvertSEQADV ( cpstr PDBString ); int ConvertSEQRES ( cpstr PDBString ); int ConvertMODRES ( cpstr PDBString ); int ConvertHET ( cpstr PDBString ); // This function should be used for testing purposes only. // A full PDB ASCII dump for all models and chains involved // is done by CMMDBFile class. void PDBASCIIDump ( RCFile f ); void PDBASCIIAtomDump ( RCFile f ); void MakeAtomCIF ( PCMMCIFData CIF ); // ----------------- Extracting residues ------------------------- int GetNumberOfResidues(); // returns number of res-s in the chain PCResidue GetResidue ( int resNo ); // returns resNo-th residue // in the chain; // 0<=resNo // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // Definition of types, constants and important classes. // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MMDB_Defs__ #define __MMDB_Defs__ #ifndef __MatType__ #include "mattype_.h" #endif #define MMDB_MAJOR_VERSION (1) #define MMDB_MINOR_VERSION (23) #define MMDB_MICRO_VERSION (2) // ======================= types ================================= typedef char IDCode [16]; // ID code of the entry typedef IDCode * PIDCode; // pointer to ID code typedef PIDCode & RPIDCode; // ref-ce to pointer to ID code typedef char Date [12]; // date DD-MMM-YYYY typedef char RecName [7]; // name of PDB record typedef char ChainID [10]; // chain ID typedef ChainID * PChainID; // pointer to chain ID typedef char InsCode [10]; // insertion code typedef char DBName [10]; // sequence database name typedef char DBAcCode[20]; // seq. database accession code typedef DBAcCode * PDBAcCode; // pointer to seq. db acc code typedef char DBIdCode[20]; // seq. database ident-n code typedef DBIdCode * PDBIdCode; // pointer to DBIdCode typedef char ResName [20]; // residue name typedef ResName * PResName; // pointer to residue name typedef PResName * PPResName; // ptr to vector of residue names typedef char HelixID [20]; // helix ID typedef char StrandID[20]; // strand ID typedef char SheetID [20]; // sheet ID typedef char TurnID [20]; // turn ID typedef char LinkRID [20]; // Refmac link ID typedef char SymGroup[100]; // group of space symmetry typedef realtype vect3 [3]; // vector of 3 real numbers typedef vect3 * pvect3; typedef pvect3 & rpvect3; typedef realtype vect4 [4]; // vector of 4 real numbers typedef vect3 mat33 [3]; // matrix 3x3 of real numbers typedef vect4 mat44 [4]; // matrix 4x4 of real numbers typedef mat44 * pmat44; typedef mat44 & rmat44; typedef pmat44 * ppmat44; typedef pmat44 & rpmat44; typedef mat33 mat633 [6]; // matrix 6x3x3 of real numbers typedef char AtomName[20]; // name of the atom typedef AtomName * PAtomName; // pointer to atom name typedef char AltLoc [20]; // alternate location indicator typedef AltLoc * PAltLoc; // pointer to alt loc indicator typedef char SegID [20]; // segment identifier typedef char Element [10]; // chemical element name typedef Element * PElement; // ptr to chemical element name typedef char EnergyType[10]; // energy type name typedef EnergyType * PEnergyType; // pointer to energy type name // do not forget update this when change the above typedefs: #define MaxMMDBNameLength 40 typedef char maxMMDBName[MaxMMDBNameLength]; // ===================== constants =============================== // ANY_RES should be used in selection functions for specifying // "any residue" to select #define ANY_RES MinInt4 // PRNK_XXXXX are the print keys. PRNK_Silent supresses all print // inside mmdb_xxxx unless specifically ordered or catastrophic. // PRNK_SimRWBROOK instructs mmdb to issue, whenever possible and // necessary, printouts and warnings of RWBROOK (fortran) package. #define PRNK_Silent 0 #define PRNK_SimRWBROOK 1 // Error_XXXX may be returned by XX::ConvertPDBString() and GetCIF(..) // functions. // Error_WrongSection is returned if the string passed into function // does not belong to the corresponding PDB section. #define Error_NoError 0 #define Error_Ok 0 #define Error_WrongSection 1 #define Error_WrongChainID 2 #define Error_WrongEntryID 3 // Error_SEQRES_serNum is returned by CSeqRes::ConvertPDBASCII() if // serial numbers of SEQRES records do not increment by 1 #define Error_SEQRES_serNum 4 // Error_SEQRES_numRes is returned by CSeqRes::ConvertPDBASCII() if // SEQRES records show different number of residues #define Error_SEQRES_numRes 5 // Error_SEQRES_extraRes is returned by CSeqRes::ConvertPDBASCII() if // SEQRES contains more residues than specified #define Error_SEQRES_extraRes 6 #define Error_NCSM_Unrecognized 7 #define Error_NCSM_AlreadySet 8 #define Error_NCSM_WrongSerial 9 #define Error_NCSM_UnmatchIG 10 #define Error_ATOM_Unrecognized 11 #define Error_ATOM_AlreadySet 12 #define Error_ATOM_NoResidue 13 #define Error_ATOM_Unmatch 14 #define Error_CantOpenFile 15 #define Error_UnrecognizedInteger 16 #define Error_WrongModelNo 17 #define Error_DuplicatedModel 18 #define Error_NoModel 19 #define Error_ForeignFile 20 #define Error_WrongEdition 21 // CIF specific #define Error_NotACIFFile 22 #define Error_NoData 23 #define Error_UnrecognCIFItems 24 #define Error_MissingCIFField 25 #define Error_EmptyCIFLoop 26 #define Error_UnexpEndOfCIF 27 #define Error_MissgCIFLoopField 28 #define Error_NotACIFStructure 29 #define Error_NotACIFLoop 30 #define Error_UnrecognizedReal 31 #define Error_NoSheetID 32 #define Error_WrongSheetID 33 #define Error_WrongStrandNo 34 // Error_WrongNumberOfStrands may be issued when reading // sheet data from CIF #define Error_WrongNumberOfStrands 35 // Error_WrongSheetOrder may be issued when reading // sheet data from CIF #define Error_WrongSheetOrder 36 // Error_HBondInconsistency may be issued when reading // sheet data from CIF #define Error_HBondInconsistency 37 // Error_EmptyResidueName is issued when PDB ATOM record // does not have a residue name #define Error_EmptyResidueName 38 // Error_DuplicateSeqNum is issued when PDB ATOM records // show the sequence number and insertion code assigned // to more than one residue name #define Error_DuplicateSeqNum 39 // Error_NoLogicalName may be returned by file i/o functions // if the specified environmental variable for file name // is not found. #define Error_NoLogicalName 40 // Error_EmptyFile may be returned at reading non-existing // coordinate files #define Error_EmptyFile 41 // Error_CIF_EmptyRow is the event of encountering // an empty row in _atom_site loop. It is handled // internally and has no effect on API #define Error_CIF_EmptyRow 99999 #define Error_GeneralError1 10000 // ClassID_XXXX are used by container classes for proper // creating containered classes when reading from binary file. #define ClassID_Template 0 #define ClassID_String 1 #define ClassID_ObsLine 2 #define ClassID_TitleLine 3 #define ClassID_CAVEAT 4 #define ClassID_Compound 5 #define ClassID_Source 6 #define ClassID_ExpData 7 #define ClassID_Author 8 #define ClassID_RevData 9 #define ClassID_Supersede 10 #define ClassID_Journal 11 #define ClassID_Remark 12 #define ClassID_DBReference 13 #define ClassID_SeqAdv 14 #define ClassID_ModRes 15 #define ClassID_Het 16 #define ClassID_NCSMatrix 17 #define ClassID_TVect 18 #define ClassID_Helix 19 #define ClassID_Turn 20 #define ClassID_Link 21 #define ClassID_LinkR 22 #define ClassID_CisPep 23 // ===================== classes =============================== DefineClass(CAtom) DefineClass(CResidue) DefineClass(CChain) DefineClass(CModel) DefineClass(CMMDBManager) #endif mmdb-1.23.2.1/src/mmdb_utils.h0000644000175100017510000005712711475666364012735 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Utils // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CContainerClass ( containered class template ) // ~~~~~~~~~ CContString ( containered string ) // CClassContainer ( container of classes ) // CAtomPath ( atom path ID ) // CQuickSort ( quick sort of integers ) // // **** Functions : Date9to11 ( DD-MMM-YY -> DD-MMM-YYYY ) // ~~~~~~~~~~~ Date11to9 ( DD-MMM-YYYY -> DD-MMM-YY ) // Date9toCIF ( DD-MMM-YY -> YYYY-MM-DD ) // Date11toCIF( DD-MMM-YYYY -> YYYY-MM-DD ) // DateCIFto9 ( YYYY-MM-DD -> DD-MMM-YY ) // DateCIFto11( YYYY-MM-DD -> DD-MMM-YYYY ) // GetInteger ( reads integer from a string ) // GetReal ( reads real from a string ) // GetIntIns ( reads integer and insert code ) // PutInteger ( writes integer into a string ) // PutRealF ( writes real in F-form into a string ) // PutIntIns ( writes integer and insert code ) // CIFGetInteger ( reads and deletes int from CIF ) // CIFGetReal ( reads and deletes real from CIF ) // CIFGetString ( reads and deletes string from CIF) // CIFGetInteger1 (reads and del-s int from CIF loop) // CIFGetReal1 (reads and del-s int from CIF loop) // Mat4Inverse ( inversion of 4x4 matrices ) // GetErrorDescription (ascii line to an Error_XXXXX) // ParseAtomID ( parses atom ID line ) // ParseResID ( parses residue ID line ) // ParseAtomPath ( parses full atom path ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MMDB_Utils__ #define __MMDB_Utils__ #ifndef __Stream__ #include "stream_.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_MMCIF__ #include "mmdb_mmcif.h" #endif // ================== Date functions =================== // converts DD-MMM-YY to DD-MMM-YYYY; appends terminating zero extern void Date9to11 ( cpstr Date9, pstr Date11 ); // converts DD-MMM-YYYY to DD-MMM-YY; does not append terminating zero extern void Date11to9 ( cpstr Date11, pstr Date9 ); // converts DD-MMM-YY to YYYY-MM-DD; appends terminating zero extern void Date9toCIF ( cpstr Date9, pstr DateCIF ); // converts DD-MMM-YYYY to YYYY-MM-DD; appends terminating zero extern void Date11toCIF ( cpstr Date11, pstr DateCIF ); // converts YYYY-MM-DD to DD-MMM-YY; appends terminating zero extern void DateCIFto9 ( cpstr DateCIF, pstr Date9 ); // converts YYYY-MM-DD to DD-MMM-YYYY; appends terminating zero extern void DateCIFto11 ( cpstr DateCIF, pstr Date11 ); // ================= Format functions ================== // Returns True if S contains an integer number in its // first M characters. This number is returned in N. // The return is False if no integer number may be // recognized. In this case, N is assigned MinInt4 value. extern Boolean GetInteger ( int & N, cpstr S, int M ); // Returns True if S contains a real number in its // first M characters. This number is returned in R. // The return is False if no real number may be // recognized. In this case, R is assigned -MaxReal value. extern Boolean GetReal ( realtype & R, cpstr S, int M ); // Returns True if S contains an integer number in its // first M characters. This number is returned in N. In addition // to that, GetIntIns() retrieves the insertion code which may // follow the integer and returns it in "ins" (1 character + // terminating 0). // The return is False if no integer number may be // recognized. In this case, N is assigned MinInt4 value, // "ins" just returns (M+1)th symbol of S (+terminating 0). extern Boolean GetIntIns ( int & N, pstr ins, cpstr S, int M ); // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. // If N is set to MinInt4, then first M characters of // string S are set to space. extern void PutInteger ( pstr S, int N, int M ); // Real R is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. The conversion is done // according to fixed format FM.L // If R is set to -MaxReal, then first M characters of // string S are set to the space character. extern void PutRealF ( pstr S, realtype R, int M, int L ); // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. The insert code ins is put // immediately after the integer. // If N is set to MinInt4, then first M+1 characters of // string S are set to space, and no insert code are // appended. extern void PutIntIns ( pstr S, int N, int M, cpstr ins ); // CIFInteger(..), CIFReal(..) and CIFGetString(..) automate // extraction and analysis of data from CIF file. If the data // is erroneous or absent, they store an error message in // CIFErrorLocation string (below) and return non-zero. extern int CIFGetInteger ( int & I, PCMMCIFStruct Struct, cpstr Tag, Boolean Remove=True ); extern int CIFGetReal ( realtype & R, PCMMCIFStruct Struct, cpstr Tag, Boolean Remove=True ); extern int CIFGetString ( pstr S, PCMMCIFStruct Struct, cpstr Tag, int SLen, cpstr DefS, Boolean Remove=True ); extern int CIFGetInteger ( int & I, PCMMCIFLoop Loop, cpstr Tag, int & Signal ); extern int CIFGetInteger1 ( int & I, PCMMCIFLoop Loop, cpstr Tag, int nrow ); extern int CIFGetReal ( realtype & R, PCMMCIFLoop Loop, cpstr Tag, int & Signal ); extern int CIFGetReal1 ( realtype & R, PCMMCIFLoop Loop, cpstr Tag, int nrow ); extern int CIFGetString ( pstr S, PCMMCIFLoop Loop, cpstr Tag, int row, int SLen, cpstr DefS ); // Calculates AI=A^{-1} extern void Mat4Inverse ( mat44 & A, mat44 & AI ); // Calculates A=B*C extern void Mat4Mult ( mat44 & A, mat44 & B, mat44 & C ); // Calculates A=B^{-1}*C extern void Mat4Div1 ( mat44 & A, mat44 & B, mat44 & C ); // Calculates A=B*C^{-1} extern void Mat4Div2 ( mat44 & A, mat44 & B, mat44 & C ); // Calculates determinant of the rotation part extern realtype Mat4RotDet ( mat44 & T ); // Sets up a unit matrix extern void Mat4Init ( mat44 & A ); extern void Mat3Init ( mat33 & A ); // Calculates AI=A^{-1}, returns determinant extern realtype Mat3Inverse ( mat33 & A, mat33 & AI ); extern Boolean isMat4Unit ( mat44 & A, realtype eps, Boolean rotOnly ); // Copies A into AC extern void Mat4Copy ( mat44 & A, mat44 & AC ); extern void Mat3Copy ( mat33 & A, mat33 & AC ); extern Boolean isMat4Eq ( mat44 & A, mat44 & B, realtype eps, Boolean rotOnly ); extern void TransformXYZ ( mat44 & T, realtype & X, realtype & Y, realtype & Z ); extern realtype TransformX ( mat44 & T, realtype X, realtype Y, realtype Z ); extern realtype TransformY ( mat44 & T, realtype X, realtype Y, realtype Z ); extern realtype TransformZ ( mat44 & T, realtype X, realtype Y, realtype Z ); extern char CIFErrorLocation[200]; // Returns ASCII string explaining the nature of // Error_xxxx error code. extern cpstr GetErrorDescription ( int ErrorCode ); // ============== CContainerClass ==================== DefineClass(CContainerClass) DefineStreamFunctions(CContainerClass) class CContainerClass : public CStream { friend class CClassContainer; public : CContainerClass (); CContainerClass ( RPCStream Object ); ~CContainerClass() {} // ConvertPDBASCII(..) will return one of the Error_XXXXX // constants, see virtual int ConvertPDBASCII ( cpstr ) { return 0; } virtual void PDBASCIIDump ( pstr, int ) {} virtual Boolean PDBASCIIDump1 ( RCFile ) { return False; } virtual void MakeCIF ( PCMMCIFData, int ) {} // Append(..) should return True if CC is appended to this class. // If this is not the case, CC is merely put on the top of // container. // Note: Append(..) detects the necessity to append CC and // performs all the necessary actions for that. The rest of CC // will be disposed by Class Container. // Note: Class Container checks every new class, which is // being added to it (see CClassContainer::AddData(..)), only // against the top of container. virtual Boolean Append ( PCContainerClass CC ); // GetCIF(..) extracts any necessary information from CIF and // returns: // Signal>=0 : the information was successfully extracted, // this instance of container class should be // stored, and unchanged value of Signal should // be passed to the next (newly created) instance // of this container class. // Signal = -1 : there is no information for this type of // containers to extract. This instance of // container class should be deleted and input // for this type of container class terminated. // Signal < -1 : error. The code of error is determined as // -(Signal+1), then see Error_XXXXX constants // in . This instance of container // class should be deleted and the whole input // should be stopped. virtual void GetCIF ( PCMMCIFData, int & Signal ) { Signal = -1; } virtual int GetClassID () { return ClassID_Template; } virtual void Copy ( PCContainerClass ) {} void write ( RCFile ) {} void read ( RCFile ) {} protected : int ContinuationNo; }; // ============== CContString ==================== DefineClass(CContString) DefineStreamFunctions(CContString) class CContString : public CContainerClass { public : pstr Line; // a string CContString (); CContString ( cpstr S ); CContString ( RPCStream Object ); ~CContString(); int ConvertPDBASCII ( cpstr S ); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile f ); void MakeCIF ( PCMMCIFData CIF, int N ); void GetCIF ( PCMMCIFData CIF, int & Signal ); Boolean Append ( PCContainerClass ContString ); int GetClassID () { return ClassID_String; } void Copy ( PCContainerClass CString ); void write ( RCFile f ); void read ( RCFile f ); protected : pstr CIFCategory,CIFTag; void InitString(); }; // ============== CClassContainer ==================== DefineClass(CClassContainer) DefineStreamFunctions(CClassContainer) class CClassContainer : public CStream { public : CClassContainer (); CClassContainer ( RPCStream Object ); ~CClassContainer (); void FreeContainer (); void AddData ( PCContainerClass Data ); virtual void PDBASCIIDump ( RCFile f ); virtual void MakeCIF ( PCMMCIFData CIF ); // GetCIF(..) will return one of the Error_XXXXX constants, // see int GetCIF ( PCMMCIFData CIF, int ClassID ); virtual PCContainerClass MakeContainerClass ( int ClassID ); // Copy will empty the class if parameter is set to NULL virtual void Copy ( PCClassContainer CContainer ); int Length() { return length; } PCContainerClass GetContainerClass ( int ContClassNo ); void write ( RCFile f ); void read ( RCFile f ); protected : int length; PPCContainerClass Container; void Init(); }; // ====================== ID parsers ========================== DefineClass(CAtomPath) DefineStreamFunctions(CAtomPath) #define APATH_ModelNo 0x00000001 #define APATH_ChainID 0x00000002 #define APATH_SeqNum 0x00000004 #define APATH_InsCode 0x00000008 #define APATH_ResName 0x00000010 #define APATH_AtomName 0x00000020 #define APATH_Element 0x00000040 #define APATH_AltLoc 0x00000080 #define APATH_Incomplete 0x00000100 #define APATH_WC_ModelNo 0x00001000 #define APATH_WC_ChainID 0x00002000 #define APATH_WC_SeqNum 0x00004000 #define APATH_WC_InsCode 0x00008000 #define APATH_WC_ResName 0x00010000 #define APATH_WC_AtomName 0x00020000 #define APATH_WC_Element 0x00040000 #define APATH_WC_AltLoc 0x00080000 class CAtomPath : public CStream { public : int modelNo; ChainID chainID; int seqNum; InsCode insCode; ResName resName; AtomName atomName; Element element; AltLoc altLoc; int isSet; CAtomPath (); CAtomPath ( cpstr ID ); CAtomPath ( RPCStream Object ); ~CAtomPath (); // SetPath(..) parses the Atom Path ID string, which // may be incomplete. Below {..} means blocks that // may be omitted; any elements within such blocks // may be omitted as well. // // 1. If ID starts with '/' then the ID must be of // the following form: // /mdl{/chn{/seq(res).i{/atm[elm]:a}}} // // 2. If ID starts with a letter: // chn{/seq(res).i{/atm[elm]:a}} // // 3. If ID starts with a number or '(': // seq(res).i{/atm[elm]:a} // // 4. If ID contains colon ':' or '[' then // it may be just // atm[elm]:a // // The following are valid samples of IDs: // // /1 model number 1 // /1/A/23(GLU).A/CA[C]:A model number 1, chain A, // residue 23 GLU insertion code A, C-alpha // atom in alternative location A // A/23 residue 23 of chain A // CA[C]: atom C-alpha // [C] a carbon // *[C]:* same as above // :A an atom with insertion code A // 5 residue number 5 // (GLU) residue GLU // // All spaces are ignored. SetPath(..) sets bit of isSet // for each element present. Any element may be a wildcard // '*'. Wildcard for model will set modelNo=0, for sequence // number will set seqNum=MinInt4. // // Returns: // 0 <-> Ok // -1 <-> wrong numerical format for model // -2 <-> wrong numerical format for sequence number int SetPath ( cpstr ID ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitAtomPath(); }; // -------------------------------------------------------------- DefineClass(CQuickSort) class CQuickSort : public CStream { public : CQuickSort (); CQuickSort ( RPCStream Object ); ~CQuickSort() {} virtual int Compare ( int i, int j ); virtual void Swap ( int i, int j ); void Sort ( void * sortdata, int data_len ); protected : int selSortLimit,dlen; void * data; void SelectionSort ( int left, int right ); int Partition ( int left, int right ); void Quicksort ( int left, int right ); }; // -------------------------------------------------------------- void takeWord ( pstr & p, pstr wrd, cpstr ter, int l ); // ParseAtomID(..) reads the atom ID of the following form: // {name} {[element]} {:altcode} // (here {} means that the item may be omitted; any field may have // value of wildcard '*'), and returns the atom name in aname, // element name - in elname, and alternate location code - in aloc. // Except for the alternate location code, missing items are // replaced by wildcards. Missing alternate location code is // returned as empty string "". // Leading spaces are allowed; any other space will terminate // the parsing. // The followings are perfectly valid atom IDs: // CA[C]:A (carbon C_alpha in location A) // CA[*]:A (either C_alpha or Ca in location A) // CA:A (same as above) // CA (either C_alpha or Ca with no location indicator) // CA[] (same as above) // CA[C]: (C_alpha with no location indicator) // [C] (any carbon with no location indicator) // [C]:* (any carbon with any location indicator) // *[C]:* (same as above) // :A (any atom in location A) // *[*]:A (same as above) // *[*]:* (any atom) // * (any atom with no alternate location indicator) extern void ParseAtomID ( cpstr ID, AtomName aname, Element elname, AltLoc aloc ); // ParseResID(..) reads the residue ID of the following form: // {seqnum} {(name)} {.inscode} // (here {} means that the item may be omitted; any field may have // value of wildcard '*'), and returns the sequence number in sn, // insertion code - in inscode, and residue name - in resname. // If a wildcard was specified for the sequence number, then // ParseResID(..) returns 1. Missing residue name is replaced by // the wildcard '*', and misisng insertion code is returned as empty // string "". // Leading spaces are allowed; any other space will terminate // the parsing. // Return 0 means Ok, 1 - wildcard for the sequence number, // 2 - an error in numerical format of the sequence number // (other items are parsed). // The followings are perfectly valid residue IDs: // 27(ALA).A (residue 27A ALA) // 27().A (residue 27A) // 27(*).A (same as above) // 27.A (same as above) // 27 (residue 27) // 27(). (same as above) // (ALA) (any ALA without insertion code) // (ALA). (same as above) // (ALA).* (any ALA) // *(ALA).* (any ALA) // .A (any residue with insertion code A) // *(*).A (same as above) // *(*).* (any residue) // * (any residue with no insertion code) extern int ParseResID ( cpstr ID, int & sn, InsCode inscode, ResName resname ); // ParseAtomPath(..) parses an atom path string of the following // structure: // /mdl/chn/seq(res).i/atm[elm]:a // where all items may be represented by a wildcard '*' and // mdl - model number (mandatory); at least model #1 is always // present; returned in mdl; on a wildcard mdl is set to 0 // chn - chain identifier ( mandatory); returned in chn; on a // wildcard chn is set to '*' // seq - residue sequence number (mandatory); returned in sn; // on a wild card ParseAtomPath(..) returns 1 // (res) - residue name in round brackets (may be omitted); // returnded in res; on a wildcard res is set to '*' // .i - insert code after a dot; if '.i' or 'i' is missing // then a residue without an insertion code is looked for; // returned in ic; on a wildcard (any insertion code would // do) ic is set to '*' // atm - atom name (mandatory); returned in atm; on a wildcard // atm is set to '*' // [elm] - chemical element code in square brackets; it may // be omitted but could be helpful for e.g. // distinguishing C_alpha and CA; returned in elm; // in a wildcard elm is set to '*' // :a - alternate location indicator after colon; if // ':a' or 'a' is missing then an atom without // alternate location indicator is looked for; returned // in aloc; on a wildcard (any alternate code would do) // aloc is set to '*'. // All spaces are ignored, all identifiers should be in capital // letters (comparisons are case-sensitive). // The atom path string may be incomplete. If DefPath is supplied, // the function will try to get missing elements from there. If // missing items may not be found in DefPath, they are replaced by // wildcards. // ParseAtomPath(..) returns the following bits: // 0 - Ok // APATH_Incomplete - if path contains wildcards. Wildcards for // residue name and chemical element will be // ignored here if sequence number and // atom name, correspondingly, are provided. // APATH_WC_XXXXX - wildcard for different elements // -1 - wrong numerical format for model (fatal) // -2 - wrong numerical format for seqNum (fatal) extern int ParseAtomPath ( cpstr ID, int & mdl, ChainID chn, int & sn, InsCode ic, ResName res, AtomName atm, Element elm, AltLoc aloc, PCAtomPath DefPath=NULL ); extern int ParseSelectionPath ( cpstr CID, int & iModel, pstr Chains, int & sNum1, InsCode ic1, int & sNum2, InsCode ic2, pstr RNames, pstr ANames, pstr Elements, pstr altLocs ); extern void MakeSelectionPath ( pstr CID, int iModel, cpstr Chains, int sNum1, const InsCode ic1, int sNum2, const InsCode ic2, cpstr RNames, cpstr ANames, cpstr Elements, cpstr altLocs ); #endif mmdb-1.23.2.1/src/mmdb_symop.h0000644000175100017510000001125011475666364012727 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_SymOp // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CSymOp ( symmetry operators ) // ~~~~~~~~~ CSymOps ( container of symmetry operators ) // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_SymOp__ #define __MMDB_SymOp__ #ifndef __Stream__ #include "stream_.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif // ==================== CSymOp ======================== DefineClass(CSymOp) DefineStreamFunctions(CSymOp) class CSymOp : public CStream { public : CSymOp (); CSymOp ( RPCStream Object ); ~CSymOp(); int SetSymOp ( cpstr XYZOperation ); pstr GetSymOp (); void Transform ( realtype & x, realtype & y, realtype & z ); void GetTMatrix ( mat44 & TMatrix ); // copies T to TMatrix void SetTMatrix ( mat44 & TMatrix ); // copies TMatrix to T Boolean CompileOpTitle ( pstr S ); // makes XYZOp from matrix T Boolean CompileOpTitle ( pstr S, mat44 symMat, Boolean compare ); void Print (); // prints operation and matrix void Copy ( PCSymOp SymOp ); void write ( RCFile f ); void read ( RCFile f ); protected : pstr XYZOp; mat44 T; void InitSymOp (); void FreeMemory (); int GetOperation ( int n ); }; // ==================== CSymOps ======================== #define SYMOP_Ok 0 #define SYMOP_NoLibFile -1 #define SYMOP_UnknownSpaceGroup -2 #define SYMOP_NoSymOps -3 #define SYMOP_WrongSyntax -4 #define SYMOP_NotAnOperation -5 #define SYMOP_ZeroDenominator -6 DefineClass(CSymOps) DefineStreamFunctions(CSymOps) class CSymOps : public CStream { public : CSymOps (); CSymOps ( RPCStream Object ); ~CSymOps(); virtual void FreeMemory(); int SetGroupSymopLib ( cpstr SpaceGroup, cpstr symop_lib=NULL ); // Space Group is taken from symop.lib. Return Code: // SYMOP_Ok <=> success int SetGroup ( cpstr SpaceGroup, cpstr syminfo_lib=NULL ); // Space Group is taken from syminfo.lib. Return Code: // SYMOP_Ok <=> success void Reset (); // removes all symmetry operations virtual int AddSymOp ( cpstr XYZOperation ); // adds a sym. // operation void PutGroupName ( cpstr SpGroupName ); // GetNofSymOps() returns Nops -- the number of sym. operations int GetNofSymOps (); pstr GetSymOp ( int Nop ); // Transform(..) transforms the coordinates according to the // symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). int Transform ( realtype & x, realtype & y, realtype & z, int Nop ); // GetTMatrix(..) returns the coordinate transformation matrix // for the symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). int GetTMatrix ( mat44 & TMatrix, int Nop ); void Print (); virtual void Copy ( PCSymOps SymOps ); void write ( RCFile f ); void read ( RCFile f ); protected : pstr SpGroup; int Nops; PPCSymOp SymOp; void InitSymOps(); }; // extern void TestSymOps(); #endif mmdb-1.23.2.1/src/mmdb_align.h0000644000175100017510000001217311475666363012656 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Align // ~~~~~~~~~ // **** Classes : CAlignment ( alignment of character strings ) // ~~~~~~~~~~~~ CAlignment1 ( alignment of integer vectors ) // // (C) E.Krissinel' 2000-2008 // // ================================================================= // #ifndef __MMDB_Align__ #define __MMDB_Align__ #ifndef __Stream__ #include "stream_.h" #endif // ===================== CAlignParams ====================== DefineClass(CAlignParams); DefineStreamFunctions(CAlignParams) class CAlignParams : public CStream { public : realtype gapWeight,spaceWeight; realtype equalScore,nequalScore; int method; CAlignParams(); CAlignParams ( RPCStream Object ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitAlignParams(); }; // ===================== CAlignment ====================== DefineClass(CAlignment) #define ALIGN_GLOBAL 0 #define ALIGN_LOCAL 1 #define ALIGN_GLOBLOC 2 #define ALIGN_FREEENDS 3 class CAlignment : public CStream { public : CAlignment (); CAlignment ( RPCStream Object ); ~CAlignment (); void SetAffineModel ( realtype WGap, realtype WSpace ); void SetScores ( realtype SEqual, realtype SNEqual ); void Align ( cpstr S, cpstr T, int Method=ALIGN_GLOBAL ); pstr GetAlignedS() { return AlgnS; } pstr GetAlignedT() { return AlgnT; } realtype GetScore () { return VAchieved; } char GetSpace () { return Space; } virtual void OutputResults ( RCFile f, cpstr S, cpstr T ); void read ( RCFile f ); void write ( RCFile f ); protected : char Space; int AlignKey, SLen,TLen; rmatrix VT,ET,FT; pstr AlgnS,AlgnT; realtype VAchieved; realtype SEq,SNEq, Wg,Ws; virtual void InitAlignment(); virtual void FreeMemory (); virtual realtype Score ( char A, char B ); void BuildGATable ( cpstr S, cpstr T, Boolean FreeSEnd, Boolean FreeTEnd ); void BuildLATable ( cpstr S, cpstr T ); void Backtrace ( cpstr S, cpstr T, int J, int I, Boolean StopAtZero ); void AdjustEnds ( cpstr S, cpstr T, int J, int I ); void PrintVT ( cpstr S, cpstr T ); }; // ===================== CAlignment1 ====================== DefineClass(CAlignment1) class CAlignment1 : public CStream { public : CAlignment1 (); CAlignment1 ( RPCStream Object ); ~CAlignment1(); void SetAffineModel ( realtype WGap, realtype WSpace ); void SetScores ( realtype SEqual, realtype SNEqual ); void Align ( ivector S, int SLength, ivector T, int TLength, int Method=ALIGN_GLOBAL ); ivector GetAlignedS () { return AlgnS; } ivector GetAlignedT () { return AlgnT; } int GetAlignLength() { return AlgnLen; } realtype GetScore () { return VAchieved; } virtual void OutputResults ( RCFile f, ivector S, int lenS, ivector T, int lenT ); void read ( RCFile f ); void write ( RCFile f ); protected : int Space; int AlignKey, SLen,TLen, AlgnLen; rmatrix VT,ET,FT; ivector AlgnS,AlgnT; realtype VAchieved; realtype SEq,SNEq, Wg,Ws; virtual void InitAlignment1(); virtual void FreeMemory (); virtual realtype Score ( int A, int B ); void BuildGATable ( ivector S, ivector T, Boolean FreeSEnds, Boolean FreeTEnds ); void BuildLATable ( ivector S, ivector T ); void Backtrace ( ivector S, ivector T, int J, int I, Boolean StopAtZero ); void AdjustEnds ( ivector S, ivector T, int J, int I ); void PrintVT ( ivector S, ivector T ); }; #endif mmdb-1.23.2.1/src/linalg_.h0000644000175100017510000001756511475666363012204 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 27.06.01 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : linalg_ // ~~~~~~~~~ // **** Project : MMDB ( MacroMolecular Data Base ) // ~~~~~~~~~ // // (C) E.Krissinel 2000-2008 // // ================================================================= // // #ifndef __LinAlg__ #define __LinAlg__ #ifndef __MatType__ #include "mattype_.h" #endif // ========================== Jacobi ============================= // Diagonalization of symmetric matrices by the method of Jacobi. extern void Jacobi ( int N, // dimension of the matrix rmatrix A, // matrix to diagonalize; the // lower triangle, except the // diagonal, will remain unchanged rmatrix T, // eigenvectors placed as columns rvector Eigen, // vector of eigenvalues, orderd // by increasing rvector Aik, // working array int & Signal // 0 <=> Ok, ItMax <=> iteration // limit exchausted. ); // A5.5.2 : Perturbated Cholessky Decomposition extern void PbCholDecomp ( int N, rvector HDiag, realtype MaxOff, realtype MachEps, rmatrix L, realtype & MaxAdd ); // A3.2.3a : Cholessky's L - Solution of // L*Y = B ( given B ) extern void LSolve ( int N, rmatrix L, rvector B, rvector Y ); // A3.2.3b : Cholessky's LT - Solution of // LT*X = Y ( given Y ) extern void LTSolve ( int N, rmatrix L, rvector Y, rvector X ); // A3.2.3 : Solution of the equation L*LT*S = G // by the Cholessky's method extern void ChSolve ( int N, rmatrix L, rvector G, rvector S ); // ---------------------------------------------------- extern void FastInverse ( int N, rmatrix A, ivector J0, //#D realtype & Det, int & Signal ); // // 13.09.90 <-- Last Modification Date // ------------------------ // // ================================================ // // Fast Inversion of the matrix A // by the method of GAUSS - JORDAN . // // ------------------------------------------------ // // Input parameters are : // // N - dimension of the matrix // A - the matrix [1..N][1..N] to be inverted. // ------------------------------------------------ // // J0 - integer vector [1..N] for temporal storage // // ------------------------------------------------ // // Output parameters are : // // A - the inverted matrix // Signal - the error key : // = 0 <=> O'K // else // degeneration was found, and // the rang of matrix is Signal-1. // // Variable Det may return the determinant // of matrix A. To obtain it, remove all comments // of form //#D. // // ================================================ // ---------------------------------------------------- void SVD ( int NA, int M, int N, rmatrix A, rmatrix U, rmatrix V, rvector W, rvector RV1, Boolean MatU, Boolean MatV, int & RetCode ); // // 13.12.01 <-- Last Modification Date // ------------------------ // // ================================================ // // The Singular Value Decomposition // of the matrix A by the algorithm from // G.Forsait, M.Malkolm, K.Mouler. Numerical // methods of mathematical calculations // // M., Mir, 1980. // // Matrix A is represented as // // A = U * W * VT // // ------------------------------------------------ // // All dimensions are indexed from 1 on. // // ------------------------------------------------ // // Input parameters: // // NA - number of lines in A. NA may be // equal to M or N only. If NA=M // then usual SVD will be made. If MA=N // then matrix A is transposed before // the decomposition, and the meaning of // output parameters U and V is // swapped (U accepts VT and VT accepts U). // In other words, matrix A has physical // dimension of M x N , same as U and V; // however the logical dimension of it // remains that of N x M . // M - number of lines in U // N - number of columns in U,V and length // of W,RV1 . Always provide M >= N ! // A - matrix [1..M][1..N] or [1..N][1..M] // to be decomposed. The matrix does not // change, and it may coincide with U or // V, if NA=M (in which case A does change) // MatU - compute U , if set True // MatV - compute V , if set True // RV1 - temporary array [1..N]. // U - should be always supplied as an array of // [1..M][1..N], M>=N . // V - should be suuplied as an array of // [1..N][1..N] if MatV is True . // // ------------------------------------------------ // // Output parameters are : // // W - N non-ordered singular values, // if RetCode=0. If RetCode<>0, the // RetCode+1 ... N -th values are still // valid // U - matrix of right singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatU is True. If MatU // is False, U is still used as a // temporary array. If RetCode<>0 then // the RetCode+1 ... N -th vectors // are valid // V - matrix of left singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatV is True. If MatV // is False, V is not used and may be set // to NULL. If RetCode<>0 then the // RetCode+1 ... N -th vectors are valid // RetCode - the error key : // = 0 <=> O'K // else // = k, if the k-th singular value // was not computed after 30 iterations. // // ------------------------------------------------ // // Key Variables are : // // ItnLimit - the limit for iterations // // This routine does not use any machine-dependent // constants. // // ================================================ // // void OrderSVD ( int M, int N, rmatrix U, rmatrix V, rvector W, Boolean MatU, Boolean MatV ); #endif mmdb-1.23.2.1/src/mattype_.cpp0000644000175100017510000012621111475665501012732 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MatType_ // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STDLIB_H #include #endif #ifndef __STRING_H #include #endif #ifndef __CTYPE_H #include #endif #ifndef __MatType__ #include "mattype_.h" #endif #include // ------------------------------------------------------- realtype MachEps; realtype floatMachEps; realtype LnMaxReal; realtype LnMinReal; static realtype LnMaxRealExp; static realtype LnMinRealExp; // Initialization. Some C++ enviroments do not do the // following statements automatically, therefore it is // always advisable to call InitMatType() explicitely // from the top of main(). See body of InitMatType() // in the very end of this file. It is completely // harmless and cheap to call InitMatType() multiple // times. static Boolean MatTypeInit = InitMatType(); // ------------------------------------------------------- /* int mround ( realtype X ) { return (int)floor(X+0.5); } int ifloor ( realtype X ) { return (int)floor(X); } int Abs ( int x ) { return ( x >= 0 ? x : -x ); } */ #ifdef _WIN32 pstr strcasestr ( pstr s1, cpstr s2 ) { pstr l1,l2,l; l1 = NULL; l2 = NULL; CreateCopy ( l1,s1 ); CreateCopy ( l2,s2 ); LowerCase ( l1 ); LowerCase ( l2 ); l = strstr ( l1,l2 ); if (l) l = s1 + (l-l1); delete[] l1; delete[] l2; return l; } #endif // ------------------------------------------------------- /* void ISwap ( int & x, int & y ) { int b; b = x; x = y; y = b; } void WSwap ( word & x, word & y ) { word b; b = x; x = y; y = b; } void BSwap ( byte & x, byte & y ) { byte b; b = x; x = y; y = b; } void LSwap ( long & x, long & y ) { long b; b = x; x = y; y = b; } void RSwap ( realtype & x, realtype & y ) { realtype b; b = x; x = y; y = b; } */ // ------------------------------------------------------- /* realtype RMax ( const realtype x1, const realtype x2 ) { return ( x1 > x2 ? x1 : x2 ); } long LMax ( const long x1, const long x2 ) { return ( x1 > x2 ? x1 : x2 ); } word WMax ( const word x1, const word x2 ) { return ( x1 > x2 ? x1 : x2 ); } int IMax ( const int x1, const int x2 ) { return ( x1 > x2 ? x1 : x2 ); } realtype RMin ( const realtype x1, const realtype x2 ) { return ( x1 < x2 ? x1 : x2 ); } long LMin ( const long x1, const long x2 ) { return ( x1 < x2 ? x1 : x2 ); } word WMin ( const word x1, const word x2 ) { return ( x1 < x2 ? x1 : x2 ); } int IMin ( const int x1, const int x2 ) { return ( x1 < x2 ? x1 : x2 ); } */ // ------------------------------------------------------- /* realtype fsign ( const realtype x1, const realtype x2 ) { realtype ax; if (x1>=0.0) ax = x1; else ax = -x1; return ( x2 >= 0.0 ? ax : -ax ); } */ // ------------------------------------------------------- Boolean GetVectorMemory ( rvector & V, word N, word Shift ) { V = new realtype[N]; if (V!=NULL) V = V - Shift; // shift for abovementioned enumeration return (V!=NULL); } Boolean GetVectorMemory ( ivector & I, word N, word Shift ) { I = new int[N]; if (I!=NULL) I = I - Shift; // shift for abovementioned enumeration return (I!=NULL); } Boolean GetVectorMemory ( wvector & W, word N, word Shift ) { W = new word[N]; if (W!=NULL) W = W - Shift; // shift for abovementioned enumeration return (W!=NULL); } Boolean GetVectorMemory ( bvector & B, word N, word Shift ) { B = new byte[N]; if (B!=NULL) B = B - Shift; // shift for abovementioned enumeration return (B!=NULL); } Boolean GetVectorMemory ( lvector & L, word N, word Shift ) { L = new long[N]; if (L!=NULL) L = L - Shift; // shift for abovementioned enumeration return (L!=NULL); } Boolean GetVectorMemory ( lwvector & L, word N, word Shift ) { L = new lword[N]; if (L!=NULL) L = L - Shift; // shift for abovementioned enumeration return (L!=NULL); } Boolean GetVectorMemory ( psvector & P, word N, word Shift ) { P = new pstr[N]; if (P!=NULL) P = P - Shift; // shift for abovementioned enumeration return (P!=NULL); } void FreeVectorMemory ( rvector & V, word Shift ) { if (V!=NULL) { V = V + Shift; // back shift for the work of heap system delete[] V; V = NULL; } } void FreeVectorMemory ( ivector & I, word Shift ) { if (I!=NULL) { I = I + Shift; // back shift for the work of heap system delete[] I; I = NULL; } } void FreeVectorMemory ( wvector & W, word Shift ) { if (W!=NULL) { W = W + Shift; // back shift for the work of heap system delete[] W; W = NULL; } } void FreeVectorMemory ( bvector & B, word Shift ) { if (B!=NULL) { B = B + Shift; // back shift for the work of heap system delete[] B; B = NULL; } } void FreeVectorMemory ( lvector & L, word Shift ) { if (L!=NULL) { L = L + Shift; // back shift for the work of heap system delete[] L; L = NULL; } } void FreeVectorMemory ( lwvector & L, word Shift ) { if (L!=NULL) { L = L + Shift; // back shift for the work of heap system delete[] L; L = NULL; } } void FreeVectorMemory ( psvector & P, word Shift ) { if (P!=NULL) { P = P + Shift; // back shift for the work of heap system delete[] P; P = NULL; } } Boolean GetMatrixMemory ( rmatrix & A, word N, word M, word ShiftN, word ShiftM ) { A = new rvector[N]; if (A!=NULL) { for (word i=0;i=0) l = y; else l = -y; while (m++=0) return B; else return 1.0/B; } else return 0.0; } realtype Pow1 ( realtype X, realtype Y ) { int k = mround(Y); if (fabs(k-Y)<=100.0*MachEps) return Pow(X,k); if (X==0.0) return 0.0; else return pow(X,Y); } realtype Exp ( realtype X ) { //realtype X1 = X; //realtype B = 1.0; if (X>=LnMaxRealExp) return MaxReal; else if (X<=LnMinRealExp) return 0.0; else { return exp(X); /* while (X1>LnMaxReal) { X1 -= LnMaxReal; B *= MaxExponent; } while (X1<-LnMaxReal) { X1 += LnMaxReal; B /= MaxExponent; } return B*exp(X1); */ } } Boolean Odd ( int i ) { return (i & 1); } // ---------------------------------------------------- long HexValL ( cpstr S ) { char C; int i; long z=0; for (i=0;S[i];i++) { z <<= 4; C = (char)toupper(S[i]); if (isdigit(C)) z += S[i]-'0'; else z += C-'A'+10; } return z; } // ---------------------------------------------------- long OctValL ( cpstr S ) { int i; long z=0; for (i=0;S[i];i++) { z <<= 3; z += S[i]-'0'; } return z; } // ---------------------------------------------------- long BinValL ( cpstr S ) { int i; long z=0; for (i=0;S[i];i++) { z <<= 1; z += S[i]-'0'; } return z; } pstr BinValS ( long L, pstr S ) { int i; long z; z = long(1) << (8*sizeof(long)-1); for (i=0;i<8*(int)sizeof(long);i++) { if (L & z) S[i] = '1'; else S[i] = '0'; z >>= 1; } S[8*sizeof(long)] = char(0); return S; } // ---------------------------------------------------- pstr ParamStr ( pstr D, cpstr S, realtype V, int M, cpstr S1 ) { char VS[30]; strcat ( D,S ); sprintf ( VS,"%-.*g",M,V ); strcat ( D,VS ); return strcat(D,S1); } pstr ParamStr ( pstr D, cpstr S, realtype V, int M, cpstr S1, realtype V2, int M2, cpstr S2 ) { char VS[30]; ParamStr ( D,S,V,M,S1 ); sprintf ( VS,"%-.*g",M2,V2 ); strcat ( D,VS ); return strcat(D,S2); } pstr CreateCopy ( pstr & Dest, cpstr Source ) { if (Dest) delete[] Dest; if (Source) { Dest = new char[strlen(Source)+1]; strcpy ( Dest,Source ); } else Dest = NULL; return Dest; } pstr CreateCopy_n ( pstr & Dest, cpstr Source, int n ) { int l; if (Dest) delete[] Dest; if (Source) { l = IMin ( strlen(Source),n ); Dest = new char[l+1]; strncpy ( Dest,Source,l ); Dest[l] = char(0); } else Dest = NULL; return Dest; } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2,Source3,Source4,Source5 ); } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2,Source3,Source4 ); } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2,Source3 ); } pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2 ) { if (Dest) { delete[] Dest; Dest = NULL; } return CreateConcat ( Dest,Source1,Source2 ); } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (Source3) ls += strlen(Source3); if (Source4) ls += strlen(Source4); if (Source5) ls += strlen(Source5); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); if (Source3) strcat ( S,Source3 ); if (Source4) strcat ( S,Source4 ); if (Source5) strcat ( S,Source5 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (Source3) ls += strlen(Source3); if (Source4) ls += strlen(Source4); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); if (Source3) strcat ( S,Source3 ); if (Source4) strcat ( S,Source4 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (Source3) ls += strlen(Source3); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); if (Source3) strcat ( S,Source3 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2 ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; ls = 0; if (Source1) ls += strlen(Source1); if (Source2) ls += strlen(Source2); if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); if (Source1) strcat ( S,Source1 ); if (Source2) strcat ( S,Source2 ); Dest = S; } return Dest; } pstr CreateConcat ( pstr & Dest, cpstr Source ) { pstr S; int ld,ls; if (Dest) ld = strlen(Dest); else ld = 0; if (Source) ls = strlen(Source); else ls = 0; if (ls>0) { S = new char[ls+ld+1]; if (Dest) { strcpy ( S,Dest ); delete[] Dest; } else S[0] = char(0); strcat ( S,Source ); Dest = S; } return Dest; } pstr LastOccurence ( cpstr S, char c ) { pstr P=(pstr)S; pstr R=NULL; while (*P) { if (*P==c) R = P; P++; } return R; } pstr FirstOccurence ( cpstr S, char c ) { pstr P=(pstr)S; while (*P) { if (*P==c) return P; P++; } return NULL; } int indexOf ( cpstr S, char c ) { int i=0; while (S[i]) { if (S[i]==c) return i; i++; } return -1; } pstr FirstOccurence ( cpstr S, int Slen, cpstr Q, int Qlen ) { int i,j,k,l; l = Slen-Qlen; for (i=0;i<=l;i++) { j = 0; k = i; while (j=Qlen) return pstr(&(S[i])); } return NULL; } int indexOf ( cpstr S, int Slen, cpstr Q, int Qlen ) { int i,j,k,l; l = Slen-Qlen; for (i=0;i<=l;i++) { j = 0; k = i; while (j=Qlen) return i; } return -1; } pstr LowerCase ( pstr s ) { pstr p=s; while (*p) { *p = char(tolower(int(*p))); p++; } return s; } pstr UpperCase ( pstr s ) { pstr p=s; while (*p) { *p = char(toupper(int(*p))); p++; } return s; } void GetString ( pstr L, cpstr S, int M ) { // Copies first M characters of string S into string L, // appending the terminating null. If S contains less // then M characters, L will be padded with spaces. int i,j; i = 0; j = 0; while (S[i] && (i=SMax) || (!S[k])) { lm1 = IMin(n,lm1); while (k=SMax)) { lm1 = IMin(n,lm1); while (k=0) && (k>=0)) d[i--] = s[k--]; while (i>=0) d[i--] = ' '; } void strcpy_nr ( pstr d, cpstr s, int n ) { // Copies at most n symbols from string s to d, but // no more than strlen(s) (s must contain a terminating null). // The string in d is aligned to the right and added with // spaces at the left, if necessary. The terminating null // IS NEITHER appended NOR copied to d. int i,k; i = n-1; k = IMin(i,strlen(s)-1); while ((i>=0) && (k>=0)) d[i--] = s[k--]; while (i>=0) d[i--] = ' '; } void strcpy_ns ( pstr d, cpstr s, int n ) { // Copies at most n symbols from string s to d, but // no more than strlen(s) (s must contain a terminating // null). The terminating null IS NEITHER appended NOR // copied to d; rather, d is padded with spaces if // strlen(s)0) && (d[i]==' ')) i--; if (d[i]==' ') d[i] = char(0); else d[i+1] = char(0); return d; } pstr strcpy_ncs ( pstr d, cpstr s, int n ) { // Copies at most n characters from string s to string d // cutting all spaces at at the end. Thus, " abcde " will // be copied like " abc" at n=4 and like " abcde" at n>5 // (terminating null appended). // The function returns d. int i; i = 0; while (s[i] && (i0) && (d[i]==' ')) i--; if (d[i]==' ') d[i] = char(0); else d[i+1] = char(0); return d; } pstr strcpy_css ( pstr d, cpstr s ) { // Copies string s to string d cutting all spaces at // at the begining and at the end. Thus, " ab c de " // will be copied like "ab c de" (terminating null // appended). // The function returns d. int i,k; i = 0; while (s[i]==' ') i++; k = 0; while (s[i]) d[k++] = s[i++]; if (k>0) { k--; while ((k>0) && (d[k]==' ')) k--; if (d[k]==' ') d[k] = char(0); else d[k+1] = char(0); } else d[k] = char(0); return d; } pstr strcpy_ncss ( pstr d, cpstr s, int n ) { // Copies at most n characters from string s to string d cutting // all spaces at the begining and at the end. Thus, " ab c de " // will be copied like "ab" at n=3 (terminating null appended). // The function returns d. int i,k; i = 0; while ((s[i]==' ') && (i0) { k--; while ((k>0) && (d[k]==' ')) k--; if (d[k]==' ') d[k] = char(0); else d[k+1] = char(0); } else d[k] = char(0); return d; } pstr strcpy_n0 ( pstr d, cpstr s, int n ) { // Copies at most n symbols from string s to d, but // no more than strlen(s) (s must contain a terminating // null). The terminating null IS appended to d. // The function returns d. int i; i = 0; while ((i0)) { k--; while ((k>0) && (S[k]==' ')) k--; if (S[k]!=' ') k++; } S[k] = char(0); return S; } pstr DelSpaces ( pstr S, char c ) { // Removes all spaces (or other symbols as specified by 'c') // from the string. The string is then shrinked by the number // of removed characters. Thus, " as ttt " becomes "asttt". int i,j; j = 0; for (i=0;S[i];i++) if (S[i]!=c) { if (j=0;j--) { n = (I >> sh) & 0xFF; iUB[j] = byte(n); sh -= 8; } } void short2UniBin ( short S, shortUniBin sUB ) { int j,sh; short n; sh = 8*(sizeof(shortUniBin)-1); for (j=sizeof(shortUniBin)-1;j>=0;j--) { n = (S >> sh) & 0xFF; sUB[j] = byte(n); sh -= 8; } } void long2UniBin ( long L, longUniBin lUB ) { int j,sh; long n; sh = 8*(sizeof(longUniBin)-1); for (j=sizeof(longUniBin)-1;j>=0;j--) { n = (L >> sh) & 0xFF; lUB[j] = byte(n); sh -= 8; } } void word2UniBin ( word W, wordUniBin wUB ) { int j,sh; word n; sh = 8*(sizeof(wordUniBin)-1); for (j=sizeof(wordUniBin)-1;j>=0;j--) { n = (W >> sh) & 0xFF; wUB[j] = byte(n); sh -= 8; } } void real2UniBin ( realtype R, realUniBin rUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower8; rUB[0] = byte(k2); for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); rUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) rUB[1] |= _fsign; } void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower4; srUB[0] = byte(k2); for (k=sizeof(shortrealUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); srUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) srUB[1] |= _fsign; } void float2UniBin ( realtype R, floatUniBin fUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower4; fUB[0] = byte(k2); for (k=sizeof(floatUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); fUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) fUB[1] |= _fsign; } /* void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower8; srUB[0] = byte(k2); for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); if (k<=(int)sizeof(shortrealUniBin)) srUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) srUB[1] |= _fsign; } void float2UniBin ( realtype R, floatUniBin fUB ) { int k1,k2,k; realtype Q,L; if (R>=0) Q = R; else Q = -R; k1 = 0; k2 = _nfPowers; do { k = (k1+k2)/2; if (Q>=_fpower[k]) k1 = k; else k2 = k; } while (k2>k1+1); if (Q<=_fpower[0]) k2 = 0; Q = (Q/_fpower[k2])*_fpower8; fUB[0] = byte(k2); for (k=sizeof(realUniBin)-1;k>0;k--) { L = floor(Q/_rfbase); if (k<=(int)sizeof(floatUniBin)) fUB[k] = byte(int(Q-L*_rfbase)); Q = L; } if (R<0) fUB[1] |= _fsign; } */ void UniBin2int ( intUniBin iUB, int & I ) { int j,n,sh; sh = 8*sizeof(intUniBin); I = 0x00; for (j=sizeof(intUniBin)-1;j>=0;j--) { sh -= 8; n = byte(iUB[j]); I = I | (n << sh); } } void UniBin2short ( shortUniBin sUB, short & S ) { int j,sh; short n; sh = 8*sizeof(shortUniBin); S = 0x00; for (j=sizeof(shortUniBin)-1;j>=0;j--) { sh -= 8; n = byte(sUB[j]); S = S | (n << sh); } } void UniBin2long ( longUniBin lUB, long & L ) { int j,sh; long n; sh = 8*sizeof(longUniBin); L = 0x00; for (j=sizeof(longUniBin)-1;j>=0;j--) { sh -= 8; n = byte(lUB[j]); L = L | (n << sh); } } void UniBin2word ( wordUniBin wUB, word & W ) { int j,sh; word n; sh = 8*sizeof(wordUniBin); W = 0x00; for (j=sizeof(wordUniBin)-1;j>=0;j--) { sh -= 8; n = byte(wUB[j]); W = W | (n << sh); } } void UniBin2real ( realUniBin rUB, realtype & R ) { int j,s; if (rUB[1] & _fsign) { s = 1; rUB[1] &= _fsign1; } else s = 0; R = int(rUB[1]); for (j=2;j<(int)sizeof(realUniBin);j++) R = R*_rfbase + int(rUB[j]); R = (R/_fpower8)*_fpower[int(rUB[0])]; if (s) R = -R; } void UniBin2shortreal ( shortrealUniBin srUB, shortreal & R ) { int j,s; if (srUB[1] & _fsign) { s = 1; srUB[1] &= _fsign1; } else s = 0; R = int(srUB[1]); for (j=2;j<(int)sizeof(shortrealUniBin);j++) R = R*_rfbase + int(srUB[j]); R = (R/_fpower4)*_fpower[int(srUB[0])]; if (s) R = -R; } void UniBin2float ( floatUniBin fUB, realtype & R ) { int j,s; if (fUB[1] & _fsign) { s = 1; fUB[1] &= _fsign1; } else s = 0; R = int(fUB[1]); for (j=2;j<(int)sizeof(floatUniBin);j++) R = R*_rfbase + int(fUB[j]); R = (R/_fpower4)*_fpower[int(fUB[0])]; if (s) R = -R; } /* void UniBin2shortreal ( shortrealUniBin srUB, shortreal & R ) { int j,s; if (srUB[1] & _fsign) { s = 1; srUB[1] &= _fsign1; } else s = 0; R = int(srUB[1]); for (j=2;j<(int)sizeof(shortrealUniBin);j++) R = R*_rfbase + int(srUB[j]); for (j=sizeof(shortrealUniBin);j<(int)sizeof(realUniBin);j++) R *= _rfbase; R = (R/_fpower8)*_fpower[int(srUB[0])]; if (s) R = -R; } void UniBin2float ( floatUniBin fUB, realtype & R ) { int j,s; if (fUB[1] & _fsign) { s = 1; fUB[1] &= _fsign1; } else s = 0; R = int(fUB[1]); for (j=2;j<(int)sizeof(floatUniBin);j++) R = R*_rfbase + int(fUB[j]); for (j=sizeof(floatUniBin);j<(int)sizeof(realUniBin);j++) R *= _rfbase; R = (R/_fpower8)*_fpower[int(fUB[0])]; if (s) R = -R; } */ void mem_write ( int I, pstr S, int & l ) { intUniBin iUB; int2UniBin ( I,iUB ); memcpy ( &(S[l]),iUB,sizeof(intUniBin) ); l += sizeof(intUniBin); S[l] = char(0); } void mem_write ( short I, pstr S, int & l ) { shortUniBin sUB; short2UniBin ( I,sUB ); memcpy ( &(S[l]),sUB,sizeof(shortUniBin) ); l += sizeof(shortUniBin); S[l] = char(0); } void mem_write ( long I, pstr S, int & l ) { longUniBin lUB; long2UniBin ( I,lUB ); memcpy ( &(S[l]),lUB,sizeof(longUniBin) ); l += sizeof(longUniBin); S[l] = char(0); } void mem_write ( word W, pstr S, int & l ) { wordUniBin wUB; word2UniBin ( W,wUB ); memcpy ( &(S[l]),wUB,sizeof(wordUniBin) ); l += sizeof(wordUniBin); S[l] = char(0); } void mem_write ( realtype R, pstr S, int & l ) { realUniBin rUB; real2UniBin ( R,rUB ); memcpy ( &(S[l]),rUB,sizeof(realUniBin) ); l += sizeof(realUniBin); S[l] = char(0); } void mem_write ( shortreal R, pstr S, int & l ) { shortrealUniBin srUB; shortreal2UniBin ( R,srUB ); memcpy ( &(S[l]),srUB,sizeof(shortrealUniBin) ); l += sizeof(shortrealUniBin); S[l] = char(0); } void mem_write ( pstr L, int len, pstr S, int & l ) { memcpy ( &(S[l]),L,len ); l += len; S[l] = char(0); } void mem_write ( pstr L, pstr S, int & l ) { int len; if (L) len = strlen(L); else len = 0; mem_write ( len,S,l ); if (len>0) { memcpy ( &(S[l]),L,len ); l += len; S[l] = char(0); } } void mem_write ( Boolean B, pstr S, int & l ) { if (B) S[l++] = 'Y'; else S[l++] = 'N'; S[l] = char(0); } void mem_read ( int & I, cpstr S, int & l ) { intUniBin iUB; memcpy ( iUB,&(S[l]),sizeof(intUniBin) ); l += sizeof(intUniBin); UniBin2int ( iUB,I ); } void mem_read ( short & I, cpstr S, int & l ) { shortUniBin sUB; memcpy ( sUB,&(S[l]),sizeof(shortUniBin) ); l += sizeof(shortUniBin); UniBin2short ( sUB,I ); } void mem_read ( long & I, cpstr S, int & l ) { longUniBin lUB; memcpy ( lUB,&(S[l]),sizeof(longUniBin) ); l += sizeof(longUniBin); UniBin2long ( lUB,I ); } void mem_read ( word & W, cpstr S, int & l ) { wordUniBin wUB; memcpy ( wUB,&(S[l]),sizeof(wordUniBin) ); l += sizeof(wordUniBin); UniBin2word ( wUB,W ); } void mem_read ( realtype & R, cpstr S, int & l ) { realUniBin rUB; memcpy ( rUB,&(S[l]),sizeof(realUniBin) ); l += sizeof(realUniBin); UniBin2real ( rUB,R ); } void mem_read ( shortreal & R, cpstr S, int & l ) { shortrealUniBin srUB; memcpy ( srUB,&(S[l]),sizeof(shortrealUniBin) ); l += sizeof(shortrealUniBin); UniBin2shortreal ( srUB,R ); } void mem_read ( pstr L, int len, cpstr S, int & l ) { memcpy ( L,&(S[l]),len ); l += len; } void mem_read ( pstr & L, cpstr S, int & l ) { int len; if (L) { delete[] L; L = NULL; } mem_read ( len,S,l ); if (len>0) { L = new char[len+1]; memcpy ( L,&(S[l]),len ); L[len] = char(0); l += len; } } void mem_read ( Boolean & B, cpstr S, int & l ) { B = (S[l]=='Y'); l++; } // ------------------------------------------------------- Boolean InitMatType() { MachEps = MachinEps(); floatMachEps = floatMachinEps(); LnMaxReal = log(fMaxReal); LnMinReal = log(fMinReal); LnMaxRealExp = LnMaxReal; LnMinRealExp = LnMinReal; InitFPowers(); return True; } /* =================================================== */ // *** end of mmdb-1.23.2.1/src/mmdb_atom.h0000644000175100017510000006703611475666363012534 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 15.07.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Atom // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CAtom ( atom class ) // ~~~~~~~~~ CResidue ( residue class ) // **** Functions : BondAngle // ~~~~~~~~~~~ // // Copyright (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MMDB_Atom__ #define __MMDB_Atom__ #ifndef __Stream__ #include "stream_.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_UDData__ #include "mmdb_uddata.h" #endif #ifndef __MMDB_Utils__ #include "mmdb_utils.h" #endif // ====================== CAtom ========================== // constants for the WhatIsSet field #define ASET_Coordinates 0x00000001 #define ASET_Occupancy 0x00000002 #define ASET_tempFactor 0x00000004 #define ASET_CoordSigma 0x00000010 #define ASET_OccSigma 0x00000020 #define ASET_tFacSigma 0x00000040 #define ASET_Anis_tFac 0x00000100 #define ASET_Anis_tFSigma 0x00001000 #define ASET_Charge 0x00000080 #define ASET_All 0x000FFFFF #define ATOM_NoSeqNum MinInt4 extern Boolean ignoreSegID; extern Boolean ignoreElement; extern Boolean ignoreCharge; extern Boolean ignoreNonCoorPDBErrors; extern Boolean ignoreUnmatch; DefineStructure(SAtomStat) struct SAtomStat { public : int nAtoms; // number of atoms in statistics realtype xmin,ymin,zmin; // minimums of coordinates realtype xmax,ymax,zmax; // maximums of coordinates realtype xm ,ym ,zm; // mediums of coordinates realtype xm2 ,ym2 ,zm2; // square mediums of coordinates realtype occ_min,occ_max; // minimum/maximum occupancy realtype occ_m ,occ_m2; // medium and square medium occupancy realtype tFmin,tFmax; // minimum/maximum temperature factor realtype tFm ,tFm2; // medium and sq. med. temp. factor realtype u11_min,u11_max; // minimums and realtype u22_min,u22_max; // maximums of realtype u33_min,u33_max; // anisotropic realtype u12_min,u12_max; // temperature realtype u13_min,u13_max; // factors realtype u23_min,u23_max; realtype u11_m,u11_m2; // mediums and realtype u22_m,u22_m2; // square mediums of realtype u33_m,u33_m2; // anisotropic realtype u12_m,u12_m2; // temperature realtype u13_m,u13_m2; // factors realtype u23_m,u23_m2; word WhatIsSet; // mask field void Init (); void Finish(); realtype GetMaxSize(); private : Boolean finished; }; DefineStructure(SAtomBondI) struct SAtomBondI { int index; // bonded atom index byte order; // bond order }; DefineStructure(SAtomBond) struct SAtomBond { PCAtom atom; // bonded atom pointer byte order; // bond order }; DefineFactoryFunctions(CAtom) class CAtom : public CUDData { friend class CResidue; friend class CModel; friend class CMMDBFile; friend class CMMDBCoorManager; friend class CMMDBSelManager; public : int serNum; // serial number AtomName name; // atom name (ALIGNED) AltLoc altLoc; // alternative location indicator ("" for none) PCResidue residue; // reference to residue realtype x,y,z; // orthogonal coordinates in angstroms realtype occupancy; // occupancy realtype tempFactor; // temperature factor SegID segID; // segment identifier Element element; // element symbol (ALIGNED) EnergyType energyType; // energy type (without spaces) realtype charge; // charge on the atom realtype sigX,sigY,sigZ; // standard deviations of the coords realtype sigOcc; // standard deviation of occupancy realtype sigTemp; // standard deviation of temp. factor realtype u11,u22,u33; // anisotropic temperature realtype u12,u13,u23; // factors realtype su11,su22,su33; // standard deviations of realtype su12,su13,su23; // anisotropic temperature factors Boolean Het; // indicator of het atom Boolean Ter; // chain terminator word WhatIsSet; // mask field // 0x0001 atomic coordinates // 0x0002 occupancy // 0x0004 temperature factor // 0x0010 coordinate standard deviations // 0x0020 deviation of occupancy // 0x0040 deviation of temperature factor // 0x0100 anisotropic temperature factors // 0x1000 anis. temp. fact-s st-d deviations CAtom (); CAtom ( PCResidue res ); CAtom ( RPCStream Object ); ~CAtom(); void SetResidue ( PCResidue res ); void PDBASCIIDump ( RCFile f ); void MakeCIF ( PCMMCIFData CIF ); // AddBond(...) adds a bond to the atom, that is a pointer // to the bonded atom and the bond order. nAdd_bonds allows // one to minimize the memory reallocations, if number of // bonds is known apriori: CAtom adds space for nAdd_bonds // if currently allocated space is exchausted. // Return: <=0 - error: bond_atom is already "bonded" // >0 - Ok, returns current number of bonds int AddBond ( PCAtom bond_atom, int bond_order, int nAdd_bonds=1 ); int GetNBonds(); // This GetBonds(..) returns pointer to the CAtom's // internal Bond structure, IT MUST NOT BE DISPOSED. void GetBonds ( RPSAtomBond AtomBond, int & nAtomBonds ); void FreeBonds(); // This GetBonds(..) disposes AtomBondI, if it was not set // to NULL, allocates AtomBondI[nAtomBonds] and returns its // pointer. AtomBondI MUST BE DISPOSED BY APPLICATION. void GetBonds ( RPSAtomBondI AtomBondI, int & nAtomBonds ); // This GetBonds(..) does not dispose or allocate AtomBondI. // It is assumed that length of AtomBondI is sufficient to // accomodate all bonded atoms. void GetBonds ( PSAtomBondI AtomBondI, int & nAtomBonds, int maxlength ); // ConvertPDBxxxxxx() gets data from the PDB ASCII xxxxxx // record (xxxxxx stands for ATOM, SIGATM, ANISOU, SIGUIJ, // TER or HETATM). // These functions DO NOT check the xxxxxx keyword and // do not decode the chain and residue parameters! These // must be treated by the calling process, see // CMMDBFile::ReadPDBAtom(). // The atom reference is updated in the corresponding // residue. int ConvertPDBATOM ( int ix, cpstr S ); int ConvertPDBSIGATM ( int ix, cpstr S ); int ConvertPDBANISOU ( int ix, cpstr S ); int ConvertPDBSIGUIJ ( int ix, cpstr S ); int ConvertPDBTER ( int ix, cpstr S ); int ConvertPDBHETATM ( int ix, cpstr S ); int GetCIF ( int ix, PCMMCIFLoop Loop, PCMMCIFLoop LoopAnis ); Boolean RestoreElementName(); Boolean MakePDBAtomName(); void SetAtomName ( int ix, // index int sN, // serial number const AtomName aName, // atom name const AltLoc aLoc, // alternative location const SegID sID, // segment ID const Element eName ); // element name // This only renames the atom void SetAtomName ( const AtomName atomName ); void SetElementName ( const Element elName ); void SetCharge ( cpstr chrg ); void SetCharge ( realtype chrg ); void SetAtomIndex ( int ix ); // don't use in your applications! void MakeTer(); // converts atom into 'ter' void SetCoordinates ( realtype xx, realtype yy, realtype zz, realtype occ, realtype tFac ); int GetModelNum(); pstr GetChainID (); pstr GetResName (); int GetAASimilarity ( const ResName resName ); int GetAASimilarity ( PCAtom A ); realtype GetAAHydropathy(); realtype GetOccupancy (); int GetSeqNum (); pstr GetInsCode (); int GetSSEType (); // works only after SSE calculations pstr GetAtomName () { return name; } pstr GetElementName() { return element; } pstr GetAtomCharge ( pstr chrg ); // GetChainCalphas(...) is a specialized function for quick // access to C-alphas of chain which includes given atom. // This function works faster than an equivalent implementation // through MMDB's selection procedures. // Parameters: // Calphas - array to accept pointers on C-alpha atoms // If Calphas!=NULL, then the function will // delete and re-allocate it. When the array // is no longer needed, the application MUST // delete it: delete[] Calphas; Deleting // Calphas does not delete atoms from MMDB. // nCalphas - integer to accept number of C-alpha atoms // and the length of Calphas array. // altLoc - alternative location indicator. By default // (""), maximum-occupancy locations are taken. void GetChainCalphas ( PPCAtom & Calphas, int & nCalphas, cpstr altLoc = "" ); Boolean isTer () { return Ter; } Boolean isMetal (); Boolean isSolvent (); // works only for atom in a residue! Boolean isInSelection ( int selHnd ); Boolean isNTerminus (); Boolean isCTerminus (); void CalcAtomStatistics ( RSAtomStat AS ); realtype GetDist2 ( PCAtom a ); realtype GetDist2 ( PCAtom a, mat44 & tm ); // tm applies to A realtype GetDist2 ( PCAtom a, mat33 & r, vect3 & t );// tm applies to A realtype GetDist2 ( realtype ax, realtype ay, realtype az ); // GetCosine(a1,a2) calculates cosine of angle a1-this-a2, // i.e. that between vectors [a1,this] and [this,a2]. realtype GetCosine ( PCAtom a1, PCAtom a2 ); PCResidue GetResidue (); PCChain GetChain (); PCModel GetModel (); int GetResidueNo(); void * GetCoordHierarchy(); // PCMMDBFile // GetAtomID(..) generates atom ID in the form // /m/c/r(rn).i/n[e]:a // where m - model number // c - chain ID // r - residue sequence number // rn - residue name // i - insertion code // n - atom name // e - chemical element specification // a - alternate location indicator // If any of the fields is undefined, it is replaced by // hyphen '-'. // No checks on the sufficiency of string buffer AtomID // is made. // GetAtomID returns AtomID. pstr GetAtomID ( pstr AtomID ); pstr GetAtomIDfmt ( pstr AtomID ); // ------- checking atom ID // CheckID(..) returns 1 if atom is identified, and 0 otherwise. // Parameters: // aname - atom name. It may or may not be aligned (as in // a PDB file), only first word of the name will // be taken ("CA", " CA" and " CA B" are all // considered as "CA"). aname may be set to NULL // or '*', then this parameter is ignored. // elname - element code. It will work only if element code // is supplied (which might not be the case if // the atom was created in a tricky way). elname // should be used to distinguih between, e.g. // "Ca" and "C_alpha"). elname may be set to NULL, // or '*', then this parameter is ignored. // aloc - the alternate location code. aloc may be set to // NULL or '*', then this parameter is ignored. // IMPORTANT: comparison is case-sensitive. // The atom is considered as identified, if all non-NULL // parameters do match. If all parameters are set NULL, any atom // is identified. // DEFAULT values correspond to 'any element' and // 'no alternate location code' // NOTE that " " is not an empty item. int CheckID ( const AtomName aname, const Element elname=NULL, const AltLoc aloc=pstr("") ); // CheckIDS(..) works exactly like CheckID(..), but it takes // the only parameter, the atom ID, which is of the form: // {name} {[element]} {:altcode} // Here {} means that the item may be omitted. Any item may be // represented by a wildcard '*', which means 'any value'. Just // absence of an item means 'empty', which makes sense only for // alternate location code. Missing name or element therefore // mean 'any name' or 'any element', correspondingly (same as a // wildcard). There should be no spaces in ID except for leading // spaces; any following space will terminate parsing. // The followings are perfectly valid IDs: // CA[C]:A (carbon C_alpha in location A) // CA[*]:A (either C_alpha or Ca in location A) // CA:A (same as above) // CA (either C_alpha or Ca with no location indicator) // CA[] (same as above) // CA[C]: (C_alpha with no location indicator) // [C] (any carbon with no location indicator) // [C]:* (any carbon with any location indicator) // *[C]:* (same as above) // :A (any atom in location A) // *[*]:A (same as above) // *[*]:* (any atom) // * (any atom with no alternate location indicator) int CheckIDS ( cpstr ID ); // ------- transform coordinates: x := m*x + v void Transform ( mat33 & tm, vect3 & v ); void Transform ( mat44 & tm ); void TransformCopy ( mat44 & tm, realtype & xx, realtype & yy, realtype & zz ); void TransformSet ( mat44 & tm, realtype xx, realtype yy, realtype zz ); // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); int GetIndex() { return index; } virtual void Copy ( PCAtom atom ); // without references in // residues void SetShortBinary(); // leaves only coordinates in binary files void write ( RCFile f ); void read ( RCFile f ); protected : int index; // index in the file int nBonds; // number of bonds in the lowest byte (!) PSAtomBond Bond; // atom bonds void InitAtom (); void FreeMemory (); void StandardPDBOut ( cpstr Record, pstr S ); void GetData ( cpstr S ); int CheckData ( cpstr S ); void GetStat ( realtype v, realtype & v_min, realtype & v_max, realtype & v_m, realtype & v_m2 ); void _setBonds ( PPCAtom A ); // used only in CResidue }; // ====================== CResidue ========================== #define ALF_NoAltCodes 0x00000000 #define ALF_EmptyAltLoc 0x00000001 #define ALF_NoEmptyAltLoc 0x00000002 #define ALF_Mess 0x00000004 #define ALF_Occupancy 0x00000008 #define SSE_None 0 #define SSE_Strand 1 #define SSE_Bulge 2 #define SSE_3Turn 3 #define SSE_4Turn 4 #define SSE_5Turn 5 #define SSE_Helix 6 DefineFactoryFunctions(CResidue) class CResidue : public CUDData { friend class CAtom; friend class CChain; friend class CMMDBFile; public : ResName name; // residue name - all spaces cut int seqNum; // residue sequence number InsCode insCode; // residue insertion code PCChain chain; // reference to chain int index; // index in the chain int nAtoms; // number of atoms in the residue PPCAtom atom; // array of atoms byte SSE; // SSE type CResidue (); CResidue ( PCChain Chain_Owner ); CResidue ( PCChain Chain_Owner, const ResName resName, int sqNum, const InsCode ins ); CResidue ( RPCStream Object ); ~CResidue(); void SetChain ( PCChain Chain_Owner ); void SetResID ( const ResName resName, int sqNum, const InsCode ins ); void SetChainID ( const ChainID chID ); void PDBASCIIAtomDump ( RCFile f ); void MakeAtomCIF ( PCMMCIFData CIF ); PCChain GetChain(); PCModel GetModel(); int GetModelNum (); pstr GetChainID (); pstr GetResName (); int GetAASimilarity ( const ResName resName ); int GetAASimilarity ( PCResidue res ); realtype GetAAHydropathy(); void SetResName ( const ResName resName ); int GetSeqNum (); pstr GetInsCode (); int GetResidueNo(); int GetCenter ( realtype & x, realtype & y, realtype & z ); void * GetCoordHierarchy(); // PCMMDBFile void GetAtomStatistics ( RSAtomStat AS ); void CalcAtomStatistics ( RSAtomStat AS ); pstr GetResidueID ( pstr ResidueID ); // GetAltLocations(..) returns the number of different // alternative locations in nAltLocs, the locations themselves // - in aLoc and the corresponding occupancies - in occupancy. // aLoc and occupancy are allocated dynamically; it is // responsibility of the application to deallocate aLoc prior // calling GetAltLocations(..) if they were previously allocated. // Either, the application is responsible for deallocating aLoc and // occupancy after use. // occupancy[i] may return -1.0 if occupancies were not read // from coordinate file. // alflag returns ALF_NoAltCodes if no alt codes was found, // otherwise the output is decoded according to bits: // ALF_EmptyAltLoc alternative locations include the // "no alt loc indicator" ("" for // CAtom::altLoc). // This means that each atom that has alt locs // different of "", also includes one marked as // "". // ALF_NoEmptyAltLoc alternative locations do not include the // "no alt loc indicator" ("" for // CAtom::altLoc). // This means that each atom has either "" // alt loc or at least two alt locs different // of "". // ALF_Mess incorrect residue: it mixes both // ""-including and not-""-including schemes // ALF_Occupancy warning that sum of occupancies for alt // located atoms differ from 1.0 by more // than 0.01. void GetAltLocations ( int & nAltLocs, PAltLoc & aLoc, rvector & occupancy, int & alflag ); int GetNofAltLocations(); Boolean isAminoacid (); Boolean isNucleotide (); int isDNARNA (); // 0(neither),1(DNA),2(RNA) Boolean isSugar (); Boolean isSolvent (); Boolean isModRes (); Boolean isInSelection ( int selHnd ); Boolean isNTerminus (); Boolean isCTerminus (); // ------- checking residue ID // CheckID(..) returns 1 if residue is identified, and 0 otherwise. // Parameters: // sname - pointer to sequence number; if NULL then ignored. // inscode - insertion code; if NULL or '*' then ignored. // resname - residue name; if NULL or '*' then ignored. // IMPORTANT: comparison is case-sensitive. // The residue is considered as identified, if all non-NULL // parameters do match. If all parameters are set NULL, any // residue is identified. // DEFAULT values correspond to 'any residue name' and // 'no insertion code' // NOTE that " " is not an empty item. int CheckID ( int * snum, const InsCode inscode=pstr(""), const ResName resname=NULL ); // CheckIDS(..) works exactly like CheckID(..), but it takes // the only parameter, the residue ID, which is of the form: // {seqnum} {(name)} {.inscode} // Here {} means that the item may be omitted. Any item may be // represented by a wildcard '*', which means 'any value'. Just // absence of a value means 'empty', which is meaningful only for // the insertion code. Missing sequence number or residue name // therefore mean 'any sequence number' or 'any residue name', // correspondingly (same as a wildcard). There should be no // spaces in ID except for leading spaces; any following space will // terminate parsing. The followings are perfectly valid IDs: // 27(ALA).A (residue 27A ALA) // 27().A (residue 27A) // 27(*).A (same as above) // 27.A (same as above) // 27 (residue 27) // 27(). (same as above) // (ALA) (any ALA without insertion code) // (ALA). (same as above) // (ALA).* (any ALA) // *(ALA).* (any ALA) // .A (any residue with insertion code A) // *(*).A (same as above) // *(*).* (any residue) // * (any residue with no insertion code) int CheckIDS ( cpstr ID ); // -------------------- Extracting atoms ---------------------- int GetNumberOfAtoms (); int GetNumberOfAtoms ( Boolean countTers ); PCAtom GetAtom ( const AtomName aname, const Element elname=NULL, const AltLoc aloc=cpstr("") ); PCAtom GetAtom ( int atomNo ); void GetAtomTable ( PPCAtom & atomTable, int & NumberOfAtoms ); // GetAtomTable1(..) returns atom table without TER atoms and // without NULL atom pointers. NumberOfAtoms returns the actual // number of atom pointers in atomTable. // atomTable is allocated withing the function. If it was // not set to NULL before calling the function, the latter will // attempt to deallocate it first. // The application is responsible for deleting atomTable, // however it must not touch atom pointers, i.e. use simply // "delete[] atomTable;". Never pass atomTable from GetAtomTable() // into this function, unless you set it to NULL before doing that. void GetAtomTable1 ( PPCAtom & atomTable, int & NumberOfAtoms ); // --------------------- Deleting atoms ----------------------- int DeleteAtom ( const AtomName aname, const Element elname=NULL, const AltLoc aloc=cpstr("") ); int DeleteAtom ( int atomNo ); int DeleteAllAtoms(); // DeleteAltLocs() leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted atoms. The atom // table remains untrimmed, so that nAtoms are wrong until that // is done. Tables are trimmed by FinishStructEdit() or // explicitely. int DeleteAltLocs (); void TrimAtomTable (); // ---------------------- Adding atoms ------------------------ // AddAtom(..) adds atom to the residue. If residue is associated // with a coordinate hierarchy, and atom 'atm' is not, the latter // is checked in automatically. If atom 'atm' belongs to any // coordinate hierarchy (even though that of the residue), it is // *copied* rather than simply taken over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. int AddAtom ( PCAtom atm ); // InsertAtom(..) inserts atom into the specified position of // the residue. If residue is associated with a coordinate // hierarchy, and atom 'atm' is not, the latter is checked in // automatically. If atom 'atm' belongs to any coordinate // hierarchy (even though that of the residue), it is *copied* // rather than simply taken over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. int InsertAtom ( PCAtom atm, int position ); // This version inserts before the atom with given name. If such // name is not found, the atom is appended to the end. int InsertAtom ( PCAtom atm, const AtomName aname ); // -------------------------------------------------------------- void ApplyTransform ( mat44 & TMatrix ); // transforms all // coordinates by // multiplying with // matrix TMatrix void MaskAtoms ( PCMask Mask ); void UnmaskAtoms ( PCMask Mask ); // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); Boolean isMainchainHBond ( PCResidue res ); void Copy ( PCResidue res ); void write ( RCFile f ); void read ( RCFile f ); protected : int AtmLen; // length of atom array Boolean Exclude; // used internally void InitResidue (); void FreeMemory (); int _AddAtom ( PCAtom atm ); int _ExcludeAtom ( int kndex ); // 1: residue gets empty, // 0 otherwise void _copy ( PCResidue res ); void _copy ( PCResidue res, PPCAtom atm, int & atom_index ); void ExpandAtomArray ( int nAdd ); void CheckInAtoms (); }; extern realtype BondAngle ( PCAtom A, PCAtom B, PCAtom C ); #endif mmdb-1.23.2.1/src/mmdb_bondmngr.h0000644000175100017510000000411311475666363013365 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 17.11.00 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_bondmngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBBondManager ( MMDB bonds maker ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_BondMngr__ #define __MMDB_BondMngr__ #ifndef __MMDB_SelMngr__ #include "mmdb_selmngr.h" #endif // ======================= CMMDBBondManager ======================= DefineClass(CMMDBBondManager) DefineStreamFunctions(CMMDBBondManager) class CMMDBBondManager : public CMMDBSelManager { public : CMMDBBondManager (); CMMDBBondManager ( RPCStream Object ); ~CMMDBBondManager(); void MakeBonds ( Boolean calc_only ); void RemoveBonds(); protected : void write ( RCFile f ); void read ( RCFile f ); }; #endif mmdb-1.23.2.1/src/mmdb_title.h0000644000175100017510000004153611475666364012713 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Title // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CTitleContainer (container of title classes) // ~~~~~~~~~ CObsLine // CTitleLine // CCaveat // CCompound // CSource // CKeyWords // CExpData // CAuthor // CRevData // CSupersede // CJournal // CRemark // CBiomolecule // CMMDBTitle ( MMDB title section ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MMDB_Title__ #define __MMDB_Title__ #ifndef __Stream__ #include "stream_.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_Utils__ #include "mmdb_utils.h" #endif #ifndef __MMDB_MMCIF__ #include "mmdb_mmcif.h" #endif // ==================== CTitleContainer ====================== DefineClass(CTitleContainer) DefineStreamFunctions(CTitleContainer) class CTitleContainer : public CClassContainer { public : CTitleContainer () : CClassContainer() {} CTitleContainer ( RPCStream Object ) : CClassContainer ( Object ) {} ~CTitleContainer () {} PCContainerClass MakeContainerClass ( int ClassID ); }; // ================== CObsLine ======================== DefineClass(CObsLine) DefineStreamFunctions(CObsLine) class CObsLine : public CContainerClass { public : Date repDate; // date of replacement IDCode idCode; // ID code of replaced entry IDCode rIdCode[8]; // ID codes of entries that replaced this one CObsLine (); CObsLine ( cpstr S ); CObsLine ( RPCStream Object ); ~CObsLine(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_ObsLine; } void Copy ( PCContainerClass ObsLine ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitObsLine(); }; // ==================== CTitleLine ===================== DefineClass(CTitleLine) DefineStreamFunctions(CTitleLine) class CTitleLine : public CContString { public : CTitleLine (); CTitleLine ( cpstr S ); CTitleLine ( RPCStream Object ); ~CTitleLine(); int ConvertPDBASCII ( cpstr S ); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile ) { return False; } int GetClassID () { return ClassID_TitleLine; } // void GetCIF ( PCMMCIFData CIF, int & Signal ); // void MakeCIF ( PCMMCIFData CIF, int N ); // void Copy ( PCContainerClass TitleLine ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitTitleLine(); }; // ==================== CCaveat ===================== DefineClass(CCaveat) DefineStreamFunctions(CCaveat) class CCaveat : public CContString { public : IDCode idCode; // ID code of the entry CCaveat (); CCaveat ( cpstr S ); CCaveat ( RPCStream Object ); ~CCaveat(); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile ) { return False; } void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_CAVEAT; } void Copy ( PCContainerClass Caveat ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitCaveat(); }; // ==================== CCompound ===================== DefineClass(CCompound) DefineStreamFunctions(CCompound) class CCompound : public CContString { public : CCompound (); CCompound ( cpstr S ); CCompound ( RPCStream Object ); ~CCompound(); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile ) { return False; } int ConvertPDBASCII ( cpstr S ); int GetClassID () { return ClassID_Compound; } // void GetCIF ( PCMMCIFData CIF, int & Signal ); // void MakeCIF ( PCMMCIFData CIF, int N ); // void Copy ( PCContainerClass Compound ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitCompound(); }; // ==================== CSource ===================== DefineClass(CSource) DefineStreamFunctions(CSource) class CSource : public CContString { public : CSource (); CSource ( cpstr S ); CSource ( RPCStream Object ); ~CSource(); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile ) { return False; } int ConvertPDBASCII ( cpstr S ); int GetClassID () { return ClassID_Source; } // void GetCIF ( PCMMCIFData CIF, int & Signal ); // void MakeCIF ( PCMMCIFData CIF, int N ); // void Copy ( PCContainerClass Source ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitSource(); }; // ==================== CKeyWords ===================== DefineClass(CKeyWords) DefineStreamFunctions(CKeyWords) class CKeyWords : public CStream { public : int nKeyWords; // number of key words psvector KeyWord; // key word array CKeyWords (); CKeyWords ( cpstr S ); CKeyWords ( RPCStream Object ); ~CKeyWords(); void Delete (); void PDBASCIIDump ( RCFile f ); void MakeCIF ( PCMMCIFData CIF ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF ); void Copy ( PCKeyWords KeyWords ); void write ( RCFile f ); void read ( RCFile f ); protected : Boolean Cont; void Init(); }; // ==================== CExpData ===================== DefineClass(CExpData) DefineStreamFunctions(CExpData) class CExpData : public CContString { public : CExpData (); CExpData ( cpstr S ); CExpData ( RPCStream Object ); ~CExpData(); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile ) { return False; } int ConvertPDBASCII ( cpstr S ); int GetClassID () { return ClassID_ExpData; } // void GetCIF ( PCMMCIFData CIF, int & Signal ); // void MakeCIF ( PCMMCIFData CIF, int N ); // void Copy ( PCContainerClass ExpData ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitExpData(); }; // ==================== CAuthor ===================== DefineClass(CAuthor) DefineStreamFunctions(CAuthor) class CAuthor : public CContString { public : CAuthor (); CAuthor ( cpstr S ); CAuthor ( RPCStream Object ); ~CAuthor(); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile ) { return False; } int ConvertPDBASCII ( cpstr S ); int GetClassID () { return ClassID_Author; } // void GetCIF ( PCMMCIFData CIF, int & Signal ); // void MakeCIF ( PCMMCIFData CIF, int N ); // void Copy ( PCContainerClass Author ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitAuthor(); }; // ==================== CRevData ===================== DefineClass(CRevData) DefineStreamFunctions(CRevData) #define REVDAT_WARN_MODNUM 0x00000001 #define REVDAT_WARN_MODTYPE 0x00000002 class CRevData : public CContainerClass { public : int modNum; Date modDate; char modId[13]; int modType; RecName record[4]; word Warning; CRevData (); CRevData ( cpstr S ); CRevData ( RPCStream Object ); ~CRevData(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_RevData; } void Copy ( PCContainerClass RevData ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitRevData(); }; // ================== CSupersede ======================== DefineClass(CSupersede) DefineStreamFunctions(CSupersede) class CSupersede : public CContainerClass { public : Date sprsdeDate; // date of supersede IDCode idCode; // ID code of the entry IDCode sIdCode[8]; // ID codes of superseded entries CSupersede (); CSupersede ( cpstr S ); CSupersede ( RPCStream Object ); ~CSupersede(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_Supersede; } void Copy ( PCContainerClass Supersede ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitSupersede(); }; // ==================== CJournal ===================== DefineClass(CJournal) DefineStreamFunctions(CJournal) class CJournal : public CContString { public : CJournal (); CJournal ( cpstr S ); CJournal ( RPCStream Object ); ~CJournal(); void PDBASCIIDump ( pstr S, int N ); Boolean PDBASCIIDump1 ( RCFile ) { return False; } int ConvertPDBASCII ( cpstr S ); int GetClassID () { return ClassID_Journal; } // void GetCIF ( PCMMCIFData CIF, int & Signal ); // void MakeCIF ( PCMMCIFData CIF, int N ); // void Copy ( PCContainerClass Journal ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitJournal(); }; // ==================== CRemark ===================== DefineClass(CRemark) DefineStreamFunctions(CRemark) class CRemark : public CContainerClass { public : int remarkNum; // remark id pstr Remark; // remark line CRemark (); CRemark ( cpstr S ); CRemark ( RPCStream Object ); ~CRemark(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_Remark; } void Copy ( PCContainerClass RemarkClass ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitRemark(); }; // ================= CBiomolecule ===================== DefineClass(CBMApply) DefineStreamFunctions(CBMApply) class CBMApply : public CStream { public : PChainID chain; int nChains; pmat44 tm; int nMatrices; CBMApply (); CBMApply ( RPCStream Object ); ~CBMApply(); void FreeMemory(); int addChains ( int & i, RPCRemark rem, RCTitleContainer Remark ); int addMatrices ( int & i, RPCRemark rem, RCTitleContainer Remark ); void Copy ( PCBMApply BMA ); // if BMA is NULL, then empties // the class void write ( RCFile f ); void read ( RCFile f ); protected : void InitBMApply(); }; DefineClass(CBiomolecule) DefineStreamFunctions(CBiomolecule) class CBiomolecule : public CStream { public : PPCBMApply BMApply; int nBMAs; CBiomolecule (); CBiomolecule ( RPCStream Object ); ~CBiomolecule(); void FreeMemory(); PCBMApply addBMApply(); int Size(); Boolean checkComposition ( PChainID chID, ivector occ, ivector wocc, int n ); void Copy ( PCBiomolecule B ); // if B is NULL, then empties // the class void write ( RCFile f ); void read ( RCFile f ); protected : void InitBiomolecule(); }; // ================= CMMDBTitle ======================= DefineClass(CMMDBTitle) DefineStreamFunctions(CMMDBTitle) class CMMDBTitle : public CStream { friend class CModel; friend class CChain; friend class CMMDBFile; public : CMMDBTitle (); CMMDBTitle ( RPCStream Object ); ~CMMDBTitle(); void FreeMemory ( Boolean keepBiomolecules ); // Fills the PDB file header void SetHeader ( cpstr Classification, // any length is Ok cpstr DepDate, // DD-MMM-YYYY cpstr ID_Code ); // not more than 11 chars // Interprets the ASCII PDB line belonging to the title section // and fills the corresponding fields. // Returns zero if the line was converted, otherwise returns a // non-negative value of Error_XXXX. // PDBString must be not shorter than 81 characters. int ConvertPDBString ( pstr PDBString ); // MakePDBString() makes the ASCII PDB HEADER line from the // class data. PDBString must be not shorter than 81 characters. void MakePDBHeaderString ( pstr PDBString ); // GetStructureTitle() returns the contents of TITLE record // unfolded into single line. If Title is missing, returns // contents of COMPND(:MOLECULE). If COMPND is missing, returns // HEADER. If Header is missing, returns PDB code. If no PDB // code is there, returns "Not available". pstr GetStructureTitle ( pstr & S ); PCTitleContainer GetRemarks(); realtype GetResolution(); // -1.0 mean no resolution record in file int ParseBiomolecules(); // returns the number of biomolecules, // -2 for general format error // -3 for errors in BIOMT records int GetNofBiomolecules(); void GetBiomolecules ( PPCBiomolecule & BM, int & nBMs ); PCBiomolecule GetBiomolecule ( int bmNo ); // bmno=0,1,.. // returns NULL if bmNo is incorrect void PDBASCIIDump ( RCFile f ); void MakeCIF ( PCMMCIFData CIF ); // GetCIF(..) returns the same code as ConvertPDBString(..) // save for Error_WrongSection int GetCIF ( PCMMCIFData CIF ); pstr GetIDCode() { return idCode; } Boolean GetCol73() { return col73; } void TrimInput ( pstr PDBString ); void Copy ( PCMMDBTitle TS ); // if TS is NULL, then empties // the class void write ( RCFile f ); // writes header to PDB binary file void read ( RCFile f ); // reads header from PDB binary file protected : // Header data pstr classification; // classification of the molecule Date depDate; // deposition date DD-MMM-YYYY IDCode idCode; // unique PDB identifier realtype resolution; // resolution Boolean col73; // True if columns 73-80 contain PDB ID CTitleContainer ObsData; // obsoletion data CTitleContainer Title; // title data CTitleContainer CAVEAT; // error data CTitleContainer Compound; // compound data CTitleContainer Source; // source CKeyWords KeyWords; // key words CTitleContainer ExpData; // experimental data CTitleContainer Author; // author data CTitleContainer RevData; // revision data CTitleContainer Supersede; // supersede records CTitleContainer Journal; // journal records CTitleContainer Remark; // remark records PPCBiomolecule Biomolecule; int nBiomolecules; void Init(); void FreeBiomolecules(); PCBiomolecule addBiomolecule(); }; extern void TestHeader(); extern void TestTitle (); // reads PDB title from file 'in.title' // and rewrites it into 'out.title' and // 'abin.title' #endif mmdb-1.23.2.1/src/stream_.cpp0000644000175100017510000000676411475665502012555 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : CStream_ // ~~~~~~~~~ // **** Classes : CStream ( Basic Stream Class ) // ~~~~~~~~~ // // (C) E. Krissinel 1995-2010 // // ================================================================= // #ifndef __Stream__ #include "stream_.h" #endif // ========================== CStream =========================== // Each streamable class should be derived from CStream // and have constructor CClass(PCStream & Object), which should // initialize all memory of the class, and virtual functions // read(..) and write(..) (see below). Constructor CClass(PCStream&) // must not touch the Object variable. This constructor is used // only once just before read(..) function. It is assumed that // read/write functions of CClass provide storage/reading of // all vital data. Function read(..) must read data in exactly // the same way as function write(..) stores it. // For using CClass in streams, three following functions should // be supplied: // // 1. // void StreamWrite ( RCFile f, RPCClass Object ) { // StreamWrite ( f,(PCStream)PCClass ); // } // // 2. // PCStream CClassInit ( RPCStream Object ) { // return (PCStream)(new CClass(Object)); // } // // 3. // void StreamRead ( RCFile f, RPCClass Object ) { // StreamRead_ ( f,(PCStream)Object,CClassInit ); // } // // All these functions are automatically generated by macros // DefineStreamFunctions(CClass) -- in the header -- and // MakeStreamFunctions(CClass) -- in the implementation body. // Then CClass may be streamed in/out using functions #1 and #3. // StreamRead will return NULL for Object if it was not // in the stream. If Object existed before StreamRead(..) but // was not found in the stream, it will be disposed. void StreamRead_ ( RCFile f, RPCStream Object, InitStreamObject Init ) { int i; f.ReadInt ( &i ); if (i) { if (!Object) Object = Init(Object); //Object = new CStream ( Object ); Object->read ( f ); } else { if (Object) delete Object; Object = NULL; } } void StreamWrite_ ( RCFile f, RPCStream Object ) { int i; if (Object) { i = 1; f.WriteInt ( &i ); Object->write ( f ); } else { i = 0; f.WriteInt ( &i ); } } MakeStreamFunctions(CStream) mmdb-1.23.2.1/src/mmdb_file.cpp0000644000175100017510000024277011476200557013034 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_File // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBFile ( macromolecular data file class ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include "string.h" #endif #ifndef __STDLIB_H #include "stdlib.h" #endif #ifndef __MMDB_File__ #include "mmdb_file.h" #endif #ifndef __MMDB_Atom__ #include "mmdb_atom.h" #endif #ifndef __MMDB_MMCIF__ #include "mmdb_mmcif.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_CIFDefs__ #include "mmdb_cifdefs.h" #endif #ifndef __MMDB_Tables__ #include "mmdb_tables.h" #endif // ===================== CMMDBFile ======================= CMMDBFile::CMMDBFile() : CUDData() { InitMMDBFile(); } CMMDBFile::CMMDBFile ( RPCStream Object ) : CUDData(Object) { InitMMDBFile(); } CMMDBFile::~CMMDBFile() { FreeFileMemory(); } void CMMDBFile::InitMMDBFile() { nModels = 0; Model = NULL; nAtoms = 0; AtmLen = 0; Atom = NULL; CIF = NULL; crModel = NULL; crChain = NULL; crRes = NULL; lcount = 0; strcpy ( S,"" ); Flags = 0x00000000; // no special effects FType = MMDB_FILE_Undefined; // undefined file operation Exclude = True; ignoreRemarks = False; // used temporarily allowDuplChID = False; // used temporarily enforceUniqueChID = False; // used temporarily modelCnt = 0; // used only at reading files } void CMMDBFile::FreeCoordMemory() { //int i; /* // All atoms are kept in array Atom. Models, chains // and residues have only references to Atom and // they do not dispose Atoms when disposed themselves. // It is important, however, to dispose Atom at // still alive residues, because each atom wipes out // reference to itself from the corresponding residue // before it dies. if (Atom) { for (i=0;iConvertPDBString ( S ); if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) RC = 0; if (RC) break; } fend = f.FileEnd(); if (!fend) { ReadPDBLine ( f,S,sizeof(S) ); Title.TrimInput ( S ); lcount++; } } while (!fend); if (RC!=Error_WrongSection) return RC; // temporary solution: the rest of file is stored // in the form of strings while (!f.FileEnd() && strncmp(S,"CRYST" ,5) && strncmp(S,"ORIGX" ,5) && strncmp(S,"SCALE" ,5) && strncmp(S,"MTRIX" ,5) && strncmp(S,"TVECT" ,5) && strncmp(S,"MODEL ",6) && strncmp(S,"ATOM ",6) && strncmp(S,"SIGATM",6) && strncmp(S,"ANISOU",6) && strncmp(S,"SIGUIJ",6) && strncmp(S,"TER ",6) && strncmp(S,"HETATM",6) && strncmp(S,"ENDMDL",6)) { if (!strncmp(S,"LINK ",6)) crModel->ConvertPDBString ( S ); else if (!strncmp(S,"CISPEP",6)) { GetInteger ( modNum,&(S[43]),3 ); if (modNum<=0) modNum = 1; if (modNum!=1) SwitchModel ( modNum ); crModel->ConvertPDBString ( S ); if (modNum!=1) SwitchModel ( 1 ); } else { ContString = new CContString(S); SA.AddData ( ContString ); } ReadPDBLine ( f,S,sizeof(S) ); Title.TrimInput ( S ); lcount++; } // read crystallographic information section do { RC = Cryst.ConvertPDBString(S,fixSpaceGroup); if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) RC = 0; if (RC) break; fend = f.FileEnd(); if (!fend) { ReadPDBLine ( f,S,sizeof(S) ); Title.TrimInput ( S ); lcount++; } } while (!fend); if (!RC) { RC = Cryst.ConvertPDBString(S,fixSpaceGroup); if ((RC!=Error_WrongSection) && ignoreNonCoorPDBErrors) RC = Error_WrongSection; } Cryst.CalcCoordTransforms(); if (Flags & MMDBF_SimRWBROOK) Cryst.RWBROOKReadPrintout(); if (RC!=Error_WrongSection) return RC; // temporary solution: the rest of file is stored // in the form of strings while (!f.FileEnd() && strncmp(S,"MODEL ",6) && strncmp(S,"ATOM ",6) && strncmp(S,"SIGATM",6) && strncmp(S,"ANISOU",6) && strncmp(S,"SIGUIJ",6) && strncmp(S,"TER ",6) && strncmp(S,"HETATM",6) && strncmp(S,"ENDMDL",6)) { ContString = new CContString(S); SB.AddData ( ContString ); ReadPDBLine ( f,S,sizeof(S) ); Title.TrimInput ( S ); lcount++; } if (Flags & MMDBF_NoCoordRead) return 0; // read coordinate section RC = 0; do { RC = ReadPDBAtom ( S ); if (RC) break; fend = f.FileEnd(); if (!fend) { ReadPDBLine ( f,S,sizeof(S) ); Title.TrimInput ( S ); lcount++; } } while (!fend); // if (!RC) // RC = ReadPDBAtom(S); // commented on 28.05.2004, it appears that "CHAIN_ORDER" should not // be enforced here // cleanKey = PDBCLEAN_ATNAME | PDBCLEAN_CHAIN_ORDER; cleanKey = 0x00000000; if (Flags & MMDBF_EnforceAtomNames) cleanKey = PDBCLEAN_ATNAME; if (Flags & MMDBF_AutoSerials) cleanKey |= PDBCLEAN_SERIAL; if (cleanKey) PDBCleanup ( cleanKey ); if ((!f.FileEnd()) && (RC!=Error_WrongSection)) return RC; // temporary solution: the rest of file is stored // in the form of strings while (!f.FileEnd()) { if (strncmp(S,"END ",6)) { // END is added automatically ContString = new CContString(S); SC.AddData ( ContString ); } ReadPDBLine ( f,S,sizeof(S) ); Title.TrimInput ( S ); lcount++; } lcount--; // last line was not read return 0; } int CMMDBFile::ReadCIFASCII1 ( cpstr CIFLFName, byte gzipMode ) { pstr FName; FName = getenv ( CIFLFName ); if (FName) return ReadCIFASCII ( FName,gzipMode ); else return Error_NoLogicalName; } int CMMDBFile::ReadCIFASCII ( cpstr CIFFileName, byte gzipMode ) { CFile f; int W; Boolean fixSpaceGroup; // remove previous data ResetManager (); FreeFileMemory(); FType = MMDB_FILE_CIF; ignoreSegID = (Flags & MMDBF_IgnoreSegID ) != 0; ignoreElement = (Flags & MMDBF_IgnoreElement ) != 0; ignoreCharge = (Flags & MMDBF_IgnoreCharge ) != 0; ignoreNonCoorPDBErrors = (Flags & MMDBF_IgnoreNonCoorPDBErrors) != 0; ignoreUnmatch = (Flags & MMDBF_IgnoreUnmatch ) != 0; allowDuplChID = (Flags & MMDBF_AllowDuplChainID ) != 0; enforceUniqueChID = (Flags & MMDBF_EnforceUniqueChainID ) != 0; fixSpaceGroup = (Flags & MMDBF_FixSpaceGroup ) != 0; // open the file as ASCII for reading // opening it in pseudo-binary mode helps reading various // line terminators for files coming from different platforms f.assign ( CIFFileName,False,False,gzipMode ); if (f.reset(True)) { CIFErrorLocation[0] = char(0); // CIF reading phase lcount = 0; // line counter S[0] = char(0); if (f.FileEnd()) { f.shut(); return Error_EmptyFile; } if (!CIF) CIF = new CMMCIFData(); CIF->SetStopOnWarning ( True ); CIF->SetPrintWarnings ( (Flags & MMDBF_PrintCIFWarnings)!=0 ); W = CIF->ReadMMCIFData ( f,S,lcount ); f.shut(); if (W) { if (W==CIFRC_NoDataLine) return Error_NotACIFFile; if (W & CIFW_UnrecognizedItems) return Error_UnrecognCIFItems; if (W & CIFW_MissingField) return Error_MissingCIFField; if (W & CIFW_EmptyLoop) return Error_EmptyCIFLoop; if (W & CIFW_UnexpectedEOF) return Error_UnexpEndOfCIF; if (W & CIFW_LoopFieldMissing) return Error_MissgCIFLoopField; if (W & CIFW_NotAStructure) return Error_NotACIFStructure; if (W & CIFW_NotALoop) return Error_NotACIFLoop; return int(W); } return ReadFromCIF ( CIF,fixSpaceGroup ); } else return Error_CantOpenFile; } int CMMDBFile::ReadFromCIF ( PCMMCIFData CIFD, Boolean fixSpaceGroup ) { PCMMCIFLoop Loop1,Loop2; pstr F,FC; word cleanKey; int RC,i,l,j,n,retc; RC = Title.GetCIF ( CIFD ); if (RC) { CIFD->Optimize(); return RC; } SwitchModel ( 1 ); if (!crModel) return Error_GeneralError1; RC = crModel->GetCIF ( CIFD ); if (RC) { CIFD->Optimize(); return RC; } RC = Cryst.GetCIF ( CIFD,fixSpaceGroup ); if (RC) { CIFD->Optimize(); return RC; } Cryst.CalcCoordTransforms(); if (Flags & MMDBF_SimRWBROOK) Cryst.RWBROOKReadPrintout(); RC = ReadCIFAtom ( CIFD ); Loop1 = CIFD->GetLoop ( CIFCAT_ENTITY ); Loop2 = CIFD->GetLoop ( CIFCAT_STRUCT_ASYM ); if (Loop1 && Loop2) { // make 'Het' atoms l = Loop1->GetLoopLength(); n = Loop2->GetLoopLength(); for (i=0;iGetString ( CIFTAG_TYPE,i,retc ); if (F && (!retc)) { if (!strcasecmp(F,"non-polymer")) { F = Loop1->GetString ( CIFTAG_ID,i,retc ); if (F && (!retc)) for (j=0;jGetString ( CIFTAG_ENTITY_ID,j,retc ); if (FC && (!retc)) { if (!strcasecmp(FC,F)) { FC = Loop2->GetString ( CIFTAG_ID,j,retc ); if (FC && (!retc)) MakeHetAtoms ( FC,True ); } } } } } } } if (!RC) { // deleting these CIF loops here is a temporary solution // taken in order to avoid mess at rewriting the CIF file. CIFD->DeleteLoop ( CIFCAT_ATOM_SITE ); CIFD->DeleteLoop ( CIFCAT_ATOM_SITE_ANISOTROP ); CIFD->Optimize (); } cleanKey = 0x00000000; if (Flags & MMDBF_EnforceAtomNames) cleanKey = PDBCLEAN_ATNAME; if (Flags & MMDBF_AutoSerials) cleanKey |= PDBCLEAN_SERIAL; if (cleanKey) PDBCleanup ( cleanKey ); return RC; } int CMMDBFile::ReadCoorFile1 ( cpstr LFName, byte gzipMode ) { pstr FName; FName = getenv ( LFName ); if (FName) return ReadCoorFile ( FName,gzipMode ); else return Error_NoLogicalName; } int CMMDBFile::ReadCoorFile ( cpstr CFName, byte gzipMode ) { // auto format recognition int kin; Boolean IBL; kin = isMMDBBIN ( CFName,gzipMode ); if (kin==Error_EmptyFile) return Error_EmptyFile; if (kin<0) return Error_CantOpenFile; if (kin==0) return ReadMMDBF ( CFName,gzipMode ); IBL = ((Flags & MMDBF_IgnoreBlankLines)!=0); if (isPDB(CFName,gzipMode,IBL)==0) return ReadPDBASCII ( CFName,gzipMode ); if (isCIF(CFName,gzipMode)==0) return ReadCIFASCII ( CFName,gzipMode ); return Error_ForeignFile; } word CMMDBFile::PDBCleanup ( word CleanKey ) { // cleans coordinate part to comply with PDB standards: // // CleanKey Action // PDBCLEAN_ATNAME pads atom names with spaces to form 4-symbol names // PDBCLEAN_TER inserts TER cards in the end of each chain // PDBCLEAN_CHAIN generates 1-character chain ids instead of // those many-character // PDBCLEAN_CHAIN_STRONG generates 1-character chain ids starting // from 'A' on for all ids, including single-char // PDBCLEAN_ALTCODE generates 1-character alternative codes instead // of those many-character // PDBCLEAN_ALTCODE_STRONG generates 1-character alternative codes // from 'A' on for all codes, including // single-character ones // PDBCLEAN_SERIAL puts serial numbers in due order // PDBCLEAN_INDEX reorders the internal index of atoms such that // it follows the actual order of atoms in // the object hierarchy // PDBCLEAN_SEQNUM renumbers all residues so that they go // incrementally-by-one without insertion codes // PDBCLEAN_CHAIN_ORDER puts chains in order of atom's serial numbers // PDBCLEAN_SOLVENT moves solvent chains at the end of each model // PDBCLEAN_ELEMENT calculates PDB element names where they are not // found in the chemical element table // PDBCLEAN_ELEMENT_STRONG calculates all chemical element names // // Return codes (as bits): // 0 Ok // PDBCLEAN_CHAIN too many chains for assigning them 1-letter codes // PDBCLEAN_ATNAME element names were not available // PDBCLEAN_ALTCODE too many alternative codes encountered. // word RC; int i,j,k,nal,nch,nr, nch1,nch2; char c; AltLoc * altLoc; ChainID * chain_ID; char aLoc [257]; char chnID[257]; int model,modl; PPCAtom Atom1; PPCChain Chain1,Chain2; PCModel crModel0; PCChain crChain0; PCResidue crRes0; PCAtom atom; pstr chID; ChainID chainID; Boolean NewChain,Done,Solvent; k = 0; // else may be used uninitialized RC = 0; if (nAtoms<=0) return RC; if (CleanKey & PDBCLEAN_ATNAME) for (i=0;iMakePDBAtomName()) RC |= PDBCLEAN_ATNAME; if (CleanKey & PDBCLEAN_TER) { model = -1; k = -1; crModel0 = crModel; for (i=0;iGetModelNum(); chID = Atom[i]->GetChainID (); if (model<0) { model = modl; SwitchModel ( model ); if (chID) strcpy ( chainID,chID ); else chainID[0] = char(0); } else { if (model!=modl) NewChain = True; else if (chID) NewChain = strcmp(chID,chainID)!=0; else NewChain = chainID[0]!=char(0); if (NewChain) { if (k>=0) { if ((!Atom[k]->Ter) && (!Atom[k]->Het)) { // insert 'Ter' before atom in position 'i' PutAtom ( -(i+1),Atom[k]->serNum+1,pstr("TER"), Atom[k]->GetResName(),Atom[k]->GetChainID(), Atom[k]->GetSeqNum (),Atom[k]->GetInsCode(), pstr(" "),pstr(" "),pstr(" ") ); Atom[i]->MakeTer(); } } model = modl; SwitchModel ( model ); if (chID) strcpy ( chainID,chID ); else chainID[0] = char(0); } } k = i; } if (k>=0) { if ((!Atom[k]->Ter) && (!Atom[k]->Het)) { // add last TER i = nAtoms; SwitchModel ( Atom[k]->GetModelNum() ); PutAtom ( 0,nAtoms+1,pstr("TER"),Atom[k]->GetResName(), Atom[k]->GetChainID(),Atom[k]->GetSeqNum(), Atom[k]->GetInsCode(),pstr(" "),pstr(" "), pstr(" ") ); Atom[i]->MakeTer(); } } crModel = crModel0; } if (CleanKey & (PDBCLEAN_CHAIN | PDBCLEAN_CHAIN_STRONG)) { chain_ID = new ChainID[256]; for (i=0;inChains;j++) { crChain0 = Model[i]->Chain[j]; if (crChain0) { if (!crChain0->chainID[0]) strcpy ( crChain0->chainID," " ); k = 0; while ((kchainID))) k++; if (k>=nch) { if (nch>=255) RC |= PDBCLEAN_CHAIN; else { strcpy ( chain_ID[nch],crChain0->chainID ); if (!chain_ID[nch][1]) chnID[nch] = chain_ID[nch][0]; nch++; } } } } c = 'A'; if (CleanKey & PDBCLEAN_CHAIN_STRONG) { // rename all chains through from A to Z for (k=0;knChains;j++) { crChain0 = Model[i]->Chain[j]; if (crChain0) { k = 0; while ((kchainID))) k++; strcpy ( crChain0->prevChainID,crChain0->chainID ); crChain0->chainID[0] = chnID[k]; crChain0->chainID[1] = char(0); } } } delete[] chain_ID; } if (CleanKey & (PDBCLEAN_ALTCODE | PDBCLEAN_ALTCODE_STRONG)) { altLoc = new AltLoc[256]; for (i=0;i<256;i++) { strcpy ( altLoc[i]," " ); aLoc[i] = char(0); } aLoc[0] = ' '; aLoc[256] = char(0); nal = 1; for (i=0;ialtLoc[0]) strcpy ( Atom[i]->altLoc," " ); else { k = 0; while ((kaltLoc))) k++; if (k>=nal) { if (nal>=255) RC |= PDBCLEAN_ALTCODE; else { strcpy ( altLoc[nal],Atom[i]->altLoc ); if (!altLoc[nal][1]) aLoc[nal] = altLoc[nal][0]; nal++; } } } } c = 'A'; if (CleanKey & PDBCLEAN_ALTCODE_STRONG) for (i=1;ialtLoc))) k++; Atom[i]->altLoc[0] = aLoc[k]; Atom[i]->altLoc[1] = char(0); } delete[] altLoc; } if (CleanKey & PDBCLEAN_SEQNUM) for (i=0;inChains;j++) { crChain0 = crModel0->Chain[j]; if (crChain0) { nr = 0; for (k=0;knResidues;k++) { crRes0 = crChain0->Residue[k]; if (crRes0) { nr++; crRes0->seqNum = nr; crRes0->insCode[0] = char(0); } } } } } if (CleanKey & PDBCLEAN_SOLVENT) { Atom1 = new PCAtom[nAtoms]; k = 1; for (i=0;inChains>k) k = Model[i]->nChains; } Chain1 = new PCChain[k]; Chain2 = new PCChain[k]; k = 0; for (i=0;inChains;nch++) { crChain0 = crModel0->Chain[nch]; if (crChain0) { Solvent = False; for (nr=0;(nrnResidues) && (!Solvent);nr++) { crRes0 = crChain0->Residue[nr]; if (crRes0) for (j=0;(jname ); } if (Solvent) Chain2[nch2++] = crChain0; else Chain1[nch1++] = crChain0; } } for (nch=0;nchnResidues;nr++) { crRes0 = crChain0->Residue[nr]; if (crRes0) for (j=0;jnAtoms;j++) if (crRes0->atom[j]) { Atom1[k] = crRes0->atom[j]; Atom1[k]->index = k+1; k++; } } crModel0->Chain[nch] = Chain1[nch]; } for (nch=0;nchnResidues;nr++) { crRes0 = crChain0->Residue[nr]; if (crRes0) for (j=0;jnAtoms;j++) if (crRes0->atom[j]) { Atom1[k] = crRes0->atom[j]; Atom1[k]->index = k+1; k++; } } crModel0->Chain[nch1++] = Chain2[nch]; } crModel0->nChains = nch1; } } delete[] Chain1; delete[] Chain2; if (Atom) delete[] Atom; Atom = Atom1; AtmLen = nAtoms; nAtoms = k; } if (CleanKey & (PDBCLEAN_CHAIN_ORDER | PDBCLEAN_CHAIN_ORDER_IX)) { for (i=0;inChains;j++) { crChain0 = crModel0->Chain[j]; if (crChain0) { crChain0->nWeights = 0; crChain0->Weight = 0.0; if (kChain[k] = crModel0->Chain[j]; crModel0->Chain[j] = NULL; } k++; } } crModel0->nChains = k; } } if (CleanKey & PDBCLEAN_CHAIN_ORDER) for (i=0;iGetChain(); crChain0->nWeights++; crChain0->Weight += Atom[i]->serNum; } else for (i=0;iGetChain(); crChain0->nWeights++; crChain0->Weight += Atom[i]->GetIndex(); } for (i=0;inChains;j++) { crChain0 = crModel0->Chain[j]; if (crChain0->nWeights) crChain0->Weight /= crChain0->nWeights; } // bubble sorting do { Done = True; for (j=1;jnChains;j++) if (crModel0->Chain[j-1]->Weight > crModel0->Chain[j]->Weight) { crChain0 = crModel0->Chain[j-1]; crModel0->Chain[j-1] = crModel0->Chain[j]; crModel0->Chain[j] = crChain0; Done = False; } } while (!Done); } } } if (CleanKey & PDBCLEAN_INDEX) { k = 0; for (i=0;inChains;nch++) { crChain0 = crModel0->Chain[nch]; if (crChain0) { for (nr=0;nrnResidues;nr++) { crRes0 = crChain0->Residue[nr]; if (crRes0) { for (j=0;jnAtoms;j++) { atom = crRes0->atom[j]; if (atom) { Atom[atom->index-1] = Atom[k]; if (Atom[k]) Atom[k]->index = atom->index; Atom[k] = atom; k++; atom->index = k; } } } } } } } } nAtoms = k; } if (CleanKey & PDBCLEAN_SERIAL) { k = 0; for (i=0;iindex = k+1; Atom[k]->serNum = Atom[k]->index; k++; } nAtoms = k; } if (CleanKey & PDBCLEAN_ELEMENT) { for (i=0;iTer)) { if (getElementNo(Atom[i]->element)==ELEMENT_UNKNOWN) { strcpy ( Atom[i]->element," " ); Atom[i]->MakePDBAtomName(); } } } if (CleanKey & PDBCLEAN_ELEMENT_STRONG) { for (i=0;iTer)) { strcpy ( Atom[i]->element," " ); Atom[i]->MakePDBAtomName(); } } return RC; } void CMMDBFile::MakeHetAtoms ( cpstr chainID, Boolean Make ) { // Makes all atoms in chain 'chainID', in all models, as 'Het' atoms // if Make is set True, and makes them 'ordinary' atoms otherwise. // 'Ter' is automatically removed when converting to 'Het' atoms, // and is automatically added when converting to 'ordinary' atoms. int i,j,k,l,n; PCModel crModel0; PCChain crChain0; PCResidue crRes0; crModel0 = crModel; for (i=0;inChains;j++) { crChain0 = Model[i]->Chain[j]; if (crChain0) { if (!strcmp(crChain0->chainID,chainID)) { n = 0; for (k=0;knResidues;k++) { crRes0 = crChain0->Residue[k]; if (crRes0) for (l=0;lnAtoms;l++) if (crRes0->atom[l]) { crRes0->atom[l]->Het = Make; n = crRes0->atom[l]->index; } } if (n>0) { n--; if (Atom[n]->Het && Atom[n]->Ter) RemoveAtom ( n+1 ); else if ((!Atom[n]->Het) && (!Atom[n]->Ter)) { SwitchModel ( Model[i]->GetSerNum() ); if (nserNum+1,pstr("TER"), Atom[n]->GetResName(),Atom[n]->GetChainID(), Atom[n]->GetSeqNum (),Atom[n]->GetInsCode(), pstr(" "),pstr(" "),pstr(" ") ); else PutAtom ( 0,nAtoms+1,pstr("TER"), Atom[n]->GetResName(),Atom[n]->GetChainID(), Atom[n]->GetSeqNum (),Atom[n]->GetInsCode(), pstr(" "),pstr(" "),pstr(" ") ); Atom[n+1]->MakeTer(); } } } } } crModel = crModel0; } void CMMDBFile::RemoveAtom ( int index ) { // Removes atom at the specified index in the Atom array. // This index is always accessible as Atom[index]->index. // If this leaves a residue empty, the residue is removed. // If this leaves an empty chain, the chain is removed as well; // the same happens to the model. PCResidue crRes0; PCChain crChain0; PCModel crModel0; int i,j; if ((index>0) && (index<=nAtoms)) { if (Atom[index-1]) { crRes0 = Atom[index-1]->residue; if (crRes0) { if (crRes0->_ExcludeAtom(index)) { // the residue appears empty after the exclusion if (crRes) { if ((crRes->seqNum==crRes0->seqNum) && (!strcmp(crRes->insCode,crRes0->insCode))) crRes = NULL; } crChain0 = crRes0->chain; if (crChain0) { if (crChain0->_ExcludeResidue(crRes0->name,crRes0->seqNum, crRes0->insCode)) { // the chain appears empty after the exclusion if (crChain) { if (!strcmp(crChain->chainID,crChain0->chainID)) crChain = NULL; } crModel0 = PCModel(crChain0->model); if (crModel0) { if (crModel0->_ExcludeChain(crChain0->chainID)) { // the model appears ampty after the exclusion if (crModel) { if (crModel->serNum==crModel0->serNum) crModel = NULL; } i = crModel0->serNum-1; delete Model[i]; Model[i] = NULL; } } delete crChain0; // it is already excluded from the hierarchy! } } delete crRes0; // it is already excluded from the hierarchy! } } delete Atom[index-1]; // it is already excluded from the hierarchy! Atom[index-1] = NULL; // now rearrange and re-index atoms. j = 0; for (i=0;iindex = j+1; j++; } nAtoms = j; } } } int CMMDBFile::_ExcludeModel ( int serNum ) { // _ExcludeModel(..) excludes (but does not dispose!) a model // from the file. Returns 1 if the file gets empty and 0 otherwise. int i,k; if (!Exclude) return 0; if ((0serNum = k+1; k++; } nModels = k; if (nModels<=0) return 1; else return 0; } int CMMDBFile::FinishStructEdit() { // Makes a new atom index after insertion or deletion of atoms. // This function may change atoms' positions in the index and // correspondingly the CAtom::index field. PCResidue res; PCChain chain; PCModel model; PPCAtom Atom1; int i,j,k,l,n,index,nAtoms1; // calculate new number of atoms nAtoms1 = 0; for (i=0;inChains;j++) { chain = model->Chain[j]; if (chain) { for (k=0;knResidues;k++) { res = chain->Residue[k]; if (res) { res->TrimAtomTable(); nAtoms1 += res->nAtoms; } } chain->TrimResidueTable(); } } model->TrimChainTable(); } } TrimModelTable(); // compile a new index and null the old one if (nAtoms1>0) Atom1 = new PCAtom[nAtoms1]; else Atom1 = NULL; n = 0; for (i=0;inChains;j++) { chain = model->Chain[j]; for (k=0;knResidues;k++) { res = chain->Residue[k]; for (l=0;lnAtoms;l++) { Atom1[n] = res->atom[l]; index = Atom1[n]->index; if ((index>0) && (index<=AtmLen)) Atom[index-1] = NULL; Atom1[n]->index = n+1; n++; } } } } // if (n!=nAtoms1) { // printf ( " **** PROGRAM ERROR IN CMMDBFile::FinishStructEdit\n" ); // exit ( 1 ); // } // check if there are dead atoms in the old index for (i=0;iserNum = j+1; j++; } nModels = j; } int CMMDBFile::GenerateNCSMates() { // // Generates NCS mates according to NCS matrices given // in Cryst. This will result in generating many-character // chain names, composed as 'x_n' where 'x' is the original // name and 'n' is a unique number, which will coincide with // the symmetry operation (order) number. Another side // effect will be a disorder in atoms' serial numbers. // The hierarchy should therefore be cleaned after // generating the NCS mates. An appropriate way to do that // is to issue the following call: // // PDBCleanup ( PDBCLEAN_TER | PDBCLEAN_ALTCODE_STRONG | // PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL ); // PPCChain chainTable,chain; PCChain chn; mat44 ncs_m; ChainID chainID; int i,j,k,nNCSOps,nChains,iGiven; nNCSOps = Cryst.GetNumberOfNCSMatrices(); if (nNCSOps<=0) return 1; for (i=0;iGetChainTable ( chainTable,nChains ); if (nChains>0) { chain = new PCChain[nChains]; for (j=0;jCopy ( chain[j] ); sprintf ( chainID,"%s_%i", chain[j]->GetChainID(),k+1 ); chn->SetChainID ( chainID ); chn->ApplyTransform ( ncs_m ); Model[i]->AddChain ( chn ); } } } delete[] chain; } } return 0; } void CMMDBFile::ApplyNCSTransform ( int NCSMatrixNo ) { mat33 t; vect3 v; int i; if (!Cryst.GetNCSMatrix(NCSMatrixNo,t,v)) return; for (i=0;iTransform ( t,v ); } int CMMDBFile::PutPDBString ( cpstr PDBString ) { int RC; PCContString ContString; strcpy ( S,PDBString ); // maintain the buffer! PadSpaces ( S,80 ); lcount++; // belongs to title? RC = Title.ConvertPDBString ( S ); if (RC!=Error_WrongSection) return RC; // belongs to primary structure section? SwitchModel ( 1 ); RC = crModel->ConvertPDBString ( S ); if (RC!=Error_WrongSection) return RC; // belongs to the crystallographic information section? RC = Cryst.ConvertPDBString ( S,False ); if (RC!=Error_WrongSection) { // if (RC==0) Cryst.CalcCoordTransforms(); return RC; } // belongs to the coordinate section? RC = ReadPDBAtom ( S ); if (RC!=Error_WrongSection) return RC; // temporary solution: the rest of file is stored // in the form of strings if ((S[0]) && (S[0]!=' ') && (strncmp(S,"END ",6))) { // END is added automatically ContString = new CContString(S); SC.AddData ( ContString ); } return 0; } int CMMDBFile::AddPDBASCII1 ( cpstr PDBLFName, byte gzipMode ) { pstr FName; FName = getenv ( PDBLFName ); if (FName) return AddPDBASCII ( FName,gzipMode ); else return Error_NoLogicalName; } int CMMDBFile::AddPDBASCII ( cpstr PDBFileName, byte gzipMode ) { int RC; CFile f; // open the file as ASCII for reading // opening it in pseudo-binary mode helps reading various // line terminators for files coming from different platforms f.assign ( PDBFileName,False,False,gzipMode ); if (f.reset(True)) { lcount = 1; // line counter RC = 0; while ((!f.FileEnd()) && (!RC)) { ReadPDBLine ( f,S,sizeof(S) ); RC = PutPDBString ( S ); } f.shut(); } else RC = Error_CantOpenFile; return RC; } void CMMDBFile::GetInputBuffer ( pstr Line, int & count ) { if (FType==MMDB_FILE_PDB) { // PDB File strcpy ( Line,S ); count = lcount; } else if (FType==MMDB_FILE_CIF) { if (!CIFErrorLocation[0]) { // CIF reading phase strcpy ( Line,S ); count = lcount; } else { strcpy ( Line,CIFErrorLocation ); count = -1; // CIF interpretation phase } } else { Line[0] = char(0); count = -2; } } int CMMDBFile::CrystReady() { // Returns flags: // CRRDY_Complete if crystallographic information is complete // CRRDY_NotPrecise if cryst. inf-n is not precise // CRRDY_isTranslation if cryst. inf-n contains translation // CRRDY_NoOrthCode no orthogonalization code // Fatal: // CRRDY_NoTransfMatrices if transform. matrices were not calculated // CRRDY_Unchecked if cryst. inf-n was not checked // CRRDY_Ambiguous if cryst. inf-n is ambiguous // CRRDY_NoCell if cryst. inf-n is unusable // CRRDY_NoSpaceGroup if space group is not set int k; if (!(Cryst.WhatIsSet & CSET_Transforms)) return CRRDY_NoTransfMatrices; if ((Cryst.WhatIsSet & CSET_CellParams)!=CSET_CellParams) return CRRDY_NoCell; if (!(Cryst.WhatIsSet & CSET_SpaceGroup)) return CRRDY_NoSpaceGroup; if (Cryst.CellCheck & CCHK_Unchecked) return CRRDY_Unchecked; if (Cryst.CellCheck & CCHK_Disagreement) return CRRDY_Ambiguous; k = 0x0000; if (Cryst.CellCheck & CCHK_Error) k |= CRRDY_NotPrecise; if (Cryst.CellCheck & CCHK_Translations) k |= CRRDY_isTranslation; if (Cryst.CellCheck & CCHK_NoOrthCode) k |= CRRDY_NoOrthCode; return k; } Boolean CMMDBFile::isCrystInfo() { return (((Cryst.WhatIsSet & CSET_CellParams)==CSET_CellParams) && (Cryst.WhatIsSet & CSET_SpaceGroup)); } Boolean CMMDBFile::isCellInfo() { return ((Cryst.WhatIsSet & CSET_CellParams)==CSET_CellParams); } Boolean CMMDBFile::isSpaceGroup() { return (Cryst.WhatIsSet & CSET_SpaceGroup); } Boolean CMMDBFile::isTransfMatrix() { return Cryst.areMatrices(); } Boolean CMMDBFile::isScaleMatrix() { return ((Cryst.WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix); } Boolean CMMDBFile::isNCSMatrix() { return Cryst.isNCSMatrix(); } int CMMDBFile::AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ) { return Cryst.AddNCSMatrix ( ncs_m,ncs_v,iGiven ); } int CMMDBFile::GetNumberOfNCSMatrices() { return Cryst.GetNumberOfNCSMatrices(); } int CMMDBFile::GetNumberOfNCSMates() { // Returns the number of NCS mates not given in the file (iGiven==0) return Cryst.GetNumberOfNCSMates(); } Boolean CMMDBFile::GetNCSMatrix ( int NCSMatrixNo, // 0..N-1 mat44 & ncs_m, int & iGiven ) { return Cryst.GetNCSMatrix ( NCSMatrixNo,ncs_m,iGiven ); } int CMMDBFile::ReadPDBAtom ( cpstr L ) { // If string L belongs to the coordinate section // (records ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM), // the correspondent information is retrieved and // stored in the dynamic Atom array. In parallel, the // structures of Model/Chain/Residue are generated and // referenced to the corresponding Atom. // If processing of L was successful, the return is 0, // otherwise it returns the corresponding Error_XXX // code. // If L does not belong to the coordinate section, // Error_WrongSection is returned. int RC,index; if (!strncmp(L,"ATOM ",6)) { index = nAtoms+1; // index for the next atom in Atom array RC = CheckAtomPlace ( index,L ); if (!RC) RC = Atom[index-1]->ConvertPDBATOM ( index,L ); } else if (!strncmp(L,"SIGATM",6)) { index = nAtoms; // keep index! RC = CheckAtomPlace ( index,L ); if (!RC) RC = Atom[index-1]->ConvertPDBSIGATM ( index,L ); } else if (!strncmp(L,"ANISOU",6)) { index = nAtoms; // keep index RC = CheckAtomPlace ( index,L ); if (!RC) RC = Atom[index-1]->ConvertPDBANISOU ( index,L ); } else if (!strncmp(L,"SIGUIJ",6)) { index = nAtoms; // keep index RC = CheckAtomPlace ( index,L ); if (!RC) RC = Atom[index-1]->ConvertPDBSIGUIJ ( index,L ); } else if (!strncmp(L,"TER ",6)) { index = nAtoms+1; // new place in Atom array RC = CheckAtomPlace ( index,L ); if (!RC) RC = Atom[index-1]->ConvertPDBTER ( index,L ); } else if (!strncmp(L,"HETATM",6)) { index = nAtoms+1; // new place in Atom array RC = CheckAtomPlace ( index,L ); if (!RC) RC = Atom[index-1]->ConvertPDBHETATM ( index,L ); } else if (!strncmp(L,"MODEL ",6)) { modelCnt++; RC = SwitchModel ( L ); if (!RC) { if (crModel->serNum!=modelCnt) RC = Error_DuplicatedModel; } } else if (!strncmp(L,"ENDMDL",6)) { crModel = NULL; crChain = NULL; crRes = NULL; RC = 0; } else return Error_WrongSection; return RC; } int CMMDBFile::ReadCIFAtom ( PCMMCIFData CIFD ) { PCMMCIFLoop Loop,LoopAnis; int RC,i,index,nATS; Loop = CIFD->GetLoop ( CIFCAT_ATOM_SITE ); if (!Loop) return 0; // no atom coordinates in the file LoopAnis = CIFD->GetLoop ( CIFCAT_ATOM_SITE_ANISOTROP ); nATS = Loop->GetLoopLength(); for (i=1;i<=nATS;i++) { // nAtoms and i should always coincide at this point. This piece // of code was however left in order to reach identity with // ReadPDBAtom(..). index = nAtoms+1; // index for the next atom in Atom array RC = CheckAtomPlace ( index,Loop ); if (!RC) RC = Atom[index-1]->GetCIF ( i,Loop,LoopAnis ); if (RC && (RC!=Error_CIF_EmptyRow)) return RC; } if (Flags & MMDBF_AutoSerials) PDBCleanup ( PDBCLEAN_SERIAL ); return 0; } int CMMDBFile::PutAtom ( int index, int serNum, const AtomName atomName, const ResName resName, const ChainID chainID, int seqNum, const InsCode insCode, const AltLoc altLoc, const SegID segID, const Element element ) { // An atom with the specified properties is put into the // structure. The current model is used; if no model is // set (crModel==NULL), one is created. Coordinates and // other parameters of the atom need to be set separately. // // If index is positive and there is already an atom at // this position in the system, the new atom will REPLACE // it. The corresponding residues are automatically // updated. // // If index is null (=0), the new atom will be put on // the top of the structure, i.e. it will be put into // (index=nAtoms+1)-th position. // // If index is negative, then the new atom is INSERTED // BEFORE the atom in the (-index)th position. For // saving the computational efforts, this WILL NOT cause // the recalculation of all atoms' serial numbers // according to their actual positions. It will be needed // however to put the things in order by calling // CMMDBFile::OrderAtoms() at a certain point, especially // before writing an output ASCII file. NOTE that this // ordering is never done automatically. // // Limitation: if PutAtom implies creating new // chains/residues, these are always created on the top // of existing chains/residues. int i,kndex,RC; kndex = index; if (kndex<0) { // the new atom is to be inserted kndex = -kndex; if (kndex>AtmLen) ExpandAtomArray ( kndex+1000-AtmLen ); if (Atom[kndex-1]!=NULL) { // the position is occupied // expand the array if necessary if (nAtoms>=AtmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000-AtmLen ); // now shift all atoms from (kndex-1)th to the end of array. // note that this does not affect residues as they keep only // pointers on atoms for (i=nAtoms;i>=kndex;i--) { Atom[i] = Atom[i-1]; Atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } Atom[kndex-1] = NULL; nAtoms++; } } if (kndex==0) kndex = nAtoms+1; if (!crModel) SwitchModel ( 1 ); RC = AllocateAtom ( kndex,chainID,resName,seqNum,insCode,True ); if (!RC) Atom[kndex-1]->SetAtomName ( kndex,serNum,atomName,altLoc, segID,element ); return RC; } int CMMDBFile::PutAtom ( int index, // same meaning as above PCAtom A, // pointer to completed atom // class int serNum // 0 means that the serial // number will be set equal // to "index". Otherwise, // the serial number is set // to the specified value ) { int i,kndex,RC,sn; if (!A) return -1; kndex = index; if (kndex<0) { // the new atom is to be inserted kndex = -kndex; if (kndex>AtmLen) ExpandAtomArray ( kndex+1000-AtmLen ); if (Atom[kndex-1]!=NULL) { // the position is occupied // expand the array if necessary if (nAtoms>=AtmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000-AtmLen ); // now shift all atoms from (kndex-1)th to the end of array. // note that this does not affect residues as they keep only // pointers on atoms for (i=nAtoms;i>=kndex;i--) { Atom[i] = Atom[i-1]; Atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } Atom[kndex-1] = NULL; nAtoms++; } } if (kndex==0) kndex = nAtoms+1; RC = AllocateAtom ( kndex,A->GetChainID(),A->GetResName(), A->GetSeqNum(),A->GetInsCode(),True ); if (serNum<=0) sn = kndex; else sn = serNum; if (!RC) { Atom[kndex-1]->Copy ( A ); Atom[kndex-1]->serNum = sn; } return RC; } int CMMDBFile::CheckInAtom ( int index, // same meaning as above PCAtom A // pointer to completed // atom class ) { int i,kndex; if (!A) return -1; kndex = index; if (kndex<0) { // the new atom is to be inserted kndex = -kndex; if (kndex>AtmLen) ExpandAtomArray ( kndex+1000-AtmLen ); if (Atom[kndex-1]!=NULL) { // the position is occupied // expand the array if necessary if (nAtoms>=AtmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000-AtmLen ); // now shift all atoms from (kndex-1)th to the end of array. // note that this does not affect residues as they keep only // pointers on atoms for (i=nAtoms;i>=kndex;i--) { Atom[i] = Atom[i-1]; if (Atom[i]) Atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } } nAtoms++; } else { if (kndex==0) kndex = nAtoms + 1; // add atom on the very top if (kndex>AtmLen) ExpandAtomArray ( kndex+1000-AtmLen ); if (kndex>nAtoms) nAtoms = kndex; if (Atom[kndex-1]) delete Atom[kndex-1]; } Atom[kndex-1] = A; A->index = kndex; return 0; } int CMMDBFile::CheckInAtoms ( int index, // same meaning as above PPCAtom A, // array of atoms to check in int natms // number of atoms to check in ) { PPCAtom A1; int i,j,k,k1,kndex; A1 = (PCAtom *) NULL; // else may be used uninitialized if (!A) return -1; kndex = index; if (kndex<0) { // the new atoms are to be inserted kndex = -kndex; if (nAtoms+natms>=AtmLen) ExpandAtomArray ( IMax(kndex,nAtoms)+1000+natms-AtmLen ); if (kndexindex = k+1; k++; } if (j>0) { // insert removed atoms into the gap nAtoms += j; k1 = k+j; for (i=nAtoms-1;i>=k1;i--) { Atom[i] = Atom[i-j]; if (Atom[i]) Atom[i]->index = i+1; // this is Ok because residues keep // POINTERS rather than indices! } for (i=0;iindex = k+1; k++; } } delete[] A1; } else { if (kndex==0) kndex = nAtoms + 1; // add atom on the very top k = kndex + natms; if (k>AtmLen) ExpandAtomArray ( k+1000-AtmLen ); kndex--; for (i=0;iindex = kndex+1; kndex++; } nAtoms = IMax(nAtoms,kndex); } return 0; } int CMMDBFile::SwitchModel ( cpstr L ) { int nM; if (!GetInteger(nM,&(L[10]),4)) return Error_UnrecognizedInteger; return SwitchModel ( nM ); } int CMMDBFile::SwitchModel ( int nM ) { PPCModel Mdl; int i; Boolean Transfer; if (nM<=0) return Error_WrongModelNo; if (nM>nModels) { if ((nModels==1) && Model[0]) Transfer = (nAtoms<=0); else Transfer = False; Mdl = new PCModel[nM]; for (i=0;iSetMMDBManager ( PCMMDBManager(this),nM ); crModel = Model[nM-1]; crChain = NULL; // new model - new chain crRes = NULL; // new chain - new residue return 0; } int CMMDBFile::CheckAtomPlace ( int index, cpstr L ) { // This function gets the residue/chain information stored // in PDB string L (the records should start with the // keywords ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM) and // sets the pointers crChain and crRes to the respective. // chain and residue. If there is no chain/residue to place // the atom in, these will be created. // The function prepares place for the atom in the index-th // cell of the Atom array, expanding it as necessary. If the // corresponding element in the Atom array was not initialized, // a CAtom class is created with reference to the current // residue. // This function DOES NOT check the PDB string L for // atom keywords. ResName resName; int seqNum; ChainID chainID; InsCode insCode; // get the residue sequence number/ insert code if (!GetIntIns(seqNum,insCode,&(L[22]),4)) { if (strncmp(L,"TER ",6)) return Error_UnrecognizedInteger; else { // we allow for empty TER card here seqNum = 0; insCode[0] = char(1); // unprintable symbol! used as // flag that TER card does not // have serial number insCode[1] = char(0); } } // get chain ID if (L[20]!=' ') { chainID[0] = L[20]; chainID[1] = L[21]; chainID[2] = char(0); } else if (L[21]!=' ') { chainID[0] = L[21]; chainID[1] = char(0); } else chainID[0] = char(0); // get residue name strcpy_ncss ( resName,&(L[17]),3 ); if ((!resName[0]) && (!strncmp(L,"TER ",6))) { insCode[0] = char(1); insCode[1] = char(0); } return AllocateAtom ( index ,chainID,resName, seqNum,insCode,False ); } int CMMDBFile::CheckAtomPlace ( int index, PCMMCIFLoop Loop ) { // Version of CheckAtomPlace(..) for reading from CIF file. ResName resName; int seqNum,RC,k,nM; ChainID chainID; InsCode insCode; pstr F; // Get the residue sequence number/insert code. They are // removed from the file after reading. k = index-1; if (!CIFGetInteger1(seqNum,Loop,CIFTAG_LABEL_SEQ_ID,k)) CIFGetString ( insCode,Loop,CIFTAG_NDB_INS_CODE,k, sizeof(InsCode),pstr("") ); else { F = Loop->GetString ( CIFTAG_GROUP_PDB,k,RC ); if ((!F) || (RC)) return Error_CIF_EmptyRow; if (strcmp(F,"TER")) { seqNum = MinInt4; // only at reading CIF we allow this CIFGetString ( insCode,Loop,CIFTAG_NDB_INS_CODE,k, sizeof(InsCode),pstr("") ); } else { // we allow for empty TER card here seqNum = 0; insCode[0] = char(1); // unprintable symbol! used as // flag that TER card does not // have serial number insCode[1] = char(0); } } // get chain/residue ID CIFGetString ( chainID,Loop,CIFTAG_LABEL_ASYM_ID,k, sizeof(ChainID),pstr("") ); CIFGetString ( resName,Loop,CIFTAG_LABEL_COMP_ID,k, sizeof(ResName),pstr("") ); if (!CIFGetInteger1(nM,Loop,CIFTAG_PDBX_PDB_MODEL_NUM,k)) { if (crModel) { if (nM!=crModel->serNum) SwitchModel ( nM ); } else SwitchModel ( nM ); } return AllocateAtom ( index ,chainID,resName, seqNum,insCode,False ); } int CMMDBFile::AllocateAtom ( int index, const ChainID chainID, const ResName resName, int seqNum, const InsCode insCode, Boolean Replace ) { if ((!resName[0]) && (insCode[0]!=char(1))) return Error_EmptyResidueName; // check if there is a pointer to model if (!crModel) { // the model pointer was not set. Check if there are // models already defined if (!Model) SwitchModel ( 1 ); // creates a model else return Error_NoModel; } if (crChain && (insCode[0]!=char(1))) { // If crChain is not NULL, the model pointer was not // changed and we may try to keep using crChain as // pointer to the being-read chain. However, we must // check that the record still belongs to the same chain. // All this does not work if insCode[0] is set to 1 // which indicates a special case of 'TER' card without // parameters. if (enforceUniqueChID) { // enforcing unique chain IDs should be used only in case // of multi-chain complexes where 1-letter chain IDs are // not enough to accomodate all chains. Then chains are // dynamically renamed like A0,A1,A2,.. etc. Therefore, we // check only first symbol here. if (chainID[0]!=crChain->chainID[0]) crChain = NULL; // the chain has to be changed } else if (strcmp(chainID,crChain->chainID)) crChain = NULL; // the chain has to be changed } if (!crChain) { // either the model or chain was changed -- get a new chain if (allowDuplChID) crChain = crModel->CreateChain ( chainID ); else crChain = crModel->GetChainCreate ( chainID, enforceUniqueChID ); crRes = NULL; // new chain - new residue } if (crRes && (insCode[0]!=char(1))) { // If crRes is not NULL, neither the model nor chain were // changed. Check if this record still belongs to the // same residue. // All this does not work if insCode[0] is set to 1 // which indicates a special case of 'TER' card without // parameters. if ((seqNum!=crRes->seqNum) || strcmp(insCode,crRes->insCode) || strcmp(resName,crRes->name)) crRes = NULL; // the residue has to be changed } if (!crRes) { // either the chain or residue was changed -- get a new residue crRes = crChain->GetResidueCreate ( resName,seqNum,insCode, Flags & MMDBF_IgnoreDuplSeqNum ); if (!crRes) return Error_DuplicateSeqNum; } // now check if there is place in the Atom array if (index>AtmLen) // there is no place, expand Atom by 1000 atom places at once ExpandAtomArray ( index+1000-AtmLen ); nAtoms = IMax(nAtoms,index); // delete the to-be-replaced atom if there is any if (Replace && Atom[index-1]) { delete Atom[index-1]; Atom[index-1] = NULL; } if (!Atom[index-1]) { Atom[index-1] = newCAtom(); crRes->_AddAtom ( Atom[index-1] ); Atom[index-1]->index = index; } return 0; } void CMMDBFile::ExpandAtomArray ( int inc ) { // Expands the Atom array by adding more inc positions. // The length of Atom array is increased unconditionally. PPCAtom Atom1; int i; AtmLen += inc; Atom1 = new PCAtom[AtmLen]; for (i=0;iAtmLen) { AtmLen = nAtoms+inc; Atom1 = new PCAtom[AtmLen]; for (i=0;iPDBASCIIDumpPS ( f ); // output cispep records for (i=0;iPDBASCIIDumpCP ( f ); SA .PDBASCIIDump ( f ); Footnote.PDBASCIIDump ( f ); Cryst .PDBASCIIDump ( f ); SB .PDBASCIIDump ( f ); for (i=0;iPDBASCIIDump ( f ); SC.PDBASCIIDump ( f ); f.WriteLine ( pstr("END") ); } int CMMDBFile::WriteCIFASCII1 ( cpstr CIFLFName, byte gzipMode ) { pstr FName; FName = getenv ( CIFLFName ); if (FName) return WriteCIFASCII ( FName,gzipMode ); else return Error_NoLogicalName; } int CMMDBFile::WriteCIFASCII ( cpstr CIFFileName, byte gzipMode ) { int i; if (!CIF) CIF = new CMMCIFData(); CIF->SetStopOnWarning ( True ); CIF->SetPrintWarnings ( (Flags & MMDBF_PrintCIFWarnings)!=0 ); FType = MMDB_FILE_CIF; Title.MakeCIF ( CIF ); i = 0; while (iMakePSCIF ( CIF ); Cryst.MakeCIF ( CIF ); for (i=0;iMakeAtomCIF ( CIF ); CIF->Optimize(); CIF->WriteMMCIFData ( CIFFileName,gzipMode ); return 0; } PCAtom CMMDBFile::GetAtomI ( int index ) { if (index>nAtoms) return NULL; if (index<1) return NULL; if (!Atom) return NULL; return Atom[index-1]; } #define MMDBFLabel "**** This is MMDB binary file ****" #define Edition 1 int CMMDBFile::ReadMMDBF1 ( cpstr MMDBLFName, byte gzipMode ) { pstr FName; FName = getenv ( MMDBLFName ); if (FName) return ReadCoorFile ( FName,gzipMode ); else return Error_NoLogicalName; } int CMMDBFile::ReadMMDBF ( cpstr MMDBFileName, byte gzipMode ) { char Label[100]; byte Version; CFile f; f.assign ( MMDBFileName,False,True,gzipMode ); FType = MMDB_FILE_Binary; if (f.reset(True)) { f.ReadFile ( Label,sizeof(MMDBFLabel) ); if (strncmp(Label,MMDBFLabel,sizeof(MMDBFLabel))) { f.shut(); return Error_ForeignFile; } f.ReadByte ( &Version ); if (Version>Edition) { f.shut(); return Error_WrongEdition; } read ( f ); f.shut(); } else return Error_CantOpenFile; return 0; } int CMMDBFile::WriteMMDBF1 ( cpstr MMDBLFName, byte gzipMode ) { pstr FName; FName = getenv ( MMDBLFName ); if (FName) return WriteMMDBF ( FName,gzipMode ); else return Error_NoLogicalName; } int CMMDBFile::WriteMMDBF ( cpstr MMDBFileName, byte gzipMode ) { char Label[100]; byte Version=Edition; CFile f; f.assign ( MMDBFileName,False,True,gzipMode ); FType = MMDB_FILE_Binary; if (f.rewrite()) { strcpy ( Label,MMDBFLabel ); f.WriteFile ( Label,sizeof(MMDBFLabel) ); f.WriteByte ( &Version ); write ( f ); f.shut(); } else return Error_CantOpenFile; return 0; } pstr CMMDBFile::GetEntryID() { return Title.idCode; } void CMMDBFile::SetEntryID ( const IDCode idCode ) { strcpy ( Title.idCode,idCode ); } void CMMDBFile::SetSyminfoLib ( cpstr syminfo_lib ) { Cryst.SetSyminfoLib ( syminfo_lib ); } pstr CMMDBFile::GetSyminfoLib() { return Cryst.GetSyminfoLib(); } int CMMDBFile::SetSpaceGroup ( cpstr spGroup ) { return Cryst.SetSpaceGroup ( spGroup ); } pstr CMMDBFile::GetSpaceGroup() { return Cryst.GetSpaceGroup(); } pstr CMMDBFile::GetSpaceGroupFix() { return Cryst.GetSpaceGroupFix(); } void CMMDBFile::GetAtomStatistics ( RSAtomStat AS ) { int i; AS.Init(); for (i=0;iCalcAtomStatistics ( AS ); AS.Finish(); } void CMMDBFile::SetIgnoreSCALEi ( Boolean ignoreScalei ) { Cryst.ignoreScalei = ignoreScalei; } void CMMDBFile::SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { Cryst.SetCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, cell_gamma,OrthCode ); } void CMMDBFile::PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { Cryst.PutCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, cell_gamma,OrthCode ); } int CMMDBFile::GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol, int & OrthCode ) { if (Cryst.WhatIsSet & CSET_CellParams) { Cryst.GetCell ( cell_a,cell_b,cell_c,cell_alpha,cell_beta, cell_gamma,vol ); OrthCode = Cryst.NCode + 1; return 1; } else { cell_a = 0.0; cell_b = 0.0; cell_c = 0.0; cell_alpha = 0.0; cell_beta = 0.0; cell_gamma = 0.0; vol = 0.0; OrthCode = 0; return 0; } } int CMMDBFile::GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols, int & OrthCode ) { if (Cryst.WhatIsSet & CSET_CellParams) { Cryst.GetRCell ( cell_as,cell_bs,cell_cs,cell_alphas,cell_betas, cell_gammas,vols ); OrthCode = Cryst.NCode + 1; return 1; } else { cell_as = 0.0; cell_bs = 0.0; cell_cs = 0.0; cell_alphas = 0.0; cell_betas = 0.0; cell_gammas = 0.0; vols = 0.0; OrthCode = 0; return 0; } } int CMMDBFile::GetNumberOfSymOps() { if (Cryst.WhatIsSet & CSET_SpaceGroup) return Cryst.GetNumberOfSymOps(); else return 0; } pstr CMMDBFile::GetSymOp ( int Nop ) { return Cryst.GetSymOp ( Nop ); } void CMMDBFile::GetROMatrix ( mat44 & RO ) { Mat4Copy ( Cryst.RO,RO ); } int CMMDBFile::GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ) { // GetTMatrix(..) calculates and returns the coordinate transformation // matrix, which converts orthogonal coordinates according to // the symmetry operation number Nop and places them into unit cell // shifted by cellshift_a a's, cellshift_b b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. return Cryst.GetTMatrix ( TMatrix,Nop,cellshift_a,cellshift_b, cellshift_c,NULL ); } int CMMDBFile::GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c ) { // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop. Translation // part of the resulting matrix is being chosen such that point // (x,y,z) has least distance to the center of primary (333) // unit cell, and then it is shifted by cellshift_a a's, // cellshift_b b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. return Cryst.GetUCTMatrix ( TMatrix,Nop,x,y,z, cellshift_a,cellshift_b,cellshift_c, NULL ); } int CMMDBFile::GetFractMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ) { // GetFractMatrix(..) calculates and returns the coordinate // transformation matrix, which converts fractional coordinates // according to the symmetry operation number Nop and places them // into unit cell shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. return Cryst.GetFractMatrix ( TMatrix,Nop,cellshift_a,cellshift_b, cellshift_c,NULL ); } int CMMDBFile::GetSymOpMatrix ( mat44 & TMatrix, int Nop ) { // // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // return Cryst.GetSymOpMatrix ( TMatrix,Nop ); } // ------------- User-Defined Data ------------------------ int CMMDBFile::RegisterUDInteger ( int udr_type, cpstr UDDataID ) { return UDRegister.RegisterUDInteger ( udr_type,UDDataID ); } int CMMDBFile::RegisterUDReal ( int udr_type, cpstr UDDataID ) { return UDRegister.RegisterUDReal ( udr_type,UDDataID ); } int CMMDBFile::RegisterUDString ( int udr_type, cpstr UDDataID ) { return UDRegister.RegisterUDString ( udr_type,UDDataID ); } int CMMDBFile::GetUDDHandle ( int udr_type, cpstr UDDataID ) { return UDRegister.GetUDDHandle ( udr_type,UDDataID ); } // ---------------------------------------------------------- int CMMDBFile::DeleteAllModels() { int i,k; Exclude = False; k = 0; for (i=0;i=1) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->GetNewChainID ( chID,length ); } return False; } // ------------------------------------------------------------- PCMask CMMDBFile::GetSelMask ( int selHnd ) { UNUSED_ARGUMENT(selHnd); return NULL; } // ------------------------------------------------------------- int CMMDBFile::GetNofExpDataRecs() { return Title.ExpData.Length(); } pstr CMMDBFile::GetExpDataRec ( int recNo ) { PCExpData expData; expData = PCExpData(Title.ExpData.GetContainerClass(recNo)); if (expData) return expData->Line; return NULL; } // ------------------- Stream functions ---------------------- void CMMDBFile::Copy ( PCMMDBFile MMDBFile ) { int i; Title.Copy ( &MMDBFile->Title ); Cryst.Copy ( &MMDBFile->Cryst ); // It is important to copy atoms _before_ models, // residues and chains! Flags = MMDBFile->Flags; nAtoms = MMDBFile->nAtoms; AtmLen = nAtoms; if (nAtoms>0) { Atom = new PCAtom[AtmLen]; for (i=0;iAtom[i]) { Atom[i] = newCAtom(); Atom[i]->Copy ( MMDBFile->Atom[i] ); Atom[i]->index = i+1; // the internal atom references are installed // by residue classes when they are copied in // model->chain below } else Atom[i] = NULL; } nModels = MMDBFile->nModels; if (nModels>0) { Model = new PCModel[nModels]; for (i=0;iModel[i]) { Model[i] = newCModel(); Model[i]->SetMMDBManager ( PCMMDBManager(this),i+1 ); Model[i]->_copy ( MMDBFile->Model[i] ); } else Model[i] = NULL; } } SA .Copy ( &MMDBFile->SA ); Footnote.Copy ( &MMDBFile->Footnote ); SB .Copy ( &MMDBFile->SB ); SC .Copy ( &MMDBFile->SC ); if (MMDBFile->CIF) { CIF = new CMMCIFData; CIF->Copy ( MMDBFile->CIF ); } } // ------- user-defined data handlers int CMMDBFile::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_HIERARCHY) return CUDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CMMDBFile::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_HIERARCHY) return CUDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CMMDBFile::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_HIERARCHY) return CUDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int CMMDBFile::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_HIERARCHY) return CUDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CMMDBFile::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_HIERARCHY) return CUDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CMMDBFile::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_HIERARCHY) return CUDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int CMMDBFile::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_HIERARCHY) return CUDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } pstr CMMDBFile::GetStructureTitle ( pstr & L ) { return Title.GetStructureTitle ( L ); } void CMMDBFile::SetShortBinary() { // leaves only coordinates in binary files int i; for (i=0;iSetShortBinary(); } void CMMDBFile::write ( RCFile f ) { int i,k; byte Version=1; f.WriteByte ( &Version ); CUDData::write ( f ); Title .write ( f ); Cryst .write ( f ); UDRegister.write ( f ); DefPath .write ( f ); f.WriteWord ( &Flags ); f.WriteInt ( &nAtoms ); for (i=0;iwrite ( f ); } f.WriteInt ( &nModels ); for (i=0;iwrite ( f ); } SA .write ( f ); Footnote.write ( f ); SB .write ( f ); SC .write ( f ); StreamWrite ( f,CIF ); } void CMMDBFile::read ( RCFile f ) { int i,k; byte Version; ResetManager (); FreeFileMemory(); f.ReadByte ( &Version ); CUDData::read ( f ); Title .read ( f ); Cryst .read ( f ); UDRegister.read ( f ); DefPath .read ( f ); // It is important to read atoms before models, // residues and chains! f.ReadWord ( &Flags ); f.ReadInt ( &nAtoms ); AtmLen = nAtoms; if (nAtoms>0) { Atom = new PCAtom[AtmLen]; for (i=0;iread ( f ); // the internal atom references are installed // by residue classes when they are read in // model->chain below } else Atom[i] = NULL; } } f.ReadInt ( &nModels ); if (nModels>0) { Model = new PCModel[nModels]; for (i=0;iSetMMDBManager ( PCMMDBManager(this),0 ); Model[i]->read ( f ); } else Model[i] = NULL; } } SA .read ( f ); Footnote.read ( f ); SB .read ( f ); SC .read ( f ); StreamRead ( f,CIF ); } MakeStreamFunctions(CMMDBFile) int isMMDBBIN ( cpstr FName, byte gzipMode ) { char Label[100]; byte Version; CFile f; f.assign ( FName,False,True,gzipMode ); if (f.reset(True)) { if (f.FileEnd()) { f.shut(); return Error_EmptyFile; } f.ReadFile ( Label,sizeof(MMDBFLabel) ); if (strncmp(Label,MMDBFLabel,sizeof(MMDBFLabel))) { f.shut(); return 1; } f.ReadByte ( &Version ); f.shut(); if (Version>Edition) return 2; else return 0; } else return -1; } int isPDB ( cpstr FName, byte gzipMode, Boolean IgnoreBlankLines ) { CFile f; char S[256]; int i; Boolean Done; // opening it in pseudo-binary mode helps reading various // line terminators for files coming from different platforms f.assign ( FName,False,False,gzipMode ); if (f.reset(True)) { if (f.FileEnd()) { f.shut(); return Error_EmptyFile; } do { Done = True; f.ReadLine ( S,sizeof(S)-1 ); if (IgnoreBlankLines) { i = 0; while (S[i] && (S[i]==' ')) i++; if (!S[i]) Done = False; } } while ((!f.FileEnd()) && (!Done)); f.shut(); PadSpaces ( S,80 ); if (!strncasecmp(S,"HEADER",6)) return 0; if (!strncasecmp(S,"OBSLTE",6)) return 0; if (!strncasecmp(S,"TITLE ",6)) return 0; if (!strncasecmp(S,"CAVEAT",6)) return 0; if (!strncasecmp(S,"COMPND",6)) return 0; if (!strncasecmp(S,"SOURCE",6)) return 0; if (!strncasecmp(S,"KEYWDS",6)) return 0; if (!strncasecmp(S,"EXPDTA",6)) return 0; if (!strncasecmp(S,"AUTHOR",6)) return 0; if (!strncasecmp(S,"REVDAT",6)) return 0; if (!strncasecmp(S,"SPRSDE",6)) return 0; if (!strncasecmp(S,"JRNL ",6)) return 0; if (!strncasecmp(S,"REMARK",6)) return 0; if (!strncasecmp(S,"DBREF ",6)) return 0; if (!strncasecmp(S,"SEQADV",6)) return 0; if (!strncasecmp(S,"SEQRES",6)) return 0; if (!strncasecmp(S,"MODRES",6)) return 0; if (!strncasecmp(S,"HET ",6)) return 0; if (!strncasecmp(S,"HETNAM",6)) return 0; if (!strncasecmp(S,"HETSYN",6)) return 0; if (!strncasecmp(S,"FORMUL",6)) return 0; if (!strncasecmp(S,"HELIX ",6)) return 0; if (!strncasecmp(S,"SHEET ",6)) return 0; if (!strncasecmp(S,"TURN ",6)) return 0; if (!strncasecmp(S,"SSBOND",6)) return 0; if (!strncasecmp(S,"LINK ",6)) return 0; if (!strncasecmp(S,"HYDBND",6)) return 0; if (!strncasecmp(S,"SLTBRG",6)) return 0; if (!strncasecmp(S,"CISPEP",6)) return 0; if (!strncasecmp(S,"SITE ",6)) return 0; if (!strncasecmp(S,"CRYST1",6)) return 0; if (!strncasecmp(S,"CRYST ",6)) return 0; if (!strncasecmp(S,"ORIGX1",6)) return 0; if (!strncasecmp(S,"ORIGX2",6)) return 0; if (!strncasecmp(S,"ORIGX3",6)) return 0; if (!strncasecmp(S,"SCALE1",6)) return 0; if (!strncasecmp(S,"SCALE2",6)) return 0; if (!strncasecmp(S,"SCALE3",6)) return 0; if (!strncasecmp(S,"MTRIX1",6)) return 0; if (!strncasecmp(S,"MTRIX2",6)) return 0; if (!strncasecmp(S,"MTRIX3",6)) return 0; if (!strncasecmp(S,"TVECT ",6)) return 0; if (!strncasecmp(S,"MODEL ",6)) return 0; if (!strncasecmp(S,"ATOM ",6)) return 0; if (!strncasecmp(S,"SIGATM",6)) return 0; if (!strncasecmp(S,"ANISOU",6)) return 0; if (!strncasecmp(S,"SIGUIJ",6)) return 0; if (!strncasecmp(S,"TER ",6)) return 0; if (!strncasecmp(S,"HETATM",6)) return 0; if (!strncasecmp(S,"ENDMDL",6)) return 0; if (!strncasecmp(S,"CONECT",6)) return 0; if (!strncasecmp(S,"MASTER",6)) return 0; if (!strncasecmp(S,"END ",6)) return 0; if (!strncasecmp(S,"USER ",6)) return 0; return 1; } else return -1; } mmdb-1.23.2.1/src/mmdb_manager.cpp0000644000175100017510000002434111475665502013523 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 17.03.09 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_manager // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBManager ( MMDB file manager class ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2009 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __MMDB_Manager__ #include "mmdb_manager.h" #endif // ===================== CMMDBManager ======================= CMMDBManager::CMMDBManager() : CMMDBBondManager() { } CMMDBManager::CMMDBManager ( RPCStream Object ) : CMMDBBondManager(Object) { } CMMDBManager::~CMMDBManager() {} void CMMDBManager::Copy ( PCMMDBManager MMDB, word CopyMask ) { PCModel model; PPCChain chain; PCChain ch; ChainID chID; int i,j, nchains; if (CopyMask & MMDBFCM_Flags) Flags = MMDB->Flags; if (CopyMask & MMDBFCM_Title) Title.Copy ( &(MMDB->Title) ); if (CopyMask & MMDBFCM_Cryst) Cryst.Copy ( &(MMDB->Cryst) ); if (CopyMask & MMDBFCM_Coord) { FreeCoordMemory (); DeleteAllSelections(); nAtoms = MMDB->nAtoms; AtmLen = nAtoms; if (nAtoms>0) { Atom = new PCAtom[AtmLen]; for (i=0;iAtom[i]) { Atom[i] = newCAtom(); Atom[i]->Copy ( MMDB->Atom[i] ); // the internal atom references are installed // by residue classes when they are read in // model->chain below Atom[i]->SetAtomIndex ( i+1 ); } else Atom[i] = NULL; } } nModels = MMDB->nModels; if (nModels>0) { Model = new PCModel[nModels]; for (i=0;iModel[i]) { Model[i] = newCModel(); Model[i]->SetMMDBManager ( this,0 ); Model[i]->_copy ( MMDB->Model[i] ); } else Model[i] = NULL; } } crModel = NULL; crChain = NULL; crRes = NULL; if (MMDB->crModel) { for (i=0;iserNum==MMDB->crModel->serNum) { crModel = Model[i]; break; } } if (crModel && crModel->Chain && MMDB->crChain) for (i=0;inChains;i++) if (crModel->Chain[i]) { if (!strcmp(crModel->Chain[i]->chainID, MMDB->crModel->Chain[i]->chainID)) { crChain = crModel->Chain[i]; break; } } if (crChain && crChain->Residue && MMDB->crRes) for (i=0;inResidues;i++) if (crChain->Residue[i]) { if ((!strcmp(crChain->Residue[i]->name, MMDB->crRes->name)) && (crChain->Residue[i]->seqNum==MMDB->crRes->seqNum) && (!strcmp(crChain->Residue[i]->insCode, MMDB->crRes->insCode))) { crRes = crChain->Residue[i]; break; } } } /* if ((MMDB->nSelections>0) && MMDB->Mask) { nSelections = MMDB->nSelections; if (nSelections>0) { Mask = new PCMask [nSelections]; SelAtom = new PPCAtom[nSelections]; nSelAtoms = new int [nSelections]; for (i=0;iCopyMask ( MMDB->Mask[i] ); nSelAtoms[i] = MMDB->nSelAtoms[i]; if (nSelAtoms[i]>0) { SelAtom[i] = new PCAtom[nSelAtoms[i]]; for (j=0;jSelAtom[i][j]->index]; } else SelAtom[i] = NULL; } } } */ } else if (CopyMask & (MMDBFCM_HetInfo | MMDBFCM_SecStruct | MMDBFCM_Links | MMDBFCM_CisPeps | MMDBFCM_ChainAnnot)) { for (i=0;inModels;i++) if (MMDB->Model[i]) { model = GetModel ( i+1 ); if (!model) { model = new CModel( NULL,i+1 ); AddModel ( model ); } if (CopyMask & MMDBFCM_HetInfo) model->CopyHets ( MMDB->Model[i] ); if (CopyMask & MMDBFCM_SecStruct) model->CopySecStructure ( MMDB->Model[i] ); if (CopyMask & MMDBFCM_Links) { model->CopyLinks ( MMDB->Model[i] ); model->CopyLinkRs ( MMDB->Model[i] ); } if (CopyMask & MMDBFCM_CisPeps) model->CopyCisPeps ( MMDB->Model[i] ); if (CopyMask & MMDBFCM_ChainAnnot) { MMDB->GetChainTable ( i+1,chain,nchains ); for (j=0;jGetChainID ( chID ); ch = model->GetChain ( chID ); if (!ch) { ch = new CChain(); ch->SetChainID ( chID ); model->AddChain ( ch ); } ch->CopyAnnotations ( chain[j] ); } } } } if (CopyMask & MMDBFCM_SA) SA.Copy ( &(MMDB->SA) ); if (CopyMask & MMDBFCM_SB) SB.Copy ( &(MMDB->SB) ); if (CopyMask & MMDBFCM_SC) SC.Copy ( &(MMDB->SC) ); if (CopyMask & MMDBFCM_Footnotes) Footnote.Copy ( &(MMDB->Footnote) ); if (CopyMask & MMDBFCM_Buffer) { lcount = MMDB->lcount; strncpy ( S,MMDB->S,sizeof(S) ); } } void CMMDBManager::Delete ( word DelMask ) { PPCModel model; PPCChain chain; int i,j,nm, nchains; if (DelMask & MMDBFCM_Flags) Flags = 0; if (DelMask & MMDBFCM_Title) Title.Copy ( NULL ); if (DelMask & MMDBFCM_TitleKeepBM) Title.FreeMemory ( True ); if (DelMask & MMDBFCM_Cryst) Cryst.Copy ( NULL ); if (DelMask & MMDBFCM_Coord) { FreeCoordMemory (); DeleteAllSelections(); } if (DelMask & MMDBFCM_SecStruct) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveSecStructure(); } if (DelMask & MMDBFCM_HetInfo) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveHetInfo(); } if (DelMask & MMDBFCM_Links) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveLinks (); model[i]->RemoveLinkRs(); } } if (DelMask & MMDBFCM_CisPeps) { GetModelTable ( model,nm ); if (model) for (i=0;iRemoveCisPeps(); } if (DelMask & MMDBFCM_ChainAnnot) { nm = GetNumberOfModels(); for (i=1;i<=nm;i++) { GetChainTable ( i,chain,nchains ); if (chain) for (j=0;jFreeAnnotations(); } } if (DelMask & MMDBFCM_SA) SA.FreeContainer(); if (DelMask & MMDBFCM_SB) SB.FreeContainer(); if (DelMask & MMDBFCM_SC) SC.FreeContainer(); if (DelMask & MMDBFCM_Footnotes) Footnote.FreeContainer(); if (DelMask & MMDBFCM_Buffer) { lcount = 0; S[0] = char(0); } } PCTitleContainer CMMDBManager::GetRemarks() { return Title.GetRemarks(); } realtype CMMDBManager::GetResolution() { return Title.GetResolution(); } int CMMDBManager::ParseBiomolecules() { return Title.ParseBiomolecules(); } int CMMDBManager::GetNofBiomolecules() { return Title.GetNofBiomolecules(); } void CMMDBManager::GetBiomolecules ( PPCBiomolecule & BM, int & nBMs ) { Title.GetBiomolecules ( BM,nBMs ); } PCBiomolecule CMMDBManager::GetBiomolecule ( int bmNo ) { return Title.GetBiomolecule ( bmNo ); } PCMMDBManager CMMDBManager::MakeBiomolecule ( int bmNo, int modelNo ) { PCMMDBManager M; PPCChain ch; PCChain chain; PCModel model; PCBiomolecule BM; int i,j,k,n,n0,nChains; BM = Title.GetBiomolecule ( bmNo ); if (!BM) return NULL; GetChainTable ( modelNo,ch,nChains ); if ((!ch) || (nChains<=0)) return NULL; n0 = 0; model = new CModel(); for (i=0;(inBMAs) && (n0>=0);i++) if (BM->BMApply[i]) { for (j=0;(jBMApply[i]->nMatrices) && (n0>=0);j++) for (k=0;(kBMApply[i]->nChains) && (n0>=0);k++) { n0 = -1; for (n=0;(nGetChainID(),BM->BMApply[i]->chain[k])) n0 = n; if (n0>=0) { chain = new CChain(); chain->Copy ( ch[n0] ); chain->ApplyTransform ( BM->BMApply[i]->tm[j] ); model->AddChain ( chain ); } } } if (n0>=0) { M = new CMMDBManager(); M->AddModel ( model ); M->PDBCleanup ( PDBCLEAN_SERIAL | PDBCLEAN_INDEX ); } else { delete model; M = NULL; } return M; } // ------------------- Stream functions ---------------------- void CMMDBManager::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CMMDBBondManager::write ( f ); } void CMMDBManager::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CMMDBBondManager::read ( f ); } MakeStreamFunctions(CMMDBManager) mmdb-1.23.2.1/src/mmdb_manager.h0000644000175100017510000000771411475666363013203 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 17.03.09 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_manager // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBManager ( MMDB file manager ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2009 // // ================================================================= // #ifndef __MMDB_Manager__ #define __MMDB_Manager__ #ifndef __MMDB_BondMngr__ #include "mmdb_bondmngr.h" #endif // ======================= CMMDBManager =========================== // copy masks #define MMDBFCM_All 0xFFFFFFFF #define MMDBFCM_Title 0x00000001 #define MMDBFCM_TitleKeepBM 0x00000002 #define MMDBFCM_Cryst 0x00000004 #define MMDBFCM_Coord 0x00000008 #define MMDBFCM_SecStruct 0x00000010 #define MMDBFCM_HetInfo 0x00000020 #define MMDBFCM_Links 0x00000040 #define MMDBFCM_CisPeps 0x00000080 #define MMDBFCM_SA 0x00000100 #define MMDBFCM_SB 0x00000200 #define MMDBFCM_SC 0x00000400 #define MMDBFCM_Footnotes 0x00000800 #define MMDBFCM_ChainAnnot 0x00001000 #define MMDBFCM_Flags 0x00002000 #define MMDBFCM_Buffer 0x80000000 #define MMDBFCM_Top 0xFFFFFFF7 DefineStreamFunctions(CMMDBManager) class CMMDBManager : public CMMDBBondManager { public : CMMDBManager (); CMMDBManager ( RPCStream Object ); ~CMMDBManager(); // --------------- Copying/Deleting ----------------------- // Copy(..) will transfer different sort of information // between two MMDB's according to the copy mask given // (cf. MMDBFCM_XXXXX values). Note that the copying content // replaces the corresponding information (e.g. copying // coordinates will replace existing coordinates rather than // add to them). void Copy ( PCMMDBManager MMDB, word CopyMask ); // Delete(..) deletes different sort of information from // the MMDB according to the delete mask given. void Delete ( word DelMask ); // DelMask is the same as CopyMask PCTitleContainer GetRemarks(); realtype GetResolution(); // -1.0 means no resolution record in file int ParseBiomolecules(); // returns the number of biomolecules, // -2 for general format error // -3 for errors in BIOMT records int GetNofBiomolecules(); void GetBiomolecules ( PPCBiomolecule & BM, int & nBMs ); PCBiomolecule GetBiomolecule ( int bmNo ); // bmno=0,1,.. // returns NULL if bmNo is incorrect PCMMDBManager MakeBiomolecule ( int bmNo, int modelNo=1 ); protected : // --------------- Stream I/O ----------------------------- void write ( RCFile f ); void read ( RCFile f ); }; #endif mmdb-1.23.2.1/src/mmdb_coormngr.h0000644000175100017510000012102711475666363013411 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_coormngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CBrick ( space brick ) // ~~~~~~~~~ CMMDBCoorManager ( MMDB atom coordinate manager ) // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_CoorMngr__ #define __MMDB_CoorMngr__ #ifndef __MMDB_File__ #include "mmdb_file.h" #endif // =========================== CBrick ============================== // bricking control #define BRICK_ON_1 0x00000001 #define BRICK_ON_2 0x00000002 #define BRICK_READY 0x00000004 DefineClass(CBrick) typedef PPCBrick * PPPCBrick; class CBrick { public : int nAtoms; // number of atoms hit into brick PPCAtom Atom; // pointers to atoms ivector id; // atom ids (in present realization, these are // indices of atoms from the bricked array) CBrick (); ~CBrick(); void Clear (); void AddAtom ( PCAtom A, int atomid ); protected : int nAllocAtoms; void InitBrick(); }; // =========================== CMBrick ============================= // Bricking multiple structures DefineClass(CMBrick) typedef PPCMBrick * PPPCMBrick; class CMBrick { public : ivector nAtoms; // number of atoms in the brick PPCAtom * Atom; // pointers to atoms imatrix id; // atom ids (in present realization, these are // indices of atoms from the bricked array) CMBrick ( int nStructures ); ~CMBrick(); void Clear (); void AddAtom ( PCAtom A, int structNo, int atomid ); protected : ivector nAllocAtoms; int nStruct; void InitMBrick ( int nStructures ); }; // ==================== CGenSym ======================== DefineClass(CGenSym) DefineStreamFunctions(CGenSym) class CGenSym : public CSymOps { friend class CMMDBCoorManager; public : CGenSym (); CGenSym ( RPCStream Object ); ~CGenSym(); void FreeMemory(); int AddSymOp ( cpstr XYZOperation ); // the number of just added operation may be obtained as // Nop = CGenSym::GetNofSymOps()-1 . int AddRenChain ( int Nop, const ChainID ch1, const ChainID ch2 ); void Copy ( PCSymOps GenSym ); void write ( RCFile f ); void read ( RCFile f ); protected : PChainID * chID1; // pairs of chains to rename from chID1[n][i] PChainID * chID2; // to chID2[n][i] for each operation n1, all atoms belonging // to residues closer than // +/-(seqDist-1) around that of // atom AIndex[atomNum], are // neglected. If chain is broken // (has a gap) on section // [-(seqDist-1)..seqDist-1], the // section of neglection is // shortened to that gap. RPSContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // is set to atomNum and // contact[i].id2 is set to the // index of 2nd contacting atom // in vector AIndex int & ncontacts, // number of contacts found. If // ncontacts>0 on input, it is // assumed that new contacts that // newly found contacts should be // appended to those already // existing int maxlen=0, // if <=0, then vector contact is // allocated dynamically. If // contact!=NULL, then it is // appended with new contacts. // The application is responsible // for deallocation of contact // after use. // If maxlen>0 then vector contact // is prohibited of dynamical // allocation/deallocation. In this // case, not more than maxlen // contacts will be returned. long group=0 // a contact group ID, which will be // simply stored in contact[i].group // fields. This ID may be useful // if contacts are obtained in // multiple calls of the function ); void SeekContacts ( PCAtom A, // 1st atom in contact PPCAtom AIndex, // index of atoms [0..ilen-1] to // check for contact with 1st atom int ilen, // length of index realtype dist1, // minimal contact distance realtype dist2, // maximal contact distance int seqDist, // the sequence distance to neglect. // If seqDist==0, all atoms are // checked for contact. If // seqDist==1, the atoms belonging // to the same residue as atom // A, are neglected. If seqDist>1, // all atoms belonging to residues // closer than +/-(seqDist-1) around // that of atom A, are neglected. If // chain is broken (has a gap) on // section // [-(seqDist-1)..seqDist-1], the // section of neglection is // shortened to that gap. RPSContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // is set to -1, and contact[i].id2 // is set to the index of 2nd // contacting atom in vector AIndex int & ncontacts, // number of contacts found. If // ncontacts>0 on input, it is // assumed that new contacts that // newly found contacts should be // appended those already existing int maxlen=0, // if <=0, then vector contact is // allocated dynamically. If // contact!=NULL, then it is // appended with new contacts. // The application is responsible // for deallocation of contact // after use. // If maxlen>0 then vector contact // is prohibited of dynamical // allocation/deallocation. In this // case, not more than maxlen // contacts will be returned. long group=0 // a contact group ID, which will be // simply stored in contact[i].group // fields. This ID may be useful // if contacts are obtained in // multiple calls of the function ); void SeekContacts ( PPCAtom AIndex1, // 1st atom index [0..ilen1-1] int ilen1, // length of 1st index PPCAtom AIndex2, // 2nd atom index [0..ilen2-1] to // check for contact with 1st index int ilen2, // length of 2nd index realtype dist1, // minimal contact distance realtype dist2, // maximal contact distance int seqDist, // the sequence distance to // neglect. // If seqDist==0, all atoms are // checked for contact. // If seqDist==1, the atoms // belonging to the same residue // are neglected. // If seqDist>1, all atoms // belonging to residues closer than // +/-(seqDist-1) to each other, // are neglected. If chain is broken // (has a gap) on section // [-(seqDist-1)..seqDist-1], the // section of neglection is // shortened to that gap. RPSContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // contains number of atom from 1st // index, and contact[i].id2 // contains number of atom from 2nd // index, contacting with the former // one int & ncontacts, // number of contacts found. If // ncontacts>0 on input, it is // assumed that newly found // contacts should be appended to // those already existing int maxlen=0, // if <=0, then vector contact is // allocated dynamically. If // contact!=NULL, then it is // appended with new contacts. // The application is responsible // for deallocation of contact // after use. // If maxlen>0 then vector contact // is prohibited of dynamical // allocation/deallocation. In this // case, not more than maxlen // contacts will be returned. mat44 * TMatrix=NULL, // transformation matrix for 2nd // set of atoms (AIndex2) long group=0, // a contact group ID, which will // be stored in contact[i].group // fields. This ID may be useful // if contacts are obtained in // multiple calls of the function int bricking=0, // bricking control; may be a // combination of BRICK_ON_1 or // BRICK_ON_2 with BRICK_READY Boolean doSqrt=True // if False, then SContact contains // square distances ); // Simplified optimized for speed version: // - no NULL pointers and Ters in AIndex1 and AIndex2 // - no checks for identity atoms in AIndex1 and AIndex2 // - contact must be pre-allocated with at least ilen1*ilen2 // elements // - contact returns square distances // - ncontacts is always reset void SeekContacts ( PPCAtom AIndex1, // 1st atom index [0..ilen1-1] int ilen1, // length of 1st index PPCAtom AIndex2, // 2nd atom index [0..ilen2-1] to // check for contact with 1st index int ilen2, // length of 2nd index realtype contDist, // maximal contact distance PSContact contact, // indices of contacting atoms // [0..ncontacts-1]. contact[i].id1 // contains number of atom from 1st // index, and contact[i].id2 // contains number of atom from 2nd // index, contacting with the former // one. Must be pre-allocated int & ncontacts, // number of contacts found int bricking=0 // bricking control; may be a // combination of BRICK_ON_1 or // BRICK_ON_2 with BRICK_READY ); void SeekContacts ( PPCAtom AIndex1, // 1st atom index [0..ilen1-1] int ilen1, // length of 1st index PPCAtom * AIndex2, // indexes of atoms to be checked // for contact with each atom from // Aindex1; dimension // [0..nStructures-1][0..ilen2[i]-1] ivector ilen2, // lengths of indexes AIndex2 int nStructures, // number of indexes AIndex2 realtype dist1, // minimal contact distance realtype dist2, // maximal contact distance PPCMContact & contact, // resulting contacts, one structure // per each position in AIndex1. If // AIndex1[i] is NULL, contact[i] is // also NULL. "contact" is always // allocated, no re-use or // re-allocation is attempted. int bricking=0 // bricking control; may be // BRICK_READY if AIndex2 does not // change ); protected : // bricks realtype brick_size, xbrick_0,ybrick_0,zbrick_0; int nbrick_x,nbrick_y,nbrick_z; PPPCBrick * Brick; realtype mbrick_size, xmbrick_0,ymbrick_0,zmbrick_0; int nmbrick_x,nmbrick_y,nmbrick_z; PPPCMBrick * MBrick; // --------------- Stream I/O ----------------------------- void write ( RCFile f ); void read ( RCFile f ); void InitMMDBCoorManager(); void ApplySymTransform ( int SymMatrixNo, PCGenSym GenSym=NULL ); void ResetManager (); void FindSeqSection ( PCAtom atom, int seqDist, int & seq1, int & seq2 ); Boolean isContact ( PCAtom a1, PCAtom a2, int seq1, int seq2, realtype dd, realtype d12, realtype d22, realtype & d2 ); Boolean isContact ( realtype x, realtype y, realtype z, PCAtom a2, realtype dd, realtype d12, realtype d22, realtype & d2 ); }; // =================================================================== // GetEulerRotMatrix(..) calculates the Euler rotation matrix // for rotation: // 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma extern void GetEulerRotMatrix ( mat33 & erm, realtype alpha, realtype beta, realtype gamma ); // GetEulerTMatrix(..) calculates the Euler rotation-translation // matrix for rotation: // 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. extern void GetEulerTMatrix ( mat44 & erm, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ); // Euler rotation: 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. extern void EulerRotation ( PPCAtom A, int nA, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ); // GetVecRotMatrix(..) calculates the rotation matrix for // rotation by angle alpha about arbitrary vector directed // as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). extern void GetVecRotMatrix ( mat33 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz ); // Given the rotation matrix vrm, GetRotParameters(..) // returns the rotation angle alpha and the normalized // rotation axis vector (vx,vy,vz). // The rotation angle and vector are determined up to // their sign (however correlated, so that being substituted // into GetVecRotMatrix(..) they yield the same rotation // matrix). // The function does not check for vrm to be a valid // rotation matrix. extern void GetRotParameters ( mat33 & vrm, realtype & alpha, realtype & vx, realtype & vy, realtype & vz ); // GetVecTMatrix(..) calculates the rotation-translation matrix // for rotation by angle alpha about arbitrary vector directed as // (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). Point (x0,y0,z0) is // the center of rotation -- actually a point belonging to the // rotation axis. extern void GetVecTMatrix ( mat44 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ); // Vector rotation is rotation by angle alpha about arbitrary // vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). // Point (x0,y0,z0) is the center of rotation -- actually // a point belonging to the rotation axis. extern void VectorRotation ( PPCAtom A, int nA, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ); extern void GetMassCenter ( PPCAtom A, int nA, realtype & xmc, realtype & ymc, realtype & zmc ); #define SPOSEAT_Ok 0 #define SPOSEAT_NoAtoms 1 #define SPOSEAT_SVD_Fail 2 // Given two sets of atoms, A1 and A2, SuperposeAtoms(...) calculates // the rotational-translational matrix T such that |T*A1 - A2| is // minimal in least-square terms. // If vector C is not given (default), all nA atoms of set A1 are // considered as corresponding to nA first atoms of set A2, // A1[i] <-> A2[i], 0<=i A2[C[i]] only for those i that C[i]>=0. // The default option (C==NULL) is thus identical to C[i]==i, 0<=i // ~~~~~~~~~ // **** Project : MMDB ( MacroMolecular Data Base ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #include #ifndef __MATH_H #include #endif #ifndef __LinAlg__ #include "linalg_.h" #endif // ========================== Jacobi ============================= void Jacobi ( int N, // dimension of the matrix rmatrix A, // matrix to diagonalize; the lower // triangle, except the diagonal, // will remain unchanged rmatrix T, // eigenvectors placed as columns rvector Eigen, // vector of eigenvalues, orderd // by increasing rvector Aik, // working array int & Signal // 0 <=> Ok, ItMax <=> iteration limit // exchausted. ) { // Diagonalization of symmetric matrices by the method of Jacobi. // Key variables: // ItMax - the maximum available number of iterations // Eps1 - is used in SNA and CSA calculations // Eps2 - is the level of the elimination of the // non-diagonal matrix elements // Eps3 - the criterion to stop the iterations. // The iterations stop if (1-Sigma1/Sigma2)<=Eps3 // where Sigma1 is the dekart norm of the eigenvalues // at the preceding iteration and Sigma2 is // the same for the current iteration. realtype Eps1,Eps2,Eps3; realtype Sigma1,Sigma2,OffDsq, SPQ,CSA,SNA,Q,P, HoldIK,HoldKI; int ItMax; int i,j,k,Iter; Eps1 = 6.0e-9; Eps2 = 9.0e-12; Eps3 = 1.0e-8; ItMax = 9999; Signal = 0; if (N<=1) { T[1][1] = 1.0; Eigen[1] = A[1][1]; return; } for (i=1;i<=N;i++) { for (j=1;j<=N;j++) T[i][j] = 0.0; T[i][i] = 1.0; Eigen[i] = A[i][i]; } Sigma1 = 0.0; OffDsq = 0.0; // Sigma1 is the Dekart measure of the diagonal elements // OffDsq is the Dekart measure of the non-diagonal elements for (i=1;i<=N;i++) { Sigma1 += A[i][i]*A[i][i]; if (iEps3)) { for (i=1;iEps2)) { if (Q>Eps1) { P = 2.0*A[i][j]*(Q/(A[i][i]-A[j][j])); SPQ = sqrt(P*P+Q*Q); CSA = sqrt((1.0+Q/SPQ)/2.0); SNA = P/(SPQ*CSA*2.0); } else { CSA = sqrt(0.5); SNA = CSA; } for (k=1;k<=N;k++) { HoldKI = T[k][i]; T[k][i] = HoldKI*CSA + T[k][j]*SNA; T[k][j] = HoldKI*SNA - T[k][j]*CSA; } for (k=i;k<=N;k++) if (k<=j) { Aik[k] = A[i][k]; A[i][k] = CSA*Aik[k] + SNA*A[k][j]; if (k==j) { A[j][k] = SNA*Aik[k] - CSA*A[j][k]; Aik[j] = SNA*Aik[i] - CSA*Aik[j]; } } else { HoldIK = A[i][k]; A[i][k] = CSA*HoldIK + SNA*A[j][k]; A[j][k] = SNA*HoldIK - CSA*A[j][k]; } for (k=1;k<=j;k++) if (k>i) A[k][j] = SNA*Aik[k] - CSA*A[k][j]; else { HoldKI = A[k][i]; A[k][i] = CSA*HoldKI + SNA*A[k][j]; A[k][j] = SNA*HoldKI - CSA*A[k][j]; } } } Sigma2 = 0.0; for (i=1;i<=N;i++) { Eigen[i] = A[i][i]; Sigma2 += Eigen[i]*Eigen[i]; } HoldIK = fabs(1.0-Sigma1/Sigma2); Sigma1 = Sigma2; Iter++; } if (Iter>ItMax) Signal = ItMax; for (i=1;i<=N;i++) { k = i; for (j=i;j<=N;j++) if (Eigen[j]MaxOffl) MaxOffl = BB; } MaxOffl = sqrt(MaxOffl); } MinL2 = sqrt(MachEps)*MaxOffl; MaxAdd = 0.0; for (j=1;j<=N;j++) { S = 0.0; if (j>1) for (i=1;i1) for (k=1;kMinLjj) MinLjj = BB; } BB = MinLjj/MaxOffl; if (BB>MinL) MinLjj = BB; else MinLjj = MinL; if (L[j][j]>MinLjj*MinLjj) L[j][j] = sqrt(L[j][j]); else { if (MinL2>MinLjj) MinLjj = MinL2; BB = MinLjj*MinLjj-L[j][j]; if (BB>MaxAdd) MaxAdd = BB; L[j][j] = MinLjj; } if (j1) for (i=2;i<=N;i++) { Y[i] = B[i]; for (j=1;j1) for (i=N-1;i>=1;i--) { X[i] = Y[i]; for (j=i+1;j<=N;j++) X[i] -= L[j][i]*X[j]; X[i] /= L[i][i]; } } // ----------------------------------------------------- void ChSolve ( int N, rmatrix L, rvector G, rvector S ) { // A3.2.3 : Solution of the equation L*LT*S = G // by the Cholessky's method int i; LSolve ( N,L,G,S ); LTSolve ( N,L,S,S ); for (i=1;i<=N;i++) S[i] = -S[i]; } // ---------------------------------------------------- void FastInverse ( int N, rmatrix A, ivector J0, //#D realtype & Det, int & Signal ) { // // 17.01.91 <-- Last Date of Modification. // ---------------------------- // // ================================================ // // Fast Inversion of the matrix A // by the method of GAUSS - JOIRDAN . // // ------------------------------------------------ // // Input parameters are : // // N - dimension of the matrix // A - the matrix [1..N][1..N] to be inverted. // // ------------------------------------------------ // // J0 - integer vector [1..N] for temporal storage // // // ------------------------------------------------ // // Output parameters are : // // A - the inverted matrix // Signal - the error key : // = 0 <=> O'K // else // degeneration was found, and // the rang of matrix is Signal-1. // // Variable Det may return the determinant // of matrix A. To obtain it, remove all comments // of form //#D . // // ------------------------------------------------ // // Key Variables are : // // Eps - is the level for the degeneration // detection. Keep in mind, that // this routine does not norm the // matrix given, and thus Eps1 // is the ABSOLUTE value. // // ================================================ // realtype Eps = 1.0e-16; int i,j,k,i0; realtype A0,B; rvector Ai,Ai0; Signal = 0; if (N<=1) { if (fabs(A[1][1])A0) { A0 = fabs(A[j][i]); i0 = j; } } if (A0=1;i--) { j = J0[i]; if (j!=i) { //#D Det = -Det; for (k=1;k<=N;k++) { B = A[k][i]; A[k][i] = A[k][j]; A[k][j] = B; } } } return; } // End of the procedure FastInverse // ---------------------------------------------------- realtype Sign ( realtype A, realtype B ) { if (B>=0.0) return A; else return -A; } realtype SrX2Y2 ( realtype X, realtype Y ) { realtype Ax,Ay; Ax = fabs(X); Ay = fabs(Y); if (Ay>Ax) return Ay*sqrt((X*X)/(Y*Y)+1.0); if (Ay==Ax) return Ax*sqrt(2.0); return Ax*sqrt((Y*Y)/(X*X)+1.0); } // ---------------------------------------------------- void SVD ( int NA, int M, int N, rmatrix A, rmatrix U, rmatrix V, rvector W, rvector RV1, Boolean MatU, Boolean MatV, int & RetCode ) { // // 13.12.01 <-- Last Modification Date // ------------------------ // // ================================================ // // The Singular Value Decomposition // of the matrix A by the algorithm from // G.Forsait, M.Malkolm, K.Mouler. Numerical // methods of mathematical calculations // M., Mir, 1980. // // Matrix A is represented as // // A = U * W * VT // // ------------------------------------------------ // // All dimensions are indexed from 1 on. // // ------------------------------------------------ // // Input parameters: // // NA - number of lines in A. NA may be // equal to M or N only. If NA=M // then usual SVD will be made. If MA=N // then matrix A is transposed before // the decomposition, and the meaning of // output parameters U and V is // swapped (U accepts VT and VT accepts U). // In other words, matrix A has physical // dimension of M x N , same as U and V; // however the logical dimension of it // remains that of N x M . // M - number of lines in U // N - number of columns in U,V and length // of W,RV1 . Always provide M >= N ! // A - matrix [1..M][1..N] or [1..N][1..M] // to be decomposed. The matrix does not // change, and it may coincide with U or // V, if NA=M (in which case A does change) // MatU - compute U , if set True // MatV - compute V , if set True // RV1 - temporary array [1..N]. // U - should be always supplied as an array of // [1..M][1..N], M>=N . // V - should be suuplied as an array of // [1..N][1..N] if MatV is True . // // ------------------------------------------------ // // Output parameters are : // // W - N non-ordered singular values, // if RetCode=0. If RetCode<>0, the // RetCode+1 ... N -th values are still // valid // U - matrix of right singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatU is True. If MatU // is False, U is still used as a // temporary array. If RetCode<>0 then // the RetCode+1 ... N -th vectors // are valid // V - matrix of left singular vectors // (arranged in columns), corresponding // to the singular values in W, if // RetCode=0 and MatV is True. If MatV // is False, V is not used and may be set // to NULL. If RetCode<>0 then the // RetCode+1 ... N -th vectors are valid // RetCode - the error key : // = 0 <=> O'K // else // = k, if the k-th singular value // was not computed after 30 iterations. // // ------------------------------------------------ // // Key Variables are : // // ItnLimit - the limit for iterations // // This routine does not use any machine-dependent // constants. // // ================================================ // // int ItnLimit=300; int i,j,k,l,i1,k1,l1,its,mn,ExitKey; realtype C,G,F,X,S,H,Y,Z,Scale,ANorm,GG; l1 = 0; // used as index but defined in conditional, may be undefined RetCode = 0; if (U!=A) { if (NA==M) for (i=1;i<=M;i++) for (j=1;j<=N;j++) U[i][j] = A[i][j]; else for (i=1;i<=M;i++) for (j=1;j<=N;j++) U[i][j] = A[j][i]; } G = 0.0; Scale = 0.0; ANorm = 0.0; for (i=1;i<=N;i++) { l = i+1; RV1[i] = Scale*G; G = 0.0; S = 0.0; Scale = 0.0; if (i<=M) { for (k=i;k<=M;k++) Scale += fabs(U[k][i]); if (Scale!=0.0) { for (k=i;k<=M;k++) { U[k][i] /= Scale; S += U[k][i]*U[k][i]; } F = U[i][i]; G = -Sign(sqrt(S),F); H = F*G-S; U[i][i] = F-G; if (i!=N) for (j=l;j<=N;j++) { S = 0.0; for (k=i;k<=M;k++) S += U[k][i]*U[k][j]; F = S/H; for (k=i;k<=M;k++) U[k][j] += F*U[k][i]; } for (k=i;k<=M;k++) U[k][i] *= Scale; } } W[i] = Scale*G; G = 0.0; S = 0.0; Scale = 0.0; if ((i<=M) && (i!=N)) { for (k=l;k<=N;k++) Scale += fabs(U[i][k]); if (Scale!=0.0) { for (k=l;k<=N;k++) { U[i][k] /= Scale; S += U[i][k]*U[i][k]; } F = U[i][l]; G = -Sign(sqrt(S),F); H = F*G-S; U[i][l] = F-G; for (k=l;k<=N;k++) RV1[k] = U[i][k]/H; if (i!=M) for (j=l;j<=M;j++) { S = 0.0; for (k=l;k<=N;k++) S += U[j][k]*U[i][k]; for (k=l;k<=N;k++) U[j][k] += S*RV1[k]; } for (k=l;k<=N;k++) U[i][k] *= Scale; } } ANorm = RMax( ANorm,fabs(W[i])+fabs(RV1[i]) ); } // Accumulation of the right-hand transformations if (MatV) for (i=N;i>=1;i--) { if (i!=N) { if (G!=0.0) { for (j=l;j<=N;j++) V[j][i] = (U[i][j]/U[i][l]) / G; for (j=l;j<=N;j++) { S = 0.0; for (k=l;k<=N;k++) S += U[i][k]*V[k][j]; for (k=l;k<=N;k++) V[k][j] += S*V[k][i]; } } for (j=l;j<=N;j++) { V[i][j] = 0.0; V[j][i] = 0.0; } } V[i][i] = 1.0; G = RV1[i]; l = i; } // Accumulation of the left-hand transformations if (MatU) { mn = N; if (M=1;i--) { l = i+1; G = W[i]; if (i!=N) for (j=l;j<=N;j++) U[i][j] = 0.0; if (G!=0.0) { if (i!=mn) for (j=l;j<=N;j++) { S = 0.0; for (k=l;k<=M;k++) S += U[k][i]*U[k][j]; F = (S/U[i][i]) / G; for (k=i;k<=M;k++) U[k][j] += F*U[k][i]; } for (j=i;j<=M;j++) U[j][i] /= G; } else for (j=i;j<=M;j++) U[j][i] = 0.0; U[i][i] += 1.0; } } // Diagonalization of the two-diagonal form. for (k=N;k>=1;k--) { k1 = k-1; its = 0; do { ExitKey = 0; l = k+1; while ((ExitKey==0) && (l>1)) { l--; l1 = l-1; if (fabs(RV1[l])+ANorm==ANorm) ExitKey=1; else if (l1>0) { if (fabs(W[l1])+ANorm==ANorm) ExitKey=2; } } // if (ExitKey!=1) { <-- this is original statement if (ExitKey>1) { // <-- prevents from corruption due to l1<1. // This is a rare case as RV1[1] should be // always 0.0 . Apparently this logics is // on the edge of float-point arithmetic, // therefore extra precaution for the case // of l1<1 was found necessary. C = 0.0; S = 1.0; ExitKey = 0; i = l; while ((ExitKey==0) && (i<=k)) { F = S*RV1[i]; RV1[i] = C*RV1[i]; if (fabs(F)+ANorm==ANorm) ExitKey = 1; else { G = W[i]; H = SrX2Y2(F,G); W[i] = H; C = G/H; S = -F/H; if (MatU) for (j=1;j<=M;j++) { Y = U[j][l1]; Z = U[j][i]; U[j][l1] = Y*C+Z*S; U[j][i] = -Y*S+Z*C; } i++; } } } // Convergence Checking Z = W[k]; if (l!=k) { if (its>=ItnLimit) { RetCode = k; return; } its++; X = W[l]; Y = W[k1]; G = RV1[k1]; H = RV1[k]; F = ((Y-Z)*(Y+Z) + (G-H)*(G+H)) / ( 2.0*H*Y ); if (fabs(F)<=1.0) GG = Sign(sqrt(F*F+1.0),F); else GG = F*sqrt(1.0+1.0/F/F); F = ((X-Z)*(X+Z) + H*(Y/(F+GG)-H)) / X; // Next QR - Transformation C = 1.0; S = 1.0; for (i1=l;i1<=k1;i1++) { i = i1+1; G = RV1[i]; Y = W[i]; H = S*G; G = C*G; Z = SrX2Y2(F,H); RV1[i1] = Z; C = F/Z; S = H/Z; F = X*C+G*S; G = -X*S+G*C; H = Y*S; Y = Y*C; if (MatV) for (j=1;j<=N;j++) { X = V[j][i1]; Z = V[j][i]; V[j][i1] = X*C+Z*S; V[j][i] = -X*S+Z*C; } Z = SrX2Y2(F,H); W[i1] = Z; if (Z!=0.0) { C = F/Z; S = H/Z; } F = C*G+S*Y; X = -S*G+C*Y; if (MatU) for (j=1;j<=M;j++) { Y = U[j][i1]; Z = U[j][i]; U[j][i1] = Y*C+Z*S; U[j][i] = -Y*S+Z*C; } } RV1[l] = 0.0; RV1[k] = F; W[k] = X; } else if (Z<0.0) { W[k] = -Z; if (MatV) for (j=1;j<=N;j++) V[j][k] = -V[j][k]; } } while (l!=k); } } // ----------------------------------------------------- void OrderSVD ( int M, int N, rmatrix U, rmatrix V, rvector W, Boolean MatU, Boolean MatV ) { int i,k,j; realtype P; // External loop of the re-ordering for (i=1;iP) { k = j; P = W[j]; } if (k!=i) { // Swapping the singular value W[k] = W[i]; W[i] = P; // Swapping the U's columns ( if needed ) if (MatU) for (j=1;j<=M;j++) { P = U[j][i]; U[j][i] = U[j][k]; U[j][k] = P; } // Swapping the V's columns ( if needed ) if (MatV) for (j=1;j<=N;j++) { P = V[j][i]; V[j][i] = V[j][k]; V[j][k] = P; } } } } /* #ifndef __STDIO_H #include #endif int main ( int argc, char ** argv, char ** env ) { // Test Jacobi matrix A,T,A1; vector Eigen,Aik; realtype SR; int N,i,j,k,Signal; N = 4; GetMatrixMemory ( A,N,N,1,1 ); GetMatrixMemory ( T,N,N,1,1 ); GetMatrixMemory ( A1,N,N,1,1 ); GetVectorMemory ( Eigen,N,1 ); GetVectorMemory ( Aik ,N,1 ); k = 1; for (i=1;i<=N;i++) for (j=i;j<=N;j++) { A[i][j] = k++; A[i][j] *= 1000.0; A[j][i] = A[i][j]; } printf ( " INITIAL MATRIX:\n" ); for (i=1;i<=N;i++) { for (j=1;j<=N;j++) printf ( " %10.4f",A[i][j] ); printf ( "\n" ); } Jacobi ( N,A,T,Eigen,Aik,Signal ); printf ( "\n EIGEN VALUES AND EIGEN VECTORS:\n" ); for (i=1;i<=N;i++) { printf ( " %10.4f ",Eigen[i] ); for (j=1;j<=N;j++) printf ( " %10.4f",T[j][i] ); printf ( "\n" ); } printf ( "\n measure: " ); for (i=1;i<=N;i++) { SR = 0.0; for (j=1;j<=N;j++) SR += T[j][i]*T[j][i]; printf ( " %10.4f",sqrt(SR) ); } printf ( "\n" ); for (i=1;i<=N;i++) for (j=1;j<=N;j++) { A1[i][j] = 0.0; for (k=1;k<=N;k++) A1[i][j] += T[i][k]*Eigen[k]*T[j][k]; } printf ( "\n RESTORED INITIAL MATRIX:\n" ); for (i=1;i<=N;i++) { for (j=1;j<=N;j++) printf ( " %10.4f",A1[j][i] ); printf ( "\n" ); } FreeMatrixMemory ( A,N,1,1 ); FreeMatrixMemory ( T,N,1,1 ); FreeMatrixMemory ( A1,N,1,1 ); FreeVectorMemory ( Eigen,1 ); FreeVectorMemory ( Aik ,1 ); } */ mmdb-1.23.2.1/src/mmdb_file.h0000644000175100017510000005765511475666363012521 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 24.03.09 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_File // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBFile // ~~~~~~~~~ // // (C) E. Krissinel 2000-2009 // // ================================================================= // #ifndef __MMDB_File__ #define __MMDB_File__ #ifndef __File__ #include "file_.h" #endif #ifndef __mmdb_uddata__ #include "mmdb_uddata.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_Title__ #include "mmdb_title.h" #endif #ifndef __MMDB_Cryst__ #include "mmdb_cryst.h" #endif #ifndef __MMDB_Chain__ #include "mmdb_chain.h" #endif #ifndef __MMDB_Model__ #include "mmdb_model.h" #endif // ======================= CMMDBFile =========================== // special effect flags #define MMDBF_AutoSerials 0x00000001 #define MMDBF_NoCoordRead 0x00000002 #define MMDBF_SimRWBROOK 0x00000004 #define MMDBF_PrintCIFWarnings 0x00000008 #define MMDBF_EnforceSpaces 0x00000010 #define MMDBF_IgnoreDuplSeqNum 0x00000020 #define MMDBF_IgnoreSegID 0x00000040 #define MMDBF_IgnoreElement 0x00000080 #define MMDBF_IgnoreCharge 0x00000100 #define MMDBF_IgnoreNonCoorPDBErrors 0x00000200 #define MMDBF_IgnoreUnmatch 0x00000400 #define MMDBF_IgnoreBlankLines 0x00000800 #define MMDBF_IgnoreHash 0x00001000 #define MMDBF_IgnoreRemarks 0x00002000 #define MMDBF_AllowDuplChainID 0x00004000 #define MMDBF_FixSpaceGroup 0x00008000 #define MMDBF_EnforceAtomNames 0x00010000 #define MMDBF_EnforceUniqueChainID 0x00020000 // MMDBF_EnforceUniqueChainID will make MMDB to rename chains on // reading a file such as to maintain chains uniquesness. This // is supposed to work only with 1-letter chain IDs and only // if chain names are interchanged in the file. For example, // if file contains a sequence of chains named // // A,B, A,B, A,B, A,B, A,B // // and this flag is set on, the resulting chain names in // MMDB will be: // // A,B, A0,B0, A1,B1, A2,B2, A3,B3 // // file types: #define MMDB_FILE_Undefined -1 #define MMDB_FILE_PDB 0 #define MMDB_FILE_CIF 1 #define MMDB_FILE_Binary 2 // cleanup flags: #define PDBCLEAN_ATNAME 0x00000001 #define PDBCLEAN_TER 0x00000002 #define PDBCLEAN_CHAIN 0x00000004 #define PDBCLEAN_CHAIN_STRONG 0x00000008 #define PDBCLEAN_ALTCODE 0x00000010 #define PDBCLEAN_ALTCODE_STRONG 0x00000020 #define PDBCLEAN_SERIAL 0x00000040 #define PDBCLEAN_SEQNUM 0x00000080 #define PDBCLEAN_CHAIN_ORDER 0x00000100 #define PDBCLEAN_CHAIN_ORDER_IX 0x00000200 #define PDBCLEAN_SOLVENT 0x00000400 #define PDBCLEAN_INDEX 0x00000800 #define PDBCLEAN_ELEMENT 0x00001000 #define PDBCLEAN_ELEMENT_STRONG 0x00002000 // crystallographic info inquery #define CRRDY_NotPrecise 0x00000001 #define CRRDY_isTranslation 0x00000002 #define CRRDY_NoOrthCode 0x00000004 #define CRRDY_Complete 0 #define CRRDY_NoTransfMatrices -1 #define CRRDY_Unchecked -2 #define CRRDY_Ambiguous -3 #define CRRDY_NoCell -4 #define CRRDY_NoSpaceGroup -5 DefineClass(CMMDBFile) DefineStreamFunctions(CMMDBFile) class CMMDBFile : public CUDData { friend class CModel; friend class CChain; friend class CResidue; friend class CAtom; friend class CChannel; public : CMMDBFile (); CMMDBFile ( RPCStream Object ); ~CMMDBFile(); void FreeFileMemory(); // --------------- Reading/Writing external files --------- void SetFlag ( word Flag ); void RemoveFlag ( word Flag ); int ReadPDBASCII ( cpstr PDBFileName, byte gzipMode=GZM_CHECK ); int ReadPDBASCII1 ( cpstr PDBLFName, byte gzipMode=GZM_CHECK ); int ReadPDBASCII ( RCFile f ); int ReadCIFASCII ( cpstr CIFFileName, byte gzipMode=GZM_CHECK ); int ReadCIFASCII1 ( cpstr CIFLFName, byte gzipMode=GZM_CHECK ); int ReadFromCIF ( PCMMCIFData CIFD, Boolean fixSpaceGroup ); // adds info from PDB file int AddPDBASCII1 ( cpstr PDBLFName, byte gzipMode=GZM_CHECK ); int AddPDBASCII ( cpstr PDBFileName, byte gzipMode=GZM_CHECK ); // auto format recognition int ReadCoorFile ( cpstr LFName, byte gzipMode=GZM_CHECK ); int ReadCoorFile1 ( cpstr CFName, byte gzipMode=GZM_CHECK ); int WritePDBASCII ( cpstr PDBFileName, byte gzipMode=GZM_CHECK ); int WritePDBASCII1 ( cpstr PDBLFName, byte gzipMode=GZM_CHECK ); void WritePDBASCII ( RCFile f ); int WriteCIFASCII ( cpstr CIFFileName, byte gzipMode=GZM_CHECK ); int WriteCIFASCII1 ( cpstr CIFLFName, byte gzipMode=GZM_CHECK ); int ReadMMDBF ( cpstr MMDBFileName, byte gzipMode=GZM_CHECK ); int ReadMMDBF1 ( cpstr MMDBLFName, byte gzipMode=GZM_CHECK ); int WriteMMDBF ( cpstr MMDBFileName, byte gzipMode=GZM_CHECK ); int WriteMMDBF1 ( cpstr MMDBLFName, byte gzipMode=GZM_CHECK ); void GetInputBuffer ( pstr Line, int & count ); // PutPDBString adds a PDB-keyworded string // to the existing structure. Note that the string // is namely added meaning that it will be the // last REMARK, last JRNL, last ATOM etc. string // -- always the last one in its group. int PutPDBString ( cpstr PDBString ); // PDBCleanup(..) cleans coordinate part to comply with PDB // standards and MMDB "expectations": // // PDBCLEAN_ATNAME pads atom names with spaces to form // 4-symbol names // PDBCLEAN_TER inserts TER cards in the end of each chain // PDBCLEAN_CHAIN generates 1-character chain ids instead of // those many-character // PDBCLEAN_CHAIN_STRONG generates 1-character chain ids starting // from 'A' on for all ids, including the // single-character ones // PDBCLEAN_ALTCODE generates 1-character alternative codes // instead of many-character ones // PDBCLEAN_ALTCODE_STRONG generates 1-character alternative codes // from 'A' on for all codes, including the // single-character ones // PDBCLEAN_SERIAL puts serial numbers in due order // PDBCLEAN_SEQNUM renumbers all residues so that they go // incrementally-by-one without insertion codes // PDBCLEAN_CHAIN_ORDER puts chains in order of atom's serial // numbers // PDBCLEAN_CHAIN_ORDER_IX puts chains in order of atom's // indices internal to MMDB // PDBCLEAN_SOLVENT moves solvent chains at the end of each model // // Return codes (as bits): // 0 Ok // PDBCLEAN_CHAIN too many chains for assigning them // 1-letter codes // PDBCLEAN_ATNAME element names were not available // PDBCLEAN_ALTCODE too many alternative codes encountered. // word PDBCleanup ( word CleanKey ); // Makes all atoms in chain 'chainID', in all models, as // 'Het' atoms if Make is set True, and makes them 'ordinary' // atoms otherwise. 'Ter' is automatically removed when // converting to 'Het' atoms, and is automatically added // when converting to 'ordinary' atoms. This may cause // disorder in serial numbers -- just call // PDBClean(PDBCLEAN_SERIAL) when necessary to fix this. void MakeHetAtoms ( cpstr chainID, Boolean Make ); // --------------- Working with atoms by serial numbers --- PPCAtom GetAtomArray () { return Atom; } int GetAtomArrayLength() { return AtmLen; } // strictly not for // use in applications!! PCAtom GetAtomI ( int index ); // returns Atom[index-1] // PutAtom(..) puts atom with the specified properties // into the structure. The current model is used; if no model // is set (crModel==NULL), one is created. Coordinates and // other parameters of the atom need to be set separately. // The place, at which the atom is put, is determined by // index. If index is positive, then it points onto (index-1)th // element of the Atom array (the index counts 1,2,... and // generally coincides with the atom's serial number). If // there is already an atom at this position in the system, // the new atom will REPLACE it. The corresponding residues // are automatically updated. // If index is null (=0), the new atom will be put on // the top of the structure, i.e. it will be put into // (index=nAtoms+1)-th position. // If index is negative, then the new atom is INSERTED // BEFORE the atom in the (-index)th position. For saving // the computational efforts, this WILL NOT cause the // recalculation of all atoms' serial numbers according // to their actual positions. It will be needed, however, // for putting the things in order at a certain point, // especially before writing an output ASCII file. NOTE // that this ordering is never done automatically. // In a correct PDB file the serial number (serNum) is always // equal to its position (index). However here we allow them // to be different for easing the management of relations, // particularly the connectivity. // // Limitation: if PutAtom implies creating new // chains/residues, these are always created on the top // of existing chains/residues. int PutAtom ( int index, int serNum, const AtomName atomName, const ResName resName, const ChainID chainID, int seqNum, const InsCode insCode, const AltLoc altLoc, const SegID segID, const Element element ); int PutAtom ( int index, // same meaning as above PCAtom A, // pointer to completed atom class int serNum=0 // 0 means that the serial number // will be set equal to index. // Otherwise the serial number // is set to the specified // value ); // RemoveAtom(..) removes atom at the specified index // in the Atom array. This index is always accessible // as Atom[index]->index. If this leaves a residue empty, // the residue is removed. If this leaves an empty chain, // the chain is removed as well; the same happens to the // model. void RemoveAtom ( int index ); int FinishStructEdit(); void TrimModelTable(); // ---------------- Deleting models ----------------------- int DeleteAllModels (); Boolean GetNewChainID ( int modelNo, ChainID chID, int length=1 ); // --------------- Enquiring ------------------------------- int CrystReady(); // Returns flags: // CRRDY_Complete if crystallographic information is complete // CRRDY_NotPrecise if cryst. inf-n is not precise // CRRDY_isTranslation if cryst. inf-n contains translation // CRRDY_NoOrthCode no orthogonalization code // Fatal: // CRRDY_NoTransfMatrices if transform. matrices were not // calculated // CRRDY_Unchecked if cryst. inf-n was not checked // CRRDY_Ambiguous if cryst. inf-n is ambiguous // CRRDY_NoCell if cryst. inf-n is unusable // CRRDY_NoSpaceGroup if space group is not set Boolean isCrystInfo (); // cell parameters and space group Boolean isCellInfo (); // cell param-s a,b,c, alpha,beta,gamma Boolean isSpaceGroup (); // space group on CRYST1 card Boolean isTransfMatrix(); // orthogonalizing/fractionalizing // matrices Boolean isScaleMatrix (); // SCALEx PDB records Boolean isNCSMatrix (); // MTRIXx PDB records int GetNumberOfNCSMatrices(); int GetNumberOfNCSMates (); // Returns the number of // NCS mates not given in // the file (iGiven==0) Boolean GetNCSMatrix ( int NCSMatrixNo, // 0..N-1 mat44 & ncs_m, int & iGiven ); int GetNumberOfSymOps (); // number of symmetry operations pstr GetSymOp ( int Nop ); // XYZ symmetry operation name // ------------- User-Defined Data ------------------------ int RegisterUDInteger ( int udr_type, cpstr UDDataID ); int RegisterUDReal ( int udr_type, cpstr UDDataID ); int RegisterUDString ( int udr_type, cpstr UDDataID ); int GetUDDHandle ( int udr_type, cpstr UDDataID ); // ---------------------------------------------------------- void SetSyminfoLib ( cpstr syminfo_lib ); pstr GetSyminfoLib (); int SetSpaceGroup ( cpstr spGroup ); pstr GetSpaceGroup (); pstr GetSpaceGroupFix(); void GetAtomStatistics ( RSAtomStat AS ); void SetIgnoreSCALEi ( Boolean ignoreScalei ); // SetCell(..) is for changing cell parameters void SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode=0 ); // PutCell(..) is for setting cell parameters void PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode=0 ); int GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol, int & OrthCode ); int GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols, int & OrthCode ); void GetROMatrix ( mat44 & RO ); // GetTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop and places // them into unit cell shifted by cellshift_a a's, cellshift_b // b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ); // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation number Nop. Translation // part of the matrix is being chosen such that point (x,y,z) // has least distance to the center of primary (333) unit cell, // and then it is shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c ); // GetFractMatrix(..) calculates and returns the coordinate // transformation matrix, which converts fractional coordinates // according to the symmetry operation number Nop and places them // into unit cell shifted by cellshift_a a's, cellshift_b b's // and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. int GetFractMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c ); // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // int GetSymOpMatrix ( mat44 & TMatrix, int Nop ); int AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ); int GenerateNCSMates(); // 1: no NCS matrices, 0: Ok pstr GetEntryID (); void SetEntryID ( const IDCode idCode ); int GetNofExpDataRecs(); pstr GetExpDataRec ( int recNo ); // 0.. on int GetFileType() { return FType; } void Copy ( PCMMDBFile MMDBFile ); void SetShortBinary(); // leaves only coordinates in binary files // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); // GetStructureTitle() returns the contents of TITLE record // unfolded into single line. If Title is missing, returns // contents of COMPND(:MOLECULE). If COMPND is missing, returns // HEADER. If Header is missing, returns PDB code. If no PDB // code is there, returns "Not available". pstr GetStructureTitle ( pstr & L ); protected : word Flags; // special effect flags int FType; // type of last file operation: // -1 : none // 0 : PDB // 1 : CIF // 2 : BIN // encoded as MMDB_FILE_XXXXX above CMMDBTitle Title; // title section CMMDBCryst Cryst; // crystallographic information section CUDRegister UDRegister; // register of user-defined data int nModels; // number of models PPCModel Model; // array of models [0..nModels-1] int nAtoms; // number of atoms int AtmLen; // length of Atom array PPCAtom Atom; // array of atoms ordered by serial numbers CAtomPath DefPath; // default coordinate path CClassContainer SA; // string container for unrecognized strings // which are between the title and the // crystallographic sections CClassContainer Footnote; // string container for footnotes CClassContainer SB; // string container for unrecognized strings // which are between the crystallographic and // the coordinate sections CClassContainer SC; // string container for unrecognized strings // following the coordinate section // input buffer int lcount; // input line counter char S[500]; // read buffer PCMMCIFData CIF; // CIF file manager PCModel crModel; // current model, used at reading a PDB file PCChain crChain; // current chain, used at reading a PDB file PCResidue crRes; // current residue, used at reading a PDB file Boolean Exclude; // used internally Boolean ignoreRemarks; // used temporarily Boolean allowDuplChID; // used temporarily Boolean enforceUniqueChID; // used temporarily void InitMMDBFile (); void FreeCoordMemory (); void ReadPDBLine ( RCFile f, pstr L, int maxlen ); int ReadPDBAtom ( cpstr L ); int ReadCIFAtom ( PCMMCIFData CIFD ); int CheckAtomPlace ( int index, cpstr L ); int CheckAtomPlace ( int index, PCMMCIFLoop Loop ); int SwitchModel ( cpstr L ); int SwitchModel ( int nM ); int AllocateAtom ( int index, const ChainID chainID, const ResName resName, int seqNum, const InsCode insCode, Boolean Replace ); void ExpandAtomArray ( int inc ); void AddAtomArray ( int inc ); void ApplyNCSTransform ( int NCSMatrixNo ); virtual void ResetManager(); // --------------- Stream I/O ----------------------------- void write ( RCFile f ); void read ( RCFile f ); // don't use _ExcludeModel in your applications! int _ExcludeModel ( int serNum ); int CheckInAtom ( int index, PCAtom A ); int CheckInAtoms ( int index, PPCAtom A, int natms ); virtual PCMask GetSelMask ( int selHnd ); private : int modelCnt; // used only at reading files }; // isMMDBBIN will return // -1 if file FName does not exist // 0 if file FName is likely a MMDB BIN (binary) file // 1 if file FName is not a MMDB BIN (binary) file // 2 if file FName is likely a MMDB BIN (binary) file, // but of a wrong edition (i.e. produced by a lower // version of MMDB). extern int isMMDBBIN ( cpstr FName, byte gzipMode=GZM_CHECK ); // isPDB will return // -1 if file FName does not exist // 0 if file FName is likely a PDB file // 1 if file FName is not a PDB file extern int isPDB ( cpstr FName, byte gzipMode=GZM_CHECK, Boolean IgnoreBlankLines=False ); #endif mmdb-1.23.2.1/src/mmdb_uddata.h0000644000175100017510000000776211475666364013037 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_UDData // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CUDData ( user-defined data ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_UDData__ #define __MMDB_UDData__ #ifndef __MMDB_Mask__ #include "mmdb_mask.h" #endif // ======================== CUDRegister ========================== #define UDR_ATOM 0 #define UDR_RESIDUE 1 #define UDR_CHAIN 2 #define UDR_MODEL 3 #define UDR_HIERARCHY 4 #define UDRF_ATOM 0x01000000 #define UDRF_RESIDUE 0x02000000 #define UDRF_CHAIN 0x04000000 #define UDRF_MODEL 0x08000000 #define UDRF_HIERARCHY 0x10000000 #define UDRF_MASK 0x00FFFFFF DefineClass(CUDRegister) DefineStreamFunctions(CUDRegister) class CUDRegister : public CStream { public : CUDRegister (); CUDRegister ( RPCStream Object ); ~CUDRegister(); int RegisterUDInteger ( int udr_type, cpstr UDDataID ); int RegisterUDReal ( int udr_type, cpstr UDDataID ); int RegisterUDString ( int udr_type, cpstr UDDataID ); int GetUDDHandle ( int udr_type, cpstr UDDataID ); void write ( RCFile f ); void read ( RCFile f ); protected : int nIUDR[5],nRUDR[5],nSUDR[5]; psvector IUDRegister[5]; psvector RUDRegister[5]; psvector SUDRegister[5]; void InitUDRegister (); void FreeUDRegister (); int RegisterUDData ( psvector & UDRegister, int & nUDR, cpstr UDDataID ); }; // ========================== CUDData ============================ #define UDDATA_Ok 0 #define UDDATA_WrongHandle -1 #define UDDATA_WrongUDRType -2 #define UDDATA_NoData -3 DefineClass(CUDData) DefineStreamFunctions(CUDData) class CUDData : public CMask { friend class CMMDBSelManager; public : CUDData (); CUDData ( RPCStream Object ); ~CUDData(); protected : ivector IUData; rvector RUData; psvector SUData; void InitUDData (); void FreeUDDMemory(); int getNofIUData (); int getNofRUData (); int getNofSUData (); void setNofSUData ( int newN ); int putUDData ( int UDDhandle, int iudd ); int putUDData ( int UDDhandle, realtype rudd ); int putUDData ( int UDDhandle, cpstr sudd ); int getUDData ( int UDDhandle, int & iudd ); int getUDData ( int UDDhandle, realtype & rudd ); int getUDData ( int UDDhandle, pstr sudd, int maxLen ); pstr getUDData ( int UDDhandle, int * retcode=NULL ); int getUDData ( int UDDhandle, pstr & sudd ); void write ( RCFile f ); void read ( RCFile f ); }; #endif mmdb-1.23.2.1/src/mmdb_symop.cpp0000644000175100017510000004525211476201653013256 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_SymOp // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CSymOp ( symmetry operator ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MATH_H #include #endif #ifndef __MMDB_SymOp__ #include "mmdb_symop.h" #endif // ==================== CSymOp ======================== CSymOp::CSymOp() : CStream() { InitSymOp(); } CSymOp::CSymOp ( RPCStream Object ) : CStream(Object) { InitSymOp(); } CSymOp::~CSymOp() { FreeMemory(); } void CSymOp::InitSymOp() { int i,j; XYZOp = NULL; for (i=0;i<4;i++) { for (j=0;j<4;j++) T[i][j] = 0.0; T[i][i] = 1.0; } } void CSymOp::FreeMemory() { if (XYZOp) delete[] XYZOp; XYZOp = NULL; } int CSymOp::SetSymOp ( cpstr XYZOperation ) { int i,j; CreateCopy ( XYZOp,XYZOperation ); DelSpaces ( XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) T[i][j] = 0.0; i = GetOperation ( 0 ); if (!i) i = GetOperation ( 1 ); if (!i) i = GetOperation ( 2 ); T[3][3] = 1.0; return i; } pstr CSymOp::GetSymOp() { if (XYZOp) return XYZOp; else return pstr(""); } int CSymOp::GetOperation ( int n ) { char L[100]; pstr p1,p2; int len; realtype V; p1 = XYZOp; p2 = strchr ( p1,',' ); if (!p2) return SYMOP_WrongSyntax; if (n>0) { p1 = p2+1; p2 = strchr ( p1,',' ); if (!p2) return SYMOP_WrongSyntax; } if (n>1) { p1 = p2+1; p2 = NULL; } if (p2) *p2 = char(0); strcpy ( L,p1 ); if (p2) *p2 = ','; DelSpaces ( L ); if (!L[0]) return SYMOP_WrongSyntax; UpperCase ( L ); len = strlen ( L ); T[n][0] = 0.0; if (L[0]=='X') { T[n][0] += 1.0; L[0] = ' '; } do { p1 = strstr ( L,"+X" ); if (p1) { T[n][0] += 1.0; strncpy ( p1," ",2 ); } } while (p1); do { p1 = strstr ( L,"-X" ); if (p1) { T[n][0] -= 1.0; strncpy ( p1," ",2 ); } } while (p1); T[n][1] = 0.0; if (L[0]=='Y') { T[n][1] += 1.0; L[0] = ' '; } do { p1 = strstr ( L,"+Y" ); if (p1) { T[n][1] += 1.0; strncpy ( p1," ",2 ); } } while (p1); do { p1 = strstr ( L,"-Y" ); if (p1) { T[n][1] -= 1.0; strncpy ( p1," ",2 ); } } while (p1); T[n][2] = 0.0; if (L[0]=='Z') { T[n][2] += 1.0; L[0] = ' '; } do { p1 = strstr ( L,"+Z" ); if (p1) { T[n][2] += 1.0; strncpy ( p1," ",2 ); } } while (p1); do { p1 = strstr ( L,"-Z" ); if (p1) { T[n][2] -= 1.0; strncpy ( p1," ",2 ); } } while (p1); DelSpaces ( L ); if ((int)strlen(L)>=len) return SYMOP_NotAnOperation; // translational part p1 = L; T[n][3] = strtod ( p1,&p2 ); if (*p2=='/') { p1 = p2+1; V = strtod ( p1,&p2 ); if (V==0.0) return SYMOP_ZeroDenominator; T[n][3] /= V; } return SYMOP_Ok; } void MakeSign ( pstr S, realtype V, realtype & AV ) { int l; if (V>0.0) { l = strlen ( S ); if (l>0) { if (S[l-1]!=',') { strcat ( S,"+" ); } } AV = V; } else if (V<0.0) { strcat ( S,"-" ); AV = -V; } else { AV = V; return; } } #define __eps 1.0e-5 void GenTranslation ( pstr S, realtype V ) { realtype AV,nAV; char N[50]; int n,d; if (fabs(V)<=__eps) return; MakeSign ( S,V,AV ); d = 0; n = -1; while ((d<=20) && (n<0)) { d++; nAV = AV*d; n = mround(nAV); if (fabs(nAV-n)>__eps) n = -1; } if (d<=1) sprintf ( N,"%i" ,n ); else if (n>=0) sprintf ( N,"%i/%i" ,n,d ); else sprintf ( N,"%-.10g",AV ); strcat ( S,N ); } void GenTransformation ( pstr S, realtype V, pstr Axis ) { realtype AV,nAV; char N[50]; int n,d; if (fabs(V)<=__eps) return; MakeSign ( S,V,AV ); if (fabs(AV-1.0)>__eps) { d = 0; n = -1; while ((d<=20) && (n<0)) { d++; nAV = AV*d; n = mround(nAV); if (fabs(nAV-n)>__eps) n = -1; } if (n>=0) sprintf ( N,"%i/%i*",n,d ); else sprintf ( N,"%-.10g*",AV ); strcat ( S,N ); } strcat ( S,Axis ); } /* void GenTranslation ( pstr S, realtype V ) { realtype AV,fAV; int n,d; char N[50]; if (V==0.0) return; MakeSign ( S,V,AV ); n = mround(floor(AV+0.00000001)); fAV = AV-n; if (fabs(fAV-0.5)<=__eps) { n += 1; d = 2; } else if (fabs(fAV-0.25)<=__eps) { n += 1; d = 4; } else if (fabs(fAV-0.75)<=__eps) { n += 3; d = 4; } else if (fabs(fAV-0.33333333333)<=__eps) { n += 1; d = 3; } else if (fabs(fAV-0.66666666666)<=__eps) { n += 2; d = 3; } else if (fabs(fAV-0.16666666666)<=__eps) { n += 1; d = 6; } else if (fabs(fAV-0.83333333333)<=__eps) { n += 5; d = 6; } else d = 1; N[0] = char(0); if (d>1) sprintf ( N,"%i/%i",n,d ); else if (n>0) sprintf ( N,"%i",n ); else ParamStr ( N,pstr(""),AV ); strcat ( S,N ); } void GenTransformation ( pstr S, realtype V, pstr Axis ) { realtype AV; if (V==0.0) return; MakeSign ( S,V,AV ); if (fabs(AV-0.5)<=__eps) strcat ( S,"1/2*" ); else if (fabs(AV-0.25)<=__eps) strcat ( S,"1/4*" ); else if (fabs(AV-0.75)<=__eps) strcat ( S,"3/4*" ); else if (fabs(AV-0.33333333333)<=__eps) strcat ( S,"1/3*" ); else if (fabs(AV-0.66666666666)<=__eps) strcat ( S,"2/3*" ); else if (fabs(AV-0.16666666666)<=__eps) strcat ( S,"1/6*" ); else if (fabs(AV-0.83333333333)<=__eps) strcat ( S,"5/6*" ); else if (fabs(AV-1.0)>__eps) ParamStr ( S,pstr(""),AV, 10,pstr("*") ); strcat ( S,Axis ); } */ Boolean CSymOp::CompileOpTitle ( pstr S ) { return CompileOpTitle ( S,T,True ); } Boolean CSymOp::CompileOpTitle ( pstr S, mat44 symMat, Boolean compare ) { S[0] = char(0); GenTransformation ( S,symMat[0][0],pstr("X") ); GenTransformation ( S,symMat[0][1],pstr("Y") ); GenTransformation ( S,symMat[0][2],pstr("Z") ); GenTranslation ( S,symMat[0][3] ); strcat ( S,"," ); GenTransformation ( S,symMat[1][0],pstr("X") ); GenTransformation ( S,symMat[1][1],pstr("Y") ); GenTransformation ( S,symMat[1][2],pstr("Z") ); GenTranslation ( S,symMat[1][3] ); strcat ( S,"," ); GenTransformation ( S,symMat[2][0],pstr("X") ); GenTransformation ( S,symMat[2][1],pstr("Y") ); GenTransformation ( S,symMat[2][2],pstr("Z") ); GenTranslation ( S,symMat[2][3] ); DelSpaces ( S ); if ((!compare) || (!strcmp(S,XYZOp))) return True; else { S[0] = char(0); GenTranslation ( S,symMat[0][3] ); GenTransformation ( S,symMat[0][0],pstr("X") ); GenTransformation ( S,symMat[0][1],pstr("Y") ); GenTransformation ( S,symMat[0][2],pstr("Z") ); strcat ( S,"," ); GenTranslation ( S,symMat[1][3] ); GenTransformation ( S,symMat[1][0],pstr("X") ); GenTransformation ( S,symMat[1][1],pstr("Y") ); GenTransformation ( S,symMat[1][2],pstr("Z") ); strcat ( S,"," ); GenTranslation ( S,symMat[2][3] ); GenTransformation ( S,symMat[2][0],pstr("X") ); GenTransformation ( S,symMat[2][1],pstr("Y") ); GenTransformation ( S,symMat[2][2],pstr("Z") ); DelSpaces ( S ); if (!strcmp(S,XYZOp)) return True; } return False; } void CSymOp::Transform ( realtype & x, realtype & y, realtype & z ) { realtype x1,y1,z1; x1 = T[0][0]*x + T[0][1]*y + T[0][2]*z + T[0][3]; y1 = T[1][0]*x + T[1][1]*y + T[1][2]*z + T[1][3]; z1 = T[2][0]*x + T[2][1]*y + T[2][2]*z + T[2][3]; x = x1; y = y1; z = z1; } void CSymOp::GetTMatrix ( mat44 & TMatrix ) { // copies T to TMatrix int i,j; for (i=0;i<4;i++) for (j=0;j<4;j++) TMatrix[i][j] = T[i][j]; } void CSymOp::SetTMatrix ( mat44 & TMatrix ) { // copies TMatrix to T int i,j; for (i=0;i<4;i++) for (j=0;j<4;j++) T[i][j] = TMatrix[i][j]; } void CSymOp::Print() { int i; printf ( " operation '%s'\n",XYZOp ); for (i=0;i<4;i++) printf ( " %10.3g %10.3g %10.3g %10.3g\n", T[i][0],T[i][1],T[i][2],T[i][3] ); } void CSymOp::Copy ( PCSymOp SymOp ) { int i,j; CreateCopy ( XYZOp,SymOp->XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) T[i][j] = SymOp->T[i][j]; } void CSymOp::write ( RCFile f ) { int i,j; byte Version=1; f.WriteByte ( &Version ); f.CreateWrite ( XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) f.WriteReal ( &(T[i][j]) ); } void CSymOp::read ( RCFile f ) { int i,j; byte Version; f.ReadByte ( &Version ); f.CreateRead ( XYZOp ); for (i=0;i<4;i++) for (j=0;j<4;j++) f.ReadReal ( &(T[i][j]) ); } MakeStreamFunctions(CSymOp) // ==================== CSymOps ======================== CSymOps::CSymOps() : CStream() { InitSymOps(); } CSymOps::CSymOps ( RPCStream Object ) : CStream(Object) { InitSymOps(); } CSymOps::~CSymOps() { FreeMemory(); } void CSymOps::InitSymOps() { SpGroup = NULL; Nops = 0; SymOp = NULL; } void CSymOps::FreeMemory() { int i; if (SpGroup) delete[] SpGroup; SpGroup = NULL; if (SymOp) { for (i=0;iSetSymOp ( S ); } f.shut(); return RC; } #define syminfo_file cpstr("syminfo.lib") int CSymOps::SetGroup ( cpstr SpaceGroup, cpstr syminfo_lib ) { CFile f; pstr p; char S[500]; char G[100]; char O[100]; mat44 T1,T2,T3; int i,j,k,l,m,RC; int npops,ncops; long symop_start; symop_start = 0; // else may be used uninitialized FreeMemory(); npops = 0; ncops = 0; CreateCopy ( SpGroup,SpaceGroup ); if (!syminfo_lib) p = pstr(syminfo_file); else if (!syminfo_lib[0]) p = pstr(syminfo_file); else p = pstr(syminfo_lib); f.assign ( p,True ); if (!f.reset(True)) { p = getenv ( "SYMINFO" ); if (p) strcpy ( S,p ); else { p = getenv ( "CLIBD" ); if (p) { strcpy ( S,p ); if (S[strlen(S)-1]!='/') strcat ( S,"/" ); strcat ( S,"syminfo.lib" ); } else strcpy ( S,"syminfo.lib" ); } f.assign ( S,True ); if (!f.reset(True)) return SYMOP_NoLibFile; } if (strncasecmp(SpGroup,"Hall:",5)) { // normal space group symbol on input strcpy ( G," '" ); strcat ( G,SpGroup ); strcat ( G,"'" ); S[0] = char(0); while (!f.FileEnd() && !(strstr(S,G) && (strstr(S,"symbol xHM") || strstr(S,"symbol old")))) f.ReadLine ( S,sizeof(S) ); } else { // hall descriptor on input strcpy ( G," ' " ); p = &(SpGroup[5]); while (*p==' ') p++; strcat ( G,p ); strcat ( G,"'" ); S[0] = char(0); while (!f.FileEnd() && !(strstr(S,G) && strstr(S,"symbol Hall"))) f.ReadLine ( S,sizeof(S) ); } if (f.FileEnd()) { f.shut(); return SYMOP_UnknownSpaceGroup; } // found spacegroup, move to symop lines while (!f.FileEnd() && (!strstr(S,"symop"))) { symop_start = f.Position(); f.ReadLine ( S,sizeof(S) ); } // count primitive operators while (!f.FileEnd() && (strstr(S,"symop"))) { npops++; f.ReadLine ( S,sizeof(S) ); } // count centering operators while (!f.FileEnd() && (strstr(S,"cenop"))) { ncops++; f.ReadLine ( S,sizeof(S) ); } Nops = npops*ncops; f.seek(symop_start); SymOp = new PCSymOp[Nops]; RC = SYMOP_Ok; // read primitive operators for (i=0;(iSetSymOp ( S+6 ); } // skip identity centering operator f.ReadLine ( S,sizeof(S) ); // loop over non-trivial centering operators, and for each loop // over primtive operators for (i=1;(iSetSymOp ( S+6 ); SymOp[i*npops+j]->GetTMatrix(T1); SymOp[j]->GetTMatrix(T2); for (k=0;k<4;k++) for (l=0;l<4;l++) { T3[k][l] = 0.0; for (m=0;m<4;m++) T3[k][l] += T1[k][m]*T2[m][l]; } for (k=0;k<3;k++) // kdc fix T3[k][3] -= floor ( T3[k][3] ); // kdc fix SymOp[i*npops+j]->CompileOpTitle(O,T3,False); SymOp[i*npops+j]->SetSymOp (O); } } f.shut(); return RC; } void CSymOps::Reset() { // removes all symmetry operations FreeMemory(); } int CSymOps::AddSymOp ( cpstr XYZOperation ) { // adds a symmetry operation PPCSymOp SymOp1; int i; SymOp1 = new PCSymOp[Nops+1]; for (i=0;iSetSymOp ( XYZOperation ); } void CSymOps::PutGroupName ( cpstr SpGroupName ) { CreateCopy ( SpGroup,SpGroupName ); } int CSymOps::GetNofSymOps() { // GetNofSymOps() returns Nops -- the number of symmetry operations return Nops; } pstr CSymOps::GetSymOp ( int Nop ) { if ((0<=Nop) && (NopGetSymOp(); else return pstr(""); } int CSymOps::Transform ( realtype & x, realtype & y, realtype & z, int Nop ) { // Transform(..) transforms the coordinates according to the // symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). if ((Nop<0) || (Nop>=Nops)) return 1; if (SymOp[Nop]) { SymOp[Nop]->Transform ( x,y,z ); return 0; } else return 2; } int CSymOps::GetTMatrix ( mat44 & TMatrix, int Nop ) { // GetTMatrix(..) returns the coordinate transformation matrix // for the symmetry operation Nop. The return code is non-zero if // Nop is a wrong operation number (must range from 0 to Nops-1). if ((Nop<0) || (Nop>=Nops)) return 1; if (SymOp[Nop]) { SymOp[Nop]->GetTMatrix ( TMatrix ); return 0; } else return 2; } void CSymOps::Print() { int i; char S[200]; printf ( " SPACE GROUP '%s'\n",SpGroup ); for (i=0;iPrint(); if (SymOp[i]->CompileOpTitle(S)) printf ( " CHECK STATUS: Ok\n" ); else printf ( " CHECK STATUS: Generated '%s'\n",S ); } } void CSymOps::Copy ( PCSymOps SymOps ) { int i; FreeMemory(); CreateCopy ( SpGroup,SymOps->SpGroup ); Nops = SymOps->Nops; if (Nops>0) { SymOp = new PCSymOp[Nops]; for (i=0;iCopy ( SymOps->SymOp[i] ); } } } void CSymOps::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.CreateWrite ( SpGroup ); f.WriteInt ( &Nops ); for (i=0;i0) { SymOp = new PCSymOp[Nops]; for (i=0;i // ~~~~~~~~~ // **** Classes : CVertex ( graph vertex ) // ~~~~~~~~~ CEdge ( graph edge ) // CGraph ( structural graph ) // CMatch ( match of structural graphs ) // CGraphMatch ( CSIA algorithms for graph matching ) // // (C) E. Krissinel 2000-2008 // // When used, please cite: // // Krissinel, E. and Henrick, K. (2004) // Common subgraph isomorphism detection by backtracking search. // Software - Practice and Experience, 34, 591-607. // // ================================================================= // #ifndef __STDLIB_H #include #endif #ifndef __STRING_H #include #endif #ifndef __MMDB_Graph__ #include "mmdb_graph.h" #endif #ifndef __MMDB_Tables__ #include "mmdb_tables.h" #endif // ========================== CVertex ============================ CVertex::CVertex() : CStream() { InitVertex(); } CVertex::CVertex ( RPCStream Object ) : CStream(Object) { InitVertex(); } CVertex::CVertex ( cpstr chem_elem ) : CStream() { InitVertex(); SetVertex ( chem_elem ); } CVertex::CVertex ( int vtype ) : CStream() { InitVertex(); SetVertex ( vtype ); } CVertex::CVertex ( int vtype, cpstr vname ) : CStream() { InitVertex(); SetVertex ( vtype,vname ); } CVertex::CVertex ( cpstr chem_elem, cpstr vname ) : CStream() { InitVertex (); SetVertex ( chem_elem ); CreateCopy ( name,vname ); } CVertex::~CVertex() { if (name) delete[] name; } void CVertex::InitVertex() { name = NULL; type = 0; type_ext = 0; property = 0; id = 0; user_id = 0; } void CVertex::SetVertex ( cpstr chem_elem ) { // This function generates vertex type according to a chemical // element name passed in chem_elem. // // The element type has the following meaning: // // 0xCHSSTTTT // // where // T - resreved for elemenmt type // S - resreved for symmetry relief // H - reserved for hydrogen bonds // C - resreved for chirality flags // // Note that when more than 2 symbols are used for chemical element // name (custom use), fields S may be reallocated for element type // and then symmetry relief becomes impossible. // CreateCopy ( name,chem_elem ); type = getElementNo ( chem_elem ); if (type==ELEMENT_UNKNOWN) { type = 0; if (name[0]) { type = (int)name[0]; if (name[1]) { type = type*256+(int)name[1]; if (name[2]) type = type*256+(int)name[2]; } } type += nElementNames; } } void CVertex::SetVertex ( int vtype ) { // This function sets vertex type. See comments above for // the general rule for vertex types implied by this code. char N[50]; int type0; type = vtype; type0 = vtype & TYPE_MASK; if ((type0>=1) && (type0<=nElementNames)) CreateCopy ( name,ElementName[type0-1] ); else { sprintf ( N,"%i",type ); CreateCopy ( name,N ); } } void CVertex::SetType ( int vtype ) { type = vtype; } void CVertex::SetTypeExt ( int typeExt ) { type_ext = typeExt; } void CVertex::SetVertex ( int vtype, cpstr vname ) { type = vtype; CreateCopy ( name,vname ); } void CVertex::SetName ( cpstr vname ) { CreateCopy ( name,vname ); } void CVertex::SetID ( int vid ) { id = vid; } void CVertex::SetProperty ( int vprop ) { property = vprop; } int CVertex::GetNBonds() { return ((type & HYDROGEN_BOND) >> 24); } void CVertex::AddBond() { int nb = GetNBonds()+1; type &= ~HYDROGEN_BOND; type |= nb << 24; } void CVertex::CopyNBonds ( PCVertex V ) { int nb = V->GetNBonds(); type &= ~HYDROGEN_BOND; type |= nb << 24; } void CVertex::RemoveChirality() { type &= CHIRAL_MASK; } void CVertex::LeaveChirality ( int eltype ) { // leaves chirality only on specified elements int vtype; vtype = type & CHIRAL_MASK; if (vtype!=eltype) type = vtype; } void CVertex::SaveType() { user_id = type; } void CVertex::RestoreType() { type = user_id; } void CVertex::CopyType ( PCVertex V ) { type = V->type; } void CVertex::Print ( int PKey ) { if (PKey!=0) printf ( " name type" ); else printf ( " %10s %5i",name,type ); } void CVertex::Copy ( PCVertex V ) { CreateCopy ( name,V->name ); type = V->type; type_ext = V->type_ext; property = V->property; id = V->id; user_id = V->user_id; } void CVertex::write ( RCFile f ) { int Version=2; f.WriteInt ( &Version ); f.CreateWrite ( name ); f.WriteInt ( &type ); f.WriteInt ( &property ); f.WriteInt ( &id ); f.WriteInt ( &user_id ); f.WriteInt ( &type_ext ); } void CVertex::read ( RCFile f ) { int Version; f.ReadInt ( &Version ); f.CreateRead ( name ); f.ReadInt ( &type ); f.ReadInt ( &property ); f.ReadInt ( &id ); f.ReadInt ( &user_id ); if (Version>1) f.ReadInt ( &type_ext ); else type_ext = 0; } void CVertex::mem_write ( pstr S, int & l ) { ::mem_write ( name ,S,l ); ::mem_write ( type ,S,l ); ::mem_write ( property,S,l ); ::mem_write ( id ,S,l ); ::mem_write ( user_id ,S,l ); ::mem_write ( type_ext,S,l ); } void CVertex::mem_read ( cpstr S, int & l ) { ::mem_read ( name ,S,l ); ::mem_read ( type ,S,l ); ::mem_read ( property,S,l ); ::mem_read ( id ,S,l ); ::mem_read ( user_id ,S,l ); ::mem_read ( type_ext,S,l ); } MakeStreamFunctions(CVertex) // =========================== CEdge ============================= CEdge::CEdge() : CStream() { InitEdge(); } CEdge::CEdge ( RPCStream Object ) : CStream(Object) { InitEdge(); } CEdge::CEdge ( int vx1, int vx2, int btype ) { InitEdge(); SetEdge ( vx1,vx2,btype ); } CEdge::~CEdge() {} void CEdge::InitEdge() { v1 = 0; v2 = 0; type = 0; property = 0; } #define NofBondTypes 4 static pstr BondType[NofBondTypes+1] = { pstr("SING"), pstr("DOUB"), pstr("AROM"), pstr("TRIP"), pstr("") // should be here for safety }; void CEdge::SetEdge ( int vx1, int vx2, cpstr btype ) { v1 = vx1; v2 = vx2; type = 0; while (type=NofBondTypes) { type = 0; if (btype[0]) type = (int)btype[0]; if (btype[1]) type = type*16+(int)btype[1]; if (btype[2]) type = type*16+(int)btype[2]; type += NofBondTypes; } type++; } void CEdge::SetEdge ( int vx1, int vx2, int btype ) { v1 = vx1; v2 = vx2; type = btype; } void CEdge::SetType ( int btype ) { type = btype; } void CEdge::SetProperty ( int eprop ) { property = eprop; } void CEdge::SaveType() { property = type; } void CEdge::RestoreType() { type = property; } void CEdge::Print ( int PKey ) { if (PKey!=0) printf ( " v1 v2 type" ); else printf ( " %5i %5i %5i",v1,v2,type ); } void CEdge::Copy ( PCEdge G ) { v1 = G->v1; v2 = G->v2; type = G->type; property = G->property; } void CEdge::write ( RCFile f ) { int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &v1 ); f.WriteInt ( &v2 ); f.WriteInt ( &type ); f.WriteInt ( &property ); } void CEdge::read ( RCFile f ) { int Version; f.ReadInt ( &Version ); f.ReadInt ( &v1 ); f.ReadInt ( &v2 ); f.ReadInt ( &type ); f.ReadInt ( &property ); } void CEdge::mem_write ( pstr S, int & l ) { ::mem_write ( v1 ,S,l ); ::mem_write ( v2 ,S,l ); ::mem_write ( type ,S,l ); ::mem_write ( property,S,l ); } void CEdge::mem_read ( cpstr S, int & l ) { ::mem_read ( v1 ,S,l ); ::mem_read ( v2 ,S,l ); ::mem_read ( type ,S,l ); ::mem_read ( property,S,l ); } MakeStreamFunctions(CEdge) // ========================== CGraph ============================ CGraph::CGraph() : CStream() { InitGraph(); } CGraph::CGraph ( PCResidue R, cpstr altLoc ) : CStream() { InitGraph(); MakeGraph ( R,altLoc ); } CGraph::CGraph ( RPCStream Object ) : CStream(Object) { InitGraph(); } CGraph::~CGraph() { FreeMemory(); } void CGraph::InitGraph() { nVAlloc = 0; nEAlloc = 0; nGAlloc = 0; nVertices = 0; nEdges = 0; nAllVertices = 0; nAllEdges = 0; Vertex = NULL; Edge = NULL; graph = NULL; name = NULL; CreateCopy ( name,pstr("UNNAMED") ); } void CGraph::FreeMemory() { int i; if (Vertex) { for (i=0;i=nVAlloc) { nVAlloc += AllocPortion; V1 = new PCVertex[nVAlloc]; for (i=0;i0) FreeMemory(); Vertex = V; nVertices = vlen; nAllVertices = vlen; nVAlloc = vlen; } int CGraph::GetVertexID ( int vertexNo ) { if ((vertexNo>0) && (vertexNo<=nAllVertices)) return Vertex[vertexNo-1]->GetID(); else return MinInt4; } int CGraph::GetNBondedVertices ( int vertexNo ) { if ((vertexNo>0) && (vertexNo<=nAllVertices)) { if (Vertex[vertexNo-1]) return Vertex[vertexNo-1]->GetNBonds(); } return 0; } int CGraph::GetBondedVertexID ( int vertexNo, int bond_vx_type, int bondNo ) { int i,k, v1,v2; if ((vertexNo>0) && (vertexNo<=nAllVertices)) { if (Vertex[vertexNo-1]) { if (Vertex[vertexNo-1]->GetNBonds()>=bondNo) { k = 0; for (i=0;(iv1; v2 = Edge[i]->v2; if ((v1==vertexNo) && ((Vertex[v2-1]->type & TYPE_MASK)==bond_vx_type) && (Vertex[v2-1]->GetNBonds()==bondNo)) k = v2; if ((v2==vertexNo) && ((Vertex[v1-1]->type & TYPE_MASK)==bond_vx_type) && (Vertex[v2-1]->GetNBonds()==bondNo)) k = v1; } if (k) return Vertex[k-1]->GetID(); } } } return MinInt4; } PCVertex CGraph::GetVertex ( int vertexNo ) { if ((vertexNo>0) && (vertexNo<=nAllVertices)) return Vertex[vertexNo-1]; else return NULL; } int CGraph::GetVertexNo ( cpstr vname ) { int i,k; k = 0; if (vname) for (i=0;(iname)) k = i+1; return k; } PCEdge CGraph::GetEdge ( int edgeNo ) { if ((edgeNo>0) && (edgeNo<=nAllEdges)) return Edge[edgeNo-1]; else return NULL; } void CGraph::AddEdge ( PCEdge G ) { int i; PPCEdge G1; if (nAllEdges>=nEAlloc) { nEAlloc += AllocPortion; G1 = new PCEdge[nEAlloc]; for (i=0;i0) FreeMemory(); Edge = G; nEdges = glen; nAllEdges = glen; nEAlloc = glen; } void CGraph::GetVertices ( PPCVertex & V, int & nV ) { V = Vertex; nV = nVertices; } void CGraph::GetEdges ( PPCEdge & E, int & nE ) { E = Edge; nE = nEdges; } int CGraph::MakeGraph ( PCResidue R, cpstr altLoc ) { int i,j, a1,a2,e1,e2, nAltLocs,alflag, rc; Boolean B; rvector occupancy; AltLoc aLoc; PAltLoc aL; realtype dx,dy,dz, sr; PCEdge G; rc = MKGRAPH_Ok; // reset graph FreeMemory(); occupancy = NULL; aL = NULL; R->GetAltLocations ( nAltLocs,aL,occupancy,alflag ); if (nAltLocs<=0) return MKGRAPH_NoAtoms; if (altLoc) strcpy ( aLoc,altLoc ); else aLoc[0] = char(0); if (nAltLocs<=1) { // Only one alt code is there, check if it is what was ordered if (strcmp(aLoc,aL[0])) { rc = MKGRAPH_ChangedAltLoc; strcpy ( aLoc,aL[0] ); } } else if ((alflag & ALF_Mess) || ((alflag & ALF_NoEmptyAltLoc) && (!aLoc[0]))) { // There is a mess in the residue alt codes, or empty alt code // does not designate a conformation but ordered. In this // situation build graph for maximal-occupancy conformation // and store its altLoc in aLoc. rc = MKGRAPH_MaxOccupancy; dx = -2.0; for (i=0;idx)) { dx = occupancy[i]; strcpy ( aLoc,aL[i] ); } } SetName ( R->name ); nVAlloc = R->nAtoms; // upper estimate for vertices to allocate if (nVAlloc<=0) { if (aL) delete[] aL; FreeVectorMemory ( occupancy,0 ); return MKGRAPH_NoAtoms; } // allocate vertex array Vertex = new PCVertex[nVAlloc]; for (i=0;inAtoms;i++) if (R->atom[i]) { if (!R->atom[i]->Ter) { if (nAltLocs>1) { // This is a many-altcode residue. aLoc contains the altcode // that has to be included. Check on it: B = !strcmp(aLoc,R->atom[i]->altLoc); if ((!B) && (!R->atom[i]->altLoc[0])) { // We got a non-aLoc code that is an "empty-altcode". // Check if this atom has the altcode that we need. for (j=i+1;(jnAtoms) && (!B);j++) if (R->atom[j]) { if ((!R->atom[j]->Ter) && (!strcmp(R->atom[j]->name,R->atom[i]->name))) B = !strcmp(aLoc,R->atom[j]->altLoc); } // if altcode=aLoc is not there for the atom (B is set // False) then we take its "empty-code" location B = !B; } } else B = True; if (B) { Vertex[nVertices] = new CVertex ( R->atom[i]->element, R->atom[i]->name ); Vertex[nVertices]->id = nVertices; Vertex[nVertices]->user_id = i; nVertices++; } } } if (nVertices<=0) { if (aL) delete[] aL; FreeVectorMemory ( occupancy,0 ); return MKGRAPH_NoAtoms; } // make edges nEAlloc = 3*nVertices; Edge = new PCEdge[nEAlloc]; for (i=0;iuser_id; e1 = Vertex[i]->type; if (e1>nElementNames) e1 = 6; e1--; for (j=i+1;juser_id; e2 = Vertex[j]->type; if (e2>nElementNames) e2 = 6; e2--; dx = R->atom[a2]->x - R->atom[a1]->x; dy = R->atom[a2]->y - R->atom[a1]->y; dz = R->atom[a2]->z - R->atom[a1]->z; // sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.15; sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.25; if (dx*dx+dy*dy+dz*dzid = i+1; } if (aL) delete[] aL; FreeVectorMemory ( occupancy,0 ); nAllVertices = nVertices; nAllEdges = nEdges; return rc; } int CGraph::MakeGraph ( PPCAtom atom, int nAtoms ) { PCEdge G; char atomID[100]; realtype dx,dy,dz, sr; int i,j, a1,a2,e1,e2, rc; rc = MKGRAPH_Ok; // reset graph FreeMemory(); nVAlloc = nAtoms; // upper estimate for vertices to allocate if (nVAlloc<=0) return MKGRAPH_NoAtoms; // allocate vertex array Vertex = new PCVertex[nVAlloc]; for (i=0;iTer) { Vertex[nVertices] = new CVertex ( atom[i]->element, atom[i]->GetAtomIDfmt(atomID) ); Vertex[nVertices]->user_id = i; nVertices++; } } if (nVertices<=0) { FreeMemory(); return MKGRAPH_NoAtoms; } // make edges nEAlloc = 3*nVertices; // just an inital guess Edge = new PCEdge[nEAlloc]; for (i=0;iuser_id; e1 = Vertex[i]->type; if (e1>nElementNames) e1 = 6; e1--; for (j=i+1;juser_id; e2 = Vertex[j]->type; if (e2>nElementNames) e2 = 6; e2--; dx = atom[a2]->x - atom[a1]->x; dy = atom[a2]->y - atom[a1]->y; dz = atom[a2]->z - atom[a1]->z; sr = CovalentRadius[e1] + CovalentRadius[e2] + 0.25; if (dx*dx+dy*dy+dz*dzid = i+1; } nAllVertices = nVertices; nAllEdges = nEdges; return rc; } void CGraph::MakeVertexIDs() { int i; for (i=0;iid = i+1; } void CGraph::HideType ( int bond_vx_type ) { // 1. Moves vertices bond_vx_type to the end of vertex array // 2. Moves edges to bond_vx_type vertices to the end of edge array // 3. Saves lengths of full vertex and edge arrays, and redefines // lengths to initial parts of the arrays not containing // bond_vx_type vertices. PPCEdge Edge1; PPCVertex Vertex1; int i,k,v1,v2, nEdges1,nVertices1; ivector iv; Edge1 = new PCEdge[nEdges]; Vertex1 = new PCVertex[nVertices]; GetVectorMemory ( iv,nVertices,1 ); for (i=0;iv1-1; v2 = Edge[i]->v2-1; if (Vertex[v1] && Vertex[v2]) { if ((Vertex[v1]->type & TYPE_MASK)==bond_vx_type) { Vertex[v2]->AddBond(); Vertex[v1]->CopyNBonds ( Vertex[v2] ); } if ((Vertex[v2]->type & TYPE_MASK)==bond_vx_type) { Vertex[v1]->AddBond(); Vertex[v2]->CopyNBonds ( Vertex[v1] ); } } } nVertices1 = 0; for (i=0;itype & TYPE_MASK)!=bond_vx_type) { Vertex1[nVertices1++] = Vertex[i]; iv[i+1] = nVertices1; } } k = nVertices1; for (i=0;itype & TYPE_MASK)==bond_vx_type) { Vertex1[k++] = Vertex[i]; iv[i+1] = k; } } nEdges1 = 0; for (i=0;iv1 = iv[Edge[i]->v1]; Edge[i]->v2 = iv[Edge[i]->v2]; if (((Vertex1[Edge[i]->v1-1]->type & TYPE_MASK)!=bond_vx_type) && ((Vertex1[Edge[i]->v2-1]->type & TYPE_MASK)!=bond_vx_type)) Edge1[nEdges1++] = Edge[i]; } k = nEdges1; for (i=0;iv1-1]->type & TYPE_MASK)==bond_vx_type) || ((Vertex1[Edge[i]->v2-1]->type & TYPE_MASK)==bond_vx_type)) Edge1[k++] = Edge[i]; } nAllVertices = nVertices; nAllEdges = nEdges; nVAlloc = nVertices; nEAlloc = nEdges; nVertices = nVertices1; nEdges = nEdges1; if (Vertex) delete[] Vertex; if (Edge) delete[] Edge; FreeVectorMemory ( iv,1 ); Vertex = Vertex1; Edge = Edge1; } void CGraph::ExcludeType ( int type ) { int i,k; ivector iv; GetVectorMemory ( iv,nAllVertices,1 ); k = 0; for (i=0;itype & TYPE_MASK)!=type) { if (kv1]!=0) && (iv[Edge[i]->v2]!=0)) { if (kv1 = iv[Edge[k]->v1]; Edge[k]->v2 = iv[Edge[k]->v2]; k++; } else { delete Edge[i]; Edge[i] = NULL; } nAllEdges = k; nEdges = nAllEdges; FreeVectorMemory ( iv,1 ); } void CGraph::RemoveChirality() { int i; for (i=0;iRemoveChirality(); } void CGraph::LeaveChirality ( int eltype ) { // leaves chirality for specified atom types int i; for (i=0;iLeaveChirality ( eltype ); } void CGraph::MakeSymmetryRelief ( Boolean noCO2 ) { // This function looks for groups of equivalent vertices // attached to a single vertice (e.g. chemical SO3 or // PO3 groups), and re-lables them by adding a unique // symmetry-relief number. This eliminates equivalent // matches (3! for each SO3/PO3 group), and increases // vertex diversity, which considerably speeds up matching. // The function is cheap and harmless even if such groups // of vertices are not found. // If noCO2 is True then CO2 symmetry is not releaved. ivector v,vc; int i,j,k,n,m,almask,vjtype, ctype,otype; Boolean noOxygens; ctype = otype = 0; // else may be used uninitialized GetVectorMemory ( v ,nVertices,0 ); GetVectorMemory ( vc,nVertices,1 ); for (i=1;i<=nVertices;i++) vc[i] = 0; for (j=0;jv1>0) && (Edge[j]->v1<=nVertices)) vc[Edge[j]->v1]++; if ((Edge[j]->v2>0) && (Edge[j]->v2<=nVertices)) vc[Edge[j]->v2]++; } almask = ~ATOM_LEAVING; if (noCO2) { ctype = getElementNo ( "C" ); otype = getElementNo ( "O" ); } noOxygens = False; for (i=1;i<=nVertices;i++) if (vc[i]>1) { // vertex at more than 1 edge // v[] will list connected vertices, k will be their number k = 0; for (j=0;jv1==i) && (vc[Edge[j]->v2]==1) && (kv2-1; if ((Edge[j]->v2==i) && (vc[Edge[j]->v1]==1) && (kv1-1; } if (k>1) { if (noCO2) noOxygens = ((Vertex[i-1]->type & almask)==ctype); // A group of vertices with single connection is // identified. Assign symmetry relief modifiers // to *equivalent* vertices in the group for (j=0;j=0) && (v[j]type & almask; if ((!noOxygens) || (vjtype!=otype)) { n = 1; // symmetry relief modifier for (m=j+1;m=0) && (v[m]type== (Vertex[v[m]]->type & almask)) { Vertex[v[m]]->type |= (n << 16); n++; v[m] = -1; } } } } } } FreeVectorMemory ( v ,0 ); FreeVectorMemory ( vc,1 ); } int CGraph::Build ( Boolean bondOrder ) { int i,j, rc; if (nVertices<=0) return 2; if (nGAllocv1>=1) && (Edge[i]->v1<=nVertices) && (Edge[i]->v2>=1) && (Edge[i]->v2<=nVertices)) { graph[Edge[i]->v1][Edge[i]->v2] = Edge[i]->type; graph[Edge[i]->v2][Edge[i]->v1] = Edge[i]->type; } else rc = 1; } else { for (i=0;iv1>=1) && (Edge[i]->v1<=nVertices) && (Edge[i]->v2>=1) && (Edge[i]->v2<=nVertices)) { graph[Edge[i]->v1][Edge[i]->v2] = 1; graph[Edge[i]->v2][Edge[i]->v1] = 1; } else rc = 1; } return rc; } const int ring_mask[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080 }; void CGraph::IdentifyRings() { CGraphMatch GM; CGraph ring; ivector F1,F2; AtomName aname; realtype p1,p2; int i,j,n,nrings,nv; Build ( False ); for (i=0;itype_ext = 0; GM.SetFlag ( GMF_UniqueMatch ); for (n=3;n<=10;n++) { ring.Reset(); for (i=1;i<=n;i++) { sprintf ( aname,"C%i",i ); ring.AddVertex ( new CVertex("C",aname) ); } ring.MakeVertexIDs(); for (i=1;i<=n;i++) { j = i+1; if (j>n) j = 1; ring.AddEdge ( new CEdge(i,j,1) ); } ring.Build ( False ); GM.MatchGraphs ( this,&ring,n,False,EXTTYPE_Ignore ); nrings = GM.GetNofMatches(); for (i=0;itype_ext |= ring_mask[n]; } } } void CGraph::Print() { int i; printf ( " ===== Graph %s \n\n",name ); if (nVertices>0) { printf ( " Vertices:\n"" ## " ); Vertex[0]->Print(1); printf ( "\n" ); for (i=0;iPrint(0); printf ( "\n" ); } } if (nEdges>0) { printf ( " Edges:\n"" ## " ); Edge[0]->Print(1); printf ( "\n" ); for (i=0;iPrint(0); printf ( "\n" ); } } } void CGraph::Print1() { int i,j; for (i=0;iid,Vertex[i]->type,Vertex[i]->name ); for (j=0;jv1==i+1) printf ( " %4i(%i)",Edge[j]->v2,Edge[j]->type ); else if (Edge[j]->v2==i+1) printf ( " %4i(%i)",Edge[j]->v1,Edge[j]->type ); printf ( "\n" ); } } void CGraph::Copy ( PCGraph G ) { int i; FreeMemory(); CreateCopy ( name,G->name ); nVertices = G->nVertices; nEdges = G->nEdges; nAllVertices = G->nAllVertices; nAllEdges = G->nAllEdges; if (nAllVertices>0) { nVAlloc = nAllVertices; Vertex = new PCVertex[nVAlloc]; for (i=0;iCopy ( G->Vertex[i] ); } } if (nAllEdges>0) { nEAlloc = nAllEdges; Edge = new PCEdge[nEAlloc]; for (i=0;iCopy ( G->Edge[i] ); } } } void CGraph::write ( RCFile f ) { int i; int Version=2; Boolean bondOrder=False; f.WriteInt ( &Version ); f.WriteBool ( &bondOrder ); f.CreateWrite ( name ); f.WriteInt ( &nVertices ); f.WriteInt ( &nEdges ); f.WriteInt ( &nAllVertices ); f.WriteInt ( &nAllEdges ); for (i=0;i1) { f.ReadInt ( &nAllVertices ); f.ReadInt ( &nAllEdges ); } else { nAllVertices = nVertices; nAllEdges = nEdges; } if (nAllVertices>0) { nVAlloc = nAllVertices; Vertex = new PCVertex[nVAlloc]; for (i=0;i0) { nEAlloc = nAllEdges; Edge = new PCEdge[nEAlloc]; for (i=0;imem_write ( S,l ); } else { k = 0; ::mem_write ( k,S,l ); } for (i=0;imem_write ( S,l ); } else { k = 0; ::mem_write ( k,S,l ); } } void CGraph::mem_read ( cpstr S, int & l ) { int i,k; Boolean bondOrder; FreeMemory(); ::mem_read ( bondOrder ,S,l ); ::mem_read ( name ,S,l ); ::mem_read ( nVertices ,S,l ); ::mem_read ( nEdges ,S,l ); ::mem_read ( nAllVertices,S,l ); ::mem_read ( nAllEdges ,S,l ); if (nAllVertices>0) { nVAlloc = nAllVertices; Vertex = new PCVertex[nVAlloc]; for (i=0;imem_read ( S,l ); } else Vertex[i] = NULL; } } if (nAllEdges>0) { nEAlloc = nAllEdges; Edge = new PCEdge[nEAlloc]; for (i=0;imem_read ( S,l ); } else { Edge[i] = NULL; } } } // Build ( bondOrder ); } MakeStreamFunctions(CGraph) // ========================== CMatch ============================ CMatch::CMatch() : CStream() { InitMatch(); } CMatch::CMatch ( RPCStream Object ) : CStream ( Object ) { InitMatch(); } CMatch::CMatch ( ivector FV1, ivector FV2, int nv, int n, int m ) { int i; if (FV1 && FV2) { n1 = n; n2 = m; nAlloc = n; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); mlength = nv; for (i=1;i<=mlength;i++) { F1[i] = FV1[i]; F2[i] = FV2[i]; } } else InitMatch(); } void CMatch::InitMatch() { mlength = 0; n1 = 0; n2 = 0; nAlloc = 0; F1 = NULL; F2 = NULL; } CMatch::~CMatch() { FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); } void CMatch::SetMatch ( ivector FV1, ivector FV2, int nv, int n, int m ) { int i; if (FV1 && FV2) { if (nv>nAlloc) { FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); nAlloc = n; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); } n1 = n; n2 = m; mlength = nv; for (i=1;i<=mlength;i++) { F1[i] = FV1[i]; F2[i] = FV2[i]; } } else { FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); mlength = 0; n1 = 0; n2 = 0; } } Boolean CMatch::isMatch ( ivector FV1, ivector FV2, int nv ) { int i,j; Boolean B; if (FV1 && FV2 && (nv<=mlength)) { B = True; for (i=1;(i<=nv) && B;i++) { B = False; for (j=1;(j<=mlength) && (!B);j++) B = (FV1[i]==F1[j]) && (FV2[i]==F2[j]); } return B; } return False; } Boolean CMatch::isCombination ( ivector FV1, ivector FV2, int nv ) { int i,j; Boolean B; if (FV1 && FV2 && (nv==mlength)) { B = True; for (i=1;(i<=nv) && B;i++) { B = False; for (j=1;(j<=mlength) && (!B);j++) B = (FV1[i]==F1[j]); if (B) { B = False; for (j=1;(j<=mlength) && (!B);j++) B = (FV2[i]==F2[j]); } } return B; } return False; } void CMatch::GetMatch ( ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ) { FV1 = F1; FV2 = F2; nv = mlength; p1 = mlength; if (p1>0.0) p1 /= n1; p2 = mlength; if (p2>0.0) p2 /= n2; } void CMatch::write ( RCFile f ) { int i; int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &mlength ); f.WriteInt ( &n1 ); f.WriteInt ( &n2 ); for (i=1;i<=mlength;i++) { f.WriteInt ( &(F1[i]) ); f.WriteInt ( &(F2[i]) ); } } void CMatch::read ( RCFile f ) { int i,Version; FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); f.ReadInt ( &Version ); f.ReadInt ( &mlength ); f.ReadInt ( &n1 ); f.ReadInt ( &n2 ); if (mlength>0) { nAlloc = n1; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); for (i=1;i<=mlength;i++) { f.ReadInt ( &(F1[i]) ); f.ReadInt ( &(F2[i]) ); } } } void CMatch::mem_write ( pstr S, int & l ) { int i; ::mem_write ( mlength,S,l ); ::mem_write ( n1 ,S,l ); ::mem_write ( n2 ,S,l ); for (i=1;i<=mlength;i++) { ::mem_write ( F1[i],S,l ); ::mem_write ( F2[i],S,l ); } } void CMatch::mem_read ( cpstr S, int & l ) { int i; FreeVectorMemory ( F1,1 ); FreeVectorMemory ( F2,1 ); ::mem_read ( mlength,S,l ); ::mem_read ( n1 ,S,l ); ::mem_read ( n2 ,S,l ); if (mlength>0) { nAlloc = n1; GetVectorMemory ( F1,nAlloc,1 ); GetVectorMemory ( F2,nAlloc,1 ); for (i=1;i<=mlength;i++) { ::mem_read ( F1[i],S,l ); ::mem_read ( F2[i],S,l ); } } } MakeStreamFunctions(CMatch) // ======================== CGraphMatch ========================== CGraphMatch::CGraphMatch() : CStream() { InitGraphMatch(); } CGraphMatch::CGraphMatch ( RPCStream Object ) : CStream ( Object ) { InitGraphMatch(); } CGraphMatch::~CGraphMatch() { FreeMemory(); } void CGraphMatch::InitGraphMatch() { G1 = NULL; G2 = NULL; n = 0; m = 0; P = NULL; nAlloc = 0; mAlloc = 0; nMatches = 0; maxNMatches = -1; // unlimited Match = NULL; nMAlloc = 0; flags = 0; swap = False; wasFullMatch = False; maxMatch = 0; timeLimit = 0; // no time limit Stop = False; stopOnMaxNMathches = False; F1 = NULL; F2 = NULL; iF1 = NULL; ix = NULL; #ifndef _UseRecursion jj = NULL; #endif } void CGraphMatch::SetFlag ( word flag ) { flags |= flag; } void CGraphMatch::RemoveFlag ( word flag ) { flags &= ~flag; } void CGraphMatch::SetMaxNofMatches ( int maxNofMatches, Boolean stopOnMaxN ) { maxNMatches = maxNofMatches; stopOnMaxNMathches = stopOnMaxN; } void CGraphMatch::SetTimeLimit ( int maxTimeToRun ) { timeLimit = maxTimeToRun; } void CGraphMatch::Reset() { FreeMemory(); } void CGraphMatch::FreeMemory() { int i; if (P) { FreeMatrixMemory ( P[1],nAlloc,1,0 ); FreeRecHeap (); P = P + 1; delete[] P; P = NULL; } FreeMatrixMemory ( iF1,nAlloc,1,1 ); FreeVectorMemory ( F1 ,1 ); FreeVectorMemory ( F2 ,1 ); FreeVectorMemory ( ix ,1 ); nAlloc = 0; mAlloc = 0; if (Match) { for (i=0;inVertices<=Gh2->nVertices) { G1 = Gh1; G2 = Gh2; swap = False; } else { G1 = Gh2; G2 = Gh1; swap = True; } n = G1->nVertices; m = G2->nVertices; V1 = G1->Vertex; V2 = G2->Vertex; c1 = G1->graph; c2 = G2->graph; nMatches = 0; if (n<=0) return; if ((n>nAlloc) || (m>mAlloc)) GetMemory(); else FreeRecHeap(); n1 = Initialize ( vertexType,vertexExt ); if (n1<=0) return; GetRecHeap(); maxMatch = IMax(1,IMin(n,minMatch)); Stop = False; startTime = time(NULL); // Use of Backtrack(..) and Ullman() is completely // equivalent. One of them should be commented. if (minMatch=minMatch) Backtrack1 ( 1,n1 ); } else if (n1>=n) { #ifdef _UseRecursion Backtrack ( 1 ); #else Ullman(); #endif } } int CGraphMatch::Initialize ( Boolean vertexType, int vertexExt ) { ivector jF1; int i,j,v1type,v1type_ext,v2type_ext,almask,iW,pl; wasFullMatch = False; jF1 = iF1[1]; for (i=1;i<=n;i++) jF1[i] = i; almask = ~ATOM_LEAVING; /* -- experiment for symmetry reliefs int v2type,v1type_sr,srmask; srmask = ~SYMREL_MASK; for (i=1;i<=n;i++) { if (vertexType) { ix[i] = 0; v1type = V1[i-1]->type & almask; v1type_sr = v1type & srmask; pl = 0; for (j=1;j<=m;j++) { v2type = V2[j-1]->type & almask; if ((v1type==v2type) || (v1type_sr==v2type) || (v1type==(v2type & srmask))) P[1][i][++pl] = j; } P[1][i][0] = pl; if (pl) ix[i] = i; } else { ix[i] = i; for (j=1;j<=m;j++) P[1][i][j] = j; P[1][i][0] = m; } F1[i] = 0; F2[i] = 0; } */ for (i=1;i<=n;i++) { ix[i] = 0; v1type = V1[i-1]->type & almask; v1type_ext = V1[i-1]->type_ext; pl = 0; for (j=1;j<=m;j++) if ((v1type==(V2[j-1]->type & almask)) || (!vertexType)) { if (vertexExt==EXTTYPE_Ignore) P[1][i][++pl] = j; else { v2type_ext = V2[j-1]->type_ext; if ((!v1type_ext) && (!v2type_ext)) P[1][i][++pl] = j; else switch (vertexExt) { default : case EXTTYPE_Ignore : P[1][i][++pl] = j; break; case EXTTYPE_Equal : if (v1type_ext==v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_AND : if (v1type_ext & v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_OR : if (v1type_ext | v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_XOR : if (v1type_ext ^ v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_NotEqual : if (v1type_ext!=v2type_ext) P[1][i][++pl] = j; break; case EXTTYPE_NotAND : if ((v1type_ext & v2type_ext) ==0) P[1][i][++pl] = j; break; case EXTTYPE_NotOR : if ((v1type_ext | v2type_ext) ==0) P[1][i][++pl] = j; } } } P[1][i][0] = pl; if (pl) ix[i] = i; F1[i] = 0; F2[i] = 0; } /* } else { for (i=1;i<=n;i++) { ix[i] = i; for (j=1;j<=m;j++) P[1][i][j] = j; P[1][i][0] = m; F1[i] = 0; F2[i] = 0; } } */ i = 1; j = n; while (i0) Stop = (difftime(time(NULL),startTime)>timeLimit); F1[i] = i; pli = P[i][i][0]; if (i>=n) { for (cntj=1;(cntj<=pli) && (!Stop);cntj++) { F2[n] = P[n][n][cntj]; CollectMatch ( n ); } } else { i1 = i+1; c1i = c1[i]; for (cntj=1;(cntj<=pli) && (!Stop);cntj++) { j = P[i][i][cntj]; F2[i] = j; // mapped F1[i]:F2[i], i.e. i:j // Forward checking c2j = c2[j]; pl2 = 1; for (k=i1;(k<=n) && (pl2>0);k++) { p1 = P[i][k]; p2 = P[i1][k]; c1ik = c1i[k]; pl1 = p1[0]; pl2 = 0; for (cntl=1;cntl<=pl1;cntl++) { l = p1[cntl]; if ((c1ik==c2j[l]) && // check that bonds are compatible (l!=j)) // and make sure jth vertex is excluded p2[++pl2] = l; } p2[0] = pl2; // new length of P-row } if (pl2>0) Backtrack ( i1 ); } } } #else void CGraphMatch::Ullman() { // A non-recursive translation of Ullman's Backtrack. // It might give some gain in performance, although tests // on SGI machine show that the gain is negligible, (if // there is any at all) if compiler's optimization is // switched on. int i,pl,i1,pli,cntj,j,pl1,pl2,k,cntl,l,l1,cik; ivector ci,cj; ivector p1,p2; if (Stop) return; if (timeLimit>0) Stop = (difftime(time(NULL),startTime)>timeLimit); i = 1; jj[1] = 1; pl = P[1][1][0]; do { F1[i] = i; pli = P[i][i][0]; if (i>=n) { for (cntj=jj[n];(cntj<=pli) && (!Stop);cntj++) { jj[n]++; F2[n] = P[n][n][cntj]; CollectMatch ( n ); } } else { i1 = i+1; ci = c1[i]; for (cntj=jj[i];(cntj<=pli) && (!Stop);cntj++) { jj[i]++; j = P[i][i][cntj]; F2[i] = j; // Forward checking cj = c2[j]; pl2 = 1; for (k=i1;(k<=n) && (pl2>0);k++) { p1 = P[i][k]; p2 = P[i1][k]; cik = ci[k]; pl1 = p1[0]; pl2 = 0; for (cntl=1;cntl<=pl1;cntl++) { l = p1[cntl]; if ((cik==cj[l]) && // check that bonds are compatible (l!=j)) // and make sure jth vertex is excluded p2[++pl2] = l; } p2[0] = pl2; // new length of P-row } if (pl2>0) { i++; jj[i] = 1; i++; // in order to compensate the following decrement break; } } } i--; } while ((!Stop) && ((jj[1]<=pl) || (i>1))); } #endif void CGraphMatch::Backtrack1 ( int i, int k0 ) { // Recursive version of CSIA algorithm for partial // (substructure-to-substructure) matching int i1,pl0,cntj,j,k,pl1,pl2,cntl,l,c1ik,ii,iW,k1; ivector jF1,c1i,c2j; ivector p0,p1,p2; if (Stop) return; if (timeLimit>0) Stop = (difftime(time(NULL),startTime)>timeLimit); jF1 = iF1[i]; if (i>=k0) { F1[i] = jF1[i]; p0 = P[i][jF1[i]]; pl0 = p0[0]; // collect matches of k0-th (the upmost) level if (pl0>0) { maxMatch = k0; for (cntj=1;cntj<=pl0;cntj++) { F2[k0] = p0[cntj]; CollectMatch ( k0 ); } } } else { i1 = i+1; pl0 = P[i][jF1[i]][0]; j = i; for (k=i1;k<=k0;k++) if (P[i][jF1[k]][0]i) { iW = jF1[i]; jF1[i] = jF1[j]; jF1[j] = iW; } F1[i] = jF1[i]; p0 = P[i][jF1[i]]; pl0 = p0[0]; c1i = c1[jF1[i]]; // 1. Find all matches that include jF1[i]th vertex of graph G1 for (cntj=1;(cntj<=pl0) && (!Stop);cntj++) { j = p0[cntj]; F2[i] = j; // mapped F1[i]:F2[i], i.e. iF1[i][i]:j // Forward checking c2j = c2[j]; k1 = k0; // k1 is the limit for match size for (k=i1;(k<=k0) && (k1>=maxMatch);k++) { ix[k] = 0; p1 = P[i] [jF1[k]]; p2 = P[i1][jF1[k]]; c1ik = c1i [jF1[k]]; pl1 = p1[0]; pl2 = 0; for (cntl=1;cntl<=pl1;cntl++) { l = p1[cntl]; if ((c1ik==c2j[l]) && // check that bonds are compatible (l!=j)) // and make sure jth vertex is excluded p2[++pl2] = l; } p2[0] = pl2; // new length of P-row if (pl2>0) { ix[k] = k; } else if (wasFullMatch) { k1 = maxMatch-1; // we are not interested in partial } else { // match anymore k1--; } } if (k1>=maxMatch) { // shift unmatching vertices to the end for (ii=1;ii<=n;ii++) iF1[i1][ii] = jF1[ii]; k = i1; l = k0; while (k=maxMatch) { CollectMatch ( i ); // collect match of ith level maxMatch = i; } } } // 2. Find all matches that do not include jF1[i]th vertex // of graph G1 if (k0>maxMatch) { // Shift jF1[i]th vertex to the end iW = jF1[i]; jF1[i] = jF1[k0]; jF1[k0] = iW; Backtrack1 ( i,k0-1 ); } } } void CGraphMatch::CollectMatch ( int nm ) { int i; Boolean B; PPCMatch M1; if (maxNMatches==0) return; // find out if this should be a new match if (nMatches>0) { // a match is already found; check with it if (nmmlength) return; if (nm>Match[0]->mlength) { nMatches = 0; } else if (flags & GMF_UniqueMatch) { // check if such a match was already found B = False; for (i=0;(iisMatch(F1,F2,nm); if (B) return; // repeating match -- just quit. } else if (flags & GMF_NoCombinations) { // check if such a match was already found B = False; for (i=0;(iisCombination(F1,F2,nm); if (B) return; // repeating match -- just quit. } } if (nMatches>=nMAlloc) { if ((nMAlloc0) nMAlloc = IMin(maxNMatches,nMAlloc+100); else nMAlloc += 100; M1 = new PCMatch[nMAlloc]; for (i=0;iSetMatch ( F1,F2,nm,n,m ); if (nm==n) wasFullMatch = True; if (nm>maxMatch) maxMatch = nm; nMatches++; if (stopOnMaxNMathches && (maxNMatches>0) && (nMatches>=maxNMatches)) Stop = True; } void CGraphMatch::PrintMatches() { int i,j,k; if (nMatches<=0) printf ( "\n\n *** NO MATCHES FOUND\n\n" ); else { if (flags & GMF_UniqueMatch) printf ( "\n\n *** FOUND Unique Matches\n\n" ); else printf ( "\n\n *** FOUND Matches\n\n" ); printf ( " ## Vertices\n" ); for (i=0;imlength;j++) { if (swap) printf ( " (%i,%i)",Match[i]->F2[j],Match[i]->F1[j] ); else printf ( " (%i,%i)",Match[i]->F1[j],Match[i]->F2[j] ); k += 8; if (k>70) { printf ( "\n" ); k = 8; } } printf ( "\n" ); } } printf ( "\n **************************\n" ); } void CGraphMatch::GetMatch ( int MatchNo, ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ) { // do not allocate or dispose FV1 and FV2 in application! // FV1/p1 will always correspond to Gh1, and FV2/p2 - // to Gh2 as specified in MatchGraphs(..) if ((MatchNo<0) || (MatchNo>=nMatches)) { FV1 = NULL; FV2 = NULL; nv = 0; p1 = 0.0; p2 = 0.0; } else if (swap) Match[MatchNo]->GetMatch ( FV2,FV1,nv,p2,p1 ); else Match[MatchNo]->GetMatch ( FV1,FV2,nv,p1,p2 ); } void CGraphMatch::write ( RCFile f ) { int i; int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &nMatches ); f.WriteWord ( &flags ); f.WriteBool ( &swap ); for (i=0;iwrite ( f ); } void CGraphMatch::read ( RCFile f ) { int i,Version; FreeMemory (); f.ReadInt ( &Version ); f.ReadInt ( &nMatches ); f.ReadWord ( &flags ); f.ReadBool ( &swap ); if (nMatches>0) { nMAlloc = nMatches; Match = new PCMatch[nMatches]; for (i=0;iread ( f ); } } } void CGraphMatch::mem_write ( pstr S, int & l ) { int i; ::mem_write ( nMatches,S,l ); ::mem_write ( flags ,S,l ); ::mem_write ( swap ,S,l ); for (i=0;imem_write ( S,l ); } void CGraphMatch::mem_read ( cpstr S, int & l ) { int i; FreeMemory (); ::mem_read ( nMatches,S,l ); ::mem_read ( flags ,S,l ); ::mem_read ( swap ,S,l ); if (nMatches>0) { nMAlloc = nMatches; Match = new PCMatch[nMatches]; for (i=0;imem_read ( S,l ); } } } MakeStreamFunctions(CGraphMatch) // ============================================================= /* static char Mol1[][3] = { "C", "C", "C", "C", "C", "C" }; static int Bond1[] = { 1, 2, 1, 6, 2, 3, 3, 4, 4, 5, 5, 6 }; static char Mol2[][3] = { "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C" }; static int Bond2[] = { 1, 2, 1, 6, 2, 3, 3, 4, 4, 5, 5, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11, 6, 12 }; static char Mol1[][3] = { "C", "C", "N", "C" }; static int Bond1[] = { 1, 2, 2, 3, 3, 4 }; static char Mol2[][3] = { "C", "C", "N", "C" }; static int Bond2[] = { 1, 2, 2, 3, 2, 4, 3, 4 }; void TestGraphMatch() { int i,k1,k2, nv1,nb1, nv2,nb2; PCVertex V; PCEdge G; CGraph G1,G2; CGraphMatch U; G1.Reset (); G1.SetName ( "#1" ); nv1 = sizeof(Mol1)/3; for (i=0;iSetVertex ( Mol1[i] ); G1.AddVertex ( V ); } nb1 = sizeof(Bond1)/(2*sizeof(int)); k1 = 0; k2 = 1; for (i=0;iSetEdge ( Bond1[k1],Bond1[k2],1 ); G1.AddEdge ( G ); k1 += 2; k2 += 2; } G2.Reset (); G2.SetName ( "#2" ); nv2 = sizeof(Mol2)/3; for (i=0;iSetVertex ( Mol2[i] ); G2.AddVertex ( V ); } nb2 = sizeof(Bond2)/(2*sizeof(int)); k1 = 0; k2 = 1; for (i=0;iSetEdge ( Bond2[k1],Bond2[k2],1 ); G2.AddEdge ( G ); k1 += 2; k2 += 2; } G1.Build(); G2.Build(); U.MatchGraphs ( &G1,&G2,nv1 ); U.PrintMatches(); } */ mmdb-1.23.2.1/src/mmdb_sbase.cpp0000644000175100017510000002423211475665502013205 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 21.02.06 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_sbase // ~~~~~~~~~ // **** Classes : CSBase ( structure base manager ) // ~~~~~~~~~ CSBAtom ( SB atom class ) // CSBBond ( SB bond class ) // CSBStructure ( SB structure (monomer) class ) // CSBIndex ( SB index class ) // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __STDLIB_H #include #endif #ifndef __STRING_H #include #endif #ifndef __MMDB_SBase__ #include "mmdb_sbase.h" #endif // ========================= CSBase ============================= CSBase::CSBase() : CSBase0() { InitSBase(); } CSBase::~CSBase() { FreeMemory(); } void CSBase::InitSBase() { minDAdist = 2.0; maxDAdist = 3.9; // max distance for H-bonds maxSBdist = 4.0; // max distance for salt bridges maxHAdist2 = 2.5*2.5; maxDHAcos = 0.0; maxHAAcos = 0.0; maxDAAcos = 0.0; maxDDAcos = 0.0; } void CSBase::FreeMemory() { } void addAtomPair ( PCAtom a1, PCAtom a2, PSAtomPair & Pair, int & nPairs, int & nPAlloc ) { PSAtomPair AP; int i,i1,i2,j1,j2; Boolean Found; Found = False; i1 = a1->GetIndex(); i2 = a2->GetIndex(); for (i=0;(iGetIndex(); j2 = Pair[i].a2->GetIndex(); Found = (((i1==j1) && (i2==j2)) || ((i1==j2) && (i2==j1))); } if (!Found) { if (nPairs>=nPAlloc) { nPAlloc = nPairs+20; AP = new SAtomPair[nPAlloc]; for (i=0;i=nres1) return SBASE_EmptyResSet; MMDB = PCMMDBManager(Res1[i]->GetCoordHierarchy()); if (!MMDB) return SBASE_noCoordHierarchy; if (structFile) sFile = structFile; else sFile = GetStructFile(); if (!sFile) return SBASE_FileNotFound; selHandles1.getNewHandles ( MMDB ); for (i=0;iGetSelIndex ( selHandles1.selHndDonor,Donor1,nDonors1 ); MMDB->GetSelIndex ( selHandles2.selHndDonor,Donor2,nDonors2 ); if ((nDonors1<=0) && (nDonors2<=0)) { selHandles1.deleteSelections ( MMDB ); selHandles2.deleteSelections ( MMDB ); return SBASE_noDonors; } MMDB->GetSelIndex(selHandles1.selHndAcceptor,Acceptor1,nAcceptors1); MMDB->GetSelIndex(selHandles2.selHndAcceptor,Acceptor2,nAcceptors2); if ((nAcceptors1<=0) && (nAcceptors2<=0)) { selHandles1.deleteSelections ( MMDB ); selHandles2.deleteSelections ( MMDB ); return SBASE_noAcceptors; } if ((nDonors1*nAcceptors2<=0) && (nDonors2*nAcceptors1<=0)) { selHandles1.deleteSelections ( MMDB ); selHandles2.deleteSelections ( MMDB ); return SBASE_noHBonds; } // We now calculate contacts such that 1st contacting atom, either // acceptor or donor, belongs to 1st set of residues, and the second // one - to 2nd set of residues. Therefore we run SeekContacts on // two sets of donors and acceptors, identified by different group // id, merging the array of contacts for convenience. Contact = NULL; nContacts = 0; MMDB->SeekContacts ( Donor1,nDonors1,Acceptor2,nAcceptors2, minDAdist,RMax(maxDAdist,maxSBdist),0,Contact, nContacts,0,NULL,1,0 ); MMDB->SeekContacts ( Acceptor1,nAcceptors1,Donor2,nDonors2, minDAdist,RMax(maxDAdist,maxSBdist),0,Contact, nContacts,0,NULL,2,0 ); if (nContacts<=0) { selHandles1.deleteSelections ( MMDB ); selHandles2.deleteSelections ( MMDB ); return SBASE_noHBonds; } // 3. Check all contacts for h-bond geometry // merge all hydrogens into one selection as it is used // for checking with only MMDB->Select ( selHandles1.selHndHydrogen,STYPE_ATOM, selHandles2.selHndHydrogen,SKEY_OR ); for (i=0;iGetBonds ( DBond,nDBonds ); A->GetBonds ( ABond,nABonds ); if (nABonds>0) { // Check whether there are hydrogens bound to the donor, // and if they are then calculate h-bonds using them H = NULL; for (j=0;joccupancy>0.0) && DBond[j].atom->isInSelection( selHandles1.selHndHydrogen)) { H = DBond[j].atom; if ((H->GetDist2(A)GetCosine(D,A)<=maxDHAcos)) { // Check angles with all acceptor neighbours isHBond = True; for (k=0;(kGetCosine(H,ABond[k].atom)<=maxHAAcos); if (isHBond) { if (Contact[i].group<=1) addAtomPair ( H,A,HBond,nHBonds,nHBAlloc ); else addAtomPair ( A,H,HBond,nHBonds,nHBAlloc ); } } } if ((!H) && (nDBonds>0)) { // There were no hydrogens bonded to donor, assume that // the structure is incomplete and check donor-acceptor // geometry for possible h-bonding. isHBond = True; for (j=0;(jGetCosine(DBond[j].atom,A)<=maxDDAcos); for (j=0;(jGetCosine(D,ABond[j].atom)<=maxDAAcos); if (isHBond) { if (Contact[i].group<=1) addAtomPair ( D,A,HBond,nHBonds,nHBAlloc ); else addAtomPair ( A,D,HBond,nHBonds,nHBAlloc ); } } } } if ((Contact[i].dist<=maxSBdist) && (D->GetResidue()!=A->GetResidue()) && (!strcmp(D->element," N")) && (!strcmp(A->element," O"))) { // Check for salt bridge, which may be formed only by N-O // pairs of aminoacid atoms at distances less then maxSBdist if (!strcmp(D->name," N ")) { // mainchain nitrogen can form salt bridge only at N-terminus isSBridge = D->isNTerminus(); } else { // other nitrogens can form salt bridge only in LYS, ARG // and HIS resName = D->GetResName(); isSBridge = ((!strcmp(resName,"LYS")) || (!strcmp(resName,"ARG")) || (!strcmp(resName,"HIS"))); } if (isSBridge) { if ((!strcmp(A->name," O ")) || (!strcmp(A->name," OXT"))) { // mainchain oxygens can form salt bridge only at C-terminus isSBridge = A->isCTerminus(); } else { // other oxygens can form salt bridge only in GLU and ASP resName = A->GetResName(); isSBridge = ((!strcmp(resName,"GLU")) || (!strcmp(resName,"ASP"))); } if (isSBridge) { if (Contact[i].group<=1) addAtomPair ( D,A,SBridge,nSBridges,nSBAlloc ); else addAtomPair ( A,D,SBridge,nSBridges,nSBAlloc ); } } } } if (Contact) delete[] Contact; selHandles1.deleteSelections ( MMDB ); selHandles2.deleteSelections ( MMDB ); return SBASE_Ok; } mmdb-1.23.2.1/src/mmdb_sbase0.cpp0000644000175100017510000023351711476176273013300 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_sbase0 // ~~~~~~~~~ // **** Classes : CSBase0 ( structure base manager 0 ) // ~~~~~~~~~ CSBAtom ( SB atom class ) // CSBBond ( SB bond class ) // CSBStructure ( SB structure (monomer) class ) // CSBIndex ( SB index class ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STDLIB_H #include #endif #ifndef __STRING_H #include #endif #ifndef __LinAlg__ #include "linalg_.h" #endif #ifndef __MMDB_SBase0__ #include "mmdb_sbase0.h" #endif #ifndef __MMDB_Tables__ #include "mmdb_tables.h" #endif // ====================== SB Atom Class ========================= CSBAtom::CSBAtom() : CStream() { SBAtomInit(); } CSBAtom::CSBAtom ( RPCStream Object ) : CStream(Object) { SBAtomInit(); } CSBAtom::~CSBAtom() {} void CSBAtom::SBAtomInit() { sca_name [0] = char(0); pdb_name [0] = char(0); old_pdb_name[0] = char(0); element [0] = char(0); energyType [0] = char(0); x = -MaxReal; y = -MaxReal; z = -MaxReal; x_esd = 0.0; y_esd = 0.0; z_esd = 0.0; ccp4_charge = 0.0; // atom charge from ccp4 libs sca_charge = 0.0; // formal atom charge (MSD) partial_charge = 0.0; // partial atom charge (MSD) vdw_radius = 0.0; vdwh_radius = 0.0; ion_radius = 0.0; valency = 0; chirality = 'N'; leaving = 'N'; hb_type = 'N'; } void CSBAtom::Copy ( PCSBAtom A ) { strcpy ( sca_name ,A->sca_name ); strcpy ( pdb_name ,A->pdb_name ); strcpy ( old_pdb_name,A->old_pdb_name ); strcpy ( element ,A->element ); strcpy ( energyType ,A->energyType ); x = A->x; y = A->y; z = A->z; x_esd = A->x_esd; y_esd = A->y_esd; z_esd = A->z_esd; ccp4_charge = A->ccp4_charge; sca_charge = A->sca_charge; partial_charge = A->partial_charge; vdw_radius = A->vdw_radius; vdwh_radius = A->vdwh_radius; ion_radius = A->ion_radius; valency = A->valency; chirality = A->chirality; leaving = A->leaving; hb_type = A->hb_type; } void CSBAtom::makeCAtom ( RPCAtom a ) { if (!a) a = newCAtom(); a->SetAtomName ( 0,0,pdb_name,"","",element ); a->SetCharge ( ccp4_charge ); a->SetCoordinates ( x,y,z,1.0,0.0 ); strcpy ( a->energyType,energyType ); a->sigOcc = -1.0; // signal that atom was added from SBase } PCAtom CSBAtom::makeCAtom() { PCAtom a; a = newCAtom(); a->SetAtomName ( 0,0,pdb_name,"","",element ); a->SetCharge ( ccp4_charge ); a->SetCoordinates ( x,y,z,1.0,0.0 ); strcpy ( a->energyType,energyType ); a->sigOcc = -1.0; // signal that atom was added from SBase return a; } void CSBAtom::write ( RCFile f ) { int Version=5; f.WriteInt ( &Version ); f.WriteFile ( sca_name ,sizeof(sca_name) ); f.WriteFile ( pdb_name ,sizeof(pdb_name) ); f.WriteFile ( old_pdb_name,sizeof(old_pdb_name) ); f.WriteFile ( element ,sizeof(element) ); f.WriteFile ( energyType ,sizeof(energyType) ); f.WriteReal ( &x ); f.WriteReal ( &y ); f.WriteReal ( &z ); f.WriteReal ( &x_esd ); f.WriteReal ( &y_esd ); f.WriteReal ( &z_esd ); f.WriteReal ( &ccp4_charge ); f.WriteReal ( &sca_charge ); f.WriteReal ( &partial_charge ); f.WriteReal ( &vdw_radius ); f.WriteReal ( &vdwh_radius ); f.WriteReal ( &ion_radius ); f.WriteInt ( &valency ); f.WriteFile ( &chirality,sizeof(chirality) ); f.WriteFile ( &leaving ,sizeof(leaving) ); f.WriteFile ( &hb_type ,sizeof(hb_type) ); } void CSBAtom::read ( RCFile f ) { int Version; f.ReadInt ( &Version ); f.ReadFile ( sca_name ,sizeof(sca_name) ); f.ReadFile ( pdb_name ,sizeof(pdb_name) ); if (Version>4) f.ReadFile ( old_pdb_name,sizeof(old_pdb_name) ); else strcpy ( old_pdb_name,pdb_name ); f.ReadFile ( element ,sizeof(element) ); f.ReadFile ( energyType,sizeof(energyType) ); f.ReadReal ( &x ); f.ReadReal ( &y ); f.ReadReal ( &z ); f.ReadReal ( &x_esd ); f.ReadReal ( &y_esd ); f.ReadReal ( &z_esd ); if (Version>2) f.ReadReal ( &ccp4_charge ); if (Version>3) { f.ReadReal ( &sca_charge ); f.ReadReal ( &partial_charge ); } if (Version>1) { f.ReadReal ( &vdw_radius ); f.ReadReal ( &vdwh_radius ); f.ReadReal ( &ion_radius ); f.ReadInt ( &valency ); } f.ReadFile ( &chirality,sizeof(chirality) ); f.ReadFile ( &leaving ,sizeof(leaving) ); if (Version>1) f.ReadFile ( &hb_type,sizeof(hb_type) ); } MakeStreamFunctions(CSBAtom) // ======================= SB Bond Class ======================= CSBBond::CSBBond() : CStream() { SBBondInit(); } CSBBond::CSBBond ( RPCStream Object ) : CStream(Object) { SBBondInit(); } CSBBond::~CSBBond() {} void CSBBond::SBBondInit() { atom1 = -1; atom2 = -1; order = BOND_SINGLE; length = 0.0; length_esd = 0.0; } void CSBBond::SetBond ( int at1, int at2, int ord ) { atom1 = at1; atom2 = at2; order = ord; } void CSBBond::Copy ( PCSBBond B ) { atom1 = B->atom1; atom2 = B->atom2; order = B->order; length = B->length; length_esd = B->length_esd; } void CSBBond::write ( RCFile f ) { int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &atom1 ); f.WriteInt ( &atom2 ); f.WriteInt ( &order ); f.WriteReal ( &length ); f.WriteReal ( &length_esd ); } void CSBBond::read ( RCFile f ) { int Version; f.ReadInt ( &Version ); f.ReadInt ( &atom1 ); f.ReadInt ( &atom2 ); f.ReadInt ( &order ); f.ReadReal ( &length ); f.ReadReal ( &length_esd ); } MakeStreamFunctions(CSBBond) // ======================= SB Angle Class ===================== CSBAngle::CSBAngle() : CStream() { SBAngleInit(); } CSBAngle::CSBAngle ( RPCStream Object ) : CStream(Object) { SBAngleInit(); } CSBAngle::~CSBAngle() {} void CSBAngle::SBAngleInit() { atom1 = -1; atom2 = -1; atom3 = -1; angle = 0.0; angle_esd = 0.0; } void CSBAngle::Copy ( PCSBAngle G ) { atom1 = G->atom1; atom2 = G->atom2; atom3 = G->atom3; angle = G->angle; angle_esd = G->angle_esd; } void CSBAngle::write ( RCFile f ) { int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &atom1 ); f.WriteInt ( &atom2 ); f.WriteInt ( &atom3 ); f.WriteReal ( &angle ); f.WriteReal ( &angle_esd ); } void CSBAngle::read ( RCFile f ) { int Version; f.ReadInt ( &Version ); f.ReadInt ( &atom1 ); f.ReadInt ( &atom2 ); f.ReadInt ( &atom3 ); f.ReadReal ( &angle ); f.ReadReal ( &angle_esd ); } MakeStreamFunctions(CSBAngle) // ====================== SB Torsion Class =================== CSBTorsion::CSBTorsion() : CStream() { SBTorsionInit(); } CSBTorsion::CSBTorsion ( RPCStream Object ) : CStream(Object) { SBTorsionInit(); } CSBTorsion::~CSBTorsion() {} void CSBTorsion::SBTorsionInit() { atom1 = -1; atom2 = -1; atom3 = -1; atom4 = -1; torsion = 0.0; torsion_esd = 0.0; } void CSBTorsion::Copy ( PCSBTorsion T ) { atom1 = T->atom1; atom2 = T->atom2; atom3 = T->atom3; atom4 = T->atom4; torsion = T->torsion; torsion_esd = T->torsion_esd; } void CSBTorsion::write ( RCFile f ) { int Version=1; f.WriteInt ( &Version ); f.WriteInt ( &atom1 ); f.WriteInt ( &atom2 ); f.WriteInt ( &atom3 ); f.WriteInt ( &atom4 ); f.WriteReal ( &torsion ); f.WriteReal ( &torsion_esd ); } void CSBTorsion::read ( RCFile f ) { int Version; f.ReadInt ( &Version ); f.ReadInt ( &atom1 ); f.ReadInt ( &atom2 ); f.ReadInt ( &atom3 ); f.ReadInt ( &atom4 ); f.ReadReal ( &torsion ); f.ReadReal ( &torsion_esd ); } MakeStreamFunctions(CSBTorsion) // ==================== Structure Class ========================= CSBStructure::CSBStructure() : CStream() { SBStructureInit(); } CSBStructure::CSBStructure ( RPCStream Object ) : CStream(Object) { SBStructureInit(); } CSBStructure::~CSBStructure() { FreeMemory(); } void CSBStructure::Reset() { FreeMemory(); SBStructureInit(); } void CSBStructure::FreeMemory() { int i; if (Formula) delete[] Formula; if (Name) delete[] Name; if (Synonym) delete[] Synonym; if (Charge) delete[] Charge; Formula = NULL; Name = NULL; Synonym = NULL; Charge = NULL; FreeVectorMemory ( leavingAtom,0 ); FreeVectorMemory ( bondedAtom ,0 ); nLeavingAtoms = 0; for (i=0;i=nAAlloc) { nAAlloc += 50; Atom1 = new PCSBAtom[nAAlloc]; for (i=0;i=nBAlloc) { nBAlloc += 50; Bond1 = new PCSBBond[nBAlloc]; for (i=0;ileaving=='Y') nLeavingAtoms++; if (nLeavingAtoms>0) { GetVectorMemory ( leavingAtom,nLeavingAtoms,0 ); GetVectorMemory ( bondedAtom ,nLeavingAtoms,0 ); j = 0; for (i=0;ileaving=='Y') { leavingAtom[j] = i+1; bondedAtom [j] = 0; j++; } for (i=0;iatom1) && (strcmp(Atom[Bond[j]->atom2-1]->element," H"))) bondedAtom[i] = Bond[j]->atom2; else if ((leavingAtom[i]==Bond[j]->atom2) && (strcmp(Atom[Bond[j]->atom1-1]->element," H"))) bondedAtom[i] = Bond[j]->atom1; } } } void CSBStructure::AddAngle ( PCSBAngle angle ) { PPCSBAngle Angle1; int i; if (nAngles>=nGAlloc) { nGAlloc += 50; Angle1 = new PCSBAngle[nGAlloc]; for (i=0;i=nTAlloc) { nTAlloc += 50; Torsion1 = new PCSBTorsion[nTAlloc]; for (i=0;ienergyType[0] = char(0); } int CSBStructure::SetEnergyType ( cpstr sca_name, cpstr energyType, realtype partial_charge ) { int n; n = GetAtomNo ( sca_name ); if (n>0) { strcpy ( Atom[n-1]->energyType,energyType ); Atom[n-1]->partial_charge = partial_charge; } return n; } int CSBStructure::GetAtomNo ( cpstr sca_name ) { int n,i; n = 0; for (i=0;(isca_name)) n = i+1; } return n; } PCSBAtom CSBStructure::GetAtom ( cpstr sca_name ) { int n; n = GetAtomNo ( sca_name ); if (n>0) return Atom[n-1]; else return NULL; } void CSBStructure::GetAtomTable ( PPCAtom & atomTable, int & nOfAtoms ) { int i; nOfAtoms = nAtoms; if (nAtoms>0) { atomTable = new PCAtom[nAtoms]; for (i=0;imakeCAtom ( atomTable[i] ); } } else atomTable = NULL; } void CSBStructure::GetAtomNameMatch ( PPCAtom A, int nat, pstr altLoc, ivector anmatch ) { // GetAtomNameMatch(..) returns anmatch[i], i=0..nAtoms-1, equal // to j such that name(Atom[i])==name(A[j]). Note that atom names // are similarly aligned and space-padded in both MMDb and SBase. // If ith atom in the structue is not found in A, anmatch[i] is // set -1. // If array A contains atoms in different alternative conformations, // the the value of altLoc is interpreted as follows: // NULL - the highest occupancy atom will be taken // if all occupancies are equal then atom with // first altLoc taken // other - atoms with given altLoc are taken. If such // altLoc is not found, the function does as if // NULL value for altLoc is given. // A clean PDB file is anticipated, so that atoms with alternative // conformations are grouped together. // It is Ok to have NULL pointers in A. int i,j,k; Boolean done; for (i=0;iTer) && (!strcmp(A[j]->name,Atom[i]->pdb_name))) { k = j; // atom found // check now for altLocs j++; while ((jTer || (strcmp(A[j]->name,Atom[i]->pdb_name))); if (!done) { if (A[j]->occupancy>A[k]->occupancy) k = j; if (altLoc) { if (!strcmp(A[j]->altLoc,altLoc)) { k = j; done = True; } } } } j++; } } } j++; } anmatch[i] = k; } } int CSBStructure::CheckAtoms() { // CheckAtoms() returns -1 if there is no atoms // -2 if not all atoms are annotated // -3 if not all coordinates are set // 0 otherwise int i,rc; if (nAtoms<=0) return -1; for (i=0;ix==-MaxReal) rc = -3; return rc; } PCResidue CSBStructure::makeCResidue ( Boolean includeHydrogens, Boolean makeTer ) { PCResidue Res; int i; Res = newCResidue(); for (i=0;ipdb_name[2]),"XT")) && (includeHydrogens || strcmp(Atom[i]->element," H"))) Res->AddAtom ( Atom[i]->makeCAtom() ); } return Res; } int superpose_atoms ( mat44 & T, PPCSBAtom A1, PPCAtom A2, int nAtoms, rmatrix & A, rmatrix & U, rmatrix & V, rvector & W, rvector & RV1 ) { // Given two sets of atoms, A1 and A2, superpose_atoms(...) // calculates the rotational-translational matrix T such that // |T*A1 - A2| is minimal in least-square terms. The transfomation // superposes exactly the atoms A1[0] and A2[0]. realtype det,B; vect3 vc1,vc2; int i,j,k; // 1. Calculate the correlation matrix. The rotation will be // done around for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] = 0.0; for (k=1;kx - A1[0]->x; vc1[1] = A1[k]->y - A1[0]->y; vc1[2] = A1[k]->z - A1[0]->z; vc2[0] = A2[k]->x - A2[0]->x; vc2[1] = A2[k]->y - A2[0]->y; vc2[2] = A2[k]->z - A2[0]->z; for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] += vc1[j-1]*vc2[i-1]; } // 2. Calculate transformation matrix (to be applied to A1) det = A[1][1]*A[2][2]*A[3][3] + A[1][2]*A[2][3]*A[3][1] + A[2][1]*A[3][2]*A[1][3] - A[1][3]*A[2][2]*A[3][1] - A[1][1]*A[2][3]*A[3][2] - A[3][3]*A[1][2]*A[2][1]; // 2.1 SV-decompose the correlation matrix SVD ( 3,3,3,A,U,V,W,RV1,True,True,i ); if (i!=0) return SPOSEAT_SVD_Fail; // 2.2 Check for parasite inversion and fix it if found if (det<=0.0) { k = 0; B = MaxReal; for (j=1;j<=3;j++) if (W[j]x - T[0][0]*A1[0]->x - T[0][1]*A1[0]->y - T[0][2]*A1[0]->z; T[1][3] = A2[0]->y - T[1][0]*A1[0]->x - T[1][1]*A1[0]->y - T[1][2]*A1[0]->z; T[2][3] = A2[0]->z - T[2][0]*A1[0]->x - T[2][1]*A1[0]->y - T[2][2]*A1[0]->z; return SPOSEAT_Ok; } int CSBStructure::AddHydrogens ( PCResidue R ) { // // Return: // SBASE_Ok success // SBASE_EmptyResidue residue R does not contain atoms // SBASE_NoAtomsFound SBStructure does not contain atoms // SBASE_NoBonds SBStructure does not contain bonds // SBASE_NoAtomsData SBStructure is not complete // SBASE_NoSimilarity too few coomon atom names in R and SBase // entry with the same structure name // SBASE_SuperpositionFailed failed residue superposition // // NOTE1: the function does not rearranges existing atoms in the // residue, but places the hydrogens on top of them (leaving the // Ter pseudoatom, if found, on top of the list). // // NOTE2: in case of alternative locations, the first one in the // residue is chosen. // PPCAtom H; PCSBAtom sa1[10]; PCAtom sa2[10]; rmatrix D,U,V; rvector W,RV1; imatrix c; ivector A,nb; mat44 T; int i,j,k,m,n,mm,nTer,nH; // 1. Make simple checks if (nAtoms<=2) return SBASE_NoAtomsFound; if (nBonds<=0) return SBASE_NoBonds; if (R->nAtoms<=2) return SBASE_EmptyResidue; if (nAtoms==R->nAtoms) return SBASE_Ok; // 2. Map existing atoms from the residue onto a local array GetVectorMemory ( A,nAtoms,0 ); nTer = 20000; for (i=0;inAtoms) && (A[i]<0);j++) if (R->atom[j]) { if (R->atom[j]->Ter) nTer = j; else if (!strcmp(Atom[i]->pdb_name,R->atom[j]->name)) A[i] = j; // here is the place to check for altlocs } } // 3. Make bond matrix GetMatrixMemory ( c ,nAtoms,10,0,0 ); GetVectorMemory ( nb,nAtoms,0 ); for (i=0;iatom1-1; k = Bond[i]->atom2-1; c[j][nb[j]] = k; c[k][nb[k]] = j; nb[j]++; nb[k]++; } // 4. Loop over all hydrogens. Locate core atoms bonded to // hydrogen in SBStructure and superpose them with the // corresponding atoms in the residue. Using the superposition // matrix, add hydrogens to the residue. GetMatrixMemory ( D ,3,3,1,1 ); GetMatrixMemory ( U ,3,3,1,1 ); GetMatrixMemory ( V ,3,3,1,1 ); GetVectorMemory ( W ,3,1 ); GetVectorMemory ( RV1,3,1 ); H = new PCAtom[nAtoms]; nH = 0; for (i=0;ielement," H")) && (A[i]<0) && (nb[i]>0) && (Atom[i]->x>-MaxReal)) { // ith atom is a hydrogen which is not found in the residue. // Find 3+ core atoms that are most closely bonded to this one. n = c[i][0]; // core atom bonded to the hydrogen if (A[n]>=0) { sa1[0] = Atom[n]; sa2[0] = R->atom[A[n]]; mm = 1; m = 1; while ((m<3) && (mm<2)) { k = n; for (j=0;(j=0) { sa1[m] = Atom[n]; sa2[m] = R->atom[A[n]]; m++; } } mm++; } if (m>=3) { // superpose atoms and add the hydrogen to the residue k = superpose_atoms ( T,sa1,sa2,m,D,U,V,W,RV1 ); if (k==SPOSEAT_Ok) { H[nH] = Atom[i]->makeCAtom(); H[nH]->Transform ( T ); nH++; } } } } // 5. Put hydrogens into the residue for (i=0;iInsertAtom ( H[i],nTer ); nTer++; } // 6. Release memory and return if (H) delete[] H; FreeVectorMemory ( A,0 ); FreeVectorMemory ( RV1,1 ); FreeVectorMemory ( W ,1 ); FreeMatrixMemory ( V ,3,1,1 ); FreeMatrixMemory ( U ,3,1,1 ); FreeMatrixMemory ( D ,3,1,1 ); FreeVectorMemory ( nb,0 ); FreeMatrixMemory ( c ,nAtoms,0,0 ); return SBASE_Ok; } void CSBStructure::Copy ( PCSBStructure S ) { int i; FreeMemory(); strcpy ( compoundID,S->compoundID ); CreateCopy ( Formula ,S->Formula ); CreateCopy ( Name ,S->Name ); CreateCopy ( Synonym ,S->Synonym ); CreateCopy ( Charge ,S->Charge ); xyz_source = S->xyz_source; nLeavingAtoms = S->nLeavingAtoms; if (nLeavingAtoms>0) { GetVectorMemory ( leavingAtom,nLeavingAtoms,0 ); GetVectorMemory ( bondedAtom ,nLeavingAtoms,0 ); for (i=0;ileavingAtom[i]; bondedAtom [i] = S->bondedAtom [i]; } } nAtoms = S->nAtoms; nAAlloc = nAtoms; if (nAtoms>0) { Atom = new PCSBAtom[nAtoms]; for (i=0;iCopy ( S->Atom[i] ); } } nBonds = S->nBonds; nBAlloc = nBonds; if (nBonds>0) { Bond = new PCSBBond[nBonds]; for (i=0;iCopy ( S->Bond[i] ); } } nAngles = S->nAngles; nGAlloc = nAngles; if (nAngles>0) { Angle = new PCSBAngle[nAngles]; for (i=0;iCopy ( S->Angle[i] ); } } nTorsions = S->nTorsions; nTAlloc = nTorsions; if (nTorsions>0) { Torsion = new PCSBTorsion[nTorsions]; for (i=0;iCopy ( S->Torsion[i] ); } } } void CSBStructure::write ( RCFile f ) { int i,Version=1; f.WriteInt ( &Version ); f.WriteFile ( compoundID,sizeof(compoundID) ); f.CreateWrite ( Formula ); f.CreateWrite ( Name ); f.CreateWrite ( Synonym ); f.CreateWrite ( Charge ); f.WriteFile ( &xyz_source,sizeof(xyz_source) ); f.WriteInt ( &nLeavingAtoms ); for (i=0;i0) { GetVectorMemory ( leavingAtom,nLeavingAtoms,0 ); GetVectorMemory ( bondedAtom ,nLeavingAtoms,0 ); for (i=0;i0) { Atom = new PCSBAtom[nAtoms]; for (i=0;i0) { Bond = new PCSBBond[nBonds]; for (i=0;i0) { Angle = new PCSBAngle[nAngles]; for (i=0;i0) { Torsion = new PCSBTorsion[nTorsions]; for (i=0;i not loaded nXTs = 0; // total number of "XT"-atoms Comp1 = NULL; Comp2 = NULL; } int CSBIndex::MakeCompositions ( PCSBStructure SBS ) { // MakeCompositions(..) makes the compositions strings for the // given structure. // A composition string consists of records E(N), where E stands // for chemical element name, and N - for the number of atoms of this // element in the structure. The records E(N) follow in alphabetical // order of E without spaces and contain no spaces, records with N=0 // are excluded. // Comp2 differs of Comp1 only if there are leaving atoms and // represents the composition with leaving atoms taken into account. // If there is no leaving atoms, Comp2==Comp1. // The function returns the number of leaving atoms in the. // structure. char Cmp1[1000]; char Cmp2[1000]; char N[50]; ivector elem; int i,k,x,l,nl; short n0,n; nAtoms = SBS->nAtoms; nBonds = SBS->nBonds; strcpy ( Cmp1,"" ); strcpy ( Cmp2,"" ); GetVectorMemory ( elem,nAtoms,0 ); for (i=0;iAtom[i]->element ); n0 = -1; n = 0; nl = 0; for (i=0;(in0) && (elem[k]Atom[k]->leaving=='Y') l++; } nl += l; sprintf ( N,"%s(%i)",ElementName[n-1],x ); strcat ( Cmp1,N ); sprintf ( N,"%s(%i)",ElementName[n-1],x-l ); strcat ( Cmp2,N ); n0 = n; } } FreeVectorMemory ( elem,0 ); CreateCopy ( Comp1,Cmp1 ); CreateCopy ( Comp2,Cmp2 ); return nl; } void CSBIndex::write ( RCFile f ) { int Version=1; f.WriteInt ( &Version ); f.WriteFile ( compoundID,sizeof(compoundID) ); f.WriteInt ( &nAtoms ); f.WriteInt ( &nBonds ); f.WriteInt ( &fGraphPos ); f.WriteInt ( &fStructPos ); f.WriteInt ( &nXTs ); f.CreateWrite ( Comp1 ); f.CreateWrite ( Comp2 ); } void CSBIndex::read ( RCFile f ) { int Version; f.ReadInt ( &Version ); f.ReadFile ( compoundID,sizeof(compoundID) ); f.ReadInt ( &nAtoms ); f.ReadInt ( &nBonds ); f.ReadInt ( &fGraphPos ); f.ReadInt ( &fStructPos ); f.ReadInt ( &nXTs ); f.CreateRead ( Comp1 ); f.CreateRead ( Comp2 ); } MakeStreamFunctions(CSBIndex) // ========================= CSBase0 ============================ CSBase0::CSBase0() { InitSBase0(); } CSBase0::~CSBase0() { FreeMemory0(); } void CSBase0::InitSBase0() { dirpath = NULL; Index = NULL; nStructures = 0; nIAlloc = 0; nLoad = 0; nLAlloc = 0; ldGraph = NULL; ldStructure = NULL; } void CSBase0::FreeMemory0() { int i; if (dirpath) delete[] dirpath; dirpath = NULL; if (Index) { for (i=0;i0) { if (dirpath[i-1]!='/') strcat ( dirpath,"/" ); } } S = NULL; f.assign ( GetPath(S,sbIndexFile),False,True ); if (S) delete[] S; if (f.reset(True)) { while ((!f.FileEnd()) && f.Success()) { if (nStructures>=nIAlloc) { nIAlloc += 5000; Index1 = new PCSBIndex[nIAlloc]; for (i=0;iloadPos>=0) RC = SBASE_AlreadyLoaded; else { structFile = GetStructFile(); if (structFile) { structFile->seek ( Index[structNo]->fStructPos ); StreamRead ( *structFile,SBS ); structFile->shut (); delete structFile; if (!SBS) RC = SBASE_ReadError; } else RC = SBASE_FileNotFound; } if (RC==SBASE_Ok) { graphFile = GetGraphFile(); if (graphFile) { graphFile->seek ( Index[structNo]->fGraphPos ); StreamRead ( *graphFile,G ); graphFile->shut (); if (!G) RC = SBASE_ReadError; delete graphFile; } else RC = SBASE_FileNotFound; } } else RC = SBASE_StructNotFound; if (RC==SBASE_Ok) { k = -1; for (i=0;(iloadPos = k; } else { if (SBS) delete SBS; if (G) delete G; } return RC; } int CSBase0::UnloadStructure ( cpstr compoundID ) { // UnloadStructure(..) deletes strtucture from RAM and releases // its memory. The structure is then accessible through a normal // way from *.sbase files, which is slower. int structNo,ldPos; structNo = GetStructNo ( compoundID ); if (structNo==SBASE_StructNotFound) return structNo; else { ldPos = Index[structNo]->loadPos; if (ldPos<0) return SBASE_AlreadyUnloaded; if (ldStructure[ldPos]) { delete ldStructure[ldPos]; ldStructure[ldPos] = NULL; } if (ldGraph[ldPos]) { delete ldGraph[ldPos]; ldGraph[ldPos] = NULL; } Index[structNo]->loadPos = -1; } return SBASE_Ok; } int MakeChirInd ( char chirality ) { if (chirality=='S') return -1; if (chirality=='R') return +1; return 0; } int MakeElementType ( int ElType, int Chirality, Boolean Cflag ) { if (Cflag) { if (Chirality<0) return ElType | CHIRAL_LEFT; if (Chirality>0) return ElType | CHIRAL_RIGHT; } return ElType; } int MakeElementType ( int ElType, char chirality, Boolean Cflag ) { if (Cflag) { if (chirality=='S') return ElType | CHIRAL_LEFT; if (chirality=='R') return ElType | CHIRAL_RIGHT; } return ElType; } int CSBase0::GetStructNo ( cpstr compoundID ) { int l1,l2,l,k; char id[20]; l = k = 0; // initialize, else may become undefined strcpy_css ( id,compoundID ); if (nStructures<=3) { k = -1; for (l=0;(lcompoundID,id)) k = l; if (k>=0) return k; return SBASE_StructNotFound; } l1 = 0; l2 = nStructures-1; while (l1compoundID,id ); if (k<0) l1 = l; else if (k>0) l2 = l; else { l1 = l; l2 = l; } } if (k==0) return l; else if (l==l1) { if (!strcasecmp(Index[l2]->compoundID,id)) return l2; } else if (l==l2) { if (!strcasecmp(Index[l1]->compoundID,id)) return l1; } return SBASE_StructNotFound; } PCFile CSBase0::GetStructFile() { PCFile structFile; pstr S; structFile = new CFile(); S = NULL; structFile->assign ( GetPath(S,sbStructFile),False,True ); if (S) delete[] S; if (!structFile->reset(True)) { delete structFile; structFile = NULL; } return structFile; } PCFile CSBase0::GetGraphFile() { PCFile graphFile; pstr S; graphFile = new CFile(); S = NULL; graphFile->assign ( GetPath(S,sbGraphFile),False,True ); if (S) delete[] S; if (!graphFile->reset(True)) { delete graphFile; graphFile = NULL; } return graphFile; } PCSBStructure CSBase0::GetStructure ( cpstr compoundID ) { // GetStructure returns pointer to the monomer structure // identified by 3-letter compoundID. If such structure is not // found, the function returns NULL. // The function returns a pointer to a private copy of the // structure. Modifying it will not change data in the structural // database. The application is responsible for deallocating // the structure after use (simply use delete). // See description of CSBStructure for the explanation of // its fields. PCFile structFile; PCSBStructure SBS; int structNo; SBS = NULL; structNo = GetStructNo ( compoundID ); if (structNo!=SBASE_StructNotFound) { if (Index[structNo]->loadPos>=0) { SBS = new CSBStructure(); SBS->Copy ( ldStructure[Index[structNo]->loadPos] ); } else { structFile = GetStructFile(); if (structFile) { structFile->seek ( Index[structNo]->fStructPos ); StreamRead ( *structFile,SBS ); structFile->shut (); delete structFile; } } } return SBS; } PCSBStructure CSBase0::GetStructure ( int structNo, PCFile structFile ) { PCFile sFile; PCSBStructure SBS; SBS = NULL; if ((0<=structNo) && (structNoloadPos>=0) { SBS = new CSBStructure(); SBS->Copy ( ldStructure[Index[structNo]->loadPos] ); } else { if (!structFile) sFile = GetStructFile(); else sFile = structFile; if (sFile) { sFile->seek ( Index[structNo]->fStructPos ); StreamRead ( *sFile,SBS ); if (!structFile) delete sFile; } } } return SBS; } PCSBStructure CSBase0::GetStructure ( cpstr compoundID, PCFile structFile ) { // Another form of GetStructure(..) uses an open structure // file, which allows to save on opening/closing file if // multiple access to SBase structures is required. PCFile sFile; PCSBStructure SBS; int structNo; SBS = NULL; structNo = GetStructNo ( compoundID ); if (structNo!=SBASE_StructNotFound) { if (Index[structNo]->loadPos>=0) { SBS = new CSBStructure(); SBS->Copy ( ldStructure[Index[structNo]->loadPos] ); } else { if (!structFile) sFile = GetStructFile(); else sFile = structFile; if (sFile) { sFile->seek ( Index[structNo]->fStructPos ); StreamRead ( *sFile,SBS ); if (!structFile) delete sFile; } } } return SBS; } PCResidue CSBase0::makeCResidue ( cpstr compoundID, PCFile structFile, Boolean includeHydrogens, Boolean makeTer ) { PCSBStructure SBS; PCResidue Res; SBS = GetStructure ( compoundID,structFile ); if (SBS) { Res = SBS->makeCResidue ( includeHydrogens,makeTer ); delete SBS; return Res; } else return NULL; } PCResidue CSBase0::makeCResidue ( int structNo, PCFile structFile, Boolean includeHydrogens, Boolean makeTer ) { PCSBStructure SBS; PCResidue Res; SBS = GetStructure ( structNo,structFile ); if (SBS) { Res = SBS->makeCResidue ( includeHydrogens,makeTer ); delete SBS; return Res; } else return NULL; } int CSBase0::GetNofAtoms ( int structNo ) { if ((0<=structNo) && (structNonAtoms; else return SBASE_StructNotFound; } int CSBase0::GetNofAtoms ( cpstr compoundID ) { int structNo; structNo = GetStructNo ( compoundID ); if (structNo!=SBASE_StructNotFound) return GetNofAtoms(structNo); else return SBASE_StructNotFound; } int CSBase0::GetGraph ( PCFile graphFile, int structNo, RPCGraph G, int Hflag ) { // GetGraph(..) retrieves data for chemical structure number structNo // (as described in Index) from graph file graphFile, then allocates // and builds the corresponding graph, which is returned in G. // If Hflag is set to 1, all hydrogens are removed from the graph. // If Hflag is set to 2, element types of atoms, to which hydrogens // are bonded, are modified with flag HYDROGEN_BOND and moved to // the end. // Returns 0 in case of success. int rc,htype; if ((structNo<0) || (structNo>=nStructures)) return SBASE_WrongIndex; rc = SBASE_Ok; if (Index[structNo]->loadPos>=0) { if (!G) G = new CGraph(); G->Copy ( ldGraph[Index[structNo]->loadPos] ); } else { graphFile->seek ( Index[structNo]->fGraphPos ); graphFile->SetSuccess(); StreamRead ( *graphFile,G ); if (!graphFile->Success()) { rc = SBASE_ReadError; if (G) delete G; G = NULL; } } if (G) { G->MakeVertexIDs(); if (Hflag>=1) { htype = getElementNo(pstr("H")); if (Hflag==2) G->HideType ( htype ); else G->ExcludeType ( htype ); } G->Build ( False ); } return rc; } int CSBase0::GetGraph ( PCFile graphFile, RPCGraph G, int Hflag ) { // GetGraph(..) retrieves data for chemical structure, which is // next in the graph file, then allocates and builds the corresponding // graph, which is returned in G. // If Hflag is set to 1, all hydrogens are removed from the graph. // If Hflag is set to 2, element types of atoms, to which hydrogens // are bonded, are modified with flag HYDROGEN_BOND and moved to // the end. // Returns 0 in case of success. int rc,htype; rc = 0; graphFile->SetSuccess(); StreamRead ( *graphFile,G ); if (!graphFile->Success()) { rc = SBASE_ReadError; if (G) delete G; G = NULL; } if (G) { G->MakeVertexIDs(); if (Hflag>=1) { htype = getElementNo(pstr("H")); if (Hflag==2) G->HideType ( htype ); else G->ExcludeType ( htype ); } G->Build ( False ); } return rc; } int CSBase0::GetGraph ( int structNo, RPCGraph G, int Hflag ) { PCFile graphFile; int htype; if ((0<=structNo) && (structNoloadPos>=0) { if (!G) G = new CGraph(); G->Copy ( ldGraph[Index[structNo]->loadPos] ); } else { graphFile = GetGraphFile(); if (graphFile) { graphFile->seek ( Index[structNo]->fGraphPos ); StreamRead ( *graphFile,G ); graphFile->shut (); delete graphFile; } else { if (G) delete G; G = NULL; return SBASE_FileNotFound; } } } else { if (G) delete G; G = NULL; return SBASE_WrongIndex; } if (G) { G->MakeVertexIDs(); if (Hflag>=1) { htype = getElementNo(pstr("H")); if (Hflag==2) G->HideType ( htype ); else G->ExcludeType ( htype ); } G->Build ( False ); } return SBASE_Ok; /* graphFile = GetGraphFile(); if (graphFile) { rc = GetGraph ( graphFile,G,Hflag ); graphFile->shut(); delete graphFile; return rc; } else { if (G) delete G; G = NULL; return SBASE_FileNotFound; } */ } int CSBase0::GetGraph ( cpstr compoundID, RPCGraph G, int Hflag ) { PCFile graphFile; int structNo,htype; structNo = GetStructNo ( compoundID ); if (structNo!=SBASE_StructNotFound) { if (Index[structNo]->loadPos>=0) { if (!G ) G = new CGraph(); G->Copy ( ldGraph[Index[structNo]->loadPos] ); } else { graphFile = GetGraphFile(); if (graphFile) { graphFile->seek ( Index[structNo]->fGraphPos ); StreamRead ( *graphFile,G ); graphFile->shut (); delete graphFile; } else { if (G) delete G; G = NULL; return SBASE_FileNotFound; } } } if (G) { G->MakeVertexIDs(); if (Hflag>=1) { htype = getElementNo(pstr("H")); if (Hflag==2) G->HideType ( htype ); else G->ExcludeType ( htype ); } G->Build ( False ); } return structNo; /* if (structNo!=SBASE_StructNotFound) { return GetGraph ( structNo,G,Hflag ); } else { if (G) delete G; G = NULL; return structNo; } */ } int CSBase0::CheckGraph ( PCGraph G, int Hflag, Boolean Cflag, int & nInStructure, int & nMatched, ivector match, int minMatchSize ) { // CheckGraph(..) checks graph G against the same-name // structure in the database. The name must be passed in // G->name as a standard 3-letter code. // If Hflag is set >= 1, all hydrogens are removed from the graph. // If Hflag is set to 2, element types of atoms, to which hydrogens // are bonded, are modified with flag HYDROGEN_BOND. // If Cflag is set to True, then chirality information is // assumed in the input graph G and it is used for the // checking. If Cflag is set to False, then chirality // information is neither assumed nor used for the checking. // If a same-name structure is found in the database, // the function returns the number of matched vertices // (nMatched) from those found in the database (nInStructure). // The correspondence between the input and database graphs // is returned in array match (it should be of sufficient // length) such that ith vertex of input graph corresponds // to the match[i]th vertex of the database graph. The // function then returns SBASE_Ok if the number of matched // vertices coincides with nInStructure and nMatched, and // the return is SBASE_CheckFail otherwise. // If a same-name structure is not found, the function // returns SBASE_StructNotFound or SBASE_FileNotFound. PCFile graphFile; PCGraphMatch U; PCGraph G1; PAtomName atName; ivector F1,F2; realtype p1,p2; int structNo,rc,j,k, nAtoms,nH, minMatch; nMatched = 0; nInStructure = 0; structNo = GetStructNo ( G->GetName() ); if (structNo==SBASE_StructNotFound) return SBASE_StructNotFound; if (Index[structNo]->loadPos<0) { graphFile = GetGraphFile(); if (!graphFile) return SBASE_FileNotFound; } else graphFile = NULL; G1 = NULL; rc = GetGraph ( graphFile,structNo,G1,Hflag ); if ((!G1) || (rc!=SBASE_Ok)) return rc; if (graphFile) { graphFile->shut(); delete graphFile; } if (!Cflag) G1->RemoveChirality(); nInStructure = G1->GetNofVertices(); if (minMatchSize>0) minMatch = minMatchSize; else minMatch = nInStructure - Index[structNo]->nXTs; U = new CGraphMatch(); U->MatchGraphs ( G,G1,minMatch ); k = U->GetNofMatches(); if (k>0) { U->GetMatch ( 0,F1,F2,nMatched,p1,p2 ); for (j=1;j<=nMatched;j++) match[F1[j]-1] = F2[j]-1; } if ((nInStructure==G->GetNofVertices()) && (nInStructure==nMatched)) { rc = SBASE_Ok; } else if (nMatched>0) { // check if atoms that were not matched are the // teminating ones ("-XT") atName = new AtomName[nInStructure*2+1]; if (Hflag>=1) nH = -1; // remove hydrogens else nH = 0; k = 1; if (GetAtNames(structNo,atName,nAtoms,nH)==SBASE_Ok) { for (j=1;j<=nMatched;j++) atName[F2[j]-1][0] = char(0); k = 0; for (j=0;(j=1) { htype = getElementNo(pstr("H")); if (Hflag==2) G->HideType ( htype ); else G->ExcludeType ( htype ); } G->Build ( False ); nInResidue = G->GetNofVertices(); if (nInResidue<=0) { rc = SBASE_NoAtomsFound; nInStructure = 0; nMatched = 0; } else rc = CheckGraph ( G,Hflag,Cflag,nInStructure,nMatched,match, minMatchSize ); delete G; return rc; } void SDASelHandles::getNewHandles ( PCMMDBManager MMDB ) { selHndDonor = MMDB->NewSelection(); selHndAcceptor = MMDB->NewSelection(); selHndHydrogen = MMDB->NewSelection(); selKey = SKEY_OR; } void SDASelHandles::makeSelIndexes ( PCMMDBManager MMDB ) { MMDB->MakeSelIndex ( selHndDonor ); MMDB->MakeSelIndex ( selHndAcceptor ); MMDB->MakeSelIndex ( selHndHydrogen ); } void SDASelHandles::deleteSelections ( PCMMDBManager MMDB ) { MMDB->DeleteSelection ( selHndDonor ); MMDB->DeleteSelection ( selHndAcceptor ); MMDB->DeleteSelection ( selHndHydrogen ); } int CSBase0::MakeBonds ( PCResidue R, pstr altLoc, PCFile structFile, PSDASelHandles selHandles, Boolean ignoreNegSigOcc ) { // MakeBonds(..) makes bonds between atoms in MMDB's residue R // from data found in SBase. Residue R must be associated with // coordinate hierarchy. Data is retrieved from SBase on the basis // of residue name only. In case of multiple conformations, if // altLoc: // NULL - the highest occupancy atom will be taken // if all occupancies are equal then atom with // first altLoc taken // other - atoms with given altLoc are taken. If such // altLoc is not found, the function does as if // NULL value for altLoc is given. // If selHandles is not NULL, the function also selects atoms // in the residue according to their hydrogen bond attributes. // This is a special option for hydrogen bond calculations. // If ignoreNegSigOcc is set True then the function will ignore // atoms with negative occupancy standard deviation. Such atoms // may be hydrogens added by CSBase0::AddHydrogens(..) function, // in general any atoms added by CSBAtom::MakeCAtom(..) function. // Added hydrogens may be ignored if MakeBonds is used in // CSbase::CalcHBonds(..) function. // Return: // SBASE_Ok success // SBASE_FileNotFound non-initiated SBase // SBASE_StructNotFound the residue's name is not found in SBase // SBASE_EmptyResidue residue R does not contain atoms // SBASE_NoAtomsFound SBase entry does not contain atoms // SBASE_BrokenBonds some bonds could not be set up because // of missing atoms in R. This could be // a result of residue R named wrongly. PCSBStructure SBS; PCMMDBManager MMDB; PPCAtom A; ivector anmatch; int natoms,i,i1,i2,rc; R->GetAtomTable ( A,natoms ); if (!A) return SBASE_EmptyResidue; for (i=0;iFreeBonds(); SBS = GetStructure ( R->GetResName(),structFile ); if (!SBS) return SBASE_StructNotFound; if (SBS->nAtoms<=0) { delete SBS; return SBASE_NoAtomsFound; } GetVectorMemory ( anmatch,SBS->nAtoms,0 ); SBS->GetAtomNameMatch ( A,natoms,altLoc,anmatch ); if (ignoreNegSigOcc) for (i=0;inAtoms;i++) { i1 = anmatch[i]; if (i1>=0) { if (A[i1]->sigOcc<0.0) anmatch[i] = -1; } } if (selHandles) { MMDB = PCMMDBManager(R->GetCoordHierarchy()); if (MMDB) { i2 = selHandles->selKey; for (i=0;inAtoms;i++) { i1 = anmatch[i]; if (i1>=0) switch (SBS->Atom[i]->hb_type) { case 'D' : MMDB->SelectAtom ( selHandles->selHndDonor, A[i1],i2,False ); break; case 'A' : MMDB->SelectAtom ( selHandles->selHndAcceptor, A[i1],i2,False ); break; case 'B' : MMDB->SelectAtom ( selHandles->selHndDonor, A[i1],i2,False ); MMDB->SelectAtom ( selHandles->selHndAcceptor, A[i1],i2,False ); break; case 'H' : MMDB->SelectAtom ( selHandles->selHndHydrogen, A[i1],i2,False ); break; default : case 'N' : ; } } } } rc = SBASE_Ok; for (i=0;inBonds;i++) { i1 = anmatch[SBS->Bond[i]->atom1-1]; i2 = anmatch[SBS->Bond[i]->atom2-1]; if ((i1>=0) && (i2>=0)) { A[i1]->AddBond ( A[i2],SBS->Bond[i]->order,2 ); A[i2]->AddBond ( A[i1],SBS->Bond[i]->order,2 ); } else rc = SBASE_BrokenBonds; } FreeVectorMemory ( anmatch,0 ); delete SBS; return rc; } int CSBase0::GetEnergyTypes ( PCResidue R, PCFile structFile ) { PCSBStructure SBS; PPCAtom A; int i,j,rc,natoms; R->GetAtomTable ( A,natoms ); if (!A) return SBASE_EmptyResidue; for (i=0;ienergyType[0] = char(0); SBS = GetStructure ( R->GetResName(),structFile ); if (SBS) { if (SBS->nAtoms>0) { for (i=0;inAtoms;j++) if (SBS->Atom[j]) { if (!strcmp(A[i]->name,SBS->Atom[j]->pdb_name)) { strcpy ( A[i]->energyType,SBS->Atom[j]->energyType ); A[i]->charge = SBS->Atom[j]->ccp4_charge; } } } rc = SBASE_Ok; } else rc = SBASE_NoAtomsFound; delete SBS; } else rc = SBASE_StructNotFound; return rc; } int CSBase0::GetEnergyTypes ( PPCResidue R, int nRes, PCFile structFile ) { PCFile sFile; PCSBStructure SBS; PPCAtom A; bvector B; int i,j,k,n,natoms; GetVectorMemory ( B,nRes,0 ); for (i=0;iGetResName(),sFile ); j = i; while (jGetAtomTable ( A,natoms ); if (A) { for (k=0;kenergyType[0] = char(0); if (SBS) { if (SBS->nAtoms>0) { for (k=0;knAtoms;n++) if (SBS->Atom[n]) { if (!strcmp(A[k]->name,SBS->Atom[n]->pdb_name)) { strcpy ( A[k]->energyType, SBS->Atom[n]->energyType ); A[k]->charge = SBS->Atom[n]->ccp4_charge; } } } } } } j++; while (jname,R[j]->name)) break; else j++; } else j++; } if (SBS) { delete SBS; SBS = NULL; } i++; } } if (!structFile) delete sFile; FreeVectorMemory ( B,0 ); return SBASE_Ok; } int CSBase0::GetEnergyTypes ( PCChain chain, PCFile structFile ) { PPCResidue Res; int nRes; chain->GetResidueTable ( Res,nRes ); if (nRes>0) return GetEnergyTypes ( Res,nRes,structFile ); else return SBASE_EmptyResSet; } int CSBase0::GetEnergyTypes ( PCModel model, PCFile structFile ) { PPCResidue Res; PPCChain chain; PCMMDBManager MMDB; int rc,selHnd,i,nRes,nChains; rc = SBASE_Ok; MMDB = PCMMDBManager(model->GetCoordHierarchy()); if (MMDB) { selHnd = MMDB->NewSelection(); MMDB->Select ( selHnd,STYPE_RESIDUE,model->GetSerNum(), "*",ANY_RES,"*",ANY_RES,"*", "*","*","*","*",SKEY_NEW ); MMDB->GetSelIndex ( selHnd,Res,nRes ); if (nRes>0) rc = GetEnergyTypes ( Res,nRes,structFile ); else rc = SBASE_EmptyResSet; MMDB->DeleteSelection ( selHnd ); } else { model->GetChainTable ( chain,nChains ); for (i=0;iGetResidueTable ( Res,nRes ); if (nRes>0) GetEnergyTypes ( Res,nRes,structFile ); } } return rc; } int CSBase0::GetEnergyTypes ( PCMMDBManager MMDB, PCFile structFile ) { PPCResidue Res; int rc,selHnd,nRes; rc = SBASE_Ok; selHnd = MMDB->NewSelection(); MMDB->Select ( selHnd,STYPE_RESIDUE,0, "*",ANY_RES,"*",ANY_RES,"*", "*","*","*","*",SKEY_NEW ); MMDB->GetSelIndex ( selHnd,Res,nRes ); if (nRes>0) rc = GetEnergyTypes ( Res,nRes,structFile ); else rc = SBASE_EmptyResSet; MMDB->DeleteSelection ( selHnd ); return rc; } int CSBase0::AddHydrogens ( PCResidue R, PCFile structFile ) { // Return: // SBASE_Ok success // SBASE_EmptyResidue residue R does not contain atoms // SBASE_NoAtomsFound SBStructure does not contain atoms // SBASE_NoBonds SBStructure does not contain bonds // SBASE_NoAtomsData SBStructure is not complete // SBASE_NoSimilarity too few coomon atom names in R and SBase // entry with the same structure name // SBASE_SuperpositionFailed failed residue superposition // NOTE: the function does not rearranges existing atoms in the // residue, but places the hydrogens on top of them (leaving the // Ter pseudoatom, if found, on top of the list) PCFile sFile; PCSBStructure SBS; int rc; if (structFile) sFile = structFile; else sFile = GetStructFile(); if (!sFile) return SBASE_FileNotFound; SBS = GetStructure ( R->GetResName(),sFile ); if (!structFile) delete sFile; if (!SBS) return SBASE_StructNotFound; rc = SBS->AddHydrogens ( R ); delete SBS; return rc; } int CSBase0::AddHydrogens ( PCChain chain, PCFile structFile ) { PCFile sFile; PPCResidue Res; int i,k,nRes,rc; Boolean B; if (structFile) sFile = structFile; else sFile = GetStructFile(); if (!sFile) return SBASE_FileNotFound; rc = SBASE_Ok; B = False; chain->GetResidueTable ( Res,nRes ); for (i=0;iGetChainTable ( chain,nChains ); for (i=0;iGetResidueTable ( Res,nRes ); for (j=0;jGetModelTable ( model,nModels ); for (i=0;iGetChainTable ( chain,nChains ); for (j=0;jGetResidueTable ( Res,nRes ); for (n=0;nGetResName(),sFile ); if (!structFile) delete sFile; if (!SBS) return SBASE_StructNotFound; /* --- temporary commented because of incompleteness of data in SBase files if (SBS->CheckAtoms()<0) { delete SBS; return SBASE_NoAtomData; } ---------- */ rc = SBASE_Ok; SBS->GetAtomTable ( A1,natoms1 ); if (!A1) { delete SBS; return SBASE_NoAtomsFound; } /* --- temporary fix, simply neglect atoms that do not have coordinates. This code should be removed and the code above uncommented ----------- */ j = 0; for (i=0;ix==-MaxReal) delete A1[i]; else { if (jGetAtomTable ( A2,natoms2 ); if (!A2) { delete SBS; return SBASE_EmptyResidue; } GetVectorMemory ( c,natoms1,0 ); GetVectorMemory ( x,natoms2,0 ); for (j=0;jisTer()) && (!strcmp(A1[i]->GetAtomName(),A2[j]->GetAtomName()))) { if (c[i]<0) { c[i] = j; k++; } x[j] = i; } } } if (k>2) { // the rotational-translational matrix T such that |T*A1 - A2| is // as A1[i] <-> A2[C[i]] only for those i that C[i]>=0 . // The default k = SuperposeAtoms ( T,A1,natoms1,A2,c ); if (k!=SPOSEAT_Ok) rc = SBASE_SuperpositionFailed; else { complH = ((complFlag & CMPLF_Hydrogens)!=0); complNH = ((complFlag & CMPLF_nonHs)!=0); complXT = ((complFlag & CMPLF_XT)!=0); strcpy ( Hydrogen,ElementName[0] ); CutSpaces ( Hydrogen,SCUTKEY_BEGEND ); A3 = new PCAtom[natoms1+natoms2+1]; k = 0; for (i=0;i=0) { A3[k] = A1[i]; A3[k]->Copy ( A2[c[i]] ); A1[i] = NULL; k++; // check for altlocs for (j=c[i]+1;jCopy ( A2[j] ); k++; } } else { A3[k] = NULL; aname = A1[i]->GetAtomName(); if (strcmp(A1[i]->GetElementName(),Hydrogen)) { // a non-hydrogen atom, check if it should be added if (complNH && (complXT || (strcmp(aname," OXT")))) A3[k] = A1[i]; } else if (complH) { // a hydrogen and hydrogens are to be added if (complXT) A3[k] = A1[i]; // add unconditionally else if (!strcmp(aname," HXT")) { // add HXT only if OXT is present in the residue for (j=0;(jisTer()) && (!strcmp(A2[j]->GetAtomName()," OXT"))) A3[k] = A1[i]; } } else // add non-HXT anyway A3[k] = A1[i]; } if (A3[k]) { A3[k]->Transform ( T ); A1[i] = NULL; k++; } } // add all atoms of original residue which were not superposed; // these include Ter, if any is present for (j=0;jCopy ( A2[j] ); k++; } R->DeleteAllAtoms(); for (i=0;iAddAtom ( A3[i] ); delete[] A3; } } else rc = SBASE_NoSimilarity; FreeVectorMemory ( x,0 ); FreeVectorMemory ( c,0 ); for (i=0;iGetResidueTable ( Res,nRes ); for (i=0;iGetChainTable ( chain,nChains ); for (i=0;iGetResidueTable ( Res,nRes ); for (j=0;jGetModelTable ( model,nModels ); for (i=0;iGetChainTable ( chain,nChains ); for (j=0;jGetResidueTable ( Res,nRes ); for (n=0;n=nStructures)) return SBASE_WrongIndex; if (Index[structNo]->loadPos>=0) { rc = GetAtNames ( NULL,structNo,AtName,nAtoms,nH ); } else { structFile = GetStructFile(); if (structFile) { rc = GetAtNames ( structFile,structNo,AtName,nAtoms,nH ); structFile->shut(); delete structFile; } else return SBASE_FileNotFound; } return rc; } int CSBase0::GetAtNames ( PCFile structFile, int structNo, PAtomName AtName, int & nAtoms, int & nH ) { PCSBStructure SBS; PCSBAtom atom; int i,j; pstr p1,p2; Boolean removeHydrogens; if ((structNo<0) || (structNo>=nStructures)) return SBASE_WrongIndex; removeHydrogens = (nH==-1); if (Index[structNo]->loadPos>=0) { SBS = ldStructure[Index[structNo]->loadPos]; } else { structFile->seek ( Index[structNo]->fStructPos ); SBS = NULL; StreamRead ( *structFile,SBS ); if ((!SBS) || (!structFile->Success())) { if (SBS) delete SBS; return SBASE_ReadError; } } nAtoms = Index[structNo]->nAtoms; nH = 0; if (Index[structNo]->Comp1) { p1 = strstr ( Index[structNo]->Comp1,"H(" ); if (p1) { p1 += 2; p2 = p1; while ((*p2) && (*p2!=')')) p2++; if (*p2==')') { *p2 = char(0); nH = mround(strtod(p1,NULL)); *p2 = ')'; } } } if (removeHydrogens) { j = 0; for (i=0;iAtom[i]; if (atom) { if ((atom->element[0]!='H') || (atom->element[1])) strcpy ( AtName[j++],atom->pdb_name ); } } } else { for (i=0;iAtom[i]; if (atom) strcpy ( AtName[i],atom->pdb_name ); } } if (Index[structNo]->loadPos<0) delete SBS; return SBASE_Ok; } int FindName ( PAtomName Nams, pstr N, int len ) { int i; AtomName Nam; i = 0; while (i=len) i = -1; return i; } int CSBase0::GetNofAtoms ( int structNo, int & nNonHAtoms, int & nHAtoms ) { pstr p1,p2; nNonHAtoms = 0; nHAtoms = 0; if ((structNo<0) || (structNo>=nStructures)) return SBASE_WrongIndex; nNonHAtoms = Index[structNo]->nAtoms; nHAtoms = 0; if (Index[structNo]->Comp1) { p1 = strstr ( Index[structNo]->Comp1,"H(" ); if (p1) { p1 += 2; p2 = p1; while ((*p2) && (*p2!=')')) p2++; if (*p2==')') { *p2 = char(0); nHAtoms = mround(strtod(p1,NULL)); *p2 = ')'; } } } nNonHAtoms -= nHAtoms; return SBASE_Ok; } int CSBase0::GetAtoms ( cpstr name, int & nNonHAtoms, PAtomName NonHAtName, int & nHAtoms, PAtomName HAtName, ivector Hconnect, ivector Elem, ivector Chiral ) { PCSBStructure SBS; PCSBAtom atom,atom2; PCSBBond bond; int i,j,structNo,rc; PCFile structFile; nNonHAtoms = 0; nHAtoms = 0; structNo = GetStructNo ( name ); if (structNo<0) return SBASE_StructNotFound; if (Index[structNo]->loadPos>=0) { SBS = ldStructure[Index[structNo]->loadPos]; } else { structFile = GetStructFile(); if (!structFile) return SBASE_FileNotFound; SBS = NULL; structFile->seek ( Index[structNo]->fStructPos ); StreamRead ( *structFile,SBS ); structFile->shut (); if ((!SBS) || (!structFile->Success())) { if (SBS) delete SBS; delete structFile; return SBASE_ReadError; } delete structFile; } rc = SBASE_Ok; for (i=0;inAtoms;i++) { atom = SBS->Atom[i]; if (atom) { Elem[i] = getElementNo ( atom->element ); if ((atom->element[0]==' ') && (atom->element[1]=='H') && (!atom->element[2])) { strcpy ( HAtName[nHAtoms],atom->pdb_name ); nHAtoms++; } else { strcpy ( NonHAtName[nNonHAtoms],atom->pdb_name ); nNonHAtoms++; } Chiral[i] = MakeChirInd ( atom->chirality ); } } if (nHAtoms>0) { for (j=0;jnBonds;i++) { bond = SBS->Bond[i]; if (bond) { atom = SBS->Atom[bond->atom1-1]; atom2 = SBS->Atom[bond->atom2-1]; if (atom && atom2) { j = FindName ( HAtName,atom->pdb_name,nHAtoms ); if (j>=0) Hconnect[j] = FindName ( NonHAtName,atom2->pdb_name, nNonHAtoms ); else { j = FindName ( HAtName,atom2->pdb_name,nHAtoms ); if (j>=0) Hconnect[j] = FindName ( NonHAtName,atom->pdb_name, nNonHAtoms ); } } } } j = 0; while ((j=0)) j++; if (jloadPos<0) delete SBS; return rc; } int CSBase0::GetBonds ( cpstr name, ivector nBonds, imatrix bondPair, int & nAtoms, int maxNAtoms, int maxNBonds ) { PCGraph G; PCEdge edge; PCFile graphFile; int structNo,i, a1,a2; for (i=0;inAtoms; if (nAtoms<=0) return SBASE_Ok; if (Index[structNo]->loadPos>=0) { G = ldGraph[Index[structNo]->loadPos]; } else { graphFile = GetGraphFile(); if (!graphFile) return SBASE_FileNotFound; G = NULL; graphFile->seek ( Index[structNo]->fGraphPos ); StreamRead ( *graphFile,G ); graphFile->shut (); if ((!G) || (!graphFile->Success())) { if (G) delete G; delete graphFile; return SBASE_ReadError; } delete graphFile; } for (i=0;inEdges;i++) { edge = G->Edge[i]; if (edge) { if (edge->v1v2) { a1 = edge->v1; a2 = edge->v2; } else { a1 = edge->v2; a2 = edge->v1; } a1--; a2--; if (nBonds[a1]loadPos<0) delete G; return SBASE_Ok; } int CSBase0::GetHetInfo ( cpstr name, pstr Formula, pstr Hname, pstr Hsynonym, pstr Hcharge, PAtomName & ClinkAtom, PElement & ClinkEle, PAtomName & SlinkAtom, PElement & SlinkEle, int & nLeavingAtoms ) { PCSBStructure SBS; PCFile structFile; int i,structNo; Formula [0] = char(0); Hname [0] = char(0); Hsynonym[0] = char(0); Hcharge [0] = char(0); ClinkAtom = NULL; ClinkEle = NULL; SlinkAtom = NULL; SlinkEle = NULL; nLeavingAtoms = 0; structNo = GetStructNo ( name ); if (structNo<0) return SBASE_StructNotFound; structFile = GetStructFile(); if (!structFile) return SBASE_FileNotFound; SBS = NULL; structFile->seek ( Index[structNo]->fStructPos ); StreamRead ( *structFile,SBS ); structFile->shut (); if ((!SBS) || (!structFile->Success())) { if (SBS) delete SBS; delete structFile; return SBASE_ReadError; } delete structFile; if (SBS->Formula) strcpy ( Formula ,SBS->Formula ); if (SBS->Synonym) strcpy ( Hsynonym,SBS->Synonym ); if (SBS->Name) strcpy ( Hname ,SBS->Name ); if (SBS->Charge) strcpy ( Hcharge ,SBS->Charge ); nLeavingAtoms = SBS->nLeavingAtoms; if (nLeavingAtoms>0) { SlinkAtom = new AtomName[nLeavingAtoms]; SlinkEle = new Element [nLeavingAtoms]; ClinkAtom = new AtomName[nLeavingAtoms]; ClinkEle = new Element [nLeavingAtoms]; for (i=0;iAtom[SBS->leavingAtom[i]-1]->pdb_name); strcpy (SlinkEle [i],SBS->Atom[SBS->leavingAtom[i]-1]->element ); if (SBS->bondedAtom[i]>0) { strcpy(ClinkAtom[i],SBS->Atom[SBS->bondedAtom[i]-1]->pdb_name); strcpy(ClinkEle [i],SBS->Atom[SBS->bondedAtom[i]-1]->element ); } else { ClinkAtom[i][0] = char(0); ClinkEle [i][0] = char(0); } } } delete SBS; return SBASE_Ok; } mmdb-1.23.2.1/src/mmdb_graph.h0000644000175100017510000003350511475666363012667 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_graph // ~~~~~~~~~ // **** Classes : CVertex ( graph vertex ) // ~~~~~~~~~ CEdge ( graph edge ) // CGraph ( structural graph ) // CMatch ( match of structural graphs ) // CGraphMatch ( CSIA algorithms for graphs matching ) // // (C) E. Krissinel 2000-2008 // // When used, please cite: // // Krissinel, E. and Henrick, K. (2004) // Common subgraph isomorphism detection by backtracking search. // Software - Practice and Experience, 34, 591-607. // // ================================================================= // #ifndef __MMDB_Graph__ #define __MMDB_Graph__ #ifndef __TIME_H #include #endif #ifndef __MMDB_Atom__ #include "mmdb_atom.h" #endif // ========================== CVertex ============================ DefineClass(CVertex) #define CHIRAL_RIGHT 0x10000000 #define CHIRAL_LEFT 0x20000000 #define ATOM_LEAVING 0x40000000 #define HYDROGEN_BOND 0x0F000000 #define SYMREL_MASK 0x00FF0000 #define CHIRAL_MASK 0xCFFFFFFF #define TYPE_MASK 0x00FFFFFF class CVertex : public CStream { friend class CGraph; friend class CGraphMatch; friend class CSBase0; public: CVertex (); CVertex ( RPCStream Object ); CVertex ( int vtype, cpstr vname ); CVertex ( int vtype ); CVertex ( cpstr chem_elem ); CVertex ( cpstr chem_elem, cpstr name ); ~CVertex(); void SetVertex ( cpstr chem_elem ); void SetVertex ( int vtype, cpstr vname ); void SetVertex ( int vtype ); void SetType ( int vtype ); void SetTypeExt ( int typeExt ); void RemoveChirality(); void LeaveChirality ( int eltype ); void SetName ( cpstr vname ); void SetProperty ( int vprop ); void SetID ( int vid ); void AddBond (); void CopyNBonds ( PCVertex V ); int GetProperty () { return property; } int GetID () { return id; } int GetUserID () { return user_id; } pstr GetName () { return name; } int GetType () { return type; } int GetNBonds (); void SaveType (); // in userid void RestoreType (); // from userid void CopyType ( PCVertex V ); virtual void Print ( int PKey ); virtual void Copy ( PCVertex V ); void read ( RCFile f ); void write ( RCFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected: pstr name; // name may be general, "C", "Hg", "Cl" etc. int type; // type of vertex, see comments in mmdb_graph.cpp int type_ext; // vertex type extention int property; // flagwise properties -- user-defined int id; // a graph-defined vertex id int user_id; // a user-defined vertex id void InitVertex(); }; DefineStreamFunctions(CVertex) // =========================== CEdge ============================= #define BOND_SINGLE 1 #define BOND_DOUBLE 2 #define BOND_AROMATIC 3 #define BOND_TRIPLE 4 DefineClass(CEdge) class CEdge : public CStream { friend class CGraph; friend class CGMatch; friend class CSBase0; public: CEdge (); CEdge ( RPCStream Object ); CEdge ( int vx1, int vx2, int btype ); // vx1,vx2 are numbered // as 1,2,3 on and refer // to vertices in the order // as they were added to // the graph; btype>0 ~CEdge(); void SetEdge ( int vx1, int vx2, cpstr btype ); void SetEdge ( int vx1, int vx2, int btype ); // btype>0 void SetType ( int btype ); void SetProperty ( int eprop ); void SaveType (); // in property void RestoreType (); // from property int GetVertex1 () { return v1-1; } int GetVertex2 () { return v2-1; } int GetType () { return type; } int GetProperty () { return property; } virtual void Print ( int PKey ); virtual void Copy ( PCEdge G ); void read ( RCFile f ); void write ( RCFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected: int v1,v2; // >=1 int type; int property; void InitEdge(); }; DefineStreamFunctions(CEdge) // ========================== CGraph ============================ #define MKGRAPH_Ok 0 #define MKGRAPH_NoAtoms -1 #define MKGRAPH_ChangedAltLoc 1 #define MKGRAPH_MaxOccupancy 2 DefineClass(CGraph) class CGraph : public CStream { friend class CGraphMatch; friend class CSBase0; public : CGraph (); CGraph ( PCResidue R, cpstr altLoc=NULL ); CGraph ( RPCStream Object ); ~CGraph(); void Reset (); void SetName ( cpstr gname ); pstr GetName () { return name; } // AddVertex(..) and AddEdge(..) do not copy the objects, but // take them over. This means that application should forget // about pointers to V and G once they were given to CGraph. // Vertices and edges must be allocated newly prior each call // to AddVertex(..) and AddEdge(..). void AddVertex ( PCVertex V ); void AddEdge ( PCEdge G ); void SetVertices ( PPCVertex V, int vlen ); void SetEdges ( PPCEdge G, int glen ); void RemoveChirality(); void LeaveChirality ( int eltype ); // MakeGraph(..) makes a graph corresponding to residue R. // The graphs vertices then correspond to the residue's atoms // (CVertex::userid points to atom R->atom[CVertex::userid]), // edges are calculated as chemical bonds between atoms basing // on the table of cut-off distances. // altCode specifies a particular conformation that should be // used for making the graph. If it is set to "" or NULL ("empty" // altcode) but the residue does not have conformation which // contains *only* ""-altcode atoms, a conformation corresponding // to maximal occupancy will be used. The same will happen if // altcode information in residue is not correct, whatever altCode // is specified. // After making the graph, Build(..) should be called as usual // before graph matching. // Non-negative return means that graph has been made. // MakeGraph(..) may return: // MKGRAPH_Ok everything is Ok // MKGRAPH_NoAtoms residue does not have atoms, graph // is not made // MKGRAPH_ChangedAltLoc a different altcode was used because // the residue has only one altcode and // that is different of // MKGRAPH_MaxOccupancy a maximal-occupancy conformation has // been chosen because of default // ""-altcode supplied or incorrect // altcode information in the residue int MakeGraph ( PCResidue R, cpstr altLoc=NULL ); int MakeGraph ( PPCAtom atom, int nAtoms ); void HideType ( int bond_vx_type ); void ExcludeType ( int type ); void MakeSymmetryRelief ( Boolean noCO2 ); void IdentifyRings (); int Build ( Boolean bondOrder ); // returns 0 if Ok void MakeVertexIDs (); // simply numbers vertices as 1.. on int GetVertexID ( int vertexNo ); int GetVertexNo ( cpstr vname ); // GetBondedVertexID(..) works after MoveType(..) int GetNBondedVertices ( int vertexNo ); int GetBondedVertexID ( int vertexNo, int bond_vx_type, int bondNo ); PCVertex GetVertex ( int vertexNo ); // 1<=vertexNo<=nVertices int GetNofVertices () { return nVertices; } PCEdge GetEdge ( int edgeNo ); // 1<=edgeNo<=nEdges int GetNofEdges () { return nEdges; } void GetVertices ( PPCVertex & V, int & nV ); void GetEdges ( PPCEdge & E, int & nE ); virtual void Print(); void Print1(); virtual void Copy ( PCGraph G ); void read ( RCFile f ); void write ( RCFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected : pstr name; int nVertices,nEdges, nAllVertices,nAllEdges; PPCVertex Vertex; PPCEdge Edge; imatrix graph; void InitGraph (); void FreeMemory(); private : int nVAlloc,nEAlloc,nGAlloc; }; DefineStreamFunctions(CGraph) // ========================== CMatch ============================ DefineClass(CMatch) DefineStreamFunctions(CMatch) class CMatch : public CStream { friend class CGraphMatch; public : CMatch (); CMatch ( RPCStream Object ); CMatch ( ivector FV1, ivector FV2, int nv, int n, int m ); ~CMatch(); // FV1[] and FV2[] are copied into internal buffers void SetMatch ( ivector FV1, ivector FV2, int nv, int n, int m ); Boolean isMatch ( ivector FV1, ivector FV2, int nv ); Boolean isCombination ( ivector FV1, ivector FV2, int nv ); // do not allocate or dispose FV1 and FV2 in application! void GetMatch ( ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ); void read ( RCFile f ); void write ( RCFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected : int n1,n2,mlength; ivector F1,F2; void InitMatch(); private : int nAlloc; }; // ======================= CGraphMatch ========================= #define _UseRecursion #define GMF_UniqueMatch 0x00000001 #define GMF_NoCombinations 0x00000002 #define EXTTYPE_Ignore 0 #define EXTTYPE_Equal 1 #define EXTTYPE_AND 2 #define EXTTYPE_OR 3 #define EXTTYPE_XOR 4 #define EXTTYPE_NotEqual 5 #define EXTTYPE_NotAND 6 #define EXTTYPE_NotOR 7 DefineClass(CGraphMatch) class CGraphMatch : public CStream { public : CGraphMatch (); CGraphMatch ( RPCStream Object ); ~CGraphMatch(); void SetFlag ( word flag ); void RemoveFlag ( word flag ); void SetMaxNofMatches ( int maxNofMatches, Boolean stopOnMaxN ); void SetTimeLimit ( int maxTimeToRun=0 ); Boolean GetStopSignal () { return Stop; } void Reset(); // MatchGraphs looks for maximal common subgraphs of size // not less than minMatch. The number of found subgraphs // is returned by GetNofMatches(), the subgraph vertices // are returned by GetMatch(..). Control parameters: // vertexType True if vertex type should be taken // into account and False otherwise // vertexExt key to use extended vertex types (defined // as type_ext in CVertex). void MatchGraphs ( PCGraph Gh1, PCGraph Gh2, int minMatch, Boolean vertexType=True, int vertexExt=EXTTYPE_Ignore ); void PrintMatches (); int GetNofMatches () { return nMatches; } int GetMaxMatchSize() { return maxMatch; } // do not allocate or dispose FV1 and FV2 in application! // FV1/p1 will always correspond to Gh1, and FV2/p2 - // to Gh2 as specified in MatchGraphs(..) void GetMatch ( int MatchNo, ivector & FV1, ivector & FV2, int & nv, realtype & p1, realtype & p2 ); void read ( RCFile f ); void write ( RCFile f ); void mem_read ( cpstr S, int & l ); void mem_write ( pstr S, int & l ); protected : PCGraph G1,G2; PPCVertex V1; PPCVertex V2; imatrix c1,c2; Boolean swap; #ifndef _UseRecursion ivector jj; #endif int n,m; imatrix3 P; imatrix iF1; ivector F1,F2,ix; int nMatches,maxNMatches; PPCMatch Match; Boolean wasFullMatch,Stop,stopOnMaxNMathches; word flags; int maxMatch,timeLimit; void InitGraphMatch(); void FreeMemory (); void FreeRecHeap (); void GetMemory (); void GetRecHeap (); int Initialize ( Boolean vertexType, int vertexExt ); #ifdef _UseRecursion void Backtrack ( int i ); // exact matching #else void Ullman (); #endif void Backtrack1 ( int i, int k0 ); // exact/partial matching void CollectMatch ( int nm ); private : int nAlloc,mAlloc,nMAlloc; time_t startTime; }; DefineStreamFunctions(CGraphMatch) extern void SetGraphAllocPortion ( int alloc_portion ); /* extern void TestGraphMatch(); */ #endif mmdb-1.23.2.1/src/Makefile.am0000644000175100017510000000270611476200303012424 00000000000000 AUTOMAKE_OPTIONS = foreign lib_LTLIBRARIES = libmmdb.la # Use library_includedir with library_include_HEADERS to put the headers in the # directory $(library_includedir) [Not well documented]. library_includedir=$(includedir)/mmdb library_include_HEADERS = \ bfgs_min.h mmdb_atom.h mmdb_ficif.h mmdb_rwbrook.h mmdb_uddata.h \ file_.h mmdb_bondmngr.h mmdb_file.h mmdb_sbase0.h mmdb_utils.h \ linalg_.h mmdb_chain.h mmdb_graph.h mmdb_sbase.h mmdb_xml.h \ machine_.h mmdb_cifdefs.h mmdb_manager.h mmdb_selmngr.h random_n.h \ math_.h mmdb_coormngr.h mmdb_mask.h mmdb_symop.h stream_.h \ mattype_.h mmdb_cryst.h mmdb_mmcif.h mmdb_tables.h \ mmdb_align.h mmdb_defs.h mmdb_model.h mmdb_title.h hybrid_36.h libmmdb_la_CPPFLAGS = -Wall libmmdb_la_LDFLAGS = -version-info @MMDB_LT_VERSION@ libmmdb_la_SOURCES = \ bfgs_min.cpp mmdb_bondmngr.cpp mmdb_manager.cpp mmdb_symop.cpp \ file_.cpp mmdb_chain.cpp mmdb_mask.cpp mmdb_tables.cpp \ linalg_.cpp mmdb_cifdefs.cpp mmdb_mmcif.cpp mmdb_title.cpp \ machine_.cpp mmdb_coormngr.cpp mmdb_model.cpp mmdb_uddata.cpp \ math_.cpp mmdb_cryst.cpp mmdb_rwbrook.cpp mmdb_utils.cpp \ mattype_.cpp mmdb_ficif.cpp mmdb_sbase0.cpp mmdb_xml.cpp \ mmdb_align.cpp mmdb_file.cpp mmdb_sbase.cpp random_n.cpp \ mmdb_atom.cpp mmdb_graph.cpp mmdb_selmngr.cpp stream_.cpp \ hybrid_36.cpp mmdb-1.23.2.1/src/mmdb_tables.cpp0000644000175100017510000005443211475665502013367 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Tables // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Functions : // ~~~~~~~~~~~ // // **** Constants : AName ( array of 2-character atom names ) // ~~~~~~~~~~~ HAName ( array of 2=character heteroatom names ) // RName ( 3-characters amino acid names ) // RName1 ( 1-characters amino acid names ) // // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __MMDB_Tables__ #include "mmdb_tables.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif // ================================================================= cpstr const ElementName[nElementNames] = { " H", "HE", "LI", "BE", " B", " C", " N", " O", " F", "NE", "NA", "MG", "AL", "SI", " P", " S", "CL", "AR", " K", "CA", "SC", "TI", " V", "CR", "MN", "FE", "CO", "NI", "CU", "ZN", "GA", "GE", "AS", "SE", "BR", "KR", "RB", "SR", " Y", "ZR", "NB", "MO", "TC", "RU", "RH", "PD", "AG", "CD", "IN", "SN", "SB", "TE", " I", "XE", "CS", "BA", "LA", "CE", "PR", "ND", "PM", "SM", "EU", "GD", "TB", "DY", "HO", "ER", "TM", "YB", "LU", "HF", "TA", " W", "RE", "OS", "IR", "PT", "AU", "HG", "TL", "PB", "BI", "PO", "AT", "RN", "FR", "RA", "AC", "TH", "PA", " U", "NP", "PU", "AM", "CM", "BK", "CF", "ES", "FM", "MD", "NO", "LR", "RF", "DB", "SG", "BH", "HS", "MT", "UN", "UU", "UB", "UQ", "UH", "UO", " D", "AN" }; realtype const MolecWeight[nElementNames] = { 1.0079, 4.0026, 6.9410, 9.0122, 10.811, 12.011, 14.007, 15.999, 18.998, 20.180, 22.990, 24.305, 26.982, 28.086, 30.974, 32.066, 35.453, 39.948, 39.098, 40.078, 44.956, 47.867, 50.942, 51.996, 54.938, 55.845, 58.993, 58.693, 63.546, 65.390, 69.723, 72.610, 74.922, 78.960, 79.904, 83.800, 85.468, 87.620, 88.906, 91.224, 92.906, 95.940, 97.907, 101.07, 102.91, 106.42, 107.87, 112.41, 114.82, 118.71, 121.76, 127.60, 126.90, 131.29, 132.91, 137.33, 138.91, 140.12, 140.91, 144.24, 144.91, 150.36, 151.96, 157.25, 158.93, 162.50, 164.93, 167.26, 168.93, 173.04, 174.97, 178.49, 180.95, 183.84, 186.21, 190.23, 192.22, 195.08, 196.97, 200.59, 204.38, 207.20, 208.98, 208.98, 209.99, 222.02, 232.02, 226.03, 227.03, 232.04, 231.04, 238.03, 237.05, 244.06, 243.06, 247.07, 247.07, 251.08, 252.08, 257.10, 258.10, 259.10, 262.11, 263.11, 262.11, 266.12, 264.12, 269.13, 268.14, 272.15, 272.15, 277.00, 289.00, 289.00, 293.00, 2.0200, 3.0300 }; realtype const CovalentRadius[nElementNames] = { 0.32, 0.93, 1.23, 0.90, 0.82, 0.77, 0.75, 0.73, 0.72, 0.71, 1.54, 1.36, 1.18, 1.11, 1.06, 1.02, 0.99, 0.98, 2.03, 1.91, 1.62, 1.45, 1.34, 1.18, 1.17, 1.17, 1.16, 1.15, 1.17, 1.25, 1.26, 1.22, 1.20, 1.16, 1.14, 1.12, 2.16, 1.91, 1.62, 1.45, 1.34, 1.30, 1.27, 1.25, 1.25, 1.28, 1.34, 1.48, 1.44, 1.41, 1.40, 1.36, 1.33, 1.31, 2.35, 1.98, 1.69, 1.44, 1.34, 1.30, 1.28, 1.26, 1.27, 1.30, 1.34, 1.49, 1.48, 1.47, 1.46, 1.46, 1.45, 1.43, 2.50, 2.40, 2.20, 1.65, 1.65, 1.64, 1.63, 1.62, 1.85, 1.61, 1.59, 1.59, 1.58, 1.57, 1.56, 1.74, 1.56, 1.65, 1.65, 1.42, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 1.65, 0.32, 0.10, /**/ 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.32, 0.32 }; realtype const VdWaalsRadius[nElementNames] = { 1.20, 1.40, 1.82, 1.78, 1.74, 1.70, 1.55, 1.52, 1.47, 1.54, // ^^^^ ^^^^ <- only a guess 2.27, 1.73, 1.80, 2.10, 1.80, 1.80, 1.75, 1.88, // ^^^^ 2.75, 2.65, // ^^^^ 2.55, 2.45, 2.35, 2.20, 1.73, 1.90, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.75, 1.63, 1.40, 1.39, // ^^^^ 1.87, 1.86, 1.85, 1.90, 1.85, 2.02, // ^^^^ 2.75, 2.65, //^^^^ ^^^^ 2.55, 2.45, 2.35, 2.20, 2.05, 1.90, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.75, 1.63, 1.72, 1.58, // ^^^^ 1.93, 2.17, 2.10, 2.06, 1.98, 2.16, // ^^^^ 2.75, 2.75, //^^^^ ^^^^ 2.75, 2.75, 2.75, 2.75, 2.75, 2.75, 2.75, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 2.75, 2.75, 2.75, 2.75, 2.75, 2.65, 2.55, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 2.45, 2.35, 2.25, 2.15, 2.05, 1.95, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.85, 1.75, 1.66, 1.55, // ^^^^ 1.96, 2.02, 2.00, 2.00, 2.00, 2.00, // ^^^^ ^^^^ ^^^^ ^^^^ 2.75, 2.75, //^^^^ ^^^^ 2.50, 2.25, 1.95, 1.86, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, 1.80, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ ^^^^ 1.80, 1.80, 1.80, // ^^^^ ^^^^ ^^^^ 1.30, 1.50 //^^^^ ^^^^ }; realtype const IonicRadius[nElementNames] = { 0.79, 0.49, 2.05, 1.40, 1.17, 0.91, 0.75, 0.65, 0.57, 0.51, 2.23, 1.72, 1.82, 1.46, 1.23, 1.09, 0.97, 0.88, 2.77, 2.23, 2.09, 2.00, 1.92, 1.85, 1.79, 1.72, 1.67, 1.62, 1.57, 1.53, 1.81, 1.52, 1.33, 1.22, 1.12, 1.03, 2.98, 2.45, 2.27, 2.16, 2.09, 2.01, 1.95, 1.89, 1.83, 1.79, 1.75, 1.71, 2.00, 1.72, 1.53, 1.42, 1.32, 1.24, 3.34, 2.78, 2.74, 2.16, 2.09, 2.02, 1.97, 1.92, 1.87, 1.83, 1.79, 1.76, 2.08, 1.81, 1.63, 1.53, 1.43, 1.34, 3.50, 3.00, 3.20, 2.70, 2.67, 2.64, 2.62, 2.59, 2.56, 2.54, 2.51, 2.49, 2.47, 2.45, 2.42, 2.40, 2.25, 3.16, 3.14, 3.11, 3.08, 3.05, 3.02, 2.99, 2.97, 2.95, 2.92, 2.90, 2.87, 2.85 }; cpstr const ElementMetal[nElementMetals] = { "LI", "BE", "NA", "MG", "AL", " K", "CA", "SC", "TI", " V", "MN", "FE", "CO", "NI", "CU", "ZN", "GA", "RB", "SR", " Y", "ZR", "NB", "MO", "TC", "RU", "RH", "PD", "AG", "CD", "IN", "SN", "SB", "CS", "BA", "LA", "CE", "PR", "ND", "PM", "SM", "EU", "GD", "TB", "DY", "HO", "ER", "TM", "YB", "LU", "HF", "TA", " W", "RE", "OS", "IR", "PT", "AU", "HG", "TL", "PB", "BI", "PO", "FR", "RA", "AC", "TH", "PA", " U", "NP", "PU", "AM", "CM", "BK", "CF", "ES", "FM", "MD", "NO", "LR", "RF", "DB", "SG", "BH", "HS", "MT", "UN", "UU", "UB", "UQ", "UH", "UO" }; cpstr const HydAtomName[nHydAtomNames] = { "0H", "1H", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "HH", "*H", "'H", """H" }; Boolean isMetal ( cpstr element ) { char name[3]; Boolean isThere; int i; if (!element[1]) { name[0] = ' '; name[1] = element[0]; } else strncpy ( name,element,2 ); name[2] = char(0); isThere = False; for (i=0;(i=nElementNames) return ELEMENT_UNKNOWN; return type+1; // so that hydrogen is 1 } realtype getMolecWeight ( cpstr element ) { int type=0; char El[3]; if ((!element[1]) || (element[1]==' ')) { El[0] = ' '; El[1] = element[0]; } else { El[0] = element[0]; El[1] = element[1]; } El[2] = char(0); UpperCase ( El ); while (type=nElementNames) return 1.0; return MolecWeight[type]; } realtype getCovalentRadius ( cpstr element ) { int type=0; char El[3]; if ((!element[1]) || (element[1]==' ')) { El[0] = ' '; El[1] = element[0]; } else { El[0] = element[0]; El[1] = element[1]; } El[2] = char(0); UpperCase ( El ); while (type=nElementNames) return 2.2*CovalentRadius[0]; return CovalentRadius[type]; } realtype getVdWaalsRadius ( cpstr element ) { int type=0; char El[3]; if ((!element[1]) || (element[1]==' ')) { El[0] = ' '; El[1] = element[0]; } else { El[0] = element[0]; El[1] = element[1]; } El[2] = char(0); UpperCase ( El ); while (type=nElementNames) return 1.8; return VdWaalsRadius[type]; } cpstr const ResidueName[nResNames] = { "ALA", "ARG", "ASN", "ASP", "CYS", "CYH", "GLN", "GLU", "GLY", "HIS", "ILE", "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", "HEM", "WAT", "SUL", "END", "DUM" }; int getResidueNo ( cpstr resName ) { int i,m; m = -1; for (i=0;(i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CUDData ( user-defined data ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __MMDB_UDData__ #include "mmdb_uddata.h" #endif // ======================== CUDRegister ========================== #define nUDRTypes 5 CUDRegister::CUDRegister() : CStream() { InitUDRegister(); } CUDRegister::CUDRegister ( RPCStream Object ) : CStream(Object) { InitUDRegister(); } CUDRegister::~CUDRegister() { FreeUDRegister(); } void CUDRegister::InitUDRegister() { int i; for (i=0;i=0) && (udr_type=0) && (udr_type=0) && (udr_type=0) && (udr_type0) { IUDRegister[j] = new pstr[nIUDR[j]]; for (i=0;i0) { RUDRegister[j] = new pstr[nRUDR[j]]; for (i=0;i0) { SUDRegister[j] = new pstr[nSUDR[j]]; for (i=0;i> 8); SUData[0][1] = byte((newN & 0x00FF0000) >> 16); SUData[0][0] = byte((newN & 0xFF000000) >> 24); } int CUDData::putUDData ( int UDDhandle, int iudd ) { ivector IUD; int i,l,udh; udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofIUData(); if (udh>l) { GetVectorMemory ( IUD,udh+1,0 ); IUD[0] = udh; for (i=1;i<=l;i++) IUD[i] = IUData[i]; for (i=l+1;il) { GetVectorMemory ( RUD,udh+1,0 ); RUD[0] = udh; for (i=1;i<=l;i++) RUD[i] = RUData[i]; for (i=l+1;il) { if (l>0) { GetVectorMemory ( SUD,udh+1,0 ); for (i=0;i<=l;i++) SUD[i] = SUData[i]; for (i=l+1;i<=udh;i++) SUD[i] = NULL; FreeVectorMemory ( SUData,0 ); SUData = SUD; } else { GetVectorMemory ( SUData,udh+1,0 ); SUData[0] = new char[4]; for (i=1;i<=udh;i++) SUData[i] = NULL; } setNofSUData ( udh ); } CreateCopy ( SUData[udh],sudd ); return UDDATA_Ok; } int CUDData::getUDData ( int UDDhandle, int & iudd ) { int l,udh; iudd = 0; udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofIUData(); if (udh>l) return UDDATA_NoData; iudd = IUData[udh]; if (iudd==MinInt4) return UDDATA_NoData; return UDDATA_Ok; } int CUDData::getUDData ( int UDDhandle, realtype & rudd ) { int l,udh; rudd = 0.0; udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofRUData(); if (udh>l) return UDDATA_NoData; rudd = RUData[udh]; if (rudd==-MaxReal) return UDDATA_NoData; return UDDATA_Ok; } int CUDData::getUDData ( int UDDhandle, pstr sudd, int maxLen ) { int l,udh; sudd[0] = char(0); udh = UDDhandle & UDRF_MASK; if (udh<1) return UDDATA_WrongHandle; l = getNofSUData(); if (udh>l) return UDDATA_NoData; if (!SUData[udh]) return UDDATA_NoData; strcpy_n0 ( sudd,SUData[udh],maxLen-1 ); return UDDATA_Ok; } pstr CUDData::getUDData ( int UDDhandle, int * retcode ) { int l,udh; udh = UDDhandle & UDRF_MASK; if (udh<1) { if (retcode) *retcode = UDDATA_WrongHandle; return NULL; } l = getNofSUData(); if (udh>l) { if (retcode) *retcode = UDDATA_NoData; return NULL; } if (!SUData[udh]) { if (retcode) *retcode = UDDATA_NoData; return NULL; } if (retcode) *retcode = UDDATA_Ok; return SUData[udh]; } int CUDData::getUDData ( int UDDhandle, pstr & sudd ) { int l,udh; udh = UDDhandle & UDRF_MASK; if (udh<1) { if (sudd) { delete[] sudd; sudd = NULL; } return UDDATA_WrongHandle; } l = getNofSUData(); if (udh>l) { if (sudd) { delete[] sudd; sudd = NULL; } return UDDATA_NoData; } if (!SUData[udh]) { if (sudd) { delete[] sudd; sudd = NULL; } return UDDATA_NoData; } CreateCopy ( sudd,SUData[udh] ); return UDDATA_Ok; } void CUDData::write ( RCFile f ) { int i,l; byte Version=1; f.WriteByte ( &Version ); CMask::write ( f ); if (IUData) l = IUData[0]; else l = -1; f.WriteVector ( IUData,l+1,0 ); if (RUData) l = mround(RUData[0]); else l = -1; f.WriteVector ( RUData,l+1,0 ); l = getNofSUData(); f.WriteInt ( &l ); for (i=1;i<=l;i++) f.CreateWrite ( SUData[i] ); } void CUDData::read ( RCFile f ) { int i,l; byte Version; f.ReadByte ( &Version ); FreeUDDMemory(); CMask::read ( f ); f.CreateReadVector ( IUData,0 ); f.CreateReadVector ( RUData,0 ); f.ReadInt ( &l ); if (l>0) { SUData = new pstr[l+1]; SUData[0] = new char[4]; setNofSUData ( l ); for (i=1;i<=l;i++) { SUData[i] = NULL; f.CreateRead ( SUData[i] ); } } } MakeStreamFunctions(CUDData) mmdb-1.23.2.1/src/mmdb_ficif.cpp0000644000175100017510000004510611475665502013173 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 24.04.03 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_FICIF // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_MMCIF__ #include "mmdb_mmcif.h" #endif #ifndef __MMDB_FICIF__ #include "mmdb_ficif.h" #endif // ================================================================== PCMMCIFData mmCIFData = NULL; FORTRAN_SUBR ( MMDB_FCIF_INIT, mmdb_fcif_init,(),(),() ) { InitMatType(); mmCIFData = NULL; } void MMDB_CCIF_Init() { InitMatType(); mmCIFData = NULL; } FORTRAN_SUBR ( MMDB_FCIF_QUIT, mmdb_fcif_quit,(),(),() ) { if (mmCIFData) delete mmCIFData; mmCIFData = NULL; } void MMDB_CCIF_Quit() { if (mmCIFData) delete mmCIFData; mmCIFData = NULL; } pstr makeString ( pstr S, int SLen, pstr FS, int FSLen ) { GetStrTer ( S,FS,FSLen,SLen,FSLen ); CutSpaces ( S,SCUTKEY_END ); return S; } FORTRAN_SUBR ( MMDB_FCIF_CREATE, mmdb_fcif_create, ( // lengths-at-end list fpstr DataName, // file name int DataName_len // fortran-hidden length of DataName ), ( // lengths-in-structure list fpstr DataName ), ( // lengths-follow list fpstr DataName, int DataName_len ) ) { char S[500]; if (mmCIFData) delete mmCIFData; mmCIFData = new CMMCIFData ( makeString(S,sizeof(S), FTN_STR(DataName),FTN_LEN(DataName)) ); } void MMDB_CCIF_Create ( pstr DataName ) { if (mmCIFData) delete mmCIFData; mmCIFData = new CMMCIFData ( DataName ); } FORTRAN_SUBR ( MMDB_FCIF_WRITE, mmdb_fcif_write, ( // lengths-at-end list fpstr FileName, // file name int * iRet, // return code int FileName_len // fortran-hidden length of FileName ), ( // lengths-in-structure list fpstr FileName, int *iRet ), ( // lengths-follow list fpstr FileName, int FileName_len, int * iRet ) ) { pstr S; if (!mmCIFData) *iRet = -1000; else { S = new char[FTN_LEN(FileName)+10]; if (mmCIFData->WriteMMCIFData(makeString(S,FTN_LEN(FileName)+5, FTN_STR(FileName),FTN_LEN(FileName)))) *iRet = 0; else *iRet = 1; delete[] S; } } int MMDB_CCIF_Write ( pstr FileName ) { if (!mmCIFData) return -1000; else if (mmCIFData->WriteMMCIFData(FileName)) return 0; else return 1; } FORTRAN_SUBR ( MMDB_FCIF_PUTDATE, mmdb_fcif_putdate, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutDate ( makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutDate ( pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutDate ( CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTDOT, mmdb_fcif_putdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutNoData ( CIF_NODATA_DOT, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutDot ( pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutNoData ( CIF_NODATA_DOT, CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTQUESTION, mmdb_fcif_putquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutNoData ( CIF_NODATA_QUESTION, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutQuestion ( pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutNoData ( CIF_NODATA_QUESTION, CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTSTRING, mmdb_fcif_putstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; pstr S; if (!mmCIFData) *iRet = -1000; else { S = new char[FTN_LEN(Data)+10]; *iRet = mmCIFData->PutString ( makeString(S,FTN_LEN(Data)+5, FTN_STR(Data),FTN_LEN(Data)), makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); delete[] S; } } int MMDB_CCIF_PutString ( pstr Data, pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutString ( Data,CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTREAL, mmdb_fcif_putreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutReal ( *V, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutReal ( realtype V, pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutReal ( V,CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTINTEGER, mmdb_fcif_putinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutInteger ( *I, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)) ); } int MMDB_CCIF_PutInteger ( int I, pstr CatName, pstr Tag ) { if (!mmCIFData) return -1000; else return mmCIFData->PutInteger ( I,CatName,Tag ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPDOT, mmdb_fcif_putloopdot, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopNoData ( CIF_NODATA_DOT, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopDot ( pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopNoData ( CIF_NODATA_DOT, CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPQUESTION, mmdb_fcif_putloopquestion, ( // lengths-at-end list fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopNoData ( CIF_NODATA_QUESTION, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopQuestion ( pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopNoData ( CIF_NODATA_QUESTION, CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPSTRING, mmdb_fcif_putloopstring, ( // lengths-at-end list fpstr Data, // data string to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int Data_len, // fortran-hidden length of Data int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list fpstr Data, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list fpstr Data, int Data_len, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; pstr S; if (!mmCIFData) *iRet = -1000; else { S = new char[FTN_LEN(Data)+10]; *iRet = mmCIFData->PutLoopString ( makeString(S,FTN_LEN(Data)+5, FTN_STR(Data),FTN_LEN(Data)), makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); delete[] S; } } int MMDB_CCIF_PutLoopString ( pstr Data, pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopString ( Data,CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPREAL, mmdb_fcif_putloopreal, ( // lengths-at-end list apireal * V, // real value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list apireal * V, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list apireal * V, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopReal ( *V, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopReal ( realtype V, pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopReal ( V,CatName,Tag,nrow ); } FORTRAN_SUBR ( MMDB_FCIF_PUTLOOPINTEGER, mmdb_fcif_putloopinteger, ( // lengths-at-end list int * I, // integer value to store fpstr CatName, // category name fpstr Tag, // tag int * nrow, // row number int * iRet, // return code int CatName_len, // fortran-hidden length of CatName int Tag_len // fortran-hidden length of Tag ), ( // lengths-in-structure list int * I, fpstr CatName, fpstr Tag, int * nrow, int * iRet ), ( // lengths-follow list int * I, fpstr CatName, int CatName_len, fpstr Tag, int Tag_len, int * nrow, int * iRet ) ) { char CN[200],TN[200]; if (!mmCIFData) *iRet = -1000; else *iRet = mmCIFData->PutLoopInteger ( *I, makeString(CN,sizeof(CN), FTN_STR(CatName),FTN_LEN(CatName)), makeString(TN,sizeof(TN), FTN_STR(Tag),FTN_LEN(Tag)),*nrow ); } int MMDB_CCIF_PutLoopInteger ( int I, pstr CatName, pstr Tag, int nrow ) { if (!mmCIFData) return -1000; else return mmCIFData->PutLoopInteger ( I,CatName,Tag,nrow ); } mmdb-1.23.2.1/src/math_.cpp0000644000175100017510000001062411475665501012200 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 10.04.03 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Math_ // ~~~~~~~~~ // **** Functions : GetTorsion // ~~~~~~~~~~~ GetAngle // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MATH_H #include #endif #ifndef __Math__ #include "math_.h" #endif // ------------------------------------------------------------------ realtype GetTorsion ( rvector U, rvector W, rvector V ) { // U W V // o<----o----->o----->o // realtype A[3],B[3],C[3],Wmag,S,T; A[0] = U[1]*W[2] - W[1]*U[2]; A[1] = U[2]*W[0] - W[2]*U[0]; A[2] = U[0]*W[1] - W[0]*U[1]; B[0] = V[1]*W[2] - W[1]*V[2]; B[1] = V[2]*W[0] - W[2]*V[0]; B[2] = V[0]*W[1] - W[0]*V[1]; C[0] = A[1]*B[2] - B[1]*A[2]; C[1] = A[2]*B[0] - B[2]*A[0]; C[2] = A[0]*B[1] - B[0]*A[1]; Wmag = sqrt(W[0]*W[0]+W[1]*W[1]+W[2]*W[2]); S = C[0]*W[0] + C[1]*W[1] + C[2]*W[2]; T = A[0]*B[0] + A[1]*B[1] + A[2]*B[2]; T *= Wmag; if ((S==0.0) && (T==0.0)) return NO_TORSION; else return atan2(S,T); } realtype GetAngle ( rvector v1, rvector v2 ) { realtype l1,l2; l1 = v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]; if (l1==0.0) l1 = 1.0; l2 = v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]; if (l2==0.0) l2 = 1.0; return acos((v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])/sqrt(l1*l2)); } #define nCombMax 500 realtype Combinations ( int n, int m ) { // 0<=n<=nCombMax, 0<=m<=n realtype P[nCombMax+1]; int i,j; if ((m<0) || (m>n)) return 0.0; if ((m==0) || (m==n)) return 1.0; if ((m==1) || (m==n-1)) return realtype(n); P[0] = 1.0; P[1] = 3.0; P[2] = 3.0; P[3] = 1.0; for (i=4;i<=n;i++) { P[i] = 1.0; for (j=i-1;j>0;j--) P[j] += P[j-1]; } return P[m]; } realtype log1mx ( realtype x ) { // Calculates precisely log(1-x) for x<1, including // very small x realtype z,z1,z2,n; if (x>=1.0-10.0*MachEps) z = -MaxReal; else if (fabs(x)>1.0e-8) z = log(1.0-x); else { z1 = x; z = 0.0; n = 1.0; do { z2 = z; z -= z1/n; z1 *= x; n += 1.0; } while (z!=z2); } return z; } realtype expc ( realtype x ) { // Calculates precisely 1 - exp(x) for any x including // very small values realtype z,z1,z2,n; if (x>LnMaxReal) z = -MaxReal; else if (x<-LnMaxReal) z = 1.0; else if (fabs(x)>1.0e-8) z = 1.0 - Exp(x); else { z1 = x; z = x; n = 1.0; do { z2 = z; n += 1.0; z1 *= x/n; z += z1; } while (z!=z2); z = -z; } return z; } realtype expc1mx ( realtype x, realtype y ) { // Calculates precisely 1-(1-x)**y including very small x and // very large y realtype z,z1,z2,n,s; // Calculate (1-x)**y as exp(y*log(1-x)). Get log(1-x) first: if (x>1.0e-8) z = log(1.0-x); else { z1 = x; z = 0.0; n = 1.0; do { z2 = z; z -= z1/n; z1 *= x; n += 1.0; } while (z!=z2); } // Now calculate 1 - exp(y*log(1-x)) : z *= y; if (fabs(z)>1.0e-8) s = 1.0 - exp(z); else { z1 = z; s = z; n = 1.0; do { z2 = s; n += 1.0; z1 *= z/n; s += z1; } while (s!=z2); s = -s; } return s; } mmdb-1.23.2.1/src/mmdb_rwbrook.h0000644000175100017510000020641511475666364013256 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 07.11.02 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_RWBrook // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB), "new rwbrook" // ~~~~~~~~~ // **** Functions : mmdb_f_init_ ( initializer ) // ~~~~~~~~~~~ mmdb_f_quit_ ( disposer ) // autoserials_ ( switch to the autoserials regime ) // setreadcoords_ ( switch for reading coordinates ) // simrwbrook_ ( simulates old RWBROOK printout ) // mmdb_f_openl_ ( associates a unit with a file ) // mmdb_f_open_ ( associates a unit with a file ) // mmdb_f_copy_ ( copies contents of units ) // mmdb_f_delete_ ( deletes part of a unit ) // mmdb_f_settype_ ( changes type of file and r/w mode ) // mmdb_f_setname_ ( changes file name ) // mmdb_f_write_ ( writes a data structure into file ) // mmdb_f_close_ ( closes and disposes a data str-re ) // mmdb_f_advance_ ( advances the internal pointer ) // mmdb_f_rewd_ ( sets internal pointer on the top ) // mmdb_f_bksp_ ( shifts int-l pointer 1 atom back ) // mmdb_f_atom_ ( reads/writes atom properties ) // mmdb_f_coord_ ( reads/writes atom coordinates ) // mmdb_f_setcell_ ( sets the crystal cell parameters ) // mmdb_f_wbspgrp_ ( sets the space group ) // mmdb_f_rbspgrp_ ( gets the space group ) // mmdb_f_wbcell_ ( sets the crystal cell parameters ) // mmdb_f_rbcell_ ( gets the crystal cell parameters ) // mmdb_f_rbcelln_ ( gets the crystal cell parameters ) // mmdb_f_rbrcel_ ( gets the recipricol cell ) // mmdb_f_rborf_ ( returns or fill transf. matrices ) // mmdb_f_orthmat_ ( calc. standard othogonalisations ) // mmdb_f_cvanisou_ ( converts between cryst-c units ) // mmdb_f_wremark_ ( writes a remark statement ) // mmdb_f_setter // mmdb_f_sethet // rberrstop_ ( error messenger ) // rbcheckerr_ ( a simple error messenger ) // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_RWBrook__ #define __MMDB_RWBrook__ #ifndef __MatType__ #include "mattype_.h" #endif #ifndef __Machine__ #include "machine_.h" #endif // ****** mmdb_rwbrook error codes #define RWBERR_Ok 0 #define RWBERR_NoChannel -1 #define RWBERR_NoFile -2 #define RWBERR_NoLogicalName -3 #define RWBERR_CantOpenFile -4 #define RWBERR_WrongInteger -5 #define RWBERR_WrongModelNo -6 #define RWBERR_DuplicatedModel -7 #define RWBERR_ForeignFile -8 #define RWBERR_WrongEdition -9 #define RWBERR_ATOM_Unrecognd -10 #define RWBERR_ATOM_AlreadySet -11 #define RWBERR_ATOM_NoResidue -12 #define RWBERR_ATOM_Unmatch -13 #define RWBERR_NoAdvance -14 #define RWBERR_EmptyPointer -15 #define RWBERR_NoMatrices -16 #define RWBERR_NoCoordinates -17 #define RWBERR_Disagreement -18 #define RWBERR_NoOrthCode -19 #define RWBERR_NoCheck -20 #define RWBERR_NoCellParams -21 #define RWBERR_NotACIFFile -22 #define RWBERR_NoData -23 #define RWBERR_UnrecognCIFItems -24 #define RWBERR_MissingCIFField -25 #define RWBERR_EmptyCIFLoop -26 #define RWBERR_UnexpEndOfCIF -27 #define RWBERR_MissgCIFLoopField -28 #define RWBERR_NotACIFStructure -29 #define RWBERR_NotACIFLoop -30 #define RWBERR_WrongReal -31 #define RWBERR_WrongChainID -32 #define RWBERR_WrongEntryID -33 #define RWBERR_SEQRES_serNum -34 #define RWBERR_SEQRES_numRes -35 #define RWBERR_SEQRES_exraRes -36 #define RWBERR_NCSM_Unrecogn -37 #define RWBERR_NCSM_AlreadySet -38 #define RWBERR_NCSM_WrongSerial -39 #define RWBERR_NCSM_UnmatchIG -40 #define RWBERR_NoModel -41 #define RWBERR_NoSheetID -42 #define RWBERR_WrongSheetID -43 #define RWBERR_WrongStrandNo -44 #define RWBERR_WrongNofStrands -45 #define RWBERR_WrongSheetOrder -46 #define RWBERR_HBondInconsis -47 #define RWBERR_EmptyResidueName -48 #define RWBERR_DuplicateSeqNum -49 #define RWBERR_GeneralError1 -50 #define RWBERR_Error1 -101 #define RWBERR_Error2 -102 #define RWBERR_Error3 -103 // ***** mmdb_rwbrook warning flags // 0x00004000 means "it's a warning" #define RWBWAR_Warning 0x00004000 #define RWBWAR_RewOutput 0x00004010 #define RWBWAR_FileTop 0x00004020 #define RWBWAR_WrongSerial 0x00004040 #define RWBWAR_UnkFormFactor 0x00004080 #define RWBWAR_AmbFormFactor 0x00004100 #define RWBWAR_NoOccupancy 0x00004200 #define RWBWAR_NoTempFactor 0x00004400 // ------------------------------------------------------------------ // mmdb_f_init_() makes a general initialization of the file system. // It must be called ONLY ONCE from the top of an application. // FORTRAN equivalent: subroutine MMDB_F_Init // ~~~~~~~~~~~~~~~~~~~ FORTRAN_SUBR ( MMDB_F_INIT, mmdb_f_init, (),(),() ); // ------------------------------------------------------------------ // mmdb_f_quit_() disposes the file system. A correct use assumes that // it will be called before an application quits. // FORTRAN equivalent: subroutine MMDB_F_Quit // ~~~~~~~~~~~~~~~~~~~ FORTRAN_SUBR ( MMDB_F_QUIT, mmdb_f_quit, (),(),() ); // ------------------------------------------------------------------ // autoserials_(..) switches On/Off the regime of automatical // generation of atom serial numbers at reading from PDB ASCII file. // The autoserials regime is On if iOnOff parameter is set to // non-zero, and the regime is turned Off otherwise. The setting // will last until next call to autoserials_(..) // // When this regime is Off (default state), all atom serial // numbers are expected to be in strictly incremental order and // any deviation from this rule will cause end of reading and // MMDB_F_Open_(..) will issue the RWBERR_AlreadySet error code. If // this code is then passed to error messengers (rberrstop_(..) or // rbcheckerr_(..)) the application will stop. It is Ok, however, // for serial numbers to increment by 2 or more. // // When the autoserials regime is On, MMDB_F_Open_(..) does not pay // attention to the serial numbers and generates them for each // atom in strict incremental-by-one. This will work correctly only // if all atom records ("ATOM"/"HETATM", "SIGATM", "ANISOU" and // "SIGUIJ") are grouped, for every atom, as they should (precisely, // "ATOM" or "HETATM" opens the group, then "SIGATM", "ANISOU" and // "SIGUIJ" should follow until next "ATOM"/"HETATM" is met). // FORTRAN equivalent: subroutine AutoSerials ( iOnOff ) // ~~~~~~~~~~~~~~~~~~~ integer iOnOff FORTRAN_SUBR ( AUTOSERIALS,autoserials, ( int * iOnOff ), ( int * iOnOff ), ( int * iOnOff ) ); // ------------------------------------------------------------------ // setreadcoords_(..) switches On/Off the reading of atomic // coordinates when mmdb_f_open_ is called for input. The coordinates // will be read if iOnOff parameter is set to non-zero, otherwise // the reading will stop on the coordinate section of PDB file. // The setting will last until the next call to setreadcoords_(..). // // By default, the coordinates are read. // // FORTRAN equivalent: subroutine SetReadCoords ( iOnOff ) // ~~~~~~~~~~~~~~~~~~~ integer iOnOff FORTRAN_SUBR ( SETREADCOORDS,setreadcoords, ( int * iOnOff ), ( int * iOnOff ), ( int * iOnOff ) ); // ------------------------------------------------------------------ // simrwbrook_(..) switches On/Off the regime of exact following // the old fortran RWBROOK's way of issuing messages and warnings. // // By default, this regime is switched off, which supresses all // messages from mmdb_rwbrook unless directly ordered or catastrophic. // Switching this regime on will make the printout of converted // programs significantly closer to that resulting from the use of // old fortran RWBROOK package. The setting will last until the // next call to simrwbrook_(..). // // FORTRAN equivalent: subroutine SimRWBROOK ( iOnOff ) // ~~~~~~~~~~~~~~~~~~~ integer iOnOff FORTRAN_SUBR ( SIMRWBROOK,simrwbrook, ( int * iOnOff ), ( int * iOnOff ), ( int * iOnOff ) ); // ------------------------------------------------------------------ // mmdb_f_open_(..) associates a coordinate file with channel number // given in iUnit. If iUnit was previously associated with another // or the same file, the file gets complete logical reinitialization // which means that all previous modifications to the file are lost // unless stored on disk with mmdb_f_write_(..) or mmdb_f_close_(..). // // If the file is to be opened for input (RWStat is set to // "INPUT"), all contents of the file is read into memory. It may be // then modified and written back into a file (same or different). // // If the file is to be opened for output (RWStat is set to // "OUTPUT"), no file is physically opened, and only empty data // structure is created in the memory. It may then be added with the // data and stored in a disk file. // // If FType is set to "PDB" or " ", the physical file is assumed // to be read or written in the PDB format. "CIF" option is reserved // for mmCIF files and is not realized at present. "BIN" means // binary format. Note that both file name and file type may be // changed before writting the file (see mmdb_f_setname_(..) and // mmdb_f_settype_(..)). // // mmdb_f_open(..) sets an internal pointer to "before the first" // atom in the file (therefore it should be advanced to get access // to the first atom, see mmdb_f_advance1_(..)). This pointer is used // for getting atomic coordinates and other atomic characteristics // from the file structure or for storing them into the structure. // The pointer may be advanced, backspaced or set to a specific // position in the file structure (see below). // // iRet returns the error code (defined above). Extended // information on the error may be then obtained through the // geterror_(..) function immediately after return from // mmdb_f_open_(..). // FORTRAN equivalent: subroutine MMDB_F_Open ( LName,RWStat,FType, // ~~~~~~~~~~~~~~~~~~~ iUnit,iRet ) // character*(*) LName,RWStat,FType // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_OPEN, mmdb_f_open, ( // lengths-at-end list fpstr LName, // logical name fpstr RWStat, // "INPUT" or "OUTPUT" fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int LName_len, // fortran-hidden length of LName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list fpstr LName, fpstr RWStat, fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list fpstr LName, int LName_len, fpstr RWStat, int RWStat_len, fpstr FType, int FType_len, int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_open1_(..) is equivalent to mmdb_f_open_(..) but takes directly // the file name (FName) instead of logical name (LName). // // FORTRAN equivalent: subroutine MMDB_F_Open1 ( FName,RWStat,FType, // ~~~~~~~~~~~~~~~~~~~ iUnit,iRet ) // character*(*) FName,RWStat,FType // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_OPEN1, mmdb_f_open1, ( // lengths-at-end list fpstr FName, // file name fpstr RWStat, // "INPUT" or "OUTPUT" fpstr FType, // "PDB", "CIF", "BIN" or " " int * iUnit, // channel number int * iRet, // returns error code int FName_len, // fortran-hidden length of FName int RWStat_len, // fortran-hidden length of RWStat int FType_len // fortran-hidden length of FType ), ( // lengths-in-structure list fpstr FName, fpstr RWStat, fpstr FType, int * iUnit, int * iRet ), ( // lengths-follow list fpstr FName, int FName_len, fpstr RWStat, int RWStat_len, fpstr FType, int FType_len, int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_copy_(..) copies the specified part(s) of iUnit2 into iUnit1. // All data which contained in the corresponding part(s) of iUnit1 // before the copying, is destroyed. // // FORTRAN equivalent: subroutine MMDB_F_Copy ( iUnit1,iUnit2, // ~~~~~~~~~~~~~~~~~~~ copyKey,iRet ) // integer iUnit1,iUnit2,copyKey,iRet FORTRAN_SUBR ( MMDB_F_COPY, mmdb_f_copy, ( // lengths-at-end list int * iUnit1, // destination unit int * iUnit2, // source unit int * copyKey, // copy key: // = 1 copy all // = 2 copy all except coordinates // = 3 copy title section only // = 4 copy crystallographic // section only // = 5 copy coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist // =RWBERR_NoFile if a unit // was not opened ), ( // lengths-in-structure list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ), ( // lengths-follow list int * iUnit1, int * iUnit2, int * copyKey, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_delete_(..) deletes the specified parts of iUnit-th unit. // The delete keys are exactly the same as copy keys in mmdb_f_copy_(..). // // FORTRAN equivalent: subroutine MMDB_F_Delete ( iUnit1,iUnit2, // ~~~~~~~~~~~~~~~~~~~ CopyAtoms,iRet ) // integer iUnit1,iUnit2,CopyAtoms,iRet FORTRAN_SUBR ( MMDB_F_DELETE, mmdb_f_delete, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" int * delKey, // delete key: // = 1 delete all // = 2 delete all except coordinates // = 3 delete title section only // = 4 delete crystallographic // section only // = 5 delete coordinate section only // any other value does not do anything int * iRet // return code: // =0 if success // =RWBERR_NoChannel if a unit // does not exist // =RWBERR_NoFile if a unit // was not opened ), ( // lengths-in-structure list int * iUnit, int * delKey, int * iRet ), ( // lengths-follow list int * iUnit, int * delKey, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_settype_(..) changes the type and/or the read/write mode of // a unit iUnit, previously initialized with mmdb_f_open_(..). The file // is not read from or purged onto disk, no data change occurs. // // iRet returns either RWBERR_NoChannel if the unit was not // previously initialized by mmdb_f_open_(..), or RWBERR_Ok in the case // of success. // FORTRAN equivalent: subroutine MMDB_F_SetType ( iUnit,FType, // ~~~~~~~~~~~~~~~~~~~ RWState,iRet ) // character*(*) FType,RWState // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETTYPE, mmdb_f_settype, ( // lengths-at-end list int * iUnit, // unit number fpstr FType, // "PDB", "CIF", "BIN" or " " fpstr RWStat, // "INPUT" or "OUTPUT" int * iRet, // returns -1 if unit not found, // otherwise 0 int FType_len, // fortran-hidden length of FType int RWStat_len // fortran-hidden length of RWStat ), ( // lengths-in-structure list int * iUnit, fpstr FType, fpstr RWStat, int * iRet ), ( // lengths-follow list int * iUnit, fpstr FType, int FType_len, fpstr RWStat, int RWStat_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_setname_(..) changes the file name for a unit iUnit, // previously initialized with mmdb_f_open_(..). The file is not // read from or purged onto disk, no data change occurs. // // iRet returns either RWBERR_NoChannel if the unit was not // previously initialized by mmdb_f_open_(..), or RWBERR_Ok in the case // of success. // FORTRAN equivalent: subroutine MMDB_F_SetName ( iUnit,FName, // ~~~~~~~~~~~~~~~~~~~ iRet ) // character*(*) FName // integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETNAME, mmdb_f_setname, ( // lengths-at-end list int * iUnit, // unit number fpstr FName, // file name int * iRet, // returns -1 if unit not found, // otherwise 0 int FName_len // fortran-hidden length of FName ), ( // lengths-in-structure list int * iUnit, fpstr FName, int * iRet ), ( // lengths-follow list int * iUnit, fpstr FName, int FName_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_write_(..) writes content of unit iUnit into a disk file. // iRet will be set to -1 if the unit was not previously opened with // mmdb_f_open_(..). If writting was successful, iRet is set to 0, // otherwise geterror(..) will return an information about the // error occured. // // Note that you may write even units associated with input in // call to mmdb_f_open(..). The file type does not change unless // explicitely changed with mmdb_f_settype_(..). // FORTRAN equivalent: subroutine MMDB_F_Write ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_WRITE, mmdb_f_write, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_close_(..) acts as mmdb_f_write_(..) if unit iUnit has been // associated with output in mmdb_f_open_(..) or in the call to // mmdb_f_settype(..). After writing the file, the unit iUnit is // completely disposed. // If unit iUnit is associated with input, mmdb_f_close_(..) merely // disposes it and all the information contained will be lost. // FORTRAN equivalent: subroutine MMDB_F_Close ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_CLOSE, mmdb_f_close, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // If unit iUnit is associated with input, mmdb_f_advance_(..) sets // the internal pointer on the next atom in the file. The atom // properties may then be retrieved using mmdb_f_atom_(..) and // mmdb_f_coord_(..). If iTer is set to 0, then 'ter' cards are // completely ignored. If iTer is set to 1, then 'ter' card will // cause return with iRet=1 with internal pointer left on this 'ter' // card. iRet=2 mean end of file, and iRet=0 means that the pointer // was successfully advanced to the next atom. // // If unit iUnit is associated with output, mmdb_f_advance_(..) // merely advances the pointer. No actual change in the data // structure or on disk occurs. The new position will be filled with // atom data after execution of mmdb_f_atom_(..) and/or mmdb_f_coord_(..). // The pointer WILL NOT be advanced if none of these functions were // called since last advancement, in which case iRet will return // RWBERR_NoAdvance. After successfull advancement, iRet will // return 0. // FORTRAN equivalent: subroutine MMDB_F_Advance ( iUnit,iOut,iTer,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iOut,iTer,iRet // Relation to the former XYZAdvance fortran subroutione: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // subroutine XYZAdvance ( iUnit,iOut,iTer,*,* ) // integer iRet // character*80 ErrLin // call MMDB_F_Advance ( iUnit,iOut,iTer,iRet ) // if (iRet.eq.1) return 1 // if (iRet.eq.2) return 2 // if (iRet.eq.RWBERR_NoChannel) then // ErrLin = ' ERROR: in MMDB_F_ADVANCE file has not been opened' // call CCPErr ( 1,ErrLin ) // endif // return // end // // where parameter iOut IS NOT USED. FORTRAN_SUBR ( MMDB_F_ADVANCE, mmdb_f_advance, ( // lengths-at-end list int * iUnit, // unit number int * iOut, // output echo file int * iTer, // FLAG =1, return iRet=1 if 'ter' card found // =0, do not return on 'ter' card int * iRet // =0 if normal return // =1 if return on 'ter' card (iTer=1) // =2 if return on end of file // =3 if return on 'hetatm' card // =RWBERR_NoChannel if unit does not exist // =RWBERR_NoAdvance if pointer was not // advanced ), ( // lengths-in-structure list int * iUnit, int * iOut, int * iTer, int * iRet ), ( // lengths-follow list int * iUnit, int * iOut, int * iTer, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rewd_(..) sets the internal pointer to the "begining" of // the data structure associated with unit *iUnit. This means that // one should the "advance" it with mmdb_f_advance_(..) in order // to get access to the first atom. // iRet returns RWBERR_NoChannel if iUnit-th unit was not // initialized, RWBWAR_RewOutput if the unit was associated with // output, and 0 otherwise. // FORTRAN equivalent: subroutine MMDB_F_Rewd ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_REWD, mmdb_f_rewd, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_bksp_(..) shifts the internal pointer for one atom back in // the data structure associated with unit *iUnit. This means that // the combination of mmdb_f_advance1_(..) and mmdb_f_bksp_(..) leaves the // pointer unchanged. // iRet returns RWBERR_NoChannel if iUnit-th unit was not // initialized, and sets bit RWBWAR_RewOutput if the unit was // associated with output, RWBWAR_FileTop if the pointer is already // on the top of the structure, and 0 otherwise. // FORTRAN equivalent: subroutine MMDB_F_Bksp ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_BKSP, mmdb_f_bksp, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_seek_(..) sets the internal pointer to the specified // position. If fPos==0, *iRet will return bit RWBWAR_FileTop. // If unit iUnit is associated with input, iRet will return 2 if // fPos is given a value outside the file range, 1 if a 'ter' card // is met and 3 if a 'hetatm' card is met. // iRet returns RWBERR_NoChannel if iUnit-th unit was not // initialized, and RWBERR_EmptyPointer if fPos-th position in the // input file is not occupied. // FORTRAN equivalent: subroutine MMDB_F_Seek ( iUnit,fPos,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,fPos,iRet FORTRAN_SUBR ( MMDB_F_SEEK, mmdb_f_seek, ( // lengths-at-end list int * iUnit, // unit number int * fPos, // position to set int * iRet // return code: // 0 Ok // 1 'ter' card met // 2 end of file // 3 'hetatm' card met // <0 error: // RWBERR_NoChannel // iUnit was not // initialized // RWBERR_EmptyPointer // fPos-th position ), ( // lengths-in-structure list int * iUnit, int * fPos, int * iRet ), ( // lengths-follow list int * iUnit, int * fPos, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_atom_(..) reads or writes the atom name, residue name, // chain name and other parameters listed from/into the // data structure associated with the unit number iUnit (cf. // mmdb_f_open_(..)). The position in the structure is adjusted // with the help of mmdb_f_advance_(..), mmdb_f_rewd_(..) or // mmdb_f_bksp_(..). // FORTRAN equivalent: subroutine MMDB_F_Atom ( iUnit,iSer,AtNam, // ~~~~~~~~~~~~~~~~~~~ ResNam,ChnNam,iResN,ResNo, // InsCod,AltCod,SegID,IZ,ID, // iRet ) // integer iUnit,iSer,iResN,IZ,iRet // character*(*) AtNam,ResNam,ChnNam,ResNo // character*(*) InsCod,AltCod,SegID,ID FORTRAN_SUBR ( MMDB_F_ATOM, mmdb_f_atom, ( // lengths-at-end list int * iUnit, // unit number int * iSer, // atom serial number fpstr AtNam, // atom name (left justified) fpstr ResNam, // residue name fpstr ChnNam, // chain name int * iResN, // residue number as an integer fpstr ResNo, // residue number as character (input only) fpstr InsCod, // the insertion code fpstr AltCod, // the alternate conformation code fpstr segID, // segment ID int * IZ, // atomic number (input only, returned as // 7 from ambiguous atoms) fpstr ID, // atomic ID related to atomic number // (element symbol right justified), plus // the ionic state +2, +3 etc.. // int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_Error1 internal error #1 // RWBERR_Error2 internal error #2 // RWBERR_Error3 internal error #3 // // >=0 : success, warning flags: // RWBWAR_WrongSerial if serial number // differs from the position // number in the file // RWBWAR_UnkFormFactor unknown formfactor // RWBWAR_AmbFormFactor ambiguous formfactor // int AtNam_len, // fortran-hidden length of AtNam int ResNam_len, // fortran-hidden length of ResNam int ChnNam_len, // fortran-hidden length of ChnNam int ResNo_len, // fortran-hidden length of ResNo int InsCod_len, // fortran-hidden length of InsCod int AltCod_len, // fortran-hidden length of AltCod int segID_len, // fortran-hidden length of SegID int ID_len // fortran-hidden length of ID ), ( // lengths-in-structure list int * iUnit, int * iSer, fpstr AtNam, fpstr ResNam, fpstr ChnNam, int * iResN, fpstr ResNo, fpstr InsCod, fpstr AltCod, fpstr segID, int * IZ, fpstr ID, int * iRet ), ( // lengths-follow list int * iUnit, int * iSer, fpstr AtNam, int AtNam_len, fpstr ResNam, int ResNam_len, fpstr ChnNam, int ChnNam_len, int * iResN, fpstr ResNo, int ResNo_len, fpstr InsCod, int InsCod_len, fpstr AltCod, int AltCod_len, fpstr segID, int segID_len, int * IZ, fpstr ID, int ID_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_copyatom_(..) copies atom from current position in // channel iUnit1 to current position in channel iUnit2. // FORTRAN equivalent: subroutine MMDB_F_CopyAtom ( iUnit1, // ~~~~~~~~~~~~~~~~~~~ iUnit2,iRet ) // integer iUnit1,iUnit2,iRet FORTRAN_SUBR ( MMDB_F_COPYATOM, mmdb_f_copyatom, ( // length-at-end list int * iUnit1, // source channel number int * iUnit2, // destination channel number int * iRet // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // >=0 : success ), ( // length-in-structure list int * iUnit1, int * iUnit2, int * iRet ), ( // length-follow list int * iUnit1, int * iUnit2, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_coord_(..) reads or writes the atom coordinates, occupancy // and temperature factor from/into the data structure associated // with the unit number iUnit (cf. mmdb_f_open_(..)). The position in // the structure is adjusted with the help of mmdb_f_advance_(..), // mmdb_f_rewd_(..) or mmdb_f_bksp_(..). // It is important that mmdb_f_coord_(..) was called AFTER // mmdb_f_atom_(..) if channel iUnit is associated with output // (otherwise iRet will return RWBERR_EmptyPointer). // FORTRAN equivalent: subroutine MMDB_F_Coord ( iUnit,XFlag,BFlag, // ~~~~~~~~~~~~~~~~~~~ x,y,z,occ,BIso,U,iRet ) // integer iUnit,iRet // character*(*) XFlag,BFlag // real x,y,z,occ,BIso,U(6) // Be sure that real-type parameters of mmdb_f_coord_(..) match those // of FORTRAN call. The real type is set with typedef apireal // statement in the begining of this file. FORTRAN_SUBR ( MMDB_F_COORD, mmdb_f_coord, ( // lengths-at-end list int * iUnit, // unit number fpstr XFlag, // "F" or "O" flag for the fractional // or orthogonal coordinates x,y,z // for output files XFlag may also be // set to "HF" or "HO", where "F" and // "O" have the same meaning as before // and "H" indicates that the atom // should be marked as heteroatom fpstr BFlag , // "F" or "O" flag for temperature // factor in fractional or orthogonal // Us apireal * x, // x-coordinate apireal * y, // y-coordinate apireal * z, // z-coordinate apireal * occ, // occupancy apireal * BIso, // isotropic temperature factor apireal * U, // array(6) of the anisotr. t-factor int * iRet, // returns // RWBERR_NoChannel if iUnit was not // initialized // RWBERR_EmptyPointer if atom was not // advanced // RWBERR_NoMatrices if transformation // matrices are // undefined // RWBERR_NoCoordinates if coordinates were // not set in the atom // // >=0 : success, warning flags: // RWBERR_NoOccupancy if occupancy was // not set in the atom // RWBERR_NoTempFactor if temp. factor was // not set in the atom // int XFlag_len, // fortran-hidden length of XFlag int BFlag_len // fortran-hidden length of BFlag ), ( // lengths-in-structure list int * iUnit, fpstr XFlag, fpstr BFlag, apireal * x, apireal * y, apireal * z, apireal * occ, apireal * BIso, apireal * U, int * iRet ), ( // lengths-follow list int * iUnit, fpstr XFlag, int XFlag_len, fpstr BFlag, int BFlag_len, apireal * x, apireal * y, apireal * z, apireal * occ, apireal * BIso, apireal * U, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_setter_(..) sets the termination flag, so that the current // atom will be converted into terminator of a chain and appear as // 'ter' card in the output. The atom should be set by mmdb_f_atom_ // first, but the coordinates (mmdb_f_coord_(..)) do not have to be // specified. // FORTRAN equivalent: subroutine MMDB_F_SetTer ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETTER, mmdb_f_setter, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_sethet_(..) sets the heteroatom flag, so that the current // atom will appear as 'hetatm' card in the output. The atom should // be set by mmdb_f_atom_ first and then mmdb_f_coord_(..) and // mmdb_f_sethet_(..) should be called to specify its coordinates and // heteroatom status. // FORTRAN equivalent: subroutine MMDB_F_SetHet ( iUnit,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet FORTRAN_SUBR ( MMDB_F_SETHET, mmdb_f_sethet, ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ), ( int * iUnit, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_setcell_(..) sets the crystal cell properties and calculates // the orthogonal-fractional transformation matrices for unit iUnit. // FORTRAN equivalent: subroutine MMDB_F_SetCell ( iUnit,a,b,c, // ~~~~~~~~~~~~~~~~~~~ alpha,beta,gamma, // ArgNCode,iRet ) // integer iUnit,ArgNCode,iRet // real a,b,c,alpha,beta,gamma // Relation to the former RBFRAC2 FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBFRAC2 ( a,b,c,alpha,beta,gamma,ArgNCode ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_SETCELL, mmdb_f_setcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * a, // cell parameter a, angstroms apireal * b, // cell parameter b, angstroms apireal * c, // cell parameter c, angstroms apireal * alpha, // cell parameter alpha, degrees apireal * beta, // cell parameter beta, degrees apireal * gamma, // cell parameter gamma, degrees int * ArgNCode, // orthogonalization code, 1-6 int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Disagreement if a // disagreement in // cell parameters // was found // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * a, apireal * b, apireal * c, apireal * alpha, apireal * beta, apireal * gamma, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * a, apireal * b, apireal * c, apireal * alpha, apireal * beta, apireal * gamma, int * ArgNCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_wbspgrp_(..) sets the space group // FORTRAN equivalent: subroutine MMDB_F_WBSpGrp ( iUnit,spGroup,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // character*(*) spGroup // Relation to the former WBSpGrp FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine WBSpGrp ( spGroup ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_WBSPGRP, mmdb_f_wbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, fpstr spGroup, int spGroup_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbspgrp_(..) retrieves the space group // FORTRAN equivalent: subroutine MMDB_F_RBSpGrp ( iUnit,spGroup,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // character*(*) spGroup // Relation to the former RBSpGrp FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBSpGrp ( spGroup ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBSPGRP, mmdb_f_rbspgrp, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" fpstr spGroup, // space group int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed int spGroup_len // fortran-hidden length of spGroup ), ( // lengths-in-structure list int * iUnit, fpstr spGroup, int * iRet ), ( // lengths-follow list int * iUnit, fpstr spGroup, int spGroup_len, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_wbcell_(..) sets the crystal cell properties into the // channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_WBCell ( iUnit,ArgCell, // ~~~~~~~~~~~~~~~~~~~ ArgNCode,iRet ) // integer iUnit,ArgNCode,iRet // real ArgCell(6) // // Relation to the former WBCELL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine WBCELL ( iUnit,ArgCell,ArgNCode ) // // ** the buffer for the return code iRet has to be supplied FORTRAN_SUBR ( MMDB_F_WBCELL, mmdb_f_wbcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * ArgCell, // array to accept the cell parameters // if ArgCell(1) is set to 0, then // the cell does not change int * ArgNCode, // orthogonalisation code // if ArgNCode is set to 0, then // the orthogonalisation matrices // do not change int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed ), ( // lengths-in-structure list int * iUnit, apireal * ArgCell, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * ArgCell, int * ArgNCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbcell_(..) retrieves the crystal cell properties from the // channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_RBCell ( iUnit,celld,cvol,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // real celld(6),cvol // character*(*) spGroup // Relation to the former RBCELL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBCELL ( celld,cvol ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBCELL, mmdb_f_rbcell, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * celld, // array to accept the cell parameters apireal * cvol, // returns the cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * celld, apireal * cvol, int * iRet ), ( // lengths-follow list int * iUnit, apireal * celld, apireal * cvol, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbcelln_(..) retrieves the crystal cell properties from the // channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_RBCellN ( iUnit,celld,cvol, // ~~~~~~~~~~~~~~~~~~~ ArgNCode,iRet ) // integer iUnit,ArgNCode,iRet // real celld(6),cvol // Relation to the former RBCELL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBCELL ( celld,cvol ) // // ** the unit number iUnit, buffer for orthogonalization code // ArgNCode and for the return code iRet have to be supplied. FORTRAN_SUBR ( MMDB_F_RBCELLN, mmdb_f_rbcelln, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * celld, // array to accept the cell parameters apireal * cvol, // returns the cell volume int * ArgNCode, // returns the orthogonalization code, 1-6 int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * celld, apireal * cvol, int * ArgNCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * celld, apireal * cvol, int * ArgNCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rbrcel_(..) retrieves the reciprocal cell dimensions and // reciprocal cell volume from the channel iUnit. // FORTRAN equivalent: subroutine MMDB_F_RBRCel ( iUnit,rcell,rvol, // ~~~~~~~~~~~~~~~~~~~ iRet ) // integer iUnit,iRet // real rcell(6),rvol // Relation to the former RBRCEL FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBRCEL ( rcell,rvol ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBRCEL, mmdb_f_rbrcel, ( // lengths-at-end list int * iUnit, // unit number apireal * rcell, // array to accept the reciprocal // cell parameters apireal * rvol, // returns the reciprocal cell volume int * iRet // return code // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_Parameters if the // cell parameters // were not set // RWBERR_NoOrthCode if no // orthogonalization // code was found // RWBERR_NoCheck if check // of cell parameters // has failed. // The last three returns would // rather indicate a programming // error in mmdb_rwbrook.cpp ), ( // lengths-in-structure list int * iUnit, apireal * rcell, apireal * rvol, int * iRet ), ( // lengths-follow list int * iUnit, apireal * rcell, apireal * rvol, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_rborf_(..) fills or retrieves the fractionalising (RF) and // orthogonalising (RO) 4x4 matrices, as well as the orthogonalisation // code (LCode) in/from unit iUnit. // If RO[1][1] (fortran notations, or RO[0] in C/C++) is set to 0.0 // then the matrices are retrieved and returned in RF and RO; // otherwise RF and RO are stored in the unit. // FORTRAN equivalent: subroutine MMDB_F_RBORF ( iUnit,RO,RF, // ~~~~~~~~~~~~~~~~~~~ LCode,iRet ) // integer iUnit,LCode,iRet // real RO(4,4),RF(4,4) // Relation to the former RBRORF2 FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBRORF2 ( RO,RF,LCode ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_RBORF, mmdb_f_rborf, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * RO, // array for orthogonalising matrix apireal * RF, // array for fractionalising matrix int * LCode, // buffer for orthogonalisation code int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, apireal * RO, apireal * RF, int * LCode, int * iRet ), ( // lengths-follow list int * iUnit, apireal * RO, apireal * RF, int * LCode, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_orthmat_(..) calculates matrices for standard orthogonalisations // and cell volume. // If Cell(1) is greater then zero, the existing cell parameters // will be substituted. If new cell parameters differ substantially // from the old ones, the returned value of Vol will be negative. // FORTRAN equivalent: subroutine MMDB_F_OrthMat ( iUnit,Cell,Vol, // ~~~~~~~~~~~~~~~~~~~ RRR,iRet // integer iUnit,iRet // real Cell(6),Vol,RRR(3,3,6) // Relation to the former RBFRO1 FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine RBFRO1 ( Cell,Vol,RRR ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_ORTHMAT, mmdb_f_orthmat, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * Cell, // array of cell parameters: // Cell(1) - a Cell(4) - alpha // Cell(2) - b Cell(5) - beta // Cell(3) - c Cell(6) - gamma apireal * Vol, // returns cell volume apireal * RRR, // array (3,3,6), returns // orthogonalisation matrices int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, apireal * Cell, apireal * Vol, apireal * RRR, int * iRet ), ( // lengths-follow list int * iUnit, apireal * Cell, apireal * Vol, apireal * RRR, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_cvanisou_(..) converts between crystallographic bs and // orthogonal Us or the other way round. // FORTRAN equivalent: subroutine MMDB_F_CVAnisou ( iUnit,U,iFlag,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iFlag,iRet // real U(6) // Relation to the former CVANISOU FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine CVANISOU ( U,iFlag ) // // ** the unit number iUnit and buffer for the return code iRet // have to be supplied. FORTRAN_SUBR ( MMDB_F_CVANISOU, mmdb_f_cvanisou, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" apireal * U, // array of coordinates to convert int * iFlag, // =0: convert from fract. to orthog. // =1: convert from orthog. to fract. int * iRet // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // RWBERR_NoMatrices if the // orthogonalisation // matrices were not // calculated ), ( // lengths-in-structure list int * iUnit, apireal * U, int * iFlag, int * iRet ), ( // lengths-follow list int * iUnit, apireal * U, int * iFlag, int * iRet ) ); // ------------------------------------------------------------------ // mmdb_f_wremark_(..) writes a remark line into data structure. // Generally, it puts the line on its place according to a PDB // keyword which should start the line. The line will be always the // last one in its group (last remark with given number or without // it, last JRNL record, last ATOM etc.). If the keyword is not // recognized, the line is appended after the coordinate section. // iRet will return same codes as those in mmdb_f_open1_(..) plus // additional ones specified below. // FORTRAN equivalent: subroutine MMDB_F_WRemark ( iUnit,Line,iRet ) // ~~~~~~~~~~~~~~~~~~~ integer iUnit,iRet // character*(*) Line // Relation to the former WRemark FORTRAN subroutine: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // subroutine WRemark ( iUnit,Line ) // // ** the buffer for return code iRet has to be supplied FORTRAN_SUBR ( MMDB_F_WREMARK, mmdb_f_wremark, ( // lengths-at-end list int * iUnit, // unit number; *iUnit<=0 means // "the last mentioned unit" fpstr Line, // line to be added int * iRet, // return code: // RWBERR_Ok - success // RWBERR_NoChannel if unit // iUnit was not // initialized // RWBERR_NoFile if unit // has been disposed // other return codea are those // returned by mmdb_f_open1_(..) int Line_len // fortran-hidden length of Line ), ( // lengths-in-structure list int * iUnit, fpstr Line, int * iRet ), ( // lengths-follow list int * iUnit, fpstr Line, int Line_len, int *iRet ) ); /* // ------------------------------------------------------------------ // rbrinv_(..) takes 4x4 real matrix A and returns its inverse in // matrix AI. // FORTRAN equivalent: subroutine RBRInv ( A,AI ) // ~~~~~~~~~~~~~~~~~~~ real A(4,4),AI(4,4) FORTRAN_SUBR ( RBRINV, rbrinv, ( apireal * A, apireal * AI ), ( apireal * A, apireal * AI ), ( apireal * A, apireal * AI ) ); */ /* // ------------------------------------------------------------------ // res3to1_(..) returns the 3-character or 1-character residue // codes. One of them should be supplied (with the other one set // blank), the routine returns the other one. // FORTRAN equivalent: subroutine Res3to1 ( ResNm3,resNm1 ) // ~~~~~~~~~~~~~~~~~~~ character*4 ResNm3 // cgaracter*1 ResNm1 FORTRAN_SUBR ( RES3TO1, res3to1, ( // lengths-at-end list fpstr ResNm3, // 3-char name, 4th char // will be set blank fpstr ResNm1, // 1-char name int ResNm3_len, // fortran-hidden length of ResNm3 int ResNm1_len // fortran-hidden length of ResNm3 ), ( // lengths-in-structure list fpstr ResNm3, fpstr ResNm1 ), ( // lengths-follow list fpstr ResNm3, int ResNm3_len, fpstr ResNm1, int ResNm1_len ) ); */ // ------------------------------------------------------------------ // rberrstop_(..) checks the return code got from one of the above // functions, and if it indicates an error, it issues the following // type of message (example) // // *** RWBROOK error: point code unit function // *** 12 -3 3 MMDB_F_Open // *** file : input.pdb // *** reason : cannot open a file // *** Execution stopped. // // if iStop is set to 0, and one of the following type // // *** RWBROOK error: point code unit function // *** 12 -3 3 MMDB_F_Open // *** file : input.pdb // *** reason : cannot open a file // *** continue running, may crash ... // // if iStop is not null. // // iPlace (12 in the above samples) should be given a number which // is unique through an application; it serves to the identifying // the particular call which caused the problem. The return code // (-3 in the above samples) is that what is back in the iRet // parameter to the above functions. If iRet is set to RWBERR_Ok, // rberrstop_(..) makes no action. If rberrstop_(..) is called // immediately after a call to an RWBROOK function, e.g. // // call MMDB_F_Open ( FName,RWStat,FType,iUnit,iRet ) // call RBErrStop ( 12,iRet,iUnit,0 ) // // then the name of the misfunctioned call (MMDB_F_Open in the above // samples) will be identified automatically and correctly. // FORTRAN equivalent: subroutine RBErrStop ( iPlace,iRet, // ~~~~~~~~~~~~~~~~~~~ iUnit ,iStop ) // integer iUnit,iPlace,iRet,iStop FORTRAN_SUBR ( RBERRSTOP, rberrstop, ( // lengths-at-end list int * iPlace, // (unique) identificator inside an application int * iRet, // return code to check int * iUnit, // unit number int * iStop // if 0 then stop if error ), ( // lengths-in-structure list int * iPlace, int * iRet, int * iUnit, int * iStop ), ( // lengths-follow list int * iPlace, int * iRet, int * iUnit, int * iStop ) ); // ------------------------------------------------------------------ // rbcheckerr_(..) represents a simplified call to rberrstop_(..). // It will work properly only if rbcheckerr_(..) is called // immediately after an API function to be checked: // // call MMDB_F_Open ( FName,RWStat,FType,iUnit,iRet ) // call RBCheckErr ( 12,0 ) // // FORTRAN equivalent: subroutine RBCheckErr ( iPlace,iStop ) // ~~~~~~~~~~~~~~~~~~~ integer iPlace,iStop FORTRAN_SUBR ( RBCHECKERR, rbcheckerr, ( // lengths-at-end list int * iPlace, // (unique) identificator inside an application int * iStop // if 0 then stop if error ), ( // lengths-in-structure list int * iPlace, int * iStop ), ( // lengths-follow list int * iPlace, int * iStop ) ); #endif mmdb-1.23.2.1/src/mmdb_align.cpp0000644000175100017510000007052511475665501013207 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Align // ~~~~~~~~~ // **** Classes : CAlignment ( alignment of character strings ) // ~~~~~~~~~~~~ CAlignment1 ( alignment of integer vectors ) // // (C) E.Krissinel' 2000-2008 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __MATH_H #include #endif #ifndef __MMDB_Align__ #include "mmdb_align.h" #endif // ===================== CAligParams ====================== CAlignParams::CAlignParams() : CStream() { InitAlignParams(); } CAlignParams::CAlignParams ( RPCStream Object ) : CStream ( Object ) { InitAlignParams(); } void CAlignParams::InitAlignParams() { gapWeight = -1.0; spaceWeight = -1.0; equalScore = 2.0; nequalScore = -1.0; method = ALIGN_GLOBAL; } void CAlignParams::write ( RCFile f ) { f.WriteReal ( &gapWeight ); f.WriteReal ( &spaceWeight ); f.WriteReal ( &equalScore ); f.WriteReal ( &nequalScore ); f.WriteInt ( &method ); } void CAlignParams::read ( RCFile f ) { f.ReadReal ( &gapWeight ); f.ReadReal ( &spaceWeight ); f.ReadReal ( &equalScore ); f.ReadReal ( &nequalScore ); f.ReadInt ( &method ); } MakeStreamFunctions(CAlignParams) // ===================== CAlignment ====================== CAlignment::CAlignment() : CStream() { InitAlignment(); } CAlignment::CAlignment ( RPCStream Object ) : CStream ( Object ) { InitAlignment(); } CAlignment::~CAlignment() { FreeMemory(); } void CAlignment::InitAlignment() { Space = '-'; SLen = 0; TLen = 0; VT = NULL; ET = NULL; FT = NULL; AlgnS = NULL; AlgnT = NULL; AlignKey = ALIGN_GLOBAL; VAchieved = 0.0; SEq = 2.0; SNEq = -1.0; Wg = 0.0; Ws = -1.0; } void CAlignment::FreeMemory() { FreeMatrixMemory ( VT,TLen+1,0,0 ); FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); if (AlgnS) { delete[] AlgnS; AlgnS = NULL; } if (AlgnT) { delete[] AlgnT; AlgnT = NULL; } TLen = 0; SLen = 0; } void CAlignment::SetAffineModel ( realtype WGap, realtype WSpace ) { Wg = WGap; Ws = WSpace; } void CAlignment::SetScores ( realtype SEqual, realtype SNEqual ) { SEq = SEqual; SNEq = SNEqual; } void CAlignment::Align ( cpstr S, cpstr T, int Method ) { int i,j,i0,j0; FreeMemory(); AlignKey = Method; switch (Method) { default : case ALIGN_GLOBAL : // global pairwise alignment of S and T BuildGATable ( S,T, False,False ); VAchieved = VT[TLen][SLen]; Backtrace ( S,T,SLen,TLen,False ); if ((AlgnS[0]!=Space) && (AlgnT[0]!=Space)) VAchieved -= Wg; break; case ALIGN_LOCAL : // local pairwise alignment of S and T BuildLATable ( S,T ); VAchieved = 0.0; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) for (j=0;j<=SLen;j++) if (VT[i][j]>VAchieved) { VAchieved = VT[i][j]; i0 = i; j0 = j; } Backtrace ( S,T,j0,i0,True ); break; case ALIGN_GLOBLOC : // global alignment with non-penalized // end gaps in T BuildGATable ( S,T,False,True ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } Backtrace ( S,T,j0,i0,False ); AdjustEnds ( S,T,j0,i0 ); break; case ALIGN_FREEENDS : // global alignment with non-penalized // end gaps in both S and T BuildGATable ( S,T,True,True ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } for (j=0;j<=SLen;j++) if (VT[TLen][j]>VAchieved) { VAchieved = VT[TLen][j]; i0 = TLen; j0 = j; } Backtrace ( S,T,j0,i0,False ); AdjustEnds ( S,T,j0,i0 ); } } void CAlignment::BuildGATable ( cpstr S, cpstr T, Boolean FreeSEnd, Boolean FreeTEnd ) { int i,j; realtype V1; SLen = strlen ( S ); TLen = strlen ( T ); GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions if (FreeSEnd || FreeTEnd) VT[0][0] = RMax(0.0,Wg); else VT[0][0] = Wg; ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; if (FreeTEnd) for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } else for (i=1;i<=TLen;i++) { V1 = VT[i-1][0] + Ws; VT[i][0] = V1; ET[i][0] = V1; } if (FreeSEnd) for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } else for (j=1;j<=SLen;j++) { V1 = VT[0][j-1] + Ws; VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),FT[i][j] ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void CAlignment::BuildLATable ( cpstr S, cpstr T ) { int i,j; realtype V1; SLen = strlen ( S ); TLen = strlen ( T ); GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions VT[0][0] = RMax ( 0.0,Wg ); ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),RMax(0.0,FT[i][j]) ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void CAlignment::PrintVT ( cpstr S, cpstr T ) { int i,j; printf ( "\n " ); for (j=0;j<=SLen;j++) printf ( " %2i",j ); printf ( " \n " ); for (j=1;j<=SLen;j++) printf ( " %c ",S[j-1] ); printf ( " \n\n " ); for (i=0;i<=TLen;i++) { if (i>0) printf ( " %2i %c ",i,T[i-1] ); else printf ( " %2i ",i ); for (j=0;j<=SLen;j++) printf ( " %2i",mround(VT[i][j]) ); printf ( " \n " ); } printf ( " \n" ); } void CAlignment::Backtrace ( cpstr S, cpstr T, int J, int I, Boolean StopAtZero ) { int i,j,k, i1,j1, sk,tk; char C; realtype V,SV,TV; Boolean Stop; // 1. Allocate memory if (AlgnS) delete[] AlgnS; if (AlgnT) delete[] AlgnT; i = SLen+TLen+1; AlgnS = new char[i]; AlgnT = new char[i]; memset ( AlgnS,Space,i ); memset ( AlgnT,Space,i ); // 2. Initialize backtracing i = I; // backtracing j = J; // indices k = 0; // alignment index SV = 0.0; sk = -1; // alignment indices and leading elements TV = 0.0; tk = -1; // for vertical and horizontal sections // 3. Backtracing Stop = False; while ((!Stop) && (i>0) && (j>0)) { V = VT[i][j]; // find next leading element if (VT[i][j-1]>VT[i-1][j]) { i1 = i; j1 = j-1; } else { i1 = i-1; j1 = j; } if (VT[i-1][j-1]>=VT[i1][j1]) { i1 = i-1; j1 = j-1; } //printf ( " i=%i j=%i \n",i,j ); Stop = StopAtZero && (VT[i1][j1]<=0.0); // used at local alignment // treat horizontal section if ((sk<0) || (V>SV)) { sk = k; SV = V; } if ((j1!=j) || Stop) { // end of horizontal section AlgnS[sk] = S[j-1]; sk = -1; } // treat vertical section if ((tk<0) || (V>TV)) { tk = k; TV = V; } if ((i1!=i) || Stop) { // end of vertical section AlgnT[tk] = T[i-1]; tk = -1; } i = i1; j = j1; k++; } if (!StopAtZero) { // 4. Finish the last horizontal section sk = k; while (j>0) AlgnS[k++] = S[--j]; // 5. Finish the last vertical section while (i>0) AlgnT[sk++] = T[--i]; k = IMax ( k,sk ); } // 6. Put the termination character AlgnS[k] = char(0); AlgnT[k] = char(0); // 7. Reverse the strings i = 0; j = k-1; if (StopAtZero) { // should work only for local alignment while ((j>0) && ((AlgnS[j]==Space) || (AlgnT[j]==Space))) j--; k = j+1; AlgnS[k] = char(0); AlgnT[k] = char(0); } while (j>i) { C = AlgnS[i]; AlgnS[i] = AlgnS[j]; AlgnS[j] = C; C = AlgnT[i]; AlgnT[i] = AlgnT[j]; AlgnT[j] = C; i++; j--; } // 8. Collapse the alternating spaces do { k = 0; i = 0; while (AlgnS[k]) { if ((AlgnS[k]==Space) && (AlgnT[k]==Space)) k++; else if ((AlgnS[k]==Space) && (AlgnS[k+1]!=Space) && (AlgnT[k]!=Space) && (AlgnT[k+1]==Space)) { AlgnS[i] = AlgnS[k+1]; AlgnT[i] = AlgnT[k]; k++; } else if ((AlgnS[k]!=Space) && (AlgnS[k+1]==Space) && (AlgnT[k]==Space) && (AlgnT[k+1]!=Space)) { AlgnS[i] = AlgnS[k]; AlgnT[i] = AlgnT[k+1]; k++; } else if (i!=k) { AlgnS[i] = AlgnS[k]; AlgnT[i] = AlgnT[k]; } if (AlgnS[k]) { k++; i++; } } if (i!=k) { // terminating character AlgnS[i] = AlgnS[k]; AlgnT[i] = AlgnT[k]; } } while (k>i); } void CAlignment::AdjustEnds ( cpstr S, cpstr T, int J, int I ) { int si,ti,m; if (JI) { k = J-I; strcat ( AlgnT,&(T[IMax(0,TLen-k)]) ); k = strlen ( AlgnS ); m = strlen ( AlgnT ); while (kJ) { k = I-J; strcat ( AlgnS,&(S[IMax(0,SLen-k)]) ); k = strlen ( AlgnT ); m = strlen ( AlgnS ); while (k=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteLine ( pstr(" String T:") ); f.Write ( pstr(" ") ); l = 1; k = 0; while (T[k]) { P[0] = T[k++]; f.Write ( P ); l++; if (l>=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteParameter ( pstr(" Score equal") ,SEq ,20,10 ); f.WriteParameter ( pstr(" Score unequal"),SNEq,20,10 ); f.LF(); f.WriteParameter ( pstr(" Gap weight") ,Wg ,20,10 ); f.WriteParameter ( pstr(" Space weight") ,Ws ,20,10 ); f.LF(); f.LF(); f.Write ( pstr(" ======== RESULT OF ") ); switch (AlignKey) { default : case ALIGN_GLOBAL : f.Write ( pstr("GLOBAL") ); break; case ALIGN_LOCAL : f.Write ( pstr("LOCAL") ); break; case ALIGN_GLOBLOC : f.Write ( pstr("GLOBAL/LOCAL") ); break; case ALIGN_FREEENDS : f.Write ( pstr("FREE-ENDS") ); } f.WriteLine ( pstr(" ALIGNMENT") ); f.LF(); if (AlignKey==ALIGN_GLOBLOC) { f.WriteLine ( pstr(" End gaps in T-string were not penalized") ); f.LF(); } f.WriteParameter ( pstr(" Highest score achieved:"),VAchieved,26,10 ); f.LF(); f.WriteLine ( pstr(" Aligned S (upper string) and T (lower string):") ); f.LF(); k = 0; n = 0; l = 1; f.Write ( pstr(" ") ); while (AlgnS[k]) { P[0] = AlgnS[k++]; f.Write ( P ); l++; if ((l>=WrapPeriod) || (!AlgnS[k])) { f.LF(); f.Write ( pstr(" ") ); l = 1; while (AlgnT[n] && (lVAchieved) { VAchieved = VT[i][j]; i0 = i; j0 = j; } Backtrace ( S,T,j0,i0,True ); break; case ALIGN_GLOBLOC : // global alignment with non-penalized // end gaps in T BuildGATable ( S,T,False,True ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } Backtrace ( S,T,j0,i0,False ); AdjustEnds ( S,T,j0,i0 ); break; case ALIGN_FREEENDS : // global alignment with non-penalized // end gaps in both S and T BuildGATable ( S,T,True,True ); VAchieved = -MaxReal; i0 = -1; j0 = -1; for (i=0;i<=TLen;i++) if (VT[i][SLen]>VAchieved) { VAchieved = VT[i][SLen]; i0 = i; j0 = SLen; } for (j=0;j<=SLen;j++) if (VT[TLen][j]>VAchieved) { VAchieved = VT[TLen][j]; i0 = TLen; j0 = j; } Backtrace ( S,T,j0,i0,False ); AdjustEnds ( S,T,j0,i0 ); } } void CAlignment1::BuildGATable ( ivector S, ivector T, Boolean FreeSEnd, Boolean FreeTEnd ) { int i,j; realtype V1; GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions if (FreeSEnd || FreeTEnd) VT[0][0] = RMax(0.0,Wg); else VT[0][0] = Wg; ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; if (FreeTEnd) for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } else for (i=1;i<=TLen;i++) { V1 = VT[i-1][0] + Ws; VT[i][0] = V1; ET[i][0] = V1; } if (FreeSEnd) for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } else for (j=1;j<=SLen;j++) { V1 = VT[0][j-1] + Ws; VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),FT[i][j] ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void CAlignment1::BuildLATable ( ivector S, ivector T ) { int i,j; realtype V1; GetMatrixMemory ( VT,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( ET,TLen+1,SLen+1,0,0 ); GetMatrixMemory ( FT,TLen+1,SLen+1,0,0 ); // Base conditions VT[0][0] = RMax ( 0.0,Wg ); ET[0][0] = VT[0][0]; FT[0][0] = VT[0][0]; for (i=1;i<=TLen;i++) { V1 = RMax ( 0.0,VT[i-1][0]+Ws ); VT[i][0] = V1; ET[i][0] = V1; } for (j=1;j<=SLen;j++) { V1 = RMax ( 0.0,VT[0][j-1]+Ws ); VT[0][j] = V1; FT[0][j] = V1; } // Recurrence for (i=1;i<=TLen;i++) for (j=1;j<=SLen;j++) { V1 = VT[i-1][j-1] + Score(T[i-1],S[j-1]); ET[i][j] = RMax ( ET[i][j-1]+Ws,VT[i][j-1]+Wg+Ws ); FT[i][j] = RMax ( FT[i-1][j]+Ws,VT[i-1][j]+Wg+Ws ); VT[i][j] = RMax ( RMax(V1,ET[i][j]),RMax(0.0,FT[i][j]) ); } FreeMatrixMemory ( ET,TLen+1,0,0 ); FreeMatrixMemory ( FT,TLen+1,0,0 ); // PrintVT ( S,T ); } void CAlignment1::PrintVT ( ivector S, ivector T ) { int i,j; printf ( "\n " ); for (j=0;j<=SLen;j++) printf ( " %2i",j ); printf ( " \n " ); for (j=1;j<=SLen;j++) printf ( " %3i ",S[j-1] ); printf ( " \n\n " ); for (i=0;i<=TLen;i++) { if (i>0) printf ( " %2i %3i ",i,T[i-1] ); else printf ( " %2i ",i ); for (j=0;j<=SLen;j++) printf ( " %2i",mround(VT[i][j]) ); printf ( " \n " ); } printf ( " \n" ); } void CAlignment1::Backtrace ( ivector S, ivector T, int J, int I, Boolean StopAtZero ) { int i,j,k, i1,j1, sk,tk; int C; realtype V,SV,TV; Boolean Stop; // 1. Allocate memory FreeVectorMemory ( AlgnS,0 ); FreeVectorMemory ( AlgnT,0 ); AlgnLen = 0; k = SLen+TLen+1; GetVectorMemory ( AlgnS,k,0 ); GetVectorMemory ( AlgnT,k,0 ); for (i=0;i0) && (j>0)) { V = VT[i][j]; // find next leading element if (VT[i][j-1]>VT[i-1][j]) { i1 = i; j1 = j-1; } else { i1 = i-1; j1 = j; } if (VT[i-1][j-1]>=VT[i1][j1]) { i1 = i-1; j1 = j-1; } Stop = StopAtZero && (VT[i1][j1]<=0.0); // used at local alignment // treat horizontal section if ((sk<0) || (V>SV)) { sk = k; SV = V; } if ((j1!=j) || Stop) { // end of horizontal section AlgnS[sk] = S[j-1]; sk = -1; } // treat vertical section if ((tk<0) || (V>TV)) { tk = k; TV = V; } if ((i1!=i) || Stop) { // end of vertical section AlgnT[tk] = T[i-1]; tk = -1; } i = i1; j = j1; k++; } if (!StopAtZero) { // 4. Finish the last horizontal section sk = k; while (j>0) AlgnS[k++] = S[--j]; // 5. Finish the last vertical section while (i>0) AlgnT[sk++] = T[--i]; k = IMax ( k,sk ); } // 6. Put the termination character AlgnLen = k; // 7. Reverse the strings i = 0; j = k-1; if (StopAtZero) { // should work only for local alignment while ((j>0) && ((AlgnS[j]==Space) || (AlgnT[j]==Space))) j--; AlgnLen = j+1; } while (j>i) { C = AlgnS[i]; AlgnS[i] = AlgnS[j]; AlgnS[j] = C; C = AlgnT[i]; AlgnT[i] = AlgnT[j]; AlgnT[j] = C; i++; j--; } // 8. Filter out parasite spaces k = 0; i = 0; while (ki); } void CAlignment1::AdjustEnds ( ivector S, ivector T, int J, int I ) { int is,it; is = J; it = I; while ((is=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteLine ( pstr(" String T:") ); f.Write ( pstr(" ") ); l = 1; k = 0; while (k=WrapPeriod) { f.LF(); f.Write ( pstr(" ") ); l = 1; } } f.LF(); f.LF(); f.WriteParameter ( pstr(" Score equal") ,SEq ,20,10 ); f.WriteParameter ( pstr(" Score unequal"),SNEq,20,10 ); f.LF(); f.WriteParameter ( pstr(" Gap weight") ,Wg ,20,10 ); f.WriteParameter ( pstr(" Space weight") ,Ws ,20,10 ); f.LF(); f.LF(); f.Write ( pstr(" ======== RESULT OF ") ); switch (AlignKey) { default : case ALIGN_GLOBAL : f.Write ( pstr("GLOBAL") ); break; case ALIGN_LOCAL : f.Write ( pstr("LOCAL") ); break; case ALIGN_GLOBLOC : f.Write ( pstr("GLOBAL/LOCAL") ); break; case ALIGN_FREEENDS : f.Write ( pstr("FREE-ENDS") ); } f.WriteLine ( pstr(" ALIGNMENT") ); f.LF(); if (AlignKey==ALIGN_GLOBLOC) { f.WriteLine ( pstr(" End gaps in T-string were not penalized") ); f.LF(); } f.WriteParameter ( pstr(" Highest score achieved:"), VAchieved,26,10 ); f.LF(); f.WriteLine ( pstr(" Aligned S (upper string) and T " "(lower string):") ); f.LF(); k = 0; n = 0; l = 1; f.Write ( pstr(" ") ); while (k=WrapPeriod) || (!AlgnS[k])) { f.LF(); f.Write ( pstr(" ") ); l = 1; while ((n // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CMask ( atom selection mask ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MMDB_Mask__ #include "mmdb_mask.h" #endif // ==================== CMask ======================== CMask::CMask() : CStream() { InitMask(); } CMask::CMask ( RPCStream Object ) : CStream(Object) { InitMask(); } CMask::~CMask() { ClearMask(); } void CMask::InitMask() { mlen = 0; m = NULL; } void CMask::SetMaskBit ( int BitNo ) { int n,i; n = BitNo/(8*sizeof(word)); Expand ( n+1 ); i = BitNo - n*(8*sizeof(word)); m[n] |= ((word)1 << i); } void CMask::Expand ( int n ) { wvector m1; int i; if (mlen0)) { nlen = 0; w = 0; while (w==0) { for (i=0;imlen) w |= Mask[i]->m[nlen]; } nlen++; w = ~w; } Expand ( nlen ); i = nlen-1; m[i] = 1; while (!(m[i] & w)) m[i] <<= 1; } else { Expand ( 1 ); m[0] = 1; } } void CMask::CopyMask ( PCMask Mask ) { int i; if (mlen!=Mask->mlen) ClearMask(); if (Mask) { mlen = Mask->mlen; if (mlen>0) { m = new word[mlen]; for (i=0;im[i]; } } } void CMask::SetMask ( PCMask Mask ) { int i; if (Mask) { Expand ( Mask->mlen ); for (i=0;imlen;i++) m[i] |= Mask->m[i]; } } void CMask::RemoveMask ( PCMask Mask ) { int i,l; if (Mask) { l = IMin(mlen,Mask->mlen); for (i=0;im[i]; } } void CMask::SelMask ( PCMask Mask ) { int i,l; if (Mask) { l = IMin(mlen,Mask->mlen); for (i=0;im[i]; for (i=l;imlen ); for (i=0;imlen;i++) m[i] ^= Mask->m[i]; } } void CMask::ClearMask() { if (m) delete[] m; m = NULL; mlen = 0; } void CMask::NegMask() { int i; for (i=0;imlen); while ((im[i]))) i++; return (i0) { m = new word[mlen]; for (i=0;i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CXMLObject // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_XML__ #define __MMDB_XML__ #ifndef __MMDB_MMCIF__ #include "mmdb_mmcif.h" #endif // ====================== CXMLObject ========================== #define XMLR_Ok 0 #define XMLR_NoFile 1 #define XMLR_NoTag 2 #define XMLR_BrokenTag 3 #define XMLR_UnclosedTag 4 DefineClass(CXMLObject) DefineStreamFunctions(CXMLObject) class CXMLObject : public CStream { public : CXMLObject (); CXMLObject ( cpstr Tag ); CXMLObject ( cpstr Tag, cpstr Data ); CXMLObject ( cpstr Tag, realtype V, int length=11 ); CXMLObject ( cpstr Tag, int iV, int length=0 ); CXMLObject ( cpstr Tag, Boolean bV ); CXMLObject ( cpstr Tag, PCXMLObject XMLObject ); CXMLObject ( RPCStream Object ); ~CXMLObject(); void SetTag ( cpstr Tag ); void SetData ( cpstr Data ); void AddData ( cpstr Data ); void SetData ( realtype V, int length=11 ); void SetData ( int iV, int length=0 ); void SetData ( Boolean bV ); int AddMMCIFCategory ( PCMMCIFCategory mmCIFCat ); int AddMMCIFStruct ( PCMMCIFStruct mmCIFStruct ); int AddMMCIFLoop ( PCMMCIFLoop mmCIFLoop ); int AddMMCIFData ( PCMMCIFData mmCIFData ); pstr GetTag () { return objTag; } // Here and below the functions allow for "tag1>tag2>tag3>..." // as a composite multi-level tag, e.g. the above may stand for // data. NULL tag // corresponds to "this" object. // objNo counts same-tag objects of the *highest* level used // (e.g. level tag3 for composite tag tag1>tag2>tag3 ). // GetData ( pstr& ... ) only copies a pointer to data. pstr GetData ( cpstr Tag=NULL, int objNo=1 ); int GetData ( pstr & Data, cpstr Tag=NULL, int objNo=1 ); int GetData ( realtype & V, cpstr Tag=NULL, int objNo=1 ); int GetData ( int & iV, cpstr Tag=NULL, int objNo=1 ); int GetData ( Boolean & bV, cpstr Tag=NULL, int objNo=1 ); PCXMLObject GetObject ( cpstr Tag, int objNo=1 ); void AddObject ( PCXMLObject XMLObject, int lenInc=10 ); int WriteObject ( cpstr FName, int pos=0, int ident=2 ); void WriteObject ( RCFile f, int pos=0, int ident=2 ); int ReadObject ( cpstr FName ); int ReadObject ( RCFile f, pstr S, int & pos, int slen ); virtual void Copy ( PCXMLObject XMLObject ); void write ( RCFile f ); void read ( RCFile f ); protected: pstr objTag; pstr objData; int nObjects,nAlloc; PPCXMLObject object; void InitXMLObject(); virtual void FreeMemory (); }; extern PCXMLObject mmCIF2XML ( PCMMCIFData mmCIFData, int * rc=NULL ); extern PCXMLObject mmCIF2XML ( cpstr XMLName, PCMMCIFFile mmCIFFile, int * rc=NULL ); #endif mmdb-1.23.2.1/src/random_n.cpp0000644000175100017510000001246211475665502012710 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 05.02.03 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Random_N // ~~~~~~~~~ // **** Classes : CRandomNimber ( random number generator ) // ~~~~~~~~~ // // (C) E. Krissinel' 1997-2008 // // ================================================================= // #ifndef __MATH_H #include #endif #ifndef __Random_N__ #include "random_n.h" #endif // =================== CRandomNumber ========================== CRandomNumber::CRandomNumber ( long IJ, long KL ) { Init ( IJ,KL ); } void CRandomNumber::Init ( long IJ, long KL ) { long i,j,k,l,m, ii,jj; realtype s,t; iset = 0; gset = 0.0; if ((IJ<0) || (IJ>_RN_MAX_IJ) || (KL<0) || (KL>_RN_MAX_KL)) return; i = mod(IJ/177,177) + 2; j = mod(IJ,177) + 2; k = mod(KL/169,178) + 1; l = mod(KL,169); for (ii=0;ii<97;ii++) { s = 0.0; t = 0.5; for (jj=1;jj<=24;jj++) { m = mod(mod(i*j,179)*k,179); i = j; j = k; k = m; l = mod(53*l+1,169); if (mod(l*m,64)>=32) s += t; t *= 0.5; } U[ii] = s; } C = 362436.0 / 16777216.0; CD = 7654321.0 / 16777216.0; CM = 16777213.0 / 16777216.0; I97 = 96; J97 = 32; } // uniform [0..1] random number generator realtype CRandomNumber::random() { realtype uni; uni = U[I97] - U[J97]; if (uni<0.0) uni += 1.0; U[I97] = uni; I97--; if (I97<0) I97 = 96; J97--; if (J97<0) J97 = 96; C -= CD; if (C<0.0) C += CM; uni -= C; if (uni<0.0) uni += 1.0; return uni; } // uniform [-1..1] random number generator realtype CRandomNumber::srandom() { realtype uni; uni = U[I97] - U[J97]; if (uni<0.0) uni += 1.0; U[I97] = uni; I97--; if (I97<0) I97 = 96; J97--; if (J97<0) J97 = 96; C -= CD; if (C<0.0) C += CM; uni -= C; if (uni<0.0) uni += 1.0; return 2.0*uni - 1.0; } // gaussian random numbers realtype CRandomNumber::gauss_rnd() { realtype v1,v2,r,fac; if (iset==0) { do { v1 = srandom(); v2 = srandom(); r = v1*v1 + v2*v2; } while ((r>=1.0) || (r==0.0)); fac = sqrt(-2.0*log(r)/r); gset = v1*fac; iset = 1; return v2*fac; } else { iset = 0; return gset; } } void CRandomNumber::write ( RCFile f ) { int Version=1; f.WriteFile ( &Version,sizeof(Version) ); f.WriteFile ( &I97 ,sizeof(I97) ); f.WriteFile ( &J97 ,sizeof(J97) ); f.WriteFile ( U ,sizeof(U) ); f.WriteFile ( &C ,sizeof(C) ); f.WriteFile ( &CD ,sizeof(CD) ); f.WriteFile ( &CM ,sizeof(CM) ); f.WriteFile ( &gset ,sizeof(gset) ); f.WriteFile ( &iset ,sizeof(iset) ); } void CRandomNumber::read ( RCFile f ) { int Version; f.ReadFile ( &Version,sizeof(Version) ); f.ReadFile ( &I97 ,sizeof(I97) ); f.ReadFile ( &J97 ,sizeof(J97) ); f.ReadFile ( U ,sizeof(U) ); f.ReadFile ( &C ,sizeof(C) ); f.ReadFile ( &CD ,sizeof(CD) ); f.ReadFile ( &CM ,sizeof(CM) ); f.ReadFile ( &gset ,sizeof(gset) ); f.ReadFile ( &iset ,sizeof(iset) ); } /* static int m1 = 259200; static int ia1 = 7141; static int ic1 = 54773; static realtype rm1 = 1.0/259200.0; static int m2 = 134456; static int ia2 = 8121; static int ic2 = 28411; static realtype rm2 = 1.0/134456.0; static int m3 = 243000; static int ia3 = 4561; static int ic3 = 51349; static int ix1 = 0; static int ix2 = 0; static int ix3 = 0; static realtype R[97]; void randomize ( int iseed ) { int j; RndInit = True; ix1 = mod(ic1-iseed,m1); ix1 = mod(ia1*ix1+ic1,m1); ix2 = mod(ix1,m2); ix1 = mod(ia1*ix1+ic1,m1); ix3 = mod(ix1,m3); for (j=0;j<97;j++) { ix1 = mod(ia1*ix1+ic1,m1); ix2 = mod(ia2*ix2+ic2,m2); R[j] = (ix1+ix2*rm2)*rm1; } } realtype rand() { int j; realtype rnd; if (!RndInit) randomize(); ix1 = mod(ia1*ix1+ic1,m1); ix2 = mod(ia2*ix2+ic2,m2); ix3 = mod(ia3*ix3+ic3,m3); j = 1 + (97*ix3)/m3; j = IMax(j,1); j = IMin(j,97); rnd = R[j-1]; R[j] = (ix1+ix2*rm2)*rm1; return rnd; } */ // =========================================================== // End of Random_N mmdb-1.23.2.1/src/mmdb_sbase0.h0000644000175100017510000007047211475666364012750 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_sbase0 // ~~~~~~~~~ // **** Classes : CSBase0 ( structure base manager 0 ) // ~~~~~~~~~ CSBAtom ( SB atom class ) // CSBBond ( SB bond class ) // CSBStructure ( SB structure (monomer) class ) // CSBIndex ( SB index class ) // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_SBase0__ #define __MMDB_SBase0__ #ifndef __MMDB_Manager__ #include "mmdb_manager.h" #endif #ifndef __MMDB_Graph__ #include "mmdb_graph.h" #endif // ================================================================= // -- oracle data field lengths #define compoundID_len 10 #define formula_len 1000 #define charge_len 5000 #define name_len 1000 #define synonym_len 1000 #define sca_name_len 20 #define pdb_name_len 20 #define element_len 5 #define sca_leaving_atom_len 3 #define chirality_len 1 #define scb_bond_order_len 10 #define energy_type_len 8 typedef char CompoundID [compoundID_len+1]; typedef char SBPDBName [pdb_name_len+1]; typedef char SBElementName[element_len+1]; // -- names for graph files #define sbIndexFile cpstr("index.sbase") #define sbGraphFile cpstr("graph.sbase") #define sbStructFile cpstr("struct.sbase") // ====================== SB Atom Class ========================= DefineClass(CSBAtom) class CSBAtom : public CStream { public : char sca_name [sca_name_len+1]; // SCA atom name char pdb_name [pdb_name_len+1]; // PDB atom name (aligned) char old_pdb_name[pdb_name_len+1]; // old PDB atom name (aligned) char element [element_len+1]; // chemical element (aligned) char energyType[energy_type_len+1]; // energy type; set to empty // string "" if not provided realtype x,y,z; // cartesian coordinates; set // to -MaxReal if not provided realtype x_esd,y_esd,z_esd; // ESDs for cartesian coordi- // nates; set to 0.0 if not // provided realtype ccp4_charge; // atom charge from ccp4 libs realtype sca_charge; // formal atom charge (MSD) realtype partial_charge; // partial atom charge (MSD) realtype vdw_radius; // Van-der-Waals radius realtype vdwh_radius; // Van-der-Waals radius with // hydrogen realtype ion_radius; // ion radius int valency; // valency char chirality; // chirality: 'R', 'S' or 'N' char leaving; // leaving atom: 'Y' or 'N' char hb_type; // hydrogen bond type: // 'D' donor // 'A' acceptor // 'B' both // 'H' hydrogen candidate // 'N' neither CSBAtom (); CSBAtom ( RPCStream Object ); ~CSBAtom(); void makeCAtom ( RPCAtom a ); PCAtom makeCAtom (); virtual void Copy ( PCSBAtom A ); void read ( RCFile f ); void write ( RCFile f ); protected : void SBAtomInit(); }; DefineStreamFunctions(CSBAtom) // ======================= SB Bond Class ======================== DefineClass(CSBBond) class CSBBond : public CStream { public : int atom1,atom2,order; // bonded atoms ordinal numbers in // reference to the atom array in // CSBStructure; atom1 and atom2 // number atoms like 1,2 on; these // fields are always provided realtype length,length_esd; // bond length in A and its esd; // set to 0.0 if not provided by // data base CSBBond (); CSBBond ( RPCStream Object ); ~CSBBond(); void SetBond ( int at1, int at2, int ord ); virtual void Copy ( PCSBBond B ); void read ( RCFile f ); void write ( RCFile f ); protected : void SBBondInit(); }; DefineStreamFunctions(CSBBond) // ======================= SB Angle Class ======================= DefineClass(CSBAngle) class CSBAngle : public CStream { public : int atom1,atom2,atom3; // number atoms like 1,2 on; always // provided realtype angle,angle_esd; // angle is always provided; esd // is set to 0.0 if not provided CSBAngle (); CSBAngle ( RPCStream Object ); ~CSBAngle(); virtual void Copy ( PCSBAngle G ); void read ( RCFile f ); void write ( RCFile f ); protected : void SBAngleInit(); }; DefineStreamFunctions(CSBAngle) // ====================== SB Torsion Class ====================== DefineClass(CSBTorsion) class CSBTorsion : public CStream { public : int atom1,atom2,atom3,atom4; // number atoms like 1,2 on; // always provided realtype torsion,torsion_esd; // torsion is always provided; // esd is set to 0.0 if not provided CSBTorsion (); CSBTorsion ( RPCStream Object ); ~CSBTorsion(); virtual void Copy ( PCSBTorsion T ); void read ( RCFile f ); void write ( RCFile f ); protected : void SBTorsionInit(); }; DefineStreamFunctions(CSBTorsion) // ==================== Structure Class ========================= DefineClass(CSBStructure) class CSBStructure : public CStream { public : CompoundID compoundID; // CIF ID -- always provided pstr Formula; // NULL if not provided pstr Name; // NULL if not provided pstr Synonym; // NULL if not provided pstr Charge; // NULL if not provided // Atom, Bond, Angle and Torsion point on the vectors of // PCSBAtom[nAtoms], PCSBBond[nBonds], PCSBAngle[nAngles] and // PCSBTorsion[nTorsions], respectively. Not all of them may be // provided by the data base. If not provided, NULL is assigned. int nAtoms,nBonds,nAngles,nTorsions; PPCSBAtom Atom; // always provided PPCSBBond Bond; // report if not provided PPCSBAngle Angle; // NULL if not provided PPCSBTorsion Torsion; // NULL if not provided int nLeavingAtoms; ivector leavingAtom; ivector bondedAtom; char xyz_source; // 'A' for ACD coordinates, // 'R' for RCSB coordinates // 'P' for PDB coordinates // 'N' if xyz are not provided CSBStructure (); CSBStructure ( RPCStream Object ); ~CSBStructure(); void Reset (); void PutFormula ( cpstr F ); void PutName ( cpstr N ); void PutSynonym ( cpstr S ); void PutCharge ( cpstr G ); void AddAtom ( PCSBAtom atom ); void AddBond ( PCSBBond bond ); void MakeLeavingAtoms(); void AddAngle ( PCSBAngle angle ); void AddTorsion ( PCSBTorsion torsion ); void RemoveEnergyTypes(); int SetEnergyType ( cpstr sca_name, cpstr energyType, realtype partial_charge ); int GetAtomNo ( cpstr sca_name ); // returns 0 if atom not // found, >0 gives the atom ordinal number PCSBAtom GetAtom ( cpstr sca_name ); // GetAtomTable(..) does not deallocate atomTable! void GetAtomTable ( PPCAtom & atomTable, int & nOfAtoms ); // CheckAtoms() returns -1 if there is no atoms // -2 if not all atoms are annotated // -3 if not all coordinates are set // 0 otherwise int CheckAtoms(); // GetAtomNameMatch(..) returns anmatch[i], i=0..nAtoms-1, equal // to j such that name(Atom[i])==name(A[j]). Note that atom names // are similarly aligned and space-padded in both MMDB and SBase. // If ith atom in the structue is not found in A, anmatch[i] is // set -1. // If array A contains atoms in different alternative // conformations, the the value of altLoc is interpreted as // follows: // NULL - the highest occupancy atom will be taken // if all occupancies are equal then atom with // first altLoc taken // other - atoms with given altLoc are taken. If such // altLoc is not found, the function does as if // NULL value for altLoc is given. // A clean PDB file is anticipated, so that atoms with // alternative conformations are grouped together. // It is Ok to have NULL pointers in A. void GetAtomNameMatch ( PPCAtom A, int nat, pstr altLoc, ivector anmatch ); PCResidue makeCResidue ( Boolean includeHydrogens=False, Boolean makeTer=False ); int AddHydrogens ( PCResidue R ); virtual void Copy ( PCSBStructure S ); void read ( RCFile f ); void write ( RCFile f ); protected : int nAAlloc,nBAlloc,nGAlloc,nTAlloc; void SBStructureInit(); void FreeMemory (); }; DefineStreamFunctions(CSBStructure) // ==================== Index Class ============================== DefineClass(CSBIndex) class CSBIndex : public CStream { public : CompoundID compoundID; // CIF ID of the compound int nAtoms; // number of atoms in the compound int nBonds; // number of bonds in the compound int fGraphPos; // offset for CGraph int fStructPos; // offset for CSBStructure int loadPos; // load ordinal number, not in the file int nXTs; // total number of "XT"-atoms pstr Comp1; // composition string pstr Comp2; // composition string with leaving atom CSBIndex (); CSBIndex ( RPCStream Object ); ~CSBIndex(); int MakeCompositions ( PCSBStructure SBS ); void read ( RCFile f ); void write ( RCFile f ); protected : void SBIndexInit(); }; DefineStreamFunctions(CSBIndex) // ========================== CSBase0 ============================ extern int MakeChirInd ( char chirality ); extern int MakeElementType ( int ElType, int Chirality, Boolean Cflag ); extern int MakeElementType ( int ElType, char chirality, Boolean Cflag ); #define SBASE_noHBonds 6 #define SBASE_noDonors 5 #define SBASE_noAcceptors 4 #define SBASE_Incomplete 3 #define SBASE_AlreadyUnloaded 2 #define SBASE_AlreadyLoaded 1 #define SBASE_Ok 0 #define SBASE_FileNotFound -1 #define SBASE_StructNotFound -2 #define SBASE_WrongIndex -3 #define SBASE_ReadError -4 #define SBASE_ConnectivityError -5 #define SBASE_CheckFail -6 #define SBASE_NoAtomsFound -7 #define SBASE_NoBonds -8 #define SBASE_NoAtomData -9 #define SBASE_EmptyResidue -10 #define SBASE_NoSimilarity -11 #define SBASE_SuperpositionFailed -12 #define SBASE_Fail -13 #define SBASE_BrokenBonds -14 #define SBASE_EmptyResSet -15 #define SBASE_noCoordHierarchy -16 #define CMPLF_Hydrogens 0x00000001 #define CMPLF_nonHs 0x00000002 #define CMPLF_XT 0x00000004 #define CMPLF_All 0x00000007 // SDASelHandles is optionally used in MakeBonds(..), when // the latter works for hydrogen bond calculations. DefineStructure(SDASelHandles) struct SDASelHandles { int selHndDonor; int selHndAcceptor; int selHndHydrogen; int selKey; void getNewHandles ( PCMMDBManager MMDB ); void makeSelIndexes ( PCMMDBManager MMDB ); void deleteSelections ( PCMMDBManager MMDB ); }; DefineClass(CSBase0) class CSBase0 { public : CSBase0 (); ~CSBase0(); // LoadIndex() loads index of the structural database. 'path' // must point on the directory containing the database files. // The index must be loaded once before retrieving any // information from the database. // LoadIndex() may return either SBASE_Ok or SBASE_FileNotFound. int LoadIndex ( cpstr path ); int LoadIndex1 ( cpstr EnvVar ); // LoadStructure(..) reads structure from *.sbase files and // stores it in RAM for faster access. There is no special // functions to access loaded structures, all requests to // *.sbase files and RAM-storage are dispatched automatically. int LoadStructure ( cpstr compoundID ); // UnloadStructure(..) deletes strtucture from RAM and releases // its memory. The structure is then accessible in the normal // way from *.sbase files, which is slower. int UnloadStructure ( cpstr compoundID ); // GetPath() returns full path to a file with file name FName // in the database directory. Length of S should suffice for // accomodating the path. The function returns S. // GetPath() will work only after loading the database index. pstr GetPath ( pstr & S, cpstr FName ); // GetStructFile() creates and opens the database structure // file and returns its pointer. In the case of errors returns // NULL. Application is responsible for deleting this file. PCFile GetStructFile(); // GetGraphFile() creates and opens the database graph // file and returns its pointer. In the case of errors returns // NULL. Application is responsible for deleting this file. PCFile GetGraphFile(); // GetStructure(..) returns pointer to the monomer structure // identified by 3-letter compoundID. If such structure is not // found, the function returns NULL. // The function returns a pointer to a private copy of the // structure. Modifying it will not change data in the structural // database. The application is responsible for deallocating // the structure after use (simply use delete). // See description of CSBStructure for the explanation of // its fields. PCSBStructure GetStructure ( cpstr compoundID ); PCSBStructure GetStructure ( int structNo, PCFile structFile ); // 0...nStructures-1 // Another form of GetStructure(..) uses an open structure // file, which allows to save on opening/closing file if // multiple access to SBase structures is required. The file // is neither open nor closed by the function PCSBStructure GetStructure ( cpstr compoundID, PCFile structFile ); PCResidue makeCResidue ( cpstr compoundID, PCFile structFile, Boolean includeHydrogens=False, Boolean makeTer=False ); PCResidue makeCResidue ( int structNo, PCFile structFile, Boolean includeHydrogens=False, Boolean makeTer=False ); // GetGraph(..) retrieves data for chemical structure number // structNo (as described in Index) from graph file graphFile, // then allocates and builds the corresponding graph, which is // returned in G. // If Hflag is set >= 1, all hydrogens are removed from // the graph. If Hflag is set to 2, element types of atoms, // to which hydrogens are bonded, are modified with flag // HYDROGEN_BOND. // Returns SBASE_Ok in case of success. Other return code are // SBASE_WrongIndex and SBASE_ReadError. int GetGraph ( PCFile graphFile, int structNo, RPCGraph G, int Hflag ); int GetGraph ( PCFile graphFile, RPCGraph G, int Hflag ); int GetGraph ( int structNo , RPCGraph G, int Hflag ); int GetGraph ( cpstr compoundID, RPCGraph G, int Hflag ); // GetStructNo() returns position of the structure with // (3-letter) name 'name' as found in the database index. // Non-negative return means success, otherwise // SBASE_StructNotFound indicates that the requested structure // was not found in the database index. int GetStructNo ( cpstr compoundID ); int GetNofAtoms ( cpstr compoundID ); int GetNofAtoms ( int structNo ); // GetNofStructures() returns number of structures in the // database index. int GetNofStructures() { return nStructures; } // CheckGraph(..) checks graph G against a same-name // structure in the database. The name must be passed in // G->name as a standard 3-letter code. // If Hflag is set >= 1, all hydrogens are removed from // the graph. If Hflag is set to 2, element types of atoms, // to which hydrogens are bonded, are modified with flag // HYDROGEN_BOND. // If Cflag is set to True, then chirality information is // assumed in the input graph G and it is used for the // checking. If Cflag is set to False, then chirality // information is neither assumed nor used for the checking. // If chirality is there, all element IDs in the graph are // assigned flag CHIRAL_RIGHT for 'R'-chirtality, CHIRAL_LEFT // for 'S'-chirality and no flag if the atom is not a chiral // center. // If a same-name structure is found in the database, // the function returns the number of matched vertices // (nMatched) from those found in the database (nInStructure). // The correspondence between the input and database graphs // is returned in array match (it should be of sufficient // length) such that ith vertex of input graph corresponds // to the match[i]th vertex of the database graph. The // function then returns SBASE_Ok if the number of matched // vertices coincides with nInStructure and nMatched, and // the return is SBASE_CheckFail otherwise. // If a same-name structure is not found, the function // returns SBASE_StructNotFound or SBASE_FileNotFound. int CheckGraph ( PCGraph G, int Hflag, Boolean Cflag, int & nInStructure, int & nMatched, ivector match, int minMatchSize=0 ); // In the current implementation of CheckResidue, Cflag // must be always set False, as the chirality information // cannot be calculated (in this version) from 3D coordinates. // See the meaning of altLoc in mmdb_graph.h, other parameters // are the same as in CheckGraph(..) above. int CheckResidue ( PCResidue R, int Hflag, Boolean Cflag, int & nInResidue, int & nInStructure, int & nMatched, ivector match, cpstr altLoc=pstr(""), int minMatchSize=0 ); // MakeBonds(..) makes bonds between atoms in MMDB's residue R // from data found in SBase. Residue R must be associated with // coordinate hierarchy. Data is retrieved from SBase on the basis // of residue name only. In case of multiple conformations, if // altLoc: // NULL - the highest occupancy atom will be taken // if all occupancies are equal then atom with // first altLoc taken // other - atoms with given altLoc are taken. If such // altLoc is not found, the function does as if // NULL value for altLoc is given. // If selHandles is not NULL, the function also selects atoms // in the residue according to their hydrogen bond attributes. // This is a special option for hydrogen bond calculations // If ignoreNegSigOcc is set True then the function will ignore // atoms with negative occupancy standard deviation. Such atoms // may be hydrogens added by CSBase0::AddHydrogen(..) function, // in general any atoms added by CSBAtom::MakeCAtom(..) function. // Added hydrogens may be ignored if MakeBonds is used in // CSbase::CalcHBonds(..) function. // Return: // SBASE_Ok success // SBASE_FileNotFound non-initiated SBase // SBASE_StructNotFound the residue's name is not found // in SBase // SBASE_EmptyResidue residue R does not contain atoms // SBASE_NoAtomsFound SBase entry does not contain atoms // SBASE_BrokenBonds some bonds could not be set up because // of missing atoms in R. This could be // a result of residue R named wrongly. int MakeBonds ( PCResidue R, pstr altLoc, PCFile structFile, PSDASelHandles selHandles, Boolean ignoreNegSigOcc ); int GetEnergyTypes ( PCResidue R, PCFile structFile ); int GetEnergyTypes ( PPCResidue R, int nRes, PCFile structFile ); int GetEnergyTypes ( PCChain chain, PCFile structFile ); int GetEnergyTypes ( PCModel model, PCFile structFile ); int GetEnergyTypes ( PCMMDBManager MMDB, PCFile structFile ); int AddHydrogens ( PCResidue R, PCFile structFile ); int AddHydrogens ( PCChain chain, PCFile structFile ); int AddHydrogens ( PCModel model, PCFile structFile ); int AddHydrogens ( PCMMDBManager MMDB, PCFile structFile ); // ComplementResidue(..) extracts data from SBase by residue // name, then superposes atoms having identical names and // adds the residue with atoms that are found in SBase but are // absent in the residue. The added atoms are rotated and // translated such as to comply with the superposed parts. // complFlag: // CMPLF_Hydrogens complement residue with hydrogens // CMPLF_nonHs complement residue with non-hydrogens // CMPLF_XT complement with C-terminus // Return: // SBASE_Ok success // SBASE_FileNotFound SBase is not initialized // SBASE_StructNotFound the residue's name is not found // in SBase // SBASE_EmptyResidue residue R does not contain atoms // SBASE_NoAtomsFound SBase entry does not contain atoms // SBASE_NoAtomsData SBase entry is not complete // SBASE_NoSimilarity too few coomon atom names in R // and SBase entry with the same // structure name // SBASE_SuperpositionFailed failed residue superposition // NOTE: the function rearranges ALL atoms in the residue according // to PDB order as written in SBase. int ComplementResidue ( PCResidue R, int complFlag, PCFile structFile=NULL ); // The following will return // SBASE_Ok success // SBASE_FileNotFound SBase is not initialized // SBASE_Incomplete some residues were not fully completed // (warning) // SBASE_Fail no residues were completed int ComplementChain ( PCChain chain, int complFlag, PCFile structFile=NULL ); int ComplementModel ( PCModel model, int complFlag, PCFile structFile=NULL ); int ComplementFile ( PCMMDBManager MMDB, int complFlag, PCFile structFile=NULL ); // GetAtomNames(...) returns atom names (AtName[i]), total // number of atoms (nAtoms) and number of hydrogens (nH) for // structure number structNo, as found in the database index. // Length of AtName should allow for accomodating all atom // names. // The function may return SBASE_Ok, SBASE_FileNotFound, // SBASE_WrongIndex and SBASE_ReadError. int GetAtNames ( int structNo, PAtomName AtName, int & nAtoms, int & nH ); // GetAtomNames(RCFile..) works exactly like its overload // version above, however it allows to save time on reopening // the database's description file (structFile). The file // reference, passed to the function, should be associated with // opened description file. The function does not close the file. // The function may return SBASE_Ok, SBASE_WrongIndex and // SBASE_ReadError. int GetAtNames ( PCFile structFile, int structNo, PAtomName AtName, int & nAtoms, int & nH ); // GetNofAtoms(..) returns number of non-hydrogen atoms // (nNonHAtoms) and number of hydrogens (nHAtoms) for structure // number structNo, as found in the database index. // The function may return SBASE_Ok or SBASE_WrongIndex. int GetNofAtoms ( int structNo, int & nNonHAtoms, int & nHAtoms ); // GetAtoms(...) retrieves the number of non-hydrogen atoms // (nNonHAtoms), their names (NonHAtName), number of hydrogens // (nHAtoms) and their names (HAtName), hydrogens' connectivity // to non-hydrogen atoms (Hconnect), element IDs (Elem) and // chiralities (Chiral) for structure named 'name'. // Hydrogen HAtName[i] is connected to non-hydrogen atom // NonHAtom[Hconnect[i]], if Hconnect[i]>=0. // The function may return SBASE_Ok, SNASE_StructNotFound, // SBASE_FileNotFound, SBASE_ReadError, SBASE_ConnectivityError. int GetAtoms ( cpstr compoundID, int & nNonHAtoms, PAtomName NonHAtName, int & nHAtoms, PAtomName HAtName, ivector Hconnect, ivector Elem, ivector Chiral ); // GetAtoms(...) retrieves the number of atoms (nAtoms) and // number of bonds (nBonds[i]) and connectivity (bondPair[i][j]) // for all atoms in the structure named 'name'. bondPair[i][j], // 0<=i // ~~~~~~~~~ // **** Functions : GetTorsion // ~~~~~~~~~~~ GetAngle // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __Math__ #define __Math__ #ifndef __MatType__ #include "mattype_.h" #endif // ------------------------------------------------------------------ #define NO_TORSION (-MaxReal) // U[0,1,2] = x,y,z extern realtype GetTorsion ( rvector U, rvector W, rvector V ); extern realtype GetAngle ( rvector U, rvector V ); // Calculates the binomial coefficient n choose m, 0<=n<=500, 0<=m<=n extern realtype Combinations ( int n, int m ); // Calculates precisely log(1-x) for x<1, including very small x extern realtype log1mx ( realtype x ); // Calculates precisely 1 - exp(x) for any x including very small values extern realtype expc ( realtype x ); // Calculates precisely 1-(1-x)**y including very small x and very large y extern realtype expc1mx ( realtype x, realtype y ); #endif mmdb-1.23.2.1/src/file_.cpp0000644000175100017510000012441611475666363012202 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : file_ // ~~~~~~~~~ // **** Classes : CFile - file I/O Support. // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STDLIB_H #include #endif #ifdef _WIN32 # include # define sleep Sleep # endif #ifndef __STDIO_H #include #endif #ifndef __STRING_H #include #endif #ifndef _WIN32 #ifndef __UNISTD_H #include #endif #endif #ifndef __File__ #include "file_.h" #endif #ifdef _WIN32 // for DOS/WINDOWS machines: #define NEWLINE "\r\n" #else // for UNIX machines: #define NEWLINE "\n" #endif // =================== Auxilary Functions ========================= cpstr GetFPath ( pstr FilePath, int syskey ) { pstr P; P = NULL; // may be undefined if syskey is not recognized if (syskey==syskey_unix) P = strrchr(FilePath,'/'); else if (syskey==syskey_win) P = strrchr(FilePath,'\\'); else if (syskey==syskey_all) { P = strrchr(FilePath,'/'); if (!P) P = strrchr(FilePath,'\\'); } if (P) { P = P + 1; *P = char(0); } else FilePath[0] = char(0); return FilePath; } cpstr GetFName ( cpstr FilePath, int syskey ) { pstr P; P = NULL; // may be undefined if syskey is not recognized if (syskey==syskey_unix) P = strrchr(FilePath,'/'); else if (syskey==syskey_win) P = strrchr(FilePath,'\\'); else if (syskey==syskey_all) { P = strrchr(FilePath,'/'); if (!P) P = strrchr(FilePath,'\\'); } if (!P) return FilePath; else return P + 1; } cpstr GetFExt ( cpstr FilePath ) { pstr P; P = strchr ( GetFName(FilePath),'.'); if (!P) return &(FilePath[strlen(FilePath)]); else return P; } cpstr ChangeExt ( pstr FilePath, cpstr newExt, int syskey ) { int i; i = strlen(FilePath)-1; if (syskey==syskey_unix) while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='/')) i--; else if (syskey==syskey_win) while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='\\')) i--; else if (syskey==syskey_all) while ((i>0) && (FilePath[i]!='.') && (FilePath[i]!='/') && (FilePath[i]!='\\')) i--; if (FilePath[i]=='.') { FilePath[i+1] = char(0); strcat ( FilePath,newExt ); } else { strcat ( FilePath,"." ); strcat ( FilePath,newExt ); } return FilePath; } Boolean FileExists ( cpstr FileName, PCFile f ) { PCFile g; Boolean B; if (FileName) { if (!f) g = new CFile(); else g = f; g->assign ( FileName ); B = g->exists(); if (!f) delete g; return B; } else return False; } // ======================== CFile Class ======================== #define ARCH_NONE 0 #define ARCH_GZIP 1 #define ARCH_COMPRESS 2 #define ARCH_ENFORCE 3 CFile::CFile ( word BufSize ) { Buf_Size = BufSize; BufLen = 0; BufInc = 1; EofFile = False; hFile = NULL; FName = NULL; BufCnt = 0; IOBuf = NULL; IOSuccess = True; TextMode = False; UniBin = False; StdIO = False; gzipIO = ARCH_NONE; memIO = False; } CFile::~CFile() { shut (); FreeBuffer(); } void CFile::FreeBuffer () { if (IOBuf) { delete[] IOBuf; IOBuf = NULL; } if (FName) { delete[] FName; FName = NULL; } } void CFile::assign ( cpstr FileName, Boolean Text, Boolean UniB, byte gzMode ) { pstr p; shut(); FreeBuffer(); CreateCopy ( FName,FileName ); StdIO = (!strcmp(FName,"stdin" )) || (!strcmp(FName,"stdout")) || (!strcmp(FName,"stderr")); if (StdIO) TextMode = True; else TextMode = Text; UniBin = UniB; gzipMode = gzMode; gzipIO = ARCH_NONE; if ((gzipMode==GZM_ENFORCE) || (gzipMode==GZM_ENFORCE_GZIP)) gzipIO = ARCH_GZIP; else if (gzipMode==GZM_ENFORCE_COMPRESS) gzipIO = ARCH_COMPRESS; else if (gzipMode==GZM_CHECK) { p = strrchr ( FName,'.' ); if (p) { if (!strcmp(p,".gz")) gzipIO = ARCH_GZIP; else if (!strcmp(p,".Z")) gzipIO = ARCH_COMPRESS; } } memIO = False; } void CFile::assign ( word poolSize, word sizeInc, pstr filePool ) { shut (); FreeBuffer(); IOBuf = filePool; BufLen = poolSize; FLength = poolSize; BufInc = sizeInc; BufCnt = 0; memIO = True; gzipMode = GZM_NONE; gzipIO = ARCH_NONE; } void CFile::GetFilePool ( pstr & filePool, word & fileSize ) { if (memIO) { filePool = IOBuf; fileSize = FLength; IOBuf = NULL; BufLen = 0; BufCnt = 0; FLength = 0; } else { filePool = NULL; fileSize = 0; } } static pstr gzip_path = pstr("gzip "); static pstr ungzip_path = pstr("gzip -dc "); static pstr compress_path = pstr("compress "); static pstr uncompress_path = pstr("uncompress -c "); void SetGZIPPath ( pstr gzipPath, pstr ungzipPath ) { if (!gzipPath) gzip_path = pstr("gzip "); else gzip_path = gzipPath; if (!ungzipPath) ungzip_path = pstr("gzip -d "); else ungzip_path = ungzipPath; } void SetCompressPath ( pstr compressPath, pstr uncompressPath ) { if (!compressPath) compress_path = pstr("compress "); else compress_path = compressPath; if (!uncompressPath) uncompress_path = pstr("uncompress -c "); else uncompress_path = uncompressPath; } Boolean CFile::reset ( Boolean ReadOnly, int retry ) { #ifndef _MSC_VER pstr p; int i; #endif if (memIO) { shut(); if (!IOBuf) return False; BufCnt = 0; IOSuccess = True; } else { if (!FName) return False; shut(); BufLen = 0; BufCnt = 0; if (!strcmp(FName,"stdin")) { hFile = stdin; StdIO = True; TextMode = True; FLength = 1; EofFile = False; IOSuccess = True; } else { StdIO = False; if (gzipIO==ARCH_GZIP) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,ungzip_path,FName ); for (i=0;(i<=retry) && (!hFile);i++) { if (i>0) sleep ( 1 ); hFile = popen ( p,"r" ); } if (p) delete[] p; #endif } else if (gzipIO==ARCH_COMPRESS) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,uncompress_path,FName ); for (i=0;(i<=retry) && (!hFile);i++) { if (i>0) sleep ( 1 ); hFile = popen ( p,"r" ); } if (p) delete[] p; #endif } else { #ifndef _MSC_VER for (i=0;(i<=retry) && (!hFile);i++) { if (i>0) sleep ( 1 ); if (TextMode) { if (ReadOnly) hFile = fopen ( FName,"rt" ); else hFile = fopen ( FName,"r+t" ); } else { if (ReadOnly) hFile = fopen ( FName,"rb" ); else hFile = fopen ( FName,"r+b" ); } } #endif } if (hFile) { if (gzipIO==ARCH_NONE) { fseek ( hFile,0L,SEEK_END ); FLength = ftell ( hFile ); fseek ( hFile,0L,SEEK_SET ); EofFile = (FLength<=0); } else { FLength = 1; EofFile = False; } IOSuccess = True; } else { EofFile = True; IOSuccess = False; } } } return IOSuccess; } Boolean CFile::rewrite() { #ifndef _MSC_VER pstr p; #endif if (memIO) { shut(); FreeBuffer(); IOBuf = new char[BufLen]; BufCnt = 0; FLength = 0; IOSuccess = True;; } else { if (!FName) return False; shut(); BufLen = 0; BufCnt = 0; if (gzipIO==ARCH_GZIP) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,gzip_path,pstr(" > "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = False; } else if (gzipIO==ARCH_COMPRESS) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,compress_path,pstr(" > "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = False; } else if (!TextMode) { hFile = fopen ( FName,"w+b" ); StdIO = False; } else if (!strcmp(FName,"stdout")) { hFile = stdout; StdIO = True; } else if (!strcmp(FName,"stderr")) { hFile = stderr; StdIO = True; } else { hFile = fopen ( FName,"w+t" ); StdIO = False; } FLength = 0; IOSuccess = (hFile!=NULL); } return IOSuccess; } Boolean CFile::append() { #ifndef _MSC_VER pstr p; #endif if (memIO) { if (!IOBuf) { IOBuf = new char[BufLen]; BufCnt = 0; } FLength = BufCnt; IOSuccess = True; } else { if (!FName) return False; shut(); BufLen = 0; BufCnt = 0; if (gzipIO==ARCH_GZIP) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,gzip_path,pstr(" >> "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = False; } else if (gzipIO==ARCH_COMPRESS) { #ifndef _MSC_VER p = NULL; CreateConcat ( p,compress_path,pstr(" >> "),FName ); hFile = popen ( p,"w" ); if (p) delete[] p; #else hFile = NULL; #endif StdIO = False; } else if (!TextMode) { hFile = fopen ( FName,"ab" ); StdIO = False; } else if (!strcmp(FName,"stdout")) { hFile = stdout; StdIO = True; } else if (!strcmp(FName,"stderr")) { hFile = stderr; StdIO = True; } else { hFile = fopen ( FName,"at" ); StdIO = False; } FLength = 0; IOSuccess = hFile!=NULL; } return IOSuccess; } Boolean CFile::erase() { if (!FName) return False; shut(); if (!StdIO) { BufLen = 0; BufCnt = 0; if (FName) IOSuccess = (remove(FName)==0); FLength = 0; } else IOSuccess = True; return IOSuccess; } Boolean CFile::exists() { if (memIO) { IOSuccess = (IOBuf!=NULL); } else { if (!FName) return False; shut(); if (!StdIO) { hFile = fopen ( FName,"r" ); IOSuccess = (hFile!=NULL); BufLen = 0; BufCnt = 0; FLength = 0; if (hFile) fclose ( hFile ); } else IOSuccess = True; hFile = NULL; } return IOSuccess; } Boolean CFile::parse ( cpstr FileName ) { UNUSED_ARGUMENT(FileName); return True; } Boolean CFile::rename ( cpstr NewFileName ) { if (!FName) return False; shut(); if (!StdIO) IOSuccess = (::rename(FName,NewFileName)==0); if (IOSuccess) assign ( NewFileName,TextMode,UniBin,gzipMode ); return IOSuccess; } long CFile::Position() { if (memIO) return BufCnt; if (hFile==NULL) return 0L; return ftell ( hFile ); } Boolean CFile::seek ( long Position ) { if (memIO) { if (Position<=(long)BufLen) { BufCnt = Position; IOSuccess = True; } else IOSuccess = False; return IOSuccess; } else if (hFile==NULL) return False; else if (!StdIO) { IOSuccess = fseek(hFile,Position,SEEK_SET)==0; return IOSuccess; } else return True; } Boolean CFile::FileEnd() { if (memIO) return ((long)BufCnt>=FLength); if (TextMode) { if (EofFile || ((!hFile) && (!StdIO))) return True; if (feof(hFile)==0) return False; return True; } return EofFile && (BufLen==0); } void CFile::shut () { if (hFile!=NULL) { if (!StdIO) { #ifndef _MSC_VER if (gzipIO!=ARCH_NONE) pclose ( hFile ); else fclose ( hFile ); #else fclose ( hFile ); #endif } hFile = NULL; } } Boolean CFile::isOpen() { if (memIO) return (IOBuf!=NULL); return (hFile!=NULL); } word CFile::ReadLine ( pstr Line, word MaxLen ) { word LCnt; int Done; Boolean HSuccess = IOSuccess; if (memIO) { LCnt = 0; while (((long)BufCnt0) { if ((Line[LCnt-1]!='\n') && (Line[LCnt-1]!='\r')) break; Line[LCnt-1] = char(0); LCnt--; } } else LCnt = 0; return LCnt; } else { if (IOBuf==NULL) { IOBuf = new char[Buf_Size]; BufLen = ReadFile ( IOBuf,Buf_Size ); IOSuccess = HSuccess; BufCnt = 0; } LCnt = 0; do { while ((BufCnt=BufLen) { HSuccess = IOSuccess; BufLen = ReadFile ( IOBuf,Buf_Size ); IOSuccess = HSuccess; BufCnt = 0; } if (IOBuf[BufCnt]=='\r') Done = 1; else if (IOBuf[BufCnt]=='\n') Done = 2; else Done = 0; if (Done) BufCnt++; if (BufCnt>=BufLen) { HSuccess = IOSuccess; BufLen = ReadFile ( IOBuf,Buf_Size ); IOSuccess = HSuccess; BufCnt = 0; } if (BufLen>0) { if (((Done==2) && (IOBuf[BufCnt]=='\r')) || ((Done==1) && (IOBuf[BufCnt]=='\n'))) BufCnt++; } } while ((!Done) && (LCnt0)); Line[LCnt] = char(0); return LCnt; } } } word CFile::ReadNonBlankLine ( pstr S, word MaxLen ) { word i,j; do { j = ReadLine ( S,MaxLen ); i = 0; while ((i=j) && (!FileEnd())); if (i>=j) { S[0] = char(0); j = 0; } return j; } Boolean CFile::WriteLine ( cpstr Line ) { if ((!memIO) && TextMode) { if (hFile==NULL) return False; fputs ( Line,hFile ); return (fputs(NEWLINE,hFile)>=0); } else { if (WriteFile(Line,strlen(Line))) return WriteFile ( (void *)NEWLINE,strlen(NEWLINE) ); else return False; } } Boolean CFile::Write ( cpstr Line ) { if ((!memIO) && TextMode) { if (hFile==NULL) return False; return (fputs(Line,hFile)>=0); } else return WriteFile(Line,strlen(Line)); } Boolean CFile::Write ( realtype V, int length ) { char N[50]; sprintf ( N,"%-.*g",length,V ); if ((!memIO) && TextMode) { if (hFile==NULL) return False; return (fputs(N,hFile)>=0); } else return WriteFile(N,strlen(N)); } Boolean CFile::Write ( int iV, int length ) { char N[50]; sprintf ( N,"%*i",length,iV ); if ((!memIO) && TextMode) { if (hFile==NULL) return False; return (fputs(N,hFile)>=0); } else return WriteFile(N,strlen(N)); } Boolean CFile::LF() { if ((!memIO) && TextMode) { if (hFile==NULL) return False; return (fputs(NEWLINE,hFile)>=0); } else return WriteFile ( (void *)NEWLINE,strlen(NEWLINE) ); } Boolean CFile::WriteDataLine ( realtype X, realtype Y, int length ) { Write ( pstr(" ") ); Write ( X,length ); Write ( pstr(" ") ); Write ( Y,length ); return LF(); } Boolean CFile::WriteParameter ( cpstr S, realtype X, int ParColumn, int length ) { int l=strlen(S); if ((!memIO) && TextMode) { fputs ( S,hFile ); while (lParColumn) { // X = atof ( &(S[ParColumn]) ); X = GetNumber ( &(S[ParColumn]) ); return True; } else { X = 0.0; return False; } } Boolean CFile::ReadParameters ( pstr S, int & n_X, rvector X, int MaxLen, int ParColumn ) { pstr S1,S2; ReadLine ( S,MaxLen ); if ((int)strlen(S)>ParColumn) { n_X = 0; S2 = &(S[ParColumn]); S1 = S2; while (*S1!=char(0)) { if (*S1==',') *S1 = ' '; S1++; } while (*S2!=char(0)) { S1 = S2; X[n_X] = strtod ( S1,&S2 ); n_X++; while ((*S2!=char(0)) && (*S2==' ')) S2++; } return True; } else { n_X = 0; X[0] = 0.0; return False; } } Boolean CFile::ReadParameter ( pstr S, int & X, int ParColumn ) { realtype V; if (ReadParameter(S,V,ParColumn)) { X = mround(V); return True; } else { X = 0; return False; } } Boolean CFile::CreateWrite ( cpstr Line ) { wordUniBin wUB; word i; if (UniBin) { if (Line) { i = strlen(Line)+1; word2UniBin ( i,wUB ); if (WriteFile(wUB,sizeof(wordUniBin))) return WriteFile ( Line,i ); else return False; } else { i = 0; word2UniBin ( i,wUB ); return WriteFile ( wUB,sizeof(wordUniBin) ); } } else { if (Line) { i = strlen(Line)+1; if (WriteFile(&i,sizeof(i))) return WriteFile ( Line,i ); else return False; } else { i = 0; return WriteFile ( &i,sizeof(i) ); } } } #define _max_dyn_string_len 1073741824 word CFile::CreateRead ( pstr & Line ) { wordUniBin wUB; word i; //unsigned short int i; if (Line) { delete[] Line; Line = NULL; } if (UniBin) { ReadFile ( wUB,sizeof(wordUniBin) ); UniBin2word ( wUB,i ); } else ReadFile ( &i,sizeof(i) ); if ((i>0) && (i<_max_dyn_string_len)) { Line = new char[i]; ReadFile ( Line,i ); } return i; } Boolean CFile::WriteTerLine ( cpstr Line, Boolean longLine ) { wordUniBin wUB; word ll; byte sl; Boolean B; if (Line) ll = strlen(Line); else ll = 0; if (!longLine) { sl = byte(ll); B = WriteFile ( &sl,sizeof(sl) ); } else if (UniBin) { word2UniBin ( ll,wUB ); B = WriteFile ( wUB,sizeof(wordUniBin) ); } else B = WriteFile ( &ll,sizeof(ll) ); if (B && (ll>0)) B = WriteFile ( Line,ll ); return B; } word CFile::ReadTerLine ( pstr Line, Boolean longLine ) { wordUniBin wUB; word ll; byte sl; if (!longLine) { ReadFile ( &sl,sizeof(sl) ); ll = sl; } else if (UniBin) { ReadFile ( wUB,sizeof(wordUniBin) ); UniBin2word ( wUB,ll ); } else ReadFile ( &ll,sizeof(ll) ); if (ll>0) ReadFile ( Line,ll ); Line[ll] = char(0); return ll+1; } word CFile::ReadFile ( void * Buffer, word Count ) { word Cnt; if (memIO) { Cnt = WMax(Count,FLength-BufCnt); if (Cnt>0) { memcpy ( Buffer,&(IOBuf[BufCnt]),Cnt ); BufCnt += Cnt; } IOSuccess = (Cnt==Count); EofFile = ((Cnt=FLength)); return Cnt; } else if (hFile) { Cnt = (word)fread ( Buffer,1,Count,hFile ); EofFile = (CntBufLen) { Cnt += BufInc; IOB = new char[Cnt]; if (IOBuf) { memcpy ( IOB,IOBuf,BufCnt ); delete[] IOBuf; } IOBuf = IOB; BufLen = Cnt; } memcpy ( &(IOBuf[BufCnt]),Buffer,Count ); BufCnt += Count; FLength = BufCnt; IOSuccess = True; } else { if (hFile==NULL) return False; Cnt = (word)fwrite ( Buffer,1,Count,hFile ); Pos = Position(); if (Pos>FLength) FLength = Pos; IOSuccess = Cnt==Count; } return IOSuccess; } Boolean CFile::WriteReal ( realtype * V ) { realUniBin rUB; if (UniBin) { real2UniBin ( *V,rUB ); return WriteFile ( rUB,sizeof(realUniBin) ); } else return WriteFile ( V,sizeof(realtype) ); } Boolean CFile::WriteFloat ( realtype * V ) { floatUniBin fUB; float fV; if (UniBin) { float2UniBin ( *V,fUB ); return WriteFile ( fUB,sizeof(floatUniBin) ); } else { fV = (float)*V; return WriteFile ( &fV,sizeof(float) ); } } Boolean CFile::WriteInt ( int * I ) { intUniBin iUB; if (UniBin) { int2UniBin ( *I,iUB ); return WriteFile ( iUB,sizeof(intUniBin) ); } else return WriteFile ( I,sizeof(int) ); } Boolean CFile::WriteShort ( short * S ) { shortUniBin sUB; if (UniBin) { short2UniBin ( *S,sUB ); return WriteFile ( sUB,sizeof(shortUniBin) ); } else return WriteFile ( S,sizeof(short) ); } Boolean CFile::WriteLong ( long * L ) { longUniBin lUB; if (UniBin) { long2UniBin ( *L,lUB ); return WriteFile ( lUB,sizeof(longUniBin) ); } else return WriteFile ( L,sizeof(long) ); } Boolean CFile::WriteBool ( Boolean * B ) { intUniBin iUB; int k; if (UniBin) { if (*B) k = 1; else k = 0; int2UniBin ( k,iUB ); return WriteFile ( iUB,sizeof(intUniBin) ); } else return WriteFile ( B,sizeof(Boolean) ); } Boolean CFile::WriteByte ( byte * B ) { return WriteFile ( B,sizeof(byte) ); } Boolean CFile::WriteWord ( word * W ) { wordUniBin wUB; if (UniBin) { word2UniBin ( *W,wUB ); return WriteFile ( wUB,sizeof(wordUniBin) ); } else return WriteFile ( W,sizeof(word) ); } Boolean CFile::ReadReal ( realtype * V ) { realUniBin rUB; if (UniBin) { if (ReadFile(rUB,sizeof(realUniBin))==sizeof(realUniBin)) { UniBin2real ( rUB,*V ); return True; } else return False; } else return ( ReadFile(V,sizeof(realtype))==sizeof(realtype) ); } Boolean CFile::ReadFloat ( realtype * V ) { floatUniBin fUB; float fV; if (UniBin) { if (ReadFile(fUB,sizeof(floatUniBin))==sizeof(floatUniBin)) { UniBin2float ( fUB,*V ); return True; } } else if (ReadFile(&fV,sizeof(float))==sizeof(float)) { *V = fV; return True; } return False; } Boolean CFile::ReadInt ( int * I ) { intUniBin iUB; if (UniBin) { if (ReadFile(iUB,sizeof(intUniBin))==sizeof(intUniBin)) { UniBin2int ( iUB,*I ); return True; } else return False; } else return ( ReadFile(I,sizeof(int))==sizeof(int) ); } Boolean CFile::ReadShort ( short * S ) { shortUniBin sUB; if (UniBin) { if (ReadFile(sUB,sizeof(shortUniBin))==sizeof(shortUniBin)) { UniBin2short ( sUB,*S ); return True; } else return False; } else return ( ReadFile(S,sizeof(short))==sizeof(short) ); } Boolean CFile::ReadLong ( long * L ) { longUniBin lUB; if (UniBin) { if (ReadFile(lUB,sizeof(longUniBin))==sizeof(longUniBin)) { UniBin2long ( lUB,*L ); return True; } else return False; } else return ( ReadFile(L,sizeof(long))==sizeof(long) ); } Boolean CFile::ReadBool ( Boolean * B ) { intUniBin iUB; int k; if (UniBin) { if (ReadFile(iUB,sizeof(intUniBin))==sizeof(intUniBin)) { UniBin2int ( iUB,k ); *B = (k!=0); return True; } else return False; } else return ( ReadFile(B,sizeof(Boolean))==sizeof(Boolean) ); } Boolean CFile::ReadByte ( byte * B ) { return ( ReadFile(B,sizeof(byte))==sizeof(byte) ); } Boolean CFile::ReadWord ( word * W ) { wordUniBin wUB; if (UniBin) { if (ReadFile(wUB,sizeof(wordUniBin))==sizeof(wordUniBin)) { UniBin2word ( wUB,*W ); return True; } else return False; } else return ( ReadFile(W,sizeof(word))==sizeof(word) ); } Boolean CFile::AddReal ( realtype * V ) { realtype x; if (ReadReal(&x)) { *V += x; return True; } return False; } Boolean CFile::AddFloat ( realtype * V ) { realtype x; if (ReadFloat(&x)) { *V += x; return True; } return False; } Boolean CFile::AddInt ( int * I ) { int k; if (ReadInt(&k)) { *I += k; return True; } return False; } Boolean CFile::AddShort ( short * S ) { short k; if (ReadShort(&k)) { *S += k; return True; } return False; } Boolean CFile::AddLong ( long * L ) { long k; if (ReadLong(&k)) { *L += k; return True; } return False; } Boolean CFile::AddByte ( byte * B ) { byte k; if (ReadByte(&k)) { *B += k; return True; } return False; } Boolean CFile::AddWord ( word * W ) { word k; if (ReadWord(&k)) { *W += k; return True; } return False; } Boolean CFile::WriteVector ( rvector V, int len, int Shift ) { intUniBin iUB; realUniBin rUB; int i; int l = len; if (V==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); for (i=0;i0) WriteFile ( &(V[Shift]),sizeof(realtype)*l ); } return IOSuccess; } Boolean CFile::WriteVector ( ivector iV, int len, int Shift ) { intUniBin iUB; int i; int l = len; if (iV==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); for (i=0;i0) WriteFile ( &(iV[Shift]),sizeof(int)*l ); } return IOSuccess; } Boolean CFile::WriteVector ( lvector lV, int len, int Shift ) { intUniBin iUB; longUniBin lUB; int i; int l = len; if (lV==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); for (i=0;i0) WriteFile ( &(lV[Shift]),sizeof(long)*l ); } return IOSuccess; } Boolean CFile::WriteVector ( bvector B, int len, int Shift ) { intUniBin iUB; int l = len; if (B==NULL) l = 0; if (UniBin) { int2UniBin ( l,iUB ); WriteFile ( iUB,sizeof(intUniBin) ); } else WriteFile ( &l,sizeof(l) ); if (l>0) WriteFile ( &(B[Shift]),sizeof(byte)*l ); return IOSuccess; } Boolean CFile::ReadVector ( rvector V, int maxlen, int Shift ) { intUniBin iUB; realUniBin rUB; int i,l,ll; realtype B; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (V) for (i=0;i<=ll;i++) { ReadFile ( rUB,sizeof(realUniBin) ); UniBin2real ( rUB,V[Shift+i] ); } for (i=ll+1;i<=l;i++) ReadFile ( rUB,sizeof(realUniBin) ); } } else { ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (V) ReadFile ( &(V[Shift]),sizeof(realtype)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &B,sizeof(B) ); } } return IOSuccess; } Boolean CFile::ReadVector ( ivector iV, int maxlen, int Shift ) { intUniBin iUB; int i,l,ll,iB; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (iV) for (i=0;i<=ll;i++) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,iV[Shift+i] ); } for (i=ll+1;i<=l;i++) ReadFile ( iUB,sizeof(intUniBin) ); } } else { ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (iV) ReadFile ( &(iV[Shift]),sizeof(int)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &iB,sizeof(iB) ); } } return IOSuccess; } Boolean CFile::ReadVector ( lvector lV, int maxlen, int Shift ) { intUniBin iUB; longUniBin lUB; int i,l,ll; long lB; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (lV) for (i=0;i<=ll;i++) { ReadFile ( lUB,sizeof(longUniBin) ); UniBin2long ( lUB,lV[Shift+i] ); } for (i=ll+1;i<=l;i++) ReadFile ( lUB,sizeof(longUniBin) ); } } else { ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (lV) ReadFile ( &(lV[Shift]),sizeof(long)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &lB,sizeof(lB) ); } } return IOSuccess; } Boolean CFile::ReadVector ( bvector B, int maxlen, int Shift ) { intUniBin iUB; int i,l,ll; byte t; if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,l ); } else ReadFile ( &l,sizeof(l) ); if (IOSuccess && (l>0)) { ll = IMin(l,maxlen); if (B) ReadFile ( &(B[Shift]),sizeof(byte)*ll ); for (i=ll+1;i<=l;i++) ReadFile ( &t,sizeof(t) ); } return IOSuccess; } Boolean CFile::CreateReadVector ( rvector & V, int & len, int Shift ) { intUniBin iUB; realUniBin rUB; int i; realtype B; FreeVectorMemory ( V,Shift ); if (UniBin) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,len ); if (IOSuccess && (len>0)) { GetVectorMemory ( V,len,Shift ); if (V) for (i=0;i0)) { GetVectorMemory ( V,len,Shift ); if (V) ReadFile ( &(V[Shift]),sizeof(realtype)*len ); else for (i=0;i0)) { GetVectorMemory ( iV,len,Shift ); if (iV) for (i=0;i0)) { GetVectorMemory ( iV,len,Shift ); if (iV) ReadFile ( &(iV[Shift]),sizeof(int)*len ); else for (i=0;i0)) { GetVectorMemory ( lV,len,Shift ); if (lV) for (i=0;i0)) { GetVectorMemory ( lV,len,Shift ); if (lV) ReadFile ( &(lV[Shift]),sizeof(long)*len ); else for (i=0;i0)) { GetVectorMemory ( B,len,Shift ); if (B) ReadFile ( &(B[Shift]),sizeof(byte)*len ); else for (i=0;i0)) { ReadFile ( iUB,sizeof(intUniBin) ); UniBin2int ( iUB,M ); if (IOSuccess && (M>0)) { GetMatrixMemory ( A,N,M,ShiftN,ShiftM ); for (i=0;i0) { ReadFile ( &M,sizeof(M) ); if (M>0) { GetMatrixMemory ( A,N,M,ShiftN,ShiftM ); for (i=0;i=j) DataLen--; if (DataLen>0) { Ok = GetVectorMemory(X,DataLen,Shift); if (Ok && (yCol>=0)) Ok = Ok && GetVectorMemory(Y,DataLen,Shift); if (Ok && (zCol>=0)) Ok = Ok && GetVectorMemory(Z,DataLen,Shift); if (Ok) { reset(); _ReadColumns ( DataLen,S,sizeof(S),X,Y,Z,xCol,yCol, zCol,Shift ); } else ErrCode = FileError_NoMemory; } else ErrCode = FileError_NoDataFound; } else ErrCode = FileError_NoDataFound; return DataLen; } int CFile::CreateReadColumns ( rvector & X, rvector & Y, int xCol, int yCol, int Shift ) { return CreateReadColumns ( X,Y,X,xCol,yCol,-1,Shift ); } void CFile::_ReadColumns ( int & DLen, pstr S, int SLen, rvector X, rvector Y, rvector Z, int xCol, int yCol, int zCol, int Shift ) { int i,is,j,k,m,n,cmax; char SV[256]; realtype Res; ErrCode = 0; i = 0; cmax = IMax(zCol,IMax(xCol,yCol)); while ((i=k)) { DLen = i; return; } m++; } while ((m!=xCol) && (m!=yCol) && (m!=zCol)); if (SV[0]==char(0)) { if (n>0) ErrCode = FileError_NoColumn; else ErrCode = FileError_ShortData; } else { Res = GetNumber ( SV ); if (ErrCode==0) { is = i+Shift; if (m==xCol) X[is] = Res; else if (m==yCol) Y[is] = Res; else Z[is] = Res; n++; } } } if ((ErrCode==0) && (n<2)) ErrCode = FileError_NoColumn; i++; } if ((ErrCode==FileError_ShortData) && (i>1)) { ErrCode = 0; DLen = i-1; } if (ErrCode!=0) ErrCode = FileError_BadData; } void RemoveDelimiters ( pstr S, int SLen ) { int j; for (j=0;j // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMCIFCategory ( mmCIF category ) // ~~~~~~~~~ CMMCIFStruct ( mmCIF structure ) // CMMCIFLoop ( mmCIF loop ) // CMMCIFData ( mmCIF data block ) // CMMCIFFile ( mmCIF file ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MMDB_MMCIF__ #define __MMDB_MMCIF__ #ifndef __Stream__ #include "stream_.h" #endif // ====================== CMMCIFCategory ========================== #define MMCIF_Category 0 #define MMCIF_Struct 1 #define MMCIF_Loop 2 #define MMCIF_Data 3 DefineClass(CMMCIFCategory) DefineStreamFunctions(CMMCIFCategory) class CMMCIFCategory : public CStream { friend class CMMCIFData; public : CMMCIFCategory (); CMMCIFCategory ( cpstr N ); CMMCIFCategory ( RPCStream Object ); ~CMMCIFCategory(); pstr GetCategoryName () { return name; } virtual int GetCategoryID() { return MMCIF_Category; } virtual void WriteMMCIF ( RCFile ) {} virtual void Optimize (); void Sort (); int GetTagNo ( cpstr ttag ); int AddTag ( cpstr ttag ); int GetNofTags () { return nTags; } pstr GetTag ( int tagNo ); // 0..nTags-1 void PrintTags (); Boolean CheckTags ( pstr * tagList ); virtual void Copy ( PCMMCIFCategory Category ); void write ( RCFile f ); void read ( RCFile f ); protected: int nTags; pstr name; psvector tag; ivector index; int nAllocTags; void InitMMCIFCategory (); virtual void FreeMemory (); void ExpandTags ( int nTagsNew ); void PutCategoryName ( cpstr newName ); }; // ====================== CMMCIFStruct ============================ DefineClass(CMMCIFStruct) DefineStreamFunctions(CMMCIFStruct) #define CIF_NODATA_DOT 0 #define CIF_NODATA_QUESTION 1 class CMMCIFStruct : public CMMCIFCategory { public : psvector field; CMMCIFStruct (); CMMCIFStruct ( cpstr N ); CMMCIFStruct ( RPCStream Object ); ~CMMCIFStruct(); void AddField ( cpstr F, cpstr T, Boolean Concatenate=False ); int GetCategoryID() { return MMCIF_Struct; } void Optimize (); pstr GetField ( int tagNo ); // 0..nTags-1 int GetString ( pstr & S, cpstr TName, Boolean Remove=False ); pstr GetString ( cpstr TName, int & RC ); // NULL if TName // is not there int DeleteField ( cpstr TName ); // <0 the field was not // there int GetReal ( realtype & R, cpstr TName, Boolean Remove=False ); int GetInteger ( int & I, cpstr TName, Boolean Remove=False ); // PutString WILL NOT add the string if it consists only of // spaces and NonBlankOnly is set to True. Any previous field for // this tag will be removed, though. void PutString ( cpstr S, cpstr TName, Boolean NonBlankOnly=False ); void PutDate ( cpstr T ); void PutNoData ( int NoDataType, cpstr T ); void PutReal ( realtype R, cpstr TName, int prec=8 ); void PutInteger ( int I, cpstr TName ); Boolean WriteMMCIFStruct ( cpstr FName, byte gzipMode=GZM_CHECK ); void WriteMMCIF ( RCFile f ); void Copy ( PCMMCIFCategory Struct ); void write ( RCFile f ); void read ( RCFile f ); protected: void InitMMCIFStruct(); void FreeMemory(); }; // ====================== CMMCIFLoop ============================== DefineClass(CMMCIFLoop) DefineStreamFunctions(CMMCIFLoop) class CMMCIFLoop : public CMMCIFCategory { friend class CMMCIFData; public : CMMCIFLoop (); CMMCIFLoop ( cpstr N ); CMMCIFLoop ( RPCStream Object ); ~CMMCIFLoop(); // AddLoopTag(..) adds tag T to the list of tags and removes // any existing fields if Remove is set to True. void AddLoopTag ( cpstr T, Boolean Remove=True ); // AddString will add NULL if S consists only of spaces and // NonBlankOnly is set to True. void AddString ( cpstr S, Boolean NonBlankOnly=False ); void AddNoData ( int NoDataType ); void AddReal ( realtype R, int prec=8 ); void AddInteger ( int I ); int GetLoopLength() { return nRows; } pstr GetField ( int rowNo, int tagNo ); int GetString ( pstr & S, cpstr TName, int nrow, Boolean Remove=False ); // if GetString returns NULL but RC=0 then the field was // either '.' or '?' pstr GetString ( cpstr TName, int nrow, int & RC ); int DeleteField ( cpstr TName, int nrow ); int DeleteRow ( int nrow ); // returns 0 if GetXxxx(..) had success int GetReal ( realtype & R, cpstr TName, int nrow, Boolean Remove=False ); int GetInteger ( int & I, cpstr TName, int nrow, Boolean Remove=False ); int GetSVector ( psvector & S, cpstr TName, int i1=0, int i2=MaxInt4, Boolean Remove=False ); int GetRVector ( rvector & R, cpstr TName, int i1=0, int i2=MaxInt4, Boolean Remove=False ); int GetIVector ( ivector & I, cpstr TName, int i1=0, int i2=MaxInt4, Boolean Remove=False ); void PutString ( cpstr S, cpstr T, int nrow ); void PutNoData ( int NoDataType, cpstr T, int nrow ); void PutReal ( realtype R, cpstr T, int nrow, int prec=8 ); void PutInteger ( int I, cpstr T, int nrow ); void PutSVector ( psvector S, cpstr T, int i1, int i2 ); void PutRVector ( rvector R, cpstr T, int i1, int i2, int prec=8 ); void PutIVector ( ivector I, cpstr T, int i1, int i2 ); int GetCategoryID() { return MMCIF_Loop; } void Optimize (); Boolean WriteMMCIFLoop ( cpstr FName, byte gzipMode=GZM_CHECK ); void WriteMMCIF ( RCFile f ); void Copy ( PCMMCIFCategory Loop ); void write ( RCFile f ); void read ( RCFile f ); protected: int nRows; psmatrix field; int iColumn,nAllocRows; void InitMMCIFLoop(); void FreeMemory (); void DeleteFields (); void ExpandRows ( int nRowsNew ); }; // ====================== CMMCIFData ============================= // CIFW are warnings which may be issued on reading the CIF file. // Each of them means actually a CIF syntax error. #define CIFW_UnrecognizedItems 0x00000020 #define CIFW_MissingField 0x00000040 #define CIFW_EmptyLoop 0x00000080 #define CIFW_UnexpectedEOF 0x00000100 #define CIFW_LoopFieldMissing 0x00000200 #define CIFW_NotAStructure 0x00000400 #define CIFW_NotALoop 0x00000800 #define CIFW_DuplicatedTag 0x00001000 // CIFRC are return codes from procedures of extracting data from // the read CIF file. Negative returns reflect unsuccessful and // not accomplished operation. #define CIFRC_Loop 2 #define CIFRC_Structure 1 #define CIFRC_Ok 0 #define CIFRC_StructureNoTag -1 #define CIFRC_LoopNoTag -2 #define CIFRC_NoCategory -3 #define CIFRC_WrongFormat -4 #define CIFRC_NoTag -5 #define CIFRC_NotAStructure -6 #define CIFRC_NotALoop -7 #define CIFRC_WrongIndex -8 #define CIFRC_NoField -9 #define CIFRC_Created -12 #define CIFRC_CantOpenFile -13 #define CIFRC_NoDataLine -14 // // Functional flags: // ~~~~~~~~~~~~~~~~~ // // CIFFL_PrintWarnings when reading CIF file, all warning // messages will be printed. If the flag // is off, the warnings will be bit-encoded // in the return code // CIFFL_StopOnWarnings reading CIF file will stop at first // warning issued // CIFFL_SuggestCategories allows reading CIF file with loops having // no categories. Hidden category names // will be automatically generated for // internal consistency of the system. // These names will not appear in output. // As these names are hidden, they cannot // be used to access data. It is therefore // assumed that all tags in all loops without // categories are unique. Simply specify "" // for category when accessing such data // (it cannot be accessed through CMMCIFLoop, // but only through CMMCIFData functions // taking both Category and Tag; note that // CIFFL_SuggestCategories flag must be on // while accessing such data). // CIFFL_SuggestTags allows for identical tags in a category // (including a hidden category). Hidden // suffixes to tag names will be generated // for internal consistency. At present, // only data for first non-unique tag may be // accessed. // #define CIFFL_PrintWarnings 0x00000001 #define CIFFL_StopOnWarnings 0x00000002 #define CIFFL_SuggestCategories 0x00000004 #define CIFFL_SuggestTags 0x00000008 DefineClass(CMMCIFData) DefineStreamFunctions(CMMCIFData) class CMMCIFData : public CStream { friend class CMMCIFFile; public : CMMCIFData (); CMMCIFData ( cpstr N ); CMMCIFData ( RPCStream Object ); ~CMMCIFData(); // -------- General I/O functions void SetPrintWarnings ( Boolean SPW ); void SetStopOnWarning ( Boolean SOW ); void SetFlag ( int F ); void RemoveFlag ( int F ); int GetWarnings () { return Warning; } // SetWrongFields() sets names (category.tag) of those // fields which are to be ignored on input. In a loop, // the whole column category.tag is assumed missing // (it will be an error if the column is physically // there). // Lists of 'cats' and 'tags' must be of equal length // and they must be terminated by NULL. // To remove the previous setting, call // SetWrongFields ( NULL,NULL ). // SetWrongFields() may be used for reading corrupted // CIF files. void SetWrongFields ( pstr * cats, pstr * tags ); int ReadMMCIFData ( cpstr FName, byte gzipMode=GZM_CHECK ); int ReadMMCIFData ( RCFile f, pstr S, int & lcount ); Boolean WriteMMCIFData ( cpstr FName, byte gzipMode=GZM_CHECK ); void WriteMMCIF ( RCFile f ); // -------- Retrieving data int GetNumberOfCategories () { return nCategories; } PCMMCIFCategory GetCategory ( int categoryNo ); // 0..nCategories-1 PCMMCIFStruct GetStructure ( cpstr CName ); PCMMCIFLoop GetLoop ( cpstr CName ); // FindLoop(..) finds a loop containing all tags from the // tag list provided. The tag list should be terminated // by empty tag "". The function returns NULL if such a loop // was not found. PCMMCIFLoop FindLoop ( pstr * tagList ); // If dname is not NULL, first it is attempted to deallocate. // If Remove flag is set on then no actual space reallocation is // occured: just the internal pointer is copied to dname. The // calling process wiil then be responsible for eventual // deallocation of dname. This is also true for all // string-extracting functions below. void GetDataName ( pstr & dname, Boolean Remove=False ); pstr GetDataName () { return name; } // CheckData(..) returns positive value if the field is in the // file: // CIFRC_Structure category CName is a structure // CIFRC_Loop category CName is a loop // Negative returns mean: // CIFRC_StructureNoTag category CName is present, // it is a structure, but it does not // have tag TName // CIFRC_LoopNoTag category CName is present, // it is a loop, but it does not have // tag TName // CIFRC_NoCategory category CName is not present. // If TName is set to NULL then only the CName is checked and // possible returns are CIFRC_Structure, CIFRC_Loop and // CIFRC_NoCategory. int CheckData ( cpstr CName, cpstr TName ); int DeleteCategory ( cpstr CName ); int DeleteStructure ( cpstr CName ); int DeleteLoop ( cpstr CName ); // Optimize() optimizes the CIF data in memory allocation. It is // a good idea to call it once after extraction of data (GetXXXXXX // functions) with Remove flag set on has been completed. void Optimize(); // GetString(..), GetReal(..) and GetInteger(..) return 0 if the // requested field was found and successfully converted. Negative // returns mean: // CIFRC_WrongFormat the field was found but failed to convert // due to improper numeric format // CIFRC_NoTag category CName was found, but it does not // have tag TName // CIFRC_NoCategory category CName was not found // CIFRC_NotAStructure category CName was found, but it is // a loop rather than a structure. // GetString(..) will try to dispose Dest unless it is assigned // NULL value before the call. The string will be then dynamically // allocated and copied. // If Remove is set to True, the field will be removed after // extraction. int GetString ( pstr & Dest, cpstr CName, cpstr TName, Boolean Remove=False ); pstr GetString ( cpstr CName, cpstr TName, int & RC ); int DeleteField ( cpstr CName, cpstr TName ); int GetReal ( realtype & R, cpstr CName, cpstr TName, Boolean Remove=False ); int GetInteger ( int & I, cpstr CName, cpstr TName, Boolean Remove=False ); // GetLoopLength(..) returns CIFRC_NotALoop if the category CName // is not a loop, CIFRC_NoCategory if the category CName is not // found. Non-negative returns give the length of the loop (may be // 0 if the loop is empty). int GetLoopLength ( cpstr CName ); // GetLoopString(..), GetLoopReal(..) and GetLoopInteger(..) act // like GetString(..), GetReal(..) and GetInteger(..) above for // nrow-th element of the 'loop_' (indexed like 0..N-1 where N // is obtained through GetLoopLength(..)). They will return // CIFRC_WrongIndex if nrow is out of range. // If Remove is set to True, the field will be removed after // extraction. int GetLoopString ( pstr & Dest, cpstr CName, cpstr TName, int nrow, Boolean Remove=False ); pstr GetLoopString ( cpstr CName, cpstr TName, int nrow, int & RC ); int DeleteLoopField ( cpstr CName, cpstr TName, int nrow ); int GetLoopReal ( realtype & R, cpstr CName, cpstr TName, int nrow, Boolean Remove=False ); int GetLoopInteger ( int & I, cpstr CName, cpstr TName, int nrow, Boolean Remove=False ); // GetLoopSVector(..), GetLoopRVector(..) and GetLoopIVector(..) // read CIF 'loop_' data into allocated vectors of strings, reals // and integers, correspondingly. The vectors may be deallocated // prior to call and assigned NULL, in which case they will be // allocated with offsets of i1, which is also the lower index of // the 'loop_' data transferred into it. The upper vector index is // given by i2 or by the loop's length whichever is less. If // vectors are not assigned NULL prior the call, it is assumed // that they are properly (i1-offset, i2-i1+1 length) allocated. // The return codes are same as those of GetLoopString(..), // GetLoopReal(..) and GetLoopInteger(..). int GetLoopSVector ( psvector & S, cpstr CName, cpstr TName, int i1=0, int i2=MaxInt4, Boolean Remove=False ); int GetLoopRVector ( rvector & R, cpstr CName, cpstr TName, int i1=0, int i2=MaxInt4, Boolean Remove=False ); int GetLoopIVector ( ivector & I, cpstr CName, cpstr TName, int i1=0, int i2=MaxInt4, Boolean Remove=False ); // -------- Storing data // Unless the data are to be added to the existing CIF structure, // FreeMemory() should be called once before creating a new // CIF data set. void FreeMemory ( int key ); void PutDataName ( cpstr dname ); // stores name for 'data_' // record // PutString(..), PutReal(..) and PutInteger(..) will put the // values given into the specified category (CName) under the // specified tag (TName). The category, tag and field are created // automatically; the field will be replaced silently if identical // CName.TName is specified in two calls. Calls of these functions // may follow in random order; however CIF file will have all tags // grouped by categories and catgories will follow in the order // of first appearance in PutString(..), PutReal(..) or // PutInteger(..). // Return code - one of CIFRC_Ok or CIFRC_NotAStruct int PutNoData ( int NoDataType, cpstr CName, cpstr TName ); int PutString ( cpstr S, cpstr CName, cpstr TName, Boolean Concatenate=False ); int PutDate ( cpstr CName, cpstr TName ); int PutReal ( realtype R, cpstr CName, cpstr TName, int prec=8 ); int PutInteger ( int I, cpstr CName, cpstr TName ); // If loop category CName is not present in the CIF data // structure, AddLoop(..) creates an empty one and returns // its pointer in Loop. If loop category CName is already in // the CIF data structure, its pointer is returned, and any // data which might be contained in it, remains untouched. // To stuff the loop with data, first the data tags have to // be specified by calling Loop->AddLoopTag(..). After all // tags are given, the data comes as a stream of calls // Loop->AddString(..), Loop->AddReal(..) and // Loop->AddInteger(..) which should provide data for every // tag in sequence in strictly the same order as the tags // were given. This essentially reflects reading a CIF loop // from a file. // Alternatively, the loop data may be stored with PutLoopXXX() // functions given below, although this way may be less // efficient (but more flexible). // AddLoop(..) may return // CIFRC_Ok category was present // CIFRC_Created category was not present but it has // been created; the category is empty // CIFRC_NotALoop category was present as a structure, but // has been replaced for a loop; // the category is empty. int AddLoop ( cpstr CName, PCMMCIFLoop & Loop ); int AddStructure ( cpstr CName, PCMMCIFStruct & Struct ); // PutLoopString(..), PutLoopReal(..) and PutLoopInteger(..) act // like PutString(..), PutReal(..) and PutInteger(..) above for // nrow-th element of the 'loop_' CName (indexed begining from 0). // In consequitive calls, given values of nrow does not have to be // ordered; the most efficient way is to start with HIGHEST value // for nrow in the loop and move down to 0. The least efficient way // is to start with nrow=0 and move up. // These functions allow to form loops in arbitrary way. // The functions may return CIFRC_Ok or CIFRC_NotALoop. int PutLoopNoData ( int NoDataType, cpstr CName, cpstr TName, int nrow ); int PutLoopString ( cpstr S, cpstr CName, cpstr TName, int nrow ); int PutLoopReal ( realtype R, cpstr CName, cpstr TName, int nrow, int prec=8 ); int PutLoopInteger ( int I, cpstr CName, cpstr TName, int nrow ); // PutLoopSVector(..), PutLoopRVector(..) and PutLoopIVector(..) // put vectors of values into specified loop fields. Parameters i1 // and i2 give the range of indices of values which are to be // transfered. To transfer an entire vector allocated as [0..N-1] // i1 shoudl be set to 0 and i2 - to N-1. Note that the loop is // always indexed as starting form 0 on, therefore negative i1 and // i2 are not allowed, and specifying i1>0 will leave first i1 // elements of the CIF loop for the corresponding tag undefined // (will be output like '?'). // These functions allow to form loops in arbitrary way. int PutLoopSVector ( psvector S, cpstr CName, cpstr TName, int i1, int i2 ); int PutLoopRVector ( rvector R, cpstr CName, cpstr TName, int i1, int i2, int prec=8 ); int PutLoopIVector ( ivector I, cpstr CName, cpstr TName, int i1, int i2 ); int RenameCategory ( cpstr CName, cpstr newCName ); // -------- void Copy ( PCMMCIFData Data ); int CopyCategory ( PCMMCIFData Data, cpstr CName, cpstr newCName=NULL ); void PrintCategories(); // for debuging only void write ( RCFile f ); void read ( RCFile f ); protected: pstr name; int nCategories; PPCMMCIFCategory Category; ivector index; int flags; int Warning; int loopNo; // used locally for suggesting categories int tagNo; // used locally for suggesting tags psvector WrongCat; psvector WrongTag; int nWrongFields; void InitMMCIFData (); void FreeWrongFields (); Boolean CheckWrongField ( cpstr C, cpstr T ); void Sort (); // GetCategoryNo searches for index of category cname // in Category[]. Return: // >=0 : position of the category found // <0 : the category was not found, it could be inserted before // (-RC-1)th element, where RC is the return value int GetCategoryNo ( cpstr cname ); int AddCategory ( cpstr cname ); int DeleteCategory ( int CatNo ); void GetDataItem ( RCFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ); void GetLoop ( RCFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ); int GetField ( RCFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ); }; // ====================== CMMCIFFile ============================= DefineClass(CMMCIFFile) DefineStreamFunctions(CMMCIFFile) class CMMCIFFile : public CStream { public : int nData; ivector index; PPCMMCIFData data; CMMCIFFile (); CMMCIFFile ( cpstr FName, byte gzipMode=GZM_CHECK ); CMMCIFFile ( RPCStream Object ); ~CMMCIFFile(); void SetPrintWarnings ( Boolean SPW ) { PrintWarnings = SPW; } void SetStopOnWarning ( Boolean SOW ) { StopOnWarning = SOW; } int ReadMMCIFFile ( cpstr FName,byte gzipMode=GZM_CHECK); int WriteMMCIFFile ( cpstr FName,byte gzipMode=GZM_CHECK); int GetNofData() { return nData; } PCMMCIFData GetCIFData ( int dataNo ); // 0..nData-1 PCMMCIFData GetCIFData ( cpstr DName ); int AddMMCIFData ( cpstr DName ); int GetCIFDataNo ( cpstr DName ); void WriteMMCIF ( RCFile f ); void Copy ( PCMMCIFFile File ); void write ( RCFile f ); void read ( RCFile f ); protected: int nAllocData; Boolean PrintWarnings; Boolean StopOnWarning; void InitMMCIFFile(); void FreeMemory (); void Sort (); void ExpandData ( int nDataNew ); }; extern pstr GetMMCIFInputBuffer ( int & LineNo ); // isCIF will return // -1 if file FName does not exist // 0 if file FName is likely a CIF file ( 'data_' is present ) // 1 if file FName is not a CIF file ( 'data_' is absent ) extern int isCIF ( cpstr FName, byte gzipMode=GZM_CHECK ); pstr GetCIFMessage ( pstr M, int RC ); #endif mmdb-1.23.2.1/src/bfgs_min.cpp0000644000175100017510000005467311475665501012710 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // ================================================================= // // 27.06.01 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : bfgs_min // ~~~~~~~~~ // **** Classes : CBFGSMin ( minimization driver ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MATH_H #include #endif #ifndef __BFGS_Min__ #include "bfgs_min.h" #endif // ============================================================== CBFGSMin::CBFGSMin() { MFunc = NULL; MFuncData = NULL; PFunc = NULL; PFuncData = NULL; N = 0; NAlloc = 0; Hsn = NULL; TL = NULL; LL = NULL; XOpt = NULL; XPlus = NULL; Sx = NULL; SN = NULL; HDiag = NULL; GradX = NULL; GPlus = NULL; StepSize = NULL; FNeighbor = NULL; us = NULL; uy = NULL; ut = NULL; Freese = NULL; Func = 0.0; FPlus = 0.0; FOpt = 0.0; TakenLambda = 0.0; ForDiff = False; CalcHess = False; Etha = 0.0; SqrtEtha = 0.0; CubertEtha = 0.0; TpF = 1.0; GrdEps = 0.0; StpEps = 0.0; MxStep = MaxReal; CnsMax = 0; MaxItn = 100; TermCode = BFGS_NoTermination; ModF = False; } CBFGSMin::~CBFGSMin() { FreeMemory(); } void CBFGSMin::MinFunc ( rvector X, realtype & F ) { if (MFunc) (*MFunc)(MFuncData,N,X,F); else F = 0.0; } void CBFGSMin::MinFunc1 ( rvector X, realtype & F ) { int i; MinFunc ( X,F ); if (ModF && (FEtha) Etha = MachEps; } SqrtEtha = sqrt(Etha); CubertEtha = Exp ( log(Etha)/3.0 ); if (Etha>0.01) { TermCode = BFGS_TooFewDigits; return; } if (TypF<=0.0) TpF = 1.0; else TpF = TypF; S1 = Exp(log(MachEps)/3.0); if (GrdTol>0.0) GrdEps = GrdTol; else { GrdEps = sqrt(Etha); if (S1>GrdEps) GrdEps = S1; } if (StpTol>0.0) StpEps = StpTol; else StpEps = Exp ( log(MachEps)*2.0/3.0 ); if (MaxStp>0.0) MxStep = MaxStp; else { S1 = 0.0; S2 = 0.0; for (i=1;i<=N;i++) { S0 = Sx[i]; S0 *= Sx[i]; S2 += S0; S0 *= x0[i]; S1 += S0*x0[i]; } S1 = sqrt(S1); S2 = sqrt(S2); if (S2>S1) MxStep = S2; else MxStep = S1; MxStep *= 1000.0; } if (ItnLmt>0) MaxItn = ItnLmt; else MaxItn = 100; TermCode = BFGS_NoTermination; } // ------------------------------------------------------------------- void CBFGSMin::UMStop0 ( rvector x0, rvector Grad ) { int i; realtype S,Fmax,St; CnsMax = 0; if (TpF>fabs(Func)) Fmax = TpF; else Fmax = fabs(Func); S = 0.0; for (i=1;i<=N;i++) { St = fabs(x0[i]); if (1.0/Sx[i]>St) St = 1.0/Sx[i]; St = fabs(Grad[i])*St/Fmax; if (St>S) S = St; } if (S>=0.001*GrdEps) TermCode = BFGS_NoTermination; else TermCode = BFGS_SmallGradient; } // ------------------------------------------------------------------- void CBFGSMin::UMStop ( rvector x0, rvector Grad, int RetCode, int ItnCnt, Boolean MaxTkn ) { // A7.2.1 : Checking the Stop Conditions int i; realtype Max1,Max2,MaxGrad,MaxStep, BB1,BB2; TermCode = BFGS_NoTermination; if (RetCode==1) TermCode = BFGS_LineSearchComplete; else { if (fabs(FPlus)>TpF) Max2 = fabs(FPlus); else Max2 = TpF; MaxGrad = 0.0; MaxStep = 0.0; for (i=1;i<=N;i++) { BB1 = fabs(XPlus[i]); BB2 = 1.0/Sx[i]; if (BB1>BB2) Max1 = BB1; else Max1 = BB2; BB1 = fabs(Grad[i])*Max1/Max2; if (BB1>MaxGrad) MaxGrad = BB1; BB2 = fabs(XPlus[i]-x0[i])/Max1; if (BB2>MaxStep) MaxStep = BB2; } if (MaxGradMaxItn) TermCode = BFGS_IterationLimit; else if (MaxTkn) { CnsMax++; if (CnsMax==5) TermCode = BFGS_LargeSteps; } else CnsMax = 0; } } // ------------------------------------------------------------------- void CBFGSMin::MdHess ( rmatrix H, rvector HDg ) { // A5.5.1 : Setting up the hessian of model int i,j; realtype MaxDiag,MaxOff, MinEv,Mue,MaxPosDiag; realtype MaxOffl,MinDiag,MaxEv,MaxAdd,Sdd,OffRow; realtype BB; // Scaling for (i=1;i<=N;i++) for (j=i;j<=N;j++) H[i][j] /= (Sx[i]*Sx[j]); MaxDiag = H[1][1]; MinDiag = H[1][1]; MaxOff = 0.0; for (i=1;i<=N;i++) { if (H[i][i]>MaxDiag) MaxDiag = H[i][i]; if (H[i][i]MaxOff) MaxOff = BB; } } MaxPosDiag = 0.0; if (MaxDiag>MaxPosDiag) MaxPosDiag = MaxDiag; // Computing the shift of the spectra (the Mue) if (MinDiag>SqrtEps*MaxPosDiag) Mue = 0.0; else { Mue = 2.0*(MaxPosDiag-MinDiag)*SqrtEps-MinDiag; MaxDiag += Mue; } BB = MaxOff*(1.0+2.0*SqrtEps); if (BB>MaxDiag) { Mue = Mue+(MaxOff-MaxDiag)+2.0*SqrtEps*MaxOff; MaxDiag = BB; } if (MaxDiag==0.0) { // H = 0 Mue = 1.0; MaxDiag = 1.0; } if (Mue>0.0) for (i=1;i<=N;i++) Hsn[i][i] += Mue; MaxOffl = MaxOff/N; if (MaxDiag>MaxOffl) MaxOffl = MaxDiag; MaxOffl = sqrt(MaxOffl); for (i=1;i<=N;i++) HDg[i] = H[i][i]; PbCholDecomp ( N,HDg,MaxOffl,MachEps,H,MaxAdd ); if (MaxAdd>0.0) { MaxEv = HDg[1]; MinEv = HDg[1]; for (i=1;i<=N;i++) { OffRow = 0.0; if (i>1) for (j=1;jMaxEv) MaxEv = BB; BB = HDg[i]-OffRow; if (BBBB2) StepSizeJ = BB1; else StepSizeJ = BB2; if (X[j]<0.0) StepSizeJ = -StepSizeJ; StepSizeJ *= SqrtEtha; TempJ = X[j]; X[j] += StepSizeJ; StepSizeJ = X[j]-TempJ; MinFunc1 ( X,Fj ); if (TermCode!=BFGS_NoTermination) return; G[j] = (Fj-Fc)/StepSizeJ; X[j] = TempJ; Freese[j] = False; if (TL) { if ((fabs(X[j]-TL[j])<=StepSizeJ) && (G[j]<0.0)) { G[j] = 0.0; Freese[j] = True; } } if (LL) { if ((fabs(X[j]-LL[j])<=StepSizeJ) && (G[j]>0.0)) { G[j] = 0.0; Freese[j] = True; } } } } // ------------------------------------------------------------------- void CBFGSMin::CDGrad ( rvector X, rvector G ) { // A5.6.4 : Central Differencies Approximation of // Gradient realtype StepSizeJ,TempJ,Fp,Fm, BB1,BB2; int j; for (j=1;j<=N;j++) { BB1 = fabs(X[j]); BB2 = 1.0/Sx[j]; if (BB1>BB2) StepSizeJ = BB1; else StepSizeJ = BB2; if (X[j]<0.0) StepSizeJ = -StepSizeJ; StepSizeJ *= CubertEtha; TempJ = X[j]; X[j] += StepSizeJ; StepSizeJ = X[j]-TempJ; MinFunc1 ( X,Fp ); if (TermCode!=BFGS_NoTermination) return; X[j] = TempJ-StepSizeJ; MinFunc1 ( X,Fm ); if (TermCode!=BFGS_NoTermination) return; G[j] = (Fp-Fm)/(2.0*StepSizeJ); X[j] = TempJ; } } // ------------------------------------------------------------------- void CBFGSMin::Gradient ( rvector X, rvector G, realtype Fc ) { if (ForDiff) FDGrad ( X,G,Fc ); else CDGrad ( X,G ); } // ------------------------------------------------------------------- void CBFGSMin::FDHessF ( realtype Fc, rvector X ) { // A5.6.2 : Finite-Difference Approximation of // the Hessian employing only the // function's values int i,j; realtype S,TempI,Fii,TempJ,Fij, BB1,BB2; for (i=1;i<=N;i++) if (!Freese[i]) { BB1 = fabs(X[i]); BB2 = 1.0/Sx[i]; if (BB1>BB2) S = BB1; else S = BB2; if (X[i]<0.0) S = -S; StepSize[i] = S*CubertEtha; TempI = X[i]; X[i] += StepSize[i]; StepSize[i] = X[i]-TempI; MinFunc1 ( X,FNeighbor[i] ); X[i] = TempI; if (TermCode!=BFGS_NoTermination) return; } for (i=1;i<=N;i++) if (!Freese[i]) { TempI = X[i]; X[i] += 2.0*StepSize[i]; MinFunc1 ( X,Fii ); if (TermCode!=BFGS_NoTermination) return; Hsn[i][i] = (( Fc -FNeighbor[i] ) + ( Fii-FNeighbor[i] )) / (StepSize[i]*StepSize[i]); X[i] = TempI+StepSize[i]; if (iTemp) Temp = TpF; for (i=1;i<=N;i++) { H[i][i] = Temp*Sx[i]*Sx[i]; if (isqrt(MachEps*NormS*NormY)) { if (AnalGrad) Tol = Etha; else Tol = sqrt(Etha); SkipUpdate = True; for (i=1;i<=N;i++) { tt = 0.0; for (j=1;j<=i;j++) tt += H[j][i]*us[j]; if (itt) tt = BB; if (fabs(uy[i]-ut[i])>=Tol*tt) SkipUpdate = False; } if (!SkipUpdate) { Temp2 = 0.0; for (i=1;i<=N;i++) Temp2 += us[i]*ut[i]; for (i=1;i<=N;i++) for (j=i;j<=N;j++) H[i][j] += uy[i]*uy[j]/Temp1 - ut[i]*ut[j]/Temp2; } } } // ------------------------------------------------------------------- void CBFGSMin::Choose_Lambda ( rvector X, rvector S, realtype & Lambda0 ) { int i; realtype SS; for (i=1;i<=N;i++) if ((S[i]!=0.0) && (!Freese[i])) { SS = X[i] + Lambda0*S[i]; if (TL) { if (SS>TL[i]) Lambda0 = (TL[i]-X[i])/S[i]/(1.0+MachEps); } if (LL) { if (SSMxStep) { // restrict Newtonian step to MxStep S = MxStep/NewtLn; for (i=1;i<=N;i++) P[i] *= S; NewtLn = MxStep; } InitSp = 0.0; RelLng = 0.0; Lambda0 = 1.0; Choose_Lambda ( px0,P,Lambda0 ); for (i=1;i<=N;i++) { InitSp += G[i]*P[i]; B1 = fabs(px0[i]); B2 = 1.0/Sx[i]; if (B1>B2) S = B1; else S = B2; S = fabs(P[i])/S; if (S>RelLng) RelLng = S; } InitSp *= Lambda0; MinLam = StpEps/RelLng; Lambda = Lambda0; do { for (i=1;i<=N;i++) XPlus[i] = px0[i] + Lambda*P[i]; MinFunc1 ( XPlus,FPlus ); if (TermCode!=BFGS_NoTermination) return; if (FPlus<=pFunc+Alpha*Lambda*InitSp) { RetCode = 0; MaxTkn = (Lambda==Lambda0) && (NewtLn>0.99*MxStep); } else if (Lambda0.1*Lambda) Lambda = LamTem; else { Lambda *= 0.1; Lambda0 = Lambda; } if (Lambda>Lambda0) { Lambda = Lambda0; RetCode = 0; for (i=1;i<=N;i++) XPlus[i] = px0[i] + Lambda*P[i]; } } else { B1 = FPlus - pFunc - Lambda*InitSp; B2 = FplPre - pFunc - LamPre*InitSp; A = ( B1/(Lambda*Lambda) - B2/(LamPre*LamPre) ) / ( Lambda - LamPre ); B = ( -LamPre*B1/(Lambda*Lambda) + Lambda*B2/(LamPre*LamPre) ) / ( Lambda - LamPre ); Disc = B*B - 3.0*A*InitSp; if (A==0.0) LamTem = -InitSp/(2.0*B); else LamTem = (-B+sqrt(Disc))/(3.0*A); B1 = 0.5*Lambda; if (B10.1*Lambda) Lambda = LamTem; else { Lambda *= 0.1; Lambda0 = Lambda; } if (Lambda>Lambda0) { Lambda = Lambda0; RetCode = 0; for (i=1;i<=N;i++) XPlus[i] = px0[i] + Lambda*P[i]; } } } while (RetCode>=2); TakenLambda = Lambda; } // ------------------------------------------------------------------- void CBFGSMin::GetMemory() { if (N!=NAlloc) { FreeMemory(); GetMatrixMemory ( Hsn , N,N, 1,1 ); GetVectorMemory ( GPlus , N, 1 ); GetVectorMemory ( GradX , N, 1 ); GetVectorMemory ( HDiag , N, 1 ); GetVectorMemory ( SN , N, 1 ); GetVectorMemory ( Sx , N, 1 ); GetVectorMemory ( XPlus , N, 1 ); GetVectorMemory ( XOpt , N, 1 ); GetVectorMemory ( Freese, N, 1 ); if (CalcHess) { GetVectorMemory ( StepSize , N, 1 ); GetVectorMemory ( FNeighbor, N, 1 ); } else { GetVectorMemory ( us , N, 1 ); GetVectorMemory ( uy , N, 1 ); GetVectorMemory ( ut , N, 1 ); } NAlloc = N; } } void CBFGSMin::FreeMemory() { if (NAlloc>0) { FreeVectorMemory ( us , 1 ); FreeVectorMemory ( uy , 1 ); FreeVectorMemory ( ut , 1 ); FreeVectorMemory ( Freese , 1 ); FreeVectorMemory ( StepSize , 1 ); FreeVectorMemory ( FNeighbor, 1 ); FreeVectorMemory ( XOpt , 1 ); FreeVectorMemory ( XPlus , 1 ); FreeVectorMemory ( Sx , 1 ); FreeVectorMemory ( SN , 1 ); FreeVectorMemory ( HDiag , 1 ); FreeVectorMemory ( GradX , 1 ); FreeVectorMemory ( GPlus , 1 ); FreeMatrixMemory ( Hsn , NAlloc, 1,1 ); } NAlloc = 0; } // ------------------------------------------------------------------- void CBFGSMin::Relax() { int i; if (FPlus>FOpt) { for (i=1;i<=N;i++) XPlus[i] = XOpt[i]; FPlus = FOpt; } else { for (i=1;i<=N;i++) XOpt[i] = XPlus[i]; FOpt = FPlus; } } void CBFGSMin::CopyPlus ( rvector x0 ) { int i; for (i=1;i<=N;i++) { x0 [i] = XPlus[i]; GradX[i] = GPlus[i]; } Func = FPlus; } // ------------------------------------------------------------------- void CBFGSMin::BFGS_Driver ( int MinN, rvector x0, rvector TypX, realtype & FuncValue, int & TerminationCode, int Digits, int ItnLmt, realtype TypF, realtype GrdTol, realtype StpTol, realtype MaxStp, Boolean Hess, rvector LowLimit, rvector TopLimit ) { // D6.1.1 : Unconstrained Minimization Driver int i,RetCode; int ItnCnt; Boolean MaxTkn; TL = TopLimit; LL = LowLimit; ForDiff = True; N = MinN; CalcHess = Hess; ModF = False; GetMemory(); UMInCk ( x0,TypX,Digits,TypF, GrdTol,StpTol,MaxStp, ItnLmt ); if (TermCode!=BFGS_NoTermination) { FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } ItnCnt = 0; MinFunc1 ( x0,Func ); if (TermCode!=BFGS_NoTermination) { FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } FOpt = Func; FPlus = Func; for (i=1;i<=N;i++) { XOpt [i] = x0[i]; XPlus[i] = x0[i]; } ModF = True; Gradient ( x0,GradX,Func ); Print ( ItnCnt,x0,GradX,Func ); for (i=1;i<=N;i++) GPlus[i] = GradX[i]; if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } UMStop0 ( x0,GradX ); if (TermCode!=BFGS_NoTermination) { FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } if (!CalcHess) InitHessUnFac ( Func,Hsn ); RetCode = 0; while (TermCode==BFGS_NoTermination) { ItnCnt++; if (RetCode>=0) { if (CalcHess) { FDHessF ( Func,x0 ); if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } } MdHess ( Hsn,HDiag ); } ChSolve ( N,Hsn,GradX,SN ); LineSearch ( x0,GradX,SN,Func,RetCode,MaxTkn ); if ((RetCode==1) && ForDiff) { RetCode = -1; ForDiff = False; } else Relax(); if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } else Gradient ( XPlus,GPlus,FPlus ); if (TermCode!=BFGS_NoTermination) { Relax (); CopyPlus ( x0 ); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; return; } if (RetCode>=0) { UMStop ( x0,GPlus,RetCode,ItnCnt,MaxTkn ); if ((!CalcHess) && (TermCode==BFGS_NoTermination)) BFGSUnFac ( x0,XPlus,GradX,GPlus,False,HDiag,Hsn ); } CopyPlus ( x0 ); Print ( ItnCnt, x0,GradX,Func ); } Relax (); FreeMemory(); FuncValue = Func; TerminationCode = TermCode; } mmdb-1.23.2.1/src/mmdb_title.cpp0000644000175100017510000017350711475666363013251 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Title // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CTitleContainer (container for title classes) // ~~~~~~~~~ CObsLine // CTitleLine // CCaveat // CCompound // CSource // CKeyWords // CExpData // CAuthor // CRevData // CSupersede // CJournal // CRemark // CBiomolecule // CMMDBTitle ( MMDB title section ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MMDB_Title__ #include "mmdb_title.h" #endif #ifndef __MMDB_CIFDefs__ #include "mmdb_cifdefs.h" #endif // ============== CTitleContainer ==================== PCContainerClass CTitleContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return CClassContainer::MakeContainerClass(ClassID); case ClassID_ObsLine : return new CObsLine (); case ClassID_CAVEAT : return new CCaveat (); case ClassID_TitleLine : return new CTitleLine(); case ClassID_Compound : return new CCompound (); case ClassID_Source : return new CSource (); case ClassID_ExpData : return new CExpData (); case ClassID_Author : return new CAuthor (); case ClassID_RevData : return new CRevData (); case ClassID_Supersede : return new CSupersede(); case ClassID_Journal : return new CJournal (); case ClassID_Remark : return new CRemark (); } } MakeStreamFunctions(CTitleContainer) // ================ CObsLine =================== CObsLine::CObsLine() : CContainerClass() { InitObsLine(); } CObsLine::CObsLine ( cpstr S ) : CContainerClass() { InitObsLine(); ConvertPDBASCII ( S ); } CObsLine::CObsLine ( RPCStream Object ) : CContainerClass(Object) { InitObsLine(); } CObsLine::~CObsLine() {} void CObsLine::InitObsLine() { int i; strcpy ( repDate,"DD-MMM-YYYY" ); strcpy ( idCode, "----" ); for (i=0;i<8;i++) strcpy ( rIdCode[i]," " ); } void CObsLine::PDBASCIIDump ( pstr S, int N ) { // makes the ASCII PDB OBSLTE line number N // from the class' data int i; if (N==0) strcpy ( S,"OBSLTE " ); else sprintf ( S,"OBSLTE %2i",N+1 ); PadSpaces ( S,80 ); Date11to9 ( repDate,&(S[11]) ); strncpy ( &(S[21]),idCode,4 ); for (i=0;i<8;i++) strncpy ( &(S[31+5*i]),rIdCode[i],4 ); } void CObsLine::MakeCIF ( PCMMCIFData CIF, int ) { PCMMCIFLoop Loop; int RC,i,j; char DateCIF[20]; RC = CIF->AddLoop ( CIFCAT_OBSLTE,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_DATE ); Loop->AddLoopTag ( CIFTAG_REPLACE_PDB_ID ); Loop->AddLoopTag ( CIFTAG_PDB_ID ); } Date11toCIF ( repDate,DateCIF ); for (i=0;i<8;i++) { j = 0; while (rIdCode[i][j] && (rIdCode[i][j]==' ')) j++; if (rIdCode[i][j]) { Loop->AddString ( pstr("OBSLTE") ); Loop->AddString ( DateCIF ); Loop->AddString ( idCode ); Loop->AddString ( rIdCode[i] ); } } } int CObsLine::ConvertPDBASCII ( cpstr S ) { int i; Date9to11 ( &(S[11]),repDate ); strncpy ( idCode,&(S[21]),4 ); idCode[4] = char(0); for (i=0;i<8;i++) { strncpy ( rIdCode[i],&(S[31+i*5]),4 ); rIdCode[i][4] = char(0); } return 0; } void CObsLine::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; int i,RC; pstr F,FDate,FID; char DateCIF [20]; char DateCIF0[20]; IDCode idCode1; Loop = CIF->GetLoop ( CIFCAT_OBSLTE ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } i = 0; do { F = Loop->GetString ( CIFTAG_ID,Signal,RC ); if (RC) { if (i==0) Signal = -1; return; } if (F) { if (!strcmp(F,"OBSLTE")) { FDate = Loop->GetString ( CIFTAG_DATE,Signal,RC ); if ((!RC) && FDate) strncpy ( DateCIF,FDate,15 ); else strcpy ( DateCIF,"YYYY-MMM-DD" ); FID = Loop->GetString ( CIFTAG_REPLACE_PDB_ID,Signal,RC ); if ((!RC) && FID) strncpy ( idCode1,FID,sizeof(IDCode)-1 ); else idCode1[0] = char(0); if (i==0) { DateCIFto11 ( DateCIF,repDate ); DateCIF[11] = char(0); strcpy ( idCode ,idCode1 ); strcpy ( DateCIF0,DateCIF ); } else if ((strcmp(DateCIF0,DateCIF)) || (strcmp(idCode,idCode1))) return; FID = Loop->GetString ( CIFTAG_PDB_ID,Signal,RC ); if ((!RC) && FID) strncpy ( rIdCode[i],FID,sizeof(IDCode)-1 ); else rIdCode[i][0] = char(0); Loop->DeleteField ( CIFTAG_ID ,Signal ); Loop->DeleteField ( CIFTAG_DATE ,Signal ); Loop->DeleteField ( CIFTAG_REPLACE_PDB_ID,Signal ); Loop->DeleteField ( CIFTAG_PDB_ID ,Signal ); i++; } } Signal++; } while (i<8); } void CObsLine::Copy ( PCContainerClass ObsLine ) { int i; strcpy ( repDate,PCObsLine(ObsLine)->repDate ); strcpy ( idCode ,PCObsLine(ObsLine)->idCode ); for (i=0;i<8;i++) strcpy ( rIdCode[i],PCObsLine(ObsLine)->rIdCode[i] ); } void CObsLine::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( repDate,False ); f.WriteTerLine ( idCode ,False ); for (i=0;i<8;i++) f.WriteTerLine ( rIdCode[i],False ); } void CObsLine::read ( RCFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( repDate,False ); f.ReadTerLine ( idCode ,False ); for (i=0;i<8;i++) f.ReadTerLine ( rIdCode[i],False ); } MakeStreamFunctions(CObsLine) // =================== CTitleLine ====================== CTitleLine::CTitleLine() : CContString() { InitTitleLine(); } CTitleLine::CTitleLine ( cpstr S ) : CContString() { InitTitleLine(); ConvertPDBASCII ( S ); } CTitleLine::CTitleLine ( RPCStream Object ) : CContString(Object) { InitTitleLine(); } CTitleLine::~CTitleLine() { } void CTitleLine::InitTitleLine() { CreateCopy ( CIFCategory,CIFCAT_STRUCT ); CreateCopy ( CIFTag, CIFTAG_TITLE ); } int CTitleLine::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return 0; } void CTitleLine::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"TITLE " ); else sprintf ( S,"TITLE %2i",N+1 ); strcat ( S,Line ); } void CTitleLine::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CContString::write ( f ); } void CTitleLine::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CContString::read ( f ); } MakeStreamFunctions(CTitleLine) // =================== CCaveat ====================== CCaveat::CCaveat() : CContString() { InitCaveat(); } CCaveat::CCaveat ( cpstr S ) : CContString() { InitCaveat(); ConvertPDBASCII ( S ); } CCaveat::CCaveat ( RPCStream Object ) : CContString(Object) { InitCaveat(); } CCaveat::~CCaveat() {} void CCaveat::InitCaveat() { strcpy ( idCode,"----" ); CreateCopy ( CIFCategory,CIFCAT_DATABASE_PDB_CAVEAT ); CreateCopy ( CIFTag ,CIFTAG_TEXT ); } int CCaveat::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>12) { strncpy ( idCode,&(S[11]),4 ); idCode[4] = char(0); if (strlen(S)>19) CreateCopy ( Line,&(S[19]) ); else CreateCopy ( Line,pstr(" ") ); } else CreateCopy ( Line,pstr(" ") ); return 0; } void CCaveat::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"CAVEAT " ); else sprintf ( S,"CAVEAT %2i ",N+1 ); strcat ( S,idCode ); strcat ( S," " ); strcat ( S,Line ); } void CCaveat::MakeCIF ( PCMMCIFData CIF, int N ) { char S[500]; CIF->PutString ( idCode,CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_ID,False ); strcpy ( S,"\n" ); strncat ( S,Line,sizeof(S)-2 ); S[sizeof(S)-1] = char(0); CIF->PutString ( S,CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_TEXT,(N!=0) ); } void CCaveat::GetCIF ( PCMMCIFData CIF, int & Signal ) { pstr F; int RC; F = CIF->GetString ( CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_ID,RC ); if ((!RC) && F) { strncpy ( idCode,F,sizeof(IDCode) ); idCode[sizeof(IDCode)-1] = char(0); } CContString::GetCIF ( CIF,Signal ); if (Signal<0) CIF->DeleteField ( CIFCAT_DATABASE_PDB_CAVEAT,CIFTAG_ID ); } void CCaveat::Copy ( PCContainerClass Caveat ) { strcpy ( idCode,PCCaveat(Caveat)->idCode ); CContString::Copy ( Caveat ); } void CCaveat::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( idCode,False ); CContString::write ( f ); } void CCaveat::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( idCode,False ); CContString::read ( f ); } MakeStreamFunctions(CCaveat) // =================== CCompound ====================== CCompound::CCompound() : CContString() { InitCompound(); } CCompound::CCompound ( cpstr S ) : CContString() { InitCompound(); ConvertPDBASCII ( S ); } CCompound::CCompound ( RPCStream Object ) : CContString(Object) { InitCompound(); } CCompound::~CCompound() {} void CCompound::InitCompound() { CreateCopy ( CIFCategory,CIFCAT_STRUCT ); CreateCopy ( CIFTag ,CIFTAG_NDB_DESCRIPTOR ); } int CCompound::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return 0; } void CCompound::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"COMPND " ); else sprintf ( S,"COMPND %2i",N+1 ); strcat ( S,Line ); } void CCompound::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CContString::write ( f ); } void CCompound::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CContString::read ( f ); } MakeStreamFunctions(CCompound) // =================== CSource ====================== CSource::CSource() : CContString() { InitSource(); } CSource::CSource ( cpstr S ) : CContString() { InitSource(); ConvertPDBASCII ( S ); } CSource::CSource ( RPCStream Object ) : CContString(Object) { InitSource(); } CSource::~CSource() {} void CSource::InitSource() { CreateCopy ( CIFCategory,CIFCAT_STRUCT ); CreateCopy ( CIFTag ,CIFTAG_SOURCE ); } int CSource::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return 0; } void CSource::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"SOURCE " ); else sprintf ( S,"SOURCE %2i",N+1 ); strcat ( S,Line ); } void CSource::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CContString::write ( f ); } void CSource::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CContString::read ( f ); } MakeStreamFunctions(CSource) // =================== CKeyWords ====================== CKeyWords::CKeyWords() : CStream() { Init(); } CKeyWords::CKeyWords ( cpstr S ) : CStream() { Init(); ConvertPDBASCII ( S ); } CKeyWords::CKeyWords ( RPCStream Object ) : CStream(Object) { Init(); } CKeyWords::~CKeyWords() { Delete(); } void CKeyWords::Init() { nKeyWords = 0; KeyWord = NULL; Cont = False; } void CKeyWords::Delete() { int i; if (KeyWord) { for (i=0;i0) && (L[m]==' ')) m--; // remove padding spaces m++; L[m] = char(0); if (Cont) CreateConcat ( KeyWord[nKeyWords],L ); else CreateCopy ( KeyWord[nKeyWords],L ); if (S[i]==',') { i++; Cont = False; } else Cont = True; nKeyWords++; } return 0; } void CKeyWords::PDBASCIIDump ( RCFile f ) { int N,i,k,m1,m2,ms; char S[85]; char c; if (KeyWord) { N = 0; i = 0; while (i70) { CIF->PutString ( S,CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT,True ); if (k>(int)sizeof(S)) { CIF->PutString ( KeyWord[i],CIFCAT_STRUCT_KEYWORDS, CIFTAG_TEXT,True ); k = 0; } strcpy ( S,"\n" ); } if (k>0) { strcat ( S,KeyWord[i] ); if (i1) CIF->PutString ( S,CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT,True ); } void CKeyWords::GetCIF ( PCMMCIFData CIF ) { pstr F; int i,j,k; Boolean NB; char c; Delete(); F = CIF->GetString ( CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT,i ); k = 0; if ((!i) && F) { i = 0; NB = False; while (F[i]) { if (F[i]==',') { nKeyWords++; NB = False; } else if (F[i]!=' ') NB = True; i++; } if (NB) nKeyWords++; KeyWord = new pstr[nKeyWords]; i = 0; while (F[i] && (kDeleteField ( CIFCAT_STRUCT_KEYWORDS,CIFTAG_TEXT ); } void CKeyWords::Copy ( PCKeyWords KeyWords ) { int i; Delete(); nKeyWords = KeyWords->nKeyWords; if (nKeyWords>0) { KeyWord = new pstr[nKeyWords]; for (i=0;iKeyWord[i] ); } } } void CKeyWords::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &nKeyWords ); for (i=0;i0) { KeyWord = new pstr[nKeyWords]; for (i=0;i10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return 0; } void CExpData::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"EXPDTA " ); else sprintf ( S,"EXPDTA %2i",N+1 ); strcat ( S,Line ); } void CExpData::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CContString::write ( f ); } void CExpData::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CContString::read ( f ); } MakeStreamFunctions(CExpData) // =================== CAuthor ====================== CAuthor::CAuthor() : CContString() { InitAuthor(); } CAuthor::CAuthor ( cpstr S ) : CContString() { InitAuthor(); ConvertPDBASCII ( S ); } CAuthor::CAuthor ( RPCStream Object ) : CContString(Object) { InitAuthor(); } CAuthor::~CAuthor() {} void CAuthor::InitAuthor() { CreateCopy ( CIFCategory,CIFCAT_AUDIT_AUTHOR ); CreateCopy ( CIFTag ,CIFTAG_NAME ); } int CAuthor::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return 0; } void CAuthor::PDBASCIIDump ( pstr S, int N ) { if (N==0) strcpy ( S,"AUTHOR " ); else sprintf ( S,"AUTHOR %2i",N+1 ); strcat ( S,Line ); } void CAuthor::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CContString::write ( f ); } void CAuthor::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CContString::read ( f ); } MakeStreamFunctions(CAuthor) // ================ CRevData =================== CRevData::CRevData() : CContainerClass() { InitRevData(); } CRevData::CRevData ( cpstr S ) : CContainerClass() { InitRevData(); ConvertPDBASCII ( S ); } CRevData::CRevData ( RPCStream Object ) : CContainerClass(Object) { InitRevData(); } CRevData::~CRevData() {} void CRevData::InitRevData() { int i; modNum = 0; strcpy ( modDate,"DD-MMM-YYYY" ); strcpy ( modId , "----" ); modType = -1; for (i=0;i<4;i++) strcpy ( record[i]," " ); Warning = 0; } void CRevData::PDBASCIIDump ( pstr S, int N ) { // makes the ASCII PDB REVDATA line number N // from the class' data int i; if (N==0) sprintf ( S,"REVDAT %3i " ,modNum ); else sprintf ( S,"REVDAT %3i%2i",modNum,N+1 ); i = strlen(S); while (i<80) S[i++] = ' '; S[i] = char(0); Date11to9 ( modDate,&(S[13]) ); strncpy ( &(S[23]),modId,5 ); S[31] = char(modType+int('0')); for (i=0;i<4;i++) strncpy ( &(S[39+i*7]),record[i],6 ); } void CRevData::MakeCIF ( PCMMCIFData CIF, int N ) { PCMMCIFLoop Loop; int RC,i,j; char DateCIF[20]; RC = CIF->AddLoop ( CIFCAT_DATABASE_PDB_REV,Loop ); if ((RC!=CIFRC_Ok) || (N==0)) { // the category was (re)created, privide tags Loop->AddLoopTag ( CIFTAG_NUM ); Loop->AddLoopTag ( CIFTAG_DATE ); Loop->AddLoopTag ( CIFTAG_REPLACES ); Loop->AddLoopTag ( CIFTAG_MOD_TYPE ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_1 ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_2 ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_3 ); Loop->AddLoopTag ( CIFTAG_RCSB_RECORD_REVISED_4 ); } Date11toCIF ( modDate,DateCIF ); Loop->AddInteger ( modNum ); Loop->AddString ( DateCIF ); Loop->AddString ( modId ); Loop->AddInteger ( modType ); for (i=0;i<4;i++) { j = 0; while (record[i][j] && (record[i][j]==' ')) j++; if (record[i][j]) Loop->AddString ( record[i] ); else Loop->AddString ( NULL ); } } void CRevData::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; int RC; pstr F; Loop = CIF->GetLoop ( CIFCAT_DATABASE_PDB_REV ); if (!Loop) { Signal = -1; return; } RC = Loop->GetInteger ( modNum,CIFTAG_NUM,Signal,True ); if (RC==CIFRC_WrongIndex) { Signal = -1; return; } if (RC==CIFRC_WrongFormat) { sprintf ( CIFErrorLocation,"loop %s.%s row %i", CIFCAT_DATABASE_PDB_REV,CIFTAG_NUM,Signal ); Signal = -Error_UnrecognizedInteger-1; return; } F = Loop->GetString ( CIFTAG_DATE,Signal,RC ); if ((!RC) && F) DateCIFto11 ( F,modDate ); F = Loop->GetString ( CIFTAG_REPLACES,Signal,RC ); if ((!RC) && F) strcpy ( modId,F ); RC = Loop->GetInteger ( modType,CIFTAG_MOD_TYPE,Signal,True ); if (RC==CIFRC_WrongFormat) { sprintf ( CIFErrorLocation,"loop %s.%s row %i", CIFCAT_DATABASE_PDB_REV,CIFTAG_MOD_TYPE,Signal ); Signal = -Error_UnrecognizedInteger-1; return; } F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_1,Signal,RC ); if ((!RC) && F) strcpy ( record[0],F ); F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_2,Signal,RC ); if ((!RC) && F) strcpy ( record[1],F ); F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_3,Signal,RC ); if ((!RC) && F) strcpy ( record[2],F ); F = Loop->GetString ( CIFTAG_RCSB_RECORD_REVISED_4,Signal,RC ); if ((!RC) && F) strcpy ( record[3],F ); Loop->DeleteField ( CIFTAG_DATE ,Signal ); Loop->DeleteField ( CIFTAG_REPLACES ,Signal ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_1,Signal ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_2,Signal ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_3,Signal ); Loop->DeleteField ( CIFTAG_RCSB_RECORD_REVISED_4,Signal ); Signal++; } int CRevData::ConvertPDBASCII ( cpstr S ) { int i; pstr endptr; char N[20]; Warning = 0; strncpy ( N,&(S[7]),3 ); N[3] = char(0); modNum = mround(strtod(N,&endptr)); if (endptr==N) Warning |= REVDAT_WARN_MODNUM; Date9to11 ( &(S[13]),modDate ); strncpy ( modId,&(S[23]),5 ); modId[5] = char(0); modType = int(S[31]) - int('0'); if (modType>9) Warning |= REVDAT_WARN_MODTYPE; for (i=0;i<4;i++) { strncpy ( record[i],&(S[39+i*7]),6 ); record[i][6] = char(0); } return 0; } void CRevData::Copy ( PCContainerClass RevData ) { int i; modNum = PCRevData(RevData)->modNum; modType = PCRevData(RevData)->modType; strcpy ( modDate,PCRevData(RevData)->modDate ); strcpy ( modId ,PCRevData(RevData)->modId ); for (i=0;i<4;i++) strcpy ( record[i],PCRevData(RevData)->record[i] ); } void CRevData::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &modNum ); f.WriteInt ( &modType ); f.WriteWord ( &Warning ); f.WriteTerLine ( modDate,False ); f.WriteTerLine ( modId ,False ); for (i=0;i<4;i++) f.WriteTerLine ( record[i],False ); } void CRevData::read ( RCFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadInt ( &modNum ); f.ReadInt ( &modType ); f.ReadWord ( &Warning ); f.ReadTerLine ( modDate,False ); f.ReadTerLine ( modId ,False ); for (i=0;i<4;i++) f.ReadTerLine ( record[i],False ); } MakeStreamFunctions(CRevData) // ================ CSupersede =================== CSupersede::CSupersede() : CContainerClass() { InitSupersede(); } CSupersede::CSupersede ( cpstr S ) : CContainerClass() { InitSupersede(); ConvertPDBASCII ( S ); } CSupersede::CSupersede ( RPCStream Object ) : CContainerClass(Object) { InitSupersede(); } CSupersede::~CSupersede() {} void CSupersede::InitSupersede() { int i; strcpy ( sprsdeDate,"DD-MMM-YYYY" ); strcpy ( idCode, "----" ); for (i=0;i<8;i++) strcpy ( sIdCode[i]," " ); } void CSupersede::PDBASCIIDump ( pstr S, int N ) { // makes the ASCII PDB OBSLTE line number N // from the class' data int i; if (N==0) strcpy ( S,"SPRSDE " ); else sprintf ( S,"SPRSDE %2i",N+1 ); i = strlen(S); while (i<80) S[i++] = ' '; S[i] = char(0); if (N==0) { Date11to9 ( sprsdeDate,&(S[11]) ); strncpy ( &(S[21]),idCode,4 ); } for (i=0;i<8;i++) strncpy ( &(S[31+5*i]),sIdCode[i],4 ); } void CSupersede::MakeCIF ( PCMMCIFData CIF, int ) { PCMMCIFLoop Loop; int RC,i,j; char DateCIF[20]; RC = CIF->AddLoop ( CIFCAT_SPRSDE,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, privide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_DATE ); Loop->AddLoopTag ( CIFTAG_REPLACE_PDB_ID ); Loop->AddLoopTag ( CIFTAG_PDB_ID ); } Date11toCIF ( sprsdeDate,DateCIF ); for (i=0;i<8;i++) { j = 0; while (sIdCode[i][j] && (sIdCode[i][j]==' ')) j++; if (sIdCode[i][j]) { Loop->AddString ( pstr("SPRSDE") ); Loop->AddString ( DateCIF ); Loop->AddString ( idCode ); Loop->AddString ( sIdCode[i] ); } } } int CSupersede::ConvertPDBASCII ( cpstr S ) { int i; if (S[9]==' ') { Date9to11 ( &(S[11]),sprsdeDate ); strncpy ( idCode,&(S[21]),4 ); idCode[4] = char(0); } for (i=0;i<8;i++) { strncpy ( sIdCode[i],&(S[31+i*5]),4 ); sIdCode[i][4] = char(0); } return 0; } void CSupersede::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; int i,RC; pstr F,FDate,FID; char DateCIF [20]; char DateCIF0[20]; IDCode idCode1; Loop = CIF->GetLoop ( CIFCAT_SPRSDE ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } i = 0; do { F = Loop->GetString ( CIFTAG_ID,Signal,RC ); if (RC) { if (i==0) Signal = -1; return; } if (F) { if (!strcmp(F,"SPRSDE")) { FDate = Loop->GetString ( CIFTAG_DATE,Signal,RC ); if ((!RC) && FDate) strncpy ( DateCIF,FDate,15 ); else strcpy ( DateCIF,"YYYY-MMM-DD" ); FID = Loop->GetString ( CIFTAG_REPLACE_PDB_ID,Signal,RC ); if ((!RC) && FID) strncpy ( idCode1,FID,sizeof(IDCode)-1 ); else idCode1[0] = char(0); if (i==0) { DateCIFto11 ( DateCIF,sprsdeDate ); DateCIF[11] = char(0); strcpy ( idCode ,idCode1 ); strcpy ( DateCIF0,DateCIF ); } else if ((strcmp(DateCIF0,DateCIF)) || (strcmp(idCode,idCode1))) return; FID = Loop->GetString ( CIFTAG_PDB_ID,Signal,RC ); if ((!RC) && FID) strncpy ( sIdCode[i],FID,sizeof(IDCode)-1 ); else sIdCode[i][0] = char(0); Loop->DeleteField ( CIFTAG_ID ,Signal ); Loop->DeleteField ( CIFTAG_DATE ,Signal ); Loop->DeleteField ( CIFTAG_REPLACE_PDB_ID,Signal ); Loop->DeleteField ( CIFTAG_PDB_ID ,Signal ); i++; } } Signal++; } while (i<8); } void CSupersede::Copy ( PCContainerClass Supersede ) { int i; strcpy ( sprsdeDate,PCSupersede(Supersede)->sprsdeDate ); strcpy ( idCode ,PCSupersede(Supersede)->idCode ); for (i=0;i<8;i++) strcpy ( sIdCode[i],PCSupersede(Supersede)->sIdCode[i] ); } void CSupersede::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteTerLine ( sprsdeDate,False ); f.WriteTerLine ( idCode ,False ); for (i=0;i<8;i++) f.WriteTerLine ( sIdCode[i],False ); } void CSupersede::read ( RCFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadTerLine ( sprsdeDate,False ); f.ReadTerLine ( idCode ,False ); for (i=0;i<8;i++) f.ReadTerLine ( sIdCode[i],False ); } MakeStreamFunctions(CSupersede) // =================== CJournal ====================== CJournal::CJournal() : CContString() { InitJournal(); } CJournal::CJournal ( cpstr S ) : CContString() { InitJournal(); ConvertPDBASCII ( S ); } CJournal::CJournal ( RPCStream Object ) : CContString(Object) { InitJournal(); } CJournal::~CJournal() {} void CJournal::InitJournal() { CreateCopy ( CIFCategory,CIFCAT_CITATION ); CreateCopy ( CIFTag ,CIFTAG_TEXT ); } int CJournal::ConvertPDBASCII ( cpstr S ) { if (strlen(S)>10) CreateCopy ( Line,&(S[10]) ); else CreateCopy ( Line,pstr(" ") ); return 0; } void CJournal::PDBASCIIDump ( pstr S, int ) { strcpy ( S,"JRNL " ); strcat ( S,Line ); } void CJournal::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CContString::write ( f ); } void CJournal::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CContString::read ( f ); } MakeStreamFunctions(CJournal) // =================== CRemark ====================== CRemark::CRemark() : CContainerClass() { InitRemark(); } CRemark::CRemark ( cpstr S ) : CContainerClass() { InitRemark(); ConvertPDBASCII ( S ); } CRemark::CRemark ( RPCStream Object ) : CContainerClass(Object) { InitRemark(); } CRemark::~CRemark() { if (Remark) delete[] Remark; } void CRemark::InitRemark() { remarkNum = 0; Remark = NULL; } int CRemark::ConvertPDBASCII ( cpstr S ) { int i; GetInteger ( remarkNum,&(S[7]),3 ); if (remarkNum==MinInt4) CreateCopy ( Remark,S ); else if (strlen(S)>11) CreateCopy ( Remark,&(S[11]) ); else CreateCopy ( Remark,pstr(" ") ); i = strlen(Remark)-1; while ((i>0) && (Remark[i]==' ')) i--; Remark[i+1] = char(0); return 0; } void CRemark::PDBASCIIDump ( pstr S, int ) { if (remarkNum==MinInt4) strcpy ( S,Remark ); else { strcpy ( S,"REMARK" ); PadSpaces ( S,80 ); PutInteger ( &(S[7]) ,remarkNum,3 ); strncpy ( &(S[11]),Remark,IMin(68,strlen(Remark)) ); } } void CRemark::MakeCIF ( PCMMCIFData CIF, int N ) { PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_NDB_DATABASE_REMARK,Loop ); if ((RC!=CIFRC_Ok) || (N==0)) { // the category was (re)created, privide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_TEXT ); } if (remarkNum==MinInt4) Loop->AddString ( NULL ); else Loop->AddInteger ( remarkNum ); Loop->AddString ( Remark ); } void CRemark::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; int RC; Loop = CIF->GetLoop ( CIFCAT_NDB_DATABASE_REMARK ); if (!Loop) { Signal = -1; return; } if (Signal>=Loop->GetLoopLength() ) { Signal = -1; return; } RC = Loop->GetInteger ( remarkNum,CIFTAG_ID,Signal,True ); if (RC==CIFRC_WrongFormat) { sprintf ( CIFErrorLocation,"loop %s.%s row %i", CIFCAT_NDB_DATABASE_REMARK,CIFTAG_ID,Signal ); Signal = -Error_UnrecognizedInteger-1; return; } else if (RC) remarkNum = MinInt4; Loop->GetString ( Remark,CIFTAG_TEXT,Signal,True ); Signal++; } void CRemark::Copy ( PCContainerClass RemarkClass ) { remarkNum = PCRemark(RemarkClass)->remarkNum; CreateCopy ( Remark,PCRemark(RemarkClass)->Remark ); } void CRemark::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &remarkNum ); f.CreateWrite ( Remark ); } void CRemark::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &remarkNum ); f.CreateRead ( Remark ); } MakeStreamFunctions(CRemark) // ================= CBiomolecule ===================== #define R350_ERRBIOMT (-3) #define R350_ERROR (-2) #define R350_END (-1) #define R350_NONE 0 #define R350_BIOMOLECULE 1 #define R350_CHAINS 2 #define R350_BIOMT 3 void getRemarkKey ( RPCRemark rem, int & lkey ) { if (rem) { if (rem->remarkNum!=350) lkey = R350_END; else if (rem->Remark) { if (strcasestr(rem->Remark,"BIOMOLECULE:")) lkey = R350_BIOMOLECULE; else if (strcasestr(rem->Remark,"CHAINS:")) lkey = R350_CHAINS; else if (strcasestr(rem->Remark,"BIOMT1") || strcasestr(rem->Remark,"BIOMT2") || strcasestr(rem->Remark,"BIOMT3")) lkey = R350_BIOMT; else lkey = R350_NONE; } } } int lookupRemarks ( int & i, RPCRemark rem, RCTitleContainer Remark ) { int l,lkey; l = Remark.Length(); lkey = R350_NONE; while ((iRemark,"CHAINS:" ); if (p) p += 7; else { p = rem->Remark; while (*p==' ') p++; if ((p[1]!=',') && (p[1]!=' ')) p = NULL; } if (p) { nAdd = strlen(p)/2 + 3; ch1 = chain; chain = new ChainID[nChains+nAdd]; for (j=0;jremarkNum!=350) lkey = R350_END; else getRemarkKey ( rem,lkey ); } } else lkey = R350_END; } while ((!rem) && (lkey==R350_NONE)); } return lkey; } int getBIOMT ( RPCRemark rem, int biomtNo, mat44 & t, RCTitleContainer Remark, int & i ) { char PN[20]; pstr p1,p2; int l,j,lkey; sprintf ( PN,"BIOMT%1i",biomtNo ); p1 = strcasestr ( rem->Remark,PN ); if (!p1) return R350_ERRBIOMT; p1 += 6; while (*p1==' ') p1++; while (*p1 && (*p1!=' ')) p1++; l = biomtNo - 1; t[l][0] = strtod ( p1,&p2 ); if (p1==p2) return R350_ERRBIOMT; t[l][1] = strtod ( p2,&p1 ); if (p1==p2) return R350_ERRBIOMT; t[l][2] = strtod ( p1,&p2 ); if (p1==p2) return R350_ERRBIOMT; t[l][3] = strtod ( p2,&p1 ); if (p1==p2) return R350_ERRBIOMT; if (biomtNo==3) { for (j=0;j<3;j++) t[3][j] = 0.0; t[3][3] = 1.0; } l = Remark.Length(); lkey = R350_BIOMT; do { i++; if (iremarkNum!=350) lkey = R350_END; else getRemarkKey ( rem,lkey ); } } else lkey = R350_END; } while ((lkey==R350_NONE) || ((!rem) && (lkey==R350_BIOMT))); return lkey; } int CBMApply::addMatrices ( int & i, RPCRemark rem, RCTitleContainer Remark ) { pmat44 tm1; int l,lkey,j,k1,k2,nAlloc; l = Remark.Length(); lkey = R350_BIOMT; nAlloc = nMatrices; while ((i=nAlloc) { nAlloc = nMatrices + 10; tm1 = tm; tm = new mat44[nAlloc]; for (j=0;jnChains; if (nChains>0) { chain = new ChainID[nChains]; for (i=0;ichain[i] ); } nMatrices = BMA->nMatrices; if (nMatrices>0) { tm = new mat44[nMatrices]; for (i=0;itm[i][j][k]; } } } void CBMApply::write ( RCFile f ) { int i,j,k; f.WriteInt ( &nChains ); for (i=0;i0) { chain = new ChainID[nChains]; for (i=0;i0) { tm = new mat44[nMatrices]; for (i=0;inChains*BMApply[i]->nMatrices; return k; } Boolean CBiomolecule::checkComposition ( PChainID chID, ivector occ, ivector wocc, int n ) { // chID[n] is list of chain IDs // occ[n] is list of chain occurencies // wocc[n] is working array int i,j,k,k1; Boolean cmp; for (i=0;inChains) && cmp;j++) { k1 = -1; for (k=0;(kchain[j])) k1 = k; if (k1<0) cmp = False; // chain not found in the list else wocc[k1] += BMApply[i]->nMatrices; } for (i=0;(inBMAs; if (nBMAs>0) { BMApply = new PCBMApply[nBMAs]; for (i=0;iBMApply[i]) { BMApply[i] = new CBMApply(); BMApply[i]->Copy ( B->BMApply[i] ); } else BMApply[i] = NULL; } } } void CBiomolecule::write ( RCFile f ) { int i; f.WriteInt ( &nBMAs ); for (i=0;i0) { BMApply = new PCBMApply[nBMAs]; for (i=0;i=10) && (PDBString[i]==' ')) i--; i++; c = PDBString[i]; PDBString[i] = char(0); CreateCopy ( classification,&(PDBString[10]) ); PDBString[i] = c; Date9to11 ( &(PDBString[50]),depDate ); strncpy ( idCode,&(PDBString[62]),4 ); idCode[4] = char(0); } else if (!strncmp(PDBString,"OBSLTE",6)) { ContainerClass = new CObsLine(PDBString); ObsData.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"TITLE ",6)) { ContainerClass = new CTitleLine(PDBString); Title.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"CAVEAT",6)) { ContainerClass = new CCaveat(PDBString); CAVEAT.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"COMPND",6)) { ContainerClass = new CCompound(PDBString); Compound.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"SOURCE",6)) { ContainerClass = new CSource(PDBString); Source.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"KEYWDS",6)) { KeyWords.ConvertPDBASCII ( PDBString ); } else if (!strncmp(PDBString,"EXPDTA",6)) { ContainerClass = new CExpData(PDBString); ExpData.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"AUTHOR",6)) { ContainerClass = new CAuthor(PDBString); Author.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"REVDAT",6)) { ContainerClass = new CRevData(PDBString); RevData.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"SPRSDE",6)) { ContainerClass = new CSupersede(PDBString); Supersede.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"JRNL ",6)) { ContainerClass = new CJournal(PDBString); Journal.AddData ( ContainerClass ); } else if (!strncmp(PDBString,"REMARK",6)) { ContainerClass = new CRemark(PDBString); Remark.AddData ( ContainerClass ); } else return Error_WrongSection; // check for ID code in columns 73-80 if (!col73) { if (('0'<=idCode[0]) && (idCode[0]<='9')) { if (!strncasecmp(idCode,&(PDBString[72]),4)) col73 = True; } } return 0; } PCTitleContainer CMMDBTitle::GetRemarks() { return &Remark; } realtype CMMDBTitle::GetResolution() { // returns -1.0 if there is no resolution record in the file PCRemark rem; pstr p,eptr; int i,l; if (resolution>-1.5) return resolution; l = Remark.Length(); for (i=0;(iremarkNum==2) { if (rem->Remark) { p = strcasestr ( rem->Remark,"RESOLUTION" ); if (p) { while ((*p) && (*p!=' ')) p++; if (*p) { resolution = strtod ( p,&eptr ); if ((resolution<0.0) || (eptr==p)) resolution = -1.0; } } } } else if (rem->remarkNum>2) resolution = -1.0; } } return resolution; } PCBiomolecule CMMDBTitle::addBiomolecule() { PPCBiomolecule BM1; int i; BM1 = Biomolecule; Biomolecule = new PCBiomolecule[nBiomolecules+1]; for (i=0;iremarkNum==350) lkey = 1; else if (rem->remarkNum>350) lkey = -1; } if (!lkey) i++; } BMol = NULL; BMA = NULL; while (lkey>0) { rem = (PCRemark)Remark.GetContainerClass ( i ); lkey = lookupRemarks ( i,rem,Remark ); switch (lkey) { case R350_BIOMOLECULE : BMol = addBiomolecule(); i++; break; case R350_CHAINS : if (BMol) { BMA = BMol->addBMApply(); while (lkey==R350_CHAINS) lkey = BMA->addChains(i,rem,Remark); } else lkey = R350_ERROR; break; case R350_BIOMT : if (BMA) lkey = BMA->addMatrices(i,rem,Remark); else lkey = R350_ERROR; break; default : i++; } } if (lkey<=R350_ERROR) { FreeBiomolecules(); return lkey; } return nBiomolecules; } int CMMDBTitle::GetNofBiomolecules() { return nBiomolecules; } void CMMDBTitle::GetBiomolecules ( PPCBiomolecule & BM, int & nBMs ) { BM = Biomolecule; nBMs = nBiomolecules; } PCBiomolecule CMMDBTitle::GetBiomolecule ( int bmNo ) { // bmno=0,1,.. if ((0<=bmNo) && (bmNoGetDataName ( S,True ); if (!S) CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_ENTRY_ID,True ); if (!S) CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_CODE_NDB,True ); if (!S) CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_CODE_PDB,True ); if (S) { strncpy ( idCode,S,sizeof(IDCode)-1 ); idCode[sizeof(IDCode)-1] = char(0); delete[] S; S = NULL; CIF->DeleteField ( CIFCAT_DATABASE,CIFTAG_ENTRY_ID ); CIF->DeleteField ( CIFCAT_DATABASE,CIFTAG_CODE_NDB ); CIF->DeleteField ( CIFCAT_DATABASE,CIFTAG_CODE_PDB ); } else idCode[0] = char(0); CIF->GetString ( classification,CIFCAT_STRUCT_KEYWORDS, CIFTAG_NDB_KEYWORDS,True ); CIF->GetString ( S,CIFCAT_DATABASE,CIFTAG_DATE_ORIGINAL,True ); if (S) { DateCIFto11 ( S,depDate ); delete[] S; S = NULL; } else depDate[0] = char(0); ObsData .GetCIF ( CIF,ClassID_ObsLine ); Title .GetCIF ( CIF,ClassID_TitleLine ); CAVEAT .GetCIF ( CIF,ClassID_CAVEAT ); Compound.GetCIF ( CIF,ClassID_Compound ); Source .GetCIF ( CIF,ClassID_Source ); KeyWords.GetCIF ( CIF ); ExpData .GetCIF ( CIF,ClassID_ExpData ); Author .GetCIF ( CIF,ClassID_Author ); RC = RevData.GetCIF ( CIF,ClassID_RevData ); if (!RC) { Supersede.GetCIF ( CIF,ClassID_Supersede ); Journal .GetCIF ( CIF,ClassID_Journal ); RC = Remark .GetCIF ( CIF,ClassID_Remark ); } return RC; } void CMMDBTitle::MakePDBHeaderString ( pstr PDBString ) { // makes the ASCII PDB HEADER line from the class' data int i; if (classification) { strcpy ( PDBString,"HEADER " ); strcat ( PDBString,classification ); i = strlen(PDBString); while (i<80) PDBString[i++] = ' '; PDBString[IMin(i,80)] = char(0); Date11to9 ( depDate,&(PDBString[50]) ); strncpy ( &(PDBString[62]),idCode,4 ); } else strcpy ( PDBString, "HEADER XXXXXXXXXXXXXXXXXXXXXXXXXXXX XX-XXX-XX ----" ); } pstr CMMDBTitle::GetStructureTitle ( pstr & S ) { // GetStructureTitle() returns the contents of TITLE record // unfolded into single line. If Title is missing, returns // contents of COMPND(:MOLECULE). If COMPND is missing, returns // HEADER. If Header is missing, returns PDB code. If no PDB // code is there, returns "Not available". PCTitleLine TLine; PCCompound CLine; pstr p; int i,cl,l; Boolean B; if (S) delete[] S; S = NULL; cl = Title.Length(); if (cl>0) { l = 0; for (i=0;iLine)+5; } S = new char[l]; S[0] = char(0); for (i=0;i0) strcat ( S," " ); strcat_des ( S,TLine->Line ); } } } else { cl = Compound.Length(); if (cl>0) { l = 0; p = NULL; B = True; for (i=0;(iLine,"MOLECULE:"); if (p) l += strlen_des(&(p[9]))+5; } else { p = strstr(CLine->Line,"MOLECULE:"); if (p) l += strlen_des(&(p[9]))+5; else { p = strchr(CLine->Line,':'); if (!p) { l += strlen_des(CLine->Line)+5; p = CLine->Line; } else B = False; } } } } if (l>0) { S = new char[l]; S[0] = char(0); p = NULL; B = True; for (i=0;(iLine,"MOLECULE:"); if (p) strcat_des ( S,&(p[9]) ); } else { p = strstr(CLine->Line,"MOLECULE:"); if (p) strcat_des ( S,&(p[9]) ); else { p = strchr(CLine->Line,':'); if (!p) { strcat_des ( S,CLine->Line ); p = CLine->Line; } else B = False; } } l = strlen(S)-1; if (S[l]==';') S[l] = char(0); } } } else { l = 0; for (i=0;iLine)+5; } S = new char[l]; S[0] = char(0); for (i=0;i0) strcat ( S," " ); strcat_des ( S,CLine->Line ); } } } } else if (classification) CreateCopy ( S,classification ); else if (idCode[0]) CreateCopy ( S,idCode ); else CreateCopy ( S,pstr("Not available") ); } if (!S[0]) CreateCopy ( S,pstr("Not available") ); return S; } void CMMDBTitle::PDBASCIIDump ( RCFile f ) { char PDBString[100]; if (classification) { MakePDBHeaderString ( PDBString ); f.WriteLine ( PDBString ); } ObsData .PDBASCIIDump ( f ); Title .PDBASCIIDump ( f ); CAVEAT .PDBASCIIDump ( f ); Compound .PDBASCIIDump ( f ); Source .PDBASCIIDump ( f ); KeyWords .PDBASCIIDump ( f ); ExpData .PDBASCIIDump ( f ); Author .PDBASCIIDump ( f ); RevData .PDBASCIIDump ( f ); Supersede.PDBASCIIDump ( f ); Journal .PDBASCIIDump ( f ); Remark .PDBASCIIDump ( f ); } void CMMDBTitle::MakeCIF ( PCMMCIFData CIF ) { char DateCIF[20]; if (idCode[0]) { CIF->PutDataName ( idCode ); CIF->PutString ( idCode, CIFCAT_DATABASE,CIFTAG_ENTRY_ID ); CIF->PutString ( idCode, CIFCAT_DATABASE,CIFTAG_CODE_NDB ); CIF->PutString ( idCode, CIFCAT_DATABASE,CIFTAG_CODE_PDB ); } else { CIF->PutDataName ( pstr("") ); CIF->PutString ( NULL, CIFCAT_DATABASE,CIFTAG_ENTRY_ID ); CIF->PutString ( NULL, CIFCAT_DATABASE,CIFTAG_CODE_NDB ); CIF->PutString ( NULL, CIFCAT_DATABASE,CIFTAG_CODE_PDB ); } CIF->PutString ( classification, CIFCAT_STRUCT_KEYWORDS, CIFTAG_NDB_KEYWORDS ); if (depDate[0]) { Date11toCIF ( depDate,DateCIF ); CIF->PutString ( DateCIF,CIFCAT_DATABASE,CIFTAG_DATE_ORIGINAL ); } else CIF->PutString ( NULL,CIFCAT_DATABASE,CIFTAG_DATE_ORIGINAL ); ObsData .MakeCIF ( CIF ); Title .MakeCIF ( CIF ); CAVEAT .MakeCIF ( CIF ); Compound .MakeCIF ( CIF ); Source .MakeCIF ( CIF ); KeyWords .MakeCIF ( CIF ); ExpData .MakeCIF ( CIF ); Author .MakeCIF ( CIF ); RevData .MakeCIF ( CIF ); Supersede.MakeCIF ( CIF ); Journal .MakeCIF ( CIF ); Remark .MakeCIF ( CIF ); } void CMMDBTitle::Copy ( PCMMDBTitle TS ) { int i; FreeBiomolecules(); if (TS) { CreateCopy ( classification,TS->classification ); strcpy ( depDate ,TS->depDate ); strcpy ( idCode ,TS->idCode ); resolution = TS->resolution; ObsData .Copy ( &(TS->ObsData) ); Title .Copy ( &(TS->Title) ); CAVEAT .Copy ( &(TS->CAVEAT) ); Compound .Copy ( &(TS->Compound) ); Source .Copy ( &(TS->Source) ); KeyWords .Copy ( &(TS->KeyWords) ); ExpData .Copy ( &(TS->ExpData) ); Author .Copy ( &(TS->Author) ); RevData .Copy ( &(TS->RevData) ); Supersede.Copy ( &(TS->Supersede) ); Journal .Copy ( &(TS->Journal) ); Remark .Copy ( &(TS->Remark) ); nBiomolecules = TS->nBiomolecules; if (nBiomolecules>0) { Biomolecule = new PCBiomolecule[nBiomolecules]; for (i=0;iBiomolecule[i]) { Biomolecule[i] = new CBiomolecule(); Biomolecule[i]->Copy ( TS->Biomolecule[i] ); } else Biomolecule[i] = NULL; } } else { if (classification) delete[] classification; classification = NULL; resolution = -2.0; ObsData .FreeContainer(); Title .FreeContainer(); CAVEAT .FreeContainer(); Compound .FreeContainer(); Source .FreeContainer(); KeyWords .Delete (); ExpData .FreeContainer(); Author .FreeContainer(); RevData .FreeContainer(); Supersede.FreeContainer(); Journal .FreeContainer(); Remark .FreeContainer(); } } void CMMDBTitle::TrimInput ( pstr PDBString ) { if (col73) PDBString[72] = char(0); PadSpaces ( PDBString,80 ); } void CMMDBTitle::write ( RCFile f ) { // writes header to PDB binary file int i; byte Version=2; f.WriteByte ( &Version ); // Header data f.CreateWrite ( classification ); f.WriteTerLine ( depDate,False ); f.WriteTerLine ( idCode ,False ); f.WriteReal ( &resolution ); ObsData .write ( f ); // Obsoletion data Title .write ( f ); // Title CAVEAT .write ( f ); // Error data Compound .write ( f ); // Compound Source .write ( f ); // Source KeyWords .write ( f ); // Key words ExpData .write ( f ); // Experimental data Author .write ( f ); // Author data RevData .write ( f ); // Revision data Supersede.write ( f ); // Supersede records Journal .write ( f ); // Journal records Remark .write ( f ); // Remarks f.WriteInt ( &nBiomolecules ); for (i=0;i1) f.ReadReal ( &resolution ); else resolution = -2.0; ObsData .read ( f ); // Obsoletion data Title .read ( f ); // Title CAVEAT .read ( f ); // Error data Compound .read ( f ); // Compound Source .read ( f ); // Source KeyWords .read ( f ); // Key words ExpData .read ( f ); // Experimental data Author .read ( f ); // Author data RevData .read ( f ); // Revision data Supersede.read ( f ); // Supersede records Journal .read ( f ); // Journal records Remark .read ( f ); // Remarks FreeBiomolecules(); if (Version>1) { f.ReadInt ( &nBiomolecules ); if (nBiomolecules>0) { Biomolecule = new PCBiomolecule[nBiomolecules]; for (i=0;iSetHeader ( pstr("MUSCLE PROTEIN"),pstr("02-JUN-1993"),pstr("1MYS") ); Hdr->MakePDBHeaderString ( S ); printf ( "1234567890123456789012345678901234567890" "1234567890123456789012345678901234567890\n" ); printf ( S ); printf ( "\n" ); strcpy ( S, // 1234567890123456789012345678901234567890123456789012345678901234567890 "HEADER HYDROLASE (CARBOXYLIC ESTER) 07-APR-01 2PHI" ); Hdr->ConvertPDBString ( S ); Hdr->MakePDBHeaderString ( S1 ); printf ( "1234567890123456789012345678901234567890" "1234567890123456789012345678901234567890\n" ); printf ( S1 ); printf ( "\n" ); Hdr->SetHeader ( pstr("MUSCLE PROTEIN;**A VERY LONG TITLE TEST;**ARBITRARY LENGTH"), pstr("02-JUN-1993"),pstr("1MYS") ); Hdr->MakePDBHeaderString ( S ); printf ( "1234567890123456789012345678901234567890" "1234567890123456789012345678901234567890\n" ); printf ( S ); printf ( "\n" ); delete Hdr; printf ( " header deleted \n" ); } void TestTitle() { // reads PDB title from file 'in.title' // and rewrites it into 'out.title' and 'abin.title' CFile f; char S[81]; PCMMDBTitle Title; Title = new CMMDBTitle(); f.assign ( pstr("in.title"),True ); if (f.reset()) { while (!f.FileEnd()) { f.ReadLine ( S,sizeof(S) ); Title->ConvertPDBString ( S ); } f.shut(); } else { printf ( " Can't open input file 'in.title' \n" ); delete Title; return; } f.assign ( pstr("out.title"),True ); if (f.rewrite()) { Title->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'out.title' \n" ); delete Title; return; } f.assign ( pstr("mmdb.title.bin"),False ); if (f.rewrite()) { Title->write ( f ); f.shut(); } else { printf ( " Can't open binary file for writing.\n" ); delete Title; return; } delete Title; printf ( " Title deleted.\n" ); Title = new CMMDBTitle(); if (f.reset()) { Title->read ( f ); f.shut(); } else { printf ( " Can't open binary file for reading.\n" ); delete Title; return; } f.assign ( pstr("abin.title"),True ); if (f.rewrite()) { Title->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'abin.title' \n" ); } delete Title; } */ mmdb-1.23.2.1/src/file_.h0000644000175100017510000002740711475666363011651 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : file_ // ~~~~~~~~~ // **** Classes : CFile - file I/O Support. // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __File__ #define __File__ #ifndef __STDIO_H #include #endif #ifndef __MatType__ #include "mattype_.h" #endif // ======================== CFile Class ======================== #define MaxFileNameLength 512 #define FM_Binary False #define FM_Text True #define GZM_NONE 0 #define GZM_CHECK 1 #define GZM_ENFORCE 2 #define GZM_ENFORCE_GZIP 2 #define GZM_ENFORCE_COMPRESS 3 #define FileError_NoMemory 110 #define FileError_ShortData 111 #define FileError_NoDataFound 112 #define FileError_NoColumn 113 #define FileError_BadData 114 #define FileError_WrongMemoryAllocation 115 // =================== Auxilary Functions ========================= #define syskey_unix 1 #define syskey_win 2 #define syskey_all 3 extern cpstr GetFPath ( pstr FilePath, int syskey=syskey_unix ); extern cpstr GetFName ( cpstr FilePath, int syskey=syskey_unix ); extern cpstr GetFExt ( cpstr FilePath ); extern cpstr ChangeExt ( pstr FilePath, cpstr newExt, int syskey=syskey_unix ); extern cpstr FileError ( int ErrCode ); extern void RemoveDelimiters ( pstr S, int SLen ); extern void PickOutNumber ( cpstr S, pstr SV, int SLen, int & j ); // ========================= CFile ================================ DefineClass(CFile) class CFile { public : CFile ( word BufSize=4096 ); virtual ~CFile(); // ---- control functions // FileName allows for "stdin", "stdout" and "stderr" as // for standard UNIX streams. void assign ( cpstr FileName, Boolean Text=False, Boolean UniB=False, byte gzMode=GZM_NONE ); // assign for memory IO void assign ( word poolSize, word sizeInc, pstr filePool ); void GetFilePool ( pstr & filePool, word & fileSize ); pstr FileName () { return FName; } Boolean reset ( Boolean ReadOnly=False, int retry=0 ); // = true if opened, each retry 1 sec sleep Boolean erase (); // = true if erased Boolean exists (); // = true if exists Boolean parse ( cpstr FileName ); // true if filled Boolean rename ( cpstr NewFileName ); // true if renamed Boolean rewrite (); // = true if opened Boolean append (); // = true if opened Boolean isOpen (); long Position (); long FileLength () { return FLength; } Boolean seek ( long Position ); Boolean FileEnd (); Boolean Success () { return IOSuccess; } void SetSuccess () { IOSuccess = True; } void shut (); // ---- binary I/O word ReadFile ( void * Buffer, word Count ); word CreateRead ( pstr & Line ); word ReadTerLine ( pstr Line, Boolean longLine=False ); Boolean WriteFile ( const void * Buffer, word Count ); Boolean CreateWrite ( cpstr Line ); Boolean WriteTerLine ( cpstr Line, Boolean longLine=False ); // machine-dependent binary I/O Boolean WriteReal ( realtype * V ); Boolean WriteFloat ( realtype * V ); Boolean WriteInt ( int * I ); Boolean WriteShort ( short * S ); Boolean WriteLong ( long * L ); Boolean WriteBool ( Boolean * B ); Boolean WriteByte ( byte * B ); Boolean WriteWord ( word * W ); Boolean ReadReal ( realtype * V ); Boolean ReadFloat ( realtype * V ); Boolean ReadInt ( int * I ); Boolean ReadShort ( short * S ); Boolean ReadLong ( long * L ); Boolean ReadBool ( Boolean * B ); Boolean ReadByte ( byte * B ); Boolean ReadWord ( word * B ); Boolean AddReal ( realtype * V ); Boolean AddFloat ( realtype * V ); Boolean AddInt ( int * I ); Boolean AddShort ( short * S ); Boolean AddLong ( long * L ); Boolean AddByte ( byte * B ); Boolean AddWord ( word * B ); // complex data binary I/O Boolean WriteVector ( rvector V, int len, int Shift ); Boolean WriteVector ( ivector iV, int len, int Shift ); Boolean WriteVector ( lvector lV, int len, int Shift ); Boolean WriteVector ( bvector B, int len, int Shift ); Boolean ReadVector ( rvector V, int maxlen, int Shift ); Boolean ReadVector ( ivector iV, int maxlen, int Shift ); Boolean ReadVector ( lvector lV, int maxlen, int Shift ); Boolean ReadVector ( bvector B, int maxlen, int Shift ); Boolean CreateReadVector ( rvector & V, int & len, int Shift ); Boolean CreateReadVector ( ivector & iV, int & len, int Shift ); Boolean CreateReadVector ( lvector & lV, int & len, int Shift ); Boolean CreateReadVector ( bvector & B, int & len, int Shift ); Boolean CreateReadVector ( rvector & V, int Shift ); Boolean CreateReadVector ( ivector & iV, int Shift ); Boolean CreateReadVector ( lvector & lV, int Shift ); Boolean CreateReadVector ( bvector & B, int Shift ); Boolean WriteMatrix ( rmatrix & A, int N, int M, int ShiftN, int ShiftM ); Boolean CreateReadMatrix ( rmatrix & A, int ShiftN, int ShiftM ); Boolean CreateReadMatrix ( rmatrix & A, int & N, int & M, int ShiftN, int ShiftM ); // ---- text I/O Boolean Write ( cpstr Line ); // writes without LF Boolean Write ( realtype V, int length=10 ); // w/o LF Boolean Write ( int iV, int length=5 ); // w/o LF Boolean WriteLine ( cpstr Line ); // writes and adds LF Boolean LF (); // just adds LF word ReadLine ( pstr Line, word MaxLen=255 ); word ReadNonBlankLine ( pstr S, word MaxLen=255 ); // complex data text I/O // writes with spaces and adds LF Boolean WriteDataLine ( realtype X, realtype Y, int length=10 ); Boolean WriteParameter ( cpstr S, realtype X, // writes parameter int ParColumn=40, // name S and value X int length=10 ); // at column ParColumn // and adds LF. Boolean WriteParameters ( cpstr S, int n_X, // writes parameter rvector X, // name S and n_X values int ParColumn=40, // X[0..n_X-1] at col int length=10 ); // ParColumn, ads LF. Boolean ReadParameter ( pstr S, realtype & X, // reads parameter int ParColumn=40 ); // name S and val X Boolean ReadParameter ( pstr S, int & X, int ParColumn=40 ); Boolean ReadParameters ( pstr S, int & n_X, // reads parameter rvector X, // name S, counts the int MaxLen=255, // of values n_X and int ParColumn=40 ); // reads X[0..n_X-1]. // MaxLen gives sizeof(S) // WriteColumns writes data stored in X, Y and Z in the form // of columns, adding a blank line in the end. If Z (or Z and Y) // are set to NULL, then only X and Y (or only X) are written. // Shift corresponds to the begining of arrays' enumeration // X[Shift..Shift+len-1]. Boolean WriteColumns ( rvector X, rvector Y, rvector Z, int len, int Shift, int MLength ); Boolean WriteColumns ( rvector X, rvector Y, int len, int Shift, int MLength ); // ReadColumns reads data stored by WriteColumns. X, Y, and Z // must be allocated prior to call. // xCol, yCol and zCol specify the order number of columns // (starting from 0) to be read into X, Y and Z, correspondingly. // If zCol (or zCol and yCol) < 0 then Z (or Z and Y) are not read. // Shift corresponds to the begining of arrays' enumeration // X[Shift..Shift+len-1]. // Returns number of lines read. int ReadColumns ( int maxlen, rvector X, rvector Y, rvector Z, int xCol, int yCol, int zCol, int Shift ); int ReadColumns ( int maxlen, rvector X, rvector Y, int xCol, int yCol, int Shift ); // CreateReadColumns reads data stored by WriteColumns. X, Y, // and Z must be set to NULL prior to call. They will be allocated // within the procedure. // xCol, yCol and zCol specify the order number of columns // (starting from 0) to be read into X, Y and Z, correspondingly. // If zCol (or zCol and yCol) < 0 then Z (or Z and Y) are not read. // Shift corresponds to the begining of arrays' enumeration // X[Shift..Shift+len-1]. // Returns number of lines read, errors are reported by // ErrorCode(). int CreateReadColumns ( rvector & X, rvector & Y, rvector & Z, int xCol, int yCol, int zCol, int Shift ); int CreateReadColumns ( rvector & X, rvector & Y, int xCol, int yCol, int Shift ); // ---- miscellaneous realtype GetNumber ( cpstr S ); FILE * GetHandle () { return hFile; } protected : word Buf_Size; Boolean TextMode,UniBin; byte gzipMode; pstr IOBuf; word BufCnt,BufLen,BufInc; FILE * hFile; Boolean EofFile; pstr FName; long FLength; Boolean IOSuccess; int ErrCode; void FreeBuffer (); void _ReadColumns ( int & DLen, pstr S, int SLen, rvector X, rvector Y, rvector Z, int xCol, int yCol, int zCol, int Shift ); private : int gzipIO; Boolean StdIO,memIO; }; extern void SetGZIPPath ( pstr gzipPath, pstr ungzipPath ); extern void SetCompressPath ( pstr compressPath, pstr uncompressPath ); extern Boolean FileExists ( cpstr FileName, PCFile f=NULL ); #endif mmdb-1.23.2.1/src/mmdb_atom.cpp0000644000175100017510000024721311475666363013064 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 04.02.09 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Atom // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CAtom ( atom class ) // ~~~~~~~~~ CResidue ( residue class ) // // Copyright (C) E. Krissinel 2000-2009 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MATH_H #include #endif #ifndef __MMDB_Chain__ #include "mmdb_chain.h" #endif #ifndef __MMDB_Model__ #include "mmdb_model.h" #endif #ifndef __MMDB_File__ #include "mmdb_file.h" #endif #ifndef __MMDB_Tables__ #include "mmdb_tables.h" #endif #ifndef __MMDB_CIFDefs__ #include "mmdb_cifdefs.h" #endif #ifndef IOTBX_PDB_HYBRID_36_C_H #include "hybrid_36.h" #endif // ================================================================ #define ASET_ShortBinary 0x10000000 #define ASET_ShortTer 0x20000000 #define ASET_ShortHet 0x40000000 Boolean ignoreSegID = False; Boolean ignoreElement = False; Boolean ignoreCharge = False; Boolean ignoreNonCoorPDBErrors = False; Boolean ignoreUnmatch = False; // ========================== CAtom ============================= CAtom::CAtom() : CUDData() { InitAtom(); } CAtom::CAtom ( PCResidue res ) : CUDData() { InitAtom(); if (res) res->AddAtom ( this ); } CAtom::CAtom ( RPCStream Object ) : CUDData(Object) { InitAtom(); } CAtom::~CAtom() { int nA; PPCAtom A; FreeMemory(); if (residue) { A = NULL; nA = 0; if (residue->chain) { if (residue->chain->model) { A = residue->chain->model->GetAllAtoms(); nA = residue->chain->model->GetNumberOfAllAtoms(); } } residue->_ExcludeAtom ( index ); if ((0index; else AtomBondI[i].index = -1; AtomBondI[i].order = Bond[i].order; } } } void CAtom::GetBonds ( PSAtomBondI AtomBondI, int & nAtomBonds, int maxlength ) { // This GetBonds(..) does not dispose or allocate AtomBond. // It is assumed that length of AtomBond is sufficient to // accomodate all bonded atoms. int i; nAtomBonds = IMin(maxlength,nBonds & 0x000000FF); for (i=0;iindex; else AtomBondI[i].index = -1; AtomBondI[i].order = Bond[i].order; } } int CAtom::AddBond ( PCAtom bond_atom, int bond_order, int nAdd_bonds ) { PSAtomBond B1; int i,k,nb,nballoc; nb = nBonds & 0x000000FF; k = -1; for (i=0;(i=0) return -k; nballoc = (nBonds >> 8) & 0x000000FF; if (nBonds>=nballoc) { nballoc += nAdd_bonds; B1 = new SAtomBond[nballoc]; for (i=0;i99999) { hy36encode ( 5,serNum,N ); strcpy_n ( &(S[6]),N,5 ); } else if (serNum>0) PutInteger ( &(S[6]),serNum,5 ); else if (index<=99999) PutInteger ( &(S[6]),index,5 ); else { hy36encode ( 5,index,N ); strcpy_n ( &(S[6]),N,5 ); } /* if (serNum>0) PutInteger ( &(S[6]),serNum,5 ); else PutInteger ( &(S[6]),index ,5 ); */ if (!Ter) { if (altLoc[0]) S[16] = altLoc[0]; strcpy_n ( &(S[12]),name ,4 ); strcpy_n ( &(S[72]),segID ,4 ); strcpy_nr ( &(S[76]),element,2 ); if (WhatIsSet & ASET_Charge) { sprintf ( N,"%+2i",mround(charge) ); strcpy_n ( &(S[78]),N,2 ); } else strcpy_n ( &(S[78])," ",2 ); } strcpy_nr ( &(S[17]),residue->name,3 ); strcpy_nr ( &(S[20]),residue->chain->chainID,2 ); // S[21] = residue->chain->chainID[0]; // if (!S[21]) S[21] = ' '; if (residue->seqNum>MinInt4) { if ((-999<=residue->seqNum) && (residue->seqNum<=9999)) PutIntIns ( &(S[22]),residue->seqNum,4,residue->insCode ); else { hy36encode ( 4,residue->seqNum,N ); strcpy_n ( &(S[22]),N,4 ); } } } void CAtom::PDBASCIIDump ( RCFile f ) { // makes the ASCII PDB ATOM, HETATM, SIGATOM, ANISOU // SIGUIJ and TER lines from the class' data char S[100]; if (Ter) { if (WhatIsSet & ASET_Coordinates) { StandardPDBOut ( pstr("TER"),S ); f.WriteLine ( S ); } } else { if (WhatIsSet & ASET_Coordinates) { if (Het) StandardPDBOut ( pstr("HETATM"),S ); else StandardPDBOut ( pstr("ATOM") ,S ); PutRealF ( &(S[30]),x,8,3 ); PutRealF ( &(S[38]),y,8,3 ); PutRealF ( &(S[46]),z,8,3 ); if (WhatIsSet & ASET_Occupancy) PutRealF ( &(S[54]),occupancy ,6,2 ); if (WhatIsSet & ASET_tempFactor) PutRealF ( &(S[60]),tempFactor,6,2 ); f.WriteLine ( S ); } if (WhatIsSet & ASET_CoordSigma) { StandardPDBOut ( pstr("SIGATM"),S ); PutRealF ( &(S[30]),sigX,8,3 ); PutRealF ( &(S[38]),sigY,8,3 ); PutRealF ( &(S[46]),sigZ,8,3 ); if ((WhatIsSet & ASET_OccSigma) && (WhatIsSet & ASET_Occupancy)) PutRealF ( &(S[54]),sigOcc,6,2 ); if ((WhatIsSet & ASET_tFacSigma) && (WhatIsSet & ASET_tempFactor)) PutRealF ( &(S[60]),sigTemp,6,2 ); f.WriteLine ( S ); } if (WhatIsSet & ASET_Anis_tFac) { StandardPDBOut ( pstr("ANISOU"),S ); PutInteger ( &(S[28]),mround(u11*1.0e4),7 ); PutInteger ( &(S[35]),mround(u22*1.0e4),7 ); PutInteger ( &(S[42]),mround(u33*1.0e4),7 ); PutInteger ( &(S[49]),mround(u12*1.0e4),7 ); PutInteger ( &(S[56]),mround(u13*1.0e4),7 ); PutInteger ( &(S[63]),mround(u23*1.0e4),7 ); f.WriteLine ( S ); if (WhatIsSet & ASET_Anis_tFSigma) { StandardPDBOut ( pstr("SIGUIJ"),S ); PutInteger ( &(S[28]),mround(su11*1.0e4),7 ); PutInteger ( &(S[35]),mround(su22*1.0e4),7 ); PutInteger ( &(S[42]),mround(su33*1.0e4),7 ); PutInteger ( &(S[49]),mround(su12*1.0e4),7 ); PutInteger ( &(S[56]),mround(su13*1.0e4),7 ); PutInteger ( &(S[63]),mround(su23*1.0e4),7 ); f.WriteLine ( S ); } } } } void CAtom::MakeCIF ( PCMMCIFData CIF ) { PCMMCIFLoop Loop; AtomName AtName; Element el; char N[10]; int i,j,RC; PCChain chain = NULL; PCModel model = NULL; Boolean singleModel = True; if (residue) chain = residue->chain; if (chain) model = PCModel(chain->model); if (model) { if (model->manager) singleModel = PCMMDBFile(model->manager)->nModels<=1; } RC = CIF->AddLoop ( CIFCAT_ATOM_SITE,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_GROUP_PDB ); // ATOM, TER etc. Loop->AddLoopTag ( CIFTAG_ID ); // serial number Loop->AddLoopTag ( CIFTAG_LABEL_ATOM_ID ); // atom name Loop->AddLoopTag ( CIFTAG_LABEL_ALT_ID ); // alt location Loop->AddLoopTag ( CIFTAG_LABEL_COMP_ID ); // residue name Loop->AddLoopTag ( CIFTAG_LABEL_ASYM_ID ); // chain ID Loop->AddLoopTag ( CIFTAG_LABEL_SEQ_ID ); // res seq number Loop->AddLoopTag ( CIFTAG_PDBX_PDB_INS_CODE ); // insertion code Loop->AddLoopTag ( CIFTAG_CARTN_X ); // x-coordinate Loop->AddLoopTag ( CIFTAG_CARTN_Y ); // y-coordinate Loop->AddLoopTag ( CIFTAG_CARTN_Z ); // z-coordinate Loop->AddLoopTag ( CIFTAG_OCCUPANCY ); // occupancy Loop->AddLoopTag ( CIFTAG_B_ISO_OR_EQUIV ); // temp factor Loop->AddLoopTag ( CIFTAG_SEGMENT_ID ); // segment ID Loop->AddLoopTag ( CIFTAG_TYPE_SYMBOL ); // element symbol Loop->AddLoopTag ( CIFTAG_CHARGE ); // charge on atom Loop->AddLoopTag ( CIFTAG_CARTN_X_ESD ); // x-sigma Loop->AddLoopTag ( CIFTAG_CARTN_Y_ESD ); // y-sigma Loop->AddLoopTag ( CIFTAG_CARTN_Z_ESD ); // z-sigma Loop->AddLoopTag ( CIFTAG_OCCUPANCY_ESD ); // occupancy-sigma Loop->AddLoopTag ( CIFTAG_B_ISO_OR_EQUIV_ESD ); // t-factor-sigma Loop->AddLoopTag ( CIFTAG_PDBX_PDB_MODEL_NUM ); // model number } if (Ter) { if (!(WhatIsSet & ASET_Coordinates)) return; Loop->AddString ( pstr("TER") ); if (serNum>0) Loop->AddInteger ( serNum ); else Loop->AddInteger ( index ); Loop->AddNoData ( CIF_NODATA_QUESTION ); // no atom name Loop->AddNoData ( CIF_NODATA_QUESTION ); // no alt code if (residue) Loop->AddString ( residue->name ); else Loop->AddString ( NULL ); if (chain) Loop->AddString ( chain->chainID,True ); else Loop->AddString ( NULL ); if (residue) { if (residue->seqNum>MinInt4) Loop->AddInteger ( residue->seqNum ); else Loop->AddNoData ( CIF_NODATA_DOT ); Loop->AddString ( residue->insCode,True ); } else { Loop->AddNoData ( CIF_NODATA_DOT ); Loop->AddNoData ( CIF_NODATA_DOT ); } for (i=0;i<13;i++) Loop->AddNoData ( CIF_NODATA_QUESTION ); } else if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma)) { if (!WhatIsSet) return; if (Het) Loop->AddString ( pstr("HETATM") ); else Loop->AddString ( pstr("ATOM") ); if (serNum>0) Loop->AddInteger ( serNum ); else Loop->AddInteger ( index ); if (WhatIsSet & ASET_Coordinates) { strcpy_css ( AtName,name ); Loop->AddString ( AtName ); // atom name Loop->AddString ( altLoc,True ); // alt code if (residue) Loop->AddString ( residue->name ); else Loop->AddNoData ( CIF_NODATA_DOT ); if (chain) Loop->AddString ( chain->chainID,True ); else Loop->AddNoData ( CIF_NODATA_DOT ); if (residue) { if (residue->seqNum>MinInt4) Loop->AddInteger ( residue->seqNum ); else Loop->AddNoData ( CIF_NODATA_DOT ); Loop->AddString ( residue->insCode,True ); } else { Loop->AddNoData ( CIF_NODATA_DOT ); Loop->AddString ( CIF_NODATA_DOT ); } Loop->AddReal ( x ); Loop->AddReal ( y ); Loop->AddReal ( z ); if (WhatIsSet & ASET_Occupancy) Loop->AddReal ( occupancy ); else Loop->AddNoData ( CIF_NODATA_QUESTION ); if (WhatIsSet & ASET_tempFactor) Loop->AddReal ( tempFactor ); else Loop->AddNoData ( CIF_NODATA_QUESTION ); strcpy_css ( el,element ); Loop->AddString ( segID ,True ); Loop->AddString ( el ,True ); if (WhatIsSet & ASET_Charge) sprintf ( N,"%+2i",mround(charge) ); else strcpy ( N," " ); Loop->AddString ( N,True ); } else for (i=0;i<14;i++) Loop->AddNoData ( CIF_NODATA_QUESTION ); if (WhatIsSet & ASET_CoordSigma) { Loop->AddReal ( sigX ); Loop->AddReal ( sigY ); Loop->AddReal ( sigZ ); if ((WhatIsSet & ASET_OccSigma) && (WhatIsSet & ASET_Occupancy)) Loop->AddReal ( sigOcc ); else Loop->AddNoData ( CIF_NODATA_QUESTION ); if ((WhatIsSet & ASET_tFacSigma) && (WhatIsSet & ASET_tempFactor)) Loop->AddReal ( sigTemp ); else Loop->AddNoData ( CIF_NODATA_QUESTION ); } else for (i=0;i<5;i++) Loop->AddNoData ( CIF_NODATA_QUESTION ); } if (singleModel) Loop->AddNoData ( CIF_NODATA_QUESTION ); else Loop->AddInteger ( model->serNum ); if (WhatIsSet & ASET_Anis_tFac) { RC = CIF->AddLoop ( CIFCAT_ATOM_SITE_ANISOTROP,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); // serial number Loop->AddLoopTag ( CIFTAG_U11 ); // component u11 Loop->AddLoopTag ( CIFTAG_U22 ); // component u22 Loop->AddLoopTag ( CIFTAG_U33 ); // component u33 Loop->AddLoopTag ( CIFTAG_U12 ); // component u12 Loop->AddLoopTag ( CIFTAG_U13 ); // component u13 Loop->AddLoopTag ( CIFTAG_U23 ); // component u23 Loop->AddLoopTag ( CIFTAG_U11_ESD ); // component u11 sigma Loop->AddLoopTag ( CIFTAG_U22_ESD ); // component u22 sigma Loop->AddLoopTag ( CIFTAG_U33_ESD ); // component u33 sigma Loop->AddLoopTag ( CIFTAG_U12_ESD ); // component u12 sigma Loop->AddLoopTag ( CIFTAG_U13_ESD ); // component u13 sigma Loop->AddLoopTag ( CIFTAG_U23_ESD ); // component u23 sigma for (i=1;iAddInteger ( i ); for (j=0;j<12;j++) Loop->AddString ( NULL ); } } if (serNum>0) Loop->AddInteger ( serNum ); else Loop->AddInteger ( index ); Loop->AddReal ( u11 ); Loop->AddReal ( u22 ); Loop->AddReal ( u33 ); Loop->AddReal ( u12 ); Loop->AddReal ( u13 ); Loop->AddReal ( u23 ); if (WhatIsSet & ASET_Anis_tFSigma) { Loop->AddReal ( su11 ); Loop->AddReal ( su22 ); Loop->AddReal ( su33 ); Loop->AddReal ( su12 ); Loop->AddReal ( su13 ); Loop->AddReal ( su23 ); } } } int CAtom::ConvertPDBATOM ( int ix, cpstr S ) { // Gets data from the PDB ASCII ATOM record. // This function DOES NOT check the "ATOM" keyword and // does not decode the chain and residue parameters! These // must be treated by calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_Coordinates) return Error_ATOM_AlreadySet; if (!(GetReal(x,&(S[30]),8) && GetReal(y,&(S[38]),8) && GetReal(z,&(S[46]),8))) return Error_ATOM_Unrecognized; WhatIsSet |= ASET_Coordinates; Het = False; Ter = False; if (GetReal(occupancy ,&(S[54]),6)) WhatIsSet |= ASET_Occupancy; if (GetReal(tempFactor,&(S[60]),6)) WhatIsSet |= ASET_tempFactor; if (WhatIsSet & (ASET_CoordSigma | ASET_Anis_tFac | ASET_Anis_tFSigma)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return 0; } void CAtom::SetAtomName ( int ix, int sN, const AtomName aName, const AltLoc aLoc, const SegID sID, const Element eName ) { index = ix; serNum = sN; strcpy ( name ,aName ); strcpy_css ( altLoc ,pstr(aLoc) ); strcpy_css ( segID ,pstr(sID) ); if (!eName[0]) element[0] = char(0); else if (!eName[1]) { element[0] = ' '; strcpy ( &(element[1]),eName ); } else strcpy ( element,eName ); WhatIsSet = 0; } int CAtom::ConvertPDBSIGATM ( int ix, cpstr S ) { // Gets data from the PDB ASCII SIGATM record. // This function DOES NOT check the "SIGATM" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_CoordSigma) return Error_ATOM_AlreadySet; if (!(GetReal(sigX,&(S[30]),8) && GetReal(sigY,&(S[38]),8) && GetReal(sigZ,&(S[46]),8))) return Error_ATOM_Unrecognized; WhatIsSet |= ASET_CoordSigma; if (GetReal(sigOcc ,&(S[54]),6)) WhatIsSet |= ASET_OccSigma; if (GetReal(sigTemp,&(S[60]),6)) WhatIsSet |= ASET_tFacSigma; if (WhatIsSet & (ASET_Coordinates | ASET_Anis_tFac | ASET_Anis_tFSigma)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return 0; } int CAtom::ConvertPDBANISOU ( int ix, cpstr S ) { // Gets data from the PDB ASCII ANISOU record. // This function DOES NOT check the "ANISOU" keyword and // does not decode chain and residue parameters! These must // be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_Anis_tFac) return Error_ATOM_AlreadySet; if (!(GetReal(u11,&(S[28]),7) && GetReal(u22,&(S[35]),7) && GetReal(u33,&(S[42]),7) && GetReal(u12,&(S[49]),7) && GetReal(u13,&(S[56]),7) && GetReal(u23,&(S[63]),7))) return Error_ATOM_Unrecognized; u11 /= 1.0e4; u22 /= 1.0e4; u33 /= 1.0e4; u12 /= 1.0e4; u13 /= 1.0e4; u23 /= 1.0e4; WhatIsSet |= ASET_Anis_tFac; if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma | ASET_Anis_tFSigma)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return 0; } int CAtom::ConvertPDBSIGUIJ ( int ix, cpstr S ) { // Gets data from the PDB ASCII SIGUIJ record. // This function DOES NOT check the "SIGUIJ" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (WhatIsSet & ASET_Anis_tFSigma) return Error_ATOM_AlreadySet; if (!(GetReal(su11,&(S[28]),7) && GetReal(su22,&(S[35]),7) && GetReal(su33,&(S[42]),7) && GetReal(su12,&(S[49]),7) && GetReal(su13,&(S[56]),7) && GetReal(su23,&(S[63]),7))) return Error_ATOM_Unrecognized; su11 /= 1.0e4; su22 /= 1.0e4; su33 /= 1.0e4; su12 /= 1.0e4; su13 /= 1.0e4; su23 /= 1.0e4; WhatIsSet |= ASET_Anis_tFSigma; if (WhatIsSet & (ASET_Coordinates | ASET_CoordSigma | ASET_Anis_tFac)) // something was already submitted. check complience return CheckData ( S ); else // first data submission. just take the data GetData ( S ); return 0; } int CAtom::ConvertPDBTER ( int ix, cpstr S ) { // Gets data from the PDB ASCII TER record. // This function DOES NOT check the "TER" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). index = ix; if (((S[6]>='0') && (S[6]<='9')) || (S[6]==' ')) { // Although against strict PDB format, 'TER' is // actually allowed not to have a serial number. // This negative value implies that the number is // not set. if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; } else hy36decode ( 5,&(S[6]),5,&serNum ); // if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; if (WhatIsSet & ASET_Coordinates) return Error_ATOM_AlreadySet; WhatIsSet |= ASET_Coordinates; Het = False; Ter = True; name[0] = char(0); element[0] = char(0); return 0; } int CAtom::GetModelNum() { if (residue) { if (residue->chain) if (residue->chain->model) return residue->chain->model->GetSerNum(); } return 0; } pstr CAtom::GetChainID() { if (residue) { if (residue->chain) return residue->chain->chainID; } return pstr(""); } pstr CAtom::GetResName() { if (residue) return residue->name; else return pstr(""); } int CAtom::GetAASimilarity ( const ResName resName ) { if (residue) return ::GetAASimilarity ( pstr(residue->name), pstr(resName) ); else return -3; } int CAtom::GetAASimilarity ( PCAtom A ) { if (residue) { if (A->residue) return ::GetAASimilarity ( pstr(residue->name), pstr(A->residue->name) ); else return -4; } else return -3; } realtype CAtom::GetAAHydropathy() { if (residue) return ::GetAAHydropathy ( pstr(residue->name) ); else return MaxReal; } realtype CAtom::GetOccupancy() { if (WhatIsSet & ASET_Occupancy) return occupancy; else return 0.0; } int CAtom::GetSeqNum() { if (residue) return residue->seqNum; else return ATOM_NoSeqNum; } pstr CAtom::GetInsCode() { if (residue) return residue->insCode; else return pstr(""); } int CAtom::GetSSEType() { // works only after SSE calculations if (residue) return residue->SSE; else return SSE_None; } pstr CAtom::GetAtomCharge ( pstr chrg ) { if (WhatIsSet & ASET_Charge) sprintf ( chrg,"%+2i",mround(charge) ); else strcpy ( chrg," " ); return chrg; } PCResidue CAtom::GetResidue() { return residue; } PCChain CAtom::GetChain() { if (residue) return residue->chain; else return NULL; } PCModel CAtom::GetModel() { if (residue) { if (residue->chain) return (PCModel)residue->chain->model; } return NULL; } int CAtom::GetResidueNo() { if (residue) { if (residue->chain) return residue->chain->GetResidueNo ( residue->seqNum,residue->insCode ); else return -2; } else return -1; } void * CAtom::GetCoordHierarchy() { if (residue) return residue->GetCoordHierarchy(); return NULL; } void CAtom::GetStat ( realtype v, realtype & v_min, realtype & v_max, realtype & v_m, realtype & v_m2 ) { if (vv_max) v_max = v; v_m += v; v_m2 += v*v; } void CAtom::GetChainCalphas ( PPCAtom & Calphas, int & nCalphas, cpstr altLoc ) { // GetChainCalphas(...) is a specialized function for quick // access to C-alphas of chain which includes given atom. // This function works faster than an equivalent implementation // through MMDB's selection procedures. // Parameters: // Calphas - array to accept pointers on C-alpha atoms // If Calphas!=NULL, then the function will // delete and re-allocate it. When the array // is no longer needed, the application MUST // delete it: delete[] Calphas; Deleting // Calphas does not delete atoms from MMDB. // nCalphas - integer to accept number of C-alpha atoms // and the length of Calphas array. // altLoc - alternative location indicator. By default // (""), maximum-occupancy locations are taken. PCChain chain; PPCResidue res; PPCAtom atom; int nResidues, nAtoms, i,j,k; if (Calphas) { delete[] Calphas; Calphas = NULL; } nCalphas = 0; if (residue) chain = residue->chain; else chain = NULL; if (chain) { chain->GetResidueTable ( res,nResidues ); if (nResidues>0) { Calphas = new PCAtom[nResidues]; if ((!altLoc[0]) || (altLoc[0]==' ')) { // main conformation for (i=0;inAtoms; atom = res[i]->atom; for (j=0;jname," CA ")) { Calphas[nCalphas++] = atom[j]; break; } } } else { // specific conformation for (i=0;inAtoms; atom = res[i]->atom; k = 0; for (j=0;jname," CA ")) { k = 1; if (!atom[j]->altLoc[0]) { // take main conformation now as we do not know if // the specific one is in the file Calphas[nCalphas] = atom[j]; k = 2; } else if (atom[j]->altLoc[0]==altLoc[0]) { // get specific conformation and quit Calphas[nCalphas] = atom[j]; k = 2; break; } } else if (k) break; if (k==2) nCalphas++; } } } } else if (residue) { // check just this atom's residue Calphas = new PCAtom[1]; // can't be more than 1 C-alpha! nAtoms = residue->nAtoms; atom = residue->atom; if ((!altLoc[0]) || (altLoc[0]==' ')) { // main conformation for (j=0;jname," CA ")) { Calphas[nCalphas++] = atom[j]; break; } } else { // specific conformation k = 0; for (j=0;jname," CA ")) { k = 1; if (!atom[j]->altLoc[0]) { Calphas[nCalphas] = atom[j]; k = 2; } else if (atom[j]->altLoc[0]==altLoc[0]) { Calphas[nCalphas] = atom[j]; k = 2; break; } } else if (k) break; if (k==2) nCalphas++; } } if (Calphas && (!nCalphas)) { delete[] Calphas; Calphas = NULL; } } Boolean CAtom::isMetal() { return ::isMetal ( element ); } Boolean CAtom::isSolvent() { if (residue) return residue->isSolvent(); return False; } Boolean CAtom::isInSelection ( int selHnd ) { PCMMDBFile manager = (PCMMDBFile)GetCoordHierarchy(); PCMask Mask; if (manager) { Mask = manager->GetSelMask ( selHnd ); if (Mask) return CheckMask ( Mask ); } return False; } Boolean CAtom::isNTerminus() { if (residue) return residue->isNTerminus(); return False; } Boolean CAtom::isCTerminus() { if (residue) return residue->isCTerminus(); return False; } void CAtom::CalcAtomStatistics ( RSAtomStat AS ) { // AS must be initialized. The function only accumulates // the statistics. if (!Ter) { AS.nAtoms++; if (AS.WhatIsSet & WhatIsSet & ASET_Coordinates) { GetStat ( x,AS.xmin,AS.xmax,AS.xm,AS.xm2 ); GetStat ( y,AS.ymin,AS.ymax,AS.ym,AS.ym2 ); GetStat ( z,AS.zmin,AS.zmax,AS.zm,AS.zm2 ); } else AS.WhatIsSet &= ~ASET_Coordinates; if (AS.WhatIsSet & WhatIsSet & ASET_Occupancy) GetStat(occupancy,AS.occ_min,AS.occ_max,AS.occ_m,AS.occ_m2); else AS.WhatIsSet &= ~ASET_Occupancy; if (AS.WhatIsSet & WhatIsSet & ASET_tempFactor) GetStat ( tempFactor,AS.tFmin,AS.tFmax,AS.tFm,AS.tFm2 ); else AS.WhatIsSet &= ~ASET_tempFactor; if (AS.WhatIsSet & WhatIsSet & ASET_Anis_tFac) { GetStat ( u11,AS.u11_min,AS.u11_max,AS.u11_m,AS.u11_m2 ); GetStat ( u22,AS.u22_min,AS.u22_max,AS.u22_m,AS.u22_m2 ); GetStat ( u33,AS.u33_min,AS.u33_max,AS.u33_m,AS.u33_m2 ); GetStat ( u12,AS.u12_min,AS.u12_max,AS.u12_m,AS.u12_m2 ); GetStat ( u13,AS.u13_min,AS.u13_max,AS.u13_m,AS.u13_m2 ); GetStat ( u23,AS.u23_min,AS.u23_max,AS.u23_m,AS.u23_m2 ); } else AS.WhatIsSet &= ~ASET_Anis_tFac; } } realtype CAtom::GetDist2 ( PCAtom a ) { realtype dx,dy,dz; dx = a->x - x; dy = a->y - y; dz = a->z - z; return dx*dx + dy*dy + dz*dz; } realtype CAtom::GetDist2 ( PCAtom a, mat44 & tm ) { realtype dx,dy,dz; dx = tm[0][0]*a->x + tm[0][1]*a->y + tm[0][2]*a->z + tm[0][3] - x; dy = tm[1][0]*a->x + tm[1][1]*a->y + tm[1][2]*a->z + tm[1][3] - y; dz = tm[2][0]*a->x + tm[2][1]*a->y + tm[2][2]*a->z + tm[2][3] - z; return dx*dx + dy*dy + dz*dz; } realtype CAtom::GetDist2 ( PCAtom a, mat33 & r, vect3 & t ) { realtype dx,dy,dz; dx = r[0][0]*a->x + r[0][1]*a->y + r[0][2]*a->z + t[0] - x; dy = r[1][0]*a->x + r[1][1]*a->y + r[1][2]*a->z + t[1] - y; dz = r[2][0]*a->x + r[2][1]*a->y + r[2][2]*a->z + t[2] - z; return dx*dx + dy*dy + dz*dz; } realtype CAtom::GetDist2 ( realtype ax, realtype ay, realtype az ) { realtype dx,dy,dz; dx = ax - x; dy = ay - y; dz = az - z; return dx*dx + dy*dy + dz*dz; } realtype CAtom::GetCosine ( PCAtom a1, PCAtom a2 ) { // Calculates cosing of angle a1-this-a2, i.e. that between // bond [a1,this] and [this,a2]. realtype dx1,dy1,dz1, dx2,dy2,dz2,r; dx1 = a1->x - x; dy1 = a1->y - y; dz1 = a1->z - z; r = dx1*dx1 + dy1*dy1 + dz1*dz1; dx2 = a2->x - x; dy2 = a2->y - y; dz2 = a2->z - z; r *= dx2*dx2 + dy2*dy2 + dz2*dz2; if (r>0.0) return (dx1*dx2 + dy1*dy2 + dz1*dz2)/sqrt(r); else return 0.0; } void CAtom::MakeTer() { WhatIsSet |= ASET_Coordinates; Het = False; Ter = True; } void CAtom::SetAtomName ( const AtomName atomName ) { strcpy ( name,atomName ); } void CAtom::SetElementName ( const Element elName ) { strcpy ( element,elName ); if (!element[0]) strcpy ( element," " ); else if ((!element[1]) || (element[1]==' ')) { element[2] = char(0); element[1] = element[0]; element[0] = ' '; } } void CAtom::SetCharge ( cpstr chrg ) { pstr p; charge = strtod ( chrg,&p ); if (p!=chrg) WhatIsSet |= ASET_Charge; } void CAtom::SetCharge ( realtype chrg ) { if (chrgchain) { if (residue->chain->model) sprintf (AtomID,"/%i/",residue->chain->model->GetSerNum()); else strcpy ( AtomID,"/-/" ); strcat ( AtomID,residue->chain->chainID ); } else strcpy ( AtomID,"/-/-" ); ParamStr ( AtomID,pstr("/"),residue->seqNum ); if (residue->name[0]) { strcat ( AtomID,"(" ); strcat ( AtomID,residue->name ); strcat ( AtomID,")" ); } if (residue->insCode[0]) { strcat ( AtomID,"." ); strcat ( AtomID,residue->insCode ); } strcat ( AtomID,"/" ); } else strcpy ( AtomID,"/-/-/-/" ); strcpy_css ( S,name ); if (!S[0]) strcpy ( S,"-" ); strcat ( AtomID,S ); strcpy_css ( S,element ); if (S[0]) { strcat ( AtomID,"[" ); strcat ( AtomID,S ); strcat ( AtomID,"]" ); } if (altLoc[0]) { strcat ( AtomID,":" ); strcat ( AtomID,altLoc ); } return AtomID; } pstr CAtom::GetAtomIDfmt ( pstr AtomID ) { int n; char S[50]; AtomID[0] = char(0); if (residue) { if (residue->chain) { if (residue->chain->model) { n = residue->chain->model->GetNumberOfModels(); if (n<10) strcpy ( S,"/%1i/" ); else if (n<100) strcpy ( S,"/%2i/" ); else if (n<1000) strcpy ( S,"/%3i/" ); else strcpy ( S,"/%i/" ); sprintf ( AtomID,S,residue->chain->model->GetSerNum() ); } else strcpy ( AtomID,"/-/" ); strcat ( AtomID,residue->chain->chainID ); } else strcpy ( AtomID,"/-/-" ); if ((-999<=residue->seqNum) && (residue->seqNum<=9999)) sprintf ( S,"/%4i",residue->seqNum ); else sprintf ( S,"/%i" ,residue->seqNum ); strcat ( AtomID,S ); sprintf ( S,"(%3s).%1s/",residue->name,residue->insCode ); strcat ( AtomID,S ); } else strcpy ( AtomID,"/-/-/----(---).-/" ); sprintf ( S,"%4s[%2s]:%1s",name,element,altLoc ); strcat ( AtomID,S ); return AtomID; } int CAtom::ConvertPDBHETATM ( int ix, cpstr S ) { // Gets data from the PDB ASCII HETATM record. // This function DOES NOT check the "HETATM" keyword and // does not decode the chain and residue parameters! These // must be treated by the calling process, see // Chain::ConvertPDBASCII(). int RC; RC = ConvertPDBATOM ( ix,S ); Het = True; return RC; } void CAtom::GetData ( cpstr S ) { pstr p; if (((S[6]>='0') && (S[6]<='9')) || (S[6]==' ')) { // Here we forgive cards with unreadable serial numbers // as we always have index (ix) for the card. For the sake // of strict PDB syntax we would have to return // Error_UnrecognizedInteger here. if (!(GetInteger(serNum,&(S[6]),5))) serNum = -1; } else hy36decode ( 5,&(S[6]),5,&serNum ); // if (!(GetInteger(serNum,&(S[6]),5))) serNum = index; altLoc[0] = S[16]; if (altLoc[0]==' ') altLoc[0] = char(0); else altLoc[1] = char(0); GetString ( name ,&(S[12]),4 ); strcpy_ncss ( segID ,&(S[72]),4 ); GetString ( element,&(S[76]),2 ); charge = strtod ( &(S[78]),&p ); if ((charge!=0.0) && (p!=&(S[78]))) WhatIsSet |= ASET_Charge; RestoreElementName(); } int CAtom::CheckData ( cpstr S ) { int sN; AltLoc aloc; SegID sID; Element elmnt; pstr p; realtype achrg; aloc[0] = S[16]; if (aloc[0]==' ') aloc[0] = char(0); else aloc[1] = char(0); strcpy_ncss ( sID ,&(S[72]),4 ); GetString ( elmnt,&(S[76]),2 ); if (ignoreCharge) achrg = charge; else achrg = strtod ( &(S[78]),&p ); if (!(GetInteger(sN,&(S[6]),5))) sN = index; if (ignoreSegID) { if (segID[0]) strcpy ( sID,segID ); else strcpy ( segID,sID ); } if (ignoreElement) { if (element[0]) strcpy ( elmnt,element ); else strcpy ( element,elmnt ); } if (ignoreUnmatch) return 0; // Here we forgive cards with unreadable serial numbers // as we always have index (ix) for the card. For the sake // of strict PDB syntax we would have to return // Error_UnrecognizedInteger . if ((sN!=serNum) || (strcmp (altLoc ,aloc )) || (strncmp(name ,&(S[12]),4)) || (strcmp (segID ,sID )) || (strcmp (element,elmnt )) || (charge!=achrg)) { /* char name1[100]; strncpy ( name1,&(S[12]),4 ); name1[4] = char(0); printf ( "\n serNum %5i %5i\n" " residue '%s' '%s'\n" " altLoc '%s' '%s'\n" " name '%s' '%s'\n" " segId '%s' '%s'\n" " element '%s' '%s'\n" " charge '%s' '%s'\n", sN,serNum, res->name,residue->name, altLoc ,aloc, name,name1, segID ,sID, element,elmnt, charge ,achrg ); if (res!=residue) printf (" it's a residue\n" ); */ return Error_ATOM_Unmatch; } return 0; } int CAtom::GetCIF ( int ix, PCMMCIFLoop Loop, PCMMCIFLoop LoopAnis ) { char PDBGroup[30]; int k; int RC; index = ix; if (WhatIsSet & ASET_Coordinates) return Error_ATOM_AlreadySet; k = ix-1; CIFGetString ( PDBGroup,Loop,CIFTAG_GROUP_PDB,k, sizeof(PDBGroup),pstr("") ); Ter = !strcmp(PDBGroup,pstr("TER") ); Het = !strcmp(PDBGroup,pstr("HETATM")); RC = CIFGetInteger1 ( serNum,Loop,CIFTAG_ID,k ); if (RC) { if (Ter) serNum = -1; else if (RC==Error_NoData) serNum = index; else return RC; } if (Ter) { Loop->DeleteRow ( k ); WhatIsSet |= ASET_Coordinates; return 0; } CIFGetString ( name ,Loop,CIFTAG_LABEL_ATOM_ID,k, sizeof(name) ,pstr("") ); CIFGetString ( altLoc,Loop,CIFTAG_LABEL_ALT_ID ,k, sizeof(altLoc),pstr("") ); RC = CIFGetReal1 ( x,Loop,CIFTAG_CARTN_X,k ); if (!RC) RC = CIFGetReal1 ( y,Loop,CIFTAG_CARTN_Y,k ); if (!RC) RC = CIFGetReal1 ( z,Loop,CIFTAG_CARTN_Z,k ); if (RC) return Error_ATOM_Unrecognized; WhatIsSet |= ASET_Coordinates; if (!CIFGetReal1(occupancy,Loop,CIFTAG_OCCUPANCY,k)) WhatIsSet |= ASET_Occupancy; if (!CIFGetReal1(tempFactor,Loop,CIFTAG_B_ISO_OR_EQUIV,k)) WhatIsSet |= ASET_tempFactor; CIFGetString ( segID,Loop,CIFTAG_SEGMENT_ID,k, sizeof(segID) ,pstr("") ); if (!CIFGetReal1(charge,Loop,CIFTAG_CHARGE,k)) WhatIsSet |= ASET_Charge; RC = CIFGetString ( element,Loop,CIFTAG_TYPE_SYMBOL,k, sizeof(element),pstr(" ") ); if (RC) CIFGetString ( element,Loop,CIFTAG_ATOM_TYPE_SYMBOL,k, sizeof(element),pstr(" ") ); RestoreElementName(); // MakePDBAtomName(); RC = CIFGetReal1 ( sigX,Loop,CIFTAG_CARTN_X_ESD,k ); if (!RC) RC = CIFGetReal1 ( sigY,Loop,CIFTAG_CARTN_Y_ESD,k ); if (!RC) RC = CIFGetReal1 ( sigZ,Loop,CIFTAG_CARTN_Z_ESD,k ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= ASET_CoordSigma; if (!CIFGetReal1(sigOcc,Loop,CIFTAG_OCCUPANCY_ESD,k)) WhatIsSet |= ASET_OccSigma; if (!CIFGetReal1(sigTemp,Loop,CIFTAG_B_ISO_OR_EQUIV_ESD,k)) WhatIsSet |= ASET_tFacSigma; Loop->DeleteRow ( k ); if (LoopAnis) { RC = CIFGetReal1 ( u11,LoopAnis,CIFTAG_U11,k ); if (!RC) RC = CIFGetReal1 ( u22,LoopAnis,CIFTAG_U22,k ); if (!RC) RC = CIFGetReal1 ( u33,LoopAnis,CIFTAG_U33,k ); if (!RC) RC = CIFGetReal1 ( u13,LoopAnis,CIFTAG_U13,k ); if (!RC) RC = CIFGetReal1 ( u12,LoopAnis,CIFTAG_U12,k ); if (!RC) RC = CIFGetReal1 ( u23,LoopAnis,CIFTAG_U23,k ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= ASET_Anis_tFac; RC = CIFGetReal1 ( su11,LoopAnis,CIFTAG_U11_ESD,k ); if (!RC) RC = CIFGetReal1 ( su22,LoopAnis,CIFTAG_U22_ESD,k ); if (!RC) RC = CIFGetReal1 ( su33,LoopAnis,CIFTAG_U33_ESD,k ); if (!RC) RC = CIFGetReal1 ( su13,LoopAnis,CIFTAG_U13_ESD,k ); if (!RC) RC = CIFGetReal1 ( su12,LoopAnis,CIFTAG_U12_ESD,k ); if (!RC) RC = CIFGetReal1 ( su23,LoopAnis,CIFTAG_U23_ESD,k ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= ASET_Anis_tFSigma; LoopAnis->DeleteRow ( k ); } return 0; } Boolean CAtom::RestoreElementName() { // This function works only if element name is not given. if (Ter) { name[0] = char(0); element[0] = char(0); return False; } if ((!element[0]) || ((element[0]==' ') && ((!element[1]) || (element[1]==' ')))) { if ((name[0]>='A') && (name[0]<='Z')) { element[0] = name[0]; element[1] = name[1]; } else { element[0] = ' '; element[1] = name[1]; } element[2] = char(0); return False; } return True; } Boolean CAtom::MakePDBAtomName() { int i,k; if (Ter) { name[0] = char(0); element[0] = char(0); return False; } UpperCase ( name ); UpperCase ( element ); if ((element[0]==' ') && (element[1]==' ')) { // element name not given, make one from the atom name if ((name[0]>='A') && (name[0]<='Z')) { if (!name[1]) { name[4] = char(0); name[3] = ' '; name[2] = ' '; name[1] = name[0]; name[0] = ' '; } /* the commented part looks like a wrong inheritance from FORTRAN RWBrook. Commented on 04.03.2004, to be removed. else if ((name[0]=='C') && (name[1]=='A')) { name[4] = char(0); name[3] = name[2]; name[2] = name[1]; name[1] = name[0]; name[0] = ' '; } */ element[0] = name[0]; element[1] = name[1]; } else { element[0] = ' '; element[1] = name[1]; } element[2] = char(0); return False; } else if ((name[0]>='A') && (name[0]<='Z')) { if (!element[1]) { element[2] = char(0); element[1] = element[0]; element[0] = ' '; k = strlen(name); if (k<4) { for (i=3;i>0;i--) name[i] = name[i-1]; name[0] = ' '; k++; while (k<4) name[k++] = ' '; name[k] = char(0); } } else if ((element[0]==' ') && (element[1]!=name[1])) { for (i=3;i>0;i--) name[i] = name[i-1]; name[0] = ' '; k = strlen(name); while (k<4) name[k++] = ' '; name[k] = char(0); } } return True; } void CAtom::SetCoordinates ( realtype xx, realtype yy, realtype zz, realtype occ, realtype tFac ) { x = xx; y = yy; z = zz; occupancy = occ; tempFactor = tFac; WhatIsSet |= ASET_Coordinates | ASET_Occupancy | ASET_tempFactor; } void CAtom::Transform ( mat33 & tm, vect3 & v ) { realtype x1,y1,z1; x1 = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + v[0]; y1 = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + v[1]; z1 = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + v[2]; x = x1; y = y1; z = z1; } void CAtom::Transform ( mat44 & tm ) { realtype x1,y1,z1; x1 = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3]; y1 = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3]; z1 = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3]; x = x1; y = y1; z = z1; } void CAtom::TransformCopy ( mat44 & tm, realtype & xx, realtype & yy, realtype & zz ) { xx = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3]; yy = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3]; zz = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3]; } void CAtom::TransformSet ( mat44 & tm, realtype xx, realtype yy, realtype zz ) { x = tm[0][0]*xx + tm[0][1]*yy + tm[0][2]*zz + tm[0][3]; y = tm[1][0]*xx + tm[1][1]*yy + tm[1][2]*zz + tm[1][3]; z = tm[2][0]*xx + tm[2][1]*yy + tm[2][2]*zz + tm[2][3]; } // ------- user-defined data handlers int CAtom::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_ATOM) return CUDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CAtom::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_ATOM) return CUDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CAtom::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_ATOM) return CUDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int CAtom::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_ATOM) return CUDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CAtom::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_ATOM) return CUDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CAtom::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_ATOM) return CUDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int CAtom::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_ATOM) return CUDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } void CAtom::Copy ( PCAtom atom ) { // this does not make any references in residues and does // not change indices!! it does change serial numbers, though. serNum = atom->serNum; x = atom->x; y = atom->y; z = atom->z; occupancy = atom->occupancy; tempFactor = atom->tempFactor; sigX = atom->sigX; sigY = atom->sigY; sigZ = atom->sigZ; sigOcc = atom->sigOcc; sigTemp = atom->sigTemp; u11 = atom->u11; u22 = atom->u22; u33 = atom->u33; u12 = atom->u12; u13 = atom->u13; u23 = atom->u23; su11 = atom->su11; su22 = atom->su22; su33 = atom->su33; su12 = atom->su12; su13 = atom->su13; su23 = atom->su23; Het = atom->Het; Ter = atom->Ter; WhatIsSet = atom->WhatIsSet; strcpy ( name ,atom->name ); strcpy ( altLoc ,atom->altLoc ); strcpy ( segID ,atom->segID ); strcpy ( element ,atom->element ); strcpy ( energyType,atom->energyType ); charge = atom->charge; } int CAtom::CheckID ( const AtomName aname, const Element elname, const AltLoc aloc ) { pstr p1,p2; if (aname) { if (aname[0]!='*') { p1 = name; while (*p1==' ') p1++; p2 = pstr(aname); while (*p2==' ') p2++; while ((*p2) && (*p1) && (*p1!=' ') && (*p2!=' ')) { if (*p1!=*p2) return 0; p1++; p2++; } if (*p1!=*p2) { if (((*p1) && (*p1!=' ')) || ((*p2) && (*p2!=' '))) return 0; } } } if (elname) { if (elname[0]!='*') { p1 = element; while (*p1==' ') p1++; p2 = pstr(elname); while (*p2==' ') p2++; while ((*p2) && (*p1) && (*p1!=' ') && (*p2!=' ')) { if (*p1!=*p2) return 0; p1++; p2++; } if (*p1!=*p2) return 0; } } if (aloc) { if ((aloc[0]!='*') && (strcmp(aloc,altLoc))) return 0; } return 1; } int CAtom::CheckIDS ( cpstr ID ) { AtomName aname; Element elname; AltLoc aloc; pstr p; p = strrchr ( ID,'/' ); if (p) p++; else p = pstr(ID); ParseAtomID ( p,aname,elname,aloc ); return CheckID ( aname,elname,aloc ); } void CAtom::SetShortBinary() { WhatIsSet |= ASET_ShortBinary; } void CAtom::write ( RCFile f ) { int i,k; byte Version=1; byte nb; f.WriteWord ( &WhatIsSet ); if (WhatIsSet & ASET_ShortBinary) { if (Ter) WhatIsSet |= ASET_ShortTer; if (Het) WhatIsSet |= ASET_ShortHet; f.WriteInt ( &index ); f.WriteTerLine ( name ,False ); f.WriteTerLine ( altLoc ,False ); f.WriteTerLine ( element,False ); if (WhatIsSet & ASET_Coordinates) { f.WriteFloat ( &x ); f.WriteFloat ( &y ); f.WriteFloat ( &z ); } return; } f.WriteByte ( &Version ); CUDData::write ( f ); f.WriteInt ( &serNum ); f.WriteInt ( &index ); f.WriteTerLine ( name ,False ); f.WriteTerLine ( altLoc ,False ); f.WriteTerLine ( segID ,False ); f.WriteTerLine ( element ,False ); f.WriteTerLine ( energyType,False ); f.WriteFloat ( &charge ); f.WriteBool ( &Het ); f.WriteBool ( &Ter ); if (WhatIsSet & ASET_Coordinates) { f.WriteFloat ( &x ); f.WriteFloat ( &y ); f.WriteFloat ( &z ); if (WhatIsSet & ASET_Occupancy) f.WriteFloat ( &occupancy ); if (WhatIsSet & ASET_tempFactor) f.WriteFloat ( &tempFactor ); } if (WhatIsSet & ASET_CoordSigma) { f.WriteFloat ( &sigX ); f.WriteFloat ( &sigY ); f.WriteFloat ( &sigZ ); if ((WhatIsSet & ASET_Occupancy) && (WhatIsSet & ASET_OccSigma)) f.WriteFloat ( &sigOcc ); if ((WhatIsSet & ASET_tempFactor) && (WhatIsSet & ASET_tFacSigma)) f.WriteFloat ( &sigTemp ); } if (WhatIsSet & ASET_Anis_tFac) { f.WriteFloat ( &u11 ); f.WriteFloat ( &u22 ); f.WriteFloat ( &u33 ); f.WriteFloat ( &u12 ); f.WriteFloat ( &u13 ); f.WriteFloat ( &u23 ); if (WhatIsSet & ASET_Anis_tFSigma) { f.WriteFloat ( &su11 ); f.WriteFloat ( &su22 ); f.WriteFloat ( &su33 ); f.WriteFloat ( &su12 ); f.WriteFloat ( &su13 ); f.WriteFloat ( &su23 ); } } nb = byte(nBonds & 0x000000FF); f.WriteByte ( &nb ); for (i=0;iindex) ); f.WriteByte ( &(Bond[i].order) ); } else { k = -1; f.WriteInt ( &k ); } } void CAtom::read ( RCFile f ) { int i,k; byte nb,Version; FreeMemory(); f.ReadWord ( &WhatIsSet ); if (WhatIsSet & ASET_ShortBinary) { f.ReadInt ( &index ); f.ReadTerLine ( name ,False ); f.ReadTerLine ( altLoc ,False ); f.ReadTerLine ( element,False ); if (WhatIsSet & ASET_Coordinates) { f.ReadFloat ( &x ); f.ReadFloat ( &y ); f.ReadFloat ( &z ); } serNum = index; Ter = WhatIsSet & ASET_ShortTer; Het = WhatIsSet & ASET_ShortHet; name [4] = char(0); altLoc [1] = char(0); element[2] = char(0); segID [0] = char(0); charge = 0.0; WhatIsSet &= ASET_All; return; } f.ReadByte ( &Version ); CUDData::read ( f ); f.ReadInt ( &serNum ); f.ReadInt ( &index ); f.ReadTerLine ( name ,False ); f.ReadTerLine ( altLoc ,False ); f.ReadTerLine ( segID ,False ); f.ReadTerLine ( element ,False ); f.ReadTerLine ( energyType,False ); f.ReadFloat ( &charge ); f.ReadBool ( &Het ); f.ReadBool ( &Ter ); if (WhatIsSet & ASET_Coordinates) { f.ReadFloat ( &x ); f.ReadFloat ( &y ); f.ReadFloat ( &z ); if (WhatIsSet & ASET_Occupancy) f.ReadFloat ( &occupancy ); else occupancy = 0.0; if (WhatIsSet & ASET_tempFactor) f.ReadFloat ( &tempFactor ); else tempFactor = 0.0; } else { x = 0.0; y = 0.0; z = 0.0; occupancy = 0.0; tempFactor = 0.0; } if (WhatIsSet & ASET_CoordSigma) { f.ReadFloat ( &sigX ); f.ReadFloat ( &sigY ); f.ReadFloat ( &sigZ ); if ((WhatIsSet & ASET_Occupancy) && (WhatIsSet & ASET_OccSigma)) f.ReadFloat ( &sigOcc ); else sigOcc = 0.0; if ((WhatIsSet & ASET_tempFactor) && (WhatIsSet & ASET_tFacSigma)) f.ReadFloat ( &sigTemp ); else sigTemp = 0.0; } else { sigX = 0.0; sigY = 0.0; sigZ = 0.0; sigOcc = 0.0; sigTemp = 0.0; } if (WhatIsSet & ASET_Anis_tFac) { f.ReadFloat ( &u11 ); f.ReadFloat ( &u22 ); f.ReadFloat ( &u33 ); f.ReadFloat ( &u12 ); f.ReadFloat ( &u13 ); f.ReadFloat ( &u23 ); if (WhatIsSet & ASET_Anis_tFSigma) { f.ReadFloat ( &su11 ); f.ReadFloat ( &su22 ); f.ReadFloat ( &su33 ); f.ReadFloat ( &su12 ); f.ReadFloat ( &su13 ); f.ReadFloat ( &su23 ); } else { su11 = 0.0; su22 = 0.0; su33 = 0.0; su12 = 0.0; su13 = 0.0; su23 = 0.0; } } else { u11 = 0.0; u22 = 0.0; u33 = 0.0; u12 = 0.0; u13 = 0.0; u23 = 0.0; su11 = 0.0; su22 = 0.0; su33 = 0.0; su12 = 0.0; su13 = 0.0; su23 = 0.0; } f.ReadByte ( &nb ); if (nb>0) { Bond = new SAtomBond[nb]; for (i=0;i0) f.ReadByte ( &(Bond[i].order) ); else Bond[i].order = 0; // we place *index* of bonded atom temporary on the place // of its pointer, and the pointer will be calculated // after CResidue::read calls _setBonds(..). memcpy ( &(Bond[i].atom),&k,4 ); } } nBonds = nb; nBonds = nBonds | (nBonds << 8); } void CAtom::_setBonds ( PPCAtom A ) { int i,k,nb; nb = nBonds & 0x000000FF; for (i=0;i0) Bond[i].atom = A[k]; else Bond[i].atom = NULL; } } MakeFactoryFunctions(CAtom) // =========================== CResidue =========================== void SAtomStat::Init() { nAtoms = 0; xmin = MaxReal; xmax = MinReal; xm = 0.0; xm2 = 0.0; ymin = MaxReal; ymax = MinReal; ym = 0.0; ym2 = 0.0; zmin = MaxReal; zmax = MinReal; zm = 0.0; zm2 = 0.0; occ_min = MaxReal; occ_max = MinReal; occ_m = 0.0; occ_m2 = 0.0; tFmin = MaxReal; tFmax = MinReal; tFm = 0.0; tFm2 = 0.0; u11_min = MaxReal; u11_max = MinReal; u11_m = 0.0; u11_m2 = 0.0; u22_min = MaxReal; u22_max = MinReal; u22_m = 0.0; u22_m2 = 0.0; u33_min = MaxReal; u33_max = MinReal; u33_m = 0.0; u33_m2 = 0.0; u12_min = MaxReal; u12_max = MinReal; u12_m = 0.0; u12_m2 = 0.0; u13_min = MaxReal; u13_max = MinReal; u13_m = 0.0; u13_m2 = 0.0; u23_min = MaxReal; u23_max = MinReal; u23_m = 0.0; u23_m2 = 0.0; WhatIsSet = ASET_All; finished = False; } void SAtomStat::Finish() { realtype v; if (!finished) { finished = True; if (nAtoms>0) { v = nAtoms; xm /= v; xm2 /= v; ym /= v; ym2 /= v; zm /= v; zm2 /= v; occ_m /= v; occ_m2 /= v; tFm /= v; tFm2 /= v; u11_m /= v; u11_m2 /= v; u22_m /= v; u22_m2 /= v; u33_m /= v; u33_m2 /= v; u12_m /= v; u12_m2 /= v; u13_m /= v; u13_m2 /= v; u23_m /= v; u23_m2 /= v; } } } realtype SAtomStat::GetMaxSize() { realtype r; r = RMax(xmax-xmin,ymax-ymin); r = RMax(r,zmax-zmin); return RMax(r,0.0); } // ---------------------------------------------------------------- CResidue::CResidue() : CUDData() { InitResidue(); } CResidue::CResidue ( PCChain Chain_Owner ) : CUDData() { InitResidue(); if (Chain_Owner) Chain_Owner->AddResidue ( this ); } CResidue::CResidue ( PCChain Chain_Owner, const ResName resName, int sqNum, const InsCode ins ) : CUDData() { InitResidue(); seqNum = sqNum; strcpy_css ( name,pstr(resName) ); strcpy_css ( insCode,pstr(ins) ); if (Chain_Owner) Chain_Owner->AddResidue ( this ); } CResidue::CResidue ( RPCStream Object ) : CUDData(Object) { InitResidue(); } CResidue::~CResidue() { FreeMemory(); if (chain) chain->_ExcludeResidue ( name,seqNum,insCode ); } void CResidue::InitResidue() { strcpy ( name,"---" ); // residue name seqNum = -MaxInt; // residue sequence number strcpy ( insCode,"" ); // residue insertion code chain = NULL; // reference to chain index = -1; // undefined index in chain nAtoms = 0; // number of atoms in the residue AtmLen = 0; // length of atom array atom = NULL; // array of atoms Exclude = True; SSE = SSE_None; } void CResidue::SetChain ( PCChain Chain_Owner ) { chain = Chain_Owner; } int CResidue::GetResidueNo() { if (chain) return chain->GetResidueNo ( seqNum,insCode ); else return -1; } void CResidue::SetChainID ( const ChainID chID ) { if (chain) chain->SetChainID ( chID ); } int CResidue::GetCenter ( realtype & x, realtype & y, realtype & z ) { int i,k; x = 0.0; y = 0.0; z = 0.0; k = 0; for (i=0;iTer) { x += atom[i]->x; y += atom[i]->y; z += atom[i]->z; k++; } } if (k>0) { x /= k; y /= k; z /= k; return 0; } return 1; } void * CResidue::GetCoordHierarchy() { if (chain) return chain->GetCoordHierarchy(); return NULL; } void CResidue::GetAltLocations ( int & nAltLocs, PAltLoc & aLoc, rvector & occupancy, int & alflag ) { int i,j,k, nal,nal1; realtype occ1; Boolean B; PAltLoc aL; rvector occ; bvector alv; aLoc = NULL; occupancy = NULL; nAltLocs = 0; alflag = ALF_NoAltCodes; if (nAtoms>0) { // temporary array for altcodes aL = new AltLoc[nAtoms]; // temporary array for occupancies GetVectorMemory ( occ,nAtoms,0 ); // temporary array for checking altcodes GetVectorMemory ( alv,nAtoms,0 ); for (i=0;iTer) { // Find if the alternation code of ith atom is // a new one. B = False; for (j=0;(jaltLoc,aL[j]); if (!B) { // that's a new altcode, get its occupancy if (atom[i]->WhatIsSet & ASET_Occupancy) occ[k] = atom[i]->occupancy; else occ[k] = -1.0; // store new altcode in temporary array strcpy ( aL[k],atom[i]->altLoc ); // check consistency of the altcode data if: // a) the data was not found wrong so far // b) this atom name has not been checked before // c) altcode is not the "empty"-altcode if ((!(alflag & ALF_Mess)) && (!alv[i]) && (atom[i]->altLoc[0])) { B = False; // will be set True if "empty"-altcode // is found for current atom name nal1 = 0; // counts the number of different altcodes // for current atom name occ1 = 0.0; // will count the sum of occupancies for // current atom name for (j=0;jTer) && (!strcmp(atom[j]->name,atom[i]->name))) { if (atom[j]->WhatIsSet & ASET_Occupancy) occ1 += atom[j]->occupancy; if (!atom[j]->altLoc[0]) B = True; alv[j] = True; // mark it as "checked" nal1++; } } if (!(alflag & (ALF_EmptyAltLoc | ALF_NoEmptyAltLoc))) { if (B) alflag |= ALF_EmptyAltLoc; else alflag |= ALF_NoEmptyAltLoc; } else if (((alflag & ALF_EmptyAltLoc) && (!B)) || ((alflag & ALF_NoEmptyAltLoc) && (B))) alflag |= ALF_Mess; if ((occ[k]>=0) && (fabs(1.0-occ1)>0.01)) alflag |= ALF_Occupancy; if (nal==0) // first time just remember the number nal = nal1; // of different altcodes else if (nal!=nal1) // check if number of different altcodes alflag |= ALF_Mess; // is not the same through the residue } k++; } } } if (k>0) { aLoc = new AltLoc[k]; GetVectorMemory ( occupancy,k,0 ); for (i=0;iTer) { B = False; for (j=0;(jTer) B = !strcmp(atom[i]->altLoc,atom[j]->altLoc); } if (!B) k++; } } return k; } void CResidue::SetResID ( const ResName resName, int sqNum, const InsCode ins ) { strcpy_css ( name,pstr(resName) ); seqNum = sqNum; strcpy_css ( insCode,pstr(ins) ); } void CResidue::FreeMemory() { // NOTE: individual atoms are disposed here as well! DeleteAllAtoms(); if (atom) delete[] atom; atom = NULL; nAtoms = 0; AtmLen = 0; } void CResidue::ExpandAtomArray ( int nAdd ) { int i; PPCAtom atom1; AtmLen += abs(nAdd); atom1 = new PCAtom[AtmLen]; for (i=0;i=AtmLen) ExpandAtomArray ( nAtoms+10-AtmLen ); atom[nAtoms] = atm; atom[nAtoms]->residue = this; nAtoms++; return 0; } int CResidue::AddAtom ( PCAtom atm ) { // AddAtom(..) adds atom to the residue. If residue is associated // with a coordinate hierarchy, and atom 'atm' is not, the latter // is checked in automatically. If atom 'atm' belongs to any // coordinate hierarchy (even though that of the residue), it is // *copied* rather than simply taken over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. PCMMDBFile manager; PCResidue res; int i; for (i=0;i=AtmLen) ExpandAtomArray ( nAtoms+10-AtmLen ); if (atm->GetCoordHierarchy()) { atom[nAtoms] = newCAtom(); atom[nAtoms]->Copy ( atm ); } else { res = atm->GetResidue(); if (res) for (i=0;inAtoms;i++) if (res->atom[i]==atm) { res->atom[i] = NULL; break; } atom[nAtoms] = atm; } atom[nAtoms]->residue = this; manager = PCMMDBFile(GetCoordHierarchy()); if (manager) manager->CheckInAtom ( 0,atom[nAtoms] ); nAtoms++; return nAtoms; } int CResidue::InsertAtom ( PCAtom atm, int position ) { // InsertAtom(..) inserts atom into the specified position of // the residue. If residue is associated with a coordinate hierarchy, // and atom 'atm' is not, the latter is checked in automatically. // If atom 'atm' belongs to any coordinate hierarchy (even though // that of the residue), it is *copied* rather than simply taken // over, and is checked in. // If residue is not associated with a coordinate hierarchy, all // added atoms will be checked in automatically once the residue // is checked in. PCMMDBFile manager; PCResidue res; int i,pos; for (i=0;i=AtmLen) ExpandAtomArray ( nAtoms+10-AtmLen ); pos = IMin(position,nAtoms); for (i=nAtoms;i>pos;i--) atom[i] = atom[i-1]; if (atm->GetCoordHierarchy()) { atom[pos] = newCAtom(); atom[pos]->Copy ( atm ); } else { res = atm->GetResidue(); if (res) for (i=0;inAtoms;i++) if (res->atom[i]==atm) { res->atom[i] = NULL; break; } atom[pos] = atm; } atom[pos]->residue = this; manager = PCMMDBFile(GetCoordHierarchy()); if (manager) manager->CheckInAtom ( 0,atom[pos] ); nAtoms++; return nAtoms; } int CResidue::InsertAtom ( PCAtom atm, const AtomName aname ) { // This version inserts before the atom with given name. If such // name is not found, the atom is appended to the end. int i; i = 0; while (iname)) break; else i++; return InsertAtom ( atm,i ); } void CResidue::CheckInAtoms() { PCMMDBFile manager; int i; manager = PCMMDBFile(GetCoordHierarchy()); if (manager) for (i=0;iindex<0) manager->CheckInAtom ( 0,atom[i] ); } } int CResidue::_ExcludeAtom ( int kndex ) { // deletes atom from the residue int i,k; if (!Exclude) return 0; k = -1; for (i=0;(iindex==kndex) k = i; } if (k>=0) { for (i=k+1;iPDBASCIIDump ( f ); } void CResidue::MakeAtomCIF ( PCMMCIFData CIF ) { int i; for (i=0;iMakeCIF ( CIF ); } void CResidue::Copy ( PCResidue res ) { // // Modify CResidue::Copy and both CResidues::_copy methods // simultaneously! // // This function will nake a copy of residue res in 'this' one. // All atoms are copied, none is moved regardless to the association // with coordinate hierarchy. If 'this' residue is associated with // a coordinate hierarchy, all atoms are checked in. PCMMDBFile manager; int i; FreeMemory(); seqNum = res->seqNum; index = res->index; AtmLen = res->nAtoms; strcpy ( name ,res->name ); strcpy ( insCode,res->insCode ); SSE = res->SSE; if (AtmLen>0) { atom = new PCAtom[AtmLen]; nAtoms = 0; for (i=0;inAtoms;i++) if (res->atom[i]) { atom[nAtoms] = newCAtom(); atom[nAtoms]->Copy ( res->atom[i] ); atom[nAtoms]->SetResidue ( this ); nAtoms++; } for (i=nAtoms;iCheckInAtoms ( 0,atom,nAtoms ); } } void CResidue::_copy ( PCResidue res ) { // Modify both CResidue::_copy and CResidue::Copy methods // simultaneously! // // will work properly only if atomic arrays // this->chain->model->GetAtom() and // res->chain->model->GetAtom() are identical // int i; PPCAtom A; FreeMemory(); seqNum = res->seqNum; index = res->index; nAtoms = res->nAtoms; strcpy ( name ,res->name ); strcpy ( insCode,res->insCode ); SSE = res->SSE; AtmLen = nAtoms; A = NULL; if (chain) { if (chain->model) A = chain->model->GetAllAtoms(); } if ((nAtoms>0) && (A)) { atom = new PCAtom[nAtoms]; for (i=0;iatom[i]->index-1]; atom[i]->SetResidue ( this ); } } else { nAtoms = 0; AtmLen = 0; } } void CResidue::_copy ( PCResidue res, PPCAtom atm, int & atom_index ) { // modify both CResidue::_copy and CResidue::Copy methods // simultaneously! // // This function physically copies the atoms, creating new atom // instances and putting them into array 'atm' sequentially from // 'atom_index' position. 'atom_index' is modified (advanced). // int i; FreeMemory(); seqNum = res->seqNum; index = res->index; nAtoms = res->nAtoms; strcpy ( name ,res->name ); strcpy ( insCode,res->insCode ); SSE = res->SSE; AtmLen = nAtoms; if (AtmLen>0) { atom = new PCAtom[AtmLen]; for (i=0;iatom[i]) { if (!atm[atom_index]) atm[atom_index] = newCAtom(); atm[atom_index]->Copy ( res->atom[i] ); atm[atom_index]->residue = this; atm[atom_index]->index = atom_index+1; atom[i] = atm[atom_index]; atom_index++; } else atom[i] = NULL; } } void CResidue::GetAtomStatistics ( RSAtomStat AS ) { AS.Init(); CalcAtomStatistics ( AS ); AS.Finish(); } void CResidue::CalcAtomStatistics ( RSAtomStat AS ) { // AS must be initialized. The function only accumulates // the statistics. int i; for (i=0;iCalcAtomStatistics ( AS ); } PCChain CResidue::GetChain() { return chain; } PCModel CResidue::GetModel() { if (chain) return (PCModel)chain->model; else return NULL; } int CResidue::GetModelNum() { if (chain) { if (chain->model) return chain->model->GetSerNum(); } return 0; } pstr CResidue::GetChainID() { if (chain) return chain->chainID; return pstr(""); } pstr CResidue::GetResName() { return name; } int CResidue::GetAASimilarity ( const ResName resName ) { return ::GetAASimilarity ( pstr(name),pstr(resName) ); } int CResidue::GetAASimilarity ( PCResidue res ) { return ::GetAASimilarity ( name,res->name ); } realtype CResidue::GetAAHydropathy() { return ::GetAAHydropathy ( name ); } void CResidue::SetResName ( const ResName resName ) { strcpy ( name,resName ); } int CResidue::GetSeqNum() { return seqNum; } pstr CResidue::GetInsCode() { return insCode; } Boolean CResidue::isAminoacid () { return ::isAminoacid ( name ); } Boolean CResidue::isNucleotide() { return ::isNucleotide ( name ); } int CResidue::isDNARNA() { return ::isDNARNA ( name ); } Boolean CResidue::isSugar() { return ::isSugar ( name ); } Boolean CResidue::isSolvent() { return ::isSolvent ( name ); } Boolean CResidue::isModRes() { PCChain chn; PCModRes modRes; int nModRes,i; chn = GetChain(); if (chn) { nModRes = chn->GetNofModResidues(); for (i=0;iGetModResidue ( i ); if (modRes) { if ((!strcmp(modRes->resName,name)) && (modRes->seqNum==seqNum) && (!strcmp(modRes->insCode,insCode))) return True; } } } return False; } Boolean CResidue::isInSelection ( int selHnd ) { PCMMDBFile manager = (PCMMDBFile)GetCoordHierarchy(); PCMask Mask; if (manager) { Mask = manager->GetSelMask ( selHnd ); if (Mask) return CheckMask ( Mask ); } return False; } Boolean CResidue::isNTerminus() { PPCResidue Res; int i,j,nRes; if (chain) { chain->GetResidueTable ( Res,nRes ); i = 0; j = -1; while ((i=0) return (Res[j]->index==index); } return False; } Boolean CResidue::isCTerminus() { PPCResidue Res; int i,j,nRes; if (chain) { chain->GetResidueTable ( Res,nRes ); i = nRes-1; j = -1; while ((i>=0) && (j<0)) { if (Res[i]) j = i; i--; } if (j>=0) return (Res[j]->index==index); } return False; } pstr CResidue::GetResidueID ( pstr ResidueID ) { ResidueID[0] = char(0); if (chain) { if (chain->model) sprintf ( ResidueID,"/%i/",chain->model->GetSerNum() ); else strcpy ( ResidueID,"/-/" ); strcat ( ResidueID,chain->chainID ); } else strcpy ( ResidueID,"/-/-" ); ParamStr ( ResidueID,pstr("/"),seqNum ); strcat ( ResidueID,"(" ); strcat ( ResidueID,name ); strcat ( ResidueID,")" ); if (insCode[0]) { strcat ( ResidueID,"." ); strcat ( ResidueID,insCode ); } return ResidueID; } int CResidue::CheckID ( int * snum, const InsCode inscode, const ResName resname ) { if (snum) { if (*snum!=seqNum) return 0; } if (inscode) { if ((inscode[0]!='*') && (strcmp(inscode,insCode))) return 0; } if (!resname) return 1; if ((resname[0]!='*') && (strcmp(resname,name))) return 0; return 1; } int CResidue::CheckIDS ( cpstr CID ) { ChainID chn; InsCode inscode; ResName resname; AtomName atm; Element elm; AltLoc aloc; pstr p1,p2; int mdl,sn,rc; rc = ParseAtomPath ( CID,mdl,chn,sn,inscode,resname, atm,elm,aloc,NULL ); // rc = ParseResID ( CID,sn,inscode,resname ); if (rc>=0) { p1 = NULL; p2 = NULL; if (inscode[0]!='*') p1 = inscode; if (resname[0]!='*') p2 = resname; if (!rc) return CheckID ( &sn ,p1,p2 ); else return CheckID ( NULL,p1,p2 ); } return 0; } // -------------------- Extracting atoms ------------------------- int CResidue::GetNumberOfAtoms() { return nAtoms; } int CResidue::GetNumberOfAtoms ( Boolean countTers ) { int i,na; na = 0; for (i=0;iTer)) na++; } return na; } PCAtom CResidue::GetAtom ( const AtomName aname, const Element elname, const AltLoc aloc ) { int i; for (i=0;iCheckID(aname,elname,aloc)) return atom[i]; } return NULL; } PCAtom CResidue::GetAtom ( int atomNo ) { if ((0<=atomNo) && (atomNo0) { atomTable = new PCAtom[nAtoms]; j = 0; for (i=0;iTer) atomTable[j++] = atom[i]; } NumberOfAtoms = j; } else { atomTable = NULL; NumberOfAtoms = 0; } } void CResidue::TrimAtomTable() { int i,j; j = 0; for (i=0;imodel) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } k = 0; for (i=0;iCheckID(aname,elname,aloc)) { k++; kndex = atom[i]->index; if ((0model) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } kndex = atom[atomNo]->index; if ((0model) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } k = 0; for (i=0;iindex; if ((0model) { A = chain->model->GetAllAtoms(); nA = chain->model->GetNumberOfAllAtoms(); } } Exclude = False; n = 0; for (i=0;iTer) { occupancy = atom[i]->GetOccupancy(); strcpy ( aname,atom[i]->name ); strcpy ( aLoc ,atom[i]->altLoc ); i1 = -1; i2 = i; k = 0; for (j=i+1;jTer) && (!strcmp(atom[j]->name,aname))) { k++; occ = atom[j]->GetOccupancy(); if (occ>occupancy) { occupancy = occ; i1 = j; } if (aLoc[0]) { strcpy ( aL,atom[j]->altLoc ); if (!aL[0]) { aLoc[0] = char(0); i2 = j; } else if (strcmp(aL,aLoc)<0) { strcpy ( aLoc,aL ); i2 = j; } } } } if (k>0) { if (i1<0) { if (atom[i]->WhatIsSet & ASET_Occupancy) i1 = i; else i1 = i2; } for (j=i;jTer) && (!strcmp(atom[j]->name,aname))) { n++; kndex = atom[j]->index; if ((0Ter) atom[i]->Transform ( TMatrix ); } } // ----------------------------------------------------------------- void CResidue::MaskAtoms ( PCMask Mask ) { int i; for (i=0;iSetMask ( Mask ); } void CResidue::UnmaskAtoms ( PCMask Mask ) { int i; for (i=0;iRemoveMask ( Mask ); } // ------- user-defined data handlers int CResidue::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_RESIDUE) return CUDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CResidue::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_RESIDUE) return CUDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CResidue::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_RESIDUE) return CUDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int CResidue::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_RESIDUE) return CUDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CResidue::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_RESIDUE) return CUDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CResidue::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_RESIDUE) return CUDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int CResidue::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_RESIDUE) return CUDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } /* commented on 18.03.2004, to be deleted realtype BondAngle ( PCAtom A, PCAtom B, PCAtom C ) { realtype abx,aby,abz; realtype acx,acy,acz; realtype bcx,bcy,bcz; realtype absq,acsq,bcsq; abx = B->x - A->x; aby = B->y - A->y; abz = B->z - A->z; acx = A->x - C->x; acy = A->y - C->y; acz = A->z - C->z; bcx = C->x - B->x; bcy = C->y - B->y; bcz = C->z - B->z; absq = abx*abx + aby*aby + abz*abz; acsq = acx*acx + acy*acy + acz*acz; bcsq = bcx*bcx + bcy*bcy + bcz*bcz; return acos ( (bcsq + absq - acsq)/(2.0*sqrt(bcsq*absq)) ); } #define NOmaxdist2 12.25 Boolean CResidue::isMainchainHBond ( PCResidue res ) { // Test if there is main chain Hbond between PCRes1 (donor) and // PCRes2 (acceptor). // As defined Kabsch & Sanders // This probably need the option of supporting alternative criteria PCAtom NAtom,OAtom,CAtom; realtype dx,dy,dz; NAtom = GetAtom ( "N" ); OAtom = res->GetAtom ( "O" ); CAtom = res->GetAtom ( "C" ); if (NAtom && OAtom && CAtom) { dx = fabs ( NAtom->x - OAtom->x ); dy = fabs ( NAtom->y - OAtom->y ); dz = fabs ( NAtom->z - OAtom->z ); return ((dx*dx+dy*dy+dz*dz<=NOmaxdist2) && (BondAngle(NAtom,OAtom,CAtom)>=Pi/2.0)); } return False; } */ #define NOmaxdist2 12.25 Boolean CResidue::isMainchainHBond ( PCResidue res ) { // Test if there is main chain Hbond between PCRes1 (donor) and // PCRes2 (acceptor). // As defined Kabsch & Sanders // This probably needs the option of supporting alternative criteria PCAtom NAtom,OAtom,CAtom; realtype abx,aby,abz; realtype acx,acy,acz; realtype bcx,bcy,bcz; realtype absq,acsq,bcsq; NAtom = GetAtom ( "N" ); OAtom = res->GetAtom ( "O" ); CAtom = res->GetAtom ( "C" ); if (NAtom && OAtom && CAtom) { abx = OAtom->x - NAtom->x; aby = OAtom->y - NAtom->y; abz = OAtom->z - NAtom->z; absq = abx*abx + aby*aby + abz*abz; if (absq<=NOmaxdist2) { acx = NAtom->x - CAtom->x; acy = NAtom->y - CAtom->y; acz = NAtom->z - CAtom->z; bcx = CAtom->x - OAtom->x; bcy = CAtom->y - OAtom->y; bcz = CAtom->z - OAtom->z; acsq = acx*acx + acy*acy + acz*acz; bcsq = bcx*bcx + bcy*bcy + bcz*bcz; return (acos((bcsq+absq-acsq)/(2.0*sqrt(bcsq*absq)))>=Pi/2.0); } } return False; } void CResidue::write ( RCFile f ) { int i; byte Version=1; CUDData::write ( f ); f.WriteByte ( &Version ); f.WriteInt ( &seqNum ); f.WriteInt ( &index ); f.WriteInt ( &nAtoms ); f.WriteByte ( &SSE ); f.WriteTerLine ( name ,False ); f.WriteTerLine ( insCode,False ); for (i=0;iindex) ); } void CResidue::read ( RCFile f ) { // IMPORTANT: array Atom in CMMDBFile class should be // read prior calling this function! PPCAtom A; int i,k; byte Version; FreeMemory (); CUDData::read ( f ); f.ReadByte ( &Version ); f.ReadInt ( &seqNum ); f.ReadInt ( &index ); f.ReadInt ( &nAtoms ); f.ReadByte ( &SSE ); f.ReadTerLine ( name ,False ); f.ReadTerLine ( insCode,False ); AtmLen = nAtoms; A = NULL; if (chain) { if (chain->model) A = chain->model->GetAllAtoms(); } if ((nAtoms>0) && (A)) { atom = new PCAtom[nAtoms]; for (i=0;iSetResidue ( this ); atom[i]->_setBonds ( A ); } } else { for (i=0;i // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CMask ( atom selection mask ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_Mask__ #define __MMDB_Mask__ #ifndef __Stream__ #include "stream_.h" #endif // ==================== CMask ======================== DefineClass(CMask) DefineStreamFunctions(CMask) class CMask : public CStream { public : CMask (); CMask ( RPCStream Object ); ~CMask(); void SetMaskBit ( int BitNo ); void NewMask ( PPCMask Mask, int nMasks ); void CopyMask ( PCMask Mask ); // this = Mask void SetMask ( PCMask Mask ); // this = this | Mask void RemoveMask ( PCMask Mask ); // this = this & (~Mask) void SelMask ( PCMask Mask ); // this = this & Mask void XadMask ( PCMask Mask ); // this = this ^ Mask void ClearMask (); // this = NULL void NegMask (); // this = ~this Boolean CheckMask ( PCMask Mask ); // True if the bit is on Boolean isMask (); // true if any mask bit is on pstr Print ( pstr S ); // returns binary string void write ( RCFile f ); void read ( RCFile f ); protected : int mlen; wvector m; void InitMask(); void Expand ( int n ); }; #endif mmdb-1.23.2.1/src/machine_.cpp0000644000175100017510000001070411475665501012652 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : machine_ // ~~~~~~~~~ // **** Functions : GetMachineID - returns ID code for the machine // ~~~~~~~~~~~ GetMachineName - returns name of a machine // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __Machine__ #include "machine_.h" #endif #ifdef CALL_LIKE_SUN int GetMachineID() { int k = CALL_LIKE_SUN; switch (k) { case 1 : return MACHINE_ALLIANT; case 2 : return MACHINE_CONVEX; case 3 : return MACHINE_ESV; case 4 : return MACHINE_SGI; case 5 : return MACHINE_SOLBOURNE; case 6 : return MACHINE_SOLARIS; case 7 : return MACHINE_ALPHA; case 8 : return MACHINE_F2C_G77; case 9 : return MACHINE_LINUX; default : return MACHINE_UNKNOWN; } } #elif defined(CALL_LIKE_HPUX) int GetMachineID() { int k = CALL_LIKE_HPUX; switch (k) { case 1 : return MACHINE_RS6000; case 2 : return MACHINE_HP9000; default : return MACHINE_UNKNOWN; } } #elif defined(CALL_LIKE_STARDENT) int GetMachineID() { int k = CALL_LIKE_STARDENT; switch (k) { case 1 : return MACHINE_ARDENT; case 2 : return MACHINE_TITAN; case 3 : return MACHINE_STARDENT; default : return MACHINE_UNKNOWN; } } #elif defined(CALL_LIKE_VMS) int GetMachineID() { return MACHINE_VMS; } #elif defined(CALL_LIKE_MVS) int GetMachineID() { return MACHINE_MVS; } #else int GetMachineID() { return MACHINE_UNKNOWN; } #endif static cpstr MCH_SGI = cpstr("Silicon Graphics"); static cpstr MCH_RS6000 = cpstr("IBM RS/6000"); static cpstr MCH_ALLIANT = cpstr("Alliant"); static cpstr MCH_ARDENT = cpstr("Ardent"); static cpstr MCH_TITAN = cpstr("Titan"); static cpstr MCH_STARDENT = cpstr("Stardent"); static cpstr MCH_CONVEX = cpstr("Convex"); static cpstr MCH_ESV = cpstr("Evans or Sutherland"); static cpstr MCH_HP9000 = cpstr("Hewlett Packard 9000"); static cpstr MCH_SOLBOURNE = cpstr("Solbourne"); static cpstr MCH_SOLARIS = cpstr("Solaris"); static cpstr MCH_ALPHA = cpstr("DEC Alpha"); static cpstr MCH_VMS = cpstr("A VMS machine"); static cpstr MCH_MVS = cpstr("MS Windows"); static cpstr MCH_F2C_G77 = cpstr("SUN compatible"); static cpstr MCH_LINUX = cpstr("Linux"); cpstr GetMachineName ( int MachineID ) { switch (MachineID) { case MACHINE_SGI : return MCH_SGI; case MACHINE_RS6000 : return MCH_RS6000; case MACHINE_ALLIANT : return MCH_ALLIANT; case MACHINE_ARDENT : return MCH_ARDENT; case MACHINE_TITAN : return MCH_TITAN; case MACHINE_STARDENT : return MCH_STARDENT; case MACHINE_CONVEX : return MCH_CONVEX; case MACHINE_ESV : return MCH_ESV; case MACHINE_HP9000 : return MCH_HP9000; case MACHINE_SOLBOURNE : return MCH_SOLBOURNE; case MACHINE_SOLARIS : return MCH_SOLARIS; case MACHINE_ALPHA : return MCH_ALPHA; case MACHINE_VMS : return MCH_VMS; case MACHINE_MVS : return MCH_MVS; case MACHINE_F2C_G77 : return MCH_F2C_G77; case MACHINE_LINUX : return MCH_LINUX; default : case MACHINE_UNKNOWN : return pstr("Unidentified machine"); } } cpstr GetMachineName() { return GetMachineName ( GetMachineID() ); } mmdb-1.23.2.1/src/Makefile.in0000644000175100017510000015622211476200304012441 00000000000000# 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 DIST_COMMON = $(library_include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/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)$(library_includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libmmdb_la_LIBADD = am_libmmdb_la_OBJECTS = libmmdb_la-bfgs_min.lo \ libmmdb_la-mmdb_bondmngr.lo libmmdb_la-mmdb_manager.lo \ libmmdb_la-mmdb_symop.lo libmmdb_la-file_.lo \ libmmdb_la-mmdb_chain.lo libmmdb_la-mmdb_mask.lo \ libmmdb_la-mmdb_tables.lo libmmdb_la-linalg_.lo \ libmmdb_la-mmdb_cifdefs.lo libmmdb_la-mmdb_mmcif.lo \ libmmdb_la-mmdb_title.lo libmmdb_la-machine_.lo \ libmmdb_la-mmdb_coormngr.lo libmmdb_la-mmdb_model.lo \ libmmdb_la-mmdb_uddata.lo libmmdb_la-math_.lo \ libmmdb_la-mmdb_cryst.lo libmmdb_la-mmdb_rwbrook.lo \ libmmdb_la-mmdb_utils.lo libmmdb_la-mattype_.lo \ libmmdb_la-mmdb_ficif.lo libmmdb_la-mmdb_sbase0.lo \ libmmdb_la-mmdb_xml.lo libmmdb_la-mmdb_align.lo \ libmmdb_la-mmdb_file.lo libmmdb_la-mmdb_sbase.lo \ libmmdb_la-random_n.lo libmmdb_la-mmdb_atom.lo \ libmmdb_la-mmdb_graph.lo libmmdb_la-mmdb_selmngr.lo \ libmmdb_la-stream_.lo libmmdb_la-hybrid_36.lo libmmdb_la_OBJECTS = $(am_libmmdb_la_OBJECTS) libmmdb_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libmmdb_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 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 $@ SOURCES = $(libmmdb_la_SOURCES) DIST_SOURCES = $(libmmdb_la_SOURCES) HEADERS = $(library_include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ 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@ MMDB_LT_VERSION = @MMDB_LT_VERSION@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ 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@ AUTOMAKE_OPTIONS = foreign lib_LTLIBRARIES = libmmdb.la # Use library_includedir with library_include_HEADERS to put the headers in the # directory $(library_includedir) [Not well documented]. library_includedir = $(includedir)/mmdb library_include_HEADERS = \ bfgs_min.h mmdb_atom.h mmdb_ficif.h mmdb_rwbrook.h mmdb_uddata.h \ file_.h mmdb_bondmngr.h mmdb_file.h mmdb_sbase0.h mmdb_utils.h \ linalg_.h mmdb_chain.h mmdb_graph.h mmdb_sbase.h mmdb_xml.h \ machine_.h mmdb_cifdefs.h mmdb_manager.h mmdb_selmngr.h random_n.h \ math_.h mmdb_coormngr.h mmdb_mask.h mmdb_symop.h stream_.h \ mattype_.h mmdb_cryst.h mmdb_mmcif.h mmdb_tables.h \ mmdb_align.h mmdb_defs.h mmdb_model.h mmdb_title.h hybrid_36.h libmmdb_la_CPPFLAGS = -Wall libmmdb_la_LDFLAGS = -version-info @MMDB_LT_VERSION@ libmmdb_la_SOURCES = \ bfgs_min.cpp mmdb_bondmngr.cpp mmdb_manager.cpp mmdb_symop.cpp \ file_.cpp mmdb_chain.cpp mmdb_mask.cpp mmdb_tables.cpp \ linalg_.cpp mmdb_cifdefs.cpp mmdb_mmcif.cpp mmdb_title.cpp \ machine_.cpp mmdb_coormngr.cpp mmdb_model.cpp mmdb_uddata.cpp \ math_.cpp mmdb_cryst.cpp mmdb_rwbrook.cpp mmdb_utils.cpp \ mattype_.cpp mmdb_ficif.cpp mmdb_sbase0.cpp mmdb_xml.cpp \ mmdb_align.cpp mmdb_file.cpp mmdb_sbase.cpp random_n.cpp \ mmdb_atom.cpp mmdb_graph.cpp mmdb_selmngr.cpp stream_.cpp \ hybrid_36.cpp 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) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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): 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 libmmdb.la: $(libmmdb_la_OBJECTS) $(libmmdb_la_DEPENDENCIES) $(libmmdb_la_LINK) -rpath $(libdir) $(libmmdb_la_OBJECTS) $(libmmdb_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-bfgs_min.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-file_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-hybrid_36.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-linalg_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-machine_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-math_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mattype_.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_align.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_atom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_bondmngr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_chain.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_cifdefs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_coormngr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_cryst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_ficif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_graph.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_manager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_mask.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_mmcif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_model.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_rwbrook.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_sbase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_sbase0.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_selmngr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_symop.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_tables.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_title.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_uddata.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-mmdb_xml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-random_n.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmmdb_la-stream_.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 $@ $< libmmdb_la-bfgs_min.lo: bfgs_min.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-bfgs_min.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-bfgs_min.Tpo -c -o libmmdb_la-bfgs_min.lo `test -f 'bfgs_min.cpp' || echo '$(srcdir)/'`bfgs_min.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-bfgs_min.Tpo $(DEPDIR)/libmmdb_la-bfgs_min.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bfgs_min.cpp' object='libmmdb_la-bfgs_min.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-bfgs_min.lo `test -f 'bfgs_min.cpp' || echo '$(srcdir)/'`bfgs_min.cpp libmmdb_la-mmdb_bondmngr.lo: mmdb_bondmngr.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_bondmngr.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_bondmngr.Tpo -c -o libmmdb_la-mmdb_bondmngr.lo `test -f 'mmdb_bondmngr.cpp' || echo '$(srcdir)/'`mmdb_bondmngr.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_bondmngr.Tpo $(DEPDIR)/libmmdb_la-mmdb_bondmngr.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_bondmngr.cpp' object='libmmdb_la-mmdb_bondmngr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_bondmngr.lo `test -f 'mmdb_bondmngr.cpp' || echo '$(srcdir)/'`mmdb_bondmngr.cpp libmmdb_la-mmdb_manager.lo: mmdb_manager.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_manager.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_manager.Tpo -c -o libmmdb_la-mmdb_manager.lo `test -f 'mmdb_manager.cpp' || echo '$(srcdir)/'`mmdb_manager.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_manager.Tpo $(DEPDIR)/libmmdb_la-mmdb_manager.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_manager.cpp' object='libmmdb_la-mmdb_manager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_manager.lo `test -f 'mmdb_manager.cpp' || echo '$(srcdir)/'`mmdb_manager.cpp libmmdb_la-mmdb_symop.lo: mmdb_symop.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_symop.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_symop.Tpo -c -o libmmdb_la-mmdb_symop.lo `test -f 'mmdb_symop.cpp' || echo '$(srcdir)/'`mmdb_symop.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_symop.Tpo $(DEPDIR)/libmmdb_la-mmdb_symop.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_symop.cpp' object='libmmdb_la-mmdb_symop.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_symop.lo `test -f 'mmdb_symop.cpp' || echo '$(srcdir)/'`mmdb_symop.cpp libmmdb_la-file_.lo: file_.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-file_.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-file_.Tpo -c -o libmmdb_la-file_.lo `test -f 'file_.cpp' || echo '$(srcdir)/'`file_.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-file_.Tpo $(DEPDIR)/libmmdb_la-file_.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='file_.cpp' object='libmmdb_la-file_.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-file_.lo `test -f 'file_.cpp' || echo '$(srcdir)/'`file_.cpp libmmdb_la-mmdb_chain.lo: mmdb_chain.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_chain.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_chain.Tpo -c -o libmmdb_la-mmdb_chain.lo `test -f 'mmdb_chain.cpp' || echo '$(srcdir)/'`mmdb_chain.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_chain.Tpo $(DEPDIR)/libmmdb_la-mmdb_chain.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_chain.cpp' object='libmmdb_la-mmdb_chain.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_chain.lo `test -f 'mmdb_chain.cpp' || echo '$(srcdir)/'`mmdb_chain.cpp libmmdb_la-mmdb_mask.lo: mmdb_mask.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_mask.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_mask.Tpo -c -o libmmdb_la-mmdb_mask.lo `test -f 'mmdb_mask.cpp' || echo '$(srcdir)/'`mmdb_mask.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_mask.Tpo $(DEPDIR)/libmmdb_la-mmdb_mask.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_mask.cpp' object='libmmdb_la-mmdb_mask.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_mask.lo `test -f 'mmdb_mask.cpp' || echo '$(srcdir)/'`mmdb_mask.cpp libmmdb_la-mmdb_tables.lo: mmdb_tables.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_tables.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_tables.Tpo -c -o libmmdb_la-mmdb_tables.lo `test -f 'mmdb_tables.cpp' || echo '$(srcdir)/'`mmdb_tables.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_tables.Tpo $(DEPDIR)/libmmdb_la-mmdb_tables.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_tables.cpp' object='libmmdb_la-mmdb_tables.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_tables.lo `test -f 'mmdb_tables.cpp' || echo '$(srcdir)/'`mmdb_tables.cpp libmmdb_la-linalg_.lo: linalg_.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-linalg_.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-linalg_.Tpo -c -o libmmdb_la-linalg_.lo `test -f 'linalg_.cpp' || echo '$(srcdir)/'`linalg_.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-linalg_.Tpo $(DEPDIR)/libmmdb_la-linalg_.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='linalg_.cpp' object='libmmdb_la-linalg_.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-linalg_.lo `test -f 'linalg_.cpp' || echo '$(srcdir)/'`linalg_.cpp libmmdb_la-mmdb_cifdefs.lo: mmdb_cifdefs.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_cifdefs.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_cifdefs.Tpo -c -o libmmdb_la-mmdb_cifdefs.lo `test -f 'mmdb_cifdefs.cpp' || echo '$(srcdir)/'`mmdb_cifdefs.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_cifdefs.Tpo $(DEPDIR)/libmmdb_la-mmdb_cifdefs.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_cifdefs.cpp' object='libmmdb_la-mmdb_cifdefs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_cifdefs.lo `test -f 'mmdb_cifdefs.cpp' || echo '$(srcdir)/'`mmdb_cifdefs.cpp libmmdb_la-mmdb_mmcif.lo: mmdb_mmcif.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_mmcif.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_mmcif.Tpo -c -o libmmdb_la-mmdb_mmcif.lo `test -f 'mmdb_mmcif.cpp' || echo '$(srcdir)/'`mmdb_mmcif.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_mmcif.Tpo $(DEPDIR)/libmmdb_la-mmdb_mmcif.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_mmcif.cpp' object='libmmdb_la-mmdb_mmcif.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_mmcif.lo `test -f 'mmdb_mmcif.cpp' || echo '$(srcdir)/'`mmdb_mmcif.cpp libmmdb_la-mmdb_title.lo: mmdb_title.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_title.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_title.Tpo -c -o libmmdb_la-mmdb_title.lo `test -f 'mmdb_title.cpp' || echo '$(srcdir)/'`mmdb_title.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_title.Tpo $(DEPDIR)/libmmdb_la-mmdb_title.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_title.cpp' object='libmmdb_la-mmdb_title.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_title.lo `test -f 'mmdb_title.cpp' || echo '$(srcdir)/'`mmdb_title.cpp libmmdb_la-machine_.lo: machine_.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-machine_.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-machine_.Tpo -c -o libmmdb_la-machine_.lo `test -f 'machine_.cpp' || echo '$(srcdir)/'`machine_.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-machine_.Tpo $(DEPDIR)/libmmdb_la-machine_.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='machine_.cpp' object='libmmdb_la-machine_.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-machine_.lo `test -f 'machine_.cpp' || echo '$(srcdir)/'`machine_.cpp libmmdb_la-mmdb_coormngr.lo: mmdb_coormngr.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_coormngr.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_coormngr.Tpo -c -o libmmdb_la-mmdb_coormngr.lo `test -f 'mmdb_coormngr.cpp' || echo '$(srcdir)/'`mmdb_coormngr.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_coormngr.Tpo $(DEPDIR)/libmmdb_la-mmdb_coormngr.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_coormngr.cpp' object='libmmdb_la-mmdb_coormngr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_coormngr.lo `test -f 'mmdb_coormngr.cpp' || echo '$(srcdir)/'`mmdb_coormngr.cpp libmmdb_la-mmdb_model.lo: mmdb_model.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_model.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_model.Tpo -c -o libmmdb_la-mmdb_model.lo `test -f 'mmdb_model.cpp' || echo '$(srcdir)/'`mmdb_model.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_model.Tpo $(DEPDIR)/libmmdb_la-mmdb_model.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_model.cpp' object='libmmdb_la-mmdb_model.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_model.lo `test -f 'mmdb_model.cpp' || echo '$(srcdir)/'`mmdb_model.cpp libmmdb_la-mmdb_uddata.lo: mmdb_uddata.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_uddata.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_uddata.Tpo -c -o libmmdb_la-mmdb_uddata.lo `test -f 'mmdb_uddata.cpp' || echo '$(srcdir)/'`mmdb_uddata.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_uddata.Tpo $(DEPDIR)/libmmdb_la-mmdb_uddata.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_uddata.cpp' object='libmmdb_la-mmdb_uddata.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_uddata.lo `test -f 'mmdb_uddata.cpp' || echo '$(srcdir)/'`mmdb_uddata.cpp libmmdb_la-math_.lo: math_.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-math_.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-math_.Tpo -c -o libmmdb_la-math_.lo `test -f 'math_.cpp' || echo '$(srcdir)/'`math_.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-math_.Tpo $(DEPDIR)/libmmdb_la-math_.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='math_.cpp' object='libmmdb_la-math_.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-math_.lo `test -f 'math_.cpp' || echo '$(srcdir)/'`math_.cpp libmmdb_la-mmdb_cryst.lo: mmdb_cryst.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_cryst.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_cryst.Tpo -c -o libmmdb_la-mmdb_cryst.lo `test -f 'mmdb_cryst.cpp' || echo '$(srcdir)/'`mmdb_cryst.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_cryst.Tpo $(DEPDIR)/libmmdb_la-mmdb_cryst.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_cryst.cpp' object='libmmdb_la-mmdb_cryst.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_cryst.lo `test -f 'mmdb_cryst.cpp' || echo '$(srcdir)/'`mmdb_cryst.cpp libmmdb_la-mmdb_rwbrook.lo: mmdb_rwbrook.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_rwbrook.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_rwbrook.Tpo -c -o libmmdb_la-mmdb_rwbrook.lo `test -f 'mmdb_rwbrook.cpp' || echo '$(srcdir)/'`mmdb_rwbrook.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_rwbrook.Tpo $(DEPDIR)/libmmdb_la-mmdb_rwbrook.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_rwbrook.cpp' object='libmmdb_la-mmdb_rwbrook.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_rwbrook.lo `test -f 'mmdb_rwbrook.cpp' || echo '$(srcdir)/'`mmdb_rwbrook.cpp libmmdb_la-mmdb_utils.lo: mmdb_utils.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_utils.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_utils.Tpo -c -o libmmdb_la-mmdb_utils.lo `test -f 'mmdb_utils.cpp' || echo '$(srcdir)/'`mmdb_utils.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_utils.Tpo $(DEPDIR)/libmmdb_la-mmdb_utils.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_utils.cpp' object='libmmdb_la-mmdb_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_utils.lo `test -f 'mmdb_utils.cpp' || echo '$(srcdir)/'`mmdb_utils.cpp libmmdb_la-mattype_.lo: mattype_.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mattype_.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mattype_.Tpo -c -o libmmdb_la-mattype_.lo `test -f 'mattype_.cpp' || echo '$(srcdir)/'`mattype_.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mattype_.Tpo $(DEPDIR)/libmmdb_la-mattype_.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mattype_.cpp' object='libmmdb_la-mattype_.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mattype_.lo `test -f 'mattype_.cpp' || echo '$(srcdir)/'`mattype_.cpp libmmdb_la-mmdb_ficif.lo: mmdb_ficif.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_ficif.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_ficif.Tpo -c -o libmmdb_la-mmdb_ficif.lo `test -f 'mmdb_ficif.cpp' || echo '$(srcdir)/'`mmdb_ficif.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_ficif.Tpo $(DEPDIR)/libmmdb_la-mmdb_ficif.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_ficif.cpp' object='libmmdb_la-mmdb_ficif.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_ficif.lo `test -f 'mmdb_ficif.cpp' || echo '$(srcdir)/'`mmdb_ficif.cpp libmmdb_la-mmdb_sbase0.lo: mmdb_sbase0.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_sbase0.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_sbase0.Tpo -c -o libmmdb_la-mmdb_sbase0.lo `test -f 'mmdb_sbase0.cpp' || echo '$(srcdir)/'`mmdb_sbase0.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_sbase0.Tpo $(DEPDIR)/libmmdb_la-mmdb_sbase0.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_sbase0.cpp' object='libmmdb_la-mmdb_sbase0.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_sbase0.lo `test -f 'mmdb_sbase0.cpp' || echo '$(srcdir)/'`mmdb_sbase0.cpp libmmdb_la-mmdb_xml.lo: mmdb_xml.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_xml.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_xml.Tpo -c -o libmmdb_la-mmdb_xml.lo `test -f 'mmdb_xml.cpp' || echo '$(srcdir)/'`mmdb_xml.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_xml.Tpo $(DEPDIR)/libmmdb_la-mmdb_xml.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_xml.cpp' object='libmmdb_la-mmdb_xml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_xml.lo `test -f 'mmdb_xml.cpp' || echo '$(srcdir)/'`mmdb_xml.cpp libmmdb_la-mmdb_align.lo: mmdb_align.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_align.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_align.Tpo -c -o libmmdb_la-mmdb_align.lo `test -f 'mmdb_align.cpp' || echo '$(srcdir)/'`mmdb_align.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_align.Tpo $(DEPDIR)/libmmdb_la-mmdb_align.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_align.cpp' object='libmmdb_la-mmdb_align.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_align.lo `test -f 'mmdb_align.cpp' || echo '$(srcdir)/'`mmdb_align.cpp libmmdb_la-mmdb_file.lo: mmdb_file.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_file.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_file.Tpo -c -o libmmdb_la-mmdb_file.lo `test -f 'mmdb_file.cpp' || echo '$(srcdir)/'`mmdb_file.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_file.Tpo $(DEPDIR)/libmmdb_la-mmdb_file.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_file.cpp' object='libmmdb_la-mmdb_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_file.lo `test -f 'mmdb_file.cpp' || echo '$(srcdir)/'`mmdb_file.cpp libmmdb_la-mmdb_sbase.lo: mmdb_sbase.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_sbase.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_sbase.Tpo -c -o libmmdb_la-mmdb_sbase.lo `test -f 'mmdb_sbase.cpp' || echo '$(srcdir)/'`mmdb_sbase.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_sbase.Tpo $(DEPDIR)/libmmdb_la-mmdb_sbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_sbase.cpp' object='libmmdb_la-mmdb_sbase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_sbase.lo `test -f 'mmdb_sbase.cpp' || echo '$(srcdir)/'`mmdb_sbase.cpp libmmdb_la-random_n.lo: random_n.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-random_n.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-random_n.Tpo -c -o libmmdb_la-random_n.lo `test -f 'random_n.cpp' || echo '$(srcdir)/'`random_n.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-random_n.Tpo $(DEPDIR)/libmmdb_la-random_n.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='random_n.cpp' object='libmmdb_la-random_n.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-random_n.lo `test -f 'random_n.cpp' || echo '$(srcdir)/'`random_n.cpp libmmdb_la-mmdb_atom.lo: mmdb_atom.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_atom.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_atom.Tpo -c -o libmmdb_la-mmdb_atom.lo `test -f 'mmdb_atom.cpp' || echo '$(srcdir)/'`mmdb_atom.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_atom.Tpo $(DEPDIR)/libmmdb_la-mmdb_atom.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_atom.cpp' object='libmmdb_la-mmdb_atom.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_atom.lo `test -f 'mmdb_atom.cpp' || echo '$(srcdir)/'`mmdb_atom.cpp libmmdb_la-mmdb_graph.lo: mmdb_graph.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_graph.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_graph.Tpo -c -o libmmdb_la-mmdb_graph.lo `test -f 'mmdb_graph.cpp' || echo '$(srcdir)/'`mmdb_graph.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_graph.Tpo $(DEPDIR)/libmmdb_la-mmdb_graph.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_graph.cpp' object='libmmdb_la-mmdb_graph.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_graph.lo `test -f 'mmdb_graph.cpp' || echo '$(srcdir)/'`mmdb_graph.cpp libmmdb_la-mmdb_selmngr.lo: mmdb_selmngr.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-mmdb_selmngr.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-mmdb_selmngr.Tpo -c -o libmmdb_la-mmdb_selmngr.lo `test -f 'mmdb_selmngr.cpp' || echo '$(srcdir)/'`mmdb_selmngr.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-mmdb_selmngr.Tpo $(DEPDIR)/libmmdb_la-mmdb_selmngr.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='mmdb_selmngr.cpp' object='libmmdb_la-mmdb_selmngr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-mmdb_selmngr.lo `test -f 'mmdb_selmngr.cpp' || echo '$(srcdir)/'`mmdb_selmngr.cpp libmmdb_la-stream_.lo: stream_.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-stream_.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-stream_.Tpo -c -o libmmdb_la-stream_.lo `test -f 'stream_.cpp' || echo '$(srcdir)/'`stream_.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-stream_.Tpo $(DEPDIR)/libmmdb_la-stream_.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='stream_.cpp' object='libmmdb_la-stream_.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-stream_.lo `test -f 'stream_.cpp' || echo '$(srcdir)/'`stream_.cpp libmmdb_la-hybrid_36.lo: hybrid_36.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libmmdb_la-hybrid_36.lo -MD -MP -MF $(DEPDIR)/libmmdb_la-hybrid_36.Tpo -c -o libmmdb_la-hybrid_36.lo `test -f 'hybrid_36.cpp' || echo '$(srcdir)/'`hybrid_36.cpp @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/libmmdb_la-hybrid_36.Tpo $(DEPDIR)/libmmdb_la-hybrid_36.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='hybrid_36.cpp' object='libmmdb_la-hybrid_36.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmmdb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libmmdb_la-hybrid_36.lo `test -f 'hybrid_36.cpp' || echo '$(srcdir)/'`hybrid_36.cpp 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)$(libdir)" "$(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-libLTLIBRARIES clean-libtool \ 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-libLTLIBRARIES 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-libLTLIBRARIES \ uninstall-library_includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool 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-libLTLIBRARIES 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-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: mmdb-1.23.2.1/src/mmdb_utils.cpp0000644000175100017510000014525211476176165013261 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Utils // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Classes : CContainerClass ( containered class template ) // ~~~~~~~~~ CContString ( containered string ) // CClassContainer ( container of classes ) // CAtomPath ( atom path ID ) // CQuickSort ( quick sort of integers ) // // **** Functions : Date9to11 ( DD-MMM-YY -> DD-MMM-YYYY ) // ~~~~~~~~~~~ Date11to9 ( DD-MMM-YYYY -> DD-MMM-YY ) // Date9toCIF ( DD-MMM-YY -> YYYY-MM-DD ) // Date11toCIF( DD-MMM-YYYY -> YYYY-MM-DD ) // DateCIFto9 ( YYYY-MM-DD -> DD-MMM-YY ) // DateCIFto11( YYYY-MM-DD -> DD-MMM-YYYY ) // GetInteger ( reads integer from a string ) // GetReal ( reads real from a string ) // GetIntIns ( reads integer and insert code ) // PutInteger ( writes integer into a string ) // PutRealF ( writes real in F-foram into a string) // PutIntIns ( writes integer and insert code ) // CIFGetInteger ( reads and deletes int from CIF ) // CIFGetReal ( reads and deletes real from CIF ) // CIFGetString (reads and deletes string from CIF) // CIFGetInteger1 (reads and del-s int from CIF loop) // CIFGetReal1 (reads and del-s int from CIF loop) // Mat4Inverse ( inversion of 4x4 matrices ) // GetErrorDescription (ascii line to an Error_XXXXX) // ParseAtomID ( parses atom ID line ) // ParseResID ( parses residue ID line ) // ParseAtomPath ( parses full atom path ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __MATH_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MMDB_Utils__ #include "mmdb_utils.h" #endif #ifndef IOTBX_PDB_HYBRID_36_C_H #include "hybrid_36.h" #endif // ====================== Date functions ======================= static cpstr Month[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; static cpstr nMonth[12] = { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" }; void Date9to11 ( cpstr Date9, pstr Date11 ) { // converts DD-MMM-YY to DD-MMM-YYYY int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date9[3]),3))) i++; if (i<12) { // DD-MMM-YY -> DD-MMM-YYYY strncpy ( Date11,Date9,7 ); if (Date9[7]!='0') strncpy ( &(Date11[7]),"19",2 ); else strncpy ( &(Date11[7]),"20",2 ); strncpy ( &(Date11[9]),&(Date9[7]),2 ); } else { // DD-MM-YY -> DD-MMM-YYYY strncpy ( Date11,Date9,3 ); i = 0; while ((i<12) && (strncmp(nMonth[i],&(Date9[3]),2))) i++; if (i<12) strncpy ( &(Date11[3]),Month[i],3 ); else { strncpy ( &(Date11[3]),&(Date9[3]),2 ); Date11[5] = 'X'; } if (Date9[6]!='0') strncpy ( &(Date11[7]),"19",2 ); else strncpy ( &(Date11[7]),"20",2 ); strncpy ( &(Date11[9]),&(Date9[6]),2 ); } Date11[2] = '-'; Date11[6] = '-'; Date11[11] = char(0); } void Date11to9 ( cpstr Date11, pstr Date9 ) { // converts DD-MMM-YYYY to DD-MMM-YY int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date11[3]),3))) i++; if (i<12) { // DD-MMM-YYYY -> DD-MMM-YY strncpy ( Date9,Date11,7 ); strncpy ( &(Date9[7]),&(Date11[9]),2 ); } else { // DD-MM-YYYY -> DD-MMM-YY strncpy ( Date9,Date11,3 ); i = 0; while ((i<12) && (strncmp(nMonth[i],&(Date11[3]),2))) i++; if (i<12) strncpy ( &(Date9[3]),Month[i],3 ); else { strncpy ( &(Date9[3]),&(Date11[3]),2 ); Date9[5] = 'X'; } strncpy ( &(Date9[7]),&(Date11[8]),2 ); } Date9[2] = '-'; Date9[6] = '-'; } void Date9toCIF ( cpstr Date9, pstr DateCIF ) { // DD-MMM-YY -> YYYY-MM-DD ) int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date9[3]),3))) i++; if (i<12) { // DD-MMM-YY -> YYYY-MM-DD if (Date9[7]!='0') strcpy ( DateCIF,"19" ); else strcpy ( DateCIF,"20" ); strncpy ( &(DateCIF[2]),&(Date9[7]),2 ); strncpy ( &(DateCIF[5]),nMonth[i],2 ); } else { // DD-MM-YY -> YYYY-MM-DD if (Date9[6]!='0') strcpy ( DateCIF,"19" ); else strcpy ( DateCIF,"20" ); strncpy ( &(DateCIF[2]),&(Date9[6]),2 ); strncpy ( &(DateCIF[5]),&(Date9[3]),2 ); } DateCIF[4] = '-'; DateCIF[7] = '-'; strncpy ( &(DateCIF[8]),Date9,2 ); DateCIF[10] = char(0); } void Date11toCIF ( cpstr Date11, pstr DateCIF ) { // DD-MMM-YYYY -> YYYY-MM-DD int i; i = 0; while ((i<12) && (strncmp(Month[i],&(Date11[3]),3))) i++; if (i<12) { strncpy ( DateCIF,&(Date11[7]),4 ); strncpy ( &(DateCIF[5]),nMonth[i],2 ); } else { strncpy ( DateCIF,&(Date11[6]),4 ); strncpy ( &(DateCIF[5]),&(Date11[3]),2 ); } DateCIF[4] = '-'; DateCIF[7] = '-'; strncpy ( &(DateCIF[8]),Date11,2 ); DateCIF[10] = char(0); } void DateCIFto9 ( cpstr DateCIF, pstr Date9 ) { // YYYY-MM-DD -> DD-MMM-YY int i; strncpy ( Date9,&(DateCIF[8]),2 ); Date9[2] = '-'; i = 0; while ((i<12) && (strncmp(nMonth[i],&(DateCIF[5]),2))) i++; if (i<12) strncpy ( &(Date9[3]),Month[i],3 ); else { strncpy ( &(Date9[3]),&(DateCIF[5]),2 ); Date9[5] = 'X'; } Date9[6] = '-'; strncpy ( &(Date9[7]),&(DateCIF[2]),2 ); // DateCIF[9] = char(0); } void DateCIFto11 ( cpstr DateCIF, pstr Date11 ) { // YYYY-MM-DD -> DD-MMM-YYYY int i; strncpy ( Date11,&(DateCIF[8]),2 ); Date11[2] = '-'; i = 0; while ((i<12) && (strncmp(nMonth[i],&(DateCIF[5]),2))) i++; if (i<12) strncpy ( &(Date11[3]),Month[i],3 ); else { strncpy ( &(Date11[3]),&(DateCIF[5]),2 ); Date11[5] = 'X'; } Date11[6] = '-'; strncpy ( &(Date11[7]),DateCIF,4 ); // DateCIF[11] = char(0); } // =============== Format functions =================== Boolean GetInteger ( int & N, cpstr S, int M ) { // Returns True if S contains an integer number in its // first M characters. This number is returned in N. // The return is False if no integer number may be // recognized. In this case, N is assigned MinInt4 value. pstr endptr; char L[50]; strncpy ( L,S,M ); L[M] = char(0); N = mround(strtod(L,&endptr)); if ((N==0) && (endptr==L)) { N = MinInt4; // no number return False; } else return True; } Boolean GetReal ( realtype & R, cpstr S, int M ) { // Returns True if S contains a real number in its // first M characters. This number is returned in R. // The return is False if no real number may be // recognized. In this case, R is assigned -MaxReal value. pstr endptr; char L[50]; strncpy ( L,S,M ); L[M] = char(0); R = strtod(L,&endptr); if ((R==0.0) && (endptr==L)) { R = -MaxReal; // no number return False; } else return True; } Boolean GetIntIns ( int & N, pstr ins, cpstr S, int M ) { // Returns True if S contains an integer number in its // first M characters. This number is returned in N. In addition // to that, GetIntIns() retrieves the insertion code which may // follow the integer and returns it in "ins" (1 character + // terminating 0). // The return is False if no integer number may be // recognized. In this case, N is assigned MinInt4 value, // "ins" just returns (M+1)th symbol of S (+terminating 0). pstr endptr; char L[50]; if (S[M]!=' ') { ins[0] = S[M]; ins[1] = char(0); } else ins[0] = char(0); strncpy ( L,S,M ); L[M] = char(0); if ((M==4) && ((S[0]>='A') || ((S[0]=='-') && (S[1]>='A')))) hy36decode ( M,L,M,&N); else { endptr = NULL; N = mround(strtod(L,&endptr)); if ((N==0) && (endptr==L)) { N = MinInt4; // no number return False; } } return True; } void PutInteger ( pstr S, int N, int M ) { // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. // If N is set to MinInt4, then first M characters of // string S are set to the space character. int i; char L[50]; if (N==MinInt4) for (i=0;iGetInteger ( I,Tag,Signal,True ); if (RC==CIFRC_WrongFormat) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_UnrecognizedInteger-1; return Error_UnrecognizedInteger; } if (RC==CIFRC_WrongIndex) { Signal = -1; return Error_NoData; } if (RC) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_NoData-1; return Error_NoData; } return 0; } int CIFGetInteger1 ( int & I, PCMMCIFLoop Loop, cpstr Tag, int nrow ) { int RC; pstr F; RC = Loop->GetInteger ( I,Tag,nrow,True ); if (RC==CIFRC_WrongFormat) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_UnrecognizedInteger; } if (RC==CIFRC_WrongIndex) return Error_NoData; if (RC) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_NoData; } return 0; } int CIFGetReal ( realtype & R, PCMMCIFLoop Loop, cpstr Tag, int & Signal ) { int RC; pstr F; RC = Loop->GetReal ( R,Tag,Signal,True ); if (RC==CIFRC_WrongFormat) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_UnrecognizedReal-1; return Error_UnrecognizedReal; } if (RC==CIFRC_WrongIndex) { Signal = -1; return Error_NoData; } if (RC) { F = Loop->GetString ( Tag,Signal,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,Signal,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,Signal ); Signal = -Error_NoData-1; return Error_NoData; } return 0; } int CIFGetReal1 ( realtype & R, PCMMCIFLoop Loop, cpstr Tag, int nrow ) { int RC; pstr F; RC = Loop->GetReal ( R,Tag,nrow,True ); if (RC==CIFRC_WrongFormat) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_UnrecognizedReal; } if (RC==CIFRC_WrongIndex) return Error_NoData; if (RC) { F = Loop->GetString ( Tag,nrow,RC ); if (F) sprintf ( CIFErrorLocation,"loop %s.%s row %i data %s", Loop->GetCategoryName(),Tag,nrow,F ); else sprintf ( CIFErrorLocation,"loop %s.%s row %i data [NULL]", Loop->GetCategoryName(),Tag,nrow ); return Error_NoData; } return 0; } int CIFGetString ( pstr S, PCMMCIFLoop Loop, cpstr Tag, int row, int SLen, cpstr DefS ) { int RC; pstr F; F = Loop->GetString ( Tag,row,RC ); if ((!RC) && F) { strncpy ( S,F,SLen-1 ); Loop->DeleteField ( Tag,row ); return 0; } else { strcpy ( S,DefS ); return 1; } } int CIFGetInteger ( int & I, PCMMCIFStruct Struct, cpstr Tag, Boolean Remove ) { int RC; pstr F; RC = Struct->GetInteger ( I,Tag,Remove ); if (RC==CIFRC_WrongFormat) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_UnrecognizedInteger; } if (RC) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_NoData; } return 0; } int CIFGetReal ( realtype & R, PCMMCIFStruct Struct, cpstr Tag, Boolean Remove ) { int RC; pstr F; RC = Struct->GetReal ( R,Tag,Remove ); if (RC==CIFRC_WrongFormat) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_UnrecognizedReal; } if (RC) { F = Struct->GetString ( Tag,RC ); if (F) sprintf ( CIFErrorLocation,"structure %s.%s data %s", Struct->GetCategoryName(),Tag,F ); else sprintf ( CIFErrorLocation,"structure %s.%s data [NULL]", Struct->GetCategoryName(),Tag ); return Error_NoData; } return 0; } int CIFGetString ( pstr S, PCMMCIFStruct Struct, cpstr Tag, int SLen, cpstr DefS, Boolean Remove ) { int RC; pstr F; F = Struct->GetString ( Tag,RC ); if ((!RC) && F) { strcpy_n0 ( S,F,SLen-1 ); if (Remove) Struct->DeleteField ( Tag ); return 0; } else { strcpy ( S,DefS ); return 1; } } void PutIntIns ( pstr S, int N, int M, cpstr ins ) { // Integer N is converted into ASCII string of length M // and pasted onto first M characters of string S. No // terminating zero is added. The insert code ins is put // immediately after the integer. // If N is set to MinInt4, then first M+1 characters of // string S are set to space, and no insert code are // appended. int i; char L[50]; if (N==MinInt4) { for (i=0;i<=M;i++) S[i] = ' '; } else { if ((M!=4) || ((N>=-999) && (N<=9999))) sprintf ( L,"%*i",M,N ); else hy36encode ( M,N,L ); strcpy_n1 ( S,L,M ); if (ins[0]) S[M] = ins[0]; } } void Mat4Inverse ( mat44 & A, mat44 & AI ) { // *** FORMER RBRINV(A,AI) *** // Function to invert 4*4 matrices (AI=A^{-1}) mat44 c; mat33 x; realtype s,s1; int ii,jj,i,i1,j,j1; // ---- Get cofactors of 'a' in array 'c' s1 = 1.0; for (ii=0;ii<4;ii++) { s = s1; for (jj=0;jj<4;jj++) { i = -1; for (i1=0;i1<4;i1++) if (i1!=ii) { i++; j = -1; for (j1=0;j1<4;j1++) if (j1!=jj) { j++; x[i][j] = A[i1][j1]; } } c[ii][jj] = s*(x[0][0]*(x[1][1]*x[2][2]-x[1][2]*x[2][1]) + x[0][1]*(x[1][2]*x[2][0]-x[1][0]*x[2][2]) + x[0][2]*(x[1][0]*x[2][1]-x[1][1]*x[2][0])); s = -s; } s1 = -s1; } // ---- Calculate determinant s = 0.0; for (i=0;i<4;i++) s += A[i][0]*c[i][0]; // ---- Get inverse matrix if (s!=0.0) for (i=0;i<4;i++) for (j=0;j<4;j++) AI[i][j] = c[j][i]/s; } realtype Mat3Inverse ( mat33 & A, mat33 & AI ) { mat33 c,x; realtype s; int ii,jj,i,i1,j,j1; // Get cofactors of 'a' in array 'c' s = 1.0; for (ii=0;ii<3;ii++) for (jj=0;jj<3;jj++) { i = -1; for (i1=0;i1<3;i1++) if (i1!=ii) { i++; j = -1; for (j1=0;j1<3;j1++) if (j1!=jj) { j++; x[i][j] = A[i1][j1]; } } c[ii][jj] = s*(x[0][0]*x[1][1]-x[0][1]*x[1][0]); s = -s; } // Calculate determinant s = 0.0; for (i=0;i<3;i++) s += A[i][0]*c[i][0]; // Get inverse matrix if (s!=0.0) for (i=0;i<3;i++) for (j=0;j<3;j++) AI[i][j] = c[j][i]/s; return s; } void Mat4Mult ( mat44 & A, mat44 & B, mat44 & C ) { // Calculates A=B*C int i,j,k; for (i=0;i<4;i++) for (j=0;j<4;j++) { A[i][j] = 0.0; for (k=0;k<4;k++) A[i][j] += B[i][k]*C[k][j]; } } void Mat4Div1 ( mat44 & A, mat44 & B, mat44 & C ) { // Calculates A=B^{-1}*C mat44 B1; int i,j,k; B1[0][0] = 1.0; // in order to supress warnings from some // stupid compilers Mat4Inverse ( B,B1 ); for (i=0;i<4;i++) for (j=0;j<4;j++) { A[i][j] = 0.0; for (k=0;k<4;k++) A[i][j] += B1[i][k]*C[k][j]; } } void Mat4Div2 ( mat44 & A, mat44 & B, mat44 & C ) { // Calculates A=B*C^{-1} mat44 C1; int i,j,k; C1[0][0] = 1.0; // in order to supress warnings from some // stupid compilers Mat4Inverse ( C,C1 ); for (i=0;i<4;i++) for (j=0;j<4;j++) { A[i][j] = 0.0; for (k=0;k<4;k++) A[i][j] += B[i][k]*C1[k][j]; } } void Mat4Init ( mat44 & A ) { int i,j; for (i=0;i<4;i++) { for (j=0;j<4;j++) A[i][j] = 0.0; A[i][i] = 1.0; } } realtype Mat4RotDet ( mat44 & T ) { // returns determinant of the rotation part return T[0][0]*T[1][1]*T[2][2] + T[0][1]*T[1][2]*T[2][0] + T[1][0]*T[2][1]*T[0][2] - T[0][2]*T[1][1]*T[2][0] - T[0][0]*T[1][2]*T[2][1] - T[2][2]*T[0][1]*T[1][0]; } Boolean isMat4Unit ( mat44 & A, realtype eps, Boolean rotOnly ) { // returns True if A is a unit 4x4 matrix int i,j,k; Boolean B; if (rotOnly) k = 3; else k = 4; B = True; for (i=0;(iContinuationNo>1); } // =================== CContString ===================== CContString::CContString() : CContainerClass() { InitString(); } CContString::CContString ( cpstr S ) : CContainerClass() { InitString(); ConvertPDBASCII ( S ); } CContString::CContString ( RPCStream Object ) : CContainerClass(Object) { InitString(); } CContString::~CContString() { if (Line) delete[] Line; if (CIFCategory) delete[] CIFCategory; if (CIFTag) delete[] CIFTag; } void CContString::InitString() { Line = NULL; CIFCategory = NULL; CIFTag = NULL; } int CContString::ConvertPDBASCII ( cpstr S ) { CreateCopy ( Line,S ); return 0; } void CContString::PDBASCIIDump ( pstr S, int ) { if (Line) strcpy ( S,Line ); else strcpy ( S,"" ); } Boolean CContString::PDBASCIIDump1 ( RCFile f ) { if (Line) f.WriteLine ( Line ); else f.LF(); return True; } void CContString::GetCIF ( PCMMCIFData CIF, int & Signal ) { pstr F; int i,RC; char c; if ((!CIFCategory) || (!CIFTag)) { Signal = -1; return; } F = CIF->GetString ( CIFCategory,CIFTag,RC ); if (RC || (!F)) { Signal = -1; return; } if (Signal>=(int)strlen(F)) { CIF->DeleteField ( CIFCategory,CIFTag ); Signal = -1; return; } i = Signal; while (F[i] && (F[i]!='\n') && (F[i]!='\r')) i++; if ((Signal==0) && (i==0)) { i++; if (((F[Signal]=='\n') && (F[i]=='\r')) || ((F[Signal]=='\r') && (F[i]=='\n'))) i++; Signal = i; while (F[i] && (F[i]!='\n') && (F[i]!='\r')) i++; } c = F[i]; F[i] = char(0); CreateCopy ( Line,&(F[Signal]) ); if (c) { F[i] = c; Signal = i+1; if (((c=='\n') && (F[Signal]=='\r')) || ((c=='\r') && (F[Signal]=='\n'))) Signal++; } else CIF->DeleteField ( CIFCategory,CIFTag ); } void CContString::MakeCIF ( PCMMCIFData CIF, int N ) { pstr S; if ((!CIFCategory) || (!CIFTag)) return; S = new char[strlen(Line)+5]; strcpy ( S,"\n" ); strcat ( S,Line ); CIF->PutString ( S,CIFCategory,CIFTag,(N!=0) ); delete[] S; } Boolean CContString::Append ( PCContainerClass CC ) { if (CContainerClass::Append(CC)) { if (!Line) { Line = PCContString(CC)->Line; PCContString(CC)->Line = NULL; } else CreateConcat ( Line,pstr("\n"),PCContString(CC)->Line ); return True; } return False; } void CContString::Copy ( PCContainerClass CString ) { CreateCopy ( Line,PCContString(CString)->Line ); } void CContString::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.CreateWrite ( Line ); f.CreateWrite ( CIFCategory ); f.CreateWrite ( CIFTag ); } void CContString::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.CreateRead ( Line ); f.CreateRead ( CIFCategory ); f.CreateRead ( CIFTag ); } MakeStreamFunctions(CContString) // ============== CClassContainer ==================== MakeStreamFunctions(CContainerClass) CClassContainer::CClassContainer() : CStream() { Init(); } CClassContainer::CClassContainer ( RPCStream Object ) : CStream(Object) { Init(); } void CClassContainer::Init() { length = 0; Container = NULL; } CClassContainer::~CClassContainer() { FreeContainer(); } void CClassContainer::FreeContainer() { int i; if (Container) { for (i=0;i0) { i = length-1; while (i>=0) { if (!Container[i]) i--; else if (Container[i]->GetClassID()!=Data->GetClassID()) i--; else break; } if (i>=0) { if (Container[i]->Append(Data)) { delete Data; return; } } } C1 = new PCContainerClass[length+1]; for (i=0;iPDBASCIIDump1(f)) { Container[i]->PDBASCIIDump ( S,i ); j = strlen(S); while (j<80) S[j++] = ' '; S[80] = char(0); f.WriteLine ( S ); } } } int CClassContainer::GetCIF ( PCMMCIFData CIF, int ClassID ) { PCContainerClass ContainerClass; int Signal; Signal = 0; do { ContainerClass = MakeContainerClass ( ClassID ); ContainerClass->GetCIF ( CIF,Signal ); if (Signal>=0) AddData ( ContainerClass ); } while (Signal>=0); delete ContainerClass; return -(Signal+1); } void CClassContainer::MakeCIF ( PCMMCIFData CIF ) { int i; for (i=0;iMakeCIF ( CIF,i ); } void CClassContainer::write ( RCFile f ) { int i,ClassID; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &length ); for (i=0;iGetClassID(); f.WriteInt ( &ClassID ); Container[i]->write ( f ); } else { ClassID = -1; f.WriteInt ( &ClassID ); } } PCContainerClass CClassContainer::MakeContainerClass ( int ClassID ) { if (ClassID==ClassID_String) return new CContString(); return new CContainerClass(); } PCContainerClass CClassContainer::GetContainerClass (int ContClassNo) { if ((ContClassNo<0) || (ContClassNo>=length)) return NULL; return Container[ContClassNo]; } void CClassContainer::Copy ( PCClassContainer CContainer ) { int i; FreeContainer(); if (CContainer) { length = CContainer->length; if (length>0) { Container = new PCContainerClass[length]; for (i=0;iContainer[i]) { Container[i] = MakeContainerClass ( CContainer->Container[i]->GetClassID() ); Container[i]->Copy ( CContainer->Container[i] ); } else Container[i] = NULL; } } } void CClassContainer::read ( RCFile f ) { int i,ClassID; byte Version; FreeContainer(); f.ReadByte ( &Version ); f.ReadInt ( &length ); if (length>0) { Container = new PCContainerClass[length]; for (i=0;i=0) { Container[i] = MakeContainerClass ( ClassID ); Container[i]->read ( f ); } else Container[i] = NULL; } } } MakeStreamFunctions(CClassContainer) // ====================== ID parsers ========================== CAtomPath::CAtomPath() : CStream() { InitAtomPath(); } CAtomPath::CAtomPath ( cpstr ID ) : CStream() { InitAtomPath(); SetPath ( ID ); } CAtomPath::CAtomPath ( RPCStream Object ) : CStream(Object) { InitAtomPath(); } CAtomPath::~CAtomPath() {} void CAtomPath::InitAtomPath() { modelNo = 0; chainID [0] = char(0); seqNum = MinInt4; insCode [0] = char(0); resName [0] = char(0); atomName[0] = char(0); element [0] = char(0); altLoc [0] = char(0); isSet = 0; } int CAtomPath::SetPath ( cpstr ID ) { // 1. If ID starts with '/': // /mdl/chn/seq(res).i/atm[elm]:a // // 2. If ID starts with a letter: // chn/seq(res).i/atm[elm]:a // // 3. If ID starts with a number: // seq(res).i/atm[elm]:a // // 4. If ID contains colon ':' then // it may be just // atm[elm]:a // // All spaces are ignored. isSet // sets bit for each element present. // Any element may be a wildcard '*'. // Wildcard for model will set modelNo=0, // for sequence number will set // seqNum=MinInt4. // // Returns: // 0 <-> Ok // -1 <-> wrong numerical format for model // -2 <-> wrong numerical format for sequence number // char N[100]; pstr p,p1; int i,k; isSet = 0; // clear all bits. p = pstr(ID); while (*p==' ') p++; if (!(*p)) return 0; if (*p=='/') { // model number p++; i = 0; while ((*p) && (*p!='/')) { if (*p!=' ') N[i++] = *p; p++; } N[i] = char(0); if ((!N[0]) || (N[0]=='*')) modelNo = 0; else { modelNo = mround(strtod(N,&p1)); if ((modelNo==0) && (p1==N)) return -1; } isSet |= APATH_ModelNo; if (*p!='/') return 0; p++; while (*p==' ') p++; } if ((*p<'0') || (*p>'9')) { // chain ID i = 0; k = sizeof(ChainID)-1; while ((*p) && (*p!='/')) { if ((*p!=' ') && (i='0') && (*p<='9')) || (*p=='-') || (*p=='(') || (*p=='.')) { // sequence number, residue name and insertion code i = 0; while ((*p) && (*p!='/')) { if (*p!=' ') N[i++] = *p; p++; } N[i] = char(0); i = ParseResID ( N,seqNum,insCode,resName ); if (i==2) return -2; isSet |= APATH_SeqNum | APATH_InsCode | APATH_ResName; if (*p!='/') return 0; p++; while (*p==' ') p++; } if (strchr(p,':') || strchr(p,'[')) { // atom name, chemical element and alternative location i = 0; while (*p) { if (*p!=' ') N[i++] = *p; p++; } N[i] = char(0); ParseAtomID ( N,atomName,element,altLoc ); isSet |= APATH_AtomName | APATH_Element | APATH_AltLoc; } return 0; } void CAtomPath::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CStream::write ( f ); f.WriteInt ( &modelNo ); f.WriteInt ( &seqNum ); f.WriteInt ( &isSet ); f.WriteTerLine ( chainID ,False ); f.WriteTerLine ( insCode ,False ); f.WriteTerLine ( resName ,False ); f.WriteTerLine ( atomName,False ); f.WriteTerLine ( element ,False ); f.WriteTerLine ( altLoc ,False ); } void CAtomPath::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CStream::read ( f ); f.ReadInt ( &modelNo ); f.ReadInt ( &seqNum ); f.ReadInt ( &isSet ); f.ReadTerLine ( chainID ,False ); f.ReadTerLine ( insCode ,False ); f.ReadTerLine ( resName ,False ); f.ReadTerLine ( atomName,False ); f.ReadTerLine ( element ,False ); f.ReadTerLine ( altLoc ,False ); } MakeStreamFunctions(CAtomPath) // -------------------------------------------------------- CQuickSort::CQuickSort() : CStream() { selSortLimit = 15; data = NULL; dlen = 0; } CQuickSort::CQuickSort ( RPCStream Object ) : CStream(Object) { selSortLimit = 15; data = NULL; dlen = 0; } int CQuickSort::Compare ( int i, int j ) { // sort by increasing data[i] if (((ivector)data)[i]<((ivector)data)[j]) return -1; if (((ivector)data)[i]>((ivector)data)[j]) return 1; return 0; } void CQuickSort::Swap ( int i, int j ) { int b; b = ((ivector)data)[i]; ((ivector)data)[i] = ((ivector)data)[j]; ((ivector)data)[j] = b; } void CQuickSort::SelectionSort ( int left, int right ) { int i,j,imin; for (i=left;i0) && (Compare(rm,lv)>0)); do lm++; while ((lm=l) i = l-1; wrd[i] = char(0); p = p1; } void ParseAtomID ( cpstr ID, AtomName aname, Element elname, AltLoc aloc ) { pstr p; p = pstr(ID); while (*p==' ') p++; strcpy ( aname ,"*" ); strcpy ( elname,"*" ); if (*p) aloc[0] = char(0); else strcpy ( aloc,"*" ); takeWord ( p,aname,pstr("[: "),sizeof(AtomName) ); if (*p=='[') { p++; takeWord ( p,elname,pstr("]: "),sizeof(Element) ); if (*p==']') p++; } if (*p==':') { p++; takeWord ( p,aloc,pstr(" "),sizeof(AltLoc) ); } } int ParseResID ( cpstr ID, int & sn, InsCode inscode, ResName resname ) { int RC; pstr p,p1; char N[100]; RC = 0; p = pstr(ID); while (*p==' ') p++; sn = ANY_RES; strcpy ( inscode,"*" ); strcpy ( resname,"*" ); N[0] = char(0); takeWord ( p,N,pstr("(./ "),sizeof(N) ); if ((!N[0]) || (N[0]=='*')) { sn = ANY_RES; RC = 1; } if (!RC) { sn = mround(strtod(N,&p1)); if (p1==N) RC = 2; else inscode[0] = char(0); } if (*p=='(') { p++; takeWord ( p,resname,pstr(")./ "),sizeof(ResName) ); if (*p==')') p++; } if (*p=='.') { p++; takeWord ( p,inscode,pstr("/ "),sizeof(InsCode) ); } return RC; } int ParseAtomPath ( cpstr ID, int & mdl, ChainID chn, int & sn, InsCode ic, ResName res, AtomName atm, Element elm, AltLoc aloc, PCAtomPath DefPath ) { // /mdl/chn/seq(res).i/atm[elm]:a, may be partial char N[100]; pstr p,p1; int i,RC; Boolean wasRes = False; RC = 0; p = pstr(ID); while (*p==' ') p++; mdl = 0; if (*p=='/') { p++; N[0] = char(0); takeWord ( p,N,pstr("/"),sizeof(N) ); if ((!N[0]) || (N[0]=='*')) mdl = 0; else { mdl = mround(strtod(N,&p1)); if ((mdl==0) && (p1==N)) return -1; } } else if (DefPath) { if (DefPath->isSet & APATH_ModelNo) mdl = DefPath->modelNo; } strcpy ( chn,"*" ); if (*p=='/') p++; if ((*p<'0') || (*p>'9')) { p1 = p; chn[0] = char(0); takeWord ( p,chn,pstr("/"),sizeof(ChainID) ); if (strpbrk(chn,"(.[:-")) { // this was not a chain ID! if (DefPath) { if (DefPath->isSet & APATH_ChainID) strcpy ( chn,DefPath->chainID ); } else strcpy ( chn,"*" ); p = p1; } } else if (DefPath) { if (DefPath->isSet & APATH_ChainID) strcpy ( chn,DefPath->chainID ); } if (*p=='/') p++; sn = ANY_RES; strcpy ( ic ,"*" ); strcpy ( res,"*" ); if (((*p>='0') && (*p<='9')) || (*p=='-') || (*p=='(') || (*p=='.')) { wasRes = True; N[0] = char(0); takeWord ( p,N,pstr("/"),sizeof(N) ); i = ParseResID ( N,sn,ic,res ); if (i==2) return -2; } else if (DefPath) { wasRes = (*p=='/'); if (DefPath->isSet & APATH_SeqNum) sn = DefPath->seqNum; if (DefPath->isSet & APATH_InsCode) strcpy ( ic,DefPath->insCode ); if (DefPath->isSet & APATH_ResName) strcpy ( res,DefPath->resName ); } if (*p=='/') p++; strcpy ( atm ,"*" ); strcpy ( elm ,"*" ); strcpy ( aloc,"*" ); if (wasRes || strchr(p,':') || strchr(p,'[')) { ParseAtomID ( p,atm,elm,aloc ); } else if (DefPath) { if (DefPath->isSet & APATH_AtomName) strcpy ( atm,DefPath->atomName ); if (DefPath->isSet & APATH_Element) strcpy ( elm,DefPath->element ); if (DefPath->isSet & APATH_ResName) strcpy ( aloc,DefPath->altLoc ); } if (mdl<=0) RC |= APATH_WC_ModelNo; if (chn[0]=='*') RC |= APATH_WC_ChainID; if (sn==ANY_RES) RC |= APATH_WC_SeqNum; if (ic[0]=='*') RC |= APATH_WC_InsCode; if (res[0]=='*') RC |= APATH_WC_ResName; if (atm[0]=='*') RC |= APATH_WC_AtomName; if (elm[0]=='*') RC |= APATH_WC_Element; if (aloc[0]=='*') RC |= APATH_WC_AltLoc; if (RC & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode | APATH_WC_AtomName | APATH_WC_AltLoc)) RC |= APATH_Incomplete; return RC; } int ParseSelectionPath ( cpstr CID, int & iModel, pstr Chains, int & sNum1, InsCode ic1, int & sNum2, InsCode ic2, pstr RNames, pstr ANames, pstr Elements, pstr altLocs ) { int l,j; pstr p,p1; pstr N; int seqNum [2]; InsCode insCode[2]; pstr ID; Boolean wasModel,wasChain,wasRes,haveNeg; l = IMax(10,strlen(CID))+1; ID = new char[l]; N = new char[l]; p = pstr(CID); p1 = ID; while (*p) { if (*p!=' ') { *p1 = *p; p1++; } p++; } *p1 = char(0); p = ID; iModel = 0; strcpy ( Chains,"*" ); seqNum[0] = ANY_RES; seqNum[1] = ANY_RES; strcpy ( insCode[0],"*" ); strcpy ( insCode[1],"*" ); strcpy ( RNames ,"*" ); strcpy ( ANames ,"*" ); strcpy ( Elements ,"*" ); strcpy ( altLocs ,"*" ); wasModel = False; wasChain = False; wasRes = False; if (*p=='/') { // CID starts with the slash -- take model number first p++; N[0] = char(0); takeWord ( p,N,pstr("/"),l ); if ((!N[0]) || (N[0]=='*')) iModel = 0; else { iModel = mround(strtod(N,&p1)); if ((iModel==0) && (p1==N)) return -1; } if (*p=='/') p++; wasModel = True; } if ((*p) && (wasModel || (*p<'0') || (*p>'9'))) { p1 = p; Chains[0] = char(0); takeWord ( p,Chains,pstr("/"),l ); if (strpbrk(Chains,"(.[:-")) { // this was not a chain ID! strcpy ( Chains,"*" ); p = p1; } else wasChain = True; if (*p=='/') p++; } if ((*p) && (wasChain || ((*p>='0') && (*p<='9')) || (*p=='-') || (*p=='(') || (*p=='.') || (*p=='*'))) { j = 0; do { // take the sequence number haveNeg = False; if (*p=='-') { haveNeg = True; p++; } N[0] = char(0); takeWord ( p,N,pstr("(.-/"),l ); if ((!N[0]) || (N[0]=='*')) seqNum[j] = ANY_RES; else { seqNum[j] = mround(strtod(N,&p1)); if (p1==N) return -2; if (haveNeg) seqNum[j] = - seqNum[j]; } // take the residue list if (*p=='(') { p++; takeWord ( p,RNames,pstr(").-/"),l ); if (*p==')') p++; } // take the insertion code if (seqNum[j]!=ANY_RES) insCode[j][0] = char(0); if (*p=='.') { p++; takeWord ( p,insCode[j],pstr("-/"),sizeof(InsCode) ); } if (*p=='-') { p++; j++; } else { if (j==0) { seqNum[1] = seqNum[0]; strcpy ( insCode[1],insCode[0] ); } j = 10; } } while (j<2); wasRes = True; } else wasRes = (*p=='/'); if (*p=='/') p++; if ((*p) && (wasRes || strchr(p,':') || strchr(p,'['))) { if (*p) altLocs[0] = char(0); takeWord ( p,ANames,pstr("[:"),l ); if (!ANames[0]) strcpy ( ANames,"*" ); if (*p=='[') { p++; takeWord ( p,Elements,pstr("]:"),l ); if (*p==']') p++; } if (*p==':') { p++; takeWord ( p,altLocs,pstr(" "),l ); } } /* printf ( " iModel = %i\n" " Chains = '%s'\n" " seqNum1 = %i\n" " insCode1 = '%s'\n" " seqNum2 = %i\n" " insCode2 = '%s'\n" " RNames = '%s'\n" " ANames = '%s'\n" " Elements = '%s'\n" " altLocs = '%s'\n", iModel,Chains,seqNum[0],insCode[0], seqNum[1],insCode[1],RNames,ANames, Elements,altLocs ); */ sNum1 = seqNum[0]; sNum2 = seqNum[1]; strcpy ( ic1,insCode[0] ); strcpy ( ic2,insCode[1] ); delete[] ID; delete[] N; return 0; } void MakeSelectionPath ( pstr CID, int iModel, cpstr Chains, int sNum1, const InsCode ic1, int sNum2, const InsCode ic2, cpstr RNames, cpstr ANames, cpstr Elements, cpstr altLocs ) { char S[100]; int k; if (iModel>0) { sprintf ( CID,"/%i",iModel ); k = 1; } else { CID[0] = char(0); k = 0; } if (Chains[0]!='*') { if (k>0) strcat ( CID,"/" ); strcat ( CID,Chains ); k = 2; } if ((sNum1!=-MaxInt4) || (ic1[0]!='*')) { if (k>0) { if (k<2) strcat ( CID,"/*" ); strcat ( CID,"/" ); } if (sNum1>-MaxInt4) sprintf ( S,"%i",sNum1 ); else strcpy ( S,"*" ); if (ic1[0]!='*') { strcat ( S,"." ); strcat ( S,ic1 ); } strcat ( CID,S ); if ((sNum2!=-MaxInt4) || (ic2[0]!='*')) { strcat ( CID,"-" ); if (sNum1>-MaxInt4) sprintf ( S,"%i",sNum2 ); else strcpy ( S,"*" ); if (ic2[0]!='*') { strcat ( S,"." ); strcat ( S,ic2 ); } strcat ( CID,S ); } k = 3; } if (RNames[0]!='*') { if (k<1) strcat ( CID,"(" ); else if (k<2) strcat ( CID,"*/*(" ); else if (k<3) strcat ( CID,"/*(" ); strcat ( CID,RNames ); strcat ( CID,")" ); k = 4; } if (ANames[0]!='*') { if (k<1) strcat ( CID,"/*/*/*/" ); // full path else if (k<2) strcat ( CID,"/*/*/" ); // /mdl + /*/*/ else if (k<3) strcat ( CID,"/*/" ); // /mdl/chn + /*/ else if (k<4) strcat ( CID,"/" ); // /mdl/chn/res + / strcat ( CID,ANames ); strcat ( CID,")" ); k = 5; } if (Elements[0]!='*') { if (k<1) strcat ( CID,"[" ); else if (k<2) strcat ( CID,"/*/*/*[" ); else if (k<3) strcat ( CID,"/*/*[" ); else if (k<4) strcat ( CID,"/*[" ); else if (k<5) strcat ( CID,"[" ); strcat ( CID,Elements ); strcat ( CID,"]" ); k = 6; } if (altLocs[0]!='*') { if (k<1) strcat ( CID,":" ); else if (k<2) strcat ( CID,"/*/*/*:" ); else if (k<3) strcat ( CID,"/*/*:" ); else if (k<4) strcat ( CID,"/*:" ); else if (k<6) strcat ( CID,":" ); strcat ( CID,altLocs ); } } mmdb-1.23.2.1/src/mmdb_tables.h0000644000175100017510000000775711475666364013053 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 04.02.09 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Tables // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // **** Functions : // ~~~~~~~~~~~ // // **** Constants : AName ( array of 2-character atom names ) // ~~~~~~~~~~~ HAName ( array of 2=character heteroatom names ) // RName ( 3-characters amino acid names ) // RName1 ( 1-characters amino acid names ) // // // (C) E. Krissinel 2000-2009 // // ================================================================= // #ifndef __MMDB_Tables__ #define __MMDB_Tables__ #ifndef __MatType__ #include "mattype_.h" #endif // ================================================================= #define nElementNames 117 #define nElementMetals 91 #define nHydAtomNames 14 extern cpstr const ElementName [nElementNames]; extern cpstr const ElementMetal [nElementMetals]; extern cpstr const HydAtomName [nHydAtomNames]; extern realtype const MolecWeight [nElementNames]; extern realtype const CovalentRadius[nElementNames]; extern realtype const VdWaalsRadius [nElementNames]; extern realtype const IonicRadius [nElementNames]; extern Boolean isMetal ( cpstr element ); #define ELEMENT_UNKNOWN -1 extern int getElementNo ( cpstr element ); extern realtype getMolecWeight ( cpstr element ); extern realtype getCovalentRadius ( cpstr element ); extern realtype getVdWaalsRadius ( cpstr element ); #define nResNames 26 extern cpstr const ResidueName [nResNames]; extern char const ResidueName1[nResNames]; extern int getResidueNo ( cpstr resName ); #define nSolventNames 12 #define nAminoacidNames 23 #define nNucleotideNames 24 DefineStructure(SAAProperty) struct SAAProperty { char name[4]; realtype hydropathy; realtype charge; realtype relSolvEnergy; }; extern SAAProperty const AAProperty[nAminoacidNames]; extern int const AASimilarity[nAminoacidNames][nAminoacidNames]; extern int GetAAPIndex ( cpstr resName ); // 0..nAminoacidNames-1 extern realtype GetAAHydropathy ( cpstr resName ); // -4.5...+4.5 extern realtype GetAACharge ( cpstr resName ); extern realtype GetAASolvationEnergy ( cpstr resName ); extern int GetAASimilarity ( cpstr resName1, cpstr resName2 ); // 0..5 extern cpstr const StdSolventName[nSolventNames]; //extern pstr const AminoacidName [nAminoacidNames]; extern cpstr const NucleotideName[nNucleotideNames]; extern Boolean isSolvent ( cpstr resName ); extern Boolean isAminoacid ( cpstr resName ); extern Boolean isNucleotide ( cpstr resName ); extern int isDNARNA ( cpstr resName ); // 0,1(DNA),2(RNA) extern Boolean isSugar ( cpstr resName ); extern void Get1LetterCode ( cpstr res3name, pstr res1code ); #endif mmdb-1.23.2.1/src/mmdb_cryst.cpp0000644000175100017510000016311611476176015013256 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Cryst // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CCrystContainer ( container for cryst. data ) // ~~~~~~~~~ CNCSMatrix ( non-cryst. symm. matrix class ) // CTVect ( translational vector class ) // CMMDBCryst ( MMDB cryst. section class ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MATH_H #include #endif #ifndef __MMDB_Cryst__ #include "mmdb_cryst.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_CIFDefs__ #include "mmdb_cifdefs.h" #endif // ============== CCrystContainer ==================== PCContainerClass CCrystContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return CClassContainer::MakeContainerClass(ClassID); case ClassID_NCSMatrix : return new CNCSMatrix(); case ClassID_TVect : return new CTVect (); } } int CCrystContainer::AddMTRIXLine ( cpstr S ) { int i,RC; RC = Error_NCSM_WrongSerial; for (i=0;iConvertPDBASCII(S); if (RC==0) break; if (RC!=Error_NCSM_WrongSerial) break; } return RC; } MakeStreamFunctions(CCrystContainer) // ================ CNCSMatrix =================== CNCSMatrix::CNCSMatrix() : CContainerClass() { Init(); } CNCSMatrix::CNCSMatrix ( cpstr S ) : CContainerClass() { Init(); ConvertPDBASCII ( S ); } CNCSMatrix::CNCSMatrix ( RPCStream Object ) : CContainerClass(Object) { Init(); } CNCSMatrix::~CNCSMatrix() {} void CNCSMatrix::Init() { int i,j; serNum = -1; iGiven = -1; for (i=0;i<3;i++) { for (j=0;j<3;j++) m[i][j] = 0.0; m[i][i] = 1.0; v[i] = 0.0; } WhatIsSet = 0; // nothing is set } Boolean CNCSMatrix::PDBASCIIDump1 ( RCFile f ) { // makes the ASCII PDB MATRIXn lines if all // of them were set. char S[100]; int i,j; if ((WhatIsSet & NCSMSET_All)==NCSMSET_All) for (i=0;i<3;i++) { sprintf ( S,"MTRIX%1i %3i",i+1,serNum ); PadSpaces ( S,80 ); for (j=0;j<3;j++) PutRealF ( &(S[10+j*10]),m[i][j],10,6 ); PutRealF ( &(S[45]),v[i],10,5 ); if (iGiven) S[59] = '1'; f.WriteLine ( S ); } return True; // container should use this virtual } int CNCSMatrix::ConvertPDBASCII ( cpstr S ) { int sN,iG; realtype m0,m1,m2,v0; if (!(GetInteger(sN,&(S[7]) ,3 ) && GetReal (m0,&(S[10]),10) && GetReal (m1,&(S[20]),10) && GetReal (m2,&(S[30]),10) && GetReal (v0,&(S[45]),10))) return Error_NCSM_Unrecognized; if (S[59]=='1') iG = 1; else iG = 0; if (WhatIsSet & NCSMSET_All) { if (sN!=serNum) return Error_NCSM_WrongSerial; if (iG!=iGiven) return Error_NCSM_UnmatchIG; } if (!strncmp(S,"MTRIX1",6)) { if (WhatIsSet & NCSMSET_Matrix1) return Error_NCSM_AlreadySet; serNum = sN; iGiven = iG; m[0][0] = m0; m[0][1] = m1; m[0][2] = m2; v[0] = v0; WhatIsSet |= NCSMSET_Matrix1; } else if (!strncmp(S,"MTRIX2",6)) { if (WhatIsSet & NCSMSET_Matrix2) return Error_NCSM_AlreadySet; serNum = sN; iGiven = iG; m[1][0] = m0; m[1][1] = m1; m[1][2] = m2; v[1] = v0; WhatIsSet |= NCSMSET_Matrix2; } else if (!strncmp(S,"MTRIX3",6)) { if (WhatIsSet & NCSMSET_Matrix3) return Error_NCSM_AlreadySet; serNum = sN; iGiven = iG; m[2][0] = m0; m[2][1] = m1; m[2][2] = m2; v[2] = v0; WhatIsSet |= NCSMSET_Matrix3; } else return Error_WrongSection; return 0; } void CNCSMatrix::MakeCIF ( PCMMCIFData CIF, int N ) { PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_NCS_OPER,Loop ); if ((RC!=CIFRC_Ok) || (N==0)) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_MATRIX11 ); Loop->AddLoopTag ( CIFTAG_MATRIX12 ); Loop->AddLoopTag ( CIFTAG_MATRIX13 ); Loop->AddLoopTag ( CIFTAG_VECTOR1 ); Loop->AddLoopTag ( CIFTAG_MATRIX21 ); Loop->AddLoopTag ( CIFTAG_MATRIX22 ); Loop->AddLoopTag ( CIFTAG_MATRIX23 ); Loop->AddLoopTag ( CIFTAG_VECTOR2 ); Loop->AddLoopTag ( CIFTAG_MATRIX31 ); Loop->AddLoopTag ( CIFTAG_MATRIX32 ); Loop->AddLoopTag ( CIFTAG_MATRIX33 ); Loop->AddLoopTag ( CIFTAG_VECTOR3 ); Loop->AddLoopTag ( CIFTAG_CODE ); } Loop->AddInteger ( serNum ); if (WhatIsSet & NCSMSET_Matrix1) { Loop->AddReal ( m[0][0] ); Loop->AddReal ( m[0][1] ); Loop->AddReal ( m[0][2] ); Loop->AddReal ( v[0] ); } else { Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); } if (WhatIsSet & NCSMSET_Matrix2) { Loop->AddReal ( m[1][0] ); Loop->AddReal ( m[1][1] ); Loop->AddReal ( m[1][2] ); Loop->AddReal ( v[1] ); } else { Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); } if (WhatIsSet & NCSMSET_Matrix3) { Loop->AddReal ( m[2][0] ); Loop->AddReal ( m[2][1] ); Loop->AddReal ( m[2][2] ); Loop->AddReal ( v[2] ); } else { Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); Loop->AddString ( NULL ); } if (iGiven==1) Loop->AddString ( pstr("generated") ); else Loop->AddNoData ( CIF_NODATA_DOT ); } void CNCSMatrix::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; char Code[100]; Loop = CIF->GetLoop ( CIFCAT_STRUCT_NCS_OPER ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } if (Signal>=Loop->GetLoopLength()) { Signal = -1; return; } WhatIsSet = 0; if (CIFGetInteger(serNum,Loop,CIFTAG_ID,Signal)) return; if (CIFGetString(Code,Loop,CIFTAG_CODE,Signal,sizeof(Code), pstr(""))) iGiven = MinInt4; else if (!strcasecmp(Code,"generated")) iGiven = 1; else iGiven = MinInt4; if (CIFGetReal(m[0][0],Loop,CIFTAG_MATRIX11,Signal)) return; if (CIFGetReal(m[0][1],Loop,CIFTAG_MATRIX12,Signal)) return; if (CIFGetReal(m[0][2],Loop,CIFTAG_MATRIX13,Signal)) return; if (CIFGetReal(v[0] ,Loop,CIFTAG_VECTOR1 ,Signal)) return; WhatIsSet |= NCSMSET_Matrix1; if (CIFGetReal(m[1][0],Loop,CIFTAG_MATRIX21,Signal)) return; if (CIFGetReal(m[1][1],Loop,CIFTAG_MATRIX22,Signal)) return; if (CIFGetReal(m[1][2],Loop,CIFTAG_MATRIX23,Signal)) return; if (CIFGetReal(v[1] ,Loop,CIFTAG_VECTOR2 ,Signal)) return; WhatIsSet |= NCSMSET_Matrix2; if (CIFGetReal(m[2][0],Loop,CIFTAG_MATRIX31,Signal)) return; if (CIFGetReal(m[2][1],Loop,CIFTAG_MATRIX32,Signal)) return; if (CIFGetReal(m[2][2],Loop,CIFTAG_MATRIX33,Signal)) return; if (CIFGetReal(v[2] ,Loop,CIFTAG_VECTOR3 ,Signal)) return; WhatIsSet |= NCSMSET_Matrix3; Signal++; } void CNCSMatrix::SetNCSMatrix ( int serialNum, mat33 & ncs_m, vect3 & ncs_v, int i_Given ) { int i,j; serNum = serialNum; for (i=0;i<3;i++) { for (j=0;j<3;j++) m[i][j] = ncs_m[i][j]; v[i] = ncs_v[i]; } iGiven = i_Given; WhatIsSet |= NCSMSET_All; } void CNCSMatrix::Copy ( PCContainerClass NCSMatrix ) { int i,j; serNum = PCNCSMatrix(NCSMatrix)->serNum; iGiven = PCNCSMatrix(NCSMatrix)->iGiven; for (i=0;i<3;i++) { for (j=0;j<3;j++) m[i][j] = PCNCSMatrix(NCSMatrix)->m[i][j]; v[i] = PCNCSMatrix(NCSMatrix)->v[i]; } WhatIsSet = PCNCSMatrix(NCSMatrix)->WhatIsSet; } void CNCSMatrix::write ( RCFile f ) { int i,j; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); f.WriteInt ( &iGiven ); for (i=0;i<3;i++) { for (j=0;j<3;j++) f.WriteReal ( &(m[i][j]) ); f.WriteReal ( &(v[i]) ); } f.WriteWord ( &WhatIsSet ); } void CNCSMatrix::read ( RCFile f ) { int i,j; byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); f.ReadInt ( &iGiven ); for (i=0;i<3;i++) { for (j=0;j<3;j++) f.ReadReal ( &(m[i][j]) ); f.ReadReal ( &(v[i]) ); } f.ReadWord ( &WhatIsSet ); } MakeStreamFunctions(CNCSMatrix) // ================ CTVect =================== CTVect::CTVect() : CContainerClass() { Init(); } CTVect::CTVect ( cpstr S ) : CContainerClass() { Init(); ConvertPDBASCII ( S ); } CTVect::CTVect ( RPCStream Object ) : CContainerClass(Object) { Init(); } CTVect::~CTVect() { if (comment) delete[] comment; } void CTVect::Init() { serNum = -1; t[0] = 0.0; t[1] = 0.0; t[2] = 0.0; comment = NULL; } void CTVect::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB TVECT line number N sprintf ( S,"TVECT %3i",serNum ); PadSpaces ( S,80 ); PutRealF ( &(S[10]),t[0],10,5 ); PutRealF ( &(S[20]),t[1],10,5 ); PutRealF ( &(S[30]),t[2],10,5 ); if (comment) strncpy ( &(S[40]),comment,IMin(30,strlen(comment)) ); } int CTVect::ConvertPDBASCII ( cpstr S ) { GetInteger ( serNum ,&(S[7]) ,3 ); GetReal ( t[0] ,&(S[10]),10 ); GetReal ( t[1] ,&(S[20]),10 ); GetReal ( t[2] ,&(S[30]),10 ); CreateCopy ( comment,&(S[40]) ); return 0; } void CTVect::MakeCIF ( PCMMCIFData CIF, int N ) { PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_DATABASE_PDB_TVECT,Loop ); if ((RC!=CIFRC_Ok) || (N==0)) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_VECTOR1 ); Loop->AddLoopTag ( CIFTAG_VECTOR2 ); Loop->AddLoopTag ( CIFTAG_VECTOR3 ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddInteger ( serNum ); Loop->AddReal ( t[0] ); Loop->AddReal ( t[1] ); Loop->AddReal ( t[2] ); Loop->AddString ( comment ); } void CTVect::GetCIF ( PCMMCIFData CIF, int & Signal ) { PCMMCIFLoop Loop; Loop = CIF->GetLoop ( CIFCAT_DATABASE_PDB_TVECT ); if (!Loop) { Signal = -1; // signal to finish processing of this structure return; } if (Signal>=Loop->GetLoopLength()) { Signal = -1; return; } if (CIFGetInteger(serNum,Loop,CIFTAG_ID,Signal)) return; if (CIFGetReal(t[0],Loop,CIFTAG_VECTOR1,Signal)) return; if (CIFGetReal(t[1],Loop,CIFTAG_VECTOR2,Signal)) return; if (CIFGetReal(t[2],Loop,CIFTAG_VECTOR3,Signal)) return; Loop->GetString ( comment,CIFTAG_DETAILS,Signal,True ); Signal++; } void CTVect::Copy ( PCContainerClass TVect ) { int i; serNum = PCTVect(TVect)->serNum; for (i=0;i<3;i++) t[i] = PCTVect(TVect)->t[i]; CreateCopy ( comment,PCTVect(TVect)->comment ); } void CTVect::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &serNum ); for (i=0;i<3;i++) f.WriteReal ( &(t[i]) ); f.CreateWrite ( comment ); } void CTVect::read ( RCFile f ) { int i; byte Version; f.ReadByte ( &Version ); f.ReadInt ( &serNum ); for (i=0;i<3;i++) f.ReadReal ( &(t[i]) ); f.CreateRead ( comment ); } MakeStreamFunctions(CTVect) // ===================== CMMDBCryst ======================= CMMDBCryst::CMMDBCryst() : CStream() { Init ( True ); } CMMDBCryst::CMMDBCryst ( RPCStream Object ) : CStream(Object) { Init ( True ); } void CMMDBCryst::Init ( Boolean fullInit ) { int i,j,k; WhatIsSet = 0; // nothing is set a = 1.0; b = 1.0; c = 1.0; alpha = 90.0; beta = 90.0; gamma = 90.0; strcpy ( spaceGroup ,"" ); strcpy ( spaceGroupFix,"" ); Z = 1; CellCheck = CCHK_NoCell; for (i=0;i<3;i++) { for (j=0;j<3;j++) { o[i][j] = 0.0; s[i][j] = 0.0; for (k=0;k<6;k++) RR[k][i][j] = 0.0; } o[i][i] = 1.0; s[i][i] = 1.0; t[i] = 0.0; u[i] = 0.0; for (k=0;k<6;k++) RR[k][i][i] = 1.0; } for (i=0;i<4;i++) { for (j=0;j<4;j++) { RO [i][j] = 0.0; RF [i][j] = 0.0; ROU[i][j] = 0.0; RFU[i][j] = 0.0; } RO [i][i] = 1.0; RF [i][i] = 1.0; ROU[i][i] = 1.0; RFU[i][i] = 1.0; } Vol = 0.0; VolChk = 0.0; VolErr = 0.0; as = 1.0; bs = 1.0; cs = 1.0; alphas = 90.0; betas = 90.0; gammas = 90.0; for (k=0;k<6;k++) AC[k] = 0.0; NCode = 0; if (fullInit) { syminfo_lib = NULL; ignoreScalei = False; // flag to ignore SCALEi cards } } CMMDBCryst::~CMMDBCryst() { FreeMemory(); if (syminfo_lib) delete[] syminfo_lib; } void CMMDBCryst::FreeMemory() { NCSMatrix.FreeContainer(); TVect .FreeContainer(); SymOps .FreeMemory (); } void CMMDBCryst::Reset() { FreeMemory(); Init ( False ); } cpstr rhombohedral[] = { cpstr("R 3" ), cpstr("R 3" ), cpstr("R 3 2"), cpstr("R 3 2") }; cpstr short_mono[] = { cpstr("P 2" ), cpstr("P 21"), cpstr("C 2" ), cpstr("A 2" ), cpstr("B 2" ), cpstr("I 2" ) }; cpstr special[] = { cpstr("A1" ), cpstr("Hall: P 1 (-x,-1/2*y+1/2*z,1/2*y+1/2*z)" ), cpstr("C1211" ), cpstr("Hall: C 2y (x+1/4,y+1/4,z)" ), cpstr("C21" ), cpstr("Hall: C 2y (x+1/4,y+1/4,z)" ), cpstr("I1211" ), cpstr("Hall: C 2y (x+1/4,y+1/4,-x+z-1/4)" ), cpstr("I21" ), cpstr("Hall: C 2y (x+1/4,y+1/4,-x+z-1/4)" ), cpstr("P21212A"), cpstr("Hall: P 2 2ab (x+1/4,y+1/4,z)" ), cpstr("F422" ), cpstr("Hall: I 4 2 (1/2*x+1/2*y,-1/2*x+1/2*y,z)" ), cpstr("C4212" ), cpstr("Hall: P 4 2 (1/2*x+1/2*y-1/4,-1/2*x+1/2*y-1/4,z)") }; int CMMDBCryst::FixSpaceGroup() { // This function attempts to clean up the Brookhaven mess in space // group naming, by checking the space group symbol with cell // parameters. Returns: // // 0 - space group symbol is correct, spaceGroupFix receives // a copy of spaceGroup // 1 - space group symbol does not agree with cell parameters, // and fixed successfully. spaceGroupFix receives // the appropriate space group symbol // -1 - space group symbol does not agree with cell parameters, // however fix is not possible. spaceGroupFix receives // a copy of spaceGroup // -2 - any checks are not possible because cell parameters // are not found, spaceGroupFix receives a copy of // spaceGroup // realtype eps,m1,m2; SymGroup s; int i,k; char c; strcpy ( spaceGroupFix,spaceGroup ); if ((WhatIsSet & CSET_CellParams)!=CSET_CellParams) return -2; eps = 0.01; k = -1; for (i=0;(i<4) && (k<0);i++) if (!strcmp(spaceGroup,rhombohedral[i])) k = i; if (k>=0) { c = 'N'; if ((fabs(a-b)<=eps) && (fabs(alpha-90.0)<=eps) && (fabs(beta-90.0)<=eps) && (fabs(gamma-120.0)<=eps)) c = 'H'; else { m1 = (a+b+c)/3.0; m2 = (alpha+beta+gamma)/3.0; if ((fabs(a-m1)<=eps) && (fabs(b-m1)<=eps) && (fabs(c-m1)<=eps) && (fabs(alpha-m2)<=eps) && (fabs(beta-m2)<=eps) && (fabs(gamma-m2)<=eps)) c = 'R'; } if (c!=spaceGroup[0]) { if (c!='N') { spaceGroupFix[0] = c; return 1; } return -1; } return 0; } for (i=0;(i<6) && (k<0);i++) if (!strcmp(spaceGroup,short_mono[i])) k = i; if (k>=0) { if ((fabs(alpha-90.0)<=eps) && (fabs(gamma-90.0)<=eps)) { if (spaceGroup[0]=='B') return -1; sprintf ( spaceGroupFix,"%c 1 %s 1",spaceGroup[0], &(spaceGroup[2]) ); return 1; } if ((fabs(alpha-90.0)<=eps) && (fabs(beta-90.0)<=eps)) { if (spaceGroup[0]=='C') return -1; sprintf ( spaceGroupFix,"%c 1 1 %s",spaceGroup[0], &(spaceGroup[2]) ); return 1; } return -1; } i = 0; k = 0; while (spaceGroup[i]) { if (spaceGroup[i]!=' ') s[k++] = spaceGroup[i]; i++; } s[k] = char(0); k = -1; for (i=0;(i<16) && (k<0);i+=2) if (!strcmp(s,special[i])) k = i; if (k>=0) { strcpy ( spaceGroupFix,special[k+1] ); return 1; } return 0; } int CMMDBCryst::ConvertPDBString ( pstr PDBString, Boolean fixSpaceGroup ) { // Interprets the ASCII PDB line and fills the corresponding fields. // Returns zero if the line was converted, otherwise returns a // non-negative value of Error_XXXX. // PDBString must be not shorter than 81 characters. int RC; PCNCSMatrix ncsMatrix; PCTVect tVect; // pad input line with spaces, if necessary PadSpaces ( PDBString,80 ); if (!strncmp(PDBString,"CRYST",5)) { // Here we check for "CRYST" and not for "CRYST1" keyword. // As seems, people tend to not differentiating them. if (GetReal(a,&(PDBString[6]) ,9) && GetReal(b,&(PDBString[15]),9) && GetReal(c,&(PDBString[24]),9)) WhatIsSet |= CSET_CellParams1; if (GetReal(alpha,&(PDBString[33]),7) && GetReal(beta ,&(PDBString[40]),7) && GetReal(gamma,&(PDBString[47]),7)) WhatIsSet |= CSET_CellParams2; GetString ( spaceGroup,&(PDBString[55]),11 ); CutSpaces ( spaceGroup,SCUTKEY_BEGEND ); if (fixSpaceGroup) FixSpaceGroup(); else strcpy ( spaceGroupFix,spaceGroup ); if (spaceGroupFix[0]) { if (SymOps.SetGroup(spaceGroupFix,syminfo_lib)==SYMOP_Ok) WhatIsSet |= CSET_SpaceGroup; } if (GetInteger(Z,&(PDBString[66]),4)) WhatIsSet |= CSET_ZValue; WhatIsSet &= 0xFBFF; if ((a*b*c*alpha*beta*gamma==0.0) || ((a==1.0) && (b==1.0) && (c==1.0) && (alpha==90.0) && (beta==90.0) && (gamma==90.0) && (!strcmp(spaceGroup,"P 1")))) { WhatIsSet &= ~(CSET_CellParams1 | CSET_CellParams2 | CSET_SpaceGroup); WhatIsSet |= CSET_DummyCell; } } else if (!strncmp(PDBString,"ORIGX1",6)) { if (GetReal(o[0][0],&(PDBString[10]),10) && GetReal(o[0][1],&(PDBString[20]),10) && GetReal(o[0][2],&(PDBString[30]),10) && GetReal(t[0] ,&(PDBString[45]),10)) WhatIsSet |= CSET_OrigMatrix1; } else if (!strncmp(PDBString,"ORIGX2",6)) { if (GetReal(o[1][0],&(PDBString[10]),10) && GetReal(o[1][1],&(PDBString[20]),10) && GetReal(o[1][2],&(PDBString[30]),10) && GetReal(t[1] ,&(PDBString[45]),10)) WhatIsSet |= CSET_OrigMatrix2; } else if (!strncmp(PDBString,"ORIGX3",6)) { if (GetReal(o[2][0],&(PDBString[10]),10) && GetReal(o[2][1],&(PDBString[20]),10) && GetReal(o[2][2],&(PDBString[30]),10) && GetReal(t[2] ,&(PDBString[45]),10)) WhatIsSet |= CSET_OrigMatrix3; } else if (!strncmp(PDBString,"SCALE1",6)) { if (GetReal(s[0][0],&(PDBString[10]),10) && GetReal(s[0][1],&(PDBString[20]),10) && GetReal(s[0][2],&(PDBString[30]),10) && GetReal(u[0] ,&(PDBString[45]),10)) WhatIsSet |= CSET_ScaleMatrix1; WhatIsSet &= 0xFBFF; CellCheck |= CCHK_Unchecked; } else if (!strncmp(PDBString,"SCALE2",6)) { if (GetReal(s[1][0],&(PDBString[10]),10) && GetReal(s[1][1],&(PDBString[20]),10) && GetReal(s[1][2],&(PDBString[30]),10) && GetReal(u[1] ,&(PDBString[45]),10)) WhatIsSet |= CSET_ScaleMatrix2; WhatIsSet &= 0xFBFF; CellCheck |= CCHK_Unchecked; } else if (!strncmp(PDBString,"SCALE3",6)) { if (GetReal(s[2][0],&(PDBString[10]),10) && GetReal(s[2][1],&(PDBString[20]),10) && GetReal(s[2][2],&(PDBString[30]),10) && GetReal(u[2] ,&(PDBString[45]),10)) WhatIsSet |= CSET_ScaleMatrix3; WhatIsSet &= 0xFBFF; CellCheck |= CCHK_Unchecked; } else if (!strncmp(PDBString,"MTRIX",5)) { RC = NCSMatrix.AddMTRIXLine ( PDBString ); if (RC==Error_NCSM_WrongSerial) { ncsMatrix = new CNCSMatrix(); RC = ncsMatrix->ConvertPDBASCII ( PDBString ); if (RC==0) NCSMatrix.AddData ( ncsMatrix ); else delete ncsMatrix; } return RC; } else if (!strncmp(PDBString,"TVECT ",6)) { tVect = new CTVect(); RC = tVect->ConvertPDBASCII(PDBString); if (RC==0) TVect.AddData ( tVect ); else delete tVect; return RC; } else return Error_WrongSection; return 0; } void CMMDBCryst::PDBASCIIDump ( RCFile f ) { int i,j; char S[100]; if (WhatIsSet & (CSET_CrystCard | CSET_DummyCell)) { strcpy ( S,"CRYST1" ); PadSpaces ( S,80 ); if (WhatIsSet & CSET_CellParams1) { PutRealF ( &(S[6 ]),a,9,3 ); PutRealF ( &(S[15]),b,9,3 ); PutRealF ( &(S[24]),c,9,3 ); } if (WhatIsSet & CSET_CellParams2) { PutRealF ( &(S[33]),alpha,7,2 ); PutRealF ( &(S[40]),beta ,7,2 ); PutRealF ( &(S[47]),gamma,7,2 ); } if ((WhatIsSet & CSET_SpaceGroup) || (spaceGroup[0])) strncpy ( &(S[55]),spaceGroup,IMin(11,strlen(spaceGroup)) ); if (WhatIsSet & CSET_ZValue) PutInteger ( &(S[66]),Z,4 ); f.WriteLine ( S ); } if ((WhatIsSet & CSET_OrigMatrix)==CSET_OrigMatrix) for (i=0;i<3;i++) { sprintf ( S,"ORIGX%1i",i+1); PadSpaces ( S,80 ); for (j=0;j<3;j++) PutRealF ( &(S[10+j*10]),o[i][j],10,6 ); PutRealF ( &(S[45]),t[i],10,5 ); f.WriteLine ( S ); } if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) for (i=0;i<3;i++) { sprintf ( S,"SCALE%1i",i+1); PadSpaces ( S,80 ); for (j=0;j<3;j++) PutRealF ( &(S[10+j*10]),s[i][j],10,6 ); PutRealF ( &(S[45]),u[i],10,5 ); f.WriteLine ( S ); } NCSMatrix.PDBASCIIDump ( f ); TVect .PDBASCIIDump ( f ); } int CMMDBCryst::GetCIF ( PCMMCIFData CIF, Boolean fixSpaceGroup ) { PCMMCIFStruct Struct; int RC; WhatIsSet = 0; Struct = CIF->GetStructure ( CIFCAT_CELL ); if (Struct) { RC = CIFGetReal ( a,Struct,CIFTAG_LENGTH_A ); if (!RC) RC = CIFGetReal ( b,Struct,CIFTAG_LENGTH_B ); if (!RC) RC = CIFGetReal ( c,Struct,CIFTAG_LENGTH_C ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= CSET_CellParams1; RC = CIFGetReal ( alpha,Struct,CIFTAG_ANGLE_ALPHA ); if (!RC) RC = CIFGetReal ( beta,Struct,CIFTAG_ANGLE_BETA ); if (!RC) RC = CIFGetReal ( gamma,Struct,CIFTAG_ANGLE_GAMMA ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= CSET_CellParams2; RC = CIFGetInteger ( Z,Struct,CIFTAG_Z_PDB ); if (RC==Error_UnrecognizedReal) return RC; if (!RC) WhatIsSet |= CSET_ZValue; } Struct = CIF->GetStructure ( CIFCAT_SYMMETRY ); if (Struct) { CIFGetString ( spaceGroup,Struct,CIFTAG_SPACE_GROUP_NAME_H_M, sizeof(spaceGroup),pstr("") ); CutSpaces ( spaceGroup,SCUTKEY_BEGEND ); if (fixSpaceGroup) FixSpaceGroup(); else strcpy ( spaceGroupFix,spaceGroup ); /* if (fixSpaceGroup) { if (!strcasecmp(spaceGroup,"P 21")) strcpy ( spaceGroup,"P 1 21 1" ); else if (!strcasecmp(spaceGroup,"C 2")) strcpy ( spaceGroup,"C 1 2 1" ); } */ if (SymOps.SetGroup(spaceGroupFix,syminfo_lib)==SYMOP_Ok) WhatIsSet |= CSET_SpaceGroup; } if ((a*b*c*alpha*beta*gamma==0.0) || ((a==1.0) && (b==1.0) && (c==1.0) && (alpha==90.0) && (beta==90.0) && (gamma==90.0) && (!strcmp(spaceGroup,"P 1")))) { WhatIsSet &= ~(CSET_CellParams1 | CSET_CellParams2 | CSET_SpaceGroup); WhatIsSet |= CSET_DummyCell; } Struct = CIF->GetStructure ( CIFCAT_DATABASE_PDB_MATRIX ); if (Struct) { RC = CIFGetReal ( o[0][0],Struct,CIFTAG_ORIGX11 ); if (!RC) RC = CIFGetReal ( o[0][1],Struct,CIFTAG_ORIGX12 ); if (!RC) RC = CIFGetReal ( o[0][2],Struct,CIFTAG_ORIGX13 ); if (!RC) RC = CIFGetReal ( o[1][0],Struct,CIFTAG_ORIGX21 ); if (!RC) RC = CIFGetReal ( o[1][1],Struct,CIFTAG_ORIGX22 ); if (!RC) RC = CIFGetReal ( o[1][2],Struct,CIFTAG_ORIGX23 ); if (!RC) RC = CIFGetReal ( o[2][0],Struct,CIFTAG_ORIGX31 ); if (!RC) RC = CIFGetReal ( o[2][1],Struct,CIFTAG_ORIGX32 ); if (!RC) RC = CIFGetReal ( o[2][2],Struct,CIFTAG_ORIGX33 ); if (!RC) RC = CIFGetReal ( t[0] ,Struct,CIFTAG_ORIGX_VECTOR1 ); if (!RC) RC = CIFGetReal ( t[1] ,Struct,CIFTAG_ORIGX_VECTOR2 ); if (!RC) RC = CIFGetReal ( t[2] ,Struct,CIFTAG_ORIGX_VECTOR3 ); if (RC) return RC; WhatIsSet |= CSET_OrigMatrix; } Struct = CIF->GetStructure ( CIFCAT_ATOM_SITES ); if (Struct) { RC = CIFGetReal ( s[0][0],Struct,CIFTAG_FRACT_TRANSF_MATRIX11 ); if (!RC) RC = CIFGetReal(s[0][1],Struct,CIFTAG_FRACT_TRANSF_MATRIX12); if (!RC) RC = CIFGetReal(s[0][2],Struct,CIFTAG_FRACT_TRANSF_MATRIX13); if (!RC) RC = CIFGetReal(s[1][0],Struct,CIFTAG_FRACT_TRANSF_MATRIX21); if (!RC) RC = CIFGetReal(s[1][1],Struct,CIFTAG_FRACT_TRANSF_MATRIX22); if (!RC) RC = CIFGetReal(s[1][2],Struct,CIFTAG_FRACT_TRANSF_MATRIX23); if (!RC) RC = CIFGetReal(s[2][0],Struct,CIFTAG_FRACT_TRANSF_MATRIX31); if (!RC) RC = CIFGetReal(s[2][1],Struct,CIFTAG_FRACT_TRANSF_MATRIX32); if (!RC) RC = CIFGetReal(s[2][2],Struct,CIFTAG_FRACT_TRANSF_MATRIX33); if (!RC) RC = CIFGetReal(u[0] ,Struct,CIFTAG_FRACT_TRANSF_VECTOR1 ); if (!RC) RC = CIFGetReal(u[1] ,Struct,CIFTAG_FRACT_TRANSF_VECTOR2 ); if (!RC) RC = CIFGetReal(u[2] ,Struct,CIFTAG_FRACT_TRANSF_VECTOR3 ); if (RC) return RC; WhatIsSet |= CSET_ScaleMatrix; } RC = NCSMatrix.GetCIF(CIF,ClassID_NCSMatrix); if (RC) return RC; RC = TVect.GetCIF(CIF,ClassID_TVect); return RC; } void CMMDBCryst::MakeCIF ( PCMMCIFData CIF ) { PCMMCIFStruct Struct; char S[200]; if (WhatIsSet & (CSET_CellParams1 | CSET_DummyCell)) { CIF->AddStructure ( CIFCAT_CELL,Struct ); Struct->PutReal ( a,CIFTAG_LENGTH_A,8 ); Struct->PutReal ( b,CIFTAG_LENGTH_B,8 ); Struct->PutReal ( c,CIFTAG_LENGTH_C,8 ); } if (WhatIsSet & (CSET_CellParams2 | CSET_DummyCell)) { CIF->AddStructure ( CIFCAT_CELL,Struct ); Struct->PutReal ( alpha,CIFTAG_ANGLE_ALPHA,8 ); Struct->PutReal ( beta ,CIFTAG_ANGLE_BETA, 8 ); Struct->PutReal ( gamma,CIFTAG_ANGLE_GAMMA,8 ); } if ((WhatIsSet & (CSET_SpaceGroup | CSET_DummyCell)) || (spaceGroup[0])) CIF->PutString ( strcpy_cs(S,spaceGroup),CIFCAT_SYMMETRY, CIFTAG_SPACE_GROUP_NAME_H_M ); if (WhatIsSet & (CSET_ZValue | CSET_DummyCell)) CIF->PutInteger ( Z,CIFCAT_CELL,CIFTAG_Z_PDB ); if ((WhatIsSet & CSET_OrigMatrix)==CSET_OrigMatrix) { CIF->AddStructure ( CIFCAT_DATABASE_PDB_MATRIX,Struct ); Struct->PutReal ( o[0][0],CIFTAG_ORIGX11 ,8 ); Struct->PutReal ( o[0][1],CIFTAG_ORIGX12 ,8 ); Struct->PutReal ( o[0][2],CIFTAG_ORIGX13 ,8 ); Struct->PutReal ( o[1][0],CIFTAG_ORIGX21 ,8 ); Struct->PutReal ( o[1][1],CIFTAG_ORIGX22 ,8 ); Struct->PutReal ( o[1][2],CIFTAG_ORIGX23 ,8 ); Struct->PutReal ( o[2][0],CIFTAG_ORIGX31 ,8 ); Struct->PutReal ( o[2][1],CIFTAG_ORIGX32 ,8 ); Struct->PutReal ( o[2][2],CIFTAG_ORIGX33 ,8 ); Struct->PutReal ( t[0] ,CIFTAG_ORIGX_VECTOR1,8 ); Struct->PutReal ( t[1] ,CIFTAG_ORIGX_VECTOR2,8 ); Struct->PutReal ( t[2] ,CIFTAG_ORIGX_VECTOR3,8 ); } if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) { CIF->AddStructure ( CIFCAT_ATOM_SITES,Struct ); Struct->PutReal ( s[0][0],CIFTAG_FRACT_TRANSF_MATRIX11,8 ); Struct->PutReal ( s[0][1],CIFTAG_FRACT_TRANSF_MATRIX12,8 ); Struct->PutReal ( s[0][2],CIFTAG_FRACT_TRANSF_MATRIX13,8 ); Struct->PutReal ( s[1][0],CIFTAG_FRACT_TRANSF_MATRIX21,8 ); Struct->PutReal ( s[1][1],CIFTAG_FRACT_TRANSF_MATRIX22,8 ); Struct->PutReal ( s[1][2],CIFTAG_FRACT_TRANSF_MATRIX23,8 ); Struct->PutReal ( s[2][0],CIFTAG_FRACT_TRANSF_MATRIX31,8 ); Struct->PutReal ( s[2][1],CIFTAG_FRACT_TRANSF_MATRIX32,8 ); Struct->PutReal ( s[2][2],CIFTAG_FRACT_TRANSF_MATRIX33,8 ); Struct->PutReal ( u[0] ,CIFTAG_FRACT_TRANSF_VECTOR1 ,8 ); Struct->PutReal ( u[1] ,CIFTAG_FRACT_TRANSF_VECTOR2 ,8 ); Struct->PutReal ( u[2] ,CIFTAG_FRACT_TRANSF_VECTOR3 ,8 ); } NCSMatrix.MakeCIF ( CIF ); TVect .MakeCIF ( CIF ); } cpstr OrthCode[6] = { cpstr("A/X0, C*/Z0"), // (standard brookhaven) cpstr("B/X0, A*/Z0"), cpstr("C/X0, B*/Z0"), cpstr("HEX A+B/X0, C*/Z0"), cpstr("A*/X0, C/Z0 (rollett)"), cpstr("A/X0, B*/Y0") }; cpstr getOrthCodeName ( int NCode ) { if ((NCode>0) && (NCode<=6)) return OrthCode[NCode-1]; return cpstr("CUSTOM"); } void CMMDBCryst::CalcCoordTransforms() { realtype rChk1,rChk2,Fac; int i,j,k; WhatIsSet &= ~CSET_Transforms; // clear the flag if ((WhatIsSet & CSET_CellParams)==CSET_CellParams) { // The 'cryst1' card was supplied. Calculate // standard orthogonalizations. CalcOrthMatrices(); if (NCode<0) NCode = 0; for (i=0;i<3;i++) { for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; RO[i][3] = 0.0; RO[3][i] = 0.0; } RO[3][3] = 1.0; Mat4Inverse ( RO,RF ); WhatIsSet |= CSET_Transforms; if (ignoreScalei) CellCheck = CCHK_Ok; else if ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix) { // All 'scalei' cards were supplied. Calculate // rotation and translation matrices and check // if they are in consistence with the cell. for (i=0;i<3;i++) { for (j=0;j<3;j++) RF[i][j] = s[i][j]; RF[i][3] = u[i]; RF[3][i] = 0.0; } RF[3][3] = 1.0; Mat4Inverse ( RF,RO ); // Find orthogonalisation type VolChk = RO[0][0]*(RO[1][1]*RO[2][2] - RO[1][2]*RO[2][1]) + RO[0][1]*(RO[1][2]*RO[2][0] - RO[1][0]*RO[2][2]) + RO[0][2]*(RO[1][0]*RO[2][1] - RO[1][1]*RO[2][0]); CellCheck = CCHK_Ok; if (Vol>0.0) { VolErr = fabs(VolChk-Vol)/Vol; if (VolErr>0.02) CellCheck |= CCHK_Error; else if (VolErr>0.1) CellCheck |= CCHK_Disagreement; } else CellCheck |= CCHK_NoCell; // try to find NCode NCode = -1; for (k=0;(k<6) && (NCode<0);k++) { NCode = k; for (i=0;i<3;i++) for (j=0;j<3;j++) { rChk1 = RO[i][j] + RR[k][i][j]; rChk2 = RO[i][j] - RR[k][i][j]; if (fabs(rChk1)>=0.1) { if (fabs(rChk2/rChk1)>0.01) NCode = -1; } } } // Correct inaccuracy of SCALEi input due to FORMAT, // replace RF,RO with RR[NCode][][] if possible. if (NCode>=0) { for (i=0;i<3;i++) for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; Mat4Inverse ( RO,RF ); } else CellCheck |= CCHK_NoOrthCode; if ((u[0]!=0.0) || (u[1]!=0.0) || (u[2]!=0.0)) CellCheck |= CCHK_Translations; } // Generate ROU and RFU for AnisoU stuff RFU[3][3] = 1.0; for (i=0;i<3;i++) { Fac = sqrt(RF[i][0]*RF[i][0] + RF[i][1]*RF[i][1] + RF[i][2]*RF[i][2]); RFU[i][0] = RF[i][0]/Fac; RFU[i][1] = RF[i][1]/Fac; RFU[i][2] = RF[i][2]/Fac; RFU[i][3] = 0.0; RFU[3][i] = 0.0; } RFU[3][3] = 1.0; Mat4Inverse ( RFU,ROU ); } else CellCheck |= CCHK_NoCell; } void CMMDBCryst::RWBROOKReadPrintout() { int i,j; if ((WhatIsSet & CSET_CellParams)==CSET_CellParams) { printf ( " MATRICES DERIVED FROM CRYST1" " CARD IN COORDINATE FILE\n\n\n" " RF " " RO\n\n" ); for (i=0;i<4;i++) { printf ( " " ); for (j=0;j<4;j++) printf ( "%8.3f",RF[i][j] ); printf ( " " ); for (j=0;j<4;j++) printf ( "%8.3f",RO[i][j] ); printf ( "\n" ); } printf ( "\n" ); } else printf ( "\n $WARNING: NO CRYST CARDS READ$\n" ); if ((WhatIsSet & CSET_ScaleMatrix)!=CSET_ScaleMatrix) printf ( "\n $WARNING: NO SCALE CARDS READ$\n" ); } void CMMDBCryst::CalcOrthMatrices() { // Calculates matrices for standard orthogonalizations // and the cell volume. // The matrices are stored in array RR realtype Conv,Alph,Bet,Gamm,Sum,V; realtype sinA,cosA,sinB,cosB,sinG,cosG; realtype sinAS,cosAS,sinBS,cosBS,sinGS,cosGS; int i,j,k; if ((WhatIsSet & CSET_CellParams)!=CSET_CellParams) return; Conv = Pi/180.0; Alph = alpha*Conv; Bet = beta *Conv; Gamm = gamma*Conv; Sum = (Alph+Bet+Gamm)*0.5; V = sqrt(sin(Sum-Alph)*sin(Sum-Bet)*sin(Sum-Gamm)*sin(Sum)); Vol = 2.0*a*b*c*V; // Precaution measure for erratic use of the library if ((fabs(Alph)<1.0e-6) || (fabs(Bet)<1.0e-6) || (fabs(Gamm)<1.0e-6)) { as = 0.0; bs = 0.0; cs = 0.0; alphas = 0.0; betas = 0.0; gammas = 0.0; for (k=0;k<6;k++) { AC[k] = 0.0; for (i=0;i<3;i++) { for (j=0;j<3;j++) RR[k][i][j] = 0.0; RR[k][i][i] = 1.0; } } return; } sinA = sin(Alph); cosA = cos(Alph); sinB = sin(Bet); cosB = cos(Bet); sinG = sin(Gamm); cosG = cos(Gamm); cosAS = (cosG*cosB-cosA) / (sinB*sinG); sinAS = sqrt(1.0-cosAS*cosAS); cosBS = (cosA*cosG-cosB) / (sinA*sinG); sinBS = sqrt(1.0-cosBS*cosBS); cosGS = (cosA*cosB-cosG) / (sinA*sinB); sinGS = sqrt(1.0-cosGS*cosGS); as = b*c*sinA/Vol; bs = c*a*sinB/Vol; cs = a*b*sinG/Vol; alphas = atan2(sinAS,cosAS)/Conv; betas = atan2(sinBS,cosBS)/Conv; gammas = atan2(sinGS,cosGS)/Conv; // ---- Set useful things for calculating dstar AC[0] = as*as; AC[1] = bs*bs; AC[2] = cs*cs; AC[3] = 2.0*bs*cs*cosAS; AC[4] = 2.0*cs*as*cosBS; AC[5] = 2.0*as*bs*cosGS; // ---- Zero matrices for (k=0;k<6;k++) for (i=0;i<3;i++) for (j=0;j<3;j++) RR[k][i][j] = 0.0; // ---- Calculate matrices // ---- XO along a Zo along c* RR[0][0][0] = a; RR[0][0][1] = b*cosG; RR[0][0][2] = c*cosB; RR[0][1][1] = b*sinG; RR[0][1][2] = -c*sinB*cosAS; RR[0][2][2] = c*sinB*sinAS; // ---- XO along b Zo along a* RR[1][0][0] = a*cosG; RR[1][0][1] = b; RR[1][0][2] = c*cosA; RR[1][1][0] = -a*sinG*cosBS; RR[1][1][2] = c*sinA; RR[1][2][0] = a*sinG*sinBS; // ---- XO along c Zo along b* RR[2][0][0] = a*cosB; RR[2][0][1] = b*cosA; RR[2][0][2] = c; RR[2][1][0] = a*sinB; RR[2][1][1] = -b*sinA*cosGS; RR[2][2][1] = b*sinA*sinGS; // ---- trigonal only - XO along a+b YO alon a-b Zo along c* RR[3][0][0] = a/2.0; RR[3][0][1] = a/2.0; RR[3][1][0] = -a*sinG; RR[3][1][1] = a*sinG; RR[3][2][2] = c; // ---- XO along a*, ZO along c RR[4][0][0] = a*sinB*sinGS; RR[4][1][0] = -a*sinB*cosGS; RR[4][1][1] = b*sinA; RR[4][2][0] = a*cosB; RR[4][2][1] = b*cosA; RR[4][2][2] = c; // ---- Grr*! to Gerard Bricogne - his setting for P1 in SKEW. // XO along a, Y0 along b* RR[5][0][0] = a; RR[5][0][1] = b*cosG; RR[5][0][2] = c*cosB; RR[5][1][1] = b*sinG*sinAS; RR[5][2][1] = -b*sinG*cosAS; RR[5][2][2] = c*sinB; } Boolean CMMDBCryst::areMatrices() { // returns True if the orthogonal-to-fractional and // fractional-to-orthogonal matrices are defined return (WhatIsSet & CSET_Transforms)!=0x0000; } Boolean CMMDBCryst::Frac2Orth ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ) { if (areMatrices()) { xx = RO[0][0]*x + RO[0][1]*y + RO[0][2]*z + RO[0][3]; yy = RO[1][0]*x + RO[1][1]*y + RO[1][2]*z + RO[1][3]; zz = RO[2][0]*x + RO[2][1]*y + RO[2][2]*z + RO[2][3]; return True; } else { xx = x; yy = y; zz = z; return False; } } Boolean CMMDBCryst::Orth2Frac ( realtype x, realtype y, realtype z, realtype & xx, realtype & yy, realtype & zz ) { if (areMatrices()) { xx = RF[0][0]*x + RF[0][1]*y + RF[0][2]*z + RF[0][3]; yy = RF[1][0]*x + RF[1][1]*y + RF[1][2]*z + RF[1][3]; zz = RF[2][0]*x + RF[2][1]*y + RF[2][2]*z + RF[2][3]; return True; } else { xx = x; yy = y; zz = z; return False; } } Boolean CMMDBCryst::Frac2Orth ( mat44 & F, mat44 & T ) { mat44 A; if (areMatrices()) { Mat4Mult ( A,F,RF ); Mat4Mult ( T,RO,A ); return True; } else { Mat4Init ( T ); return False; } } Boolean CMMDBCryst::Orth2Frac ( mat44 & T, mat44 & F ) { mat44 A; if (areMatrices()) { Mat4Mult ( A,T,RO ); Mat4Mult ( F,RF,A ); return True; } else { Mat4Init ( F ); return False; } } int CMMDBCryst::GetNumberOfSymOps() { return SymOps.GetNofSymOps(); } pstr CMMDBCryst::GetSymOp ( int Nop ) { return SymOps.GetSymOp ( Nop ); } int CMMDBCryst::GetTMatrix ( mat44 & TMatrix, int Nop, int cellshift_a, int cellshift_b, int cellshift_c, PCSymOps symOpers ) { // // GetTMatrix(..) calculates and returns the coordinate transformation // matrix, which converts orthogonal coordinates according to the // symmetry operation Nop and places them into unit cell shifted by // cellshift_a a's, cellshift_b b's and cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // mat44 fm; int i,j,k; if (cellshift_a<=-MaxInt4) { k = GetFractMatrix ( fm,Nop,0,0,0,symOpers ); fm[0][3] = frac(fm[0][3]); fm[1][3] = frac(fm[1][3]); fm[2][3] = frac(fm[2][3]); } else k = GetFractMatrix ( fm,Nop,cellshift_a,cellshift_b,cellshift_c, symOpers ); if (k) { Mat4Init ( TMatrix ); return k; } // transformation back to orthogonal coordinates for (i=0;i<3;i++) { for (j=0;j<4;j++) { TMatrix[i][j] = 0.0; for (k=0;k<3;k++) TMatrix[i][j] += RO[i][k]*fm[k][j]; } TMatrix[i][3] += RO[i][3]; } TMatrix[3][0] = 0.0; TMatrix[3][1] = 0.0; TMatrix[3][2] = 0.0; TMatrix[3][3] = 1.0; return 0; } int CMMDBCryst::GetUCTMatrix ( mat44 & TMatrix, int Nop, realtype x, realtype y, realtype z, int cellshift_a, int cellshift_b, int cellshift_c, PCSymOps symOpers ) { // // GetUCTMatrix(..) calculates and returns the coordinate // transformation matrix, which converts orthogonal coordinates // according to the symmetry operation Nop. Translation part of // the matrix is being chosen such that point (x,y,z) has least // distance to the center of primary (333) unit cell, and then // it is shifted by cellshift_a a's, cellshift_b b's and // cellshift_c c's. // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // mat44 fm,tm; vect3 ft; realtype x0,y0,z0, dx,dy,dz, d,d0; int i,j,k, ic,jc,kc; k = GetFractMatrix ( fm,Nop,0,0,0,symOpers ); if (k) { Mat4Init ( TMatrix ); return k; } fm[0][3] = frac(fm[0][3]) + cellshift_a; fm[1][3] = frac(fm[1][3]) + cellshift_b; fm[2][3] = frac(fm[2][3]) + cellshift_c; Frac2Orth ( cellshift_a+0.5,cellshift_b+0.5,cellshift_c+0.5, x0,y0,z0 ); // transformation back to orthogonal coordinates for (i=0;i<3;i++) for (j=0;j<3;j++) { tm[i][j] = 0.0; for (k=0;k<3;k++) tm[i][j] += RO[i][k]*fm[k][j]; } tm[3][0] = 0.0; tm[3][1] = 0.0; tm[3][2] = 0.0; tm[3][3] = 1.0; d0 = MaxReal; for (ic=-3;ic<3;ic++) for (jc=-3;jc<3;jc++) for (kc=-3;kc<3;kc++) { ft[0] = fm[0][3] + ic; ft[1] = fm[1][3] + jc; ft[2] = fm[2][3] + kc; for (i=0;i<3;i++) { tm[i][3] = 0.0; for (k=0;k<3;k++) tm[i][3] += RO[i][k]*ft[k]; tm[i][3] += RO[i][3]; } dx = tm[0][0]*x + tm[0][1]*y + tm[0][2]*z + tm[0][3] - x0; dy = tm[1][0]*x + tm[1][1]*y + tm[1][2]*z + tm[1][3] - y0; dz = tm[2][0]*x + tm[2][1]*y + tm[2][2]*z + tm[2][3] - z0; d = dx*dx + dy*dy + dz*dz; if (dGetTMatrix ( tm,Nop ); else k = SymOps.GetTMatrix ( tm,Nop ); if (!k) { if (!areMatrices()) k = 2; if (!isCellParameters()) k = 3; } else k = 1; if (k) { Mat4Init ( TMatrix ); return k; } // transformation to fractional coordinates + symmetry operation for (i=0;i<3;i++) { for (j=0;j<4;j++) { TMatrix[i][j] = 0.0; for (k=0;k<3;k++) TMatrix[i][j] += tm[i][k]*RF[k][j]; } TMatrix[i][3] += tm[i][3]; // symmetry operation shift } // cell shift TMatrix[0][3] += cellshift_a; TMatrix[1][3] += cellshift_b; TMatrix[2][3] += cellshift_c; TMatrix[3][0] = 0.0; TMatrix[3][1] = 0.0; TMatrix[3][2] = 0.0; TMatrix[3][3] = 1.0; return 0; } int CMMDBCryst::GetSymOpMatrix ( mat44 & TMatrix, int Nop ) { // // GetSymOpMatrix(..) returns the transformation matrix for // Nop-th symmetry operator in the space group // // Return 0 means everything's fine, // 1 there's no symmetry operation Nop defined // 2 fractionalizing/orthogonalizing matrices were not // calculated // 3 cell parameters were not set up. // return SymOps.GetTMatrix ( TMatrix,Nop ); } Boolean CMMDBCryst::Cryst2Orth ( rvector U ) { mat33 A,AT,Tmp,TmpMat; realtype BB; int i,j,k; if (areMatrices()) { // if orth2frac and frac2orth matrices are defined // U is in upper triangular form Tmp[0][0] = U[0]; Tmp[1][1] = U[1]; Tmp[2][2] = U[2]; Tmp[0][1] = U[3]; Tmp[1][0] = U[3]; Tmp[0][2] = U[4]; Tmp[2][0] = U[4]; Tmp[1][2] = U[5]; Tmp[2][1] = U[5]; // ROU is a 4x4 matrix, but we only use the upper 3x3 submatrix for (i=0;i<3;i++) for (j=0;j<3;j++) { A [j][i] = ROU[j][i]; AT[i][j] = ROU[j][i]; } // TmpMat = Tmp*AT for (i=0;i<3;i++) for (j=0;j<3;j++) { BB = 0.0; for (k=0;k<3;k++) BB += Tmp[i][k]*AT[k][j]; TmpMat[i][j] = BB; } // Tmp = A*TmpMat for (i=0;i<3;i++) for (j=0;j<3;j++) { BB = 0.0; for (k=0;k<3;k++) BB += A[i][k]*TmpMat[k][j]; Tmp[i][j] = BB; } U[0] = Tmp[0][0]; U[1] = Tmp[1][1]; U[2] = Tmp[2][2]; U[3] = Tmp[0][1]; U[4] = Tmp[0][2]; U[5] = Tmp[1][2]; return True; } return False; } Boolean CMMDBCryst::Orth2Cryst ( rvector U ) { mat33 A,AT,Tmp,TmpMat; realtype BB; int i,j,k; if (areMatrices()) { Tmp[0][0] = U[0]; Tmp[1][1] = U[1]; Tmp[2][2] = U[2]; Tmp[0][1] = U[3]; Tmp[1][0] = U[3]; Tmp[0][2] = U[4]; Tmp[2][0] = U[4]; Tmp[1][2] = U[5]; Tmp[2][1] = U[5]; for (i=0;i< 3;i++) for (j=0;j< 3;j++) { A [j][i] = RFU[j][i]; AT[i][j] = RFU[j][i]; } // TmpMat = Tmp*AT for (i=0;i< 3;i++) for (j=0;j< 3;j++) { BB = 0.0; for (k=0;k< 3;k++) BB += Tmp[i][k]*AT[k][j]; TmpMat[i][j] = BB; } // Tmp = A*TmpMat for (i=0;i< 3;i++) for (j=0;j< 3;j++) { BB = 0.0; for (k=0;k< 3;k++) BB += A[i][k]*TmpMat[k][j]; Tmp[i][j] = BB; } U[0] = Tmp[0][0]; U[1] = Tmp[1][1]; U[2] = Tmp[2][2]; U[3] = Tmp[0][1]; U[4] = Tmp[0][2]; U[5] = Tmp[1][2]; return True; } return False; } void CMMDBCryst::SetCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { // this function should be used for changing the cell parameters int i,j; if ((cell_a>0.0) && (cell_b>0.0) && (cell_c>0.0) && (cell_alpha!=0.0) && (cell_beta!=0.0) && (cell_gamma!=0.0)) { if (OrthCode>0) NCode = OrthCode-1; else NCode = 0; a = cell_a; b = cell_b; c = cell_c; alpha = cell_alpha; beta = cell_beta; gamma = cell_gamma; WhatIsSet |= CSET_CellParams; // calculate matrices for (i=0;i<4;i++) { for (j=0;j<4;j++) { RO [i][j] = 0.0; RF [i][j] = 0.0; ROU[i][j] = 0.0; RFU[i][j] = 0.0; } RO [i][i] = 1.0; RF [i][i] = 1.0; ROU[i][i] = 1.0; RFU[i][i] = 1.0; } CalcCoordTransforms(); if (!(CellCheck & CCHK_NoOrthCode)) { for (i=0;i<3;i++) { for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; RO[i][3] = 0.0; RO[3][i] = 0.0; } RO[3][3] = 1.0; Mat4Inverse ( RO,RF ); } WhatIsSet |= CSET_Transforms; } else WhatIsSet &= ~(CSET_CellParams | CSET_Transforms); } void CMMDBCryst::SetSyminfoLib ( cpstr syminfoLib ) { CreateCopy ( syminfo_lib,syminfoLib ); } pstr CMMDBCryst::GetSyminfoLib() { return syminfo_lib; } int CMMDBCryst::SetSpaceGroup ( cpstr spGroup ) { // This function does not attempt to fix the space group int RC,l; RC = SYMOP_UnknownSpaceGroup; WhatIsSet &= ~CSET_SpaceGroup; if (spGroup) { if (spGroup[0]) { l = IMin ( strlen(spGroup),sizeof(spaceGroup)-1 ); strcpy_ncss ( spaceGroup,spGroup,l ); strcpy ( spaceGroupFix,spaceGroup ); if (spaceGroup[0]) { RC = SymOps.SetGroup ( spaceGroup,syminfo_lib ); // RC = SymOps.SetGroup ( spGroup,syminfo_lib ); // strncpy ( spaceGroup,spGroup,l ); // spaceGroup[l] = char(0); if (RC==SYMOP_Ok) WhatIsSet |= CSET_SpaceGroup; } } } return RC; } void CMMDBCryst::PutCell ( realtype cell_a, realtype cell_b, realtype cell_c, realtype cell_alpha, realtype cell_beta, realtype cell_gamma, int OrthCode ) { // this function should be used for setting the cell parameters int i,j; if ((cell_a!=0.0) || (OrthCode>0)) { a = cell_a; b = cell_b; c = cell_c; alpha = cell_alpha; beta = cell_beta; gamma = cell_gamma; WhatIsSet |= CSET_CellParams; } if (OrthCode>0) { // calculate matrices NCode = OrthCode-1; CalcOrthMatrices(); for (i=0;i<3;i++) { for (j=0;j<3;j++) RO[i][j] = RR[NCode][i][j]; RO[i][3] = 0.0; RO[3][i] = 0.0; } RO[3][3] = 1.0; Mat4Inverse ( RO,RF ); WhatIsSet |= CSET_Transforms; } else WhatIsSet &= ~CSET_Transforms; for (i=0;i<3;i++) { for (j=0;j<3;j++) s[i][j] = RF[i][j]; u[i] = RF[i][3]; } WhatIsSet |= CSET_ScaleMatrix; } Boolean CMMDBCryst::isScaleMatrix() { return ((WhatIsSet & CSET_ScaleMatrix)==CSET_ScaleMatrix); } Boolean CMMDBCryst::isCellParameters() { return ((WhatIsSet & CSET_CellParams)==CSET_CellParams); } Boolean CMMDBCryst::isNCSMatrix() { return (NCSMatrix.Length()>0); } int CMMDBCryst::GetNumberOfNCSMatrices() { return NCSMatrix.Length(); } int CMMDBCryst::GetNumberOfNCSMates() { // Returns the number of NCS mates not given in the file (iGiven==0) int i,l,iG; PCNCSMatrix NCSM; iG = 0; l = NCSMatrix.Length(); for (i=0;iiGiven) iG++; } } return iG; } Boolean CMMDBCryst::GetNCSMatrix ( int NCSMatrixNo, mat33 & ncs_m, vect3 & ncs_v ) { int i,j; PCNCSMatrix NCSM; NCSM = PCNCSMatrix(NCSMatrix.GetContainerClass(NCSMatrixNo)); if (NCSM) { for (i=0;i<3;i++) { for (j=0;j<3;j++) ncs_m[i][j] = NCSM->m[i][j]; ncs_v[i] = NCSM->v[i]; } return True; } return False; } Boolean CMMDBCryst::GetNCSMatrix ( int NCSMatrixNo, mat44 & ncs_m, int & iGiven ) { int i,j; PCNCSMatrix NCSM; NCSM = PCNCSMatrix(NCSMatrix.GetContainerClass(NCSMatrixNo)); if (NCSM) { for (i=0;i<3;i++) { for (j=0;j<3;j++) ncs_m[i][j] = NCSM->m[i][j]; ncs_m[i][3] = NCSM->v[i]; } ncs_m[3][0] = 0.0; ncs_m[3][1] = 0.0; ncs_m[3][2] = 0.0; ncs_m[3][3] = 1.0; iGiven = NCSM->iGiven; return True; } else { for (i=0;i<4;i++) { for (j=0;j<4;j++) ncs_m[i][j] = 0.0; ncs_m[i][i] = 1.0; } return False; } } int CMMDBCryst::AddNCSMatrix ( mat33 & ncs_m, vect3 & ncs_v, int iGiven ) { PCNCSMatrix ncsMatrix; ncsMatrix = new CNCSMatrix(); ncsMatrix->SetNCSMatrix ( NCSMatrix.Length()+1,ncs_m,ncs_v, iGiven ); NCSMatrix.AddData ( ncsMatrix ); return ncsMatrix->serNum; } void CMMDBCryst::GetRCell ( realtype & cell_as, realtype & cell_bs, realtype & cell_cs, realtype & cell_alphas, realtype & cell_betas, realtype & cell_gammas, realtype & vols ) { cell_as = as; cell_bs = bs; cell_cs = cs; cell_alphas = alphas; cell_betas = betas; cell_gammas = gammas; if (Vol!=0.0) vols = 1.0/Vol; else vols = 0.0; } void CMMDBCryst::GetCell ( realtype & cell_a, realtype & cell_b, realtype & cell_c, realtype & cell_alpha, realtype & cell_beta, realtype & cell_gamma, realtype & vol ) { if (WhatIsSet & CSET_CellParams) { cell_a = a; cell_b = b; cell_c = c; cell_alpha = alpha; cell_beta = beta; cell_gamma = gamma; vol = Vol; } else { cell_a = 0.0; cell_b = 0.0; cell_c = 0.0; cell_alpha = 0.0; cell_beta = 0.0; cell_gamma = 0.0; vol = 0.0; } } pstr CMMDBCryst::GetSpaceGroup() { if (WhatIsSet & CSET_SpaceGroup) return spaceGroup; else return NULL; } pstr CMMDBCryst::GetSpaceGroupFix() { if (WhatIsSet & CSET_SpaceGroup) return spaceGroupFix; else return NULL; } void CMMDBCryst::Copy ( PCMMDBCryst Cryst ) { int i,j,k; if (Cryst) { a = Cryst->a; b = Cryst->b; c = Cryst->c; alpha = Cryst->alpha; beta = Cryst->beta; gamma = Cryst->gamma; for (i=0;i<4;i++) for (j=0;j<4;j++) { RO [i][j] = Cryst->RO [i][j]; RF [i][j] = Cryst->RF [i][j]; ROU[i][j] = Cryst->ROU[i][j]; RFU[i][j] = Cryst->RFU[i][j]; } for (i=0;i<3;i++) { for (j=0;j<3;j++) { o[i][j] = Cryst->o[i][j]; s[i][j] = Cryst->s[i][j]; for (k=0;k<6;k++) RR[k][i][j] = Cryst->RR[k][i][j]; } t[i] = Cryst->t[i]; u[i] = Cryst->u[i]; } Vol = Cryst->Vol; NCode = Cryst->NCode; Z = Cryst->Z; CellCheck = Cryst->CellCheck; WhatIsSet = Cryst->WhatIsSet; strcpy ( spaceGroup ,Cryst->spaceGroup ); strcpy ( spaceGroupFix,Cryst->spaceGroupFix ); NCSMatrix.Copy ( &(Cryst->NCSMatrix) ); TVect .Copy ( &(Cryst->TVect) ); SymOps .Copy ( &(Cryst->SymOps) ); as = Cryst->as; bs = Cryst->bs; cs = Cryst->cs; alphas = Cryst->alphas; betas = Cryst->betas; gammas = Cryst->betas; VolChk = Cryst->VolChk; VolErr = Cryst->VolErr; for (k=0;k<6;k++) AC[k] = Cryst->AC[k]; } else { NCSMatrix.FreeContainer(); TVect .FreeContainer(); WhatIsSet = 0; } } void CMMDBCryst::write ( RCFile f ) { int i,j,k; byte Version=3; f.WriteByte ( &Version ); f.WriteWord ( &WhatIsSet ); f.WriteReal ( &a ); f.WriteReal ( &b ); f.WriteReal ( &c ); f.WriteReal ( &alpha ); f.WriteReal ( &beta ); f.WriteReal ( &gamma ); f.WriteWord ( &CellCheck ); f.WriteBool ( &ignoreScalei ); for (i=0;i<4;i++) for (j=0;j<4;j++) { f.WriteReal ( &(RO [i][j]) ); f.WriteReal ( &(RF [i][j]) ); f.WriteReal ( &(ROU[i][j]) ); f.WriteReal ( &(RFU[i][j]) ); } for (i=0;i<3;i++) { for (j=0;j<3;j++) { f.WriteReal ( &(o[i][j]) ); f.WriteReal ( &(s[i][j]) ); for (k=0;k<6;k++) f.WriteReal ( &(RR[k][i][j]) ); } f.WriteReal ( &(t[i]) ); f.WriteReal ( &(u[i]) ); } f.WriteReal ( &Vol ); f.WriteReal ( &VolChk ); f.WriteReal ( &VolErr ); f.WriteInt ( &NCode ); f.WriteInt ( &Z ); f.WriteTerLine ( spaceGroup ,False ); f.WriteTerLine ( spaceGroupFix,False ); for (i=0;i<6;i++) f.WriteReal ( &(AC[6]) ); f.WriteReal ( &as ); f.WriteReal ( &bs ); f.WriteReal ( &cs ); f.WriteReal ( &alphas ); f.WriteReal ( &betas ); f.WriteReal ( &gammas ); NCSMatrix.write ( f ); TVect .write ( f ); SymOps .write ( f ); } void CMMDBCryst::read ( RCFile f ) { int i,j,k; byte Version; f.ReadByte ( &Version ); f.ReadWord ( &WhatIsSet ); f.ReadReal ( &a ); f.ReadReal ( &b ); f.ReadReal ( &c ); f.ReadReal ( &alpha ); f.ReadReal ( &beta ); f.ReadReal ( &gamma ); f.ReadWord ( &CellCheck ); if (Version>2) f.ReadBool ( &ignoreScalei ); else ignoreScalei = False; for (i=0;i<4;i++) for (j=0;j<4;j++) { f.ReadReal ( &(RO [i][j]) ); f.ReadReal ( &(RF [i][j]) ); f.ReadReal ( &(ROU[i][j]) ); f.ReadReal ( &(RFU[i][j]) ); } for (i=0;i<3;i++) { for (j=0;j<3;j++) { f.ReadReal ( &(o[i][j]) ); f.ReadReal ( &(s[i][j]) ); for (k=0;k<6;k++) f.ReadReal ( &(RR[k][i][j]) ); } f.ReadReal ( &(t[i]) ); f.ReadReal ( &(u[i]) ); } f.ReadReal ( &Vol ); f.ReadReal ( &VolChk ); f.ReadReal ( &VolErr ); f.ReadInt ( &NCode ); f.ReadInt ( &Z ); f.ReadTerLine ( spaceGroup,False ); if (Version>1) f.ReadTerLine ( spaceGroupFix,False ); else strcpy ( spaceGroupFix,spaceGroup ); for (i=0;i<6;i++) f.ReadReal ( &(AC[6]) ); f.ReadReal ( &as ); f.ReadReal ( &bs ); f.ReadReal ( &cs ); f.ReadReal ( &alphas ); f.ReadReal ( &betas ); f.ReadReal ( &gammas ); NCSMatrix.read ( f ); TVect .read ( f ); SymOps .read ( f ); } MakeStreamFunctions(CMMDBCryst) // =================================================================== void TestCryst() { // reads from 'in.cryst', writes into // 'out.cryst' and 'abin.cryst' CFile f; char S[81]; PCMMDBCryst Cryst; Cryst = new CMMDBCryst(); f.assign ( pstr("in.cryst"),True ); if (f.reset()) { while (!f.FileEnd()) { f.ReadLine ( S,sizeof(S) ); Cryst->ConvertPDBString ( S,False ); } f.shut(); } else { printf ( " Can't open input file 'in.chain' \n" ); delete Cryst; return; } f.assign ( pstr("out.cryst"),True ); if (f.rewrite()) { Cryst->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'out.cryst' \n" ); delete Cryst; return; } f.assign ( pstr("mmdb.cryst.bin"),False ); if (f.rewrite()) { Cryst->write ( f ); f.shut(); } else { printf ( " Can't open binary cryst file for writing.\n" ); delete Cryst; return; } delete Cryst; printf ( " Cryst deleted.\n" ); Cryst = new CMMDBCryst(); if (f.reset()) { Cryst->read ( f ); f.shut(); } else { printf ( " Can't open binary cryst file for reading.\n" ); delete Cryst; return; } f.assign ( pstr("abin.cryst"),True ); if (f.rewrite()) { Cryst->PDBASCIIDump ( f ); f.shut(); } else printf ( " Can't open output file 'abin.cryst' \n" ); delete Cryst; } mmdb-1.23.2.1/src/mmdb_bondmngr.cpp0000644000175100017510000000662311475665501013721 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_bondmngr // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBBondManager ( MMDB bonds maker ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __MMDB_BondMngr__ #include "mmdb_bondmngr.h" #endif #ifndef __MMDB_Graph__ #include "mmdb_graph.h" #endif // ===================== CMMDBBondManager ===================== CMMDBBondManager::CMMDBBondManager() : CMMDBSelManager() { } CMMDBBondManager::CMMDBBondManager ( RPCStream Object ) : CMMDBSelManager(Object) { } CMMDBBondManager::~CMMDBBondManager() {} void CMMDBBondManager::MakeBonds ( Boolean calc_only ) { UNUSED_ARGUMENT(calc_only); PCModel model; PCChain chain; PCResidue res; CGraph graph; PPCVertex V; PPCEdge E; int i, im,ic,ir, nV,nE, k1,k2; RemoveBonds(); for (im=0;imnChains;ic++) { chain = model->Chain[ic]; if (chain) for (ir=0;irnResidues;ir++) { res = chain->Residue[ir]; if (res) { graph.MakeGraph ( res,NULL ); graph.GetVertices ( V,nV ); graph.GetEdges ( E,nE ); for (i=0;iGetVertex1()]->GetUserID(); k2 = V[E[i]->GetVertex2()]->GetUserID(); res->atom[k1]->AddBond ( res->atom[k2],E[i]->GetType() ); res->atom[k2]->AddBond ( res->atom[k1],E[i]->GetType() ); } } } } } } void CMMDBBondManager::RemoveBonds() { int i; for (i=0;iFreeBonds(); } // ------------------- Stream functions ---------------------- void CMMDBBondManager::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CMMDBSelManager::write ( f ); } void CMMDBBondManager::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CMMDBSelManager::read ( f ); } MakeStreamFunctions(CMMDBBondManager) mmdb-1.23.2.1/src/mmdb_cifdefs.h0000644000175100017510000004523511475666363013174 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 02.01.00 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDBF_Defs // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // // CIF Definitions // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_CIFDefs__ #define __MMDB_CIFDefs__ #ifndef __MatType__ #include "mattype_.h" #endif // ------------------------------------------------------------------ // Mode IDs #define CIF_NDB 0 #define CIF_PDBX 1 // CIF IDs for mode-dependent CIF names #define CAT_POLY_SEQ_SCHEME 1 #define TAG_CHAIN_ID 101 #define TAG_DB_ACCESSION 102 #define TAG_DB_ALIGN_BEG 103 #define TAG_DB_ALIGN_BEG_INS_CODE 104 #define TAG_DB_ALIGN_END 105 #define TAG_DB_ALIGN_END_INS_CODE 106 #define TAG_ID_CODE 107 #define TAG_SEQ_CHAIN_ID 108 #define TAG_SEQ_ALIGN_BEG 109 #define TAG_SEQ_ALIGN_BEG_INS_CODE 110 #define TAG_SEQ_ALIGN_END 111 #define TAG_SEQ_ALIGN_END_INS_CODE 112 // CIFName(..) gives CIF name according to CIF Mode. extern pstr CIFName ( int NameID, int Mode ); // ------------------------------------------------------------------ #define CIFCAT_ATOM_SITE pstr("_atom_site") #define CIFCAT_ATOM_SITE_ANISOTROP pstr("_atom_site_anisotrop") #define CIFCAT_ATOM_SITES pstr("_atom_sites") #define CIFCAT_AUDIT_AUTHOR pstr("_audit_author") #define CIFCAT_CELL pstr("_cell") #define CIFCAT_CHEM_COMP pstr("_chem_comp") #define CIFCAT_CITATION pstr("_citation") #define CIFCAT_DATABASE pstr("_database") #define CIFCAT_DATABASE_PDB_CAVEAT pstr("_database_pdb_caveat") #define CIFCAT_DATABASE_PDB_MATRIX pstr("_database_pdb_matrix") #define CIFCAT_DATABASE_PDB_REV pstr("_database_pdb_rev") #define CIFCAT_DATABASE_PDB_TVECT pstr("_database_pdb_tvect") #define CIFCAT_ENTITY pstr("_entity") #define CIFCAT_EXPTL pstr("_exptl") #define CIFCAT_NDB_DATABASE_REMARK pstr("_ndb_database_remark") #define CIFCAT_NDB_NONSTANDARD_LIST pstr("_ndb_nonstandard_list") #define CIFCAT_NDB_POLY_SEQ_SCHEME pstr("_ndb_poly_seq_scheme") #define CIFCAT_PDBX_POLY_SEQ_SCHEME pstr("_pdbx_poly_seq_scheme") #define CIFCAT_SPRSDE pstr("_ndb_database_pdb_obs_spr") #define CIFCAT_STRUCT pstr("_struct") #define CIFCAT_STRUCT_ASYM pstr("_struct_asym") #define CIFCAT_STRUCT_CONF pstr("_struct_conf") #define CIFCAT_STRUCT_CONN pstr("_struct_conn") #define CIFCAT_STRUCT_LINKR cpstr("_struct_linkr") #define CIFCAT_STRUCT_KEYWORDS pstr("_struct_keywords") #define CIFCAT_STRUCT_NCS_OPER pstr("_struct_ncs_oper") #define CIFCAT_STRUCT_REF pstr("_struct_ref") #define CIFCAT_STRUCT_REF_SEQ pstr("_struct_ref_seq") #define CIFCAT_STRUCT_REF_SEQ_DIF pstr("_struct_ref_seq_dif") #define CIFCAT_STRUCT_SHEET pstr("_struct_sheet") #define CIFCAT_STRUCT_SHEET_RANGE pstr("_struct_sheet_range") #define CIFCAT_STRUCT_SHEET_ORDER pstr("_struct_sheet_order") #define CIFCAT_STRUCT_SHEET_HBOND pstr("_struct_sheet_hbond") #define CIFCAT_SYMMETRY pstr("_symmetry") #define CIFCAT_OBSLTE pstr("_ndb_database_pdb_obs_spr") #define CIFTAG_ANGLE_ALPHA pstr("angle_alpha") #define CIFTAG_ANGLE_BETA pstr("angle_beta") #define CIFTAG_ANGLE_GAMMA pstr("angle_gamma") #define CIFTAG_ASYM_ID pstr("asym_id") #define CIFTAG_ATOM_TYPE_SYMBOL pstr("atom_type_symbol") #define CIFTAG_AUTH_ASYM_ID pstr("auth_asym_id") #define CIFTAG_AUTH_ATOM_ID pstr("auth_atom_id") #define CIFTAG_AUTH_COMP_ID pstr("auth_comp_id") #define CIFTAG_AUTH_SEQ_ID pstr("auth_seq_id") #define CIFTAG_B_ISO_OR_EQUIV pstr("B_iso_or_equiv") #define CIFTAG_B_ISO_OR_EQUIV_ESD pstr("B_iso_or_equiv_esd") #define CIFTAG_BEG_LABEL_ASYM_ID pstr("beg_label_asym_id") #define CIFTAG_BEG_LABEL_COMP_ID pstr("beg_label_comp_id") #define CIFTAG_BEG_LABEL_SEQ_ID pstr("beg_label_seq_id") #define CIFTAG_CARTN_X pstr("cartn_x") #define CIFTAG_CARTN_X_ESD pstr("cartn_x_esd") #define CIFTAG_CARTN_Y pstr("cartn_y") #define CIFTAG_CARTN_Y_ESD pstr("cartn_y_esd") #define CIFTAG_CARTN_Z pstr("cartn_z") #define CIFTAG_CARTN_Z_ESD pstr("cartn_z_esd") #define CIFTAG_CHARGE pstr("charge") #define CIFTAG_CODE pstr("code") #define CIFTAG_CODE_NDB pstr("code_NDB") #define CIFTAG_CODE_PDB pstr("code_PDB") #define CIFTAG_CONF_TYPE_ID pstr("conf_type_id") #define CIFTAG_CONN_TYPE_ID pstr("conn_type_id") #define CIFTAG_DATE pstr("date") #define CIFTAG_DATE_ORIGINAL pstr("date_original") #define CIFTAG_DB_ALIGN_BEG pstr("db_align_beg") #define CIFTAG_DB_ALIGN_END pstr("db_align_end") #define CIFTAG_DB_CODE pstr("db_code") #define CIFTAG_DB_MON_ID pstr("db_mon_id") #define CIFTAG_DB_NAME pstr("db_name") #define CIFTAG_DETAILS pstr("details") #define CIFTAG_END_LABEL_ASYM_ID pstr("end_label_asym_id") #define CIFTAG_END_LABEL_COMP_ID pstr("end_label_comp_id") #define CIFTAG_END_LABEL_SEQ_ID pstr("end_label_seq_id") #define CIFTAG_ENTITY_ID pstr("entity_id") #define CIFTAG_ENTRY_ID pstr("entry_id") #define CIFTAG_FORMULA pstr("formula") #define CIFTAG_FRACT_TRANSF_MATRIX11 pstr("fract_transf_matrix[1][1]") #define CIFTAG_FRACT_TRANSF_MATRIX12 pstr("fract_transf_matrix[1][2]") #define CIFTAG_FRACT_TRANSF_MATRIX13 pstr("fract_transf_matrix[1][3]") #define CIFTAG_FRACT_TRANSF_MATRIX21 pstr("fract_transf_matrix[2][1]") #define CIFTAG_FRACT_TRANSF_MATRIX22 pstr("fract_transf_matrix[2][2]") #define CIFTAG_FRACT_TRANSF_MATRIX23 pstr("fract_transf_matrix[2][3]") #define CIFTAG_FRACT_TRANSF_MATRIX31 pstr("fract_transf_matrix[3][1]") #define CIFTAG_FRACT_TRANSF_MATRIX32 pstr("fract_transf_matrix[3][2]") #define CIFTAG_FRACT_TRANSF_MATRIX33 pstr("fract_transf_matrix[3][3]") #define CIFTAG_FRACT_TRANSF_VECTOR1 pstr("fract_transf_vector[1]") #define CIFTAG_FRACT_TRANSF_VECTOR2 pstr("fract_transf_vector[2]") #define CIFTAG_FRACT_TRANSF_VECTOR3 pstr("fract_transf_vector[3]") #define CIFTAG_GROUP_PDB pstr("group_PDB" ) #define CIFTAG_ID pstr("id") #define CIFTAG_INS_CODE pstr("ins_code") #define CIFTAG_LABEL_ALT_ID pstr("label_alt_id") #define CIFTAG_LABEL_ATOM_ID pstr("label_atom_id") #define CIFTAG_LABEL_ASYM_ID pstr("label_asym_id") #define CIFTAG_LABEL_COMP_ID pstr("label_comp_id") #define CIFTAG_LABEL_ENTITY_ID pstr("label_entity_id") #define CIFTAG_LABEL_SEQ_ID pstr("label_seq_id") #define CIFTAG_LENGTH_A pstr("length_a") #define CIFTAG_LENGTH_B pstr("length_b") #define CIFTAG_LENGTH_C pstr("length_c") #define CIFTAG_MATRIX11 pstr("matrix[1][1]") #define CIFTAG_MATRIX12 pstr("matrix[1][2]") #define CIFTAG_MATRIX13 pstr("matrix[1][3]") #define CIFTAG_MATRIX21 pstr("matrix[2][1]") #define CIFTAG_MATRIX22 pstr("matrix[2][2]") #define CIFTAG_MATRIX23 pstr("matrix[2][3]") #define CIFTAG_MATRIX31 pstr("matrix[3][1]") #define CIFTAG_MATRIX32 pstr("matrix[3][2]") #define CIFTAG_MATRIX33 pstr("matrix[3][3]") #define CIFTAG_METHOD pstr("method") #define CIFTAG_MOD_TYPE pstr("mod_type") #define CIFTAG_MON_ID pstr("mon_id") #define CIFTAG_NAME pstr("name") #define CIFTAG_NDB_BEG_LABEL_INS_CODE_PDB pstr("ndb_beg_label_ins_code_pdb") #define CIFTAG_NDB_CHAIN_ID pstr("ndb_chain_id") #define CIFTAG_NDB_COMPONENT_NO pstr("ndb_component_no") #define CIFTAG_NDB_DESCRIPTOR pstr("ndb_descriptor") #define CIFTAG_NDB_DB_ACCESSION pstr("ndb_db_accession") #define CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE pstr("ndb_db_align_beg_ins_code") #define CIFTAG_NDB_DB_ALIGN_END_INS_CODE pstr("ndb_db_align_end_ins_code") #define CIFTAG_NDB_END_LABEL_INS_CODE_PDB pstr("ndb_end_label_ins_code_pdb") #define CIFTAG_NDB_INS_CODE pstr("ndb_ins_code") #define CIFTAG_NDB_HELIX_CLASS_PDB pstr("ndb_helix_class_pdb") #define CIFTAG_NDB_KEYWORDS pstr("ndb_keywords") #define CIFTAG_NDB_LABEL_ALT_ID pstr("ndb_label_alt_id") #define CIFTAG_NDB_LABEL_ATOM_ID pstr("ndb_label_atom_id") #define CIFTAG_NDB_LABEL_ASYM_ID pstr("ndb_label_asym_id") #define CIFTAG_NDB_LABEL_COMP_ID pstr("ndb_label_comp_id") #define CIFTAG_NDB_LABEL_INS_CODE pstr("ndb_label_ins_code") #define CIFTAG_NDB_LABEL_SEQ_NUM pstr("ndb_label_seq_num") #define CIFTAG_NDB_LENGTH pstr("ndb_length") #define CIFTAG_NDB_MODEL pstr("ndb_model") #define CIFTAG_NDB_PDB_CHAIN_ID pstr("ndb_pdb_chain_id") #define CIFTAG_NDB_PDB_ID pstr("ndb_pdb_id") #define CIFTAG_NDB_PDB_ID_CODE pstr("ndb_pdb_id_code") #define CIFTAG_NDB_PDB_INS_CODE pstr("ndb_pdb_ins_code") #define CIFTAG_NDB_PTNR1_LABEL_INS_CODE pstr("ndb_ptnr1_label_ins_code") #define CIFTAG_NDB_PTNR1_STANDARD_COMP_ID pstr("ndb_ptnr1_standard_comp_id") #define CIFTAG_NDB_RANGE_1_BEG_LABEL_COMP_ID pstr("ndb_range_1_beg_label_comp_id") #define CIFTAG_NDB_RANGE_1_BEG_LABEL_ASYM_ID pstr("ndb_range_1_beg_label_asym_id") #define CIFTAG_NDB_RANGE_1_BEG_LABEL_INS_CODE pstr("ndb_range_1_beg_label_ins_code") #define CIFTAG_NDB_RANGE_1_END_LABEL_COMP_ID pstr("ndb_range_1_end_label_comp_id") #define CIFTAG_NDB_RANGE_1_END_LABEL_ASYM_ID pstr("ndb_range_1_end_label_asym_id") #define CIFTAG_NDB_RANGE_1_END_LABEL_INS_CODE pstr("ndb_range_1_end_label_ins_code") #define CIFTAG_NDB_SEQ_ALIGN_BEG pstr("ndb_seq_align_beg") #define CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE pstr("ndb_seq_align_beg_ins_code") #define CIFTAG_NDB_SEQ_ALIGN_END pstr("ndb_seq_align_end") #define CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE pstr("ndb_seq_align_end_ins_code") #define CIFTAG_NDB_SEQ_DB_NAME pstr("ndb_seq_db_name") #define CIFTAG_NDB_SEQ_DB_ACCESSION_CODE pstr("ndb_seq_db_accession_code") #define CIFTAG_NDB_SEQ_DB_SEQ_NUM pstr("ndb_seq_db_seq_num") #define CIFTAG_NDB_SYNONYMS pstr("ndb_synonyms") #define CIFTAG_NUM pstr("num") #define CIFTAG_NUMBER_ATOMS_NH pstr("number_atoms_nh") #define CIFTAG_NUMBER_STRANDS pstr("number_strands") #define CIFTAG_OCCUPANCY pstr("occupancy") #define CIFTAG_OCCUPANCY_ESD pstr("occupancy_esd") #define CIFTAG_ORIGX11 pstr("origx[1][1]") #define CIFTAG_ORIGX12 pstr("origx[1][2]") #define CIFTAG_ORIGX13 pstr("origx[1][3]") #define CIFTAG_ORIGX21 pstr("origx[2][1]") #define CIFTAG_ORIGX22 pstr("origx[2][2]") #define CIFTAG_ORIGX23 pstr("origx[2][3]") #define CIFTAG_ORIGX31 pstr("origx[3][1]") #define CIFTAG_ORIGX32 pstr("origx[3][2]") #define CIFTAG_ORIGX33 pstr("origx[3][3]") #define CIFTAG_ORIGX_VECTOR1 pstr("origx_vector[1]") #define CIFTAG_ORIGX_VECTOR2 pstr("origx_vector[2]") #define CIFTAG_ORIGX_VECTOR3 pstr("origx_vector[3]") #define CIFTAG_PDB_ID pstr("pdb_id") #define CIFTAG_PDB_MON_ID pstr("pdb_mon_id") #define CIFTAG_PDB_STRAND_ID pstr("pdb_strand_id") #define CIFTAG_PDBX_DB_ACCESSION pstr("pdbx_db_accession") #define CIFTAG_PDBX_DB_ALIGN_BEG_INS_CODE pstr("pdbx_db_align_beg_ins_code") #define CIFTAG_PDBX_DB_ALIGN_END_INS_CODE pstr("pdbx_db_align_end_ins_code") #define CIFTAG_PDBX_PDB_ID_CODE pstr("pdbx_PDB_id_code") #define CIFTAG_PDBX_PDB_INS_CODE pstr("pdbx_PDB_ins_code") #define CIFTAG_PDBX_PDB_MODEL_NUM pstr("pdbx_PDB_model_num") #define CIFTAG_PDBX_STRAND_ID pstr("pdbx_strand_id") #define CIFTAG_RANGE_1_BEG_LABEL_ATOM_ID pstr("range_1_beg_label_atom_id") #define CIFTAG_RANGE_1_BEG_LABEL_SEQ_ID pstr("range_1_beg_label_seq_id") #define CIFTAG_RANGE_1_END_LABEL_ATOM_ID pstr("range_1_end_label_atom_id") #define CIFTAG_RANGE_1_END_LABEL_SEQ_ID pstr("range_1_end_label_seq_id") #define CIFTAG_RANGE_ID_1 pstr("range_id_1") #define CIFTAG_RANGE_ID_2 pstr("range_id_2") #define CIFTAG_RCSB_RECORD_REVISED_1 pstr("rcsb_record_revised_1") #define CIFTAG_RCSB_RECORD_REVISED_2 pstr("rcsb_record_revised_2") #define CIFTAG_RCSB_RECORD_REVISED_3 pstr("rcsb_record_revised_3") #define CIFTAG_RCSB_RECORD_REVISED_4 pstr("rcsb_record_revised_4") #define CIFTAG_PDBX_SEQ_ALIGN_BEG_INS_CODE pstr("pdbx_seq_align_beg_ins_code") #define CIFTAG_PDBX_SEQ_ALIGN_END_INS_CODE pstr("pdbx_seq_align_end_ins_code") #define CIFTAG_PTNR1_LABEL_ASYM_ID pstr("ptnr1_label_asym_id") #define CIFTAG_PTNR1_LABEL_COMP_ID pstr("ptnr1_label_comp_id") #define CIFTAG_PTNR1_LABEL_SEQ_ID pstr("ptnr1_label_seq_id") #define CIFTAG_REF_ID pstr("ref_id") #define CIFTAG_REPLACES pstr("replaces") #define CIFTAG_REPLACE_PDB_ID pstr("replace_pdb_id") #define CIFTAG_SEGMENT_ID pstr("segment_id") #define CIFTAG_SEQ_ALIGN_BEG pstr("seq_align_beg") #define CIFTAG_SEQ_ALIGN_END pstr("seq_align_end") #define CIFTAG_SEQ_NUM pstr("seq_num") #define CIFTAG_SENSE pstr("sense") #define CIFTAG_SHEET_ID pstr("sheet_id") #define CIFTAG_SOURCE pstr("source") #define CIFTAG_SPACE_GROUP_NAME_H_M pstr("space_group_name_h-m") #define CIFTAG_TEXT pstr("text") #define CIFTAG_TITLE pstr("title") #define CIFTAG_TYPE pstr("type") #define CIFTAG_TYPE_SYMBOL pstr("type_symbol") #define CIFTAG_VECTOR1 pstr("vector[1]") #define CIFTAG_VECTOR2 pstr("vector[2]") #define CIFTAG_VECTOR3 pstr("vector[3]") #define CIFTAG_U11 pstr("u[1][1]") #define CIFTAG_U11_ESD pstr("u[1][1]_esd") #define CIFTAG_U12 pstr("u[1][2]") #define CIFTAG_U12_ESD pstr("u[1][2]_esd") #define CIFTAG_U13 pstr("u[1][3]") #define CIFTAG_U13_ESD pstr("u[1][3]_esd") #define CIFTAG_U22 pstr("u[2][2]") #define CIFTAG_U22_ESD pstr("u[2][2]_esd") #define CIFTAG_U23 pstr("u[2][3]") #define CIFTAG_U23_ESD pstr("u[2][3]_esd") #define CIFTAG_U33 pstr("u[3][3]") #define CIFTAG_U33_ESD pstr("u[3][3]_esd") #define CIFTAG_Z_PDB pstr("z_pdb") #define CIFTAG_CONN_PTNR1_AUTH_ATOM_ID pstr("ptnr1_auth_atom_id") #define CIFTAG_CONN_PDBX_PTNR1_AUTH_ALT_ID pstr("pdbx_ptnr1_auth_alt_id") #define CIFTAG_CONN_PTNR1_AUTH_COMP_ID pstr("ptnr1_auth_comp_id") #define CIFTAG_CONN_PTNR1_AUTH_ASYM_ID pstr("ptnr1_auth_asym_id") #define CIFTAG_CONN_PTNR1_AUTH_SEQ_ID pstr("ptnr1_auth_seq_id") #define CIFTAG_CONN_PDBX_PTNR1_PDB_INS_CODE pstr("pdbx_ptnr1_PDB_ins_code") #define CIFTAG_CONN_DIST pstr("link_dist") #define CIFTAG_CONN_PTNR2_AUTH_ATOM_ID pstr("ptnr2_auth_atom_id") #define CIFTAG_CONN_PDBX_PTNR2_AUTH_ALT_ID pstr("pdbx_ptnr2_auth_alt_id") #define CIFTAG_CONN_PTNR2_AUTH_COMP_ID pstr("ptnr2_auth_comp_id") #define CIFTAG_CONN_PTNR2_AUTH_ASYM_ID pstr("ptnr2_auth_asym_id") #define CIFTAG_CONN_PTNR2_AUTH_SEQ_ID pstr("ptnr2_auth_seq_id") #define CIFTAG_CONN_PDBX_PTNR2_PDB_INS_CODE pstr("pdbx_ptnr2_PDB_ins_code") #define CIFTAG_CONN_PTNR1_SYMMETRY pstr("ptnr1_symmetry") #define CIFTAG_CONN_PTNR2_SYMMETRY pstr("ptnr2_symmetry") #define CIFTAG_CONN_NAME pstr("link_name") #endif mmdb-1.23.2.1/src/random_n.h0000644000175100017510000000425011475666364012360 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 05.02.03 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : Random_N // ~~~~~~~~~ // **** Classes : CRandomNumber ( random number generator ) // ~~~~~~~~~ // // (C) E. Krissinel' 1997-2008 // // ================================================================= // #ifndef __Random_N__ #define __Random_N__ #ifndef __File__ #include "file_.h" #endif // ------------------------------------------------------------- #define _RN_MAX_IJ 31328 #define _RN_MAX_KL 30081 DefineClass(CRandomNumber) class CRandomNumber { public : CRandomNumber ( long IJ=0, long KL=0 ); void Init ( long IJ=0, long KL=0 ); realtype gauss_rnd(); // Gaussian random numbers realtype random (); // Uniform [0..1] random number generator realtype srandom (); // Uniform [-1..1] random number generator void read ( RCFile f ); void write ( RCFile f ); protected : long I97,J97; realtype U[97],C,CD,CM; realtype gset; long iset; }; #endif mmdb-1.23.2.1/src/mmdb_model.h0000644000175100017510000011076211475666363012667 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 30.04.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Model // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CHetCompound ( description of het compounds ) // ~~~~~~~~~ CHetCompounds ( HETNAM, HETSYN, FORMULA records ) // CSSContainer ( container for helixes and turns ) // CHelix ( helix info ) // CStrand ( strand info ) // CSheet ( sheet info ) // CSheets ( container for sheets ) // CTurn ( turn info ) // CLinkContainer ( container for link data ) // CLink ( link data ) // CLinkRContainer ( container for refmac link ) // CLinkR ( link data ) // CCisPepContainer ( container for CisPep data ) // CCisPep ( CisPep data ) // CModel ( PDB model ) // // Copyright (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MMDB_Model__ #define __MMDB_Model__ #ifndef __Stream__ #include "stream_.h" #endif #ifndef __MMDB_Defs__ #include "mmdb_defs.h" #endif #ifndef __MMDB_Utils__ #include "mmdb_utils.h" #endif #ifndef __MMDB_Chain__ #include "mmdb_chain.h" #endif // ==================== CHetCompound ======================= DefineClass(CHetCompound) DefineStreamFunctions(CHetCompound) class CHetCompound : public CStream { public : ResName hetID; // Het identifiers, right-justified pstr comment; int nSynonyms; psvector hetSynonym; // synonyms int compNum; // component number char wc; // '*' for water, otherwise space pstr Formula; // formulas CHetCompound ( cpstr HetName ); CHetCompound ( RPCStream Object ); ~CHetCompound(); void AddKeyWord ( cpstr W, Boolean Closed ); void HETNAM_PDBDump ( RCFile f ); void HETSYN_PDBDump ( RCFile f ); void FORMUL_PDBDump ( RCFile f ); void FormComString ( pstr & F ); void FormSynString ( pstr & F ); void FormForString ( pstr & F ); void Copy ( PCHetCompound HetCompound ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitHetCompound ( cpstr HetName ); void FreeMemory (); }; // ==================== CSSContainer ====================== DefineClass(CSSContainer) DefineStreamFunctions(CSSContainer) class CSSContainer : public CClassContainer { public : CSSContainer () : CClassContainer() {} CSSContainer ( RPCStream Object ) : CClassContainer ( Object ) {} ~CSSContainer () {} PCContainerClass MakeContainerClass ( int ClassID ); }; // ==================== CHelix ============================ DefineClass(CHelix) DefineStreamFunctions(CHelix) class CHelix : public CContainerClass { public : int serNum; // serial number HelixID helixID; // helix ID ResName initResName; // name of the helix's initial residue ChainID initChainID; // chain ID for the chain containing the helix int initSeqNum; // sequence number of the initial residue InsCode initICode; // insertion code of the initial residue ResName endResName; // name of the helix's terminal residue ChainID endChainID; // chain ID for the chain containing the helix int endSeqNum; // sequence number of the terminal residue InsCode endICode; // insertion code of the terminal residue int helixClass; // helix class pstr comment; // comment about the helix int length; // length of the helix CHelix (); CHelix ( cpstr S ); CHelix ( RPCStream Object ); ~CHelix(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_Helix; } void Copy ( PCContainerClass Helix ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitHelix(); }; // ==================== CStrand ============================ DefineClass(CStrand) DefineStreamFunctions(CStrand) class CStrand : public CStream { public : StrandID sheetID; // sheet ID int strandNo; // strand number ResName initResName; // name of the strand's initial residue ChainID initChainID; // chain ID of initial residue in the strand int initSeqNum; // sequence number of the initial residue InsCode initICode; // insertion code of the initial residue ResName endResName; // name of the strand's terminal residue ChainID endChainID; // chain ID of terminal residue in the strand int endSeqNum; // sequence number of the terminal residue InsCode endICode; // insertion code of the terminal residue int sense; // sense of strand with respect to previous // strand AtomName curAtom; // registration; atom name in current strand ResName curResName; // registration; residue name in current // strand ChainID curChainID; // registration; chain ID in current strand int curResSeq; // registration; res-e seq numb in current // strand InsCode curICode; // registration; ins code in current strand AtomName prevAtom; // registration; atom name in previous strand ResName prevResName; // registration; residue name in previous // strand ChainID prevChainID; // registration; chain ID in previous strand int prevResSeq; // registration; res-e seq numb in previous // strand InsCode prevICode; // registration; ins code in previous strand CStrand (); CStrand ( RPCStream Object ); ~CStrand(); void PDBASCIIDump ( pstr S ); void MakeCIF ( PCMMCIFData CIF ); int ConvertPDBASCII ( cpstr S ); int GetCIF ( PCMMCIFData CIF, cpstr sheet_id ); void Copy ( PCStrand Strand ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitStrand(); }; // ==================== CSheet ============================ DefineClass(CSheet) DefineStreamFunctions(CSheet) class CSheet : public CStream { public : SheetID sheetID; // sheet ID int nStrands; // number of strands in the sheet PPCStrand Strand; // array of strands CSheet (); CSheet ( RPCStream Object ); ~CSheet(); void FreeMemory(); void OrderSheet(); void PDBASCIIDump ( RCFile f ); void MakeCIF ( PCMMCIFData CIF ); int ConvertPDBASCII ( cpstr S ); int GetCIF ( PCMMCIFData CIF ); void Copy ( PCSheet Sheet ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitSheet (); void CIFFindStrands ( PCMMCIFData CIF, cpstr Category ); void TryStrand ( int strand_no ); int GetStrand ( int strand_no ); }; // ==================== CSheets ============================ DefineClass(CSheets) DefineStreamFunctions(CSheets) class CSheets : public CStream { public : int nSheets; PPCSheet Sheet; CSheets (); CSheets ( RPCStream Object ); ~CSheets(); void FreeMemory(); void PDBASCIIDump ( RCFile f ); void MakeCIF ( PCMMCIFData CIF ); int ConvertPDBASCII ( cpstr S ); int GetCIF ( PCMMCIFData CIF ); void Copy ( PCSheets Sheets ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitSheets (); void CIFFindSheets ( PCMMCIFData CIF, cpstr Category ); }; // ==================== CTurn ============================ DefineClass(CTurn) DefineStreamFunctions(CTurn) class CTurn : public CContainerClass { public : int serNum; // serial number TurnID turnID; // turn ID ResName initResName; // name of the turn's initial residue ChainID initChainID; // chain ID for the chain containing the turn int initSeqNum; // sequence number of the initial residue InsCode initICode; // insertion code of the initial residue ResName endResName; // name of the turn's terminal residue ChainID endChainID; // chain ID for the chain containing the turn int endSeqNum; // sequence number of the terminal residue InsCode endICode; // insertion code of the terminal residue pstr comment; // comment about the helix CTurn (); CTurn ( cpstr S ); CTurn ( RPCStream Object ); ~CTurn(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_Turn; } void Copy ( PCContainerClass Turn ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitTurn(); }; // ==================== CHetCompounds ======================= DefineClass(CHetCompounds) DefineStreamFunctions(CHetCompounds) class CHetCompounds : public CStream { public : int nHets; PPCHetCompound hetCompound; CHetCompounds (); CHetCompounds ( RPCStream Object ); ~CHetCompounds(); void FreeMemory (); void PDBASCIIDump ( RCFile f ); void ConvertHETNAM ( cpstr S ); void ConvertHETSYN ( cpstr S ); void ConvertFORMUL ( cpstr S ); void MakeCIF ( PCMMCIFData CIF ); void GetCIF ( PCMMCIFData CIF ); void Copy ( PCHetCompounds HetCompounds ); void write ( RCFile f ); void read ( RCFile f ); protected : Boolean Closed; void InitHetCompounds(); int AddHetName ( cpstr H ); }; // =================== CLinkContainer ===================== DefineClass(CLinkContainer) DefineStreamFunctions(CLinkContainer) class CLinkContainer : public CClassContainer { public : CLinkContainer () : CClassContainer() {} CLinkContainer ( RPCStream Object ) : CClassContainer ( Object ) {} ~CLinkContainer () {} PCContainerClass MakeContainerClass ( int ClassID ); }; // ==================== CLink ============================ DefineClass(CLink) DefineStreamFunctions(CLink) class CLink : public CContainerClass { public : AtomName atName1; // name of 1st linked atom AltLoc aloc1; // alternative location of 1st linked atom ResName resName1; // residue name of 1st linked atom ChainID chainID1; // chain ID of 1st linked atom int seqNum1; // sequence number of 1st linked atom InsCode insCode1; // insertion code of 1st linked atom AtomName atName2; // name of 2nd linked atom AltLoc aloc2; // alternative location of 2nd linked atom ResName resName2; // residue name of 2nd linked atom ChainID chainID2; // chain ID of 2nd linked atom int seqNum2; // sequence number of 2nd linked atom InsCode insCode2; // insertion code of 2nd linked atom int s1,i1,j1,k1; // sym id of 1st atom int s2,i2,j2,k2; // sym id of 2nd atom CLink (); CLink ( cpstr S ); CLink ( RPCStream Object ); ~CLink(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_Link; } void Copy ( PCContainerClass Link ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitLink(); }; // =================== CLinkRContainer ==================== DefineClass(CLinkRContainer) DefineStreamFunctions(CLinkRContainer) class CLinkRContainer : public CClassContainer { public : CLinkRContainer () : CClassContainer() {} CLinkRContainer ( RPCStream Object ) : CClassContainer ( Object ) {} ~CLinkRContainer () {} PCContainerClass MakeContainerClass ( int ClassID ); }; // ==================== CLinkR ============================ DefineClass(CLinkR) DefineStreamFunctions(CLinkR) /* Garib's LINK LYS A 27 PLP A 255 PLPLYS LINK MAN S 3 MAN S 4 BETA1-4 LINK C6 BBEN B 1 O1 BMAF S 2 BEN-MAF LINK OE2 AGLU A 320 C1 AMAF S 2 GLU-MAF LINK OE2 GLU A 67 1.895 ZN ZN R 5 GLU-ZN LINK NE2 HIS A 71 2.055 ZN ZN R 5 HIS-ZN LINK O ARG A 69 2.240 NA NA R 9 ARG-NA Coot's LINKR O VAL C 103 NA NA C 401 VAL-NA LINKR OD1 ASP D 58 NA NA D 401 ASP-NA LINKR O ALA D 97 NA NA D 401 ALA-NA LINKR OG1 THR D 99 NA NA D 401 THR-NA LINKR O SER D 101 NA NA D 401 SER-NA LINKR O VAL D 103 NA NA D 401 VAL-NA PDB's LINK O GLY A 49 NA NA A6001 1555 1555 2.98 LINK OG1 THR A 51 NA NA A6001 1555 1555 2.72 LINK OD2 ASP A 66 NA NA A6001 1555 1555 2.72 LINK NE ARG A 68 NA NA A6001 1555 1555 2.93 LINK NE ARG A 68 NA NA A6001 1555 1555 2.93 LINK C21 2EG A 7 C22 2EG B 19 1555 1555 1.56 */ class CLinkR : public CContainerClass { public : LinkRID linkRID; // link name AtomName atName1; // name of 1st linked atom AltLoc aloc1; // alternative location of 1st linked atom ResName resName1; // residue name of 1st linked atom ChainID chainID1; // chain ID of 1st linked atom int seqNum1; // sequence number of 1st linked atom InsCode insCode1; // insertion code of 1st linked atom AtomName atName2; // name of 2nd linked atom AltLoc aloc2; // alternative location of 2nd linked atom ResName resName2; // residue name of 2nd linked atom ChainID chainID2; // chain ID of 2nd linked atom int seqNum2; // sequence number of 2nd linked atom InsCode insCode2; // insertion code of 2nd linked atom realtype dist; // link distance CLinkR (); CLinkR ( cpstr S ); CLinkR ( RPCStream Object ); ~CLinkR(); void PDBASCIIDump ( pstr S, int N ); void MakeCIF ( PCMMCIFData CIF, int N ); int ConvertPDBASCII ( cpstr S ); void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_LinkR; } void Copy ( PCContainerClass LinkR ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitLinkR(); }; // =================== CCisPepContainer ===================== DefineClass(CCisPepContainer) DefineStreamFunctions(CCisPepContainer) class CCisPepContainer : public CClassContainer { public : CCisPepContainer () : CClassContainer() {} CCisPepContainer ( RPCStream Object ) : CClassContainer ( Object ) {} ~CCisPepContainer () {} PCContainerClass MakeContainerClass ( int ClassID ); }; // ===================== CCisPep =========================== DefineClass(CCisPep) DefineStreamFunctions(CCisPep) class CCisPep : public CContainerClass { public : int serNum; // record serial number ResName pep1; // residue name ChainID chainID1; // chain identifier 1 int seqNum1; // residue sequence number 1 InsCode icode1; // insertion code 1 ResName pep2; // residue name 2 ChainID chainID2; // chain identifier 2 int seqNum2; // residue sequence number 2 InsCode icode2; // insertion code 2 int modNum; // model number realtype measure; // measure of the angle in degrees. CCisPep (); CCisPep ( cpstr S ); CCisPep ( RPCStream Object ); ~CCisPep(); void PDBASCIIDump ( pstr S, int N ); int ConvertPDBASCII ( cpstr S ); // void MakeCIF ( PCMMCIFData CIF, int N ); // void GetCIF ( PCMMCIFData CIF, int & Signal ); int GetClassID () { return ClassID_CisPep; } void Copy ( PCContainerClass CisPep ); void write ( RCFile f ); void read ( RCFile f ); protected : void InitCisPep(); }; // ==================== CModel =============================== #define SSERC_Ok 0 #define SSERC_noResidues 1 #define SSERC_noAminoacids 2 #define SSERC_noSSE 3 #define SORT_CHAIN_ChainID_Asc 0 #define SORT_CHAIN_ChainID_Desc 1 DefineFactoryFunctions(CModel) class CModel : public CProModel { friend class CMMDBManager; friend class CMMDBBondManager; friend class CMMDBSelManager; friend class CMMDBCoorManager; friend class CMMDBFile; friend class CChain; friend class CResidue; friend class CAtom; public : CModel (); // SetMMDBFile() MUST be used after this constructor! CModel ( PCMMDBManager MMDBF, int serialNum ); CModel ( RPCStream Object ); ~CModel(); void SetMMDBManager ( PCMMDBManager MMDBM, int serialNum ); PCMMDBManager GetCoordHierarchy() { return manager; } // GetChainCreate() returns pointer on chain, whose identifier // is given in chID. If such a chain is absent in the model, // it is created. If enforceUniqueChainID is True and chain with // the same first letter in chain ID already exists in the model, // then the new chain ID will be appended with a serial number // in order to keep it unique. The model will contain chains like // A, A0, A1, A2, ... in such cases. PCChain GetChainCreate ( const ChainID chID, Boolean enforceUniqueChainID ); // CreateChain() creates a new chain with chain ID regardless // the presence of same-ID chains in the model. This function // was introduced only for compatibility with older CCP4 // applications and using it in any new developments should be // strictly discouraged. PCChain CreateChain ( const ChainID chID ); cpstr GetEntryID (); void SetEntryID ( const IDCode idCode ); int GetSerNum (); // returns the model's serial number cpstr GetModelID ( pstr modelID ); // returns "/mdl" int GetNumberOfModels (); // returns TOTAL number of models int GetNumberOfAtoms ( Boolean countTers ); // returns number // of atoms in the model int GetNumberOfResidues(); // returns number of residues in // the model // ---------------- Extracting chains -------------------------- int GetNumberOfChains(); // returns number of chains in the model Boolean GetNewChainID ( ChainID chID, int length=1 ); // GetChain() returns pointer on chain, whose identifier // is given in chID. If such a chain is absent in the model, // returns NULL. PCChain GetChain ( const ChainID chID ); PCChain GetChain ( int chainNo ); // returns chainNo-th chain // in the model; // 0<=chainNoindex-1; atom[]->index // is assigned automatically. void MoveChain ( PCChain & m_chain, PPCAtom m_atom, PPCAtom atom, int & atom_index, int chain_ext ); void GetAIndexRange ( int & i1, int & i2 ); void MaskAtoms ( PCMask Mask ); void MaskResidues ( PCMask Mask ); void MaskChains ( PCMask Mask ); void UnmaskAtoms ( PCMask Mask ); void UnmaskResidues ( PCMask Mask ); void UnmaskChains ( PCMask Mask ); // ---- Getting Secondary Structure Elements int GetNumberOfHelices (); int GetNumberOfSheets (); PCHelix GetHelix ( int serialNum ); // 1<=serNum<=NofHelices void GetSheetID ( int serialNum, SheetID sheetID ); // '\0' for none PCSheet GetSheet ( int serialNum ); //1<=serNum<=NofSheets PCSheet GetSheet ( const SheetID sheetID ); // NULL for none int GetNumberOfStrands ( int sheetSerNum ); int GetNumberOfStrands ( const SheetID sheetID ); PCStrand GetStrand ( int sheetSerNum, int strandSerNum ); PCStrand GetStrand ( const SheetID sheetID, int strandSerNum ); PCSSContainer GetHelices() { return &Helices; } PCSheets GetSheets () { return &Sheets; } void RemoveSecStructure(); int CalcSecStructure ( Boolean flagBulge=True, int aminoSelHnd=-1 ); // int CalcSecStructure ( Boolean flagBulge=True ); void RemoveHetInfo (); // ---- Working Links int GetNumberOfLinks (); PCLink GetLink ( int serialNum ); // 1<=serNum<=NofLinks PCLinkContainer GetLinks() { return &Links; } void RemoveLinks(); void AddLink ( PCLink Link ); // ---- Working Refmac Links int GetNumberOfLinkRs (); PCLinkR GetLinkR ( int serialNum ); // 1<=serNum<=NofLinks PCLinkRContainer GetLinkRs() { return &LinkRs; } void RemoveLinkRs(); void AddLinkR ( PCLinkR LinkR ); // ---- Working CisPeps int GetNumberOfCisPeps(); PCCisPep GetCisPep ( int CisPepNum ); PCCisPepContainer GetCisPeps() { return &CisPeps; } void RemoveCisPeps(); void AddCisPep ( PCCisPep CisPep ); void ApplyTransform ( mat44 & TMatrix ); // transforms all // coordinates by multiplying // with matrix TMatrix Boolean isInSelection ( int selHnd ); // ------- user-defined data handlers int PutUDData ( int UDDhandle, int iudd ); int PutUDData ( int UDDhandle, realtype rudd ); int PutUDData ( int UDDhandle, cpstr sudd ); int GetUDData ( int UDDhandle, int & iudd ); int GetUDData ( int UDDhandle, realtype & rudd ); int GetUDData ( int UDDhandle, pstr sudd, int maxLen ); int GetUDData ( int UDDhandle, pstr & sudd ); void Copy ( PCModel Model ); void CopyHets ( PCModel Model ); void CopySecStructure ( PCModel Model ); void CopyLinks ( PCModel Model ); void CopyLinkRs ( PCModel Model ); void CopyCisPeps ( PCModel Model ); void write ( RCFile f ); void read ( RCFile f ); protected : int serNum; // the model serial number PCMMDBManager manager; // pointer to mmdbmanager class CHetCompounds HetCompounds; // information on heterocompounds CSSContainer Helices; // information on helices CSheets Sheets; // information on sheets CSSContainer Turns; // information on turns CLinkContainer Links; // information on links CLinkRContainer LinkRs; // information on refmac links CCisPepContainer CisPeps; // information on cispeps int nChains; // number of chains int nChainsAlloc; // actual length of Chain[] PPCChain Chain; // array of chains Boolean Exclude; // used internally void InitModel (); void FreeMemory (); void ExpandChainArray ( int nOfChains ); int GetCIFPSClass ( PCMMCIFData CIF, int ClassID ); // _ExcludeChain(..) excludes (but does not dispose!) a chain // from the model. Returns 1 if the chain gets empty and 0 // otherwise. int _ExcludeChain ( const ChainID chainID ); // _copy(PCModel) does not copy atoms! -- not for use in // applications void _copy ( PCModel Model ); // _copy(PCModel,PPCAtom,int&) does copy atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. void _copy ( PCModel Model, PPCAtom atom, int & atom_index ); void CheckInAtoms (); }; #endif mmdb-1.23.2.1/src/mmdb_mmcif.cpp0000644000175100017510000026515311476175736013222 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_MMCIF // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMCIFCategory ( mmCIF category ) // ~~~~~~~~~ CMMCIFStruct ( mmCIF structure ) // CMMCIFLoop ( mmCIF loop ) // CMMCIFData ( mmCIF data block ) // CMMCIFFile ( mmCIF file ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __TIME_H #include #endif #ifndef __MMDB_MMCIF__ #include "mmdb_mmcif.h" #endif // ====================== SortTags =============================== void SortTags ( psvector tag, int len, ivector index ) { int i,k,l,l1,l2; if (len==1) { index[0] = 0; return; } if (strcasecmp(tag[0],tag[1])<0) { index[0] = 0; index[1] = 1; } else { index[0] = 1; index[1] = 0; } for (k=2;k0) l2 = k; else { l1 = 0; while (l1l2;i--) index[i] = index[i-1]; index[l2] = k; } } /* ----------- commented SortTags to be deleted after no bugs are discovered void SortTags ( psvector tag, int len, ivector index ) { // The idea is, the tags are created already sorted and // SortTags(..) should serve only in special cases, occasionally. // The bubble sorting should perform best in this situation // because of its N-complexity for sorted arrays. // Note: index must contain valid indices on input. int i,i1,i2; Boolean Done; // for (i=0;i0) { index[i-1] = i2; index[i] = i1; Done = False; } else i1 = i2; } } while (!Done); } */ /* ---------------------------------------------------------------- ANACHRONISM void SortTags ( psvector tag, int len, ivector index ) { int i,j,k; for (i=0;i0) { k = index[i]; index[i] = index[j]; index[j] = k; } } ------------------------------------------------------------------- */ /* ----------------------------------------------------------------- THESE VERSIONS OF HEAPSORT FROM NUMERICAL RECIPIES DO NOT WORK! void SortTags ( psvector tag, int len, ivector index ) { // Sorts tags by alphabetical order. index[] will return // indices of ordered tags; it must come allocated. tag[] // does not change; ordered tags are then obtained as // tag[index[i]]. int i,j,k,l,N; for (i=0;i1) { l = (len >> 1)+1; k = len; for (;;) { if (l>1) { l--; N = index[l-1]; } else { k--; N = index[k]; index[k] = index[0]; if (k==1) { index[0] = N; return; } } i = l; j = l+1; while (j<=k) { if (j1) { l = len >> 1; k = len-1; for (;;) { if (l>0) N = index[--l]; else { N = index[k]; index[k--] = index[0]; if (!k) { index[0] = N; break; } } i = l; j = l+1; while (j<=k) { if (jnAllocTags) { nAT = nTagsNew + IMin(nAllocTags/2+1,20); GetVectorMemory ( tag1 ,nAT,0 ); GetVectorMemory ( index1,nAT,0 ); for (i=0;i=0) && (tagNo0) { k = 0; if (!index) GetVectorMemory ( index,nAllocTags,0 ); for (i=0;i=0 : position of the tag found // <0 : the tag was not found, it could be inserted before // (-RC-1)th element, where RC is the return value int l1,l2,l,k; if (!tag) return -1; if (!index) Sort(); l1 = 0; l2 = nTags-1; k = 1; while (l10) l1 = l; else { l1 = l; break; } } if (k==0) return index[l]; // is at RCth position k = strcasecmp ( ttag,tag[index[l1]] ); if (k==0) return index[l1]; // is at RCth position if (k<0) return -1; // would be at (-RC-1)th position if (l2!=l1) { k = strcasecmp ( ttag,tag[index[l2]] ); if (k==0) return index[l2]; // is at RCth position if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position } return -2-l1; // would be at l1+1=(-RC-1)th position } int CMMCIFCategory::AddTag ( cpstr ttag ) { // return -1: the tag has been added on the top of array; // index is added and sorted automatically // >=0: the tag is already in the array -- its position // is returned int i1,i; if (!tag) { ExpandTags ( 3 ); // get space for first 3 tags CreateCopy ( tag[0],ttag ); nTags = 1; return -nTags; // the tag has been added on the top of array } i1 = GetTagNo ( ttag ); if (i1>=0) return i1; // non-negative returns mean that // the tag is already in the array i1 = -i1-1; // otherwise the tag has to be added and indexed at here // put new tag on the top of array and update index ExpandTags ( nTags+1 ); CreateCopy ( tag[nTags],ttag ); for (i=nTags;i>i1;i--) index[i] = index[i-1]; index[i1] = nTags; nTags++; return -nTags; // the tag has been added on the top of array } void CMMCIFCategory::PrintTags() { int i; Sort(); printf ( " Unsorted tags:\n" ); for (i=0;iname ); nTags = Category->nTags; nAllocTags = nTags; if (nTags>0) { GetVectorMemory ( tag ,nAllocTags,0 ); GetVectorMemory ( index,nAllocTags,0 ); for (i=0;itag[i] ); index[i] = Category->index[i]; } } } } void CMMCIFCategory::write ( RCFile f ) { int i; if (!index) Sort(); f.CreateWrite ( name ); f.WriteInt ( &nTags ); for (i=0;i0) { GetVectorMemory ( tag,nTags,0 ); for (i=0;inAT) { GetVectorMemory ( field1,nAllocTags,0 ); for (i=0;i=0) && (tagNo=0) && (field)) { if (field[k]) delete[] field[k]; field[k] = NULL; } return k; } int CMMCIFStruct::GetReal ( realtype & R, cpstr TName, Boolean Remove ) { pstr endptr; int RC; int k = GetTagNo ( TName ); R = 0.0; if (!field) return CIFRC_NoField; if (k<0) return CIFRC_NoTag; if (!field[k]) return CIFRC_NoField; if (field[k][0]==char(2)) return CIFRC_NoField; R = strtod ( field[k],&endptr ); if (endptr==field[k]) RC = CIFRC_WrongFormat; else { RC = 0; if (Remove) { delete[] field[k]; field[k] = NULL; } } return RC; } int CMMCIFStruct::GetInteger ( int & I, cpstr TName, Boolean Remove ) { pstr endptr; int RC; int k = GetTagNo ( TName ); I = 0; if (!field) return CIFRC_NoField; if (k<0) return CIFRC_NoTag; if (!field[k]) return CIFRC_NoField; if (field[k][0]==char(2)) { if (field[k][1]=='.') I = MinInt4; return CIFRC_NoField; } I = mround ( strtod(field[k],&endptr) ); if (endptr==field[k]) RC = CIFRC_WrongFormat; else { RC = 0; if (Remove) { delete[] field[k]; field[k] = NULL; } } return RC; } void CMMCIFStruct::PutString ( cpstr S, cpstr T, Boolean NonBlankOnly ) { pstr p; if (!S) PutNoData ( CIF_NODATA_QUESTION,T ); else { p = pstr(S); if (NonBlankOnly) while (*p==' ') p++; if (!(*p)) PutNoData ( CIF_NODATA_DOT,T ); else AddField ( S,T,False ); } } void CMMCIFStruct::PutDate ( cpstr T ) { time_t t; tm * tstruct; char S[100]; t = time ( NULL ); tstruct = localtime(&t); if (tstruct) sprintf ( S,"%4i-%02i-%02i", tstruct->tm_year+1900,tstruct->tm_mon+1,tstruct->tm_mday ); else strcpy ( S,"YYYY-MM-DD" ); AddField ( S,T,False ); } void CMMCIFStruct::PutNoData ( int NoDataType, cpstr T ) { char S[10]; S[0] = char(2); if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; else S[1] = '?'; S[2] = char(0); AddField ( S,T,False ); } void CMMCIFStruct::PutReal ( realtype R, cpstr T, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); AddField ( rS,T,False ); } void CMMCIFStruct::PutInteger ( int I, cpstr T ) { char iS[100]; if (I>MinInt4) { sprintf ( iS,"%i",I ); AddField ( iS,T,False ); } else PutNoData ( CIF_NODATA_DOT,T ); } #define NODATA_Q pstr("?") #define NODATA_P pstr(".") Boolean CMMCIFStruct::WriteMMCIFStruct ( cpstr FName, byte gzipMode ) { CFile f; f.assign ( FName,True,False,gzipMode ); if (f.rewrite()) { WriteMMCIF ( f ); f.shut(); return True; } else return False; } void CMMCIFStruct::WriteMMCIF ( RCFile f ) { int i,j,k,l,m,n; pstr F; l = 0; for (i=0;im) f.Write ( pstr("\n ") ); else { k = l-strlen(tag[i]); for (j=0;j0) { GetVectorMemory ( field,nTags,0 ); for (i=0;ifield[i] ); } } } void CMMCIFStruct::write ( RCFile f ) { int i; CMMCIFCategory::write ( f ); for (i=0;i0) { GetVectorMemory ( field,nTags,0 ); for (i=0;i=nTags) { delete[] field[j]; // delete empty row field[j] = NULL; } else nR++; // count non-empty row } if ((nT<=0) || (nR<=0)) FreeMemory(); // the loop is completely empty else if ((nT!=nTags) || (nR!=nAllocRows)) { f1 = new psvector[nR]; m = 0; for (j=0;jnAllocRows) { nAR = nRowsNew + IMin(nAllocRows/2+10,2000); field1 = new psvector[nAR]; for (i=0;i=nTags) iColumn = 0; } } } void CMMCIFLoop::AddNoData ( int NoDataType ) { char S[10]; S[0] = char(2); if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; else S[1] = '?'; S[2] = char(0); AddString ( S ); } void CMMCIFLoop::AddReal ( realtype R, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); AddString ( rS ); } void CMMCIFLoop::AddInteger ( int I ) { char iS[100]; if (I>MinInt4) { sprintf ( iS,"%i",I ); AddString ( iS ); } else AddNoData ( CIF_NODATA_DOT ); } pstr CMMCIFLoop::GetField ( int rowNo, int tagNo ) { if ((tagNo>=0) && (tagNo=0) && (rowNo=nRows)) return CIFRC_WrongIndex; if (!field[nrow]) return CIFRC_NoField; if (!field[nrow][k]) return CIFRC_NoField; if (field[nrow][k][0]==char(2)) { if (Remove) { delete[] field[nrow][k]; field[nrow][k] = NULL; } } else if (Remove) { S = field[nrow][k]; field[nrow][k] = NULL; } else CreateCopy ( S,field[nrow][k] ); return 0; } pstr CMMCIFLoop::GetString ( cpstr TName, int nrow, int & RC ) { int k = GetTagNo ( TName ); if (k<0) { RC = CIFRC_NoTag; return NULL; } if ((nrow<0) || (nrow>=nRows)) { RC = CIFRC_WrongIndex; return NULL; } if (!field[nrow]) { RC = CIFRC_NoField; return NULL; } if (!field[nrow][k]) { RC = CIFRC_NoField; return NULL; } RC = 0; // char(2) means the field was either '.' or '?' if (field[nrow][k][0]==char(2)) return NULL; return field[nrow][k]; } int CMMCIFLoop::DeleteField ( cpstr TName, int nrow ) { int k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if ((nrow<0) || (nrow>=nRows)) return CIFRC_WrongIndex; if (field[nrow]) { if (field[nrow][k]) delete[] field[nrow][k]; field[nrow][k] = NULL; } return k; } int CMMCIFLoop::DeleteRow ( int nrow ) { int i; if ((nrow<0) || (nrow>=nRows)) return CIFRC_WrongIndex; if (field[nrow]) { for (i=0;i=nRows)) return CIFRC_WrongIndex; R = 0.0; if (!field[nrow]) return CIFRC_NoField; if (!field[nrow][k]) return CIFRC_NoField; if (field[nrow][k][0]==char(2)) return CIFRC_NoField; R = strtod ( field[nrow][k],&endptr ); if (endptr==field[nrow][k]) return CIFRC_WrongFormat; if (Remove) { delete[] field[nrow][k]; field[nrow][k] = NULL; } return 0; } int CMMCIFLoop::GetInteger ( int & I, cpstr TName, int nrow, Boolean Remove ) { pstr endptr; int k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if ((nrow<0) || (nrow>=nRows)) return CIFRC_WrongIndex; I = 0; if (!field[nrow]) return CIFRC_NoField; if (!field[nrow][k]) return CIFRC_NoField; if (field[nrow][k][0]==char(2)) { if (field[nrow][k][1]=='.') I = MinInt4; return CIFRC_NoField; } I = mround ( strtod(field[nrow][k],&endptr) ); if (endptr==field[nrow][k]) return CIFRC_WrongFormat; if (Remove) { delete[] field[nrow][k]; field[nrow][k] = NULL; } return 0; } int CMMCIFLoop::GetSVector ( psvector & S, cpstr TName, int i1, int i2, Boolean Remove ) { int j,k,r1,r2; r1 = IMin(i1,i2); r2 = IMin(IMax(i1,i2),nRows-1); if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if (!S) GetVectorMemory ( S,r2-r1+1,r1 ); if (Remove) { for (j=r1;j<=r2;j++) if (field[j]) { S[j] = field[j][k]; field[j][k] = NULL; if (S[j]) { if (S[j][0]==char(2)) { delete[] S[j]; S[j] = NULL; } } } else S[j] = NULL; } else { for (j=r1;j<=r2;j++) { S[j] = NULL; if (field[j]) { if (field[j][k]) { if (field[j][k][0]!=char(2)) CreateCopy ( S[j],field[j][k] ); } } } } return 0; } int CMMCIFLoop::GetRVector ( rvector & R, cpstr TName, int i1, int i2, Boolean Remove ) { int j,k,r1,r2,RC; pstr endptr; r1 = IMin(i1,i2); r2 = IMin(IMax(i1,i2),nRows-1); if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if (!R) GetVectorMemory ( R,r2-r1+1,r1 ); RC = 0; for (j=r1;j<=r2;j++) { R[j] = 0.0; if (field[j]) { if (field[j][k]) { R[j] = strtod ( field[j][k],&endptr ); if (endptr==field[j][k]) RC = CIFRC_WrongFormat; if (Remove) { delete[] field[j][k]; field[j][k] = NULL; } } } } return RC; } int CMMCIFLoop::GetIVector ( ivector & I, cpstr TName, int i1, int i2, Boolean Remove ) { int j,k,r1,r2,RC; pstr endptr; r1 = IMin(i1,i2); r2 = IMin(IMax(i1,i2),nRows-1); if ((r1<0) || (r1>=nRows) || (r2<0)) return CIFRC_WrongIndex; k = GetTagNo ( TName ); if (k<0) return CIFRC_NoTag; if (!I) GetVectorMemory ( I,r2-r1+1,r1 ); RC = 0; for (j=r1;j<=r2;j++) { I[j] = 0; if (field[j]) { if (field[j][k]) { I[j] = mround ( strtod(field[j][k],&endptr) ); if (endptr==field[j][k]) RC = CIFRC_WrongFormat; if (Remove) { delete[] field[j][k]; field[j][k] = NULL; } } } } return RC; } void CMMCIFLoop::PutString ( cpstr S, cpstr T, int nrow ) { psmatrix field1; int nT,nR,iT,i,j; nT = nTags; nR = nRows; iT = AddTag ( T ); if (iT<0) iT = nTags-1; if (nTags>nT) { // a new tag has been added; all field must be reallocated. nRows = IMax(nR,nrow+1); // nrow is indexed like 0,1,... nAllocRows = IMax(nR,nrow+IMin(nR/2+1,2000)); field1 = new psvector[nAllocRows]; for (i=0;i=nR) { // only new rows are to be added ExpandRows ( nrow+1 ); nRows++; } if (!field[nrow]) { field[nrow] = new pstr[nTags]; for (j=0;j=nTags) iColumn = 0; } void CMMCIFLoop::PutNoData ( int NoDataType, cpstr T, int nrow ) { char S[10]; S[0] = char(2); if (NoDataType==CIF_NODATA_DOT) S[1] = '.'; else S[1] = '?'; S[2] = char(0); PutString ( S,T,nrow ); } void CMMCIFLoop::PutReal ( realtype R, cpstr T, int nrow, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); PutString ( rS,T,nrow ); } void CMMCIFLoop::PutInteger ( int I, cpstr T, int nrow ) { char iS[100]; if (I>MinInt4) { sprintf ( iS,"%i",I ); PutString ( iS,T,nrow ); } else PutNoData ( CIF_NODATA_DOT,T,nrow ); } void CMMCIFLoop::PutSVector ( psvector S, cpstr T, int i1, int i2 ) { int i,j,k; PutString ( S[i2],T,i2 ); if (iColumn==0) k = nTags-1; else k = iColumn-1; for (i=i2-1;i>=i1;i--) { if (!field[i]) { field[i] = new pstr[nTags]; for (j=0;j=i1;i--) { if (!field[i]) { field[i] = new pstr[nTags]; for (j=0;j=i1;l--) { if (!field[l]) { field[l] = new pstr[nTags]; for (j=0;j76) { l[i] = -l[i]; k = 0; } } for (i=0;i76) { f.LF(); m = k+1; } else while (n>0) { f.Write ( pstr(" ") ); n--; } if (field[i]) { if (field[i][j]) { F = field[i][j]; if (k>10000) { if (F[0]==char(2)) { f.Write ( pstr(" ") ); f.WriteLine ( &(F[1]) ); } else if (!F[0]) { f.Write ( pstr(" ") ); f.WriteLine ( NODATA_P ); } else { f.Write ( pstr(";") ); f.WriteLine ( F ); f.WriteLine ( pstr(";") ); } m = 0; k = 0; } else if ((((F[0]=='.') || (F[0]=='?')) && (!F[1])) || strchr(F,' ')) { f.Write ( pstr(" \"") ); f.Write ( F ); f.Write ( pstr("\"") ); k -= strlen(F)+2; } else if (F[0]==char(2)) { f.Write ( pstr(" ") ); f.Write ( &(F[1]) ); k--; } else if (!F[0]) { f.Write ( pstr(" ") ); f.Write ( NODATA_P ); k--; } else { f.Write ( pstr(" ") ); f.Write ( F ); k -= strlen(F); } } else { f.Write ( pstr(" ") ); f.Write ( NODATA_Q ); k--; } } else { f.Write ( pstr(" ") ); f.Write ( NODATA_Q ); k--; } } if (m) f.LF(); } } void CMMCIFLoop::Copy ( PCMMCIFCategory Loop ) { int i,j; CMMCIFCategory::Copy ( Loop ); nRows = PCMMCIFLoop(Loop)->nRows; nAllocRows = nRows; if ((nTags>0) && (nRows>0)) { field = new psvector[nRows]; for (i=0;ifield[i]) { field[i] = new pstr[nTags]; for (j=0;jfield[i][j] ); } } else field[i] = NULL; } } iColumn = PCMMCIFLoop(Loop)->iColumn; } void CMMCIFLoop::write ( RCFile f ) { int i,j; CMMCIFCategory::write ( f ); f.WriteInt ( &nRows ); if ((nTags>0) && (nRows>0)) for (i=0;i0) && (nRows>0)) { field = new psvector[nRows]; for (i=0;i0) { WrongCat = new pstr[nWrongFields]; WrongTag = new pstr[nWrongFields]; for (i=0;i>\n",lcount ); return CIFRC_NoDataLine; } llen = 500; L = new char[llen]; i = 0; p += 5; while ((*p) && (*p!=' ') && (*p!=char(9))) { L[i++] = *p; p++; } L[i] = char(0); CreateCopy ( name,L ); // 2. Loop over tags until next 'data_' or end of file while (p) { // skip spaces while ((*p==' ') || (*p==char(9))) p++; if ((*p) && (*p!='#')) { // this is not a comment, continue if (*p=='_') GetDataItem ( f,S,L,p,lcount,llen ); else if (!strncmp(p,"loop_",5)) GetLoop ( f,S,L,p,lcount,llen ); else if (!strncmp(p,"data_",5)) { p = NULL; break; } else { // if got to here, the file is corrupted Warning |= CIFW_UnrecognizedItems; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,S ); while ((*p) && (*p!=' ') && (*p!=char(9))) if (*p=='#') *p = char(0); else p++; } } else *p = char(0); if (Warning && (flags & CIFFL_StopOnWarnings)) { if (L) delete[] L; return Warning; } if (!(*p)) { if (!f.FileEnd()) { f.ReadLine ( S ); lcount++; p = &(S[0]); } else p = NULL; } } if (L) delete[] L; Optimize(); // get rid of over-allocated fields. return Warning; } void CMMCIFData::GetDataItem ( RCFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ) { PCMMCIFStruct Struct; char T[100]; int RC,i; i = 0; while ((*p) && (*p!=' ') && (*p!=char(9)) && (*p!='.')) { if (i<(int)sizeof(T)-1) T[i++] = *p; p++; } T[i] = char(0); if (*p!='.') { // category name missing strcpy ( L,T ); // item name T[0] = char(1); // special T[1] = char(0); // category name } // look for category i = AddCategory ( T ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Struct = new CMMCIFStruct ( T ); Category[nCategories-1] = Struct; } else { Struct = PCMMCIFStruct(Category[i]); if (Struct->GetCategoryID()!=MMCIF_Struct) { Warning |= CIFW_NotAStructure; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,T,S ); delete Category[i]; Struct = new CMMCIFStruct ( T ); Category[i] = Struct; } } if (*p=='.') { // get item name i = 0; p++; // skip period while ((*p) && (*p!=' ') && (*p!=char(9))) { T[i++] = *p; p++; } T[i] = char(0); } else strcpy ( T,L ); if (nWrongFields>0) { if (CheckWrongField(Struct->name,T)) { GetField ( f,S,L,p,lcount,llen ); Struct->DeleteField ( T ); return; } } RC = GetField ( f,S,L,p,lcount,llen ); if (RC) { Warning |= CIFW_MissingField; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,S ); } while ((*p==' ') || (*p==char(9))) p++; if (*p=='#') *p = char(0); i = Struct->GetTagNo ( T ); if (i>=0) { if (flags & CIFFL_SuggestTags) { tagNo++; ParamStr ( T,pstr("\1"),tagNo ); } else { Warning |= CIFW_DuplicatedTag; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,S ); } } Struct->AddField ( L,T ); } void CMMCIFData::GetLoop ( RCFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ) { PCMMCIFLoop Loop; pstr p1; char T[100]; Boolean Repeat,WrongField; int RC,i,nC; p += 5; // skip 'loop_' tag loopNo++; Loop = NULL; nC = -1; // undefined category number do { while ((*p==' ') || (*p==char(9))) p++; p1 = p; if (*p=='_') { // get category name i = 0; while ((*p) && (*p!=' ') && (*p!=char(9)) && (*p!='.')) { if (i<(int)sizeof(T)-1) T[i++] = *p; p++; } T[i] = char(0); if (*p!='.') { // category name missing strcpy ( L,T ); // item name if (flags & CIFFL_SuggestCategories) sprintf ( T,"X%i",loopNo ); else strcpy ( T,"X" ); T[0] = char(1); // special category name } if (Loop) { if (strcmp(Loop->GetCategoryName(),T)) { // loop ended, empty p = p1; // play back to last category Loop = NULL; } } else { // look for category i = AddCategory ( T ); if ((i!=nC) && (nC>=0)) { // empty loop; most probably // a corrupted file p = p1; // play back to last category Warning |= CIFW_EmptyLoop; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,S ); // AddCategory(..) has added a NULL-Category on the top of // category list; remove it now DeleteCategory ( nCategories-1 ); Loop = NULL; // return; } if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Loop = new CMMCIFLoop ( T ); Category[nCategories-1] = Loop; nC = nCategories-1; } } /* else if (Loop) { if (!strcmp(Loop->GetCategoryName(), Category[i]->GetCategoryName())) { if (Loop->GetCategoryID()!=MMCIF_Loop) { Warning |= CIFW_NotALoop; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,T,S ); delete Category[i]; Loop = new CMMCIFLoop ( T ); Category[i] = Loop; } } else Loop = NULL; } */ if (Loop) { if (*p=='.') { // get item name i = 0; p++; // skip period while ((*p) && (*p!=' ') && (*p!=char(9))) { T[i++] = *p; p++; } T[i] = char(0); } else strcpy ( T,L ); if (nWrongFields>0) WrongField = CheckWrongField ( Loop->name,T ); else WrongField = False; if (!WrongField) { if (Loop->AddTag(T)>=0) { if (flags & CIFFL_SuggestTags) { tagNo++; ParamStr ( T,pstr("\1"),tagNo ); Loop->AddTag(T); } else { Warning |= CIFW_DuplicatedTag; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n",lcount,S ); } } } Repeat = True; } else { p = p1; Repeat = False; } } else if (!(*p) || (*p=='#')) { Repeat = !f.FileEnd(); if (Repeat) { f.ReadLine ( S ); lcount++; p = &(S[0]); } else { Warning |= CIFW_UnexpectedEOF; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,S ); } } else Repeat = False; } while (Repeat); if (Loop) { do { while ((*p==' ') || (*p==char(9))) p++; if (!(*p) || (*p=='#')) { Repeat = !f.FileEnd(); if (Repeat) { f.ReadLine ( S ); lcount++; p = &(S[0]); } } else if (*p=='_') Repeat = False; else if (!strncmp(p,"loop_",5)) Repeat = False; else if (!strncmp(p,"data_",5)) Repeat = False; else if (!strncmp(p,"stop_",5)) { p += 5; Repeat = False; } else { RC = GetField ( f,S,L,p,lcount,llen ); if (!RC) { Loop->AddString ( L ); Repeat = True; } else Repeat = False; } } while (Repeat); if ((Loop->iColumn!=0) || (RC)) { Warning |= CIFW_LoopFieldMissing; if (flags & CIFFL_PrintWarnings) printf ( "\n **** mmCIF READ WARNING " "<>\n%s\n", lcount,S ); } } } int CMMCIFData::GetField ( RCFile f, pstr S, pstr & L, pstr & p, int & lcount, int & llen ) { Boolean Repeat; pstr L1; int i,flen; char c; flen = 0; L[flen] = char(0); do { // skip all spaces before the field while ((*p==' ') || (*p==char(9))) p++; if ((*p=='#') || (!(*p))) { // comment or end of line met; the field should be // found on the next line Repeat = !f.FileEnd(); if (Repeat) { // take the next line f.ReadLine ( S ); lcount++; p = &(S[0]); Repeat = (*p!=';'); } else { // end of file and the field is not taken L[0] = char(0); return 1; } } else // first symbol of a field is found Repeat = False; } while (Repeat); if (*p==';') { // this is a multiline field p++; strcpy ( L,p ); // take first line of the field flen = strlen(L); while (!f.FileEnd()) { f.ReadLine ( S ); lcount++; p = &(S[0]); if (*p==';') { // multiline field terminated p++; while ((*p==' ') || (*p==char(9))) p++; return 0; } else { // multiline field continues -- take next line flen += strlen(S)+2; if (flen>=llen) { llen = flen + IMin(2000,llen); L1 = new char[llen]; strcpy ( L1,L ); delete[] L; L = L1; } strcat ( L,"\n" ); strcat ( L,S ); } } // end of file -- take the last line of the multiline field p = &(S[strlen(S)]); } else { i = 0; if (*p!='_') { if ((*p=='\'') || (*p=='"')) { c = *p; // field in quotation marks do { p++; // stop taking characters either on end of line // or the quotation mark while ((*p) && (*p!=c)) { L[i++] = *p; p++; } while (*p==c) { // it was a quotation mark -- check that it is followed // by end of line or space p++; if ((*p) && (*p!=' ') && (*p!=char(9))) { // the quotation mark is not a field terminator and // belongs to the field. L[i++] = c; // take the quotation mark if (*p!=c) // take the non-space character L[i++] = *p; // but check for field terminator } } // terminate the loop only on space or end of line } while ((*p) && (*p!=' ') && (*p!=char(9))); if (*p) p++; L[i] = char(0); } else { // a simplest field without spaces while ((*p) && (*p!=' ') && (*p!=char(9))) { L[i++] = *p; p++; } L[i] = char(0); if (((L[0]=='.') || (L[0]=='?')) && (!L[1])) { // "no data" tokens L[1] = L[0]; L[0] = char(2); L[2] = char(0); } } } } return 0; } void CMMCIFData::Sort() { int i,k; psvector cnames; k = 0; for (i=0;iSort(); cnames[i] = NULL; CreateCopy ( cnames[i],Category[i]->name ); } SortTags ( cnames,nCategories,index ); for (i=0;i=0 : position of the category found // <0 : the category was not found, it could be inserted before // (-RC-1)th element, where RC is the return value int l1,l2,l,k; l = 0; // may become undefined in not initialized if (!Category) return -1; if (!index) Sort(); if (cname[0]) { l1 = 0; l2 = nCategories-1; k = 1; while (l1name ); if (k<0) l2 = l; else if (k>0) l1 = l; else { l1 = l; break; } } if (k==0) return index[l]; // is at RCth position k = strcasecmp(cname,Category[index[l1]]->name); if (k==0) return index[l1]; // is at RCth position if (k<0) return -1; // would be at (-RC-1)th position if (l2!=l1) { k = strcasecmp(cname,Category[index[l2]]->name); if (k==0) return index[l2]; // is at RCth position if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position } return -2-l1; // would be at l1+1=(-RC-1)th position } else // 'root' category should be always on top if (Category[index[0]]->name[0]==char(1)) return index[0]; return -1; } int CMMCIFData::AddCategory ( cpstr cname ) { // return -1: a place for category has been added on the top of array; // index is added and sorted automatically // >=0: the category is already in the array -- its position // is returned int l1,l; PPCMMCIFCategory Category1; ivector index1; if (!Category) { Category = new PCMMCIFCategory[1]; Category[0] = NULL; GetVectorMemory ( index,1,0 ); index[0] = 0; nCategories = 1; return -nCategories; // the category has been added on the top of array } l1 = GetCategoryNo ( cname ); if (l1>=0) return l1; // non-negative returns mean that // the category is already in the array l1 = -l1-1; // otherwise the category has to be added and indexed at here // put new NULL-category on the top of array and update the index Category1 = new PCMMCIFCategory[nCategories+1]; GetVectorMemory ( index1,nCategories+1,0 ); for (l=0;lWriteMMCIF ( f ); } // --------------- Retrieving data int CMMCIFData::DeleteCategory ( cpstr CName ) { int k; k = GetCategoryNo ( CName ); if (k<0) return CIFRC_NoCategory; return DeleteCategory ( k ); } int CMMCIFData::DeleteCategory ( int CatNo ) { int i; if (Category[CatNo]) delete Category[CatNo]; for (i=CatNo+1;iCatNo) index[i]--; i++; } i++; while (iCatNo) index[i]--; index[i-1] = index[i]; i++; } nCategories--; index [nCategories] = 0; Category[nCategories] = NULL; return 0; } int CMMCIFData::DeleteStructure ( cpstr CName ) { int k; k = GetCategoryNo ( CName ); if (k<0) return CIFRC_NoCategory; if (Category[k]->GetCategoryID()==MMCIF_Struct) return DeleteCategory ( k ); else return CIFRC_NotAStructure; } int CMMCIFData::DeleteLoop ( cpstr CName ) { int k; k = GetCategoryNo ( CName ); if (k<0) return CIFRC_NoCategory; if (Category[k]->GetCategoryID()==MMCIF_Loop) return DeleteCategory ( k ); else return CIFRC_NotALoop; } PCMMCIFCategory CMMCIFData::GetCategory ( int categoryNo ) { if ((categoryNo>=0) && (categoryNoGetCategoryID()==MMCIF_Struct) return PCMMCIFStruct(Category[i]); else return NULL; } PCMMCIFLoop CMMCIFData::GetLoop ( cpstr CName ) { int i; i = GetCategoryNo ( CName ); if (i<0) return NULL; if (Category[i]->GetCategoryID()==MMCIF_Loop) return PCMMCIFLoop(Category[i]); else return NULL; } PCMMCIFLoop CMMCIFData::FindLoop ( pstr * tagList ) { int i; for (i=0;iGetCategoryID()==MMCIF_Loop) { if (Category[i]->CheckTags(tagList)) return PCMMCIFLoop(Category[i]); } } return NULL; } void CMMCIFData::GetDataName ( pstr & dname, Boolean Remove ) { if (Remove) { if (dname) delete[] dname; dname = name; name = NULL; } else CreateCopy ( dname,name ); } int CMMCIFData::CheckData ( cpstr CName, cpstr TName ) { // CheckData(..) returns positive value if the field is in the // file: // CIFRC_Structure category CName is a structure // CIFRC_Loop category CName is a loop // Negative returns mean: // CIFRC_StructureNoTag category CName is present, // it is a structure, but it does not // have tag TName // CIFRC_LoopNoTag category CName is present, // it is a loop, but it does not have // tag TName // CIFRC_NoCategory category CName is not present. // If TName is set to NULL then only the CName is checked and // possible returns are CIFRC_Structure, CIFRC_Loop and // CIFRC_NoCategory. int i,k; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()==MMCIF_Struct) k = CIFRC_Structure; else k = CIFRC_Loop; if (TName) { if (Category[i]->GetTagNo(TName)<0) { if (k==CIFRC_Structure) k = CIFRC_StructureNoTag; else k = CIFRC_LoopNoTag; } } return k; } void CMMCIFData::Optimize() { int i,k; PPCMMCIFCategory C1; k = 0; for (i=0;iOptimize(); if (Category[i]->nTags<=0) { delete Category[i]; Category[i] = NULL; } else k++; } if (k>0) { if (k!=nCategories) { C1 = new PCMMCIFCategory[k]; k = 0; for (i=0;iGetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PCMMCIFStruct(Category[i])->GetString ( Dest,TName,Remove ); } pstr CMMCIFData::GetString ( cpstr CName, cpstr TName, int & RC ) { int i = GetCategoryNo ( CName ); if (i<0) { RC = CIFRC_NoCategory; return NULL; } if (Category[i]->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; return NULL; } return PCMMCIFStruct(Category[i])->GetString ( TName,RC ); } int CMMCIFData::DeleteField ( cpstr CName, cpstr TName ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PCMMCIFStruct(Category[i])->DeleteField ( TName ); } int CMMCIFData::GetReal ( realtype & R, cpstr CName, cpstr TName, Boolean Remove ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PCMMCIFStruct(Category[i])->GetReal ( R,TName,Remove ); } int CMMCIFData::GetInteger ( int & I, cpstr CName, cpstr TName, Boolean Remove ) { int j = GetCategoryNo ( CName ); if (j<0) return CIFRC_NoCategory; if (Category[j]->GetCategoryID()!=MMCIF_Struct) return CIFRC_NotAStructure; return PCMMCIFStruct(Category[j])->GetInteger ( I,TName,Remove ); } int CMMCIFData::GetLoopLength ( cpstr CName ) { // GetLoopLength(..) returns CIFRC_NotALoop if the category CName // is not a loop, CIFRC_NoCategory if the category CName is not // found. Non-negative returns give the length of the loop (may be // 0 if the loop is empty). int i; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[i])->nRows; } int CMMCIFData::GetLoopString ( pstr & Dest, cpstr CName, cpstr TName, int nrow, Boolean Remove ) { // GetLoopString(..), GetLoopReal(..) and GetLoopInteger(..) act // like GetString(..), GetReal(..) and GetInteger(..) above for // nrow-th element of the 'loop_' (indexed like 0..N-1 where N // is obtained through GetLoopLength(..)). They will return // CIFRC_WrongIndex if nrow is out of range. int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[i])->GetString ( Dest,TName,nrow,Remove ); } pstr CMMCIFData::GetLoopString ( cpstr CName, cpstr TName, int nrow, int & RC ) { int i = GetCategoryNo ( CName ); if (i<0) { RC = CIFRC_NoCategory; return NULL; } if (Category[i]->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; return NULL; } return PCMMCIFLoop(Category[i])->GetString ( TName,nrow,RC ); } int CMMCIFData::DeleteLoopField ( cpstr CName, cpstr TName, int nrow ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[i])->DeleteField ( TName,nrow ); } int CMMCIFData::GetLoopReal ( realtype & R, cpstr CName, cpstr TName, int nrow, Boolean Remove ) { int i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[i])->GetReal ( R,TName,nrow,Remove ); } int CMMCIFData::GetLoopInteger ( int & I, cpstr CName, cpstr TName, int nrow, Boolean Remove ) { int j = GetCategoryNo ( CName ); if (j<0) return CIFRC_NoCategory; if (Category[j]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[j])->GetInteger ( I,TName,nrow,Remove ); } int CMMCIFData::GetLoopSVector ( psvector & S, cpstr CName, cpstr TName, int i1, int i2, Boolean Remove ) { // GetLoopSVector(..), GetLoopRVector(..) and GetLoopIVector(..) // read CIF 'loop_' data into allocated vectors of strings, reals and // integers, correspondingly. The vectors may be deallocated prior // to call and assigned NULL, in which case they will be allocated // with offsets of i1, which is also the lower index of the 'loop_' // data transferred into it. The upper vector index is given by i2 or // by the loop's length whichever is less. If vectors are not assigned // NULL prior the call, it is assumed that they are properly (i1-offset, // i2-i1+1 length) allocated. // The return codes are same as those of GetLoopString(..), // GetLoopReal(..) and GetLoopInteger(..). int i; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[i])->GetSVector ( S,TName,i1,i2,Remove ); } int CMMCIFData::GetLoopRVector ( rvector & R, cpstr CName, cpstr TName, int i1, int i2, Boolean Remove ) { int i; i = GetCategoryNo ( CName ); if (i<0) return CIFRC_NoCategory; if (Category[i]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[i])->GetRVector ( R,TName,i1,i2,Remove ); } int CMMCIFData::GetLoopIVector ( ivector & I, cpstr CName, cpstr TName, int i1, int i2, Boolean Remove ) { int j; j = GetCategoryNo ( CName ); if (j<0) return CIFRC_NoCategory; if (Category[j]->GetCategoryID()!=MMCIF_Loop) return CIFRC_NotALoop; return PCMMCIFLoop(Category[j])->GetIVector ( I,TName,i1,i2,Remove ); } // --------------- Storing data void CMMCIFData::PutDataName ( cpstr dname ) { // stores name for 'data_' record CreateCopy ( name,dname ); } int CMMCIFData::PutNoData ( int NoDataType, cpstr CName, cpstr TName ) { PCMMCIFStruct Struct; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Struct = new CMMCIFStruct ( CName ); Category[nCategories-1] = Struct; } else { Struct = PCMMCIFStruct(Category[i]); if (Struct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; Struct = new CMMCIFStruct ( CName ); Category[i] = Struct; } } Struct->PutNoData ( NoDataType,TName ); return RC; } int CMMCIFData::PutString ( cpstr S, cpstr CName, cpstr TName, Boolean Concatenate ) { // PutString(..), PutReal(..) and PutInteger(..) will put the // values given into the specified category (CName) under the // specified tag (TName). The category, tag and field are created // automatically; the field will be replaced silently if identical // CName.TName is specified in two calls. Calls of these functions // may follow in random order; however CIF file will have all tags // grouped by categories and catgories will follow in the order // of first appearance in PutString(..), PutReal(..) or // PutInteger(..). // Return code - one of CIFRC_Ok or CIFRC_NotAStruct PCMMCIFStruct Struct; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Struct = new CMMCIFStruct ( CName ); Category[nCategories-1] = Struct; } else { Struct = PCMMCIFStruct(Category[i]); if (Struct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; Struct = new CMMCIFStruct ( CName ); Category[i] = Struct; } } Struct->AddField ( S,TName,Concatenate ); return RC; } int CMMCIFData::PutDate ( cpstr CName, cpstr TName ) { PCMMCIFStruct Struct; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Struct = new CMMCIFStruct ( CName ); Category[nCategories-1] = Struct; } else { Struct = PCMMCIFStruct(Category[i]); if (Struct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; Struct = new CMMCIFStruct ( CName ); Category[i] = Struct; } } Struct->PutDate ( TName ); return RC; } int CMMCIFData::PutReal ( realtype R, cpstr CName, cpstr TName, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); return PutString ( rS,CName,TName,False ); } int CMMCIFData::PutInteger ( int I, cpstr CName, cpstr TName ) { char iS[100]; if (I>MinInt4) sprintf ( iS,"%i",I ); else { iS[0] = char(2); iS[1] = '.'; iS[2] = char(0); } return PutString ( iS,CName,TName,False ); } int CMMCIFData::AddLoop ( cpstr CName, PCMMCIFLoop & Loop ) { int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Loop = new CMMCIFLoop ( CName ); Category[nCategories-1] = Loop; RC = CIFRC_Created; } else { Loop = PCMMCIFLoop(Category[i]); if (Loop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; Loop = new CMMCIFLoop ( CName ); Category[i] = Loop; } } return RC; } int CMMCIFData::AddStructure ( cpstr CName, PCMMCIFStruct & Struct ) { int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Struct = new CMMCIFStruct ( CName ); Category[nCategories-1] = Struct; RC = CIFRC_Created; } else { Struct = PCMMCIFStruct(Category[i]); if (Struct->GetCategoryID()!=MMCIF_Struct) { RC = CIFRC_NotAStructure; delete Category[i]; Struct = new CMMCIFStruct ( CName ); Category[i] = Struct; } } return RC; } int CMMCIFData::PutLoopNoData ( int NoDataType, cpstr CName, cpstr TName, int nrow ) { PCMMCIFLoop Loop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Loop = new CMMCIFLoop ( CName ); Category[nCategories-1] = Loop; } else { Loop = PCMMCIFLoop(Category[i]); if (Loop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; Loop = new CMMCIFLoop ( CName ); Category[i] = Loop; } } Loop->PutNoData ( NoDataType,TName,nrow ); return RC; } int CMMCIFData::PutLoopString ( cpstr S, cpstr CName, cpstr TName, int nrow ) { // PutLoopString(..), PutLoopReal(..) and PutLoopInteger(..) act // like PutString(..), PutReal(..) and PutInteger(..) above for // nrow-th element of the 'loop_' CName (indexed begining from 0). // In consequitive calls, given values of nrow does not have to be // ordered; the most efficient way is to start with HIGHEST value // for nrow in the loop and move down to 0. The least efficient way // is to start with nrow=0 and move up. PCMMCIFLoop Loop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Loop = new CMMCIFLoop ( CName ); Category[nCategories-1] = Loop; } else { Loop = PCMMCIFLoop(Category[i]); if (Loop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; Loop = new CMMCIFLoop ( CName ); Category[i] = Loop; } } Loop->PutString ( S,TName,nrow ); return RC; } int CMMCIFData::PutLoopReal ( realtype R, cpstr CName, cpstr TName, int nrow, int prec ) { char rS[100]; sprintf ( rS,"%.*g",prec,R ); return PutLoopString ( rS,CName,TName,nrow ); } int CMMCIFData::PutLoopInteger ( int I, cpstr CName, cpstr TName, int nrow ) { char iS[100]; sprintf ( iS,"%i",I ); return PutLoopString ( iS,CName,TName,nrow ); } int CMMCIFData::PutLoopSVector ( psvector S, cpstr CName, cpstr TName, int i1, int i2 ) { // PutLoopSVector(..), PutLoopRVector(..) and PutLoopIVector(..) // put vectors of values into specified loop fields. Parameters i1 // and i2 give the range of indices of values which are to be // transfered. To transfer an entire vector allocated as [0..N-1] // i1 shoudl be set to 0 and i2 - to N-1. Note that the loop is // always indexed as starting form 0 on, therefore negative i1 and // i2 are not allowed, and specifying i1>0 will leave first i1 // elements of the CIF loop for the corresponding tag undefined // (will be output like '?'). PCMMCIFLoop Loop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Loop = new CMMCIFLoop ( CName ); Category[nCategories-1] = Loop; } else { Loop = PCMMCIFLoop(Category[i]); if (Loop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; Loop = new CMMCIFLoop ( CName ); Category[i] = Loop; } } Loop->PutSVector ( S,TName,i1,i2 ); return RC; } int CMMCIFData::PutLoopRVector ( rvector R, cpstr CName, cpstr TName, int i1, int i2, int prec ) { PCMMCIFLoop Loop; int i,RC; RC = CIFRC_Ok; // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Loop = new CMMCIFLoop ( CName ); Category[nCategories-1] = Loop; } else { Loop = PCMMCIFLoop(Category[i]); if (Loop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[i]; Loop = new CMMCIFLoop ( CName ); Category[i] = Loop; } } Loop->PutRVector ( R,TName,i1,i2,prec ); return RC; } int CMMCIFData::PutLoopIVector ( ivector I, cpstr CName, cpstr TName, int i1, int i2 ) { PCMMCIFLoop Loop; int j,RC; RC = CIFRC_Ok; // look for category j = AddCategory ( CName ); if (j<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated Loop = new CMMCIFLoop ( CName ); Category[nCategories-1] = Loop; } else { Loop = PCMMCIFLoop(Category[j]); if (Loop->GetCategoryID()!=MMCIF_Loop) { RC = CIFRC_NotALoop; delete Category[j]; Loop = new CMMCIFLoop ( CName ); Category[j] = Loop; } } Loop->PutIVector ( I,TName,i1,i2 ); return RC; } int CMMCIFData::RenameCategory ( cpstr CName, cpstr newCName ) { int i,RC; i = GetCategoryNo ( CName ); if (i>=0) { Category[i]->PutCategoryName ( newCName ); Sort(); RC = CIFRC_Ok; } else RC = CIFRC_NoCategory; return RC; } void CMMCIFData::Copy ( PCMMCIFData Data ) { int i; FreeMemory(0); CreateCopy ( name,Data->name ); nCategories = Data->nCategories; if (nCategories>0) { Category = new PCMMCIFCategory[nCategories]; GetVectorMemory ( index,nCategories,0 ); for (i=0;iCategory[i]) { if (Data->Category[i]->GetCategoryID()==MMCIF_Struct) Category[i] = new CMMCIFStruct(); else Category[i] = new CMMCIFLoop(); Category[i]->Copy ( Data->Category[i] ); } else Category[i] = NULL; index[i] = Data->index[i]; } } flags = Data->flags; Warning = Data->Warning; } int CMMCIFData::CopyCategory ( PCMMCIFData Data, cpstr CName, cpstr newCName ) { PCMMCIFCategory Cat; int i,di,dc,RC; di = Data->GetCategoryNo ( CName ); if (di>=0) { RC = CIFRC_Ok; dc = Data->Category[di]->GetCategoryID(); // look for category i = AddCategory ( CName ); if (i<0) { // negative value means that the category was not in the list, // but a place for it has been provided and index updated if (dc==MMCIF_Loop) Cat = new CMMCIFLoop ( CName ); else Cat = new CMMCIFStruct ( CName ); Category[nCategories-1] = Cat; } else { Cat = Category[i]; if (Cat->GetCategoryID()!=dc) { RC = CIFRC_NotAStructure; delete Category[i]; if (dc==MMCIF_Loop) Cat = new CMMCIFLoop ( CName ); else Cat = new CMMCIFStruct ( CName ); Category[i] = Cat; } } Cat->Copy ( Data->Category[di] ); if (newCName) { Cat->PutCategoryName ( newCName ); Sort(); } } else RC = CIFRC_NoCategory; return RC; } void CMMCIFData::PrintCategories() { // for debuging only int i; printf ( " Total %i categories:\n",nCategories ); for (i=0;iGetCategoryID()==MMCIF_Loop) printf ( "Loop %s\n",Category[i]->name ); else printf ( "Structure %s\n",Category[i]->name ); } } void CMMCIFData::write ( RCFile f ) { int i,k; if (!index) Sort(); f.CreateWrite ( name ); f.WriteInt ( &nCategories ); for (i=0;iGetCategoryID(); f.WriteInt ( &k ); Category[i]->write ( f ); } else { k = -1; f.WriteInt ( &k ); } f.WriteInt ( &(index[i]) ); } f.WriteInt ( &flags ); f.WriteInt ( &Warning ); } void CMMCIFData::read ( RCFile f ) { int i,k; FreeMemory(0); f.CreateRead ( name ); f.ReadInt ( &nCategories ); if (nCategories>0) { Category = new PCMMCIFCategory[nCategories]; GetVectorMemory ( index,nCategories,0 ); for (i=0;i=0) { if (k==MMCIF_Struct) Category[i] = new CMMCIFStruct(); else Category[i] = new CMMCIFLoop(); Category[i]->read ( f ); } else Category[i] = NULL; f.ReadInt ( &(index[i]) ); } } f.ReadInt ( &flags ); f.ReadInt ( &Warning ); } MakeStreamFunctions(CMMCIFData) // ====================== CMMCIFFile ============================= CMMCIFFile::CMMCIFFile() : CStream() { InitMMCIFFile(); } CMMCIFFile::CMMCIFFile ( cpstr FName, byte gzipMode ) : CStream() { InitMMCIFFile (); ReadMMCIFFile ( FName,gzipMode ); } CMMCIFFile::CMMCIFFile ( RPCStream Object ) : CStream(Object) { InitMMCIFFile(); } CMMCIFFile::~CMMCIFFile() { FreeMemory(); } void CMMCIFFile::InitMMCIFFile() { nData = 0; nAllocData = 0; data = NULL; index = NULL; PrintWarnings = False; StopOnWarning = False; } void CMMCIFFile::FreeMemory() { int i; for (i=0;iSetPrintWarnings ( PrintWarnings ); CIF->SetStopOnWarning ( StopOnWarning ); RC = CIF->ReadMMCIFData ( f,S,lcount ); if (!RC) { ExpandData ( nData+1 ); data[nData] = CIF; nData++; CIF = NULL; } } if (CIF) delete CIF; f.shut(); if (RC==CIFRC_NoDataLine) { if (nData>0) RC = 0; } Sort(); return RC; } else return CIFRC_CantOpenFile; } int CMMCIFFile::WriteMMCIFFile ( cpstr FName, byte gzipMode ) { CFile f; f.assign ( FName,True,False,gzipMode ); if (f.rewrite()) { WriteMMCIF ( f ); f.shut(); return 0; } else return CIFRC_CantOpenFile; } void CMMCIFFile::WriteMMCIF ( RCFile f ) { int i; for (i=0;iWriteMMCIF ( f ); } void CMMCIFFile::Sort() { psvector tag; int i; if (nData>0) { FreeVectorMemory ( index,0 ); GetVectorMemory ( index,nData,0 ); GetVectorMemory ( tag ,nData,0 ); for (i=0;iname ); } SortTags ( tag,nData,index ); for (i=0;i=0 : position of the DName found // <0 : the DName was not found, it could be inserted before // (-RC-1)th element, where RC is the return value int l1,l2,l,k; if (!data) return -1; if (!index) Sort(); l1 = 0; l2 = nData-1; k = 1; while (l1name ); if (k<0) l2 = l; else if (k>0) l1 = l; else { l1 = l; break; } } if (k==0) return index[l]; // is at RCth position k = strcasecmp ( DName,data[index[l1]]->name ); if (k==0) return index[l1]; // is at RCth position if (k<0) return -1; // would be at (-RC-1)th position if (l2!=l1) { k = strcasecmp ( DName,data[index[l2]]->name ); if (k==0) return index[l2]; // is at RCth position if (k>0) return -2-l2; // would be at l2+1=(-RC-1)th position } return -2-l1; // would be at l1+1=(-RC-1)th position } PCMMCIFData CMMCIFFile::GetCIFData ( int dataNo ) { if ((dataNo>=0) && (dataNo=0) return data[l]; else return NULL; } void CMMCIFFile::ExpandData ( int nDataNew ) { int i,nAD; PPCMMCIFData data1; ivector index1; if (nDataNew>nAllocData) { nAD = nDataNew + IMin(nAllocData/2+1,100); data1 = new PCMMCIFData[nAD]; GetVectorMemory ( index1,nAD,0 ); for (i=0;i=0: the CIF data structure is already in the array // -- its position is returned int i1,i; if (!data) { ExpandData ( 3 ); // get space for first 3 CIF data structures data[0] = new CMMCIFData ( DName ); nData = 1; return -nData; // the CIF data structure has been added // "on the top" of array } i1 = GetCIFDataNo ( DName ); if (i1>=0) return i1; // non-negative returns mean that the CIF // data structure is already in the array i1 = -i1-1; // otherwise the data has to be added and indexed at here // put new CIF data structure on the top of array and update index ExpandData ( nData+1 ); data[nData] = new CMMCIFData ( DName ); for (i=nData;i>i1;i--) index[i] = index[i-1]; index[i1] = nData; nData++; return -nData; // the tag has been added on the top of array } void CMMCIFFile::Copy ( PCMMCIFFile File ) { int i; FreeMemory(); nData = File->nData; nAllocData = nData; if (nData>0) { data = new PCMMCIFData[nData]; for (i=0;idata[i]) { data[i] = new CMMCIFData(); data[i]->Copy ( File->data[i] ); } else data[i] = NULL; } } } void CMMCIFFile::write ( RCFile f ) { int i,k; f.WriteInt ( &nData ); for (i=0;iwrite ( f ); } else { k = 0; f.WriteInt ( &k ); } } void CMMCIFFile::read ( RCFile f ) { int i,k; FreeMemory(); f.ReadInt ( &nData ); nAllocData = nData; if (nData>0) { data = new PCMMCIFData[nData]; for (i=0;iread ( f ); } else data[i] = NULL; } } } MakeStreamFunctions(CMMCIFFile) int isCIF ( cpstr FName, byte gzipMode ) { CFile f; char S[256]; Boolean Done; pstr p; int m; f.assign ( FName,True,False,gzipMode ); m = sizeof(S)-1; if (f.reset(True)) { f.ReadLine ( S,m ); S[m] = char(0); Done = False; while (!Done) { p = &(S[0]); while ((*p==' ') || (*p==char(9))) p++; Done = !strncmp(p,"data_",5); if (!Done) { if (f.FileEnd()) { Done = True; p = NULL; } else { f.ReadLine ( S,sizeof(S)-1 ); S[m] = char(0); } } } f.shut(); if (!p) return 1; if (!strncmp(p,"data_",5)) return 0; else return 1; } else return -1; } pstr GetCIFMessage ( pstr M, int RC ) { int LineNo; pstr InputLine; InputLine = GetMMCIFInputBuffer ( LineNo ); if (RC>10) { if (RC & CIFW_UnrecognizedItems) sprintf ( M,"unrecognized items found on %ith line\n%s", LineNo,InputLine ); else if (RC & CIFW_MissingField) sprintf ( M,"expected data field not found; line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_EmptyLoop) sprintf ( M,"empty loop ('loop_') on %ith line\n%s", LineNo,InputLine ); else if (RC & CIFW_UnexpectedEOF) sprintf ( M,"unexpected end of file; line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_LoopFieldMissing) sprintf ( M,"expected data field in a loop not found; " "line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_LoopFieldMissing) sprintf ( M,"expected data field in a loop not found; " "line %i reads\n%s", LineNo,InputLine ); else if (RC & CIFW_NotAStructure) sprintf ( M,"a loop is used as a structure on line %i\n%s", LineNo,InputLine ); else if (RC & CIFW_NotALoop) sprintf ( M,"a structure is used as a loop on line %i\n%s", LineNo,InputLine ); else if (RC & CIFW_DuplicatedTag) sprintf ( M,"duplicated tag was found on line %i\n%s", LineNo,InputLine ); else sprintf ( M,"undocumented warning issued for line %i\n%s", LineNo,InputLine ); } else if (RC<0) switch (RC) { case CIFRC_StructureNoTag : strcpy(M,"tag of a structure not " "found"); break; case CIFRC_LoopNoTag : strcpy(M,"tag of a loop not found"); break; case CIFRC_NoCategory : strcpy(M,"category not found"); break; case CIFRC_WrongFormat : strcpy(M,"wrong format of a number"); break; case CIFRC_NoTag : strcpy(M,"tag not found"); break; case CIFRC_NotAStructure : strcpy(M,"category is not a " "structure"); break; case CIFRC_NotALoop : strcpy(M,"category is not a loop"); break; case CIFRC_WrongIndex : strcpy(M,"index outside the loop's " "limits"); break; case CIFRC_NoField : strcpy(M,"data is absent"); break; case CIFRC_Created : strcpy(M,"category created"); break; case CIFRC_CantOpenFile : strcpy(M,"can't open CIF file"); break; case CIFRC_NoDataLine : strcpy(M,"'data_' tag not found." ); break; default : strcpy(M,"undocumented return code"); } return M; } mmdb-1.23.2.1/src/stream_.h0000644000175100017510000001702111475666364012215 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : CStream_ // ~~~~~~~~~ // **** Classes : CStream ( Basic Stream Class ) // ~~~~~~~~~ // // (C) E. Krissinel 1995-2010 // // ================================================================= // #ifndef __Stream__ #define __Stream__ #ifndef __File__ #include "file_.h" #endif // ******************************************************************* #ifndef __ClassMacros # define __ClassMacros // A Class definition macros # define DefineClass(ClassName) \ class ClassName; \ typedef ClassName * P##ClassName; \ typedef ClassName & R##ClassName; \ typedef P##ClassName * PP##ClassName; \ typedef P##ClassName & RP##ClassName; // A Structure definition macros # define DefineStructure(StructureName) \ struct StructureName; \ typedef StructureName * P##StructureName; \ typedef StructureName & R##StructureName; \ typedef P##StructureName * PP##StructureName; \ typedef P##StructureName & RP##StructureName; #endif #define DefineStreamFunctions(ClassName) \ extern void StreamWrite ( RCFile f, RP##ClassName Object ); \ extern void StreamRead ( RCFile f, RP##ClassName Object ); #define MakeStreamFunctions(ClassName) \ void StreamWrite ( RCFile f, RP##ClassName Object ) { \ StreamWrite_ ( f,(RPCStream)Object ); \ } \ PCStream StreamInit##ClassName ( RPCStream Object ) { \ return (PCStream)(new ClassName(Object)); \ } \ void StreamRead ( RCFile f, RP##ClassName Object ) { \ StreamRead_ ( f,(RPCStream)Object,StreamInit##ClassName ); \ } #define DefineFactoryFunctions(ClassName) \ typedef P##ClassName Make##ClassName(); \ typedef Make##ClassName * PMake##ClassName; \ typedef P##ClassName StreamMake##ClassName ( RPCStream Object ); \ P##ClassName new##ClassName (); \ P##ClassName streamNew##ClassName ( RPCStream Object ); \ typedef StreamMake##ClassName * PStreamMake##ClassName; \ extern void SetMakers##ClassName ( void * defMk, void * streamMk ); \ extern void StreamWrite ( RCFile f, RP##ClassName Object ); \ extern void StreamRead ( RCFile f, RP##ClassName Object ); #define MakeFactoryFunctions(ClassName) \ static PMake##ClassName make##ClassName = NULL; \ static PStreamMake##ClassName streamMake##ClassName = NULL; \ P##ClassName new##ClassName() { \ if (make##ClassName) return (*make##ClassName)(); \ else return new ClassName(); \ } \ P##ClassName streamNew##ClassName ( RPCStream Object ) { \ if (streamMake##ClassName) \ return (*streamMake##ClassName)(Object); \ else return new ClassName(Object); \ } \ void SetMakers##ClassName ( void * defMk, void * streamMk ) { \ make##ClassName = PMake##ClassName(defMk); \ streamMake##ClassName = PStreamMake##ClassName(streamMk); \ } \ void StreamWrite ( RCFile f, RP##ClassName Object ) { \ StreamWrite_ ( f,(RPCStream)Object ); \ } \ PCStream StreamInit##ClassName ( RPCStream Object ) { \ return (PCStream)(streamNew##ClassName(Object)); \ } \ void StreamRead ( RCFile f, RP##ClassName Object ) { \ StreamRead_ ( f,(RPCStream)Object,StreamInit##ClassName ); \ } // ========================== CStream =========================== // Each streamable class should be derived from CStream // and have constructor CClass(PCStream & Object), which should // initialize all memory of the class, and virtual functions // read(..) and write(..) (see below). Constructor CClass(PCStream&) // must not touch the Object variable. This constructor is used // only once just before the read(..) function. It is assumed that // read(..)/write(..) functions of the CClass provide storage/reading // of all vital data. Function read(..) must read data in exactly // the same way as function write(..) stores it. // For using CClass in streams, three following functions should // be supplied: // // 1. // void StreamWrite ( CFile & f, PCClass & Object ) { // StreamWrite ( f,(PCStream)Object ); // } // // 2. // PCStream CClassInit ( PCStream & Object ) { // return (PCStream)(new CClass(Object)); // } // // 3. // void StreamRead ( CFile & f, PCClass & Object ) { // StreamRead_ ( f,(PCStream)Object,CClassInit ); // } // // All these functions are automatically generated by macros // DefineStreamFunctions(CClass) -- in the header -- and // MakeStreamFunctions(CClass) -- in the implementation body. Note // that macro DefineClass(CClass) should always be issued for // streamable classes prior to the stream-making macros. Then // CClass may be streamed using functions #1 and #3. // StreamRead will return NULL for Object if it was not in // the stream. If Object existed before calling StreamRead(..) // but was not found in the stream, it will be disposed (NULL // assigned). DefineClass(CStream) DefineStreamFunctions(CStream) class CStream { public : CStream () {} CStream ( RPCStream ) {} virtual ~CStream () {} virtual void read ( RCFile ) {} virtual void write ( RCFile ) {} }; typedef PCStream InitStreamObject(RPCStream Object); extern void StreamRead_ ( RCFile f, RPCStream Object, InitStreamObject Init ); extern void StreamWrite_ ( RCFile f, RPCStream Object ); #endif mmdb-1.23.2.1/src/mmdb_coormngr.cpp0000644000175100017510000035235711476174523013751 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 26.01.09 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_coormngr // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CBrick ( space brick ) // ~~~~~~~~~ CMBrick ( "multiple" space brick ) // CMMDBCoorManager ( MMDB atom coordinate manager ) // // Copyright (C) E. Krissinel 2000-2009 // // ================================================================= // #ifndef __MATH_H #include #endif #ifndef __STRING_H #include #endif #ifndef __LinAlg__ #include "linalg_.h" #endif #ifndef __MMDB_CoorMngr__ #include "mmdb_coormngr.h" #endif #ifndef __MMDB_Tables__ #include "mmdb_tables.h" #endif // =========================== CBrick ============================== CBrick::CBrick() { InitBrick(); } CBrick::~CBrick() { Clear(); } void CBrick::InitBrick() { Atom = NULL; id = NULL; nAtoms = 0; nAllocAtoms = 0; } void CBrick::Clear() { if (Atom) delete[] Atom; FreeVectorMemory ( id,0 ); Atom = NULL; nAtoms = 0; nAllocAtoms = 0; } void CBrick::AddAtom ( PCAtom A, int atomid ) { int i; PPCAtom Atom1; ivector id1; if (nAtoms>=nAllocAtoms) { nAllocAtoms = nAtoms+10; Atom1 = new PCAtom[nAllocAtoms]; GetVectorMemory ( id1,nAllocAtoms,0 ); for (i=0;i=nalloc) { nalloc = natoms+10; Atom1 = new PCAtom[nalloc]; GetVectorMemory ( id1,nalloc,0 ); for (i=0;inOpAlloc) { ch1ID = new PChainID[Nops]; ch2ID = new PChainID[Nops]; GetVectorMemory ( nChains1,Nops,0 ); for (i=0;i0) { nOpAlloc = Nops; chID1 = new PChainID[Nops]; chID2 = new PChainID[Nops]; GetVectorMemory ( nChains,Nops,0 ); for (i=0;inChains[i]; if (nChains[i]<=0) { chID1[i] = NULL; chID2[i] = NULL; } else { chID1[i] = new ChainID[nChains[i]]; chID2[i] = new ChainID[nChains[i]]; for (j=0;jchID1[i][j] ); strcpy ( chID2[i][j],PCGenSym(GenSym)->chID2[i][j] ); } } } } } void CGenSym::write ( RCFile f ) { int i,j; byte Version=1; f.WriteByte ( &Version ); CSymOps::write ( f ); f.WriteInt ( &nOpAlloc ); for (i=0;i0) { chID1 = new PChainID[nOpAlloc]; chID2 = new PChainID[nOpAlloc]; GetVectorMemory ( nChains,nOpAlloc,0 ); for (i=0;i0) { chID1[i] = new ChainID[nChains[i]]; chID2[i] = new ChainID[nChains[i]]; for (j=0;j0) { if (n_contacts=alloc_index) { alloc_index = n_contacts+IMax(alloc_index/4+10,10); if ((alloc_max>0) && (alloc_index>alloc_max)) alloc_index = alloc_max; cont1 = new SContact[alloc_index]; for (i=0;i0) { Atom = new PPCAtom[nStruct]; id = new ivector[nStruct]; GetVectorMemory ( nAtoms,nStruct,0 ); GetVectorMemory ( nAlloc,nStruct,0 ); for (i=0;i=nal) { nal = nat+10; A2 = new PCAtom[nal]; GetVectorMemory ( id2,nal,0 ); for (i=0;iGetSerNum(); return 1; } PCModel CMMDBCoorManager::GetModel ( int modelNo ) { if ((modelNo>=1) && (modelNo<=nModels)) return Model[modelNo-1]; else return NULL; } PCModel CMMDBCoorManager::GetModel ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return NULL; } if ((modno>=1) && (modno<=nModels)) return Model[modno-1]; else return NULL; } void CMMDBCoorManager::GetModelTable ( PPCModel & modelTable, int & NumberOfModels ) { NumberOfModels = nModels; modelTable = Model; } int CMMDBCoorManager::DeleteModel ( int modelNo ) { if ((modelNo>=1) && (modelNo<=nModels)) { if (Model[modelNo-1]) { Exclude = False; delete Model[modelNo-1]; Model[modelNo-1] = NULL; Exclude = True; return 1; } } return 0; } int CMMDBCoorManager::DeleteModel ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return 0; } if ((modno>=1) && (modno<=nModels)) { if (Model[modno-1]) { Exclude = False; delete Model[modno-1]; Model[modno-1] = NULL; Exclude = True; return 1; } } return 0; } int CMMDBCoorManager::DeleteSolvent() { int i,k; Exclude = False; k = 0; for (i=0;iDeleteSolvent(); Model[i]->TrimChainTable(); if (Model[i]->nChains<=0) { delete Model[i]; Model[i] = NULL; } } Exclude = True; return k; } // ---------------- Adding/Inserting models --------------- int CMMDBCoorManager::AddModel ( PCModel model ) { PPCModel model1; int i,nnat,nat1; for (i=0;iGetNumberOfAtoms ( True ); AddAtomArray ( nnat ); // get space for new atoms if (model->GetCoordHierarchy()) { SwitchModel ( nModels+1 ); // get one more model at the end nat1 = nAtoms; Model[nModels-1]->_copy ( model,Atom,nat1 ); Model[nModels-1]->serNum = nModels; nAtoms = nat1; } else { model1 = new PCModel[nModels+1]; for (i=0;iSetMMDBManager ( PCMMDBManager(this),nModels+1 ); Model[nModels]->CheckInAtoms(); nModels++; } return nModels; } int CMMDBCoorManager::InsModel ( PCModel model, int modelNo ) { AddModel ( model ); RotateModels ( modelNo,nModels,1 ); return nModels; } void CMMDBCoorManager::RotateModels ( int modelNo1, int modelNo2, int rotdir ) { PCModel model; PPCAtom A; int m1,m2,i11,i12,i21,i22,nat,i,k; m1 = IMax ( 0,modelNo1-1 ); m2 = IMin ( nModels,modelNo2) - 1; if (m1>m2) ISwap ( m1,m2 ); if (m1!=m2) { if (Model[m1] && Model[m2]) { Model[m1]->GetAIndexRange ( i11,i12 ); Model[m2]->GetAIndexRange ( i21,i22 ); if ((i11index = k+1; k++; } for (i=0;iindex = k+1; k++; } } else { // rotate anticlockwise nat = i22-i21+1; A = new PCAtom[nat]; k = 0; for (i=i21;i<=i22;i++) A[k++] = Atom[i]; k = i22; for (i=i21-1;i>=i11;i--) { Atom[k] = Atom[i]; if (Atom[k]) Atom[k]->index = k+1; k--; } for (i=nat-1;i>=0;i--) { Atom[k] = A[i]; if (Atom[k]) Atom[k]->index = k+1; k--; } } delete[] A; } } if (rotdir<0) { // rotate anticlockwise model = Model[m1]; for (i=m1;iserNum = i+1; } Model[m2] = model; Model[m2]->serNum = m2+1; } else { // rotate clockwise model = Model[m2]; for (i=m2;i>m1;i--) { Model[i] = Model[i-1]; Model[i]->serNum = i+1; } Model[m1] = model; Model[m1]->serNum = m1+1; } } } void CMMDBCoorManager::SwapModels ( int modelNo1, int modelNo2 ) { PCModel model; PPCAtom A; int m1,m2,i11,i12,i21,i22,i,k,n; n = 0; // set in conditional, may become undefined m1 = IMax ( 0,modelNo1-1 ); m2 = IMin ( nModels,modelNo2) - 1; if (m1>m2) ISwap ( m1,m2 ); if (m1!=m2) { if (Model[m1]) Model[m1]->GetAIndexRange ( i11,i12 ); else { n = m1; while ((!Model[n]) && (nGetAIndexRange ( i11,i12 ); i12 = i11-1; } else n = -1; } if (n>=0) { if (Model[m2]) Model[m2]->GetAIndexRange ( i21,i22 ); else { n = m2; while ((!Model[n]) && (m1GetAIndexRange ( i21,i22 ); i22 = i21-1; } else n = -1; } } if (n>=0) { i11--; i12--; i21--; i22--; A = new PCAtom[AtmLen]; k = 0; for (i=0 ;iindex = i+1; for (i=nAtoms;iserNum = m1+1; Model[m2]->serNum = m2+1; } } PCChain CMMDBCoorManager::GetChain ( int modelNo, const ChainID chainID ) { if ((0GetChain ( chainID ); } return NULL; } PCChain CMMDBCoorManager::GetChain ( int modelNo, int chainNo ) { if ((0GetChain ( chainNo ); } return NULL; } PCChain CMMDBCoorManager::GetChain ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { CoorIDCode = CID_WrongPath; return NULL; } return GetChain ( modno,chname ); } void CMMDBCoorManager::GetChainTable ( int modelNo, PPCChain & chainTable, int & NumberOfChains ) { chainTable = NULL; NumberOfChains = 0; if ((0Chain; NumberOfChains = Model[modelNo-1]->nChains; } } } void CMMDBCoorManager::GetChainTable ( cpstr CID, PPCChain & chainTable, int & NumberOfChains ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; chainTable = NULL; NumberOfChains = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return; } if ((0Chain; NumberOfChains = Model[modno-1]->nChains; } } } int CMMDBCoorManager::DeleteChain ( int modelNo, const ChainID chID ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteChain ( chID ); } return 0; } int CMMDBCoorManager::DeleteChain ( int modelNo, int chainNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteChain ( chainNo ); } return 0; } int CMMDBCoorManager::DeleteAllChains ( int modelNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllChains(); } return 0; } int CMMDBCoorManager::DeleteAllChains() { int i,k; k = 0; for (i=0;iDeleteAllChains(); return k; } int CMMDBCoorManager::AddChain ( int modelNo, PCChain chain ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->AddChain ( chain ); } return 0; } PCResidue CMMDBCoorManager::GetResidue ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { if ((0GetResidue ( chainID,seqNo,insCode ); } return NULL; } PCResidue CMMDBCoorManager::GetResidue ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { if ((0GetResidue ( chainNo,seqNo,insCode ); } return NULL; } PCResidue CMMDBCoorManager::GetResidue ( int modelNo, const ChainID chainID, int resNo ) { if ((0GetResidue ( chainID,resNo ); } return NULL; } PCResidue CMMDBCoorManager::GetResidue ( int modelNo, int chainNo, int resNo ) { if ((0GetResidue ( chainNo,resNo ); } return NULL; } PCResidue CMMDBCoorManager::GetResidue ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return NULL; } return GetResidue ( modno,chname,sn,ic ); } int CMMDBCoorManager::GetResidueNo ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { if ((0GetResidueNo ( chainID,seqNo,insCode ); } return -3; } int CMMDBCoorManager::GetResidueNo ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { if ((0GetResidueNo ( chainNo,seqNo,insCode ); } return -3; } void CMMDBCoorManager::GetResidueTable ( PPCResidue & resTable, int & NumberOfResidues ) { // resTable has to be NULL or it will be reallocated. The // application is responsible for deallocating the resTable (but not // of its residues!). This does not apply to other GetResidueTable // functions. PPCChain chain; PPCResidue res; int i,j,k,n,nChains,nResidues; if (resTable) { delete[] resTable; resTable = NULL; } NumberOfResidues = 0; for (i=0;iGetChainTable ( chain,nChains ); for (j=0;jnChains;j++) if (chain[j]) { chain[j]->GetResidueTable ( res,nResidues ); NumberOfResidues += nResidues; } } if (NumberOfResidues>0) { resTable = new PCResidue[NumberOfResidues]; k = 0; for (i=0;iGetChainTable ( chain,nChains ); for (j=0;jnChains;j++) if (chain[j]) { chain[j]->GetResidueTable ( res,nResidues ); for (n=0;nGetChain ( chainID ); if (chain) { resTable = chain->Residue; NumberOfResidues = chain->nResidues; } } } } void CMMDBCoorManager::GetResidueTable ( int modelNo, int chainNo, PPCResidue & resTable, int & NumberOfResidues ) { PCChain chain; resTable = NULL; NumberOfResidues = 0; if ((0GetChain ( chainNo ); if (chain) { resTable = chain->Residue; NumberOfResidues = chain->nResidues; } } } } void CMMDBCoorManager::GetResidueTable ( cpstr CID, PPCResidue & resTable, int & NumberOfResidues ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PCChain chain; resTable = NULL; NumberOfResidues = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { CoorIDCode = CID_WrongPath; return; } if ((0GetChain ( chname ); if (chain) { resTable = chain->Residue; NumberOfResidues = chain->nResidues; } } } } int CMMDBCoorManager::DeleteResidue ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteResidue ( chainID,seqNo,insCode ); } return 0; } int CMMDBCoorManager::DeleteResidue ( int modelNo, const ChainID chainID, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteResidue ( chainID,resNo ); } return 0; } int CMMDBCoorManager::DeleteResidue ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteResidue ( chainNo,seqNo,insCode ); } return 0; } int CMMDBCoorManager::DeleteResidue ( int modelNo, int chainNo, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteResidue ( chainNo,resNo ); } return 0; } int CMMDBCoorManager::DeleteAllResidues ( int modelNo, const ChainID chainID ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllResidues ( chainID ); } return 0; } int CMMDBCoorManager::DeleteAllResidues ( int modelNo, int chainNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllResidues ( chainNo ); } return 0; } int CMMDBCoorManager::DeleteAllResidues ( int modelNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllResidues(); } return 0; } int CMMDBCoorManager::DeleteAllResidues() { int i,k; k = 0; for (i=0;iDeleteAllResidues(); return k; } int CMMDBCoorManager::AddResidue ( int modelNo, const ChainID chainID, PCResidue res ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->AddResidue ( chainID,res ); } return 0; } int CMMDBCoorManager::AddResidue ( int modelNo, int chainNo, PCResidue res ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->AddResidue ( chainNo,res ); } return 0; } int CMMDBCoorManager::GetNumberOfChains ( int modelNo ) { if ((0nChains; } return 0; } int CMMDBCoorManager::GetNumberOfChains ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_WC_ModelNo)) { CoorIDCode = CID_WrongPath; return 0; } if ((0nChains; } return 0; } int CMMDBCoorManager::GetNumberOfResidues ( int modelNo, const ChainID chainID ) { PCChain chain; if ((0GetChain ( chainID ); if (chain) return chain->nResidues; } } return 0; } int CMMDBCoorManager::GetNumberOfResidues ( int modelNo, int chainNo ) { PCChain chain; if ((0nChains)) { chain = Model[modelNo-1]->Chain[chainNo]; if (chain) return chain->nResidues; } } } return 0; } int CMMDBCoorManager::GetNumberOfResidues ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PCChain chain; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID))) { CoorIDCode = CID_WrongPath; return 0; } if ((0GetChain ( chname ); if (chain) return chain->nResidues; } } return 0; } int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode ) { PCChain chain; PCResidue res; if ((0GetChain ( chainID ); if (chain) { res = chain->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } } } return 0; } int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, int chainNo, int seqNo, const InsCode insCode ) { PCChain chain; PCResidue res; if ((0nChains)) { chain = Model[modelNo-1]->Chain[chainNo]; if (chain) { res = chain->GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; } } } } return 0; } int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, const ChainID chainID, int resNo ) { PCChain chain; PCResidue res; if ((0GetChain ( chainID ); if (chain) { if ((0<=resNo) && (resNonResidues)) { res = chain->Residue[resNo]; if (res) return res->nAtoms; } } } } return 0; } int CMMDBCoorManager::GetNumberOfAtoms ( int modelNo, int chainNo, int resNo ) { PCChain chain; PCResidue res; if ((0nChains)) { chain = Model[modelNo-1]->Chain[chainNo]; if (chain) { if ((0<=resNo) && (resNonResidues)) { res = chain->Residue[resNo]; if (res) return res->nAtoms; } } } } } return 0; } int CMMDBCoorManager::GetNumberOfAtoms ( cpstr CID ) { // returns number of atoms in residues identified by CID int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PCChain chain; PCResidue res; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return 0; } if ((0GetChain ( chname ); if (chain) { res = chain->GetResidue ( sn,ic ); if (res) return res->nAtoms; } } } return 0; } // -------------------- Extracting atoms ----------------------- PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int seqNo, // residue sequence number const InsCode insCode, // residue insertion code const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int seqNo, // residue sequence number const InsCode insCode, // residue insertion code int atomNo // atom number 0.. ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int resNo, // residue number 0.. const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->Residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... const ChainID chID, // chain ID int resNo, // residue number 0.. int atomNo // atom number 0.. ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } chn = mdl->GetChain ( chID ); if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->Residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0.. int seqNo, // residue sequence number const InsCode insCode, // residue insertion code const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->Chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0... int seqNo, // residue sequence number const InsCode insCode, // residue insertion code int atomNo // atom number 0... ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->Chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } res = chn->GetResidue ( seqNo,insCode ); if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0... int resNo, // residue number 0... const AtomName aname, // atom name const Element elmnt, // chemical element code or '*' const AltLoc aloc // alternate location indicator ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->Chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->Residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } atm = res->GetAtom ( aname,elmnt,aloc ); if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( int modelNo, // model serial number 1... int chNo, // chain number 0... int resNo, // residue number 0... int atomNo // atom number 0... ) { PCModel mdl; PCChain chn; PCResidue res; PCAtom atm; if ((1<=modelNo) && (modelNo<=nModels)) mdl = Model[modelNo-1]; else mdl = NULL; if (!mdl) { CoorIDCode = CID_NoModel; return NULL; } if ((0<=chNo) && (chNonChains)) chn = mdl->Chain[chNo]; else chn = NULL; if (!chn) { CoorIDCode = CID_NoChain; return NULL; } if ((0<=resNo) && (resNonResidues)) res = chn->Residue[resNo]; else res = NULL; if (!res) { CoorIDCode = CID_NoResidue; return NULL; } if ((0<=atomNo) && (atomNonAtoms)) atm = res->atom[atomNo]; else atm = NULL; if (!atm) CoorIDCode = CID_NoAtom; else CoorIDCode = CID_Ok; return atm; } PCAtom CMMDBCoorManager::GetAtom ( cpstr CID ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & APATH_Incomplete)) { CoorIDCode = CID_WrongPath; return NULL; } return GetAtom ( modno,chname,sn,ic,aname,elname,aloc ); } void CMMDBCoorManager::GetAtomTable ( PPCAtom & atomTable, int & NumberOfAtoms ) { atomTable = Atom; NumberOfAtoms = nAtoms; } void CMMDBCoorManager::GetAtomTable ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainID,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CMMDBCoorManager::GetAtomTable ( int modelNo, int chainNo, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainNo,seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CMMDBCoorManager::GetAtomTable ( int modelNo, const ChainID chainID, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainID,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CMMDBCoorManager::GetAtomTable ( int modelNo, int chainNo, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0GetResidue ( chainNo,resNo ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } } } void CMMDBCoorManager::GetAtomTable ( cpstr CID, PPCAtom & atomTable, int & NumberOfAtoms ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PCResidue res; atomTable = NULL; NumberOfAtoms = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return; } res = GetResidue ( modno,chname,sn,ic ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void CMMDBCoorManager::GetAtomTable1 ( PPCAtom & atomTable, int & NumberOfAtoms ) { int i,j; if (atomTable) delete[] atomTable; if (nAtoms>0) { atomTable = new PCAtom[nAtoms]; j = 0; for (i=0;iTer) atomTable[j++] = Atom[i]; } NumberOfAtoms = j; } else { atomTable = NULL; NumberOfAtoms = 0; } } void CMMDBCoorManager::GetAtomTable1 ( int modelNo, const ChainID chainID, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = NULL; if ((0GetResidue ( chainID,seqNo,insCode ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CMMDBCoorManager::GetAtomTable1 ( int modelNo, int chainNo, int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = NULL; if ((0GetResidue ( chainNo,seqNo,insCode ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CMMDBCoorManager::GetAtomTable1 ( int modelNo, const ChainID chainID, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = NULL; if ((0GetResidue ( chainID,resNo ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CMMDBCoorManager::GetAtomTable1 ( int modelNo, int chainNo, int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = NULL; if ((0GetResidue ( chainNo,resNo ); } if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CMMDBCoorManager::GetAtomTable1 ( cpstr CID, PPCAtom & atomTable, int & NumberOfAtoms ) { int modno,sn,rc; ChainID chname; InsCode ic; ResName resname; AtomName aname; Element elname; AltLoc aloc; PCResidue res; atomTable = NULL; NumberOfAtoms = 0; CoorIDCode = CID_Ok; rc = ParseAtomPath ( CID,modno,chname,sn,ic,resname, aname,elname,aloc,&DefPath ); if ((rc<0) || (rc & (APATH_WC_ModelNo | APATH_WC_ChainID | APATH_WC_SeqNum | APATH_WC_InsCode))) { CoorIDCode = CID_WrongPath; return; } res = GetResidue ( modno,chname,sn,ic ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } int CMMDBCoorManager::DeleteAtom ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chID,seqNo,insCode, aname,elmnt,aloc ); } return 0; } int CMMDBCoorManager::DeleteAtom ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chID,seqNo,insCode,atomNo ); } return 0; } int CMMDBCoorManager::DeleteAtom ( int modelNo, const ChainID chID, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chID,resNo, aname,elmnt,aloc ); } return 0; } int CMMDBCoorManager::DeleteAtom ( int modelNo, const ChainID chID, int resNo, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chID,resNo,atomNo ); } return 0; } int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chNo,seqNo,insCode, aname,elmnt,aloc ); } return 0; } int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int seqNo, const InsCode insCode, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chNo,seqNo,insCode,atomNo ); } return 0; } int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chNo,resNo, aname,elmnt,aloc ); } return 0; } int CMMDBCoorManager::DeleteAtom ( int modelNo, int chNo, int resNo, int atomNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAtom ( chNo,resNo,atomNo ); } return 0; } int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllAtoms ( chID,seqNo,insCode ); } return 0; } int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllAtoms ( chID,resNo ); } return 0; } int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, const ChainID chID ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllAtoms ( chID ); } return 0; } int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, int chNo, int seqNo, const InsCode insCode ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllAtoms ( chNo,seqNo,insCode ); } return 0; } int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, int chNo, int resNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllAtoms ( chNo,resNo ); } return 0; } int CMMDBCoorManager::DeleteAllAtoms ( int modelNo, int chNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllAtoms ( chNo ); } return 0; } int CMMDBCoorManager::DeleteAllAtoms ( int modelNo ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->DeleteAllAtoms(); } return 0; } int CMMDBCoorManager::DeleteAllAtoms() { int i,k; k = 0; for (i=0;iDeleteAllAtoms(); return k; } /* int CMMDBCoorManager::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted atoms and optimizes // the atom index. ChainID chID; ResName rName; InsCode iCode; AtomName aname; AltLoc aLoc,aL; realtype occupancy,occ; int seqNum; int i,j,k,i1,i2,n; k = 0; n = 0; i = 0; while (iGetSeqNum (); occupancy = Atom[i]->GetOccupancy(); strcpy ( chID ,Atom[i]->GetChainID() ); strcpy ( rName,Atom[i]->GetResName() ); strcpy ( iCode,Atom[i]->GetInsCode() ); strcpy ( aname,Atom[i]->name ); strcpy ( aLoc ,Atom[i]->altLoc ); j = i+1; i1 = -1; i2 = i; while (jGetSeqNum()==seqNum) && (!strcmp(Atom[j]->name,aname)) && (!strcmp(Atom[j]->GetInsCode(),iCode)) && (!strcmp(Atom[j]->GetResName(),rName)) && (!strcmp(Atom[j]->GetChainID(),chID ))) { occ = Atom[j]->GetOccupancy(); if (occ>occupancy) { occupancy = occ; i1 = j; } if (aLoc[0]) { strcpy ( aL,Atom[j]->altLoc ); if (!aL[0]) { aLoc[0] = char(0); i2 = j; } else if (strcmp(aL,aLoc)<0) { strcpy ( aLoc,aL ); i2 = j; } } j++; } else break; } else j++; if (i1<0) { if (Atom[i]->WhatIsSet & ASET_Occupancy) i1 = i; else i1 = i2; } while (iindex = k+1; } k++; } } i++; } } else i++; } nAtoms = k; return n; } */ int CMMDBCoorManager::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted atoms. All tables // remain untrimmed, so that explicit trimming or calling // FinishStructEdit() at some point is required. int i,n; n = 0; for (i=0;iDeleteAltLocs(); return n; } int CMMDBCoorManager::AddAtom ( int modelNo, const ChainID chID, int seqNo, const InsCode insCode, PCAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->AddAtom ( chID,seqNo,insCode,atom ); } return 0; } int CMMDBCoorManager::AddAtom ( int modelNo, const ChainID chID, int resNo, PCAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->AddAtom ( chID,resNo,atom ); } return 0; } int CMMDBCoorManager::AddAtom ( int modelNo, int chNo, int seqNo, const InsCode insCode, PCAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->AddAtom ( chNo,seqNo,insCode,atom ); } return 0; } int CMMDBCoorManager::AddAtom ( int modelNo, int chNo, int resNo, PCAtom atom ) { if ((modelNo>0) && (modelNo<=nModels)) { if (Model[modelNo-1]) return Model[modelNo-1]->AddAtom ( chNo,resNo,atom ); } return 0; } void CMMDBCoorManager::RemoveBricks() { int i,j,k; if (Brick) { for (i=0;ix-xbrick_0)/brick_size); ny = (int)floor((A->y-ybrick_0)/brick_size); nz = (int)floor((A->z-zbrick_0)/brick_size); if ((ny<0) || (nz<0) || (nx>=nbrick_x) || (ny>=nbrick_y) || (nz>=nbrick_z)) nx = -1; } void CMMDBCoorManager::GetBrickCoor ( realtype x, realtype y, realtype z, int & nx, int & ny, int & nz ) { nx = (int)floor((x-xbrick_0)/brick_size); ny = (int)floor((y-ybrick_0)/brick_size); nz = (int)floor((z-zbrick_0)/brick_size); if ((ny<0) || (nz<0) || (nx>=nbrick_x) || (ny>=nbrick_y) || (nz>=nbrick_z)) nx = -1; } void CMMDBCoorManager::GetBrickDimension ( int & nxmax, int & nymax, int & nzmax ) { if (!Brick) { nxmax = 0; nymax = 0; nzmax = 0; } else { nxmax = nbrick_x; nymax = nbrick_y; nzmax = nbrick_z; } } PCBrick CMMDBCoorManager::GetBrick ( int nx, int ny, int nz ) { if (!Brick) return NULL; if ((nx>=0) && (nx=0) && (ny=0) && (nz0) { // find the range of coordinates x1 = MaxReal; x2 = -x1; y1 = MaxReal; y2 = -y1; z1 = MaxReal; z2 = -z1; for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { if (A[i]->xx; if (A[i]->x>x2) x2 = A[i]->x; if (A[i]->yy; if (A[i]->y>y2) y2 = A[i]->y; if (A[i]->zz; if (A[i]->z>z2) z2 = A[i]->z; } } if (x1Ter) && (A[i]->WhatIsSet & ASET_Coordinates)) { GetBrickCoor ( A[i],nx,ny,nz ); if (nx>=0) { if (!Brick) { Brick = new PPPCBrick[nbrick_x]; for (j=0;jAddAtom ( A[i],i ); } else printf ( " error in " "CMMDBCoorManager::MakeBricks!!!\n" ); } } } } } void CMMDBCoorManager::RemoveMBricks() { int i,j,k; if (MBrick) { for (i=0;ix-xmbrick_0)/mbrick_size); ny = (int)floor((A->y-ymbrick_0)/mbrick_size); nz = (int)floor((A->z-zmbrick_0)/mbrick_size); if ((ny<0) || (nz<0) || (nx>=nmbrick_x) || (ny>=nmbrick_y) || (nz>=nmbrick_z)) nx = -nx-1; } void CMMDBCoorManager::GetMBrickCoor ( realtype x, realtype y, realtype z, int & nx, int & ny, int & nz ) { nx = (int)floor((x-xmbrick_0)/mbrick_size); ny = (int)floor((y-ymbrick_0)/mbrick_size); nz = (int)floor((z-zmbrick_0)/mbrick_size); if ((ny<0) || (nz<0) || (nx>=nmbrick_x) || (ny>=nmbrick_y) || (nz>=nmbrick_z)) nx = -nx-1; } void CMMDBCoorManager::GetMBrickDimension ( int & nxmax, int & nymax, int & nzmax ) { if (!Brick) { nxmax = 0; nymax = 0; nzmax = 0; } else { nxmax = nmbrick_x; nymax = nmbrick_y; nzmax = nmbrick_z; } } PCMBrick CMMDBCoorManager::GetMBrick ( int nx, int ny, int nz ) { if (!MBrick) return NULL; if ((nx>=0) && (nx=0) && (ny=0) && (nzTer) && (A->WhatIsSet & ASET_Coordinates)) { if (A->xx; if (A->x>x2) x2 = A->x; if (A->yy; if (A->y>y2) y2 = A->y; if (A->zz; if (A->z>z2) z2 = A->z; } } } if (x1Ter) && (A->WhatIsSet & ASET_Coordinates)) { GetMBrickCoor ( A,nx,ny,nz ); if (nx>=0) { if (!MBrick) { MBrick = new PPPCMBrick[nmbrick_x]; for (k=0;kAddAtom ( A,i,j ); } else printf ( " error in " "CMMDBCoorManager::MakeMBricks!!!\n" ); } } } } } int CMMDBCoorManager::GenerateSymMates ( PCGenSym GenSym ) { // // The function generates symmetry mates according to symmetry // operations found in GenSym. Results of first symmetry operation // (number 0) always replaces the existing set of atoms, others // are added as additional sets. // If GenSym is set to NULL, the function generates all // symmetry mates for the unit cell taking the symmetry information // from Cryst.SymOps. // The newly generated chains are added to each model. These // chains have many-character chain names, composed as 'x_n', // where 'x' is the original name and 'n' is a unique number, which // coincides with the symmetry operation (order) number; number '_0' // (for the very first symmetry operatyion) is missing. Another // side effect is the disorder in atoms' serial numbers. // The hierarchy should therefore be cleaned after // generating the symmetry mates. An appropriate way to do // that is to issue the following call: // // PDBCleanup ( PDBCLEAN_TER | PDBCLEAN_ALTCODE_STRONG | // PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL ); // PPCMMDBCoorManager Mate; int i,j,k,n,nMates,nMates1,nAtoms1; PPCAtom Atom1; PPCModel Model1; if (GenSym) nMates = GenSym->GetNofSymOps(); else nMates = Cryst.GetNumberOfSymOps(); if (nMates<=0) return GSM_NoSymOps; if (!Cryst.areMatrices()) return GSM_NoTransfMatrices; if (!Cryst.isCellParameters()) return GSM_NoCell; nMates1 = nMates-1; if (nMates1>0) { // Generate symmetry mates in parallel hierarchies Mate = new PCMMDBCoorManager[nMates1]; for (i=0;iCopy ( this ); Mate[i]->ApplySymTransform ( i+1,GenSym ); } // apply 1st symmetry operation: if (GenSym) ApplySymTransform ( 0,GenSym ); // Gather all symmetry mates in 'this' hierarchy nAtoms1 = nMates*nAtoms; // new number of atoms Atom1 = new PCAtom[nAtoms1]; // new array of atoms if (nModels>0) Model1 = new PCModel[nModels]; // new array of else Model1 = NULL; // models k = 0; // index of collected atoms for (i=0;iSetMMDBManager ( PCMMDBManager(this),i+1 ); for (j=0;jnChains;j++) Model1[i]->MoveChain ( Model[i]->Chain[j],Atom,Atom1,k,0 ); for (n=0;nnChains;j++) Model1[i]->MoveChain ( Mate[n]->Model[i]->Chain[j], Mate[n]->Atom,Atom1,k,n+1 ); } else Model1[i] = NULL; if (Model) delete[] Model; Model = Model1; for (i=0;iTer) Atom[i]->Transform ( TMatrix ); } } void CMMDBCoorManager::ApplySymTransform ( int SymOpNo, PCGenSym GenSym ) { // This procedure applies the symmetry operation number SymOpNo // (starting from 0 on) and renames chains as specified in // GenSym. // The chains don't have to be renamed. The number of chains // to be renamed is obtained as GenSym->nChains[SymOpNo], their // old names - as GenSym->chID1[SymOpNo][j], and their new names // - as GenSym->chID2[SymOpNo][j], 0<=jnChains[SymOpNo]. mat44 tmat; int i,j,k,nChn; PPCChain chain; if (Cryst.GetTMatrix(tmat,SymOpNo,0,0,0,PCSymOps(GenSym)) ==SYMOP_Ok) { for (i=0;iTer) Atom[i]->Transform ( tmat ); } if (GenSym) for (i=0;iGetChainTable ( chain,nChn ); for (j=0;jnChains[SymOpNo];j++) for (k=0;kchainID,GenSym->chID1[SymOpNo][j])) chain[k]->SetChainID ( GenSym->chID2[SymOpNo][j] ); } } } void GetEulerRotMatrix ( mat33 & erm, realtype alpha, realtype beta, realtype gamma ) { // Calculates the Euler rotation matrix for rotation: // 1) about z-axis by angle alpha (0..2*Pi) // 2) about new y-axis by angle beta (0..Pi) // 3) about new z-axis by angle gamma (0..2*Pi) realtype ca,cb,cg, sa,sb,sg; ca = cos(alpha); sa = sin(alpha); cb = cos(beta); sb = sin(beta); cg = cos(gamma); sg = sin(gamma); erm[0][0] = ca*cb*cg - sa*sg; erm[0][1] = cb*cg*sa + ca*sg; erm[0][2] = -cg*sb; erm[1][0] = -cg*sa - ca*cb*sg; erm[1][1] = ca*cg - cb*sa*sg; erm[1][2] = sb*sg; erm[2][0] = ca*sb; erm[2][1] = sa*sb; erm[2][2] = cb; } void GetEulerTMatrix ( mat44 & erm, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ) { // Calculates the Euler rotation-translation matrix for rotation: // 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. mat33 m; m[0][0] = 1.0; GetEulerRotMatrix ( m,alpha,beta,gamma ); erm[0][0] = m[0][0]; erm[0][1] = m[0][1]; erm[0][2] = m[0][2]; erm[1][0] = m[1][0]; erm[1][1] = m[1][1]; erm[1][2] = m[1][2]; erm[2][0] = m[2][0]; erm[2][1] = m[2][1]; erm[2][2] = m[2][2]; erm[3][0] = 0.0; erm[3][1] = 0.0; erm[3][2] = 0.0; erm[3][3] = 1.0; erm[0][3] = x0 - m[0][0]*x0 - m[0][1]*y0 - m[0][2]*z0; erm[1][3] = y0 - m[1][0]*x0 - m[1][1]*y0 - m[1][2]*z0; erm[2][3] = z0 - m[2][0]*x0 - m[2][1]*y0 - m[2][2]*z0; } void EulerRotation ( PPCAtom A, int nA, realtype alpha, realtype beta, realtype gamma, realtype x0, realtype y0, realtype z0 ) { // Euler rotation: 1) about z-axis by angle alpha // 2) about new y-axis by angle beta // 3) about new z-axis by angle gamma // Point (x0,y0,z0) is the center of rotation. mat33 m; realtype x,y,z; int i; m[0][0] = 1.0; GetEulerRotMatrix ( m,alpha,beta,gamma ); for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { x = A[i]->x - x0; y = A[i]->y - y0; z = A[i]->z - z0; A[i]->x = m[0][0]*x + m[0][1]*y + m[0][2]*z + x0; A[i]->y = m[1][0]*x + m[1][1]*y + m[1][2]*z + y0; A[i]->z = m[2][0]*x + m[2][1]*y + m[2][2]*z + z0; } } } void GetVecRotMatrix ( mat33 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz ) { // Calculates the rotation matrix for rotation by angle alpha about // arbitrary vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). realtype ca,sa, rx,ry,rz, vl; ca = cos(alpha); sa = sin(alpha); vl = sqrt ( vx*vx + vy*vy + vz*vz ); if (vl<=0.0) return; rx = vx/vl; ry = vy/vl; rz = vz/vl; vrm[0][0] = rx*rx*(1.0-ca) + ca; vrm[0][1] = rx*ry*(1.0-ca) - rz*sa; vrm[0][2] = rx*rz*(1.0-ca) + ry*sa; vrm[1][0] = ry*rx*(1.0-ca) + rz*sa; vrm[1][1] = ry*ry*(1.0-ca) + ca; vrm[1][2] = ry*rz*(1.0-ca) - rx*sa; vrm[2][0] = rz*rx*(1.0-ca) - ry*sa; vrm[2][1] = rz*ry*(1.0-ca) + rx*sa; vrm[2][2] = rz*rz*(1.0-ca) + ca; } void GetRotParameters ( mat33 & vrm, realtype & alpha, realtype & vx, realtype & vy, realtype & vz ) { // Given the rotation matrix vrm, GetRotParameters(..) // returns the rotation angle alpha and the normalized // rotation axis vector (vx,vy,vz). // The rotation angle and vector are determined up to // their sign (however correlated, so that being substituted // into GetVecRotMatrix(..) they yield the same rotation // matrix). // The function does not check for vrm to be a valid // rotation matrix. realtype ca,sa,vl; ca = (vrm[0][0]+vrm[1][1]+vrm[2][2]-1.0)/2.0; if (ca<-1.0) ca = -1.0; // does not work if rotation if (ca>1.0) ca = 1.0; // matrix is correct sa = sqrt(1.0-ca*ca); if (sa>0.0) { alpha = acos(ca); // coefficient of 2 is corrected by normalization below vx = (vrm[2][1]-vrm[1][2])/sa; vy = (vrm[0][2]-vrm[2][0])/sa; vz = (vrm[1][0]-vrm[0][1])/sa; // the following code is formally redundant if rotation // matrix is correct, however it eliminates the round-offs vl = sqrt(vx*vx+vy*vy+vz*vz); vx /= vl; vy /= vl; vz /= vl; } else { // zero rotation, arbitrary axis would do alpha = 0.0; vx = 1.0; vy = 0.0; vz = 0.0; } } void GetVecTMatrix ( mat44 & vrm, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ) { // Calculates the rotation-translation matrix for rotation by angle // alpha about arbitrary vector directed as (vx,vy,vz) = // (vx2-vx1,vy2-vy1,vz2-vz1). Point (x0,y0,z0) is the center of // rotation -- actually a point belonging to the rotation axis. mat33 m; GetVecRotMatrix ( m,alpha,vx,vy,vz ); vrm[0][0] = m[0][0]; vrm[0][1] = m[0][1]; vrm[0][2] = m[0][2]; vrm[1][0] = m[1][0]; vrm[1][1] = m[1][1]; vrm[1][2] = m[1][2]; vrm[2][0] = m[2][0]; vrm[2][1] = m[2][1]; vrm[2][2] = m[2][2]; vrm[3][0] = 0.0; vrm[3][1] = 0.0; vrm[3][2] = 0.0; vrm[3][3] = 1.0; vrm[0][3] = x0 - m[0][0]*x0 - m[0][1]*y0 - m[0][2]*z0; vrm[1][3] = y0 - m[1][0]*x0 - m[1][1]*y0 - m[1][2]*z0; vrm[2][3] = z0 - m[2][0]*x0 - m[2][1]*y0 - m[2][2]*z0; } void VectorRotation ( PPCAtom A, int nA, realtype alpha, realtype vx, realtype vy, realtype vz, realtype x0, realtype y0, realtype z0 ) { // Vector rotation is rotation by angle alpha about arbitrary // vector directed as (vx,vy,vz) = (vx2-vx1,vy2-vy1,vz2-vz1). // Point (x0,y0,z0) is the center of rotation -- actually // a point belonging to the rotation axis. mat33 m; realtype x,y,z; int i; GetVecRotMatrix ( m, alpha,vx,vy,vz ); for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { x = A[i]->x - x0; y = A[i]->y - y0; z = A[i]->z - z0; A[i]->x = m[0][0]*x + m[0][1]*y + m[0][2]*z + x0; A[i]->y = m[1][0]*x + m[1][1]*y + m[1][2]*z + y0; A[i]->z = m[2][0]*x + m[2][1]*y + m[2][2]*z + z0; } } } void GetMassCenter ( PPCAtom A, int nA, realtype & xmc, realtype & ymc, realtype & zmc ) { realtype w,mass; int i,k; xmc = 0.0; ymc = 0.0; zmc = 0.0; mass = 0.0; for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { k = getElementNo ( A[i]->element ); if (k>=0) w = MolecWeight[k]; else w = 1.0; xmc += w*A[i]->x; ymc += w*A[i]->y; zmc += w*A[i]->z; mass += w; } } if (mass>0.0) { xmc /= mass; ymc /= mass; zmc /= mass; } } int CMMDBCoorManager::BringToUnitCell() { // brings all chains into 0th unit cell PCChain chain; PPCAtom atom; realtype x0,y0,z0, x,y,z, xf,yf,zf, sx,sy,sz; realtype dx,dy,dz, d,d0; int nAtoms; int i,j,k,n,m,nt, ic,jc,kc, is,js,ks; is = js = ks = 0; // these may become undefined if (!Cryst.areMatrices()) return -1; Cryst.Frac2Orth ( 0.5,0.5,0.5, x0,y0,z0 ); nt = 0; for (i=0;inChains;j++) { chain = Model[i]->Chain[j]; if (chain) { x = 0.0; y = 0.0; z = 0.0; m = 0; for (k=0;knResidues;k++) if (chain->Residue[k]) { chain->Residue[k]->GetAtomTable ( atom,nAtoms ); for (n=0;nTer) { x += atom[n]->x; y += atom[n]->y; z += atom[n]->z; m++; } } } x /= m; y /= m; z /= m; Cryst.Orth2Frac ( x,y,z, xf,yf,zf ); sx = frac ( xf ); sy = frac ( yf ); sz = frac ( zf ); d0 = MaxReal; for (ic=-3;ic<3;ic++) for (jc=-3;jc<3;jc++) for (kc=-3;kc<3;kc++) { Cryst.Frac2Orth ( sx+ic,sy+jc,sz+kc, dx,dy,dz ); dx -= x0; dy -= y0; dz -= z0; d = dx*dx + dy*dy + dz*dz; if (d1.0e-10) || (fabs(sy)>1.0e-10) || (fabs(sz)>1.0e-10)) { nt++; for (k=0;knResidues;k++) if (chain->Residue[k]) { chain->Residue[k]->GetAtomTable ( atom,nAtoms ); for (n=0;nTer) { Cryst.Orth2Frac ( atom[n]->x,atom[n]->y, atom[n]->z, xf,yf,zf ); Cryst.Frac2Orth ( xf-sx,yf-sy,zf-sz, atom[n]->x,atom[n]->y, atom[n]->z ); } } } } } } } return nt; // number of converted chains } Boolean CMMDBCoorManager::Frac2Orth ( realtype xfrac, realtype yfrac, realtype zfrac, realtype & xorth, realtype & yorth, realtype & zorth ) { return Cryst.Frac2Orth ( xfrac,yfrac,zfrac, xorth,yorth,zorth ); } Boolean CMMDBCoorManager::Orth2Frac ( realtype xorth, realtype yorth, realtype zorth, realtype & xfrac, realtype & yfrac, realtype & zfrac ) { return Cryst.Orth2Frac ( xorth,yorth,zorth, xfrac,yfrac,zfrac ); } Boolean CMMDBCoorManager::Frac2Orth ( mat44 & F, mat44 & T ) { return Cryst.Frac2Orth ( F,T ); } Boolean CMMDBCoorManager::Orth2Frac ( mat44 & T, mat44 & F ) { return Cryst.Orth2Frac ( T,F ); } // ------------------------ Contacts ------------------------------- #define CA_CA_Dist2 16.0 void CMMDBCoorManager::FindSeqSection ( PCAtom atom, int seqDist, int & seq1, int & seq2 ) { PCAtom a; PCResidue res; PCChain chain; realtype x0,y0,z0, x,y,z, dx,dy,dz, d2; int i1; Boolean B0,B; res = atom->residue; // these are all set in loops, avoid that they become undefined x0 = y0 = z0 = 0.0; x = y = z = 0.0; if ((!res) || (seqDist<=0)) { seq1 = MaxInt4; seq2 = MinInt4; return; } chain = res->chain; if (!chain) { seq1 = MaxInt4; seq2 = MinInt4; return; } if (seqDist==1) { seq1 = res->index; seq2 = seq1; return; } a = res->GetAtom ( pstr("CA"),pstr("C"),NULL ); if (a) { x0 = a->x; y0 = a->y; z0 = a->z; B0 = True; } else B0 = False; if (B0) { x = x0; y = y0; z = z0; } B = B0; seq2 = res->index; i1 = IMin(chain->nResidues,seq2+seqDist)-1; while (seq2Residue[seq2]) { a = chain->Residue[seq2]->GetAtom ( pstr("CA"),pstr("C"),NULL ); if (a && B) { dx = x-a->x; dy = y-a->y; dz = z-a->z; d2 = dx*dx + dy*dy + dz*dz; if (d2>CA_CA_Dist2) { seq2--; break; } } if (a) { x = a->x; y = a->y; z = a->z; B = True; } else B = False; } } if (B0) { x = x0; y = y0; z = z0; } B = B0; seq1 = res->index; i1 = IMax(0,seq1-seqDist+1); while (seq1>i1) { seq1--; if (chain->Residue[seq1]) { a = chain->Residue[seq1]->GetAtom ( pstr("CA"),pstr("C"),NULL ); if (a && B) { dx = x-a->x; dy = y-a->y; dz = z-a->z; d2 = dx*dx + dy*dy + dz*dz; if (d2>CA_CA_Dist2) { seq1++; break; } } if (a) { x = a->x; y = a->y; z = a->z; B = True; } else B = False; } } } Boolean CMMDBCoorManager::isContact ( PCAtom a1, PCAtom a2, int seq1, int seq2, realtype dd, realtype d12, realtype d22, realtype & d2 ) { // seq1..seq2 is forbidden region for residue sequence numbers PCResidue res1,res2; PCChain chain1,chain2; realtype dx,dy,dz; if (a2->Ter) return False; dx = fabs(a2->x-a1->x); if (dx<=dd) { dy = fabs(a2->y-a1->y); if (dy<=dd) { dz = fabs(a2->z-a1->z); if (dz<=dd) { d2 = dx*dx + dy*dy + dz*dz; if ((d12<=d2) && (d2<=d22)) { if (seq1<=seq2) { res1 = a1->residue; res2 = a2->residue; if (res1 && res2) { chain1 = res1->chain; chain2 = res2->chain; if (chain1 && chain2) { if (!strcmp(chain1->chainID,chain2->chainID)) { if ((seq1<=res2->index) && (res2->index<=seq2)) return False; } } } } return True; } } } } return False; } Boolean CMMDBCoorManager::isContact ( realtype x, realtype y, realtype z, PCAtom a2, realtype dd, realtype d12, realtype d22, realtype & d2 ) { realtype dx,dy,dz; if (a2->Ter) return False; dx = fabs(a2->x-x); if (dx<=dd) { dy = fabs(a2->y-y); if (dy<=dd) { dz = fabs(a2->z-z); if (dz<=dd) { d2 = dx*dx + dy*dy + dz*dz; if ((d12<=d2) && (d2<=d22)) return True; } } } return False; } void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex, int ilen, int atomNum, realtype dist1, realtype dist2, int seqDist, RPSContact contact, int & ncontacts, int maxlen, long group ) { PCContactIndex ContactIndex; realtype d12,d22,d2; int i,seq1,seq2; if (!AIndex) return; if (dist2Ter) return; ContactIndex = new CContactIndex ( contact,maxlen,ncontacts,ilen ); FindSeqSection ( AIndex[atomNum],seqDist,seq1,seq2 ); d12 = dist1*dist1; d22 = dist2*dist2; for (i=0;iAddContact ( atomNum,i,sqrt(d2),group ); } ContactIndex->GetIndex ( contact,ncontacts ); delete ContactIndex; } void CMMDBCoorManager::SeekContacts ( PCAtom A, PPCAtom AIndex, int ilen, realtype dist1, realtype dist2, int seqDist, RPSContact contact, int & ncontacts, int maxlen, long group ) { PCContactIndex ContactIndex; realtype d12,d22,d2; int i,seq1,seq2; if (!AIndex) return; if (dist2Ter) return; ContactIndex = new CContactIndex ( contact,maxlen,ncontacts,ilen ); FindSeqSection ( A,seqDist,seq1,seq2 ); d12 = dist1*dist1; d22 = dist2*dist2; for (i=0;iAddContact ( -1,i,sqrt(d2),group ); } ContactIndex->GetIndex ( contact,ncontacts ); delete ContactIndex; } void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex1, int ilen1, PPCAtom AIndex2, int ilen2, realtype dist1, realtype dist2, int seqDist, RPSContact contact, int & ncontacts, int maxlen, mat44 * TMatrix, long group, int bricking, Boolean doSqrt ) { // It is Ok to have NULL pointers in AIndex1 and AIndex2 PCContactIndex ContactIndex; PPCAtom A1,A2; rvector sx0,sy0,sz0; rvector dx0,dy0,dz0; realtype d12,d22,d2, eps; int l1,l2, i,j, nx,ny,nz, dn; int ix1,ix2, iy1,iy2, iz1,iz2, ix,iy,iz; int seq1,seq2; PCBrick B; Boolean swap,UnitT; if ((dist2x; sy0[i] = AIndex1[i]->y; sz0[i] = AIndex1[i]->z; } // Save original AIndex2 coordinates and modify the index GetVectorMemory ( dx0,ilen2,0 ); GetVectorMemory ( dy0,ilen2,0 ); GetVectorMemory ( dz0,ilen2,0 ); for (i=0;ix; dy0[i] = AIndex2[i]->y; dz0[i] = AIndex2[i]->z; AIndex2[i]->Transform ( *TMatrix ); } } } // choose A2 as the largest atom set convenient for // bricking (bricking on larger set is more efficient) if (bricking & BRICK_ON_1) { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = True; } else if (bricking & BRICK_ON_2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = False; } else if (ilen1<=ilen2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = False; } else { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = True; } d12 = dist1*dist1; d22 = dist2*dist2; if (((bricking & BRICK_READY)==0) || (!Brick)) MakeBricks ( A2,l2,dist2*1.5 ); dn = mround(dist2/brick_size)+1; if (Brick) for (i=0;iTer) { if (UnitT) { // No transformation -- AIndex1 and AIndex2 are unmodified. // Calculate the forbidden sequence region FindSeqSection ( A1[i],seqDist,seq1,seq2 ); // And the brick location GetBrickCoor ( A1[i],nx,ny,nz ); } else { // AIndex2 and AIndex1 are modified, but the sequence // distance does not apply to physically different chains // (meaning that transformation of A2 effectively makes // a different chain). Use unmodified atom coordinates // of 1st set for calculating the brick location. if (swap) GetBrickCoor ( A1[i],nx,ny,nz ); // A1 is AIndex2 else GetBrickCoor ( sx0[i],sy0[i],sz0[i],nx,ny,nz ); } if (nx>=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); if (UnitT) { // AIndex1 unmodified, use it for (ix=ix1;ixnAtoms;j++) if (B->Atom[j]!=A1[i]) { if (isContact(A1[i],B->Atom[j],seq1,seq2, dist2,d12,d22,d2)) { if (doSqrt) d2 = sqrt(d2); if (swap) ContactIndex->AddContact ( B->id[j],i,d2,group ); else ContactIndex->AddContact ( i,B->id[j],d2,group ); } } } } else if (swap) { // A1 stands for AIndex2, it is modified and we need to use // the modified coordinates for (ix=ix1;ixnAtoms;j++) if (isContact(A1[i]->x,A1[i]->y,A1[i]->z, B->Atom[j], dist2,d12,d22,d2)) { if (doSqrt) d2 = sqrt(d2); ContactIndex->AddContact ( B->id[j],i,d2,group ); } } } else { // A1 stands for AIndex1, it may be modified (if AIndex1 // and AIndex2 overlap) -- use its unmodified coordinates // instead. for (ix=ix1;ixnAtoms;j++) if (isContact(sx0[i],sy0[i],sz0[i], B->Atom[j],dist2,d12,d22,d2)) { if (doSqrt) d2 = sqrt(d2); ContactIndex->AddContact ( i,B->id[j],d2,group ); } } } } } } if (!UnitT) { // restore original coordinates for (i=0;ix = sx0[i]; AIndex1[i]->y = sy0[i]; AIndex1[i]->z = sz0[i]; } for (i=0;ix = dx0[i]; AIndex2[i]->y = dy0[i]; AIndex2[i]->z = dz0[i]; } FreeVectorMemory ( sx0,0 ); FreeVectorMemory ( sy0,0 ); FreeVectorMemory ( sz0,0 ); FreeVectorMemory ( dx0,0 ); FreeVectorMemory ( dy0,0 ); FreeVectorMemory ( dz0,0 ); } ContactIndex->GetIndex ( contact,ncontacts ); delete ContactIndex; } void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex1, int ilen1, PPCAtom AIndex2, int ilen2, realtype contDist, PSContact contact, int & ncontacts, int bricking ) { // Simplified optimized for speed version: // - no NULL pointers and Ters in AIndex1 and AIndex2 // - no checks for identity atoms in AIndex1 and AIndex2 // - contact must be pre-allocated with at least ilen1*ilen2 elements // - contact returns square distances // - ncontacts is always reset PPCAtom A1,A2; realtype contDist2, dx,dy,dz, d2; int l1,l2, i,j, nx,ny,nz, dn; int ix1,ix2, iy1,iy2, iz1,iz2, ix,iy,iz; PCBrick B; Boolean swap; // choose A2 as the largest atom set convenient for // bricking (bricking on larger set is more efficient) if (bricking & BRICK_ON_1) { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = True; } else if (bricking & BRICK_ON_2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = False; } else if (ilen1<=ilen2) { A1 = AIndex1; A2 = AIndex2; l1 = ilen1; l2 = ilen2; swap = False; } else { A1 = AIndex2; A2 = AIndex1; l1 = ilen2; l2 = ilen1; swap = True; } contDist2 = contDist*contDist; if (((bricking & BRICK_READY)==0) || (!Brick)) MakeBricks ( A2,l2,contDist*1.5 ); ncontacts = 0; if (!Brick) return; dn = (int)floor(contDist/brick_size)+1; if (swap) { for (i=0;i=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); for (ix=ix1;ixnAtoms;j++) { dx = A1[i]->x - B->Atom[j]->x; dy = A1[i]->y - B->Atom[j]->y; dz = A1[i]->z - B->Atom[j]->z; d2 = dx*dx + dy*dy + dz*dz; if (d2<=contDist2) { contact[ncontacts].id1 = B->id[j]; contact[ncontacts].id2 = i; contact[ncontacts].dist = d2; ncontacts++; } } } } } } else { for (i=0;i=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); for (ix=ix1;ixnAtoms;j++) { dx = A1[i]->x - B->Atom[j]->x; dy = A1[i]->y - B->Atom[j]->y; dz = A1[i]->z - B->Atom[j]->z; d2 = dx*dx + dy*dy + dz*dz; if (d2<=contDist2) { contact[ncontacts].id1 = i; contact[ncontacts].id2 = B->id[j]; contact[ncontacts].dist = d2; ncontacts++; } } } } } } } void CMMDBCoorManager::SeekContacts ( PPCAtom AIndex1, int ilen1, PPCAtom * AIndex2, ivector ilen2, int nStructures, realtype dist1, realtype dist2, PPCMContact & contact, int bricking ) { // It is Ok to have NULL pointers in AIndex1 and AIndex2 PCMBrick B; PCAtom A; realtype d12,d22,d2; int dn, i,j,k, nx,ny,nz, ix1,iy1,iz1, ix2,iy2,iz2; int ix,iy,iz; if (dist2Ter) { contact[i] = new CMContact(nStructures); contact[i]->contactID = i; // Calculate the brick location GetMBrickCoor ( A,nx,ny,nz ); if (nx>=0) { ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nmbrick_x,nx+dn+1 ); iy2 = IMin ( nmbrick_y,ny+dn+1 ); iz2 = IMin ( nmbrick_z,nz+dn+1 ); for (ix=ix1;ixnAtoms[j];k++) if (B->Atom[j][k]!=A) { if (isContact(A,B->Atom[j][k], MaxInt4,MinInt4, dist2,d12,d22,d2)) contact[i]->AddContact ( B->Atom[j][k],j,B->id[j][k] ); } } } } } } else for (i=0;i ((PSContact)data)[j].id1); lt = (((PSContact)data)[i].id1 < ((PSContact)data)[j].id1); break; case CNSORT_1DEC : gt = (((PSContact)data)[j].id1 > ((PSContact)data)[i].id1); lt = (((PSContact)data)[j].id1 < ((PSContact)data)[i].id1); break; case CNSORT_2INC : gt = (((PSContact)data)[i].id2 > ((PSContact)data)[j].id2); lt = (((PSContact)data)[i].id2 < ((PSContact)data)[j].id2); break; case CNSORT_2DEC : gt = (((PSContact)data)[j].id2 > ((PSContact)data)[i].id2); lt = (((PSContact)data)[j].id2 < ((PSContact)data)[i].id2); break; case CNSORT_DINC : gt = (((PSContact)data)[i].dist > ((PSContact)data)[j].dist); lt = (((PSContact)data)[i].dist < ((PSContact)data)[j].dist); break; case CNSORT_DDEC : gt = (((PSContact)data)[j].dist > ((PSContact)data)[i].dist); lt = (((PSContact)data)[j].dist < ((PSContact)data)[i].dist); break; } if (gt) return 1; if (lt) return -1; return 0; } void CSortContacts::Swap ( int i, int j ) { ((PSContact)data)[i].Swap ( ((PSContact)data)[j] ); } void CSortContacts::Sort ( PSContact contact, int ncontacts, int sortmode ) { mode = sortmode; if (mode!=CNSORT_OFF) CQuickSort::Sort ( &(contact[0]),ncontacts ); } void SortContacts ( PSContact contact, int ncontacts, int sortmode ) { CSortContacts SC; if (sortmode!=CNSORT_OFF) SC.Sort ( contact,ncontacts,sortmode ); } /* void SortContacts ( PSContact contact, int ncontacts, int sortmode ) { int i,l1,l2, m1,m2; Boolean swap; if (sortmode==CNSORT_OFF) return; l1 = 1; l2 = ncontacts; do { m1 = -1; m2 = -1; for (i=l1;icontact[i].id1); break; case CNSORT_1DEC : swap = (contact[i-1].id1contact[i].id2); break; case CNSORT_2DEC : swap = (contact[i-1].id2contact[i].dist); break; case CNSORT_DDEC : swap = (contact[i-1].dist0); } */ // ------------------- Stream functions ---------------------- void CMMDBCoorManager::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); CMMDBFile::write ( f ); f.WriteInt ( &CoorIDCode ); f.WriteReal ( &brick_size ); f.WriteReal ( &xbrick_0 ); f.WriteReal ( &ybrick_0 ); f.WriteReal ( &zbrick_0 ); f.WriteInt ( &nbrick_x ); f.WriteInt ( &nbrick_y ); f.WriteInt ( &nbrick_z ); } void CMMDBCoorManager::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); CMMDBFile::read ( f ); f.ReadInt ( &CoorIDCode ); f.ReadReal ( &brick_size ); f.ReadReal ( &xbrick_0 ); f.ReadReal ( &ybrick_0 ); f.ReadReal ( &zbrick_0 ); f.ReadInt ( &nbrick_x ); f.ReadInt ( &nbrick_y ); f.ReadInt ( &nbrick_z ); } MakeStreamFunctions(CMMDBCoorManager) // =================================================================== int SuperposeAtoms ( mat44 & T, PPCAtom A1, int nA, PPCAtom A2, ivector C ) { realtype xc1,yc1,zc1, xc2,yc2,zc2, det,B; rmatrix A,U,V; rvector W,RV1; vect3 vc1,vc2; int i,j,k,i1,i2,nat; // 1. Set unit matrix as "default" return for (i=0;i<4;i++) { for (j=0;j<4;j++) T[i][j] = 0.0; T[i][i] = 1.0; } // 2. Calculate mass centers xc1 = 0.0; yc1 = 0.0; zc1 = 0.0; xc2 = 0.0; yc2 = 0.0; zc2 = 0.0; nat = 0; if (C) { for (i1=0;i1Ter) { i2 = C[i1]; if (i2>=0) { xc1 += A1[i1]->x; yc1 += A1[i1]->y; zc1 += A1[i1]->z; xc2 += A2[i2]->x; yc2 += A2[i2]->y; zc2 += A2[i2]->z; nat++; } } } else { for (i=0;iTer) && (!A2[i]->Ter)) { xc1 += A1[i]->x; yc1 += A1[i]->y; zc1 += A1[i]->z; xc2 += A2[i]->x; yc2 += A2[i]->y; zc2 += A2[i]->z; nat++; } } if (nat>1) { xc1 /= nat; yc1 /= nat; zc1 /= nat; xc2 /= nat; yc2 /= nat; zc2 /= nat; } else if (nat>0) { T[0][3] = xc2 - xc1; T[1][3] = yc2 - yc1; T[2][3] = zc2 - zc1; return SPOSEAT_Ok; } else return SPOSEAT_NoAtoms; // 3. Calculate the correlation matrix GetMatrixMemory ( A,3,3,1,1 ); for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] = 0.0; if (C) { for (i1=0;i1Ter) { i2 = C[i1]; if (i2>=0) { vc1[0] = A1[i1]->x - xc1; vc1[1] = A1[i1]->y - yc1; vc1[2] = A1[i1]->z - zc1; vc2[0] = A2[i2]->x - xc2; vc2[1] = A2[i2]->y - yc2; vc2[2] = A2[i2]->z - zc2; for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] += vc1[j-1]*vc2[i-1]; } } } else { for (k=0;kTer) && (!A2[k]->Ter)) { vc1[0] = A1[k]->x - xc1; vc1[1] = A1[k]->y - yc1; vc1[2] = A1[k]->z - zc1; vc2[0] = A2[k]->x - xc2; vc2[1] = A2[k]->y - yc2; vc2[2] = A2[k]->z - zc2; for (i=1;i<=3;i++) for (j=1;j<=3;j++) A[i][j] += vc1[j-1]*vc2[i-1]; } } // 4. Calculate transformation matrix (to be applied to A1) det = A[1][1]*A[2][2]*A[3][3] + A[1][2]*A[2][3]*A[3][1] + A[2][1]*A[3][2]*A[1][3] - A[1][3]*A[2][2]*A[3][1] - A[1][1]*A[2][3]*A[3][2] - A[3][3]*A[1][2]*A[2][1]; // 4.1 SV-decompose the correlation matrix GetMatrixMemory ( U ,3,3,1,1 ); GetMatrixMemory ( V ,3,3,1,1 ); GetVectorMemory ( W ,3,1 ); GetVectorMemory ( RV1,3,1 ); SVD ( 3,3,3,A,U,V,W,RV1,True,True,i ); if (i!=0) { FreeVectorMemory ( RV1,1 ); FreeVectorMemory ( W ,1 ); FreeMatrixMemory ( V ,3,1,1 ); FreeMatrixMemory ( U ,3,1,1 ); FreeMatrixMemory ( A ,3,1,1 ); return SPOSEAT_SVD_Fail; } // 4.2 Check for parasite inversion and fix it if found if (det<=0.0) { k = 0; B = MaxReal; for (j=1;j<=3;j++) if (W[j]x - A[1]->x; U[1] = A[0]->y - A[1]->y; U[2] = A[0]->z - A[1]->z; W[0] = A[2]->x - A[1]->x; W[1] = A[2]->y - A[1]->y; W[2] = A[2]->z - A[1]->z; V[0] = A[3]->x - A[2]->x; V[1] = A[3]->y - A[2]->y; V[2] = A[3]->z - A[2]->z; a[0] = U[1]*W[2] - W[1]*U[2]; a[1] = U[2]*W[0] - W[2]*U[0]; a[2] = U[0]*W[1] - W[0]*U[1]; b[0] = V[1]*W[2] - W[1]*V[2]; b[1] = V[2]*W[0] - W[2]*V[0]; b[2] = V[0]*W[1] - W[0]*V[1]; c[0] = a[1]*b[2] - b[1]*a[2]; c[1] = a[2]*b[0] - b[2]*a[0]; c[2] = a[0]*b[1] - b[0]*a[1]; Wmag = sqrt(W[0]*W[0]+W[1]*W[1]+W[2]*W[2]); S = c[0]*W[0] + c[1]*W[1] + c[2]*W[2]; T = a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; T *= Wmag; if ((S==0.0) && (T==0.0)) return NO_TORSION; else return atan2(S,T); } realtype getPsi ( PPCAtom A ) { vect3 v1,v2; realtype l1,l2; v1[0] = A[0]->x - A[1]->x; v1[1] = A[0]->y - A[1]->y; v1[2] = A[0]->z - A[1]->z; v2[0] = A[2]->x - A[1]->x; v2[1] = A[2]->y - A[1]->y; v2[2] = A[2]->z - A[1]->z; l1 = v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]; if (l1==0.0) l1 = 1.0; l2 = v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]; if (l2==0.0) l2 = 1.0; return acos((v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])/sqrt(l1*l2)); } mmdb-1.23.2.1/src/mmdb_selmngr.h0000644000175100017510000006576711475666364013255 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 08.07.08 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_selmngr // ~~~~~~~~~ // Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBSelManager ( MMDB atom selection manager ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __MMDB_SelMngr__ #define __MMDB_SelMngr__ #ifndef __MMDB_CoorMngr__ #include "mmdb_coormngr.h" #endif #ifndef __MMDB_Mask__ #include "mmdb_mask.h" #endif // ====================== CMMDBSelManager ========================= // Selection keys. These specify how the requested selection // operation applies to the existing selection for the given mask: // SKEY_NEW previous selection is wiped out // SKEY_OR new selection is added to the already selected set; // if no selection preexists, SKEY_NEW and SKEY_OR // are equivalent. This key is the default one in // all selection functions. // SKEY_AND new selection is made on the already selected set; // this corresponds to logical 'and' of former and // current selections. If no selection preexists, // no selection will be made. // SKEY_XOR only those atoms will be left which are found // in either former or newly selected sets, but not // in both of them; this corresponds to logical // 'exclusive or' of previous and current selections. // If no selection preexists, it is equivalent to // SKEY_OR. #define SKEY_NEW 0 #define SKEY_OR 1 #define SKEY_AND 2 #define SKEY_XOR 3 #define SKEY_CLR 4 // Selection types #define STYPE_INVALID (-1) #define STYPE_UNDEFINED 0 #define STYPE_ATOM 1 #define STYPE_RESIDUE 2 #define STYPE_CHAIN 3 #define STYPE_MODEL 4 // Residue properties for SelectProperties() #define SELPROP_Solvent 0 #define SELPROP_Aminoacid 1 #define SELPROP_Nucleotide 2 #define SELPROP_Sugar 3 #define SELPROP_ModRes 4 // comparison rules for SelectUDD function #define UDSCR_LT 1 #define UDSCR_LE 2 #define UDSCR_EQ 3 #define UDSCR_NE 4 #define UDSCR_GE 5 #define UDSCR_GT 6 #define UDSCR_LTcase 7 #define UDSCR_LEcase 8 #define UDSCR_EQcase 9 #define UDSCR_NEcase 10 #define UDSCR_GEcase 11 #define UDSCR_GTcase 12 #define UDSCR_LTn 13 #define UDSCR_LEn 14 #define UDSCR_EQn 15 #define UDSCR_NEn 16 #define UDSCR_GEn 17 #define UDSCR_GTn 18 #define UDSCR_LTncase 19 #define UDSCR_LEncase 20 #define UDSCR_EQncase 21 #define UDSCR_NEncase 22 #define UDSCR_GEncase 23 #define UDSCR_GTncase 24 #define UDSCR_Substr 25 #define UDSCR_NoSubstr 26 #define UDSCR_Substr1 27 #define UDSCR_NoSubstr1 28 DefineClass(CMMDBSelManager) DefineStreamFunctions(CMMDBSelManager) class CMMDBSelManager : public CMMDBCoorManager { public : CMMDBSelManager (); CMMDBSelManager ( RPCStream Object ); ~CMMDBSelManager(); // ==================== Selecting atoms ======================= // NewSelection() creates a new selection mask and returns its // handle. A handle is always a positive (non-zero) integer. // Calling NewSelection() is the only way to create a new // selection mask. Notice however that masks will be automatically // copied from another MMDB (see Copy(..) in CMMDBManager) if // coordinates are copied; if this is the case, the mask handles // will be inherited from the source MMDB as well. The masks will // also be automatically deleted (see Delete(..) in CMMDBManager()) // if coordinates are deleted. int NewSelection (); int GetSelType ( int selHnd ); // returns STYPE_XXXX // DeleteSelection(..) deletes the specified selection mask // and removes the corresponding selection attributes from // all atoms, which were selected with this mask. If an atom // was selected also with other mask(s), the other selection(s) // will remain, provided that the corresponding masks are valid. // After DeleteSelection() returns, the corresponding mask // becomes invalid. void DeleteSelection ( int selHnd ); // DeleteAllSelections() deletes all selection masks and // unselects all atoms in the file. All mask handles become // invalid. void DeleteAllSelections(); // SelectAtoms(..) selects atoms in the serial number range // of iSer1 to iSer2 by adding them to the set of atoms // marked by the given mask. If iSer1=iSer2=0 then all atoms // are selected. Each atom may be selected by a number of masks // simultaneously. void SelectAtoms ( int selHnd, int iSer1, int iSer2, int selKey=SKEY_OR // selection key ); // SelectAtoms(..) selects atoms with serial numbers given in // vector asn[0..nsn-1]. void SelectAtoms ( int selHnd, ivector asn, int nsn, int selKey=SKEY_OR // selection key ); // UnselectAtoms(..) clears the specified mask for atoms in // the serial number range of iSer1 to iSer2. If iSer1=iSer2=0 // then all atoms are cleared of the specified mask. If selHnd // is set to 0, then the atoms are cleared of any mask. void UnselectAtoms ( int selHnd, int iSer1, int iSer2 ); // SelectAtom(..) selects a single atom according to the value // of selection key. If makeIndex is False, then the routine // does not update the selection index. This saves time, but // prevents GetSelIndex(..) from accessing all selected atoms. // In order to update the index after all single-atom selections // are done, use MakeSelIndex(selHnd) found next. void SelectAtom ( int selHnd, PCAtom A, int selKey=SKEY_OR, Boolean makeIndex=True ); // SelectResidue(..), SelectChain(..) and SelectModel(..) // select a single residue, chain or model, or all their // hierarchical descendants depending on the value of selType // (i.e. atoms, residues (in chain and model) and chains // (in model only). Ascending hierarchical objects should be // selected explicitely, e.g. atom->GetResidue()->SelectResidue(..) void SelectResidue ( int selHnd, PCResidue Res, int selType, int selKey, Boolean makeIndex ); void SelectChain ( int selHnd, PCChain Chain, int selType, int selKey, Boolean makeIndex ); void SelectModel ( int selHnd, PCModel model, int selType, int selKey, Boolean makeIndex ); // MakeSelIndex(.) calculates selection index for selection // adressed by selHnd. All selection functions except the // SelectAtom(..) above, update selection index automatically. // This function is for use after a series of calls to // SelectAtom(..) with makeIndex parameter set False. This // combination of SelectAtom - MakeSelIndex considerably saves CPU // at extensive selections. // MakeSelIndex(.) returns the number of selected objects. int MakeSelIndex ( int selHnd ); void MakeAllSelIndexes(); // Selecting by atom ID, space condition (a sphere) and some // other bits. void SelectAtoms ( int selHnd, // must be obtained from NewSelection() int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue' // (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // 'H,C,O,CU'; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' cpstr Segments, // may be several segment IDs // like "S1,S2,A234"; "*" means // 'any segment' cpstr Charges, // may be several charges like // "+1,-2, "; "*" means 'any charge' realtype occ1, // lowest occupancy realtype occ2, // highest occupancy; occ1=occ2<0.0 // means "any occupancy" realtype x0, // reference x-point realtype y0, // reference y-point realtype z0, // reference z-point realtype d0, // selection distance from the // reference point; d0<=0.0 // means "any distance" and values // of x0, y0 and z0 are ignored int selKey=SKEY_OR // selection key ); // Selecting by just atom ID, no other conditions void SelectAtoms ( int selHnd, // must be obtained from NewSelection() int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue // number' (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // "H,C,O,CU"; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' int selKey=SKEY_OR // selection key ); // Selecting by integer User-Defined Data void SelectUDD ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle int selMin, // lower selection boundary int selMax, // upper selection boundary int selKey // selection key ); void SelectUDD ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle realtype selMin, // lower selection boundary realtype selMax, // upper selection boundary int selKey // selection key ); void SelectUDD ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle cpstr selStr, // selection string int cmpRule, // comparison rule int selKey // selection key ); // Selecting a sphere void SelectSphere ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX realtype x, // x-coordinate of the sphere's center realtype y, // y-coordinate of the sphere's center realtype z, // z-coordinate of the sphere's center realtype r, // radius of the sphere int selKey=SKEY_OR // selection key ); // Selecting a cylinder void SelectCylinder ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX realtype x1, // x-coordinate of the cylinder axis' 1st end realtype y1, // y-coordinate of the cylinder axis' 1st end realtype z1, // z-coordinate of the cylinder axis' 1st end realtype x2, // x-coordinate of the cylinder axis' 2nd end realtype y2, // y-coordinate of the cylinder axis' 2nd end realtype z2, // z-coordinate of the cylinder axis' 2nd end realtype r, // radius of the cylinder int selKey=SKEY_OR // selection key ); // Selecting all atoms on a given distance from a plane void SelectSlab ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX realtype a, // a-parameter of the plane ax+by+cz=d realtype b, // b-parameter of the plane ax+by+cz=d realtype c, // c-parameter of the plane ax+by+cz=d realtype d, // d-parameter of the plane ax+by+cz=d realtype r, // distance to the plane int selKey=SKEY_OR // selection key ); // Selecting all atoms on a given distance from already selected void SelectNeighbours ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX PPCAtom sA, // array of already selected atoms int alen, // length of A realtype d1, // minimal distance to already selected atoms realtype d2, // maximal distance to already selected atoms int selKey=SKEY_OR // selection key ); int GetSelLength ( int selHnd ); // Getting an array of atoms selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPCAtom & SelAtom, // continuous index of selected // atoms; application must not // dispose either index or atoms int & nSelAtoms // length of index // [0..nSelectedAtoms-1] ); // Getting an array of residues selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPCResidue & SelResidues, // continuous index of selected // residues; application must // not dispose either index or // residues int & nSelResidues // length of index // [0..nSelResidues-1] ); // Getting an array of chains selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPCChain & SelChains, // continuous index of selected // chains; application must not // dispose either index or chains int & nSelChains // length of index // [0..nSelChains-1] ); // Getting an array of models selected for a certain mask void GetSelIndex ( int selHnd, // selection mask PPCModel & SelModels, // continuous index of selected // models; application must not // dispose either index or models int & nSelModels // length of index // [0..nSelModels-1] ); void GetAtomStatistics ( int selHnd, RSAtomStat AS ); // =============== General selection functions ================ // Selecting by atom ID, space condition (a sphere) and some // other bits. void Select ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue' // (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means // 'any residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // 'H,C,O,CU'; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' cpstr Segments, // may be several segment IDs like // "S1,S2,A234"; "*" means // 'any segment' cpstr Charges, // may be several charges like // "+1,-2, "; "*" means 'any charge' realtype occ1, // lowest occupancy realtype occ2, // highest occupancy; occ1=occ2<0.0 // means "any occupancy" realtype x0, // reference x-point realtype y0, // reference y-point realtype z0, // reference z-point realtype d0, // selection distance from the // reference point; d0<=0.0 // means "any distance" and values // of x0, y0 and z0 are ignored int selKey=SKEY_OR // selection key ); // Selecting by just atom ID, no other conditions void Select ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; "*" // means 'any chain' (in selected // model(s)) int ResNo1, // starting residue sequence number cpstr Ins1, // starting residue insertion code; "*" // means 'any code' int ResNo2, // ending residue sequence number. cpstr Ins2, // ending residue insertion code; "*" // means 'any code'. Combination of // ResNo1=ResNo2=ANY_RES and // Ins1=Ins2="*" means 'any residue // number' (in selected chain(s)) cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means // 'any residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in selected // residue(s)) cpstr Elements, // may be several element types // "H,C,O,CU"; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means // 'any alternative location' int selKey=SKEY_OR // selection key ); // Selecting by coordinate ID. // Examples: // // 1. /mdl/chn/s1.i1-s2.i2/at[el]:aloc // 2. /mdl/chn/*(res).ic /at[el]:aloc // 3. chn/*(res).ic /at[el]:aloc // 4. s1.i1-s2.i2/at[el]:aloc // 5. s1.i1 /at[el]:aloc // 6. /mdl // 7. chn // 8. s1.i1-s2.i2 // 9. (res) // 10. at[el]:aloc // 11. chn//[el] // // mdl - the model's serial number or 0 or '*' for any model // (default). // chn - the chain ID or list of chains 'A,B,C' or '*' for // any chain (default). // s1,s2 - the starting and ending residue sequence numbers // or '*' for any sequence number (default). // i1,i2 - the residues insertion codes or '*' for any // insertion code. If the sequence number other than // '*' is specified, then insertion code defaults to "" // (no insertion code), otherwise the default is '*'. // at - atom name or list of atom names 'CA,N1,O' or '*' // for any atom name (default) // el - chemical element name or list of chemical element // names 'C,N,O' or '*' for any chemical element name // (default) // aloc - the alternative location indicator or '*' for any // alternate location. If the atom name and chemical // element name is specified (both may be '*'), then // the alternative location indicator defaults to "" // (no alternate location), otherwise the default is // '*'. // // All spaces are ignored. // // Returns -1 if numerical format of model is wrong, -2 if // numerical format for sequence number is wrong, and 0 // otherwise. int Select ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX cpstr CID, // coordinate ID int selKey // selection key ); // Propagating the selection up and down coordinate hierarchy void Select ( int selHnd1, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int selHnd2, // must be obtained from NewSelection() // and have been used for selection int selKey=SKEY_OR // selection key ); void SelectProperty ( int selHnd, // must be obtained from NewSelection() int propKey, // property key SELPROP_XXXXXXX int selType, // selection type STYPE_XXXXX int selKey // selection key ); // In SelectDomain, domainRange is of the following format: // "*", "(all)" - take all file // "-" - take chain without chain ID // "a:Ni-Mj,b:Kp-Lq,..." - take chain a residue number N // insertion code i to residue numberM // insertion code j plus chain b // residue number K insertion code p to // residue number L insertion code q // and so on. // "a:,b:..." - take whole chains a and b and so on // "a:,b:Kp-Lq,..." - any combination of the above. int SelectDomain ( int selHnd , cpstr domainRange, int selType, int selKey, int modelNo=1 ); void DeleteSelObjects ( int selHnd ); protected : // --- SELECTION DATA NOT FOR PUBLIC ACCESS int nSelections; // number of selections PPCMask Mask; // vector of selections ivector SelType; // vector of selection types ivector nSelItems; // numbers of selected items PPCMask * Selection; // vector of selected items // --------------- Stream I/O ----------------------------- void write ( RCFile f ); void read ( RCFile f ); void InitMMDBSelManager(); void SelectAtom ( PCAtom atom, int maskNo, int selKey, int & nsel ); void SelectObject ( int selType, PCAtom atom, int maskNo, int selKey, int & nsel ); void SelectObject ( PCMask object, int maskNo, int selKey, int & nsel ); void MakeSelIndex ( int selHnd, int selType, int nsel ); void ResetManager(); PCMask GetSelMask ( int selHnd ); }; #endif mmdb-1.23.2.1/src/bfgs_min.h0000644000175100017510000002302111475666363012343 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 27.06.01 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : bfgs_min // ~~~~~~~~~ // **** Classes : CBFGSMin ( minimization driver ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2008 // // ================================================================= // #ifndef __BFGS_Min__ #define __BFGS_Min__ #ifndef __STDLIB_H #include #endif #ifndef __MatType__ #include "mattype_.h" #endif #ifndef __LinAlg__ #include "linalg_.h" #endif // ============================================================== #define BFGS_TooFewDigits -2 #define BFGS_WrongSpaceDim -1 #define BFGS_NoTermination 0 #define BFGS_SmallGradient 1 #define BFGS_SmallStep 2 #define BFGS_LineSearchComplete 3 #define BFGS_IterationLimit 4 #define BFGS_LargeSteps 5 #define BFGS_Stopped 6 typedef void BFGSMinFunc ( void * UserData, int N, rvector X, realtype & F ); typedef BFGSMinFunc * PBFGSMinFunc; typedef void BFGSPrintFunc ( void * UserData, int N, int Itn, rvector X, rvector G, realtype F ); typedef BFGSPrintFunc * PBFGSPrintFunc; DefineClass(CBFGSMin) class CBFGSMin { public : CBFGSMin (); ~CBFGSMin(); virtual void MinFunc ( rvector X, realtype & F ); virtual void Print ( int Itn, rvector X, rvector G, realtype F ); void SetMinFunction ( void * UserData, PBFGSMinFunc Fnc ); void SetPrintFunction ( void * UserData, PBFGSPrintFunc Fnc ); // ====================================================== // // .--------------------------------------------. // | | // | UNCONSTRAINED MINIMIZATION DRIVER | // | | // `--------------------------------------------' // // Finds a minimum of function F(X), X is vector [1..N], defined // by virtual MinFunc. Virtual Print provides information on every // iteration step. // // // Input parameters : // ----------------------- // // N is the dimension the minimization space // // x0 [1..N] is the initial point for minimization // // TypX [1..N] is the array of the typical ranges of // X - components, which are used for the scaling. // If TypX<=0.0 then 1.0 will be substituted // // Digits is the number of valid decimal digits in // the calculated value of minimizing function ( F ). // If Digits<=0 then the Driver will consider // that the F is computed with usual machine's // noise // // ItnLmt is the maximum available number of iterations. // If ItnLmt=0 then 100 will be substituted // // TypF is the expected absolute value of F in the // minimum, which is used in the stop criterion. // If TypF<=0.0 then 1.0 will be substituted // // GrdTol is the desired absolute value of the gradient // vector in the minimum of F . If GrdTol<=0.0 // then the some value correlated with machine's // noise will be substituted // // StpTol is the minimum available step for the minimi- // zation. The execution stops if the distance // between two consequential approximation will be // less then StpTol . If StpTol<=0.0 then the // some value correlated with machine's noise // will be substituted // // MaxStp is the maximum available step for then minimi- // zation. This parameter only prevents the appea- // rance of the too large steps, but the execution // stops if more than 5 steps with length of MaxStep // will consequently appear. // // // // Outpute parameters : // -------------------------- // // x0 will be the point at which the minimisation // had stopped // // Func will be the function's value at x0 // // TermCode will be the reason of stopping : // // 1 <=> the norm of gradient vector at x0 is // less than GrdTol ; the x0 is probable // point of the minimum // 2 <=> the distance between two last approxima- // tions was less than StpTol ; the x0 // may be the point of minimum // 3 <=> the gradient length is greater than // GrdTol , but future minimization fails ; // it may be the consequence of the errors // at the computing of gradient, but also // x0 could be the point of minimum // 4 <=> the iteration limit had been exchausted // 5 <=> more than 5 steps with length of // MaxStp had been made // 6 <=> the termination key ( Esc or End ) // had been pressed. // // // ======================================================== void BFGS_Driver ( int MinN, rvector x0, rvector TypX, realtype & FuncValue, int & TerminationCode, int Digits = 0, int ItnLmt = 0, realtype TypF = 0.0, realtype GrdTol = 0.0, realtype StpTol = 0.0, realtype MaxStp = MaxReal, Boolean Hess = False, rvector LowLimit = NULL, rvector TopLimit = NULL ); void Stop(); // generates stop signal to stop optimization protected : PBFGSMinFunc MFunc; void * MFuncData; PBFGSPrintFunc PFunc; void * PFuncData; int N,NAlloc; rmatrix Hsn; rvector TL,LL,XOpt,XPlus,Sx,SN,HDiag,GradX,GPlus; rvector StepSize,FNeighbor; rvector us,uy,ut; bvector Freese; realtype Func,FPlus,FOpt; realtype TakenLambda; Boolean ForDiff; // if True then forward differences are // used for the 1st estimation of the // Hessian (which is less expensive), // otherwise central differences will // be employed (which is more expensive). Boolean CalcHess; realtype Etha,SqrtEtha,CubertEtha,TpF,GrdEps,StpEps,MxStep; realtype SqrtEps; int CnsMax,MaxItn,TermCode; Boolean ModF; void MinFunc1 ( rvector X, realtype & F ); void UMInCk ( rvector x0, rvector TypX, int Digits, realtype TypF, realtype GrdTol, realtype StpTol, realtype MaxStp, int ItnLmt ); void UMStop0 ( rvector x0, rvector Grad ); void UMStop ( rvector x0, rvector Grad, int RetCode, int ItnCnt, Boolean MaxTkn ); virtual void Gradient ( rvector X, rvector G, realtype Fc ); virtual void FDHessF ( realtype Fc, rvector X ); void FDGrad ( rvector X, rvector G, realtype Fc ); void CDGrad ( rvector X, rvector G ); void MdHess ( rmatrix H, rvector HDg ); void InitHessUnFac ( realtype F, rmatrix H ); void BFGSUnFac ( rvector Xc, rvector Xp, rvector Gc, rvector Gp, Boolean AnalGrad, rvector HDg, rmatrix H ); void Choose_Lambda ( rvector X, rvector S, realtype & Lambda0 ); void LineSearch ( rvector px0, rvector G, rvector P, realtype pFunc, int & RetCode, Boolean & MaxTkn ); void GetMemory (); void FreeMemory (); void Relax (); void CopyPlus ( rvector x0 ); }; #endif mmdb-1.23.2.1/src/mmdb_xml.cpp0000644000175100017510000004440611476176375012723 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_XML // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CXMLObject // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STDLIB_H #include #endif #ifndef __STRING_H #include #endif #ifndef __MMDB_XML__ #include "mmdb_xml.h" #endif // ====================== CXMLObject ========================== CXMLObject::CXMLObject() : CStream() { InitXMLObject(); } CXMLObject::CXMLObject ( cpstr Tag ) : CStream() { InitXMLObject(); SetTag ( Tag ); } CXMLObject::CXMLObject ( cpstr Tag, cpstr Data ) : CStream() { InitXMLObject(); SetTag ( Tag ); SetData ( Data ); } CXMLObject::CXMLObject ( cpstr Tag, realtype V, int length ) : CStream() { InitXMLObject(); SetTag ( Tag ); SetData ( V,length ); } CXMLObject::CXMLObject ( cpstr Tag, int iV, int length ) : CStream() { InitXMLObject(); SetTag ( Tag ); SetData ( iV,length ); } CXMLObject::CXMLObject ( cpstr Tag, Boolean bV ) : CStream() { InitXMLObject(); SetTag ( Tag ); SetData ( bV ); } CXMLObject::CXMLObject ( cpstr Tag, PCXMLObject XMLObject ) : CStream() { InitXMLObject(); SetTag ( Tag ); AddObject ( XMLObject ); } CXMLObject::CXMLObject ( RPCStream Object ) : CStream(Object) { InitXMLObject(); } CXMLObject::~CXMLObject() { FreeMemory(); } void CXMLObject::InitXMLObject() { objTag = NULL; objData = NULL; nObjects = 0; nAlloc = 0; object = NULL; } void CXMLObject::FreeMemory() { int i; if (objTag) delete[] objTag; if (objData) delete[] objData; if (object) { for (i=0;iGetCategoryID()==MMCIF_Loop) return AddMMCIFLoop ( PCMMCIFLoop(mmCIFCat) ); if (mmCIFCat->GetCategoryID()==MMCIF_Struct) return AddMMCIFStruct ( PCMMCIFStruct(mmCIFCat) ); return -1; } pstr getCCIFTag ( pstr & ccifTag, cpstr Tag ) { if (Tag[0]=='_') return CreateCopCat ( ccifTag,pstr("ccif") ,Tag ); else return CreateCopCat ( ccifTag,pstr("ccif_"),Tag ); } int CXMLObject::AddMMCIFStruct ( PCMMCIFStruct mmCIFStruct ) { PCXMLObject XMLObject1,XMLObject2; pstr SName,Tag,Field, ccifTag; int nTags,i,k; XMLObject1 = this; ccifTag = NULL; SName = mmCIFStruct->GetCategoryName(); if (SName) { if (SName[0]!=char(1)) XMLObject1 = new CXMLObject ( getCCIFTag(ccifTag,SName) ); } k = 0; nTags = mmCIFStruct->GetNofTags(); for (i=0;iGetTag ( i ); if (Tag) { XMLObject2 = new CXMLObject ( getCCIFTag(ccifTag,Tag) ); Field = mmCIFStruct->GetField ( i ); if (Field) { if (Field[0]!=char(2)) XMLObject2->SetData ( Field ); else XMLObject2->SetData ( &(Field[1]) ); } XMLObject1->AddObject ( XMLObject2 ); k++; } } if (SName) { if (SName[0]!=char(1)) AddObject ( XMLObject1 ); } if (ccifTag) delete[] ccifTag; return k; } int CXMLObject::AddMMCIFLoop ( PCMMCIFLoop mmCIFLoop ) { PCXMLObject XMLObject1,XMLObject2,XMLObject3; pstr SName,Tag,Field,ccifTag; int nTags,nRows,i,j,k; XMLObject1 = this; ccifTag = NULL; SName = mmCIFLoop->GetCategoryName(); if (SName) { if (SName[0]!=char(1)) XMLObject1 = new CXMLObject ( getCCIFTag(ccifTag,SName) ); } k = 0; nTags = mmCIFLoop->GetNofTags (); nRows = mmCIFLoop->GetLoopLength(); for (i=0;iGetTag ( j ); if (Tag) { XMLObject3 = new CXMLObject ( getCCIFTag(ccifTag,Tag) ); Field = mmCIFLoop->GetField ( i,j ); if (Field) { if (Field[0]!=char(2)) XMLObject3->SetData ( Field ); else XMLObject3->SetData ( &(Field[1]) ); } XMLObject2->AddObject ( XMLObject3 ); k++; } } XMLObject1->AddObject ( XMLObject2 ); } if (SName) { if (SName[0]!=char(1)) AddObject ( XMLObject1 ); } if (ccifTag) delete[] ccifTag; return k; } int CXMLObject::AddMMCIFData ( PCMMCIFData mmCIFData ) { PCMMCIFCategory mmCIFCat; int nCats,i,k,n; nCats = mmCIFData->GetNumberOfCategories(); k = 0; n = 0; for (i=0;(i=0);i++) { mmCIFCat = mmCIFData->GetCategory ( i ); if (mmCIFCat) { if (mmCIFCat->GetCategoryID()==MMCIF_Loop) n = AddMMCIFLoop ( PCMMCIFLoop(mmCIFCat) ); else if (mmCIFCat->GetCategoryID()==MMCIF_Struct) n = AddMMCIFStruct ( PCMMCIFStruct(mmCIFCat) ); else n = -1; if (n>=0) k += n; } } if (n<0) return -(k+1); return k; } pstr CXMLObject::GetData ( cpstr Tag, int objNo ) { PCXMLObject XMLObject; XMLObject = GetObject ( Tag,objNo ); if (XMLObject) return XMLObject->objData; return NULL; } int CXMLObject::GetData ( pstr & Data, cpstr Tag, int objNo ) { PCXMLObject XMLObject; XMLObject = GetObject ( Tag,objNo ); if (XMLObject) { Data = XMLObject->objData; return 0; } else { Data = NULL; return 1; } } int CXMLObject::GetData ( realtype & V, cpstr Tag, int objNo ) { int rc; pstr d,p; rc = GetData ( d,Tag,objNo ); if (d) { V = strtod(d,&p); if ((V==0.0) && (p==d)) rc = 2; else rc = 0; } else if (!rc) rc = -1; return rc; } int CXMLObject::GetData ( int & iV, cpstr Tag, int objNo ) { int rc; pstr d,p; rc = GetData ( d,Tag,objNo ); if (d) { iV = mround(strtod(d,&p)); if ((iV==0) && (p==d)) rc = 2; else rc = 0; } else if (!rc) rc = -1; return rc; } int CXMLObject::GetData ( Boolean & bV, cpstr Tag, int objNo ) { int rc; pstr d; rc = GetData ( d,Tag,objNo ); if (d) { if (!strcasecmp(d,"Yes")) bV = True; else { bV = False; if (strcasecmp(d,"No")) rc = 2; } } else if (!rc) rc = -1; return rc; } PCXMLObject CXMLObject::GetObject ( cpstr Tag, int objNo ) { // allow for "tag1>tag2>tag3>..." PCXMLObject XMLObject; int i,j,k,l; pstr p,p1; XMLObject = this; if (Tag) { p = pstr(Tag); do { p1 = p; l = 0; while (*p1 && (*p1!='>')) { p1++; l++; } if (l>0) { k = -1; j = 0; for (i=0;(inObjects) && (k<0);i++) if (XMLObject->object[i]) { if (!strncmp(XMLObject->object[i]->objTag,p,l)) { j++; if (j==objNo) k = i; } } if (k<0) { XMLObject = NULL; l = 0; } else { XMLObject = XMLObject->object[k]; if (*p1) p = p1 + 1; else l = 0; } } } while (l>0); } return XMLObject; } void CXMLObject::AddObject ( PCXMLObject XMLObject, int lenInc ) { PPCXMLObject obj1; int i; if (!XMLObject) return; if (nObjects>=nAlloc) { nAlloc += lenInc; obj1 = new PCXMLObject[nAlloc]; for (i=0;i") ); delete[] indstr; return; } f.Write ( pstr(">") ); sngline = False; if (objData) { rm = 72; // right margin lm = IMin ( pos1,36 ); // left margin tl = strlen(objTag); if ((pos+tl+2+(int)strlen(objData)WriteObject ( f,pos+indent,indent ); if (!sngline) f.Write ( indstr ); f.Write ( pstr("") ); delete[] indstr; } } int CXMLObject::ReadObject ( cpstr FName ) { CFile f; char S[500]; int i,rc; f.assign ( FName,True ); if (f.reset(True)) { S[0] = char(0); i = 0; rc = ReadObject ( f,S,i,sizeof(S) ); f.shut(); } else rc = XMLR_NoFile; if (rc) FreeMemory(); return rc; } int CXMLObject::ReadObject ( RCFile f, pstr S, int & pos, int slen ) { PCXMLObject XMLObject; pstr S1; int k,k1,k2,rc; Boolean Done; k2 = 0; // else may become undefined FreeMemory(); rc = XMLR_Ok; k1 = -1; while ((!f.FileEnd()) && (k1<0)) { k = strlen(S); while ((pos // constructions pos++; else if (S[pos+1]!='<') k1 = pos; else pos += 2; } else pos++; if (k1>=0) { k2 = -1; while ((pos') { if (S[pos+1]!='>') k2 = pos; else pos += 2; } else pos++; if (k2<0) rc = XMLR_BrokenTag; } if (k1<0) { f.ReadLine ( S,slen ); pos = 0; } } if (k1<0) return XMLR_NoTag; if (rc!=XMLR_Ok) return rc; pos++; if (S[k2-1]=='/') { // S[k2-1] = char(0); CreateCopy ( objTag,&(S[k1+1]) ); return XMLR_Ok; } S[k2] = char(0); CreateCopy ( objTag,&(S[k1+1]) ); S[k2] = '>'; S1 = new char[slen+1]; Done = False; while ((!f.FileEnd()) && (!Done)) { k = strlen(S); while ((pos=0) S[k2] = char(0); strcpy_des ( S1,&(S[k1]) ); if (S1[0]) { if (objData) CreateConcat ( objData,pstr(" "),S1 ); else CreateConcat ( objData,S1 ); } if (k2>=0) { S[k2] = '<'; if (S[k2+1]!='/') { XMLObject = new CXMLObject(); AddObject ( XMLObject ); rc = XMLObject->ReadObject ( f,S,pos,slen ); Done = (rc!=XMLR_Ok); } else { Done = True; k1 = k2+2; k2 = -1; while ((pos') { if (S[pos+1]!='>') k2 = pos; else pos += 2; } else pos++; if (k2<0) rc = XMLR_BrokenTag; else { S[k2] = char(0); if (strcmp(objTag,&(S[k1]))) rc = XMLR_UnclosedTag; else pos++; } } } } if (!Done) { f.ReadLine ( S,slen ); pos = 0; } } delete[] S1; // this keeps pairs instead of replacing them for // on output if ((!objData) && (nObjects<=0)) CreateCopy ( objData,pstr("") ); if (rc!=XMLR_Ok) FreeMemory(); return rc; } void CXMLObject::Copy ( PCXMLObject XMLObject ) { int i; FreeMemory(); CreateCopy ( objTag ,XMLObject->objTag ); CreateCopy ( objData,XMLObject->objData ); nObjects = XMLObject->nObjects; nAlloc = nObjects; if (nObjects>0) { object = new PCXMLObject[nObjects]; for (i=0;iobject[i]) { object[i] = new CXMLObject(); object[i]->Copy ( XMLObject->object[i] ); } else object[i] = NULL; } } void CXMLObject::write ( RCFile f ) { int i; f.CreateWrite ( objTag ); f.CreateWrite ( objData ); f.WriteInt ( &nObjects ); for (i=0;i0) { object = new PCXMLObject[nObjects]; for (i=0;iGetDataName(); if (dataName) { if (dataName[0]) XMLObject = new CXMLObject ( dataName ); } if (!XMLObject) XMLObject = new CXMLObject ( pstr("no_data_name") ); k = XMLObject->AddMMCIFData ( mmCIFData ); if (rc) *rc = k; } return XMLObject; } PCXMLObject mmCIF2XML ( cpstr XMLName, PCMMCIFFile mmCIFFile, int * rc ) { PCXMLObject XMLObject1,XMLObject2; PCMMCIFData mmCIFData; int nData,i,k,rc1; XMLObject1 = new CXMLObject ( XMLName ); if (rc) *rc = -1; if (mmCIFFile) { nData = mmCIFFile->GetNofData(); k = 0; rc1 = 0; for (i=0;(i=0);i++) { mmCIFData = mmCIFFile->GetCIFData ( i ); if (mmCIFData) { XMLObject2 = mmCIF2XML ( mmCIFData,&rc1 ); if (XMLObject2) { if (rc1>=0) { XMLObject1->AddObject ( XMLObject2 ); k += rc1; } else delete XMLObject2; } } } if (rc1<0) { delete XMLObject1; if (rc) *rc = -2; } else if (rc) *rc = k; } return XMLObject1; } mmdb-1.23.2.1/src/mmdb_selmngr.cpp0000644000175100017510000032670411476200434013556 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : mmdb_selmngr // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CMMDBSelManager ( MMDB atom selection manager ) // ~~~~~~~~~ // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MATH_H #include #endif #ifndef __MMDB_SelMngr__ #include "mmdb_selmngr.h" #endif // ==================== CMMDBSelManager ===================== CMMDBSelManager::CMMDBSelManager() : CMMDBCoorManager() { InitMMDBSelManager(); } CMMDBSelManager::CMMDBSelManager ( RPCStream Object ) : CMMDBCoorManager(Object) { InitMMDBSelManager(); } CMMDBSelManager::~CMMDBSelManager() { DeleteAllSelections(); } void CMMDBSelManager::ResetManager() { CMMDBCoorManager::ResetManager(); DeleteAllSelections(); InitMMDBSelManager (); } void CMMDBSelManager::InitMMDBSelManager() { nSelections = 0; // number of selections Mask = NULL; // vector of selections SelType = NULL; // vector of selection types nSelItems = NULL; // numbers of selected items Selection = NULL; // vector of selected items } // ------------------------ Selection ----------------------------- int CMMDBSelManager::NewSelection() { int i,l; PCMask M; PPCMask Mask1; PPCMask * Selection1; ivector nSelItems1; ivector SelType1; M = new CMask(); M->NewMask ( Mask,nSelections ); i = 0; while (i=nSelections) { l = nSelections+10; Mask1 = new PCMask [l]; Selection1 = new PPCMask[l]; nSelItems1 = new int[l]; SelType1 = new int[l]; for (i=0;i0) && (selHnd<=nSelections)) { k = selHnd-1; if (Mask[k]) return SelType[k]; } return STYPE_INVALID; } void CMMDBSelManager::DeleteSelection ( int selHnd ) { int i,k; if ((selHnd>0) && (selHnd<=nSelections)) { k = selHnd-1; if (Mask[k]) { for (i=0;iRemoveMask ( Mask[k] ); // for (i=0;iRemoveMask ( Mask[k] ); delete Mask[k]; } Mask[k] = NULL; if (Selection[k]) delete[] Selection[k]; Selection[k] = NULL; nSelItems[k] = 0; SelType [k] = STYPE_UNDEFINED; } } PCMask CMMDBSelManager::GetSelMask ( int selHnd ) { if ((selHnd>0) && (selHnd<=nSelections)) return Mask[selHnd-1]; else return NULL; } void CMMDBSelManager::DeleteAllSelections() { int i; if (Mask) { if (Atom) for (i=0;iClearMask(); for (i=0;inSelections) || (nAtoms<=0)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = STYPE_ATOM; else if (SelType[k]!=STYPE_ATOM) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; } if ((iSer1==0) && (iSer2==0)) { for (i=0;iTer) SelectAtom ( Atom[i],k,sk,nsel ); } } else { if (iSer1<=iSer2) { s1 = iSer1; s2 = iSer2; } else { s1 = iSer2; s2 = iSer1; } // for a very general use, we allow the serial number // to differ from the atom's index, although this is // against PDB format. Therefore we apply here the most // primitive and less efficient way of selection for (i=0;iTer) { if ((s1<=Atom[i]->serNum) && (Atom[i]->serNum<=s2)) SelectAtom ( Atom[i],k,sk,nsel ); else if (sk==SKEY_AND) Atom[i]->RemoveMask ( Mask[k] ); } } } MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void CMMDBSelManager::SelectAtoms ( int selHnd, ivector asn, int nsn, int selKey ) { // SelectAtoms(..) selects atoms with serial numbers given in // vector asn[0..nsn-1]. CQuickSort QS; ivector asn1; int i,k,nsn1,j,j1,j2, sk,sn,nsel; if ((selHnd<=0) || (selHnd>nSelections) || (nAtoms<=0)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = STYPE_ATOM; else if (SelType[k]!=STYPE_ATOM) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; } GetVectorMemory ( asn1,nsn,0 ); for (i=0;iTer) { sn = Atom[i]->serNum; if ((asn1[0]<=sn) && (sn<=asn1[nsn1])) { // binary search j1 = 0; j2 = nsn1; do { j = (j1+j2)/2; if (snasn1[j]) j1 = j; else j1 = j2; } while (j1RemoveMask ( Mask[k] ); } else if (sk==SKEY_AND) Atom[i]->RemoveMask ( Mask[k] ); } } FreeVectorMemory ( asn1,0 ); MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void CMMDBSelManager::UnselectAtoms ( int selHnd, int iSer1, int iSer2 ) { // UnselectAtoms(..) clears the specified mask for atoms in // the serial number range of iSer1 to iSer2. If iSer1=iSer2=0 // then all atoms are cleared of the specified mask. If selHnd // is set to 0, then the atoms are cleared of any mask. int i,s1,s2,k; if ((selHnd<=nSelections) && (nAtoms>0)) { k = selHnd-1; if (SelType[k]==STYPE_UNDEFINED) SelType[k] = STYPE_ATOM; else if (SelType[k]!=STYPE_ATOM) return; if ((iSer1==0) && (iSer2==0)) { if (k<0) { for (i=0;iClearMask(); } else { for (i=0;iRemoveMask ( Mask[k] ); } } else { if (iSer1<=iSer2) { s1 = iSer1; s2 = iSer2; } else { s1 = iSer2; s2 = iSer1; } // for a very general use, we allow the serial number // to differ from the atom's index, although this is // against PDB format. Therefore we apply here the most // primitive and less efficient way of selection if (k<0) { for (i=0;iserNum) && (Atom[i]->serNum<=s2)) Atom[i]->ClearMask(); } } else { for (i=0;iserNum) && (Atom[i]->serNum<=s2)) Atom[i]->RemoveMask ( Mask[k] ); } } } MakeSelIndex ( selHnd,STYPE_ATOM,-1 ); } } pstr MakeList ( cpstr S ) { // makes the list of selecting items: // 1st character - special use, // then each item from S embraced by commas pstr L; int i,j; i = 0; while (S[i]==' ') i++; if (S[i]!='*') { // compile a searchable list L = new char[strlen(S)+5]; if (S[i]=='!') { L[0] = '!'; i++; } else L[0] = ' '; if (strchr(S,'[')) L[1] = '"'; else L[1] = ' '; L[2] = ','; j = 3; while (S[i]) { while (S[i]==' ') i++; if (S[i]=='[') { while (S[i] && (S[i]!=']')) L[j++] = S[i++]; L[j++] = ']'; if (S[i]==']') i++; } else while (S[i] && (S[i]!=' ') && (S[i]!=',')) L[j++] = S[i++]; while (S[i]==' ') i++; L[j++] = ','; if (S[i]==',') { i++; if (!S[i]) L[j++] = ','; // blank chain ID at the end assumed } } if (j==3) L[j++] = ','; L[j] = char(0); } else L = NULL; return L; } Boolean MatchName ( pstr L, pstr N ) { char M[MaxMMDBNameLength+5]; int i,j; if (L) { i = 0; M[0] = ','; j = 1; while (N[i]) if (N[i]==' ') i++; else M[j++] = N[i++]; M[j++] = ','; M[j] = char(0); if (strstr(&(L[2]),M)) return (L[0]!='!'); else if (L[1]!='"') return (L[0]=='!'); else { strcpy ( M,",[" ); strcat ( M,N ); strcat ( M,"]," ); if (strstr(&(L[2]),M)) return (L[0]!='!'); else return (L[0]=='!'); } } else return True; } Boolean MatchCharge ( pstr L, PCAtom atom ) { char N[100]; if (L) { if (atom->WhatIsSet & ASET_Charge) { sprintf ( N,"%+2i",mround(atom->charge) ); return MatchName ( L,N ); } else return False; } else return True; } void CMMDBSelManager::SelectAtom ( int selHnd, PCAtom A, int selKey, Boolean makeIndex ) { int i, k, sk, nsel; if ((selHnd<=0) || (selHnd>nSelections)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = STYPE_ATOM; else if (SelType[k]!=STYPE_ATOM) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; } SelectAtom ( A,k,sk,nsel); if (makeIndex) MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void CMMDBSelManager::SelectResidue ( int selHnd, PCResidue Res, int selType, int selKey, Boolean makeIndex ) { // Selects residue Res or all its atoms depending on selType PPCAtom A; int i, k, sk, nsel, nat; if ((selHnd<=0) || (selHnd>nSelections)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; } switch (selType) { case STYPE_ATOM : Res->GetAtomTable ( A,nat ); for (i=0;iTer) SelectAtom ( A[i],k,sk,nsel); } break ; case STYPE_RESIDUE : SelectObject ( Res,k,sk,nsel ); break ; default : ; } if (makeIndex) MakeSelIndex ( selHnd,selType,nsel ); } void CMMDBSelManager::SelectChain ( int selHnd, PCChain Chain, int selType, int selKey, Boolean makeIndex ) { // Selects chain Chain or all its residues or atoms depending on selType PPCAtom A; PPCResidue Res; int i,j, k, sk, nsel, nat,nres; if ((selHnd<=0) || (selHnd>nSelections)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; } switch (selType) { case STYPE_ATOM : Chain->GetResidueTable ( Res,nres ); for (i=0;iGetAtomTable ( A,nat ); for (j=0;jTer) SelectAtom ( A[j],k,sk,nsel); } } break ; case STYPE_RESIDUE : Chain->GetResidueTable ( Res,nres ); for (i=0;inSelections)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; } switch (selType) { case STYPE_ATOM : model->GetChainTable ( Chain,nch ); for (i=0;iGetResidueTable ( Res,nres ); for (j=0;jGetAtomTable ( A,nat ); for (n=0;nTer) SelectAtom ( A[n],k,sk,nsel); } } } break ; case STYPE_RESIDUE : model->GetChainTable ( Chain,nch ); for (i=0;iGetResidueTable ( Res,nres ); for (j=0;jGetChainTable ( Chain,nch ); for (i=0;inSelections)) return 0; k = selHnd-1; if (SelType[k]==STYPE_UNDEFINED) return 0; MakeSelIndex ( selHnd,SelType[k],-1 ); return nSelItems[k]; } void CMMDBSelManager::MakeAllSelIndexes() { int k; for (k=0;knSelections) || (nAtoms<=0)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (selKey==SKEY_AND); altLocs1 = NULL; if (altLocs) { if (strchr(altLocs,hetIndicator)) { CreateCopy ( altLocs1,altLocs ); DelSpaces ( altLocs1 ); aloc_l = strchr ( altLocs1,hetIndicator ); aloc_l[0] = ' '; if (aloc_l[1]) aloc_l[1] = ' '; // instead of comma else if (aloc_l!=altLocs1) { aloc_l--; aloc_l[0] = ' '; } DelSpaces ( altLocs1 ); aloc_l = MakeList ( altLocs1 ); } else aloc_l = MakeList ( altLocs ); } else aloc_l = MakeList ( altLocs ); chain_l = MakeList ( Chains ); res_l = MakeList ( RNames ); atom_l = MakeList ( ANames ); elem_l = MakeList ( Elements ); segm_l = MakeList ( Segments ); charge_l = MakeList ( Charges ); // noRes==True means no residue restrictions noRes = (ResNo1==ResNo2) && (ResNo1==ANY_RES) && (Ins1[0]==Ins2[0]) && (Ins1[0]=='*'); Occ = (occ1>=0.0) || (occ2>=0.0); Dist = (d0>0.0); d02 = d0*d0; m1 = iModel-1; if (m1>=0) m2 = m1+1; // will take only this model else { m1 = 0; // will take m2 = nModels; // all models } if (m1>=nModels) return; for (n=0;nnChains;c++) { chain = model->Chain[c]; if (chain) { // again check for safety if (MatchName(chain_l,chain->chainID)) { // the chain has to be taken i = 0; if (!noRes) while (inResidues) { res = chain->Residue[i]; if (res) { if ((res->seqNum==ResNo1) && MatchName(res_l,res->name) && ((Ins1[0]=='*') || (!strcmp(res->insCode,Ins1)))) break; else if (selAND) { if (selType==STYPE_ATOM) res->UnmaskAtoms ( Mask[k] ); else if (selType==STYPE_RESIDUE) res->RemoveMask ( Mask[k] ); } } i++; } while (inResidues) { res = chain->Residue[i]; if (res) { resSel = False; // will be True on 1st sel-n in the res-e if (MatchName(res_l,res->name)) { for (j=0;jnAtoms;j++) { atom = res->atom[j]; if (atom) { if ((!atom->Ter) && MatchName(atom_l ,atom->name ) && MatchName(elem_l ,atom->element) && MatchName(aloc_l ,atom->altLoc ) && MatchName(segm_l ,atom->segID ) && MatchCharge(charge_l,atom ) && ((!altLocs1) || atom->Het)) { Sel = True; if (Occ) Sel = ((occ1<=atom->occupancy) && (atom->occupancy<=occ2)); if (Dist) { dx = atom->x - x0; dy = atom->y - y0; dz = atom->z - z0; Sel = Sel && ((dx*dx+dy*dy+dz*dz)<=d02); } } else Sel = False; if (Sel) { SelectObject ( selType,atom,k,sk,nsel ); resSel = True; chainSel = True; modelSel = True; } else if (selAND && (selType==STYPE_ATOM)) atom->RemoveMask ( Mask[k] ); } if (resSel && (selType!=STYPE_ATOM)) break; } } else if (selAND && (selType==STYPE_ATOM)) res->UnmaskAtoms ( Mask[k] ); if ((!resSel) && selAND && (selType==STYPE_RESIDUE)) res->RemoveMask ( Mask[k] ); if (chainSel && (selType>STYPE_RESIDUE)) break; if (!noRes) { if ((res->seqNum==ResNo2) && ((Ins2[0]=='*') || (!strcmp(res->insCode,Ins2))) ) break; } } i++; } if (selAND) { if (selType==STYPE_ATOM) while (inResidues) { res = chain->Residue[i]; if (res) res->UnmaskAtoms ( Mask[k] ); i++; } if (selType==STYPE_RESIDUE) while (inResidues) { res = chain->Residue[i]; if (res) res->RemoveMask ( Mask[k] ); i++; } } } else if (selAND) switch (selType) { case STYPE_ATOM : chain->UnmaskAtoms ( Mask[k] ); break; case STYPE_RESIDUE : chain->UnmaskResidues ( Mask[k] ); break; case STYPE_CHAIN : chain->RemoveMask ( Mask[k] ); break; default : ; } if ((!chainSel) && selAND && (selType==STYPE_CHAIN)) chain->RemoveMask ( Mask[k] ); if (modelSel && (selType>STYPE_CHAIN)) break; } } } else if (selAND) switch (selType) { case STYPE_ATOM : model->UnmaskAtoms ( Mask[k] ); break; case STYPE_RESIDUE : model->UnmaskResidues ( Mask[k] ); break; case STYPE_CHAIN : model->UnmaskChains ( Mask[k] ); break; default : ; } if ((!modelSel) && selAND && (selType==STYPE_MODEL)) model->RemoveMask ( Mask[k] ); } } // release dynamic memory if (chain_l) delete[] chain_l; if (res_l) delete[] res_l; if (atom_l) delete[] atom_l; if (elem_l) delete[] elem_l; if (altLocs1) delete[] altLocs1; if (aloc_l) delete[] aloc_l; if (segm_l) delete[] segm_l; if (charge_l) delete[] charge_l; MakeSelIndex ( selHnd,STYPE_ATOM,nsel ); } void CMMDBSelManager::SelectAtoms ( int selHnd, // must be obtained from NewSelection() int iModel, // model number; iModel=0 means // 'any models' cpstr Chains, // may be several chains "A,B,W"; // "*" means 'any chain' (in model) int ResNo1, // starting residue number cpstr Ins1, // starting residue insertion code; // "*" means 'any code' int ResNo2, // ending residue number. // ResNo1=ResNo2=ANY_RES means 'any // residue number' (in chain) cpstr Ins2, // ending residue insertion code // "*" means 'any code' cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in residue) cpstr Elements, // may be several element types like // "H,C,O,CU"; "*" means 'any // element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means 'any // alternative location' int selKey // selection key ) { Select ( selHnd,STYPE_ATOM,iModel,Chains,ResNo1,Ins1,ResNo2,Ins2, RNames,ANames,Elements,altLocs,selKey ); } int CMMDBSelManager::Select ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX cpstr CID, // coordinate ID int selKey // selection key ) { int iModel,l,RC; pstr Chains; int seqNum1 ,seqNum2; InsCode insCode1,insCode2; pstr RNames; pstr ANames; pstr Elements; pstr altLocs; l = IMax(10,strlen(CID))+1; Chains = new char[l]; RNames = new char[l]; ANames = new char[l]; Elements = new char[l]; altLocs = new char[l]; RC = ParseSelectionPath ( CID,iModel,Chains,seqNum1,insCode1, seqNum2,insCode2,RNames,ANames, Elements,altLocs ); if (!RC) { Select ( selHnd,selType,iModel,Chains,seqNum1,insCode1, seqNum2,insCode2,RNames,ANames,Elements,altLocs,selKey ); RC = 0; } delete[] Chains; delete[] RNames; delete[] ANames; delete[] Elements; delete[] altLocs; return RC; } void CMMDBSelManager::Select ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int iModel, // model number; iModel=0 means // 'any model' cpstr Chains, // may be several chains "A,B,W"; // "*" means 'any chain' (in model) int ResNo1, // starting residue number cpstr Ins1, // starting residue insertion code; // "*" means 'any code' int ResNo2, // ending residue number. // ResNo1=ResNo2=ANY_RES means 'any // residue number' (in chain) cpstr Ins2, // ending residue insertion code // "*" means 'any code' cpstr RNames, // may be several residue names // "ALA,GLU,CIS"; "*" means 'any // residue name' cpstr ANames, // may be several names "CA,CB"; "*" // means 'any atom' (in residue) cpstr Elements, // may be several element types like // "H,C,O,CU"; "*" means 'any element' cpstr altLocs, // may be several alternative // locations 'A,B'; "*" means 'any // alternative location' int selKey // selection key ) { int i,j,k,n,m1,m2,c, sk,nsel; Boolean noRes,modelSel,chainSel,resSel,selAND; PCModel model; PCChain chain; PCResidue res; PCAtom atom; pstr chain_l; pstr res_l; pstr atom_l; pstr elem_l; pstr altLocs1; pstr aloc_l; modelSel = False; // else may be used uninitialized if ((selHnd<=0) || (selHnd>nSelections) || (nAtoms<=0)) return; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (selKey==SKEY_AND); altLocs1 = NULL; if (altLocs) { if (strchr(altLocs,hetIndicator)) { CreateCopy ( altLocs1,altLocs ); DelSpaces ( altLocs1 ); aloc_l = strchr ( altLocs1,hetIndicator ); aloc_l[0] = ' '; if (aloc_l[1]) aloc_l[1] = ' '; // instead of comma else if (aloc_l!=altLocs1) { aloc_l--; aloc_l[0] = ' '; } DelSpaces ( altLocs1 ); aloc_l = MakeList ( altLocs1 ); } else aloc_l = MakeList ( altLocs ); } else aloc_l = MakeList ( altLocs ); chain_l = MakeList ( Chains ); res_l = MakeList ( RNames ); atom_l = MakeList ( ANames ); elem_l = MakeList ( Elements ); // noRes==True means no residue restrictions noRes = (ResNo1==ResNo2) && (ResNo1==ANY_RES) && (Ins1[0]=='*') && (Ins2[0]=='*'); m1 = iModel-1; if (m1>=0) m2 = m1+1; // will take only this model else { m1 = 0; // will take m2 = nModels; // all models } if (m1>=nModels) return; for (n=0;nnChains;c++) { chain = model->Chain[c]; if (chain) { // again check for safety chainSel = False; // will be True on 1st sel-n in the chain if (MatchName(chain_l,chain->chainID)) { // the chain is to be taken i = 0; if (!noRes) // skip "leading" residues while (inResidues) { res = chain->Residue[i]; if (res) { if ((res->seqNum==ResNo1) && MatchName(res_l,res->name) && ((Ins1[0]=='*') || (!strcmp(res->insCode,Ins1)))) break; else if (selAND) { if (selType==STYPE_ATOM) res->UnmaskAtoms ( Mask[k] ); else if (selType==STYPE_RESIDUE) res->RemoveMask ( Mask[k] ); } } i++; } while (inResidues) { res = chain->Residue[i]; i++; if (res) { resSel = False; // will be True on 1st selection // in the residue if (MatchName(res_l,res->name)) { for (j=0;jnAtoms;j++) { atom = res->atom[j]; if (atom) { if ((!atom->Ter) && MatchName(atom_l,atom->name ) && MatchName(elem_l,atom->element) && MatchName(aloc_l,atom->altLoc ) && ((!altLocs1) || atom->Het)) { SelectObject ( selType,atom,k,sk,nsel ); resSel = True; chainSel = True; modelSel = True; } else if (selAND && (selType==STYPE_ATOM)) atom->RemoveMask ( Mask[k] ); } if (resSel && (selType!=STYPE_ATOM)) break; } } else if (selAND && (selType==STYPE_ATOM)) res->UnmaskAtoms ( Mask[k] ); if ((!resSel) && selAND && (selType==STYPE_RESIDUE)) res->RemoveMask ( Mask[k] ); if (chainSel && (selType>STYPE_RESIDUE)) break; if (!noRes) { if ((res->seqNum==ResNo2) && ((Ins2[0]=='*') || (!strcmp(res->insCode,Ins2))) ) break; } } } if (selAND) { if (selType==STYPE_ATOM) while (inResidues) { res = chain->Residue[i]; if (res) res->UnmaskAtoms ( Mask[k] ); i++; } if (selType==STYPE_RESIDUE) while (inResidues) { res = chain->Residue[i]; if (res) res->RemoveMask ( Mask[k] ); i++; } } } else if (selAND) switch (selType) { case STYPE_ATOM : chain->UnmaskAtoms ( Mask[k] ); break; case STYPE_RESIDUE : chain->UnmaskResidues ( Mask[k] ); break; default : ; } if ((!chainSel) && selAND && (selType==STYPE_CHAIN)) chain->RemoveMask ( Mask[k] ); if (modelSel && (selType>STYPE_CHAIN)) break; } } } else if (selAND) switch (selType) { case STYPE_ATOM : model->UnmaskAtoms ( Mask[k] ); break; case STYPE_RESIDUE : model->UnmaskResidues ( Mask[k] ); break; case STYPE_CHAIN : model->UnmaskChains ( Mask[k] ); break; default : ; } if ((!modelSel) && selAND && (selType==STYPE_MODEL)) model->RemoveMask ( Mask[k] ); } } // release dynamic memory if (chain_l) delete[] chain_l; if (res_l) delete[] res_l; if (atom_l) delete[] atom_l; if (elem_l) delete[] elem_l; if (altLocs1) delete[] altLocs1; if (aloc_l) delete[] aloc_l; MakeSelIndex ( selHnd,selType,nsel ); } #define SKEY_XAND 100 void CMMDBSelManager::Select ( int selHnd1, // destination, must be obtained from // NewSelection() int selType, // selection type STYPE_XXXXX int selHnd2, // source, must be obtained from // NewSelection() and have been used // for selection int selKey // selection key ) { // SKEY_XOR works only downward the hierarchy! int k1,k2,sk,i,j,l,n,nsel; PCAtom atom; PCResidue res; PCChain chain; PCModel model; if ((selHnd1<=0) || (selHnd1>nSelections) || (selHnd2<=0) || (selHnd2>nSelections) || (nAtoms<=0)) return; k1 = selHnd1-1; k2 = selHnd2-1; sk = selKey; if ((SelType[k1]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k1] = selType; else if (SelType[k1]!=selType) return; if (SelType[k2]==STYPE_UNDEFINED) return; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k1] ); nSelItems[k1] = 0; sk = SKEY_OR; nsel = 0; break; case SKEY_OR : if (nSelItems[k1]==0) sk = SKEY_NEW; nsel = nSelItems[k1]; break; case SKEY_AND : if (nSelItems[k1]==0) return; sk = SKEY_XAND; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k1]; break; case SKEY_CLR : nsel = nSelItems[k1]; if (nsel<=0) return; break; default : return; } switch (SelType[k2]) { case STYPE_ATOM : for (i=0;iTer) SelectObject ( selType,atom,k1,sk,nsel ); } } break; case STYPE_RESIDUE : for (i=0;inAtoms;j++) { atom = res->atom[j]; if (atom) { if (!atom->Ter) SelectObject (atom,k1,sk,nsel); } } break; case STYPE_RESIDUE : //if (res->chain) SelectObject ( res,k1,sk,nsel ); break; case STYPE_CHAIN : if (res->chain) SelectObject ( res->chain,k1, sk,nsel ); break; case STYPE_MODEL : if (res->chain) { if (res->chain->model) SelectObject ( res->chain->model, k1,sk,nsel ); } default : ; } } break; case STYPE_CHAIN : for (i=0;inResidues;j++) { res = chain->Residue[j]; if (res) for (l=0;lnAtoms;l++) { atom = res->atom[l]; if (atom) { if (!atom->Ter) SelectObject ( atom,k1, sk,nsel ); } } } break; case STYPE_RESIDUE : for (j=0;jnResidues;j++) { res = chain->Residue[j]; if (res) SelectObject ( res,k1,sk,nsel ); } break; case STYPE_CHAIN : //if (chain->model) SelectObject ( chain,k1,sk,nsel ); break; case STYPE_MODEL : if (chain->model) SelectObject ( chain->model,k1, sk,nsel ); default : ; } } break; case STYPE_MODEL : for (i=0;inChains;j++) { chain = model->Chain[j]; if (chain) for (l=0;lnResidues;l++) { res = chain->Residue[l]; if (res) for (n=0;nnAtoms;n++) { atom = res->atom[n]; if (atom) { if (!atom->Ter) SelectObject ( atom,k1,sk,nsel ); } } } } break; case STYPE_RESIDUE : for (j=0;jnChains;j++) { chain = model->Chain[j]; if (chain) for (l=0;lnResidues;l++) { res = chain->Residue[j]; if (res) SelectObject ( res,k1,sk,nsel ); } } break; case STYPE_CHAIN : for (j=0;jnChains;j++) { chain = model->Chain[j]; if (chain) SelectObject (chain,k1,sk,nsel); } break; case STYPE_MODEL : SelectObject ( model,k1,sk,nsel ); default : ; } } break; default : ; } if (selKey==SKEY_AND) for (i=0;iXadMask ( Mask[k1] ); MakeSelIndex ( selHnd1,selType,nsel ); } void CMMDBSelManager::SelectProperty ( int selHnd, // must be obtained from NewSelection() int propKey, // property key: 0 Solvent 1 Aminoacid int selType, // selection type STYPE_XXXXX int selKey // selection key ) { PCModel model; PCChain chain; PCResidue res; int i,k,selHnd1,sk,nsel, m,c,r; Boolean doSelect; if ((selHnd<=0) || (selHnd>nSelections) || (nAtoms<=0)) return; k = selHnd-1; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; if (selType!=STYPE_RESIDUE) { selHnd1 = NewSelection(); if ((selKey==SKEY_AND) || (selKey==SKEY_CLR)) Select ( selHnd1,STYPE_RESIDUE,selHnd,SKEY_NEW ); } else selHnd1 = selHnd; k = selHnd1-1; SelType[k] = STYPE_RESIDUE; sk = selKey; switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; sk = SKEY_OR; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; sk = SKEY_XAND; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } if ((selKey==SKEY_AND) || (selKey==SKEY_CLR)) { for (i=0;iisSolvent(); break; case SELPROP_Aminoacid : doSelect = res->isAminoacid(); break; case SELPROP_Nucleotide : doSelect = res->isNucleotide(); break; case SELPROP_Sugar : doSelect = res->isSugar(); break; case SELPROP_ModRes : doSelect = res->isModRes(); break; default : doSelect = False; } if (doSelect) SelectObject ( res,k,sk,nsel ); } } if (selKey==SKEY_AND) for (i=0;iXadMask ( Mask[k] ); } else { for (m=0;mnChains;c++) { chain = model->Chain[c]; if (chain) { for (r=0;rnResidues;r++) { res = chain->Residue[r]; if (res) { switch (propKey) { case SELPROP_Solvent : doSelect = res->isSolvent(); break; case SELPROP_Aminoacid : doSelect = res->isAminoacid(); break; case SELPROP_Nucleotide : doSelect = res->isNucleotide(); break; case SELPROP_Sugar : doSelect = res->isSugar(); break; case SELPROP_ModRes : doSelect = res->isModRes(); break; default : doSelect = False; } if (doSelect) SelectObject ( res,k,sk,nsel ); } } } } } } } MakeSelIndex ( selHnd1,STYPE_RESIDUE,nsel ); if (selType!=STYPE_RESIDUE) { Select ( selHnd,selType,selHnd1,SKEY_NEW ); DeleteSelection ( selHnd1 ); } } void CMMDBSelManager::SelectUDD ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle int selMin, // lower selection boundary int selMax, // upper selection boundary int selKey // selection key ) { PCModel model; PCChain chain; PCResidue res; PCAtom atom; int i,k,sk,nsel,iudd, n,c,r,a; Boolean selAND; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; if ((selHnd<=0) || (selHnd>nSelections)) return; switch (selType) { case STYPE_ATOM : if ((UDDhandle & UDRF_ATOM)==0) return; break; case STYPE_RESIDUE : if ((UDDhandle & UDRF_RESIDUE)==0) return; break; case STYPE_CHAIN : if ((UDDhandle & UDRF_CHAIN)==0) return; break; case STYPE_MODEL : if ((UDDhandle & UDRF_MODEL)==0) return; break; default : return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (selKey==SKEY_AND); for (n=0;ngetUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( model,k,sk,nsel ); else if (selAND) model->RemoveMask ( Mask[k] ); } else { for (c=0;cnChains;c++) { chain = model->Chain[c]; if (chain) { // again check for safety if (selType==STYPE_CHAIN) { chain->getUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( chain,k,sk,nsel ); else if (selAND) chain->RemoveMask ( Mask[k] ); } else { for (r=0;rnResidues;r++) { res = chain->Residue[r]; if (res) { if (selType==STYPE_RESIDUE) { res->getUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( res,k,sk,nsel ); else if (selAND) res->RemoveMask ( Mask[k] ); } else { for (a=0;anAtoms;a++) { atom = res->atom[a]; if (atom) { if (!atom->Ter) { atom->getUDData ( UDDhandle,iudd ); if ((selMin<=iudd) && (iudd<=selMax)) SelectObject ( atom,k,sk,nsel ); else if (selAND) atom->RemoveMask ( Mask[k] ); } } } } } } } } } } } } MakeSelIndex ( selHnd,selType,nsel ); } void CMMDBSelManager::SelectUDD ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle realtype selMin, // lower selection boundary realtype selMax, // upper selection boundary int selKey // selection key ) { PCModel model; PCChain chain; PCResidue res; PCAtom atom; realtype rudd; int i,k,sk,nsel, n,c,r,a; Boolean selAND; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; if ((selHnd<=0) || (selHnd>nSelections)) return; switch (selType) { case STYPE_ATOM : if ((UDDhandle & UDRF_ATOM)==0) return; break; case STYPE_RESIDUE : if ((UDDhandle & UDRF_RESIDUE)==0) return; break; case STYPE_CHAIN : if ((UDDhandle & UDRF_CHAIN)==0) return; break; case STYPE_MODEL : if ((UDDhandle & UDRF_MODEL)==0) return; break; default : return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (selKey==SKEY_AND); for (n=0;ngetUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( model,k,sk,nsel ); else if (selAND) model->RemoveMask ( Mask[k] ); } else { for (c=0;cnChains;c++) { chain = model->Chain[c]; if (chain) { // again check for safety if (selType==STYPE_CHAIN) { chain->getUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( chain,k,sk,nsel ); else if (selAND) chain->RemoveMask ( Mask[k] ); } else { for (r=0;rnResidues;r++) { res = chain->Residue[r]; if (res) { if (selType==STYPE_RESIDUE) { res->getUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( res,k,sk,nsel ); else if (selAND) res->RemoveMask ( Mask[k] ); } else { for (a=0;anAtoms;a++) { atom = res->atom[a]; if (atom) { if (!atom->Ter) { atom->getUDData ( UDDhandle,rudd ); if ((selMin<=rudd) && (rudd<=selMax)) SelectObject ( atom,k,sk,nsel ); else if (selAND) atom->RemoveMask ( Mask[k] ); } } } } } } } } } } } } MakeSelIndex ( selHnd,selType,nsel ); } Boolean selSUDD ( cpstr sudd, cpstr selStr, int cmpRule, int ssLen ) { if (!sudd) return False; switch (cmpRule) { case UDSCR_LT : return (strcmp(sudd,selStr)<0); case UDSCR_LE : return (strcmp(sudd,selStr)<=0); case UDSCR_EQ : return (strcmp(sudd,selStr)==0); case UDSCR_NE : return (strcmp(sudd,selStr)!=0); case UDSCR_GE : return (strcmp(sudd,selStr)>=0); case UDSCR_GT : return (strcmp(sudd,selStr)>=0); case UDSCR_LTcase : return (strcasecmp(sudd,selStr)<0); case UDSCR_LEcase : return (strcasecmp(sudd,selStr)<=0); case UDSCR_EQcase : return (strcasecmp(sudd,selStr)==0); case UDSCR_NEcase : return (strcasecmp(sudd,selStr)!=0); case UDSCR_GEcase : return (strcasecmp(sudd,selStr)>=0); case UDSCR_GTcase : return (strcasecmp(sudd,selStr)>=0); case UDSCR_LTn : return (strncmp(sudd,selStr,ssLen)<0); case UDSCR_LEn : return (strncmp(sudd,selStr,ssLen)<=0); case UDSCR_EQn : return (strncmp(sudd,selStr,ssLen)==0); case UDSCR_NEn : return (strncmp(sudd,selStr,ssLen)!=0); case UDSCR_GEn : return (strncmp(sudd,selStr,ssLen)>=0); case UDSCR_GTn : return (strncmp(sudd,selStr,ssLen)>=0); case UDSCR_LTncase : return (strncasecmp(sudd,selStr,ssLen)<0); case UDSCR_LEncase : return (strncasecmp(sudd,selStr,ssLen)<=0); case UDSCR_EQncase : return (strncasecmp(sudd,selStr,ssLen)==0); case UDSCR_NEncase : return (strncasecmp(sudd,selStr,ssLen)!=0); case UDSCR_GEncase : return (strncasecmp(sudd,selStr,ssLen)>=0); case UDSCR_GTncase : return (strncasecmp(sudd,selStr,ssLen)>=0); case UDSCR_Substr : return (strstr(sudd,selStr)!=NULL); case UDSCR_NoSubstr : return (strstr(sudd,selStr)==NULL); case UDSCR_Substr1 : return (strstr(selStr,sudd)!=NULL); case UDSCR_NoSubstr1 : return (strstr(selStr,sudd)==NULL); default : return False; } } void CMMDBSelManager::SelectUDD ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX int UDDhandle, // UDD handle cpstr selStr, // selection string int cmpRule, // comparison rule int selKey // selection key ) { PCModel model; PCChain chain; PCResidue res; PCAtom atom; int i,k,sk,nsel,ssLen, n,c,r,a; Boolean selAND; k = selHnd-1; sk = selKey; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; if ((selHnd<=0) || (selHnd>nSelections)) return; switch (selType) { case STYPE_ATOM : if ((UDDhandle & UDRF_ATOM)==0) return; break; case STYPE_RESIDUE : if ((UDDhandle & UDRF_RESIDUE)==0) return; break; case STYPE_CHAIN : if ((UDDhandle & UDRF_CHAIN)==0) return; break; case STYPE_MODEL : if ((UDDhandle & UDRF_MODEL)==0) return; break; default : return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : if (nSelItems[k]==0) return; nsel = 0; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; if (nsel<=0) return; break; default : return; } selAND = (selKey==SKEY_AND); ssLen = strlen ( selStr ); for (n=0;ngetUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( model,k,sk,nsel ); else if (selAND) model->RemoveMask ( Mask[k] ); } else { for (c=0;cnChains;c++) { chain = model->Chain[c]; if (chain) { // again check for safety if (selType==STYPE_CHAIN) { if (selSUDD(chain->getUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( chain,k,sk,nsel ); else if (selAND) chain->RemoveMask ( Mask[k] ); } else { for (r=0;rnResidues;r++) { res = chain->Residue[r]; if (res) { if (selType==STYPE_RESIDUE) { if (selSUDD(res->getUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( res,k,sk,nsel ); else if (selAND) res->RemoveMask ( Mask[k] ); } else { for (a=0;anAtoms;a++) { atom = res->atom[a]; if (atom) { if (!atom->Ter) { if (selSUDD(atom->getUDData(UDDhandle),selStr, cmpRule,ssLen)) SelectObject ( atom,k,sk,nsel ); else if (selAND) atom->RemoveMask ( Mask[k] ); } } } } } } } } } } } } MakeSelIndex ( selHnd,selType,nsel ); } void CMMDBSelManager::SelectSphere ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX realtype x, // x-coordinate of the sphere's center realtype y, // y-coordinate of the sphere's center realtype z, // z-coordinate of the sphere's center realtype r, // radius of the sphere int selKey // selection key ) { // Selecting a sphere int i,k, nat,sk,nsel, im,ic,ir; realtype dx,dy,dz, r2; Boolean ASel, resSel,chainSel,modelSel,selAND; PPCAtom A; PCAtom atom; PCResidue res; PCChain chain; PCModel model; if ((selHnd<=0) || (selHnd>nSelections) || (r<=0.0)) return; k = selHnd-1; sk = selKey; A = Atom; nat = nAtoms; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; default : return; } selAND = selType==SKEY_AND; if ((nat<=0) || (!A)) return; r2 = r*r; if (selType==STYPE_ATOM) { for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { dx = fabs(A[i]->x-x); if (dx<=r) { dy = fabs(A[i]->y-y); if (dy<=r) { dz = fabs(A[i]->z-z); if (dz<=r) { if (dx*dx+dy*dy+dz*dz<=r2) { ASel = True; SelectAtom ( A[i],k,sk,nsel ); } } } } } if (!ASel) A[i]->RemoveMask ( Mask[k] ); } } else { for (im=0;imnChains;ic++) { chain = model->Chain[ic]; if (chain) { chainSel = False; for (ir=0;irnResidues;ir++) { res = chain->Residue[ir]; if (res) { resSel = False; for (i=0;inAtoms;i++) { atom = res->atom[i]; if (atom) { ASel = False; if ((!atom->Ter) && (atom->WhatIsSet & ASET_Coordinates)) { dx = fabs(atom->x-x); if (dx<=r) { dy = fabs(atom->y-y); if (dy<=r) { dz = fabs(atom->z-z); if (dz<=r) { if (dx*dx+dy*dy+dz*dz<=r2) { SelectObject ( selType,atom,k,sk,nsel ); ASel = True; resSel = True; chainSel = True; modelSel = True; } } } } } if (ASel) break; // selType>=STYPE_RESIDUE } } if ((!resSel) && selAND && (selType==STYPE_RESIDUE)) res->RemoveMask ( Mask[k] ); if (chainSel && (selType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (selType==STYPE_CHAIN)) chain->RemoveMask ( Mask[k] ); if (modelSel && (selType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (selType==STYPE_MODEL)) model->RemoveMask ( Mask[k] ); } } } MakeSelIndex ( selHnd,selType,nsel ); } void CMMDBSelManager::SelectCylinder ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX realtype x1, // x-coordinate of the cylinder axis' 1st end realtype y1, // y-coordinate of the cylinder axis' 1st end realtype z1, // z-coordinate of the cylinder axis' 1st end realtype x2, // x-coordinate of the cylinder axis' 2nd end realtype y2, // y-coordinate of the cylinder axis' 2nd end realtype z2, // z-coordinate of the cylinder axis' 2nd end realtype r, // radius of the cylinder int selKey // selection key ) { // // Selecting a cylinder // // Method : given a line running through (x1,y1,z1) to (x2,y2,z2) on, // a point (x,y,z) is then projected on it at distance // // c1 = (c^2-a^2+b^2)/(2c), // // from (x1,y1,z1), where // 'a' is the distance between (x,y,z) and (x2,y2,z2) // 'b' is the distance between (x,y,z) and (x1,y1,z1) // 'c' is the distance between (x1,y1,z1) and (x2,y2,z2). // The distance between point (x,y,z) and line is determined as // // h^2 = b^2 - c1^2 // // If c1>=0 and c1<=c and h^2<=r^2 then point (x,y,z) is inside // a cylinder of radius 'r' with axis running from point // (x1,y1,z1) to (x2,y2,z2). // int i,k, nat,sk,nsel, im,ic,ir; realtype dx,dy,dz, c,dc,c1,c2, a2,b2, r2; Boolean resSel,chainSel,modelSel,selAND; PPCAtom A; PCAtom atom; PCResidue res; PCChain chain; PCModel model; if ((selHnd<=0) || (selHnd>nSelections) || (r<=0.0)) return; dx = x1-x2; dy = y1-y2; dz = z1-z2; c2 = dx*dx + dy*dy + dz*dz; if (c2<=0.0) return; c = sqrt(c2); dc = 2.0*c; r2 = r*r; k = selHnd-1; sk = selKey; A = Atom; nat = nAtoms; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; default : return; } selAND = selType==SKEY_AND; if ((nat<=0) || (!A)) return; if (selType==STYPE_ATOM) { for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { dx = fabs(A[i]->x-x1); dy = fabs(A[i]->y-y1); dz = fabs(A[i]->z-z1); a2 = dx*dx + dy*dy + dz*dz; dx = fabs(A[i]->x-x2); dy = fabs(A[i]->y-y2); dz = fabs(A[i]->z-z2); b2 = dx*dx + dy*dy + dz*dz; c1 = (c2-a2+b2)/dc; if ((0.0<=c1) && (c1<=c) && (b2-c1*c1<=r2)) SelectAtom ( A[i],k,sk,nsel ); else if (sk==SKEY_AND) A[i]->RemoveMask ( Mask[k] ); } } } else { for (im=0;imnChains;ic++) { chain = model->Chain[ic]; if (chain) { chainSel = False; for (ir=0;irnResidues;ir++) { res = chain->Residue[ir]; if (res) { resSel = False; for (i=0;inAtoms;i++) { atom = res->atom[i]; if (atom) { if ((!atom->Ter) && (atom->WhatIsSet & ASET_Coordinates)) { dx = fabs(atom->x-x1); dy = fabs(atom->y-y1); dz = fabs(atom->z-z1); a2 = dx*dx + dy*dy + dz*dz; dx = fabs(atom->x-x2); dy = fabs(atom->y-y2); dz = fabs(atom->z-z2); b2 = dx*dx + dy*dy + dz*dz; c1 = (c2-a2+b2)/dc; if ((0.0<=c1) && (c1<=c) && (b2-c1*c1<=r2)) { SelectObject ( selType,atom,k,sk,nsel ); resSel = True; chainSel = True; modelSel = True; break; // selType>=STYPE_RESIDUE } } } } if ((!resSel) && selAND && (selType==STYPE_RESIDUE)) res->RemoveMask ( Mask[k] ); if (chainSel && (selType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (selType==STYPE_CHAIN)) chain->RemoveMask ( Mask[k] ); if (modelSel && (selType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (selType==STYPE_MODEL)) model->RemoveMask ( Mask[k] ); } } } MakeSelIndex ( selHnd,selType,nsel ); } void CMMDBSelManager::SelectSlab ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX realtype a, // a-parameter of the plane ax+by+cz=d realtype b, // b-parameter of the plane ax+by+cz=d realtype c, // c-parameter of the plane ax+by+cz=d realtype d, // d-parameter of the plane ax+by+cz=d realtype r, // distance to the plane int selKey // selection key ) { // // Selecting all atoms on a given distance from a plane // // Method : the distance between a point (x0,y0,z0) and a plane // defined by equation // // a*x + b*y + c*z = d // // is found as // // h = (d-a*x0-b*y0-c*z0)/sqrt(a^2+b^2+c^2) // // If |h|nSelections) || (r<=0.0)) return; v = sqrt(a*a + b*b + c*c); if (v<=0.0) return; k = selHnd-1; sk = selKey; A = Atom; nat = nAtoms; if ((SelType[k]==STYPE_UNDEFINED) || (selKey==SKEY_NEW)) SelType[k] = selType; else if (SelType[k]!=selType) return; // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; default : return; } selAND = selType==SKEY_AND; if ((nat<=0) || (!A)) return; if (selType==STYPE_ATOM) { for (i=0;iTer) && (A[i]->WhatIsSet & ASET_Coordinates)) { h = fabs(d-a*A[i]->x-b*A[i]->y-c*A[i]->z)/v; if (h<=r) SelectAtom ( A[i],k,sk,nsel ); else if (sk==SKEY_AND) A[i]->RemoveMask ( Mask[k] ); } } } else { for (im=0;imnChains;ic++) { chain = model->Chain[ic]; if (chain) { chainSel = False; for (ir=0;irnResidues;ir++) { res = chain->Residue[ir]; if (res) { resSel = False; for (i=0;inAtoms;i++) { atom = res->atom[i]; if (atom) { if ((!atom->Ter) && (atom->WhatIsSet & ASET_Coordinates)) { h = fabs(d-a*A[i]->x-b*A[i]->y-c*A[i]->z)/v; if (h<=r) { SelectObject ( selType,atom,k,sk,nsel ); resSel = True; chainSel = True; modelSel = True; break; // selType>=STYPE_RESIDUE } } } } if ((!resSel) && selAND && (selType==STYPE_RESIDUE)) res->RemoveMask ( Mask[k] ); if (chainSel && (selType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (selType==STYPE_CHAIN)) chain->RemoveMask ( Mask[k] ); if (modelSel && (selType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (selType==STYPE_MODEL)) model->RemoveMask ( Mask[k] ); } } } MakeSelIndex ( selHnd,selType,nsel ); } void CMMDBSelManager::SelectNeighbours ( int selHnd, // must be obtained from NewSelection() int selType, // selection type STYPE_XXXXX PPCAtom sA, // array of already selected atoms int alen, // length of A realtype d1, // minimal distance to already selected atoms realtype d2, // maximal distance to already selected atoms int selKey // selection key ) { // Selecting all atoms on a given distance from already selected int i,j,k, dn, nx,ny,nz, nat,sk,nsel, im,ic,ir; int ix1,ix2,ix, iy1,iy2,iy, iz1,iz2,iz; realtype x,y,z, dx,dy,dz, dst, d12,d22; PPCAtom A; PCBrick B; PCAtom atom; PCResidue res; PCChain chain; PCModel model; Boolean ASel,resSel,chainSel,modelSel,selAND; if ((selHnd<=0) || (selHnd>nSelections) || (d2<=0.0) || (d2RemoveMask ( Mask[k] ); nSelItems[k] = 0; } return; } // if something goes wrong, sk should be assigned SKEY_OR if // selKey is set to SKEY_NEW or SKEY_OR below switch (selKey) { case SKEY_NEW : for (i=0;iRemoveMask ( Mask[k] ); nSelItems[k] = 0; nsel = 0; break; case SKEY_OR : if (nSelItems[k]==0) sk = SKEY_NEW; nsel = nSelItems[k]; break; case SKEY_AND : nsel = 0; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; case SKEY_XOR : nsel = nSelItems[k]; break; case SKEY_CLR : nsel = nSelItems[k]; nat = nSelItems[k]; A = (PPCAtom)Selection[k]; break; default : return; } selAND = (sk==SKEY_AND); if ((nat<=0) || (!A)) return; MakeBricks ( sA,alen,d2*1.5 ); dn = mround(d2/brick_size)+1; if (Brick && (selType==STYPE_ATOM)) { for (i=0;iTer) { ASel = False; GetBrickCoor ( A[i],nx,ny,nz ); if (nx<0) nx++; ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); x = A[i]->x; y = A[i]->y; z = A[i]->z; for (ix=ix1;(ixnAtoms) && (!ASel);j++) if (B->Atom[j]!=A[i]) { dx = fabs(x-B->Atom[j]->x); if (dx<=d2) { dy = fabs(y-B->Atom[j]->y); if (dy<=d2) { dz = fabs(z-B->Atom[j]->z); if (dz<=d2) { dst = dx*dx+dy*dy+dz*dz; if ((dst>=d12) && (dst<=d22)) { ASel = True; SelectAtom ( A[i],k,sk,nsel ); } } } } } } if ((!ASel) && selAND) A[i]->RemoveMask ( Mask[k] ); } } } else if (Brick) { for (im=0;imnChains;ic++) { chain = model->Chain[ic]; if (chain) { chainSel = False; for (ir=0;irnResidues;ir++) { res = chain->Residue[ir]; if (res) { resSel = False; for (i=0;(inAtoms) && (!resSel);i++) { atom = res->atom[i]; if (atom) { if ((!atom->Ter) && (atom->WhatIsSet & ASET_Coordinates)) { GetBrickCoor ( atom,nx,ny,nz ); if (nx<0) nx++; ix1 = IMax ( 0,nx-dn ); iy1 = IMax ( 0,ny-dn ); iz1 = IMax ( 0,nz-dn ); ix2 = IMin ( nbrick_x,nx+dn+1 ); iy2 = IMin ( nbrick_y,ny+dn+1 ); iz2 = IMin ( nbrick_z,nz+dn+1 ); x = atom->x; y = atom->y; z = atom->z; for (ix=ix1;(ixnAtoms) && (!resSel);j++) if (B->Atom[j]!=atom) { dx = fabs(x-B->Atom[j]->x); if (dx<=d2) { dy = fabs(y-B->Atom[j]->y); if (dy<=d2) { dz = fabs(z-B->Atom[j]->z); if (dz<=d2) { dst = dx*dx+dy*dy+dz*dz; if ((dst>=d12) && (dst<=d22)) { SelectObject ( selType, atom,k,sk,nsel ); resSel = True; chainSel = True; modelSel = True; } } } } } } } } } if ((!resSel) && selAND && (selType==STYPE_RESIDUE)) res->RemoveMask ( Mask[k] ); if (chainSel && (selType>STYPE_RESIDUE)) break; } } if ((!chainSel) && selAND && (selType==STYPE_CHAIN)) chain->RemoveMask ( Mask[k] ); if (modelSel && (selType>STYPE_CHAIN)) break; } } if ((!modelSel) && selAND && (selType==STYPE_MODEL)) model->RemoveMask ( Mask[k] ); } } } MakeSelIndex ( selHnd,selType,nsel ); } int TakeChainID ( pstr & p, pstr chainID ) { int RC,k; chainID[0] = char(0); if (*p) { RC = 0; if (*p==':') { // starts with colon <=> empty chain ID chainID[0] = char(0); p++; // advance to residue number } else if (p[1]==':') { // second symbol is colon <=> regular chain ID chainID[0] = *p; chainID[1] = char(0); p++; p++; // advance to residue number } else if (*p=='\'') { // starts with a strip <=> assume empty chain ID chainID[0] = char(0); p++; if (*p=='\'') { // closing strip must be followed by colon p++; if (*p!=':') RC = -1; } else { // no concluding strip <=> could be a strip chain ID, // although this must be captured by 2nd "if" chainID[0] = '\''; chainID[1] = char(0); // assume that residue number is following the strip } } else if ((int(*p)>=int('0')) && (int(*p)<=int('9'))) { // a digit without following semicolon looks very much // like residue number with unspecified empty chain ID chainID[0] = char(0); // assume that p already points on residue number } else { // assume a long chain ID k = 0; while (*p && (*p!=':') && (k<(int)sizeof(ChainID)-1)) { chainID[k++] = *p; p++; } if (*p==':') { chainID[k] = char(0); } else { // a mistake chainID[0] = char(0); RC = -1; } } while (*p==' ') p++; } else RC = 1; return RC; } int TakeResID( pstr & p, int & seqNum, pstr inscode ) { char N[100]; int i,RC; pstr endptr; RC = 1; inscode[0] = '*'; inscode[1] = char(0); seqNum = ANY_RES; if (((*p) && (int(*p)>=int('0')) && (int(*p)<=int('9'))) || (*p=='-')) { N[0] = *p; p++; i = 1; while ((*p) && (int(*p)>=int('0')) && (int(*p)<=int('9'))) { N[i++] = *p; p++; } N[i] = char(0); seqNum = mround(strtod(N,&endptr)); if ((seqNum==0) && (endptr==N)) RC = -1; else { RC = 0; if ((*p) && (*p!='-') && (*p!=',') && (*p!=' ')) { inscode[0] = *p; inscode[1] = char(0); p++; } else inscode[0] = char(0); if ((*p=='-') || (*p==',')) p++; } while (*p==' ') p++; } return RC; } int CMMDBSelManager::SelectDomain ( int selHnd , cpstr domainRange, int selType, int selKey, int modelNo ) { // domainRange is of the following format: // "*", "(all)" - take all file // "-" - take chain without chain ID // "a:Ni-Mj,b:Kp-Lq,..." - take chain a residue number N // insertion code i to residue number M // insertion code j plus chain b // residue number K insertion code p to // residue number L insertion code q and // so on. // "a:,b:..." - take whole chains a and b and so on // "a:,b:Kp-Lq,..." - any combination of the above. ChainID chainID; InsCode insCode1,insCode2; pstr S,p; int seqNum1,seqNum2,rc,selKey1; if ((selHnd<=0) || (selHnd>nSelections)) return 1; // leave only required residues rc = 1; if (!domainRange) rc = 0; else if ((!domainRange[0]) || (domainRange[0]=='*')) rc = 0; else if (!strcasecmp(domainRange,"(all)")) rc = 0; if (!rc) { // select all Select ( selHnd,selType,modelNo,"*",ANY_RES,"*",ANY_RES,"*", "*","*","*","*",selKey ); return 0; } if (!strcasecmp(domainRange,"-")) { // select chain without chain ID Select ( selHnd,selType,modelNo,"",ANY_RES,"*",ANY_RES,"*", "*","*","*","*",selKey ); return 0; } S = new char[strlen(domainRange)+10]; strcpy ( S,domainRange ); DelSpaces ( S ); // UpperCase ( S ); p = S; rc = 0; selKey1 = selKey; while ((*p) && (!rc)) { if (TakeChainID(p,chainID)<0) rc = -1; else if (TakeResID(p,seqNum1,insCode1)<0) rc = -2; else if (TakeResID(p,seqNum2,insCode2)<0) rc = -3; else { Select ( selHnd,selType,modelNo,chainID, seqNum1,insCode1,seqNum2,insCode2, "*","*","*","*",selKey1 ); if (*p==',') p++; if (selKey1==SKEY_NEW) selKey1 = SKEY_OR; } } delete[] S; return rc; } int CMMDBSelManager::GetSelLength ( int selHnd ) { if ((selHnd>0) && (selHnd<=nSelections)) return nSelItems[selHnd-1]; else return 0; } void CMMDBSelManager::GetSelIndex ( int selHnd, PPCAtom & SelAtom, int & nSelAtoms ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (SelType[selHnd-1]!=STYPE_ATOM) { SelAtom = NULL; nSelAtoms = 0; } else { SelAtom = (PPCAtom)Selection[selHnd-1]; nSelAtoms = nSelItems[selHnd-1]; } } else { SelAtom = NULL; nSelAtoms = 0; } } void CMMDBSelManager::GetSelIndex ( int selHnd, PPCResidue & SelResidue, int & nSelResidues ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (SelType[selHnd-1]!=STYPE_RESIDUE) { SelResidue = NULL; nSelResidues = 0; } else { SelResidue = (PPCResidue)Selection[selHnd-1]; nSelResidues = nSelItems[selHnd-1]; } } else { SelResidue = NULL; nSelResidues = 0; } } void CMMDBSelManager::GetSelIndex ( int selHnd, PPCChain & SelChain, int & nSelChains ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (SelType[selHnd-1]!=STYPE_CHAIN) { SelChain = NULL; nSelChains = 0; } else { SelChain = (PPCChain)Selection[selHnd-1]; nSelChains = nSelItems[selHnd-1]; } } else { SelChain = NULL; nSelChains = 0; } } void CMMDBSelManager::GetSelIndex ( int selHnd, PPCModel & SelModel, int & nSelModels ) { if ((selHnd>0) && (selHnd<=nSelections)) { if (SelType[selHnd-1]!=STYPE_MODEL) { SelModel = NULL; nSelModels = 0; } else { SelModel = (PPCModel)Selection[selHnd-1]; nSelModels = nSelItems[selHnd-1]; } } else { SelModel = NULL; nSelModels = 0; } } void CMMDBSelManager::GetAtomStatistics ( int selHnd, RSAtomStat AS ) { int i,k; AS.Init(); if ((selHnd>0) && (selHnd<=nSelections)) { k = selHnd-1; switch (SelType[k]) { case STYPE_MODEL : if (Selection[k]) for (i=0;i CalcAtomStatistics ( AS ); break; case STYPE_CHAIN : if (Selection[k]) for (i=0;i CalcAtomStatistics ( AS ); break; case STYPE_RESIDUE : if (Selection[k]) for (i=0;i CalcAtomStatistics ( AS ); break; case STYPE_ATOM : if (Selection[k]) for (i=0;i CalcAtomStatistics ( AS ); break; default : break; } } AS.Finish(); } void CMMDBSelManager::SelectAtom ( PCAtom atom, int maskNo, int selKey, int & nsel ) { Boolean ASel; ASel = atom->CheckMask ( Mask[maskNo] ); switch (selKey) { default : case SKEY_NEW : case SKEY_OR : if (!ASel) { atom->SetMask ( Mask[maskNo] ); nsel++; } break; case SKEY_AND : if (ASel) nsel++; break; case SKEY_XOR : if (ASel) { atom->RemoveMask ( Mask[maskNo] ); nsel--; } else { atom->SetMask ( Mask[maskNo] ); nsel++; } break; case SKEY_CLR : if (ASel) { atom->RemoveMask ( Mask[maskNo] ); nsel--; } } } void CMMDBSelManager::SelectObject ( int selType, PCAtom atom, int maskNo, int selKey, int & nsel ) { PCMask object; switch (selType) { default : case STYPE_UNDEFINED : return; case STYPE_ATOM : object = atom; break; case STYPE_RESIDUE : object = atom->GetResidue(); break; case STYPE_CHAIN : object = atom->GetChain (); break; case STYPE_MODEL : object = atom->GetModel (); break; } if (!object) return; SelectObject ( object,maskNo,selKey,nsel ); } void CMMDBSelManager::SelectObject ( PCMask object, int maskNo, int selKey, int & nsel ) { Boolean ASel; ASel = object->CheckMask ( Mask[maskNo] ); switch (selKey) { default : case SKEY_NEW : case SKEY_OR : if (!ASel) { object->SetMask ( Mask[maskNo] ); nsel++; } break; case SKEY_AND : if (ASel) nsel++; break; case SKEY_XOR : if (ASel) { object->RemoveMask ( Mask[maskNo] ); nsel--; } else { object->SetMask ( Mask[maskNo] ); nsel++; } break; case SKEY_CLR : if (ASel) { object->RemoveMask ( Mask[maskNo] ); nsel--; } break; case SKEY_XAND : if (ASel) { object->RemoveMask ( Mask[maskNo] ); nsel++; } } } void CMMDBSelManager::DeleteSelObjects ( int selHnd ) { PPCModel model; PPCChain chain; PPCResidue res; PPCAtom atom; int i,k,nSel; if ((selHnd>0) && (selHnd<=nSelections)) { k = selHnd-1; nSel = nSelItems[k]; switch (SelType[k]) { case STYPE_MODEL : model = (PPCModel)Selection[k]; for (i=0;i0) && (selHnd<=nSelections)) { k1 = selHnd-1; k2 = k1+1; } else { k1 = 0; k2 = nSelections; } for (k=k1;kCheckMask(Mask[k])) ns++; break; case STYPE_RESIDUE : for (n=0;nnChains;i++) { chain = model->Chain[i]; if (chain) for (j=0;jnResidues;j++) { res = chain->Residue[j]; if (res) if (res->CheckMask(Mask[k])) ns++; } } } break; case STYPE_CHAIN : for (i=0;inChains;j++) { chain = model->Chain[j]; if (chain) if (chain->CheckMask(Mask[k])) ns++; } } break; case STYPE_MODEL : for (i=0;iCheckMask(Mask[k])) ns++; break; default : ; } } else ns = nsel; if (Selection[k]) delete[] Selection[k]; if (ns>0) { Selection[k] = new PCMask[ns]; nns = 0; switch (selType) { case STYPE_ATOM : for (i=0;iCheckMask(Mask[k])) { Selection[k][nns++] = Atom[i]; if (nns>=ns) nns = ns-1; } } break; case STYPE_RESIDUE : for (n=0;nnChains;i++) { chain = model->Chain[i]; if (chain) for (j=0;jnResidues;j++) { res = chain->Residue[j]; if (res) if (res->CheckMask(Mask[k])) { Selection[k][nns++] = res; if (nns>=ns) nns = ns-1; } } } } break; case STYPE_CHAIN : for (i=0;inChains;j++) { chain = model->Chain[j]; if (chain) if (chain->CheckMask(Mask[k])) { Selection[k][nns++] = chain; if (nns>=ns) nns = ns-1; } } } break; case STYPE_MODEL : for (i=0;iCheckMask(Mask[k])) { Selection[k][nns++] = Model[i]; if (nns>=ns) nns = ns-1; } break; default : ; } } else Selection[k] = NULL; nSelItems[k] = ns; } } // ------------------- Stream functions ---------------------- void CMMDBSelManager::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); CMMDBCoorManager::write ( f ); f.WriteInt ( &nSelections ); for (i=0;i0) { Mask = new PCMask [nSelections]; Selection = new PPCMask[nSelections]; nSelItems = new int [nSelections]; SelType = new int [nSelections]; for (i=0;i // ~~~~~~~~~ // **** Functions : // ~~~~~~~~~~~ // GetString ( reads substring from a string ) // GetStrTer ( reads substring and put term-ing null ) // strcpy_n ( copies not more than n characters ) // strcpy_ns ( like strcpy_ns and pads with spaces ) // strcpy_n0 ( like strcpy_n and adds terminating 0 ) // PadSpaces ( pads a string with spaces ) // // (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __MatType__ #define __MatType__ #ifndef __MATH_H #include #endif #define UseDoubleFloat #ifndef __ClassMacros # define __ClassMacros // A Class definition macros # define DefineClass(ClassName) \ class ClassName; \ typedef ClassName * P##ClassName; \ typedef ClassName & R##ClassName; \ typedef P##ClassName * PP##ClassName; \ typedef P##ClassName & RP##ClassName; // A Structure definition macros # define DefineStructure(StructureName) \ struct StructureName; \ typedef StructureName * P##StructureName; \ typedef StructureName & R##StructureName; \ typedef P##StructureName * PP##StructureName; \ typedef P##StructureName & RP##StructureName; #endif #define UNUSED_ARGUMENT(x) (void)x // ----------------------------------------------------- #ifdef UseDoubleFloat # define MinReal 2.2250e-307 # define MaxReal 1.7976e+308 # define fMinReal 2.2250e-307 # define fMaxReal 1.7976e+308 typedef double realtype; #else # define MinReal 1.1755e-38 # define MaxReal 3.4020e+38 # define fMinReal 1.1755e-38 # define fMaxReal 3.4020e+38 typedef float realtype; #endif typedef float shortreal; #define MinShortReal 1.1755e-38 #define MaxShortReal 3.4020e+38 #define strrchr LastOccurence #define fstrrchr LastOccurence #define strchr FirstOccurence #define fstrchr FirstOccurence typedef char * pstr; typedef const char * cpstr; typedef unsigned int word; typedef unsigned char byte; typedef signed char short_int; typedef byte Boolean; typedef unsigned int word2; typedef byte * byteptr; typedef unsigned long lword; typedef byte intUniBin [4]; typedef byte shortUniBin [2]; typedef byte longUniBin [4]; typedef byte wordUniBin [4]; typedef byte realUniBin [10]; typedef byte floatUniBin [5]; typedef byte shortrealUniBin[5]; #ifdef _WIN32 #define strncasecmp _strnicmp #define strcasecmp _stricmp #define strlen (int)strlen pstr strcasestr ( pstr s1, cpstr s2 ); #endif #define True Boolean(1) #define False Boolean(0) #define MaxInt 32767 #define MinInt (-32768) #define MaxWord 65535L #define MaxInt4 2147483647 // MinInt4 would have to be defined as -2147483648, // however some compilers do not like that. To be on safe, // we define it as -2147483647: #define MinInt4 (-2147483647) #define MaxWord4 4294967295 #define Pi 3.141592653589793238462643 #define Eu 2.718281828459045235360287 #define ln10 2.3025850929940456840179915 // *** vectors X[1..N] : typedef realtype * rvector; typedef int * ivector; typedef word * wvector; typedef byte * bvector; typedef long * lvector; typedef lword * lwvector; typedef pstr * psvector; // *** matrices X[1..N][1..M] : typedef rvector * rmatrix; typedef ivector * imatrix; typedef wvector * wmatrix; typedef bvector * bmatrix; typedef lvector * lmatrix; typedef lwvector * lwmatrix; typedef psvector * psmatrix; // *** matrices X[1..N][1..M][1..K] : typedef rmatrix * rmatrix3; typedef imatrix * imatrix3; typedef wmatrix * wmatrix3; typedef bmatrix * bmatrix3; typedef lmatrix * lmatrix3; typedef lwmatrix * lwmatrix3; typedef psmatrix * psmatrix3; // ------------------------------------------------------------ // Initialization. Some C++ enviroments do not do call // InitMatType() automatically, therefore it is always // advisable to call InitMatType() explicitely from the top of // main(). It is completely harmless and cheap (although // unnecessary) to call InitMatType() multiple times. extern Boolean InitMatType(); // ------------------------------------------------------------ /* extern int mround ( realtype X ); extern int ifloor ( realtype X ); extern int Abs ( int x ); extern void ISwap ( int & x, int & y ); extern void WSwap ( word & x, word & y ); extern void BSwap ( byte & x, byte & y ); extern void LSwap ( long & x, long & y ); extern void RSwap ( realtype & x, realtype & y ); extern realtype RMax ( const realtype x1, const realtype x2 ); extern long LMax ( const long x1, const long x2 ); extern word WMax ( const word x1, const word x2 ); extern int IMax ( const int x1, const int x2 ); extern realtype RMin ( const realtype x1, const realtype x2 ); extern long LMin ( const long x1, const long x2 ); extern word WMin ( const word x1, const word x2 ); extern int IMin ( const int x1, const int x2 ); extern realtype fsign ( const realtype x1, const realtype x2 ); */ inline int mround ( realtype X ) { return (int)floor(X+0.5); } inline int ifloor ( realtype X ) { return (int)floor(X); } inline int Abs ( int x ) { return ( x >= 0 ? x : -x ); } inline void ISwap ( int & x, int & y ) { int b = x; x = y; y = b; } inline void WSwap ( word & x, word & y ) { word b = x; x = y; y = b; } inline void BSwap ( byte & x, byte & y ) { byte b = x; x = y; y = b; } inline void LSwap ( long & x, long & y ) { long b = x; x = y; y = b; } inline void RSwap ( realtype & x, realtype & y ) { realtype b = x; x = y; y = b; } inline realtype RMax ( const realtype x1, const realtype x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline long LMax ( const long x1, const long x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline word WMax ( const word x1, const word x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline int IMax ( const int x1, const int x2 ) { return ( x1 > x2 ? x1 : x2 ); } inline realtype RMin ( const realtype x1, const realtype x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline long LMin ( const long x1, const long x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline word WMin ( const word x1, const word x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline int IMin ( const int x1, const int x2 ) { return ( x1 < x2 ? x1 : x2 ); } inline realtype fsign ( const realtype x1, const realtype x2 ) { realtype ax; if (x1>=0.0) ax = x1; else ax = -x1; return ( x2 >= 0.0 ? ax : -ax ); } // ------------------------------------------------------------ // Allocated vectors are enumerated as [Shift..Shift+N-1] // rather than [0..N-1] ! // Get-functions return if memory was allocated; // if allocation attemt fails, vector is assigned with NULL extern Boolean GetVectorMemory ( rvector & V, word N, word Shift=1 ); extern Boolean GetVectorMemory ( ivector & I, word N, word Shift=1 ); extern Boolean GetVectorMemory ( wvector & W, word N, word Shift=1 ); extern Boolean GetVectorMemory ( bvector & B, word N, word Shift=1 ); extern Boolean GetVectorMemory ( lvector & L, word N, word Shift=1 ); extern Boolean GetVectorMemory ( lwvector & L, word N, word Shift=1 ); extern Boolean GetVectorMemory ( psvector & P, word N, word Shift=1 ); // Shift at deallocation MUST be the same as that at allocation ! // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Free-functions do nothing if vector has value NULL (e.g. // after unsuccessful allocation). extern void FreeVectorMemory ( rvector & V, word Shift=1 ); extern void FreeVectorMemory ( ivector & I, word Shift=1 ); extern void FreeVectorMemory ( wvector & W, word Shift=1 ); extern void FreeVectorMemory ( bvector & B, word Shift=1 ); extern void FreeVectorMemory ( lvector & L, word Shift=1 ); extern void FreeVectorMemory ( lwvector & L, word Shift=1 ); extern void FreeVectorMemory ( psvector & P, word Shift=1 ); // ------------------------------------------------------------- // Allocated matrices are enumerated as // [ShiftN..ShiftN+N-1, ShiftM..ShiftM+M-1] // rather than [0..N-1,0..M-1] ! // Get-functions return if memory was allocated; // if allocation attemt fails, matrix is assigned with NULL // Free-functions do nothing if matrix has value NULL (e.g. // after unsuccessful allocation). extern Boolean GetMatrixMemory ( rmatrix & A, word N, word M, word ShiftN=1, word ShiftM=1 ); extern Boolean GetMatrixMemory ( imatrix & A, word N, word M, word ShiftN=1, word ShiftM=1 ); extern Boolean GetMatrixMemory ( wmatrix & W, word N, word M, word ShiftN=1, word ShiftM=1 ); extern Boolean GetMatrixMemory ( bmatrix & B, word N, word M, word ShiftN=1, word ShiftM=1 ); extern Boolean GetMatrixMemory ( lmatrix & L, word N, word M, word ShiftN=1, word ShiftM=1 ); extern Boolean GetMatrixMemory ( lwmatrix & L, word N, word M, word ShiftN=1, word ShiftM=1 ); extern Boolean GetMatrixMemory ( psmatrix & P, word N, word M, word ShiftN=1, word ShiftM=1 ); // ShiftN and ShiftM at deallocation MUST be the same as those at // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // allocation ! // ~~~~~~~~~~~~~ extern void FreeMatrixMemory ( rmatrix & A, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( imatrix & A, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( wmatrix & W, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( bmatrix & B, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( lmatrix & L, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( lwmatrix & L, word N, word ShiftN=1, word ShiftM=1 ); extern void FreeMatrixMemory ( psmatrix & P, word N, word ShiftN=1, word ShiftM=1 ); // ------------------------------------------------------------- // 3D matrices extern Boolean GetMatrix3Memory ( rmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern Boolean GetMatrix3Memory ( imatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern Boolean GetMatrix3Memory ( wmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern Boolean GetMatrix3Memory ( bmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern Boolean GetMatrix3Memory ( lmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern Boolean GetMatrix3Memory ( lwmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern Boolean GetMatrix3Memory ( psmatrix3 & A, word N, word M, word K, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); // // ShiftN, ShiftM and ShiftK at deallocation MUST be // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // the same as those at allocation ! // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ extern void FreeMatrix3Memory ( rmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( imatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( wmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( bmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( lmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( lwmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); extern void FreeMatrix3Memory ( psmatrix3 & A, word N, word M, word ShiftN=1, word ShiftM=1, word ShiftK=1 ); // ------------------------------------------------------------- extern realtype MachEps; extern realtype floatMachEps; extern realtype LnMaxReal; extern realtype LnMinReal; extern realtype MachinEps (); extern realtype floatMachinEps(); extern realtype frac ( realtype R ); extern long mod ( long x, long y ); extern realtype Pow ( realtype X, int y ); extern realtype Pow1 ( realtype X, realtype Y ); extern realtype Exp ( realtype X ); // use to avoid catastrophies extern Boolean Odd ( int i ); extern long HexValL ( cpstr S ); extern long OctValL ( cpstr S ); extern long BinValL ( cpstr S ); extern pstr BinValS ( long L, pstr S ); // S[sizeof(long)+1] at least extern pstr ParamStr ( pstr D, cpstr S, realtype V, int M=5, cpstr S1=(pstr)"" ); extern pstr ParamStr ( pstr D, cpstr S, realtype V, int M, cpstr S1, realtype V2, int M2=5, cpstr S2=(pstr)"" ); // ---------- Strings // CreateCopy(..) allocates Dest string and copies the contents of // Source into it. If Dest is not NULL prior calling the function, // it is attempted to deallocate first. extern pstr CreateCopy ( pstr & Dest, cpstr Source ); extern pstr CreateCopy_n ( pstr & Dest, cpstr Source, int n ); extern pstr CreateConcat ( pstr & Dest, cpstr Source ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2 ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ); extern pstr CreateConcat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4, cpstr Source5 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3, cpstr Source4 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2, cpstr Source3 ); extern pstr CreateCopCat ( pstr & Dest, cpstr Source1, cpstr Source2 ); extern pstr LastOccurence ( cpstr S , char c ); extern pstr FirstOccurence ( cpstr S , char c ); extern int indexOf ( cpstr S , char c ); extern pstr FirstOccurence ( cpstr S, int Slen, cpstr Q, int Qlen ); extern int indexOf ( cpstr S, int Slen, cpstr Q, int Qlen ); extern pstr LowerCase ( pstr s ); extern pstr UpperCase ( pstr s ); // GetString(..) copies first M characters of string S into string // L, appending the terminating null. If S contains less then M // characters, L will be padded with spaces. extern void GetString ( pstr L, cpstr S, int M ); // GetStrTer(..) copies at least n (or LMax if LMax5 // (terminating null appended). // The function returns d. extern pstr strcpy_ncs ( pstr d, cpstr s, int n ); // strcpy_css(..) copies string s to string d cutting all // spaces at the begining and at the end. Thus, " ab c de " // will be copied like "ab c de" (terminating null appended). // The function returns d. extern pstr strcpy_css ( pstr d, cpstr s ); // strcpy_ncss(..) copies at most n characters from string s // to string d cutting all spaces at the begining and at the end. // Thus, " ab c de " will be copied like "ab" at n=3 (terminating // null appended). // The function returns d. extern pstr strcpy_ncss ( pstr d, cpstr s, int n ); // strcpy_n0(..) copies at most n symbols from string s to d, // but no more than strlen(s) (s must contain a terminating // null). The terminating null IS appended to d. // The function returns d. extern pstr strcpy_n0 ( pstr d, cpstr s, int n ); // strlen_des returns the length of a string as if all extra // spaces from the latter have been deleted. Extra spaces // include all leading and tracing spaces and any sequential // spaces when more than one. The string does not change. extern int strlen_des ( cpstr s ); // strcpy_des copies string s into string d removing all extra // spaces from the latter. Extra spaces include all leading and // tracing spaces and any sequential spaces when more than one. extern pstr strcpy_des ( pstr d, cpstr s ); // strcpy_des appends string s to string d removing all extra // spaces from the latter. Extra spaces include all leading and // tracing spaces and any sequential spaces when more than one. extern pstr strcat_des ( pstr d, cpstr s ); // PadSpaces(..) pads string S with spaces making its length // equal to len. The terminating zero is added, so that S should // reserve space of a minimum len+1 characters. extern void PadSpaces ( pstr S, int len ); #define SCUTKEY_BEGIN 0x00000001 #define SCUTKEY_END 0x00000002 #define SCUTKEY_BEGEND 0x00000003 // CutSpaces(..) cuts spaces at the begining or end of // string S according to the value of CutKey. The function // returns S. extern pstr CutSpaces ( pstr S, int CutKey ); // DelSpaces(..) removes all spaces (or other symbols as // specified by 'c') from the string. The string is then // shrinked by the number of removed characters. Thus, // " as ttt " becomes "asttt". extern pstr DelSpaces ( pstr S, char c=' ' ); // EnforceSpaces(..) replaces all unprintable characters, // except , , and some others, for spaces extern pstr EnforceSpaces ( pstr S ); // ------------------------------------------------------------- extern void int2UniBin ( int I, intUniBin iUB ); extern void short2UniBin ( short S, shortUniBin sUB ); extern void long2UniBin ( long L, longUniBin lUB ); extern void word2UniBin ( word W, wordUniBin wUB ); extern void real2UniBin ( realtype R, realUniBin rUB ); extern void float2UniBin ( realtype R, floatUniBin fUB ); extern void shortreal2UniBin ( shortreal R, shortrealUniBin srUB ); extern void UniBin2int ( intUniBin iUB, int & I ); extern void UniBin2short ( shortUniBin sUB, short & S ); extern void UniBin2long ( longUniBin lUB, long & L ); extern void UniBin2word ( wordUniBin wUB, word & W ); extern void UniBin2real ( realUniBin rUB, realtype & R ); extern void UniBin2shortreal ( shortrealUniBin srUB, shortreal & R ); extern void UniBin2float ( floatUniBin fUB, realtype & R ); extern void mem_write ( int I, pstr S, int & l ); extern void mem_write ( short I, pstr S, int & l ); extern void mem_write ( long I, pstr S, int & l ); extern void mem_write ( word W, pstr S, int & l ); extern void mem_write ( realtype R, pstr S, int & l ); extern void mem_write ( shortreal R, pstr S, int & l ); extern void mem_write ( pstr L, int len, pstr S, int & l ); extern void mem_write ( pstr L, pstr S, int & l ); extern void mem_write ( Boolean B, pstr S, int & l ); extern void mem_read ( int & I, cpstr S, int & l ); extern void mem_read ( short & I, cpstr S, int & l ); extern void mem_read ( long & I, cpstr S, int & l ); extern void mem_read ( word & W, cpstr S, int & l ); extern void mem_read ( realtype & R, cpstr S, int & l ); extern void mem_read ( shortreal & R, cpstr S, int & l ); extern void mem_read ( pstr L, int len, cpstr S, int & l ); extern void mem_read ( pstr & L, cpstr S, int & l ); extern void mem_read ( Boolean & B, cpstr S, int & l ); #endif /* =================================================== */ mmdb-1.23.2.1/src/mmdb_chain.cpp0000644000175100017510000020446311475666363013206 00000000000000// ================================================================= // // CCP4 Coordinate Library: support of coordinate-related // functionality in protein crystallography applications. // // Copyright (C) Eugene Krissinel 2000-2008. // // This library is free software: you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License version 3, modified in accordance with the provisions // of the license to address the requirements of UK law. // // You should have received a copy of the modified GNU Lesser // General Public License along with this library. If not, copies // may be downloaded from http://www.ccp4.ac.uk/ccp4license.php // // 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 Lesser General Public License for more details. // // ================================================================= // // 29.01.10 <-- Date of Last Modification. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ----------------------------------------------------------------- // // **** Module : MMDB_Chain // ~~~~~~~~~ // **** Project : MacroMolecular Data Base (MMDB) // ~~~~~~~~~ // **** Classes : CChainContainer ( container for in-chain classes ) // ~~~~~~~~~ CContainerChain ( chain containered class template) // CDBReference ( DBREF records ) // CSeqAdv ( SEQADV records ) // CSeqRes ( SEQRES records ) // CModRes ( MODRES records ) // CHetRec ( HET records ) // CChain ( MMDB chain class ) // // Copyright (C) E. Krissinel 2000-2010 // // ================================================================= // #ifndef __STRING_H #include #endif #ifndef __STDLIB_H #include #endif #ifndef __MMDB_Chain__ #include "mmdb_chain.h" #endif #ifndef __MMDB_Model__ #include "mmdb_model.h" #endif #ifndef __MMDB_File__ #include "mmdb_file.h" #endif #ifndef __MMDB_CIFDefs__ #include "mmdb_cifdefs.h" #endif // ================== CProModel ====================== MakeStreamFunctions(CProModel) // ============== CChainContainer ==================== PCContainerClass CChainContainer::MakeContainerClass ( int ClassID ) { switch (ClassID) { default : case ClassID_Template : return CClassContainer::MakeContainerClass(ClassID); case ClassID_DBReference : return new CDBReference ( Chain ); case ClassID_SeqAdv : return new CSeqAdv ( Chain ); case ClassID_ModRes : return new CModRes ( Chain ); case ClassID_Het : return new CHetRec ( Chain ); } } void CChainContainer::SetChain ( PCChain Chain_Owner ) { int i; Chain = Chain_Owner; for (i=0;iSetChain ( Chain ); } cpstr CChainContainer::Get1stChainID() { int i; i = 0; if (Container) { while ((ichainID; else return NULL; } else return NULL; } void CChainContainer::MoveByChainID ( const ChainID chainID, PCChainContainer ChainContainer ) { int i; for (i=0;ichainID,chainID)) { ChainContainer->AddData ( Container[i] ); Container[i] = NULL; } } } MakeStreamFunctions(CChainContainer) // ================ CContainerChain =================== CContainerChain::CContainerChain () : CContainerClass() { Chain = NULL; chainID[0] = char(0); } CContainerChain::CContainerChain ( PCChain Chain_Owner) : CContainerClass() { Chain = Chain_Owner; if (Chain) strcpy ( chainID,Chain->GetChainID() ); else chainID[0] = char(0); } void CContainerChain::SetChain ( PCChain Chain_Owner ) { Chain = Chain_Owner; if (Chain) strcpy ( chainID,Chain->GetChainID() ); else strcpy ( chainID,"" ); } MakeStreamFunctions(CContainerChain) // ================ CDBReference =================== CDBReference::CDBReference() : CContainerChain() { InitDBReference(); } CDBReference::CDBReference( PCChain Chain_Owner ) : CContainerChain(Chain_Owner) { InitDBReference(); } CDBReference::CDBReference ( PCChain Chain_Owner, cpstr S ) : CContainerChain(Chain_Owner) { InitDBReference(); ConvertPDBASCII ( S ); } CDBReference::CDBReference ( RPCStream Object ) : CContainerChain(Object) { InitDBReference(); } CDBReference::~CDBReference() {} void CDBReference::InitDBReference() { seqBeg = 0; strcpy ( insBeg ,"-" ); seqEnd = 0; strcpy ( insEnd ,"-" ); strcpy ( database ,"------" ); strcpy ( dbAccession,"--------" ); strcpy ( dbIdCode ,"------------" ); dbseqBeg = 0; strcpy ( dbinsBeg,"-" ); dbseqEnd = 0; strcpy ( dbinsEnd,"-" ); } void CDBReference::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB DBREF line number N // from the class' data strcpy ( S,"DBREF" ); PadSpaces ( S,80 ); strcpy_n ( &(S[7]),Chain->GetEntryID(),4 ); if (Chain->chainID[0]) S[12] = Chain->chainID[0]; PutIntIns ( &(S[14]),seqBeg,4,insBeg ); PutIntIns ( &(S[20]),seqEnd,4,insEnd ); strcpy_n ( &(S[26]),database ,6 ); strcpy_n ( &(S[33]),dbAccession,8 ); strcpy_n ( &(S[42]),dbIdCode ,12 ); PutIntIns ( &(S[55]),dbseqBeg,5,dbinsBeg ); PutIntIns ( &(S[62]),dbseqEnd,5,dbinsEnd ); } void CDBReference::MakeCIF ( PCMMCIFData CIF, int N ) { UNUSED_ARGUMENT(N); PCMMCIFLoop Loop1,Loop2; int RC1,RC2; RC1 = CIF->AddLoop ( CIFCAT_STRUCT_REF_SEQ,Loop1 ); RC2 = CIF->AddLoop ( CIFCAT_STRUCT_REF ,Loop2 ); if ((RC1!=CIFRC_Ok) || (RC2!=CIFRC_Ok)) { // the category was (re)created, provide tags Loop1->AddLoopTag ( CIFTAG_NDB_PDB_ID_CODE ); Loop1->AddLoopTag ( CIFTAG_NDB_CHAIN_ID ); Loop1->AddLoopTag ( CIFTAG_SEQ_ALIGN_BEG ); Loop1->AddLoopTag ( CIFTAG_NDB_SEQ_ALIGN_BEG_INS_CODE ); Loop1->AddLoopTag ( CIFTAG_SEQ_ALIGN_END ); Loop1->AddLoopTag ( CIFTAG_NDB_SEQ_ALIGN_END_INS_CODE ); Loop1->AddLoopTag ( CIFTAG_NDB_DB_ACCESSION ); Loop1->AddLoopTag ( CIFTAG_DB_ALIGN_BEG ); Loop1->AddLoopTag ( CIFTAG_NDB_DB_ALIGN_BEG_INS_CODE ); Loop1->AddLoopTag ( CIFTAG_DB_ALIGN_END ); Loop1->AddLoopTag ( CIFTAG_NDB_DB_ALIGN_END_INS_CODE ); Loop2->AddLoopTag ( CIFTAG_DB_NAME ); Loop2->AddLoopTag ( CIFTAG_DB_CODE ); } Loop1->AddString ( Chain->GetEntryID(),True ); Loop1->AddString ( Chain->chainID ,True ); Loop1->AddInteger ( seqBeg ); Loop1->AddString ( insBeg ,True ); Loop1->AddInteger ( seqEnd ); Loop1->AddString ( insEnd ,True ); Loop1->AddString ( dbAccession ,True ); Loop1->AddInteger ( dbseqBeg ); Loop1->AddString ( dbinsBeg ,True ); Loop1->AddInteger ( dbseqEnd ); Loop1->AddString ( dbinsEnd ,True ); Loop2->AddString ( database,True ); Loop2->AddString ( dbIdCode,True ); } void CDBReference::GetCIF ( PCMMCIFData CIF, int & Signal ) { // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). PCMMCIFLoop Loop1,Loop2; PCMMCIFStruct Struct2; pstr F; int RC,CIFMode,ref_id1,ref_id2; Loop1 = CIF->GetLoop ( CIFCAT_STRUCT_REF_SEQ ); if (!Loop1) { Signal = -1; return; } if (Signal>=Loop1->GetLoopLength()) { Signal = -1; return; } // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. CIFMode = CIF_NDB; F = Loop1->GetString ( CIFName(TAG_CHAIN_ID,CIFMode),Signal,RC ); if ((RC) || (!F)) { CIFMode = CIF_PDBX; F = Loop1->GetString ( CIFName(TAG_CHAIN_ID,CIFMode),Signal,RC ); } if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop1->DeleteField ( CIFName(TAG_CHAIN_ID,CIFMode),Signal ); } else strcpy ( chainID,"" ); if (CIFGetInteger(seqBeg,Loop1,CIFName(TAG_SEQ_ALIGN_BEG,CIFMode), Signal)) return; CIFGetString ( insBeg,Loop1,CIFName(TAG_SEQ_ALIGN_BEG_INS_CODE,CIFMode), Signal,sizeof(InsCode),pstr(" ") ); if (CIFGetInteger(seqEnd,Loop1,CIFName(TAG_SEQ_ALIGN_END,CIFMode), Signal)) return; CIFGetString ( insEnd,Loop1,CIFName(TAG_SEQ_ALIGN_END_INS_CODE,CIFMode), Signal,sizeof(InsCode),pstr(" ") ); CIFGetString ( dbAccession,Loop1,CIFName(TAG_DB_ACCESSION,CIFMode), Signal,sizeof(DBAcCode),pstr(" ") ); if (CIFGetInteger(dbseqBeg,Loop1,CIFName(TAG_DB_ALIGN_BEG,CIFMode), Signal)) return; CIFGetString ( dbinsBeg,Loop1,CIFName(TAG_DB_ALIGN_BEG_INS_CODE,CIFMode), Signal,sizeof(InsCode),pstr(" ") ); if (CIFGetInteger(dbseqEnd,Loop1,CIFName(TAG_DB_ALIGN_END,CIFMode), Signal)) return; CIFGetString ( dbinsEnd,Loop1,CIFName(TAG_DB_ALIGN_END_INS_CODE,CIFMode), Signal,sizeof(InsCode),pstr(" ") ); Loop2 = CIF->GetLoop ( CIFCAT_STRUCT_REF ); if (Loop2) { CIFGetString ( database,Loop2,CIFTAG_DB_NAME,Signal, sizeof(DBName) ,pstr(" ") ); CIFGetString ( dbIdCode,Loop2,CIFTAG_DB_CODE,Signal, sizeof(DBIdCode),pstr(" ") ); } else if (CIFMode==CIF_PDBX) { Struct2 = CIF->GetStructure ( CIFCAT_STRUCT_REF ); if (Struct2 && (!CIFGetInteger(ref_id1,Loop1,CIFTAG_REF_ID,Signal)) && (!CIFGetInteger(ref_id2,Struct2,CIFTAG_ID,False))) { if (ref_id1==ref_id2) { CIFGetString ( database,Struct2,CIFTAG_DB_NAME, sizeof(DBName) ,pstr(" ") ,False ); CIFGetString ( dbIdCode,Struct2,CIFTAG_DB_CODE, sizeof(DBIdCode),pstr(" "),False ); } } } Signal++; } int CDBReference::ConvertPDBASCII ( cpstr S ) { IDCode idCode; if (Chain->chainID[0]) { if (S[12]!=Chain->chainID[0]) return Error_WrongChainID; } else if (S[12]!=' ') { Chain->chainID[0] = S[12]; Chain->chainID[1] = char(0); } else Chain->chainID[0] = char(0); strcpy ( idCode,Chain->GetEntryID() ); if (idCode[0]) { if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) return Error_WrongEntryID; } else { GetString ( idCode,&(S[7]),4 ); Chain->SetEntryID ( idCode ); } GetIntIns ( seqBeg,insBeg,&(S[14]),4 ); GetIntIns ( seqEnd,insEnd,&(S[20]),4 ); strcpy_ncs ( database ,&(S[26]),6 ); strcpy_ncs ( dbAccession ,&(S[33]),8 ); strcpy_ncs ( dbIdCode ,&(S[42]),12 ); GetIntIns ( dbseqBeg,dbinsBeg,&(S[55]),5 ); GetIntIns ( dbseqEnd,dbinsEnd,&(S[62]),5 ); return 0; } void CDBReference::Copy ( PCContainerClass DBRef ) { CContainerChain::Copy ( DBRef ); seqBeg = PCDBReference(DBRef)->seqBeg; seqEnd = PCDBReference(DBRef)->seqEnd; dbseqBeg = PCDBReference(DBRef)->dbseqBeg; dbseqEnd = PCDBReference(DBRef)->dbseqEnd; strcpy ( insBeg ,PCDBReference(DBRef)->insBeg ); strcpy ( insEnd ,PCDBReference(DBRef)->insEnd ); strcpy ( database ,PCDBReference(DBRef)->database ); strcpy ( dbAccession,PCDBReference(DBRef)->dbAccession ); strcpy ( dbIdCode ,PCDBReference(DBRef)->dbIdCode ); strcpy ( dbinsBeg ,PCDBReference(DBRef)->dbinsBeg ); strcpy ( dbinsEnd ,PCDBReference(DBRef)->dbinsEnd ); } void CDBReference::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqBeg ); f.WriteInt ( &seqEnd ); f.WriteInt ( &dbseqBeg ); f.WriteInt ( &dbseqEnd ); f.WriteTerLine ( insBeg ,False ); f.WriteTerLine ( insEnd ,False ); f.WriteTerLine ( database ,False ); f.WriteTerLine ( dbAccession,False ); f.WriteTerLine ( dbIdCode ,False ); f.WriteTerLine ( dbinsBeg ,False ); f.WriteTerLine ( dbinsEnd ,False ); } void CDBReference::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqBeg ); f.ReadInt ( &seqEnd ); f.ReadInt ( &dbseqBeg ); f.ReadInt ( &dbseqEnd ); f.ReadTerLine ( insBeg ,False ); f.ReadTerLine ( insEnd ,False ); f.ReadTerLine ( database ,False ); f.ReadTerLine ( dbAccession,False ); f.ReadTerLine ( dbIdCode ,False ); f.ReadTerLine ( dbinsBeg ,False ); f.ReadTerLine ( dbinsEnd ,False ); } MakeStreamFunctions(CDBReference) // ================ CSeqAdv =================== CSeqAdv::CSeqAdv() : CContainerChain() { InitSeqAdv(); } CSeqAdv::CSeqAdv ( PCChain Chain_Owner ) : CContainerChain(Chain_Owner) { InitSeqAdv(); } CSeqAdv::CSeqAdv ( PCChain Chain_Owner, cpstr S ) : CContainerChain(Chain_Owner) { InitSeqAdv(); ConvertPDBASCII ( S ); } CSeqAdv::CSeqAdv ( RPCStream Object ) : CContainerChain(Object) { InitSeqAdv(); } CSeqAdv::~CSeqAdv() { if (conflict) delete[] conflict; } void CSeqAdv::InitSeqAdv() { strcpy ( resName ,"---" ); seqNum = 0; strcpy ( insCode ,"-" ); strcpy ( database ,"------" ); strcpy ( dbAccession,"---------" ); strcpy ( dbRes ,"---" ); dbSeq = 0; conflict = NULL; CreateCopy ( conflict,pstr(" ") ); } void CSeqAdv::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB SEQADV line number N // from the class' data strcpy ( S,"SEQADV" ); PadSpaces ( S,80 ); strcpy_n ( &(S[7]) ,Chain->GetEntryID(),4 ); strcpy_n ( &(S[12]),resName ,3 ); if (Chain->chainID[0]) S[16] = Chain->chainID[0]; PutIntIns ( &(S[18]),seqNum,4,insCode ); strcpy_n ( &(S[24]),database ,4 ); strcpy_n ( &(S[29]),dbAccession,9 ); strcpy_n ( &(S[39]),dbRes ,3 ); PutInteger ( &(S[43]),dbSeq ,5 ); strcpy_n ( &(S[49]),conflict,IMin(strlen(conflict),21) ); } int CSeqAdv::ConvertPDBASCII ( cpstr S ) { IDCode idCode; if (Chain->chainID[0]) { if (S[16]!=Chain->chainID[0]) return Error_WrongChainID; } else if (S[16]!=' ') { Chain->chainID[0] = S[16]; Chain->chainID[1] = char(0); } else Chain->chainID[0] = char(0); strcpy ( idCode,Chain->GetEntryID() ); if (idCode[0]) { if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) return Error_WrongEntryID; } else { GetString ( idCode,&(S[7]),4 ); Chain->SetEntryID ( idCode ); } strcpy_ncs ( resName ,&(S[12]),3 ); GetIntIns ( seqNum,insCode,&(S[18]),4 ); strcpy_ncs ( database ,&(S[24]),4 ); strcpy_ncs ( dbAccession ,&(S[29]),9 ); strcpy_ncs ( dbRes ,&(S[39]),3 ); GetInteger ( dbSeq,&(S[43]),5 ); CreateCopy ( conflict,&(S[49]) ); CutSpaces ( conflict,SCUTKEY_END ); return 0; } void CSeqAdv::MakeCIF ( PCMMCIFData CIF, int N ) { UNUSED_ARGUMENT(N); PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_REF_SEQ_DIF,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_NDB_PDB_ID_CODE ); Loop->AddLoopTag ( CIFTAG_MON_ID ); Loop->AddLoopTag ( CIFTAG_NDB_PDB_CHAIN_ID ); Loop->AddLoopTag ( CIFTAG_SEQ_NUM ); Loop->AddLoopTag ( CIFTAG_NDB_PDB_INS_CODE ); Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_NAME ); Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_ACCESSION_CODE ); Loop->AddLoopTag ( CIFTAG_DB_MON_ID ); Loop->AddLoopTag ( CIFTAG_NDB_SEQ_DB_SEQ_NUM ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddString ( Chain->GetEntryID(),True ); Loop->AddString ( resName ,True ); Loop->AddString ( Chain->chainID ,True ); Loop->AddInteger ( seqNum ); Loop->AddString ( insCode ,True ); Loop->AddString ( database ,True ); Loop->AddString ( dbAccession ,True ); Loop->AddString ( dbRes ,True ); Loop->AddInteger ( dbSeq ); Loop->AddString ( conflict ,True ); } void CSeqAdv::GetCIF ( PCMMCIFData CIF, int & Signal ) { // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). PCMMCIFLoop Loop; pstr F; int RC; Loop = CIF->GetLoop ( CIFCAT_STRUCT_REF_SEQ_DIF ); if (!Loop) { Signal = -1; return; } if (Signal>=Loop->GetLoopLength()) { Signal = -1; return; } // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. F = Loop->GetString ( CIFTAG_NDB_PDB_CHAIN_ID,Signal,RC ); if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop->DeleteField ( CIFTAG_NDB_PDB_CHAIN_ID,Signal ); } else strcpy ( chainID,"" ); CIFGetString ( resName,Loop,CIFTAG_MON_ID,Signal,sizeof(ResName), pstr("UNK") ); if (CIFGetInteger(seqNum,Loop,CIFTAG_SEQ_NUM,Signal)) return; CIFGetString ( insCode,Loop,CIFTAG_NDB_PDB_INS_CODE, Signal,sizeof(InsCode),pstr(" ") ); CIFGetString ( database,Loop,CIFTAG_NDB_SEQ_DB_NAME,Signal, sizeof(DBName),pstr(" ") ); CIFGetString ( dbAccession,Loop,CIFTAG_NDB_SEQ_DB_ACCESSION_CODE, Signal,sizeof(DBAcCode),pstr(" ") ); CIFGetString ( dbRes,Loop,CIFTAG_DB_MON_ID,Signal,sizeof(ResName), pstr(" ") ); if (CIFGetInteger1(dbSeq,Loop,CIFTAG_NDB_SEQ_DB_SEQ_NUM,Signal)) dbSeq = MinInt4; F = Loop->GetString ( CIFTAG_DETAILS,Signal,RC ); if ((!RC) && F) { CreateCopy ( conflict,F ); Loop->DeleteField ( CIFTAG_DETAILS,Signal ); } else CreateCopy ( conflict,pstr(" ") ); Signal++; } void CSeqAdv::Copy ( PCContainerClass SeqAdv ) { CContainerClass::Copy ( SeqAdv ); seqNum = PCSeqAdv(SeqAdv)->seqNum; dbSeq = PCSeqAdv(SeqAdv)->dbSeq; strcpy ( resName ,PCSeqAdv(SeqAdv)->resName ); strcpy ( insCode ,PCSeqAdv(SeqAdv)->insCode ); strcpy ( database ,PCSeqAdv(SeqAdv)->database ); strcpy ( dbAccession,PCSeqAdv(SeqAdv)->dbAccession ); strcpy ( dbRes ,PCSeqAdv(SeqAdv)->dbRes ); CreateCopy ( conflict,PCSeqAdv(SeqAdv)->conflict ); } void CSeqAdv::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqNum ); f.WriteInt ( &dbSeq ); f.WriteTerLine ( resName ,False ); f.WriteTerLine ( insCode ,False ); f.WriteTerLine ( database ,False ); f.WriteTerLine ( dbAccession,False ); f.WriteTerLine ( dbRes ,False ); f.CreateWrite ( conflict ); } void CSeqAdv::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqNum ); f.ReadInt ( &dbSeq ); f.ReadTerLine ( resName ,False ); f.ReadTerLine ( insCode ,False ); f.ReadTerLine ( database ,False ); f.ReadTerLine ( dbAccession,False ); f.ReadTerLine ( dbRes ,False ); f.CreateRead ( conflict ); } MakeStreamFunctions(CSeqAdv) // ================ CSeqRes =================== CSeqRes::CSeqRes() : CStream() { InitSeqRes(); } CSeqRes::CSeqRes ( RPCStream Object ) : CStream(Object) { InitSeqRes(); } CSeqRes::~CSeqRes() { FreeMemory(); } void CSeqRes::SetChain ( PCChain Chain_Owner ) { Chain = Chain_Owner; if (Chain) strcpy ( chainID,Chain->chainID ); else strcpy ( chainID,"" ); } void CSeqRes::InitSeqRes() { Chain = NULL; numRes = -1; resName = NULL; serNum = 0; strcpy ( chainID,"" ); } void CSeqRes::FreeMemory() { if (resName) delete[] resName; resName = NULL; numRes = -1; serNum = 0; } void CSeqRes::PDBASCIIDump ( RCFile f ) { // writes the ASCII PDB SEQRES lines into file f char S[100]; int i,k,sN; if (numRes<0) return; strcpy ( S,"SEQRES" ); PadSpaces ( S,80 ); if (Chain->chainID[0]) S[11] = Chain->chainID[0]; PutInteger ( &(S[13]),numRes,4 ); if (resName) { i = 0; sN = 1; while (ichainID[0]) { if (S[11]!=Chain->chainID[0]) return Error_WrongChainID; } else if (S[11]!=' ') { Chain->chainID[0] = S[11]; Chain->chainID[1] = char(0); } else Chain->chainID[0] = char(0); GetInteger ( sN,&(S[8]) ,2 ); GetInteger ( nR,&(S[13]),4 ); if (sN==0) { FreeMemory(); numRes = nR; } else { serNum++; if (sN!=serNum) return Error_SEQRES_serNum; if (sN==1) { FreeMemory(); resName = new ResName[nR]; for (i=0;i=nR) return Error_SEQRES_extraRes; k = 19; while ((iAddLoop ( CIFCAT_NDB_POLY_SEQ_SCHEME,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_MON_ID ); } if (resName) for (i=0;iAddString ( Chain->chainID,True ); Loop->AddString ( resName[i] ,True ); } else for (i=0;iAddString ( Chain->GetEntryID(),True ); Loop->AddString ( pstr("UNK") ,True ); } } int CSeqRes::GetCIF ( PCMMCIFData CIF ) { // Tries to get sequence from the CIF structure. A sequence // for first met chain is extracted and then removed from // the CIF structure, so that sequential calls will extract // all sequencies. Chain ID is stored locally in chainID; // reference to parent chain is neither used nor checked. // Returns 0 if sequence was extracted and 1 otherwise. PCMMCIFLoop Loop; ResName * rN; ChainID chID; pstr F,CHAIN_ID; int RC,CIFMode,i,l; Boolean isMon; FreeMemory(); CIFMode = CIF_NDB; Loop = CIF->GetLoop ( CIFName(CAT_POLY_SEQ_SCHEME,CIFMode) ); if (!Loop) { CIFMode = CIF_PDBX; Loop = CIF->GetLoop ( CIFName(CAT_POLY_SEQ_SCHEME,CIFMode) ); if (!Loop) return 1; } l = Loop->GetLoopLength(); if (l<=0) return 1; rN = new ResName[l]; chainID[0] = char(1); numRes = 0; isMon = False; CHAIN_ID = CIFName(TAG_SEQ_CHAIN_ID,CIFMode); for (i=0;iGetString ( CHAIN_ID,i,RC ); if (!RC) { if (F) strcpy ( chID,F ); else chID[0] = char(0); if (chainID[0]==char(1)) strcpy ( chainID,chID ); if (!strcmp(chainID,chID)) { CIFGetString ( rN[numRes],Loop,CIFTAG_MON_ID,i, sizeof(ResName),pstr("UNK") ); Loop->DeleteField ( CHAIN_ID,i ); if (strcmp(rN[numRes],"UNK")) isMon = True; numRes++; } } } if (numRes==0) { numRes = -1; delete[] rN; return 1; } if (isMon) { resName = new ResName[numRes]; for (i=0;inumRes; serNum = SeqRes->serNum; if (SeqRes->resName) { resName = new ResName[numRes]; for (i=0;iresName[i] ); } } void CSeqRes::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &numRes ); f.WriteInt ( &serNum ); if (resName) i = 1; else i = 0; f.WriteInt ( &i ); if (resName) for (i=0;iGetEntryID(),4 ); strcpy_n ( &(S[12]),resName ,3 ); if (Chain->chainID[0]) S[16] = Chain->chainID[0]; PutIntIns ( &(S[18]),seqNum,4,insCode ); strcpy_n ( &(S[24]),stdRes ,3 ); strcpy_n ( &(S[29]),comment,IMin(strlen(comment),41) ); } int CModRes::ConvertPDBASCII ( cpstr S ) { IDCode idCode; if (Chain->chainID[0]) { if (S[16]!=Chain->chainID[0]) return Error_WrongChainID; } else if (S[16]!=' ') { Chain->chainID[0] = S[16]; Chain->chainID[1] = char(0); } else Chain->chainID[0] = char(0); strcpy ( idCode,Chain->GetEntryID() ); if (idCode[0]) { if (strncmp(&(S[7]),idCode,4) && (!ignoreNonCoorPDBErrors)) return Error_WrongEntryID; } else { GetString ( idCode,&(S[7]),4 ); Chain->SetEntryID ( idCode ); } GetString ( resName ,&(S[12]),3 ); GetIntIns ( seqNum,insCode,&(S[18]),4 ); GetString ( stdRes ,&(S[24]),3 ); CreateCopy ( comment ,&(S[29]) ); CutSpaces ( comment,SCUTKEY_END ); return 0; } void CModRes::MakeCIF ( PCMMCIFData CIF, int N ) { UNUSED_ARGUMENT(CIF); UNUSED_ARGUMENT(N); /* -- apparently wrong use of _struct_conn, to be revised PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_STRUCT_CONN,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_CONN_TYPE_ID ); Loop->AddLoopTag ( CIFTAG_NDB_PDB_ID ); Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_COMP_ID ); Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_PTNR1_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_NDB_PTNR1_LABEL_INS_CODE ); Loop->AddLoopTag ( CIFTAG_NDB_PTNR1_STANDARD_COMP_ID ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddString ( pstr("MODRES") ); Loop->AddString ( Chain->GetEntryID(),True ); Loop->AddString ( resName ,True ); Loop->AddString ( Chain->chainID ,True ); Loop->AddInteger ( seqNum ); Loop->AddString ( insCode ,True ); Loop->AddString ( stdRes ,True ); Loop->AddString ( comment ,True ); */ } void CModRes::GetCIF ( PCMMCIFData CIF, int & Signal ) { UNUSED_ARGUMENT(CIF); // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). /* -- apparently wrong use of _struct_conn, to be revised PCMMCIFLoop Loop; pstr F; int l,RC; Loop = CIF->GetLoop ( CIFCAT_STRUCT_CONN ); if (!Loop) { Signal = -1; return; } l = Loop->GetLoopLength(); while (SignalGetString ( CIFTAG_CONN_TYPE_ID,Signal,RC ); if ((!RC) && F) { if (!strcmp(F,"MODRES")) break; } Signal++; } if (Signal>=l) { Signal = -1; return; } Loop->DeleteField ( CIFTAG_CONN_TYPE_ID,Signal ); // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. F = Loop->GetString ( CIFTAG_PTNR1_LABEL_ASYM_ID,Signal,RC ); if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop->DeleteField ( CIFTAG_PTNR1_LABEL_ASYM_ID,Signal ); } else strcpy ( chainID,"" ); CIFGetString ( resName,Loop,CIFTAG_PTNR1_LABEL_COMP_ID,Signal, sizeof(ResName),pstr("UNK") ); if (CIFGetInteger(seqNum,Loop,CIFTAG_PTNR1_LABEL_SEQ_ID,Signal)) return; CIFGetString ( insCode,Loop,CIFTAG_NDB_PTNR1_LABEL_INS_CODE, Signal,sizeof(InsCode),pstr(" ") ); CIFGetString ( stdRes,Loop,CIFTAG_NDB_PTNR1_STANDARD_COMP_ID,Signal, sizeof(ResName),pstr("UNK") ); F = Loop->GetString ( CIFTAG_DETAILS,Signal,RC ); if ((!RC) && F) { CreateCopy ( comment,F ); Loop->DeleteField ( CIFTAG_DETAILS,Signal ); } else CreateCopy ( comment,pstr(" ") ); Signal++; */ Signal = -1; } void CModRes::Copy ( PCContainerClass ModRes ) { seqNum = PCModRes(ModRes)->seqNum; strcpy ( resName,PCModRes(ModRes)->resName ); strcpy ( insCode,PCModRes(ModRes)->insCode ); strcpy ( stdRes ,PCModRes(ModRes)->stdRes ); CreateCopy ( comment,PCModRes(ModRes)->comment ); } void CModRes::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqNum ); f.WriteTerLine ( resName,False ); f.WriteTerLine ( insCode,False ); f.WriteTerLine ( stdRes ,False ); f.CreateWrite ( comment ); } void CModRes::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqNum ); f.ReadTerLine ( resName,False ); f.ReadTerLine ( insCode,False ); f.ReadTerLine ( stdRes ,False ); f.CreateRead ( comment ); } MakeStreamFunctions(CModRes) // ================ CHetRec ====================== CHetRec::CHetRec() : CContainerChain() { InitHetRec(); } CHetRec::CHetRec ( PCChain Chain_Owner ) : CContainerChain(Chain_Owner) { InitHetRec(); } CHetRec::CHetRec ( PCChain Chain_Owner, cpstr S ) : CContainerChain(Chain_Owner) { InitHetRec(); ConvertPDBASCII ( S ); } CHetRec::CHetRec ( RPCStream Object ) : CContainerChain(Object) { InitHetRec(); } CHetRec::~CHetRec() { if (comment) delete[] comment; } void CHetRec::InitHetRec() { strcpy ( hetID ,"---" ); strcpy ( insCode,"-" ); seqNum = 0; numHetAtoms = 0; comment = NULL; CreateCopy ( comment,pstr(" ") ); } void CHetRec::PDBASCIIDump ( pstr S, int N ) { UNUSED_ARGUMENT(N); // makes the ASCII PDB MODRES line number N // from the class' data strcpy ( S,"HET" ); PadSpaces ( S,80 ); strcpy_n ( &(S[7]) ,hetID,3 ); if (Chain->chainID[0]) S[12] = Chain->chainID[0]; PutIntIns ( &(S[13]),seqNum,4,insCode ); PutInteger ( &(S[20]),numHetAtoms,5 ); strcpy_n ( &(S[30]),comment,IMin(strlen(comment),40) ); } int CHetRec::ConvertPDBASCII ( cpstr S ) { if (Chain->chainID[0]) { if (S[12]!=Chain->chainID[0]) return Error_WrongChainID; } else if (S[12]!=' ') { Chain->chainID[0] = S[12]; Chain->chainID[1] = char(0); } else Chain->chainID[0] = char(0); GetString ( hetID ,&(S[7]) ,3 ); GetIntIns ( seqNum,insCode,&(S[13]),4 ); GetInteger ( numHetAtoms ,&(S[20]),5 ); CreateCopy ( comment ,&(S[30]) ); CutSpaces ( comment,SCUTKEY_END ); return 0; } void CHetRec::MakeCIF ( PCMMCIFData CIF, int N ) { UNUSED_ARGUMENT(N); PCMMCIFLoop Loop; int RC; RC = CIF->AddLoop ( CIFCAT_NDB_NONSTANDARD_LIST,Loop ); if (RC!=CIFRC_Ok) { // the category was (re)created, provide tags Loop->AddLoopTag ( CIFTAG_ID ); Loop->AddLoopTag ( CIFTAG_LABEL_ASYM_ID ); Loop->AddLoopTag ( CIFTAG_LABEL_SEQ_ID ); Loop->AddLoopTag ( CIFTAG_INS_CODE ); Loop->AddLoopTag ( CIFTAG_NUMBER_ATOMS_NH ); Loop->AddLoopTag ( CIFTAG_DETAILS ); } Loop->AddString ( hetID ,True ); Loop->AddString ( Chain->chainID,True ); Loop->AddInteger ( seqNum ); Loop->AddString ( insCode ,True ); Loop->AddInteger ( numHetAtoms ); Loop->AddString ( comment ,True ); } void CHetRec::GetCIF ( PCMMCIFData CIF, int & Signal ) { // GetCIF(..) must be always run without reference to Chain, // see CModel::GetCIF(..). PCMMCIFLoop Loop; pstr F; int RC; Loop = CIF->GetLoop ( CIFCAT_NDB_NONSTANDARD_LIST ); if (!Loop) { Signal = -1; return; } if (Signal>=Loop->GetLoopLength()) { Signal = -1; return; } // Determine the ChainID first and store it locally. It will // be used by CModel for generating chains and placing the // primary structure data BEFORE reading the coordinate section. F = Loop->GetString ( CIFTAG_LABEL_ASYM_ID,Signal,RC ); if ((!RC) && F) { strcpy_n0 ( chainID,F,sizeof(ChainID)-1 ); Loop->DeleteField ( CIFTAG_LABEL_ASYM_ID,Signal ); } else strcpy ( chainID,"" ); CIFGetString ( hetID,Loop,CIFTAG_ID,Signal,sizeof(ResName), pstr("UNK") ); if (CIFGetInteger(seqNum,Loop,CIFTAG_LABEL_SEQ_ID,Signal)) return; CIFGetString ( insCode,Loop,CIFTAG_INS_CODE,Signal,sizeof(InsCode), pstr(" ") ); if (CIFGetInteger(numHetAtoms,Loop,CIFTAG_NUMBER_ATOMS_NH,Signal)) return; F = Loop->GetString ( CIFTAG_DETAILS,Signal,RC ); if ((!RC) && F) { CreateCopy ( comment,F ); Loop->DeleteField ( CIFTAG_DETAILS,Signal ); } else CreateCopy ( comment,pstr(" ") ); Signal++; } void CHetRec::Copy ( PCContainerClass Het ) { seqNum = PCHetRec(Het)->seqNum; numHetAtoms = PCHetRec(Het)->numHetAtoms; strcpy ( hetID ,PCHetRec(Het)->hetID ); strcpy ( insCode,PCHetRec(Het)->insCode ); CreateCopy ( comment,PCHetRec(Het)->comment ); } void CHetRec::write ( RCFile f ) { byte Version=1; f.WriteByte ( &Version ); f.WriteInt ( &seqNum ); f.WriteInt ( &numHetAtoms ); f.WriteTerLine ( hetID ,False ); f.WriteTerLine ( insCode,False ); f.CreateWrite ( comment ); } void CHetRec::read ( RCFile f ) { byte Version; f.ReadByte ( &Version ); f.ReadInt ( &seqNum ); f.ReadInt ( &numHetAtoms ); f.ReadTerLine ( hetID ,False ); f.ReadTerLine ( insCode,False ); f.CreateRead ( comment ); } MakeStreamFunctions(CHetRec) // ===================== CChain ======================= CChain::CChain() : CUDData() { InitChain(); SetChain ( pstr("") ); } CChain::CChain ( PCProModel Model, const ChainID chID ) : CUDData() { InitChain(); SetChain ( chID ); if (Model) Model->AddChain ( this ); } CChain::CChain ( RPCStream Object ) : CUDData(Object) { InitChain(); SetChain ( pstr("") ); } void CChain::InitChain() { nResidues = 0; ResLen = 0; Residue = NULL; model = NULL; chainID[0] = char(0); prevChainID[0] = char(0); nWeights = 0; Weight = 0.0; Exclude = True; } void CChain::SetChain ( const ChainID chID ) { strcpy ( chainID,chID ); if (chID[0]==' ') chainID[0] = char(0); DBReference.SetChain ( this ); SeqAdv .SetChain ( this ); SeqRes .SetChain ( this ); ModRes .SetChain ( this ); Het .SetChain ( this ); } void CChain::SetChainID ( const ChainID chID ) { strcpy ( chainID,chID ); if (chID[0]==' ') chainID[0] = char(0); } CChain::~CChain() { FreeMemory(); if (model) model->_ExcludeChain ( chainID ); } void CChain::FreeMemory() { DeleteAllResidues(); if (Residue) delete[] Residue; ResLen = 0; nResidues = 0; Residue = NULL; FreeAnnotations(); } void CChain::FreeAnnotations() { DBReference.FreeContainer(); SeqAdv .FreeContainer(); SeqRes .FreeMemory (); ModRes .FreeContainer(); Het .FreeContainer(); } void CChain::SetModel ( PCProModel Model ) { model = Model; } PCMMDBManager CChain::GetCoordHierarchy() { if (model) return model->GetCoordHierarchy(); return NULL; } void CChain::CheckInAtoms() { int i; if (GetCoordHierarchy()) for (i=0;iCheckInAtoms(); } int CChain::ConvertDBREF ( cpstr PDBString ) { int RC; PCContainerChain ContainerChain; ContainerChain = new CDBReference(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } DBReference.AddData ( ContainerChain ); return 0; } int CChain::ConvertSEQADV ( cpstr PDBString ) { int RC; PCContainerChain ContainerChain; ContainerChain = new CSeqAdv(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } SeqAdv.AddData ( ContainerChain ); return 0; } int CChain::ConvertSEQRES ( cpstr PDBString ) { return SeqRes.ConvertPDBASCII ( PDBString ); } int CChain::ConvertMODRES ( cpstr PDBString ) { int RC; PCContainerChain ContainerChain; ContainerChain = new CModRes(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } ModRes.AddData ( ContainerChain ); return 0; } int CChain::ConvertHET ( cpstr PDBString ) { int RC; PCContainerChain ContainerChain; ContainerChain = new CHetRec(this); RC = ContainerChain->ConvertPDBASCII ( PDBString ); if (RC) { delete ContainerChain; return RC; } Het.AddData ( ContainerChain ); return 0; } void CChain::PDBASCIIDump ( RCFile f ) { // this function was for test purposes and is not used // for normal function of MMDB DBReference.PDBASCIIDump ( f ); SeqAdv .PDBASCIIDump ( f ); SeqRes .PDBASCIIDump ( f ); ModRes .PDBASCIIDump ( f ); Het .PDBASCIIDump ( f ); } void CChain::PDBASCIIAtomDump ( RCFile f ) { int i; for (i=0;iPDBASCIIAtomDump ( f ); } void CChain::MakeAtomCIF ( PCMMCIFData CIF ) { int i; for (i=0;iMakeAtomCIF ( CIF ); } int CChain::GetNumberOfResidues() { return nResidues; } PCResidue CChain::GetResidue ( int resNo ) { if ((0<=resNo) && (resNoseqNum) && (!strcmp(insCode,Residue[i]->insCode))) { if (!strcmp(resName,Residue[i]->name)) return Residue[i]; // it is there; just return the pointer else if (!Enforce) return NULL; // duplicate seqNum and insCode! } } } else { for (i=0;iseqNum) && (!Residue[i]->insCode[0])) { if (!strcmp(resName,Residue[i]->name)) return Residue[i]; // it is there; just return the pointer else if (!Enforce) return NULL; // duplicate seqNum and insCode! } } } // expand the residue array, if necessary if (nResidues>=ResLen) ExpandResidueArray ( 100 ); // create new residue Residue[nResidues] = newCResidue(); Residue[nResidues]->SetChain ( this ); Residue[nResidues]->SetResID ( resName,seqNum,insCode ); Residue[nResidues]->index = nResidues; nResidues++; return Residue[nResidues-1]; } void CChain::ExpandResidueArray ( int inc ) { PPCResidue Residue1; int i; ResLen += inc; Residue1 = new PCResidue[ResLen]; for (i=0;iseqNum) && (!strcmp(insCode,Residue[i]->insCode))) return Residue[i]; } } else { for (i=0;iseqNum) && (!Residue[i]->insCode[0])) return Residue[i]; } } return NULL; } int CChain::GetResidueNo ( int seqNum, const InsCode insCode ) { // GetResidueNo(..) returns the residue number in the chain's // residues table. Residues are numbered as 0..nres-1 as they appear // in the coordinate file. // If residue is not found, the function returns -1. int i; Boolean isInsCode; if (insCode) isInsCode = insCode[0]!=char(0); else isInsCode = False; if (isInsCode) { for (i=0;iseqNum) && (!strcmp(insCode,Residue[i]->insCode))) return i; } } else { for (i=0;iseqNum) && (!Residue[i]->insCode[0])) return i; } } return -1; } void CChain::GetResidueTable ( PPCResidue & resTable, int & NumberOfResidues ) { resTable = Residue; NumberOfResidues = nResidues; } int CChain::_ExcludeResidue ( const ResName resName, int seqNum, const InsCode insCode ) { // ExcludeResidue(..) excludes (but does not dispose!) a residue // from the chain. Returns 1 if the chain gets empty and 0 otherwise. int i,k; if (!Exclude) return 0; // find the residue k = -1; for (i=0;(iseqNum) && (!strcmp(insCode,Residue[i]->insCode)) && (!strcmp(resName,Residue[i]->name))) k = i; if (k>=0) { for (i=k+1;iindex = i-1; } nResidues--; Residue[nResidues] = NULL; } if (nResidues<=0) return 1; else return 0; } // ------------------ Deleting residues -------------------------- int CChain::DeleteResidue ( int resNo ) { if ((0<=resNo) && (resNoseqNum) && (!strcmp(insCode,Residue[i]->insCode))) { Exclude = False; delete Residue[i]; Residue[i] = NULL; Exclude = True; return 1; } } } else { for (i=0;iseqNum) && (!Residue[i]->insCode[0])) { Exclude = False; delete Residue[i]; Residue[i] = NULL; Exclude = True; return 1; } } } return 0; } int CChain::DeleteAllResidues() { int i,k; Exclude = False; k = 0; for (i=0;iisSolvent()) { delete Residue[i]; Residue[i] = NULL; k++; } } Exclude = True; return k; } void CChain::TrimResidueTable() { int i,j; Exclude = False; j = 0; for (i=0;inAtoms>0) { if (jindex = j; Residue[i] = NULL; } j++; } else { delete Residue[i]; Residue[i] = NULL; } } nResidues = j; Exclude = True; } int CChain::AddResidue ( PCResidue res ) { // modify both CModel::Copy methods simultaneously! // // Copy(PCModel,PPCAtom,int&) copies atoms into array 'atom' // starting from position atom_index. 'atom' should be able to // accept all new atoms - no checks on the length of 'atom' // is being made. This function should not be used in applications. return InsResidue ( res,nResidues ); } /* PCMMDBFile mmdbfile; PCChain chain1; int i; for (i=0;i=ResLen) ExpandResidueArray ( 100 ); if (res->GetCoordHierarchy()) { Residue[nResidues] = newCResidue(); Residue[nResidues]->SetChain ( this ); Residue[nResidues]->SetResID ( res->name,res->seqNum,res->insCode ); if (mmdbfile) { // get space for new atoms mmdbfile->AddAtomArray ( res->GetNumberOfAtoms(True) ); Residue[nResidues]->Copy ( res,mmdbfile->Atom,mmdbfile->nAtoms ); } else { for (i=0;inAtoms;i++) Residue[nResidues]->AddAtom ( res->atom[i] ); } } else { Residue[nResidues] = res; chain1 = res->GetChain(); if (chain1) for (i=0;inResidues;i++) if (chain1->Residue[i]==res) { chain1->Residue[i] = NULL; break; } Residue[nResidues]->SetChain ( this ); if (mmdbfile) Residue[nResidues]->CheckInAtoms(); } nResidues++; } return nResidues; } */ int CChain::InsResidue ( PCResidue res, int seqNum, const InsCode insCode ) { return InsResidue ( res,GetResidueNo(seqNum,insCode) ); } int CChain::InsResidue ( PCResidue res, int pos ) { // Inserts residue res onto position pos of the chain, // pos=0..nResidues-1 . Residues pos..nResidues-1 are // shifted up the chain. // The function places new atoms on the top of atom // index. It is advisable to call // CMMDBFile::PDBCleanup ( PDBCLEAN_INDEX ) after all // insertions are done. PCMMDBFile mmdbfile; PCChain chain1; int i,pp; pp = IMax ( 0,IMin(nResidues,pos) ); for (i=0;i=ResLen) ExpandResidueArray ( 100 ); // shift residues to the end of the chain as necessary for (i=nResidues;i>pp;i--) Residue[i] = Residue[i-1]; // insert the new residue if (res->GetCoordHierarchy()) { Residue[pp] = newCResidue(); Residue[pp]->SetChain ( this ); Residue[pp]->SetResID ( res->name,res->seqNum,res->insCode ); if (mmdbfile) { // get space for new atoms mmdbfile->AddAtomArray ( res->GetNumberOfAtoms(True) ); Residue[pp]->_copy ( res,mmdbfile->Atom,mmdbfile->nAtoms ); } else { for (i=0;inAtoms;i++) Residue[pp]->AddAtom ( res->atom[i] ); } } else { Residue[pp] = res; chain1 = res->GetChain(); if (chain1) for (i=0;inResidues;i++) if (chain1->Residue[i]==res) { chain1->Residue[i] = NULL; break; } Residue[pp]->SetChain ( this ); if (mmdbfile) Residue[pp]->CheckInAtoms(); } nResidues++; } return nResidues; } // -------------------- Extracting atoms ----------------------- int CChain::GetNumberOfAtoms ( Boolean countTers ) { int i,na; na = 0; for (i=0;iGetNumberOfAtoms ( countTers ); return na; } int CChain::GetNumberOfAtoms ( int seqNo, const InsCode insCode ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->nAtoms; return 0; } int CChain::GetNumberOfAtoms ( int resNo ) { if ((0<=resNo) && (resNonAtoms; } return 0; } PCAtom CChain::GetAtom ( int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->GetAtom ( aname,elmnt,aloc ); return NULL; } PCAtom CChain::GetAtom ( int seqNo, const InsCode insCode, int atomNo ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) { if ((0<=atomNo) && (atomNonAtoms)) return res->atom[atomNo]; } return NULL; } PCAtom CChain::GetAtom ( int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=resNo) && (resNoGetAtom ( aname,elmnt,aloc ); } return NULL; } PCAtom CChain::GetAtom ( int resNo, int atomNo ) { PCResidue res; if ((0<=resNo) && (resNonAtoms)) return res->atom[atomNo]; } } return NULL; } void CChain::GetAtomTable ( int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; res = GetResidue ( seqNo,insCode ); if (res) { atomTable = res->atom; NumberOfAtoms = res->nAtoms; } } void CChain::GetAtomTable ( int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; atomTable = NULL; NumberOfAtoms = 0; if ((0<=resNo) && (resNoatom; NumberOfAtoms = res->nAtoms; } } } void CChain::GetAtomTable1 ( int seqNo, const InsCode insCode, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) res->GetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } void CChain::GetAtomTable1 ( int resNo, PPCAtom & atomTable, int & NumberOfAtoms ) { PCResidue res; if ((0<=resNo) && (resNoGetAtomTable1 ( atomTable,NumberOfAtoms ); else { if (atomTable) delete[] atomTable; atomTable = NULL; NumberOfAtoms = 0; } } int CChain::DeleteAtom ( int seqNo, const InsCode insCode, const AtomName aname, const Element elmnt, const AltLoc aloc ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->DeleteAtom ( aname,elmnt,aloc ); return 0; } int CChain::DeleteAtom ( int seqNo, const InsCode insCode, int atomNo ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->DeleteAtom ( atomNo ); return 0; } int CChain::DeleteAtom ( int resNo, const AtomName aname, const Element elmnt, const AltLoc aloc ) { if ((0<=resNo) && (resNoDeleteAtom ( aname,elmnt,aloc ); } return 0; } int CChain::DeleteAtom ( int resNo, int atomNo ) { if ((0<=resNo) && (resNoDeleteAtom ( atomNo ); } return 0; } int CChain::DeleteAllAtoms ( int seqNo, const InsCode insCode ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->DeleteAllAtoms(); return 0; } int CChain::DeleteAllAtoms ( int resNo ) { if ((0<=resNo) && (resNoDeleteAllAtoms(); } return 0; } int CChain::DeleteAllAtoms() { int i,k; k = 0; for (i=0;iDeleteAllAtoms(); return k; } int CChain::DeleteAltLocs() { // This function leaves only alternative location with maximal // occupancy, if those are equal or unspecified, the one with // "least" alternative location indicator. // The function returns the number of deleted. All tables remain // untrimmed, so that explicit trimming or calling FinishStructEdit() // is required. int i,n; n = 0; for (i=0;iDeleteAltLocs(); return n; } int CChain::AddAtom ( int seqNo, const InsCode insCode, PCAtom atom ) { PCResidue res; res = GetResidue ( seqNo,insCode ); if (res) return res->AddAtom ( atom ); return 0; } int CChain::AddAtom ( int resNo, PCAtom atom ) { if ((0<=resNo) && (resNoAddAtom ( atom ); } return 0; } void CChain::Copy ( PCChain Chain ) { // modify both CChain::_copy and CChain::Copy methods simultaneously! int i; FreeMemory(); if (Chain) { CopyAnnotations ( Chain ); nResidues = Chain->nResidues; ResLen = nResidues; if (nResidues>0) { Residue = new PCResidue[nResidues]; for (i=0;iSetChain ( this ); Residue[i]->Copy ( Chain->Residue[i] ); } } } } void CChain::CopyAnnotations ( PCChain Chain ) { if (Chain) { strcpy ( chainID ,Chain->chainID ); strcpy ( prevChainID,Chain->prevChainID ); DBReference.Copy ( &(Chain->DBReference) ); SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data ModRes .Copy ( &(Chain->ModRes) ); // MODRES records Het .Copy ( &(Chain->Het) ); // HET records } } void CChain::_copy ( PCChain Chain ) { // modify both CChain::_copy and CChain::Copy methods simultaneously! int i; FreeMemory(); strcpy ( chainID ,Chain->chainID ); strcpy ( prevChainID,Chain->prevChainID ); DBReference.Copy ( &(Chain->DBReference) ); SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data ModRes .Copy ( &(Chain->ModRes) ); // MODRES records Het .Copy ( &(Chain->Het) ); // HET records nResidues = Chain->nResidues; ResLen = nResidues; if (nResidues>0) { Residue = new PCResidue[nResidues]; for (i=0;iSetChain ( this ); Residue[i]->_copy ( Chain->Residue[i] ); } } } void CChain::_copy ( PCChain Chain, PPCAtom atom, int & atom_index ) { // modify both CChain::_copy and CChain::Copy methods simultaneously! int i; FreeMemory(); strcpy ( chainID ,Chain->chainID ); strcpy ( prevChainID,Chain->prevChainID ); DBReference.Copy ( &(Chain->DBReference) ); SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data ModRes .Copy ( &(Chain->ModRes) ); // MODRES records Het .Copy ( &(Chain->Het) ); // HET records nResidues = Chain->nResidues; ResLen = nResidues; if (nResidues>0) { Residue = new PCResidue[nResidues]; for (i=0;iResidue[i]) { Residue[i] = newCResidue(); Residue[i]->SetChain ( this ); Residue[i]->_copy ( Chain->Residue[i],atom,atom_index ); } else Residue[i] = NULL; } } /* void CChain::Duplicate ( PCChain Chain ) { int i; FreeMemory(); strcpy ( chainID ,Chain->chainID ); strcpy ( prevChainID,Chain->prevChainID ); DBReference.Copy ( &(Chain->DBReference) ); SeqAdv .Copy ( &(Chain->SeqAdv) ); // SEQADV records SeqRes .Copy ( &(Chain->SeqRes) ); // SEQRES data ModRes .Copy ( &(Chain->ModRes) ); // MODRES records Het .Copy ( &(Chain->Het) ); // HET records nResidues = Chain->nResidues; ResLen = nResidues; if (nResidues>0) { Residue = new PCResidue[nResidues]; for (i=0;iSetChain ( this ); Residue[i]->Duplicate ( Chain->Residue[i] ); } } } */ cpstr CChain::GetEntryID() { if (model) return model->GetEntryID(); else return pstr(""); } void CChain::SetEntryID ( const IDCode idCode ) { if (model) model->SetEntryID ( idCode ); } int CChain::GetModelNum() { if (model) return model->GetSerNum(); return 0; } cpstr CChain::GetChainID ( pstr ChID ) { ChID[0] = char(0); if (model) sprintf ( ChID,"/%i/",model->GetSerNum() ); else strcpy ( ChID,"/-/" ); strcat ( ChID,chainID ); return ChID; } void CChain::GetAtomStatistics ( RSAtomStat AS ) { AS.Init(); CalcAtomStatistics ( AS ); AS.Finish(); } void CChain::CalcAtomStatistics ( RSAtomStat AS ) { int i; for (i=0;iCalcAtomStatistics ( AS ); } void CChain::ApplyTransform ( mat44 & TMatrix ) { // transforms all coordinates by multiplying with matrix TMatrix int i; for (i=0;iApplyTransform ( TMatrix ); } Boolean CChain::isSolventChain() { // returns True if chain contains only solvent molecules Boolean B,P; int i; B = True; P = False; for (i=0;(iisSolvent(); } return (B && P); } Boolean CChain::isInSelection ( int selHnd ) { PCMMDBFile mmdbfile = (PCMMDBFile)GetCoordHierarchy(); PCMask Mask; if (mmdbfile) { Mask = mmdbfile->GetSelMask ( selHnd ); if (Mask) return CheckMask ( Mask ); } return False; } Boolean CChain::isAminoacidChain() { // returns True if chain contains at least one aminoacid residue Boolean B,P; int i; B = False; P = False; for (i=0;(iisAminoacid(); } return (B && P); } Boolean CChain::isNucleotideChain() { // returns True if chain contains at least one nucleotide residue Boolean B,P; int i; B = False; P = False; for (i=0;(iisNucleotide(); } return (B && P); } int CChain::CheckID ( const ChainID chID ) { if (chID) { if (!strcmp(chID,chainID)) return 1; } return 0; } int CChain::CheckIDS ( cpstr CID ) { ChainID chn; InsCode inscode; ResName resname; AtomName atm; Element elm; AltLoc aloc; int mdl,sn,rc; rc = ParseAtomPath ( CID,mdl,chn,sn,inscode,resname, atm,elm,aloc,NULL ); if (rc>=0) { if (!strcmp(chn,chainID)) return 1; } return 0; } int CChain::GetNumberOfDBRefs() { return DBReference.Length(); } PCDBReference CChain::GetDBRef ( int dbRefNo ) { return (PCDBReference)DBReference.GetContainerClass ( dbRefNo ); } void CChain::MaskAtoms ( PCMask Mask ) { int i; for (i=0;iMaskAtoms ( Mask ); } void CChain::MaskResidues ( PCMask Mask ) { int i; for (i=0;iSetMask ( Mask ); } void CChain::UnmaskAtoms ( PCMask Mask ) { int i; for (i=0;iUnmaskAtoms ( Mask ); } void CChain::UnmaskResidues ( PCMask Mask ) { int i; for (i=0;iRemoveMask ( Mask ); } // ------- user-defined data handlers int CChain::PutUDData ( int UDDhandle, int iudd ) { if (UDDhandle & UDRF_CHAIN) return CUDData::putUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CChain::PutUDData ( int UDDhandle, realtype rudd ) { if (UDDhandle & UDRF_CHAIN) return CUDData::putUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CChain::PutUDData ( int UDDhandle, cpstr sudd ) { if (UDDhandle & UDRF_CHAIN) return CUDData::putUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } int CChain::GetUDData ( int UDDhandle, int & iudd ) { if (UDDhandle & UDRF_CHAIN) return CUDData::getUDData ( UDDhandle,iudd ); else return UDDATA_WrongUDRType; } int CChain::GetUDData ( int UDDhandle, realtype & rudd ) { if (UDDhandle & UDRF_CHAIN) return CUDData::getUDData ( UDDhandle,rudd ); else return UDDATA_WrongUDRType; } int CChain::GetUDData ( int UDDhandle, pstr sudd, int maxLen ) { if (UDDhandle & UDRF_CHAIN) return CUDData::getUDData ( UDDhandle,sudd,maxLen ); else return UDDATA_WrongUDRType; } int CChain::GetUDData ( int UDDhandle, pstr & sudd ) { if (UDDhandle & UDRF_CHAIN) return CUDData::getUDData ( UDDhandle,sudd ); else return UDDATA_WrongUDRType; } // ------------------------------------------------------------------- DefineClass(CSortResidues) class CSortResidues : public CQuickSort { public : CSortResidues() : CQuickSort() {} int Compare ( int i, int j ); void Swap ( int i, int j ); void Sort ( PPCResidue res, int nresidues ); }; int CSortResidues::Compare ( int i, int j ) { int diff; diff = ((PPCResidue)data)[i]->seqNum - ((PPCResidue)data)[j]->seqNum; if (diff==0) diff = strcmp( (PPCResidue(data))[i]->insCode, (PPCResidue(data))[j]->insCode ); if (diff>0) return 1; if (diff<0) return -1; return 0; } void CSortResidues::Swap ( int i, int j ) { PCResidue res; res = ((PPCResidue)data)[i]; ((PPCResidue)data)[i] = ((PPCResidue)data)[j]; ((PPCResidue)data)[j] = res; } void CSortResidues::Sort ( PPCResidue res, int nresidues ) { CQuickSort::Sort ( &(res[0]),nresidues ); } void CChain::SortResidues() { CSortResidues SR; TrimResidueTable(); SR.Sort ( Residue,nResidues ); } int CChain::GetNofModResidues() { return ModRes.Length(); } PCModRes CChain::GetModResidue ( int modResNo ) { return PCModRes(ModRes.GetContainerClass(modResNo)); } void CChain::write ( RCFile f ) { int i; byte Version=1; f.WriteByte ( &Version ); CUDData::write ( f ); f.WriteTerLine ( chainID ,False ); f.WriteTerLine ( prevChainID,False ); DBReference.write ( f ); // Database reference SeqAdv .write ( f ); // SEQADV records SeqRes .write ( f ); // SEQRES data ModRes .write ( f ); // MODRES records Het .write ( f ); // HET records f.WriteInt ( &nResidues ); for (i=0;iwrite ( f ); } void CChain::read ( RCFile f ) { // The Atom array in CMMDBFile must be already read // prior to calling this function! int i; byte Version; FreeMemory(); f.ReadByte ( &Version ); CUDData::read ( f ); f.ReadTerLine ( chainID ,False ); f.ReadTerLine ( prevChainID,False ); DBReference.read ( f ); // Database reference SeqAdv .read ( f ); // SEQADV records SeqRes .read ( f ); // SEQRES data ModRes .read ( f ); // MODRES records Het .read ( f ); // HET records SetChain ( chainID ); f.ReadInt ( &nResidues ); ResLen = nResidues; if (nResidues>0) { Residue = new PCResidue[nResidues]; for (i=0;iSetChain ( this ); Residue[i]->read ( f ); } } } MakeFactoryFunctions(CChain) // =================================================================== /* void TestChain() { // reads from 'in.chain', writes into // 'out.chain' and 'abin.chain' CFile f; char S[81]; PCChain Chain; Chain = newCChain(); f.assign ( "in.chain",True ); if (f.reset()) { while (!f.FileEnd()) { f.ReadLine ( S,sizeof(S) ); Chain->ConvertPDBString ( S ); } f.shut(); } else { printf ( " Can't open input file 'in.chain' \n" ); delete Chain; return; } f.assign ( "out.chain",True ); if (f.rewrite()) { Chain->PDBASCIIDump ( f ); f.shut(); } else { printf ( " Can't open output file 'out.chain' \n" ); delete Chain; return; } f.assign ( "mmdb.chain.bin",False ); if (f.rewrite()) { Chain->write ( f ); f.shut(); } else { printf ( " Can't open binary chain file for writing.\n" ); delete Chain; return; } delete Chain; printf ( " Chain deleted.\n" ); Chain = newCChain(); if (f.reset()) { Chain->read ( f ); f.shut(); } else { printf ( " Can't open binary chain file for reading.\n" ); delete Chain; return; } f.assign ( "abin.chain",True ); if (f.rewrite()) { Chain->PDBASCIIDump ( f ); f.shut(); } else printf ( " Can't open output file 'abin.chain' \n" ); delete Chain; } */ mmdb-1.23.2.1/COPYING.LESSER0000644000175100017510000001672711472712537011655 00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. mmdb-1.23.2.1/configure0000755000175100017510000176073111475672046011542 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65. # # # 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 about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do 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 &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= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL lt_ECHO RANLIB AR OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL MMDB_LT_VERSION am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX 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 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 ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP 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}' 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 this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF 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 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) 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] Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor 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 the package provider. _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 configure 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_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_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_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_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_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_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_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 declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #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_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 cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.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 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=mmdb VERSION=1.23.2.1 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 -' # AM_MAINTAINER_MODE 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 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 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_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 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 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 MMDB_LT_VERSION="0:1:0" # for autoheader to work, ac_config_headers="$ac_config_headers config.h" 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" # 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_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 #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" 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 { $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 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 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 &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 &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:4898: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:4901: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:4904: 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 6110 "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 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 to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #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 _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 to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #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 _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 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 #include #include #include 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 _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 _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 #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF 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 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 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 to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #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 _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 to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #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 _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 # 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* 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:8163: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8167: \$? = $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:8502: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8506: \$? = $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:8607: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8611: \$? = $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:8662: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8666: \$? = $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 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.so # instead of lib.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 11046 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif 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 11142 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif 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_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 &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 &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 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:13098: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13102: \$? = $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:13197: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13201: \$? = $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:13249: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13253: \$? = $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.so # instead of lib.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 ac_config_commands="$ac_config_commands libtool" # Only expand once: ac_config_files="$ac_config_files Makefile src/Makefile examples/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__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__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 : ${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 $as_me, 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 the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status 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 # 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 "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/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` 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 ' >$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 ' >$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 "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 mmdb-1.23.2.1/AUTHORS0000644000175100017510000000002311471214431010641 00000000000000 Eugene Krissinel mmdb-1.23.2.1/INSTALL0000644000175100017510000002243211471214431010632 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. 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 only 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. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. 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. 4. Type `make install' to install the programs and any data files and documentation. 5. 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. 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=c89 CFLAGS=-O2 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 must use a version of `make' that supports the `VPATH' variable, such as 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 `..'. If you have to use a `make' that does not support the `VPATH' variable, you have 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. 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'. 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. 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'. Optional Features ================= 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. 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). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--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. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. mmdb-1.23.2.1/Makefile.am0000644000175100017510000000046411476203467011652 00000000000000# -*- mode: Autoconf; mode: font-lock -*- # Process this file with autoconf to produce a configure script. ACLOCAL_AMFLAGS = -I m4 SUBDIRS=src examples EXTRA_DIST = docs autogen.sh # Delete all files not in bzr repo, developer use only. bzrclean: bzr status -S|grep '^?' |cut -f2 -d?|xargs rm -rf #### mmdb-1.23.2.1/ChangeLog0000644000175100017510000000000011471214431011336 00000000000000mmdb-1.23.2.1/config.h.in0000644000175100017510000000312111475672045011633 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION mmdb-1.23.2.1/config.guess0000755000175100017510000013105411475672046012140 00000000000000#! /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 . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 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 /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[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 #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -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 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 #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' /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 echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; 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 < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mmdb-1.23.2.1/aclocal.m40000644000175100017510000115365211475672044011467 00000000000000# 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, 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 /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 # 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 # 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], [[!?.]$], [], [.]) )]) # _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: # # ='`$ECHO "X$" | $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 ." 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 #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif 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.so # instead of lib.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 &1 /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 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 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 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 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 ]) # 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 # _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], []) 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])]) # 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 ]) # 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) ]) # 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])]) mmdb-1.23.2.1/config.sub0000755000175100017510000010242511475672046011603 00000000000000#! /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 . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 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: mmdb-1.23.2.1/depcomp0000755000175100017510000004426711475672046011206 00000000000000#! /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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi 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: mmdb-1.23.2.1/autogen.sh0000644000175100017510000000027211471214431011575 00000000000000#! /bin/sh # you may need: aclocal -I /usr/share/aclocal aclocal -I /usr/share/aclocal \ && libtoolize --force --copy \ && autoheader \ && autoconf \ && automake --copy --add-missing mmdb-1.23.2.1/ltmain.sh0000755000175100017510000073341511475672045011453 00000000000000# Generated from ltmain.m4sh. # ltmain.sh (GNU libtool) 2.2.6b # Written by Gordon Matzigkeit , 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 . 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 </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 <?"'"'"' &()|`$[]' \ && 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 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 < #include #ifdef _MSC_VER # include # include # include # define setmode _setmode #else # include # include # ifdef __CYGWIN__ # include # 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 #include #include #include #include #include #include #include #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 <"))); for (i = 0; i < newargc; i++) { LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); } 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 : ""), (value ? value : ""))); { #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 : ""), (value ? value : ""))); 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 : ""), (value ? value : ""))); 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 </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 mmdb-1.23.2.1/install-sh0000755000175100017510000003253711475672046011632 00000000000000#!/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: mmdb-1.23.2.1/NEWS0000644000175100017510000000007311471214431010275 00000000000000 Release 1.21 Fixes problem in pdb output LINK format. mmdb-1.23.2.1/Makefile.in0000644000175100017510000005420111476203472011655 00000000000000# 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@ # -*- mode: Autoconf; mode: font-lock -*- # Process this file with autoconf to produce a configure script. 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) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING COPYING.LESSER \ ChangeLog INSTALL NEWS config.guess config.sub depcomp \ install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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 = config.h CONFIG_CLEAN_FILES = 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 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@ 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@ MMDB_LT_VERSION = @MMDB_LT_VERSION@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ 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 examples EXTRA_DIST = docs autogen.sh all: config.h $(MAKE) $(AM_MAKEFLAGS) 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): 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 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 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # 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) $(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 config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -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-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: 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: .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 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-hdr \ 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-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Delete all files not in bzr repo, developer use only. bzrclean: bzr status -S|grep '^?' |cut -f2 -d?|xargs rm -rf #### # 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: mmdb-1.23.2.1/docs/0000755000175100017510000000000011472715327010621 500000000000000mmdb-1.23.2.1/docs/rwbrook/0000755000175100017510000000000011472715327012306 500000000000000mmdb-1.23.2.1/docs/rwbrook/cl_rwbrook.html0000644000175100017510000000344107237536775015275 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

CCP4 Coordinate Library Project

RWBROOK interface for FORTRAN and C programmers.

CONTENTS

  1. General principles of the interface

  2. Interface functions

  • Using the interface from programs written in C and C++

  • Error handling and return codes

  • Examples

  • Alphabetical index of RWBROOK functions

  •  

    Back to general Library index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_ipnt.html0000644000175100017510000004367107236031345015423 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Manipulations with the Internal Channel Pointer.


    GENERAL REMARKS

    Once a channel is opened for input or output (cf. XYZOpen and XYZOpen1), it automatically gets an internal channel pointer (ICP), hidden from the application. Initially it points on "before-the-begining" of the channel. This pointer is used to scan atoms in the channel. Before reading the atom's data (e.g., the coordinates), the ICP should be advanced to the needed atom. Similarly, for writing the atom's data, the ICP should be set onto appropriate position in the channel.

    Each atom and each PDB 'TER' card occupy a separate position in the channel. There is no individual positions for other PDB coordinate-related records ('MODEL', 'SIGATM', 'ANISOU', 'SIGUIJ' and 'ENDMDL' ). Instead, all information read from these records, is assigned to the corresponding atom and is placed in its position in the channel. Once ICP is advanced to that position, all this information is ready for reading (input channels) or writing (output channels).

    For historical reasons, rwbrook.f used the data structure peculiar to PDB files. Although this structure has little in common with that of CIF and binary files, the RWBROOK interface eliminates these differences for the application. RWBROOK functions will work uniformly on all files that can be read by XYZOpen and XYZOpen1).

    INDEX OF ICP-RELATED FUNCTIONS:
    XYZAdvance1
    XYZRewd
    XYZBksp
    XYZSeek


    subroutine XYZAdvance1 ( iUnit,iTer,iRet )

    PURPOSE:
    Advances the internal channel pointer (ICP) to the next atom in the channel iUnit, imitating the former rwbrook.f's line-by-line reading (for channels opened in input mode) or writing (for channels opened in output mode) the PDB coordinate records (MODEL, ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM and ENDMDL). See Description for more details.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer iTer
    a flag specifying the response on PDB 'TER' card for channels opened in input mode (cf. XYZOpen and XYZOpen1). If iTer is set to 1, then iRet returns 1 if the internal channel pointer advances to a 'TER' card. If iTer is set to 0 then XYZAdvance1 does not return on 'TER' card at all and the internal channel pointer automatically advances to the first atom of next chain.

    integer iRet
    the return code. Negative return code means an error. The error return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZAdvance1 may return RWBERR_NoChannel or RWBERR_NoAdvance as an error code.

    Non-negative return codes have the following meaning:
    Value Description
    0 ( =RWBERR_Ok) successful advancement of the internal channel pointer; RWBROOK is ready to retrieve or store the atom's data.
    1 the internal channel pointer has been advanced to a PDB 'TER' card. This return is only available if parameter iTer was set to 1. If iTer was set to 0, then any PDB 'TER' card is neglected and the internal channel pointer advances automatically to the next atom.
    2 the 'end-of-file' has been reached. This return is only available for channels opened in input mode. It means that the internal channel pointer is in the region beyond the very last atom in the channel.
    3 successful advancement of the internal channel pointer to the next atom in the channel, which appeared to be a Het-atom in the PDB notation (a 'HETATM' PDB card has been encountered).

    DESCRIPTION:

    If channel iUnit is associated with input, XYZAdvance1 will set the internal channel pointer on the next atom in the file. The atom properties may then be retrieved using XYZAtom1 and XYZCoord1. Note that immediately after opening a channel (cf. XYZOpen and XYZOpen1) the internal channel pointer is set to "before-the-first" position, which means it has to be advanced once to get access to the first atom in the channel.

    If channel iUnit is associated with output, XYZAdvance1 merely advances the internal channel pointer. No actual change in the data structure or on disk occurs. The new position will be filled with atom data only after execution of XYZAtom1 and/or XYZCoord1. NOTE that the internal channel pointer WILL NOT be advanced if neither of these functions was called since previous advancement. If this is the case, iRet will return RWBERR_NoAdvance. This mechanism prohibits a non-sequential writing of coordinate data into output channel: output positions cannot be skipped. After successfull advancement, iRet will return RWBERR_Ok.

    Note that this function is slightly different from its analogue in former rwbrook.f. The following code gives the link between the former XYZAdvance and XYZAdvance1:

    subroutine XYZAdvance ( iUnit,iOut,iTer,*,* )
    integer       iRet
    character*80  ErrLin
      call XYZAdvance1 ( iUnit,iTer,iRet )
      if (iRet.eq.1)  return 1
      if (iRet.eq.2)  return 2
      if (iRet.eq.RWBERR_NoChannel) then
        ErrLin = ' ERROR: in XYZADVANCE file has not been opened'
        call CCPErr ( 1,ErrLin )
      endif
      return
    end
    

    Thus, parameter iOut (channel for echoing the input header lines) IS NOT USED. The header lines may be output into a separate channel, if absolutely necessary, with the following code:

    call XYZOpen    ( 'XYZIN','INPUT','PDB',iUnit,iRet )
    call RBCheckErr ( 1,0 )
    ...........
    call XYZOpen    ( 'XYZOUT','OUTPUT','CIF',iOut,iRet )
    call RBCheckErr ( 2,0 )
    call XYZCopy    ( iOut,iUnit,3,iRet )
    call RBCheckErr ( 3,0 )
    call XYZClose   ( iOut,iRet )
    call RBCheckErr ( 4,0 )
    

     


    subroutine XYZRewd ( iUnit,iRet )

    PURPOSE:
    Resets the internal channel pointer for channel iUnit into initial "before-the-first" position, exactly like after just opening a channel.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZRewd may return RWBERR_Ok or RWBERR_NoChannel. If the channel was opened for output, iRet will return a warning RWBWAR_RewOutput.

    REMARKS:

    After a call to XYZRewd the internal channel pointer is set into "before-the-first" position, which means that it should be advanced once (cf. XYZAdvance1) in order to get access to the first atom in the channel. NOTE that the file is not physically re-read, unlike it happened in former rwbrook.f.

     


    subroutine XYZBksp ( iUnit,iRet )

    PURPOSE:
    Sets the internal channel pointer for channel iUnit on the previous atom in the channel.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZBksp may return RWBERR_Ok or RWBERR_NoChannel. If the channel was opened for output, iRet will return a warning RWBWAR_RewOutput. An attempt to backspace from the "before-the-first" position will cause warning RWBWAR_FileTop and the ICP will remain in its position.

    REMARKS:

    After a call to XYZBksp the internal channel pointer shifts for one position back. Thus, combination of XYZBksp and XYZAdvance1 leaves the ICP unchanged unless a) the ICP was not in either the topmost or downmost position and b) XYZAdvance1 was not set to skip the 'TER' cards.

    NOTE that PDB 'TER' card occupies an individual position in the channel. Note also that backspacing in RWBROOK interface is computationally a very cheap operation in contrary to that in former rwbrook.f.

     


    subroutine XYZSeek ( iUnit,fPos,iRet )

    PURPOSE:
    Sets the internal channel pointer for channel iUnit into fPos-th position in the channel.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer fPos
    position, into which the internal channel pointer should be set. "Position" is merely a serial number of either 'ATOM', 'HETATM' or 'TER' card, which is calculated at ignorance of all other cards in PDB file. In an ideal PDB file, "position" is exactly the atom's serial number. Be aware that, more often than not, this rule is violated.
    The "before-the-first" position corresponds to 0. If fPos is set to 0, iRet will return warning RWBWAR_FileTop.

    integer iRet
    the return code. Negative returns correspond to an error. The error return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZSeek may return RWBERR_Ok, RWBERR_NoChannel or RWBERR_EmptyPointer. The latter is issued if fPos-th position is not occupied by either atom or 'ter' data in the channel.

    Non-negative returns are identical to those of XYZAdvance1 and are as follows:
    Value Description
    0 ( =RWBERR_Ok) successful setting of the internal channel pointer; RWBROOK is ready to retrieve or store the atom's data.
    1 the internal channel pointer has been set onto a PDB 'TER' card. Unlike XYZAdvance1, 'TER' cards cannot be automatically skipped in XYZSeek.
    2 the pointer came beyond the last atom (or 'TER' card) in the file.
    3 the internal channel pointer is set onto a Het-atom in the PDB notation ( on a 'HETATM' PDB card).

    REMARKS:

    XYZSeek was not present in former rwbrook.f. It should provide an efficient addressing to arbitrary atoms in the channel. However, figuring out the atom position may be confusing.

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_exch.html0000644000175100017510000002414107236241003015361 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Data Exchange Between the Channels.


    INDEX:
    XYZCopy
    XYZDelete


    subroutine XYZCopy ( iUnit1,iUnit2,copyKey,iRet )

    PURPOSE:
    Copies the specified data from channel iUnit2 into channel iUnit1. The function does not append the data, which means that e.g. the coordinates in iUnit1 are disposed prior copying the coordinates from iUnit2. If however a particular type of data is not to be copied, it remains untouched in the destination unit (iUnit1) provided it was there. For example, crystallographic information remains unchanged in iUnit1 if only coordinates are to be copied from iUnit2.

    PARAMETERS:

    integer iUnit1
    the destination channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer iUnit1
    the source channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer copyKey
    a copy key specifying which type of data should be copied. The valid values are:

    Value Description
    1 copy all content of channel iUnit2
    2 copy all except coordinates
    3 copy title section only (PDB records HEADER, OBSLTE, TITLE, CAVEAT, COMPND, SOURCE, KEYWDS, EXPDTA, AUTHOR, REVDAT, SPRSDE, JRNL, REMARK, REMARK n)
    4 copy crystallographic information section only (PDB records CRYST1, ORIGXn, SCALEn, MTRIXn, TVECT )
    5 copy coordinate section only (PDB records MODEL, ATOM, SIGATM, ANISOU, SIGUIJ, TER, HETATM, ENDMDL )

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZCopy may return RWBERR_Ok, RWBERR_NoChannel or RWBERR_NoFile.

    REMARKS:

    If value of copyKey is not in the valid range, the function does nothing. If data of the requested type are not present in the source channel iUnit2, the function does nothing but disposal of this type of data in the destination channel iUnit1; no warnings are issued.

    IMPORTANT NOTICE:  in difference of the former rwbrook.h, the new RWBROOK interface does not share the crystallographic information between all opened channels, but rather keeps it local to every channel. It is therefore important for an application to explicitely take care of providing the crystallographic information to all channels where required.

    For example, if an application needs to read fractional coordinates from channel iUnit1, and then store them into newly opened channel iUnit2 then the crystallographic information is to be provided for channel iUnit2 for proper backward conversion from fractional to orthogonal coordinates. This may be achieved as follows:

    call XYZOpen    ( 'XYZIN','INPUT','PDB',iUnit1,iRet )
    call RBCheckErr ( 1,0 )
    ...........
    call XYZOpen    ( 'XYZOUT','OUTPUT','CIF',iUnit2,iRet )
    call RBCheckErr ( 2,0 )
    call XYZCopy    ( iUnit2,iUnit1,4,iRet )
    call RBCheckErr ( 3,0 )
    

    Crystallographic information may also be loaded from a file. The following example illustrates this possibility; here we switch off reading the coordinates for channel iUnit2 in order to save time and to keep the coordinate space in channel iUnit2 empty and ready to accept coordinate data from iUnit1:

    call XYZOpen       ( 'XYZIN','INPUT','PDB',iUnit1,iRet )
    call RBCheckErr    ( 1,0 )
    ...........
    call SetReadCoords ( 0 )
    call XYZOpen       ( 'XYZIN','INPUT','PDB',iUnit2,iRet )
    call RBCheckErr    ( 2,0 )
    call SetReadCoords ( 1 )
    call XYZSetType    ( iUnit2,'CIF','OUTPUT',iRet )
    call RBCheckErr    ( 3,0 )
    call XYZSetName    ( iUnit2,'outfile.cif',iRet )
    call RBCheckErr    ( 4,0 )
    
    This approach is definitely less eleghant, plus it does not allow to use the logical file name 'XYZOUT' for the output file. Note also that, in 2nd example, channel iUnit2 gets loaded with header and other information from the PDB file as well (everything but coordinates is read in), which is not always desirable.

     


    subroutine XYZDelete ( iUnit,delKey,iRet )

    PURPOSE:
    Deletes the specified data in channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer delKey
    a key specifying which type of data should be deleted. It may take the same values as copyKey in XYZCopy, for specifying the same types of data to be deleted.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZCopy may return RWBERR_Ok, RWBERR_NoChannel or RWBERR_NoFile.

    REMARKS:

    If value of delKey is not in the valid range, the function does nothing. If data of the requested type are not present in the channel iUnit, the function does nothing; no warnings are issued.

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_exapc.html0000644000175100017510000010562707237502453015555 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Data Exchange Between the Channels and Application.
    Exchange of Crystallographic Data.


    INDEX:
    RBFrac3
    WBSpGrp1
    RBSpGrp1
    WBCell1
    RBCell1
    RBCell2
    RBRORF2n
    RBFRO1n
    CvAnisou1


    subroutine RBFrac3 ( iUnit,a,b,c,alpha,beta,gamma,
                         OrthCode,iRet )
    
    PURPOSE:
    Sets the crystal cell properties and calculates the orthogonal-fractional transformation matrices for channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    real*4 a,b,c
    cell parameters a, b and c (angstroms).

    real*4 alpha,beta,gamma
    cell parameters alpha, beta and gamma (degrees).

    integer OrthCode
    the orthogonalization code, which specifies the way of calculation the orthogonalizing matrices. Valid values include:
    Code Description
    1 orthogonal axes are defined to have a parallel to Xo, c* parallel to Zo
    2 orthogonal axes are defined to have b parallel to Xo, a* parallel to Zo
    3 orthogonal axes are defined to have c parallel to Xo, b* parallel to Zo
    4 orthogonal axes are defined to have a+b parallel to Xo, c* parallel to Zo
    5 orthogonal axes are defined to have a* parallel to Xo, c parallel to Zo
    6 orthogonal axes are defined to have a parallel to Xo, b* parallel to Yo

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. RBFrac3 may return RWBERR_NoChannel, RWBERR_NoFile, RWBERR_Disagreement, RWBERR_NoOrthCode and RWBERR_NoChaeck. The last three returns would rather indicate an internal problem in the Library.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    RBFrac3 substitutes the RBFrac2 function from former rwbrook.f. The only difference between these two is that RBFrac3 has channel number iUnit as a first parameter. It is important to note here that crystallographic information in RWBROOK interface is local to every channel, while in former rwbrook.f it was global for all channels. Read more details about this here.

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    subroutine WBSpGrp1 ( iUnit,spGroup,iRet )

    PURPOSE:
    Sets the space group identifier for the channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    character*(*) spGroup
    space group identifier, e.g. 'P 21 21 21'.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. WBSpGrp1 may return RWBERR_NoChannel and RWBERR_NoFile.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    WBSpGrp1 substitutes the WBSpGrp function from former rwbrook.f. The space group identifier is merely stored in the channel; no calculations are performed.

    WBSpGrp1 has two more parameters over that of WBSpGrp from former rwbrook.f: the channel number iUnit and return code iRet. It is important to note here that crystallographic information in RWBROOK interface is local to every channel, while in former rwbrook.f it was global for all channels. Read more details about this here.

     


    subroutine RBSpGrp1 ( iUnit,spGroup,iRet )

    PURPOSE:
    Reads the space group identifier from the channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    character*(*) spGroup
    a buffer for the space group identifier.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. RBSpGrp1 may return RWBERR_NoChannel and RWBERR_NoFile.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    RBSpGrp1 substitutes the RBSpGrp function from former rwbrook.f. It performs exactly opposite to WBSpGrp1 action; the space group identifier is merely retrieved from the channel; no calculations are performed.

    RBSpGrp1 has two more parameters over that of RBSpGrp from former rwbrook.f: the channel number iUnit and return code iRet. It is important to note here that crystallographic information in RWBROOK interface is local to every channel, while in former rwbrook.f it was global for all channels. Read more details about this here.

     


    subroutine WBCell1 ( iUnit,celld,OrthCode,iRet )

    PURPOSE:
    Sets the crystal cell properties and calculates the orthogonal-fractional transformation matrices for channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    real*4 celld(6)
    array of cell parameters:
    celld(1) = a (angstroms)
    celld(2) = b (angstroms)
    celld(3) = c (angstroms)
    celld(4) = alpha (degrees)
    celld(5) = beta (degrees)
    celld(6) = gamma (degrees)

    integer OrthCode
    the orthogonalization code, which specifies the way of calculation the orthogonalizing matrices. This parameter has exactly the same meaning as in RBFrac3, see its valid values and their meaning here.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. WBCell1 may return RWBERR_NoChannel and RWBERR_NoFile.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    WBCell1 substitutes the WBCell function from former rwbrook.f, which performed an immediate output of crystallographic infomration (PDB records 'CRYST1' and 'SCALEn') into output file. Since RWBROOK interface keeps all data in computer's RAM until explicit purging it all at once into a file, actions of WBCell1 and RBFrac3 appear nearly the same. The difference is that WBCell1, unlike RBFrac3, assigns a definite matrix, corresponding to the given orthogonalization code, to what is physically output on cards 'SCALEn'.

    WBCell1 has an additional parameter -- the return code iRet -- as compared to WBCell from former rwbrook.f.

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    subroutine RBCell1 ( iUnit,celld,cvol,iRet )

    PURPOSE:
    Retrieves the crystal cell properties from channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    real*4 celld(6)
    array to accept the cell parameters:
    celld(1) = a (angstroms)
    celld(2) = b (angstroms)
    celld(3) = c (angstroms)
    celld(4) = alpha (degrees)
    celld(5) = beta (degrees)
    celld(6) = gamma (degrees)

    real*4 cvol
    returns volume of the cell.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. RBCell1 may return RWBERR_NoChannel, RWBERR_NoFile, RWBERR_NoCellParameters, RWBERR_NoOrthCode and RWBERR_NoCheck.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    RBCell1 substitutes the RBCell function from former rwbrook.f. The information is merely retrieved from the channel, no calculations are made.

    RBCell1 has two more parameters over that of RBCell from former rwbrook.f: the channel number iUnit and return code iRet. It is important to note here that crystallographic information in RWBROOK interface is local to every channel, while in former rwbrook.f it was global for all channels. Read more details about this here.

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    subroutine RBCell2 ( iUnit,celld,cvol,OrthCode,iRet )

    PURPOSE:
    Retrieves the crystal cell properties and orthogonalization code from channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    real*4 celld(6)
    array to accept the cell parameters:
    celld(1) = a (angstroms)
    celld(2) = b (angstroms)
    celld(3) = c (angstroms)
    celld(4) = alpha (degrees)
    celld(5) = beta (degrees)
    celld(6) = gamma (degrees)

    real*4 cvol
    returns volume of the cell.

    real*4 OrthCode
    returns the orthogonalization code, which specifies the way of calculation the orthogonalizing matrices. This parameter has exactly the same meaning as in RBFrac3, see its valid values and their meaning here.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. RBCell1 may return RWBERR_NoChannel, RWBERR_NoFile, RWBERR_NoCellParameters, RWBERR_NoOrthCode and RWBERR_NoCheck.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    RBCell2 acts exactly like RBCell1 plus returns the orthogonalization code. See remarks for RBCell1.

     


    subroutine RBRORF2n ( iUnit,RO,RF,OrthCode,iRet )

    PURPOSE:
    Stores/retrieves the fractionalising (RF) and orthogonalising (RO) 4x4 matrices, as well as the orthogonalisation code (OrthCode) into/from channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    real*4 RO(4,4)
    the orthogonalising matrix. If RO(1,1) is set to 0.0 prior to the call of RBRORF2n, the information is retrieved from the channel; otherwise RO, RF and OrthCode are stored into the channel.

    real*4 RF(4,4)
    the fractionalising matrix.

    integer OrthCode
    the orthogonalization code, which specifies the way of calculating the orthogonalizing matrices. This parameter has exactly the same meaning as in RBFrac3, see its valid values and their meaning here.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. RBRORF2n may return RWBERR_NoChannel, RWBERR_NoFile and RWBERR_NoMatrices.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    RBRORF2n substitutes the RBRORF2 function from former rwbrook.f. The way in which the data is passed between the channel and application, is determined by the value of RO(1,1) given to the function, as described above.

    RBRORF2n has two more parameters than RBRORF2 function from rwbrook.f: the channel number iUnit and return code iRet. It is important to note here that crystallographic information in RWBROOK interface is local to every channel, while in former rwbrook.f it was global for all channels. Read more details about this here.

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    subroutine RBFRO1n ( iUnit,celld,Vol,RRR,iRet )

    PURPOSE:
    Calculates the matrices for standard orthogonalisations and the cell volume in channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    real*4 celld(6)
    array of cell parameters (input):
    celld(1) = a (angstroms)
    celld(2) = b (angstroms)
    celld(3) = c (angstroms)
    celld(4) = alpha (degrees)
    celld(5) = beta (degrees)
    celld(6) = gamma (degrees)
    If celld(1) is greater then zero, then the existing cell parameters in the channel will be substituted by those given in celld. If new cell parameters differ substantially from the old ones, the returned value of Vol will be negative (this replicates precisely the behaviour of older rwbrook.h).

    Vol
    returns the unit cell volume. It may be set negative, which serves as an indicator that the new cell parameters, given in celld, differ substantially from what was previously set in the channel (see above).

    real*4 RRR(3,3,6)
    returns 6 orthogonalising 3x3 matrices corresponding to 6 values of the orthogonalisation code.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. RBFRO1n may return RWBERR_NoChannel, RWBERR_NoFile and RWBERR_NoCellParams.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    RBFRO1n substitutes the RBFRO1 function from former rwbrook.f. The value of celld(1) determines if new cell parameters are to be set in the channel, as described above.

    RBFRO1n has two more parameters than RBFRO1 function from rwbrook.f: the channel number iUnit and return code iRet. It is important to note here that crystallographic information in RWBROOK interface is local to every channel, while in former rwbrook.f it was global for all channels. Read more details about this here.

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    subroutine CvAnisou1 ( iUnit,U,iFlag,iRet )

    PURPOSE:
    Converts between crystallographic bs and orthogonal Us or the other way round for channel iUnit.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    real*4 U(6)
    array of temperature anisotropic factors.

    PDB files contain anisotropic temperature factors as orthogonal Us. The anisotropic temperature factors can be input/output to CvAnisou1 as orthogonal or as crystallographic Us.

    Shelx defines Uf to calculate temperature factor as:

    T(anisoUf) = exp (-2pi2 ( (h*ast)2 Uf11 + (k*bst)2Uf22 + ... + 2hk*ast*bst*Uf12 +..)

    Note here that Uoji = Uoij and Ufji = Ufij.

    [Uoij] listed on PDB 'ANISOU' card satisfy the relationship:

    [Uoij] = [RFu]-1 [Ufij] {[RFu]-1}T

    where [Rfu] is the normalised [Rf] matrix read from the 'SCALEn' cards; [ROu] = [RFu]-1.

    Hence:
    [Uf_ij] = [RFu] [Uoij] {[RFu] }T

    T(anisoUo) = U(11)*H**2 + U(22)*K**2 + 2*U(12)*H*K + ...

    where H,K,L are the orthogonal reciprocal lattice indicies.

    Biso = 8*pi2 (Uo11 + Uo22 + Uo33) / 3.0

    [Uf(symmj)] = [Symmj] [Uf] [Symmj]T

    integer iFlag
    convertion flag: iFlag=0 : convert from fractional to orthogonal Us; iFlag=1 : convert from orthogonal to fractional Us.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. CvAnisou1 may return RWBERR_NoChannel, RWBERR_NoFile and RWBERR_NoMatrices.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    CvAnisou1 substitutes the CvAnisou function from former rwbrook.f. The value of iFlag determines the regime of converting the anisotropic temperature factors, as described above.

    CvAnisou1 has two more parameters than CvAnisou function from rwbrook.f: the channel number iUnit and return code iRet. It is important to note here that crystallographic information in RWBROOK interface is local to every channel, while in former rwbrook.f it was global for all channels. Read more details about this here.

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_exap.html0000644000175100017510000005644507237526777015434 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Data Exchange Between the Channels and Application.
    Exchange of Atom Data.


    INDEX:
    XYZAtom1
    XYZCoord1
    XYZSetTer
    XYZSetHet


    subroutine XYZAtom1 ( iUnit,iSer,AtNam,ResNam,ChnNam,
                          iResN,ResNo,InsCod,AltCod,
                          SegID,IZ,ID,iRet )
    
    PURPOSE:
    Reads (from input channels) or writes (into output channels) the atom name, residue name, chain name and other listed parameters. The channel iUnit must be opened in the corresponding input/output mode with function XYZOpen or XYZOpen1 (see also XYZSetType). The internal channel pointer must previously be set on the atom's position in the channel with function(s) XYZAdvance1, XYZRewd, XYZBksp or XYZSeek.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer iSer
    atom's serial number. Ideally but far from always, it coincides with the position of atom in the channel. The coincidence will be always assured if the channel was open for input with autoserial regime set on. The parameter is used for both input and output but it is never taken as the actual position of atom in the channel. The actual position is adjusted by functions XYZAdvance1, XYZRewd, XYZBksp or XYZSeek.

    character*(*) AtNam
    left-justified atom name. In order to align the field correctly on a PDB card, the ID parameter should be properly supplied. The parameter is used for both input and output.

    character*(*) ResNam
    residue name. No checks against dictionaries is done by RWBROOK. In a PDB file, this is a 3-character string. CIF files potentially may contain longer residue names. The parameter is used for both input and output.

    character*(*) ChnNam
    chain name. In a PDB file, this is always a 1-character string. CIF files may contain longer chain names. The parameter is used for both input and output.

    integer iResN
    residue sequence number given as an integer. The parameter is used for both input and output.

    character*(*) ResNo
    residue sequence number given as a string. The parameter is used only for input (retrieving information from a channel) and is left for compatibility with former rwbrook.f.

    character*(*) InsCod
    residue insertion code. Known examples include only 1-character values. The parameter is used for both input and output.

    character*(*) AltCod
    the alternate conformation code (1-character string). The parameter is used for both input and output.

    character*(*) segID
    segment ID, normally a 4-character string (CIF files potentially may contain longer identifiers). The parameter is used for both input and output.

    integer IZ
    atomic number as calculated from atom name and element type. If the calculation fails, 7 is returned. The parameter is used only for input (retrieving information from a channel) and is left for compatibility with former rwbrook.f.

    character*(*) ID
    atomic ID, composed as 2-character element name (' C', 'Ca', ' F', 'Fe' and so on) plus the ionic state (e.g. '+2', '-3' etc.). The parameter is used for both input and output.

    integer iRet
    the return code. Negative return code means an error. The error return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZAtom1 may return RWBERR_NoChannel or RWBERR_EmptyPointer as an error code.

    Non-negative return codes contain bit-encoded warnings. XYZAtom1 may set the following warning flags:

    RWBWAR_WrongSerial
    the serial number differs from the atom's position number in the file (quite a common case)
    RWBWAR_UnkFormFactor
    unknown formfactor has been met
    RWBWAR_AmbFormFactor
    ambiguous formfactor encountered

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    XYZAtom1 replicates function XYZAtom from former rwbrook.f. The information is merely passed between the Library and application, with a little bit of calculations for parameters IZ and ID (input only). If atom position was not properly adjusted in input channel, iRet will return RWBERR_EmptyPointer. For output channels, the atom data given will replace any existing data that might have been previously output at a given channel pointer (e.g. if the output is being made into channel opened first for input and then redirected for output). NOTE that the regim of transferring the data by XYZAtom1 is solely determined by the channel input/output mode set in XYZOpen or XYZOpen1 (see also XYZSetType).

     


    subroutine XYZCoord1 ( iUnit,XFlag,BFlag,x,y,z,occ,BIso,U,iRet )

    PURPOSE:
    Reads (for input channels) or writes (for output channels) the atom coordinates, occupancy and temperature factor. The channel iUnit must be opened in the corresponding input/output mode with function XYZOpen or XYZOpen1 (see also XYZSetType). The internal channel pointer must previously be set on the atom's position in the channel with function(s) XYZAdvance1, XYZRewd, XYZBksp or XYZSeek and the atom identification data must be already stored with XYZAtom1 if channel iUnit is opened for output.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    character*(*) XFlag
    a key specifying in which coordinate system (fractional or orthogonal) the atom coordinates x, y and z should be received (for input channels) or are given for output (for output channels). XFlag='O' means coordinates are exchanged in orthogonal system, XFlag='F' sets the regime of fractional coordinates. In the case of output channel, XFlag may also take the values of 'HF' and 'HO' where 'F' and 'O' have the former meaning, and 'H' indicates that the atom should be marked as "Het-atom" (in PDB notation).
    NOTE: using the fractional coordinate system requires that the crystallographic information be loaded into the channel. See more details here

    character*(*) BFlag
    a key specifying the units for the temperature factors. BFlag='O' stands for orthogonal units, and BFlag='F' - for fractional Us.
    NOTE: using the fractional Us requires that the crystallographic information be loaded into the channel. See more details here

    real*4 x,y,z
    x, y and z- atomic coordinates either in orthogonal or fractional coordinate system as specified by parameter XFlag. The parameters are used for both input and output channels.

    real*4 occ
    the occupancy factor. The parameter is used for both input and output channels.

    real*4 BIso
    the isotropic temperature factor, either in orthogonal or fractional Us as specified by parameter XFlag. The parameter is used for both input and output channels.

    real*4 U(6)
    array of 6 reals of the anisotropic temperature factor, either in orthogonal or fractional Us as specified by parameter XFlag. The parameter is used for both input and output channels.
    The anisotropic temperature factors are not always given. If only isotropic factor is known, U(1) receives its value, and all other elements of U are set to zero. This must be performed by application for output channels.

    integer iRet
    the return code. Negative return code means an error. The error return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZCoord1 may return RWBERR_NoChannel (the channel was not opened), RWBERR_EmptyPointer (the ICP was not properly advanced), RWBERR_NoMatrices (the crystallographic information is absent) and RWBERR_NoCoordinates (coordinate information is missing) as an error code.

    Non-negative return codes contain bit-encoded warnings. XYZCoord1 may set the following warning flags:

    RWBWAR_NoOCcupancy
    the occupancy factor is missing in the channel
    RWBWAR_NoTempFactor
    the isotropic temperature factor is missing in the channel
    RWBWAR_AmbFormFactor
    ambiguous formfactor encountered

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    XYZCoord1 replicates function XYZCoord from former rwbrook.f. The information is merely passed between the Library and application, with calculations for parameters x, y, z, BIso and U, if the corresponding fractional modes were specified. No calculations should be performed on the application side.

    If atom position was not properly adjusted in input channel, iRet will return RWBERR_EmptyPointer. For output channels, this return will be issued also in the case if atom identification data (set by XYZAtom1) was not provided prior to the call of XYZCoord1. In output regime of the channel, the data given to XYZCoord1 will replace any existing data that might have been previously output at a given channel pointer (e.g. if the output is being made into channel opened first for input and then redirected for output). NOTE that the regim of transferring the data by XYZCoord1 is solely determined by the channel input/output mode set in XYZOpen or XYZOpen1 (see also XYZSetType).

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    subroutine XYZSetTer ( iUnit,iRet )

    PURPOSE:
    Sets the chain termination flag, so that the current atom will be converted into chain terminator and appear as ('TER') card in the output.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer iRet
    the return code. Negative return code means an error. The error return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZSetTer may return RWBERR_NoChannel (the channel was not opened) and RWBERR_EmptyPointer (the ICP was not properly advanced or atom identifying information was not set) as an error code.

    REMARKS:

    XYZSetTer does not have an analogue in former rwbrook.f. In RWBROOK interface, using this function is the only way to put chain terminator into channel.

    NOTE that prior to using this function, the internal channel pointer should be advanced to the position of 'TER', the atom identification data should be stored with XYZAtom1 function (only the serial number, residue name, sequence number, insertion code and the chain name are important here), and only then this newly created atom may be converted into 'TER':

    ..........
    call XYZOpen     ( 'XYZIN','OUTPUT','PDB',iUnit,iRet )
    call RBCheckErr  ( 1,0 )
    ..........
    iSer  = 0
    iResN = 1
    ..........
    call XYZAdvance1 ( iUnit,0,iRet )
    call RBCheckErr  ( 2,0 )
    iSer = iSer+1
    call XYZAtom1    ( iUnit,iSer,'C','ALA','A',iResN,'----',
                       'F','-','----',0,'C',iRet )
    call RBCheckErr  ( 3,0 )
    call XYZSetTer   ( iUnit,iRet )
    call RBCheckErr  ( 4,0 )
    ..........
    call XYZClose    ( iUnit,iRet )
    call RBCheckErr  ( 5,0 )
    

    where we specified carbon for atom name and element type to avoid issuing any warnings on incorrect input. This example makes the following 'TER' card:

    TER   4151       ALA A 431F
    

    if iSer=4151 and iResN=431.

    Note that the coordinate information (XYZCoord1) does not have to be set for converting atom into a chain terminator.

     


    subroutine XYZSetHet ( iUnit,iRet )

    PURPOSE:
    Sets the heteroatom flag, so that the current atom will appear as 'HETATM' card in the output.

    PARAMETERS:

    integer iUnit
    the channel number. It must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    integer iRet
    the return code. Negative return code means an error. The error return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZSetHet may return RWBERR_NoChannel (the channel was not opened) and RWBERR_EmptyPointer (the ICP was not properly advanced or atom identifying information was not set) as an error code.

    REMARKS:

    XYZSetHet does not have an analogue in former rwbrook.f. In RWBROOK interface, the "Het-atom" flag may also be set by XYZCoord1 function.

    NOTE that prior to using this function, the internal channel pointer should be advanced to the position of 'TER', the atom identification data should be stored with XYZAtom1 function AND the atom coordinates should be provided with XYZCoord1 and only then this newly created atom may be converted into 'HETATM':

    ..........
    call XYZOpen     ( 'XYZIN','OUTPUT','PDB',iUnit,iRet )
    call RBCheckErr  ( 1,0 )
    ..........
    iSer  = 0
    iResN = 1
    ..........
    call XYZAdvance1 ( iUnit,0,iRet )
    call RBCheckErr  ( 2,0 )
    iSer = iSer+1
    call XYZAtom1    ( iUnit,iSer,'CA','ALA','A',iResN,'----',
                       'F',' ','A1',0,'C',iRet )
    call RBCheckErr  ( 3,0 )
    call XYZCoord1   ( iUnit,'O','O',x,y,z,occ,BIso,U,iRet )
    call RBCheckErr  ( 4,0 )
    call XYZSetHet   ( iUnit,iRet )
    call RBCheckErr  ( 5,0 )
    ..........
    call XYZClose    ( iUnit,iRet )
    call RBCheckErr  ( 6,0 )
    

    The following example does exactly the same:

    ..........
    call XYZOpen     ( 'XYZIN','OUTPUT','PDB',iUnit,iRet )
    call RBCheckErr  ( 1,0 )
    ..........
    iSer  = 0
    iResN = 1
    ..........
    call XYZAdvance1 ( iUnit,0,iRet )
    call RBCheckErr  ( 2,0 )
    iSer = iSer+1
    call XYZAtom1    ( iUnit,iSer,'CA','ALA','A',iResN,'----',
                       'F',' ','A1',0,'C',iRet )
    call RBCheckErr  ( 3,0 )
    call XYZCoord1   ( iUnit,'HO','O',x,y,z,occ,BIso,U,iRet )
    call RBCheckErr  ( 4,0 )
    ..........
    call XYZClose    ( iUnit,iRet )
    call RBCheckErr  ( 5,0 )
    

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_misc.html0000644000175100017510000002445407237512715015410 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Miscellaneous.


    INDEX:
    WRemark1
    RBRInv
    Res3to1


    subroutine WRemark1 ( iUnit,Line,iRet )
    
    PURPOSE:
    Writes a "remark" line into channel iUnit. "Remark" may be any valid PDB record.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the channel number mentioned in the previous call to RWBROOK is used. The channel must be previously opened with function XYZOpen or XYZOpen1 for either input or output.

    character*(*) Line
    a valid PDB record. The information from the Line will be decoded according to the PDB keyword (which must start the line), and added to the corresponding block of the data structure associated with channel iUnit. The line will be always the last one in its group (last remark with given remark number or without it, last 'JRNL' record, last 'ATOM' etc.). If the keyword is not recognized, the line is appended after the coordinate section.

    integer iRet
    the return code. The return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. WRemark1 may return the same return codes as XYZOpen or XYZOpen1 called with parameter RWState='INPUT', plus RWBERR_NoChannel and RWBERR_NoFile.

    Zero return (=RWBERR_Ok) means success, no warnings.

     

    REMARKS:

    WRemark1 replicates function WRemark from former rwbrook.f. While WRemark physically added an arbitrary line to the output file, WRemark1 fills the infomation, given in the Line, in the corresponding fields of the data structure associated with the channel. It therefore relies on the validity of PDB syntax of the Line. Note that it expects Line to be a valid PDB card no matter what the type of the file, associated with the channel, is ('PDB', 'CIF' or 'BIN').

    WRemark1 has one more parameter than WRemark from former rwbrook.f: the return code integer iRet.

     


    subroutine RBRInv ( A,AI )
    
    PURPOSE:
    Inverts a 4x4 matrix A and returns it in AI

    PARAMETERS:

    real*4 A(4,4)
    matrix to be inverted. This matrix does not change.

    real*4 AI(4,4)
    the inverted matrix.

    REMARKS:

    RBRInv replicates function RBRInv from former rwbrook.f. Note that RBRInv does not check the input matrix A for singularity. If matrix A appears singular, RBRInv simply does not change matrix AI.

    An attention should be given to the length of real-type parameters. As a meter of standard, 4-byte real values are assumed. This is determined by the definition of apireal found in file mmdb_rwbrook.h of the Library. More likely than not, a mismatch in the length of real-type parameters passed between application and Library will lead to a crash.

     


    subroutine Res3to1 ( ResNm3,ResNm1 )
    
    PURPOSE:
    Returns the 3-character or 1-character residue codes. One of them should be supplied (with the other one set blank), the routine returns the other one.

    PARAMETERS:

    character*4 ResNm3
    the 3-character residue code (name). 4th symbol will be set blank.

    character*1 ResNm1
    the 1-character residue code (name).

    REMARKS:

    Res3to1 replicates function Res3to1 from former rwbrook.f. The function returns the code, which is set blank prior to the call (the other one should be non-blank).

    The function makes the following correspondence between 3-character and 1-character residue codes:

    3-char
    code
    1-char
    code
       3-char
       code
    1-char
    code
    ALA A    ARG R
    ASN N    ASP D
    CYS C    CYH C
    GLN Q    GLU E
    GLY G    HIS H
    ILE I    LEU L
    LYS K    MET M
    PHE F    PRO P
    SER S    THR T
    TRP W    TYR Y
    VAL V    HEM X
    WAT O    SUL U
    END Z    DUM Z

    If an input 3-/1- character code is not recognized, the function returns 'Z'/'DUM', correspondingly.

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_general.html0000644000175100017510000000637207236024406016063 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface: General Principles.

    In RWBROOK interface, each data set (a content of the whole coordinate file) is associated with a single number -- a "channel" number. It may be viewed in quite a close analogy with FORTRAN input/output channel (unit) numbers used in FORTRAN operators read/write. In reality, however, it is merely a handle to a particular instance of the coordinate hierarchy. There is no principal limitation on the number of channels.

    The coordinate file is read all at once when a channel is open for input. The coordinates of atoms may be then retrieved in a sequential manner, atom by atom, replicating the FORTRAN-style reading of 'ATOM' etc. cards from a PDB file. Unlike the older rwbrook.h, which physically read coordinates from a file each time they were requested, the new RWBROOK interface retrieves them from RAM. This eliminates inefficiency of older rwbrook.f in random accessing the coordinates; however all the process remains based on the notion of an "internal channel pointer" (ICP) running over atom indices. More details about ICP are found here.

    Writing the coordinate file is imitated as a sequential process as well -- the atoms are added one by one to a coordinate hierarchy located in memory. The physical writing of the hierarchy into a file is done by issuing a special call or by closing the "channel".

    The following important difference between the older rwbrook.f module and the newer RWBROOK interface should be realized:

    rwbrook.f
    shared the crystallographic information for all currently open channels.
    RWBROOK interface
    keeps the crystallographic information local to every channel.
    It is therefore important that crystallographic information be copied from e.g. input channel to output channel, if the output goes along with transformation from fractional to orthogonal coordinates. Copying the crystallographic information is done with a single call to an interface function, and it is strictly advisable to perform this call (or otherwise set up the crystallographic information) whenever an output channel is opened. See more details here.

    Technically, use of the library reduces simply to linking your code with mmdb.tar. On my Silicon Graphics, I do it as follows:

    f77 fortcode.f ccode.c cppcode.cpp mmdb.a -lftn -lm -lc -lC

    where fortcode.f, ccode.c and cppcode.cpp are sources of FORTRAN, C and C++ codes, correspondingly. mmdb-1.23.2.1/docs/rwbrook/cl_rwb_irets.html0000644000175100017510000004141007251206757015574 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Error Handling and Return Codes.

    Almost every RWBROOK interface function returns a code reporting on the success of the operation. Successful operation always returns RWBERR_Ok=0. An application may check the return code and branch the execution according to that.

    In RWBROOK, serious problems are assigned negative return codes (error codes). A negative return generally (but not necessarily) implies that application may want to stop. In any event it means that a RWBROOK function, which returned such a code, has aborted its execution somewhere in the middle and the operation was not completed.

    Less serious issues are referred to as warnings. Warning return codes are always positive and encoded as bits. One return may contain several warnings. Warnings generally do not suggest application to stop, and any RWBROOK function, which returned warning(s) guarantees that its execution was completed properly (at least from the point of system safety and stability).

    RWBROOK interface provides two functions which automate the process of checking the return codes. These functions will suffice for most cases, so that there is no need to program error checker after each RWBROOK call and moreover, there is no need to go through all return codes.

    The RWBROOK error checkers are:

    RBErrStop
    RBCheckErr

    Full list of RWBROOK return codes:

    Error Codes
    Warning Codes

     


    subroutine RBErrStop ( iPlace,iRet,iUnit,iStop )

    PURPOSE:
    Checks the return code got from one of the RWBROOK interface functions, and if it indicates an error, a message of the following type is issued:

    *** RWBROOK error: point code unit    function
    ***                   12   -3    3    XYZOpen
    *** file   : input.pdb
    *** reason : cannot open a file
    *** Execution stopped.
    

    If there were no errors (iRet=RWBERR_Ok), the function does nothing.

    PARAMETERS:

    integer iPlace
    should be given a number which is unique through an application; it serves for the identifying of the particular call which caused the problem. E.g., the above output example corresponds to the problem occured in point '12'.

    integer iRet
    return code issued by an RWBROOK interface function.

    integer iUnit
    number of channel used when the problem occured.

    integer iStop
    when iStop=0, the execution is termionated on error (iRet!=RWBERR_Ok). If iStop!=0 and there is an error, the following type of message is issued:

    *** RWBROOK error: point code unit    function
    ***                   12   -3    3    XYZOpen
    *** file   : input.pdb
    *** reason : cannot open a file
    *** continue running, may crash ...
    

    and execution continues.

    NOTE:  RBErrStop will display the name of RWBROOK function encountered the problem (XYZOpen above) correctly if only called immediately after it.

    Example:

    call XYZOpen   ( FName,RWStat,FType,iUnit,iRet )
    call RBErrStop ( 12,iRet,iUnit,0 )
    

     


    subroutine RBCheckErr ( iPlace,iStop )

    Represents a simplified call to RBErrStop. It will work correctly only if called immediately after an RWBROOK function. The meaning of parameters is exactly the same as for same-name parameters of RBErrStop.

    Example:

    call XYZOpen    ( FName,RWStat,FType,iUnit,iFail )
    call RBCheckErr ( 12,0 )
    

     


    RWBROOK Error Codes

    The RWBROOK Error Codes are encoded in mmdb_rwbrook.h . They are not likely to change in the future, but nevertheless it is advisable for C and C++ programmers to use them by their names given below. FORTRAN developers are not given a chance other then to hardcode their numerical values.

    Code Name Value Description
    RWBERR_Ok 0 no problems
    RWBERR_NoChannel -1 a major problem. The requested channel cannot be allocated in RAM. Most likely an application cannot proceed further.
    RWBERR_NoFile -2 the requested channel was not associated with a file.
    RWBERR_NoLogicalName -3 the file logical name is not found amongst defined environmental variables.
    RWBERR_CantOpenFile -4 a file cannot be opened (I/O errors or wrong file name).
    RWBERR_WrongInteger -5 wrong ascii format of an integer (being read from a file).
    RWBERR_WrongModelNo -6 wrong model number (either non-positive or not incremented by 1 in a PDB file).
    RWBERR_DuplicatedModel -7 duplicate model number (in a PDB file).
    RWBERR_ForeignFile -8 format of input file cannot be automatically recognized.
    RWBERR_WrongEdition -9 attempt to read a binary file which was created by a higher version of the Library. The binary files are not upward-compatible.
    RWBERR_ATOM_Unrecognd -10 numerical information is not recognized on PDB's atom-related records (being read from a file).
    RWBERR_ATOM_AlreadySet -11 duplicated information for the same atom found (in a file).
    RWBERR_ATOM_NoResidue -12 no residue name was found for an atom (in a file).
    RWBERR_ATOM_Unmatch -13 contradiction between several PDB records related to the same file ('ATOM', 'SIGATM', 'ANISOU', 'SIGUIJ').
    RWBERR_NoAdvance -14 the internal channel pointer was not advanced when reading/writing atomic coordinates, or the pointer is out of range of atom indices.
    RWBERR_EmptyPointer -15 the internal channel pointer points on empty place (no atom was allocated for a given atom index).
    RWBERR_NoMatrices -16 coordinate transformation matrices were not calculated. Most probably, the cell parameters were neither set nor read from a file.
    RWBERR_NoCoordinates -17 attempt to get atom coordinates from a channel where they were neither set nor read from a file.
    RWBERR_Disagreement -18 essentially a warning: too large difference between newer and former cell parameters. Specifically, more than 10% change in the cell volume.
    RWBERR_NoOrthCode -19 the orthogonalization code was neither set nor approprietly calculated.
    RWBERR_NoCheck -20 the cell parameters were not properly checked. This should be fault of Library, rather then that of application.
    RWBERR_NoCellParameters -21 the cell parameters were neither set nor read from a file.
    RWBERR_NotACIFFile -22 the file requested to be read as a CIF file, does not appear as such.
    RWBERR_NoData -23 no data was found in the file.
    RWBERR_UnrecognCIFItems -24 input CIF file contains constructions which are not in complience with CIF syntax.
    RWBERR_MissingCIFField -25 expected data field does not appear after data name in CIF file.
    RWBERR_EmptyCIFLoop -26 an empty CIF loop encountered.
    RWBERR_UnexpEndOfCIF -27 CIF loop or structure are improperly terminated by the end of file.
    RWBERR_MissgCIFLoopField -28 wrong number of loop data fields in a CIF file.
    RWBERR_NotACIFStructure -29 a CIF category was expected to be a structure, but appears to be a loop.
    RWBERR_NotACIFLoop -30 a CIF category was expected to be a loop, but appears to be a structure.
    RWBERR_WrongReal -31 wrong ascii format of a real (being read from a file).

     


    RWBROOK Warning Codes

    The RWBROOK Error Codes are encoded in mmdb_rwbrook.h . They are not likely to change in the future, but nevertheless it is advisable for C and C++ programmers to use them by their names given below. FORTRAN developers are not given a chance other then to hardcode their numerical values.

    Code Name Value Description
    RWBWAR_Warning 0x00004000 a general flag "this is a warning". If this flag is on and the return code is positive, then the return contains a warning.
    RWBWAR_RewOutput 0x00004010 attempt to "rewind" or "backspace" an output channel. The requested operation is performed, however it is unusual.
    RWBWAR_FileTop 0x00004020 attempt to "rewind" or "backspace" a channel with internal channel pointer already in the "before-the-first" position.
    RWBWAR_WrongSerial 0x00004040 atom serial number is not equal to its index (position) in the channel. This means simply that atom serial number do not follow the strictly incremental-by-one order. In RWBROOK this is not exactly illegal, however against PDB convention.
    RWBWAR_UnkFormFactor 0x00004080 atom formfactor cannot be recognized (when retrieving from a channel). This may indicates a problem with atom name or element type.
    RWBWAR_AmbFormFactor 0x00004100 ambiguous atom formfactor encountered (when retrieving from a channel). This may indicates a problem with atom name or element type.
    RWBWAR_NoOccupancy 0x00004200 atom occupancy factor is not found (when retrieving from a channel).
    RWBWAR_NoTempFactor 0x00004400 atom isotropic temperature factor is not found (when retrieving from a channel).


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_init.html0000644000175100017510000000373607236020541015406 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: System Initialization/Deinitialization.


    INDEX:
    XYZInit
    XYZQuit

     


    subroutine XYZInit

    Prior to everything, the RWBROOK interface must be initialized. The best way to do that is to place the following call:

    call XYZInit

    somewhere on the top of your application.

    NOTE 1: without initialization RWBROOK will not function.
    NOTE 2: RWBROOK may be initialized only once. Repeated initialization will cause memory fault.

     


    subroutine XYZQuit

    Correct use of the interface assumes that it will be deinitialized before an application quits. Simply issue the following call:

    call XYZQuit

    before every STOP operator in your program.

    All classes in the Library are self-disposable, which means that the operating system should be able to dispose them properly after your application quits. Therefore use of XYZQuit is recommended only for "extra" correctness. It will also purge all open output files on disk if you occasionally forgot to close them properly.


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_exmp.html0000644000175100017510000003035207240004121015375 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Examples.


    
    c
    c .------------------------------------------------------------------.
    c !                                                                  !
    c !          Test-demonstration of API mmdb_rwbrook.h                !
    c !                                                                  !
    c `------------------------------------------------------------------'
    c
          real           CellD(6),CVol
          real           x,y,z,occ,BIso,U(6)
          integer        ArgNCode,iSer,iResN,IZ,iRet
          character*(20) AtNam,ResNam,ChnNam,ResNo
          character*(20) InsCod,AltCod,SegID,ID
          character*(40) SpaceGroup
    c
    c
    c .------------------------------------------------------------------.
    c !                                                                  !
    c !  1. On the top of each application, RWBROOK must be initialized  !
    c !                                                                  !
    c `------------------------------------------------------------------'
    c
          call XYZInit()
    c
    c
    c .------------------------------------------------------------------.
    c !                                                                  !
    c !  2. Test #1: read a PDB file and write it as a binary file under !
    c !     different name                                               !
    c !                                                                  !
    c `------------------------------------------------------------------'
    c
    c  XYZOpen1 associates a unit number (1 in this call) with a disk file;
    c  if this file is intended for input, it is read all immediately.
          call AutoSerials ( 1 )
          call XYZOpen1    ( 'in.file','INPUT','PDB',1,iRet )
    c
    c  RBErrStop will either stop or issue a warning in the case of an
    c  error, giving identification of the error and particlular call
    c  caused it
          call RBErrStop  ( 1,iRet,1,0 )
    c
    c  change the file type to binary/output
          call XYZSetType ( 1,'BIN','OUTPUT',iRet )
    c
    c  RBCheckErr is merely a simple error messenger which works only
    c  if called immediately after an API function. "0" means "stop
    c  if error".
          call RBCheckErr ( 2,0 )
    c
    c  change the file name
          call XYZSetName ( 1,'out.bin.file',iRet )
          call RBCheckErr ( 3,0 )
    c
    c  XYZClose writes the output file and completely disposes it
    c  from memory
          call XYZClose   ( 1,iRet )
          call RBCheckErr ( 4,0 )
    c
    c
    c .------------------------------------------------------------------.
    c !                                                                  !
    c !  3. Test #2: read binary file and write it as a PDB file under   !
    c !     different name. The steps are quite identical to those       !
    c !     in Test #1; we use unit 2 now.                               !
    c !                                                                  !
    c `------------------------------------------------------------------'
    c
          call XYZOpen1   ( 'out.bin.file','INPUT','BIN',2,iRet )
          call RBCheckErr ( 5,0 )
    c
          call XYZSetType ( 2,'PDB','OUTPUT',iRet )
          call RBCheckErr ( 6,0 )
          call XYZSetName ( 2,'out.pdb.file',iRet )
          call RBCheckErr ( 7,0 )
    c
          call XYZClose   ( 2,iRet )
          call RBCheckErr ( 8,0 )
    c
    c
    c .------------------------------------------------------------------.
    c !                                                                  !
    c !  4. Test #3: read binary file (on unit 1) and use it for         !
    c !     atom-after-atom composition of the other file (on unit 2).   !
    c !     The other file is saved in ASCII PDB format.                 !
    c !                                                                  !
    c `------------------------------------------------------------------'
    c
          call XYZOpen1   ( 'out.bin.file','INPUT','BIN',1,iRet )
          call RBCheckErr ( 9,0 )
    c
    c  RBCell1 reads crystallographic information which is needed
    c  for proper translation of atom coordinates
          call RBCell1    ( 1,CellD,CVol,ArgNCode,SpaceGroup,iRet )
          call RBCheckErr ( 10,0 )
    c
          call XYZOpen1   ( 'out1.pdb.file','OUTPUT','PDB',2,iRet )
          call RBCheckErr ( 11,0 )
    c
    c  RBFrac3 stores the crystallographic information into file
    c  and computes all necessary transformation matrices
          call RBFrac3    ( 2,CellD(1),CellD(2),CellD(3),CellD(4),
         .                    CellD(5),CellD(6),ArgNCode,
         .                    SpaceGroup,iRet )
          call RBCheckErr ( 12,0 )
    c
    c  atom read/write cycle
          iSer1 = 0
     10   continue
    c
            call XYZAdvance1 ( 1,0,iRet )
            if (iRet.eq.2)  goto 20
            if ((iRet.ne.1).and.(iRet.ne.3))  then
              call RBCheckErr  ( 13,0 )
            endif
            call XYZAtom1    ( 1,iSer,AtNam,ResNam,ChnNam,iResN,
         .                     ResNo,InsCod,AltCod,SegID,IZ,ID,iRet )
            call RBCheckErr  ( 14,0 )
            call XYZCoord1   ( 1,'F','F',x,y,z,occ,BIso,U,iRet )
            call RBCheckErr  ( 15,0 )
    c
            call XYZAdvance1 ( 2,0,iRet )
            call RBCheckErr  ( 16,0 )
    c
    c  since 'ter' cards will be skipped, we number all atoms
    c  on a fly. If we do not, multiple warnings may appear.
            iSer1 = iSer1 + 1
            call XYZAtom1    ( 2,iSer1,AtNam,ResNam,ChnNam,iResN,
         .                     ResNo,InsCod,AltCod,SegID,IZ,ID,iRet )
            call RBCheckErr  ( 17,0 )
            call XYZCoord1   ( 2,'F','F',x,y,z,occ,BIso,U,iRet )
            call RBCheckErr  ( 18,0 )
    c
          goto 10
    c
     20   continue
    c
    c  close files
          call XYZClose   ( 1,iRet )
          call RBCheckErr ( 19,0 )
          call XYZClose   ( 2,iRet )
          call RBCheckErr ( 20,0 )
    c
    c
    c .------------------------------------------------------------------.
    c !                                                                  !
    c !  5. Test #4: same as #3 but "TER" and "HETATM" cards are taken   !
    c !     care of.                                                     !
    c !                                                                  !
    c `------------------------------------------------------------------'
    c
          call XYZOpen1   ( 'out.bin.file','INPUT','BIN',1,iRet )
          call RBCheckErr ( 21,0 )
          call RBCell1    ( 1,CellD,CVol,ArgNCode,SpaceGroup,iRet )
          call RBCheckErr ( 22,0 )
          call XYZOpen1   ( 'out2.pdb.file','OUTPUT','PDB',2,iRet )
          call RBCheckErr ( 23,0 )
          call RBFrac3    ( 2,CellD(1),CellD(2),CellD(3),CellD(4),
         .                    CellD(5),CellD(6),ArgNCode,
         .                    SpaceGroup,iRet )
          call RBCheckErr ( 24,0 )
    c
     30   continue
            call XYZAdvance1 ( 1,1,iFlag )
            if (iFlag.eq.2)  goto 40
            if ((iFlag.ne.1).and.(iFlag.ne.3))  then
              call RBCheckErr  ( 25,0 )
            endif
            call XYZAtom1    ( 1,iSer,AtNam,ResNam,ChnNam,iResN,
         .                     ResNo,InsCod,AltCod,SegID,IZ,ID,iRet )
            call RBCheckErr  ( 26,0 )
            call XYZCoord1   ( 1,'F','F',x,y,z,occ,BIso,U,iRet )
            call RBCheckErr  ( 27,0 )
    c
            call XYZAdvance1 ( 2,0,iRet )
            call RBCheckErr  ( 28,0 )
            call XYZAtom1    ( 2,iSer,AtNam,ResNam,ChnNam,iResN,
         .                     ResNo,InsCod,AltCod,SegID,IZ,ID,iRet )
            call RBCheckErr  ( 29,0 )
            if (iFlag.eq.1)  then
              call XYZSetTer ( 2,iRet )
            else if (iFlag.eq.3)  then
              call XYZCoord1 ( 2,'HF','F',x,y,z,occ,BIso,U,iRet )
            else
              call XYZCoord1 ( 2,'F','F',x,y,z,occ,BIso,U,iRet )
            endif
            call RBCheckErr  ( 30,0 )
    c
          goto 30
    c
     40   continue
    c
    c  close files
          call XYZClose   ( 1,iRet )
          call RBCheckErr ( 31,0 )
          call XYZClose   ( 2,iRet )
          call RBCheckErr ( 32,0 )
    c
    c
    c
    c .------------------------------------------------------------------.
    c !                                                                  !
    c !  6. Before quitting any application, rwbrook must be disposed.   !
    c !     Note that RBErrStop does it automatically if it stops.       !
    c !                                                                  !
    c `------------------------------------------------------------------'
    c
          call XYZQuit    ()
          call RBCheckErr ( 100,0 )
    c
          stop
    c
          end
    

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_c.html0000644000175100017510000006307007237774274014706 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Using the Interface from Programs Written in C and C++.


    GENERAL REMARKS

    First of all, there is no special need to use RWBROOK from C and C++. Programs written in these languages, may use a more powerful Object Interface. This interface gives access to many Library functions that are not accessible through RWBROOK. At present, there are no plans of extending RWBROOK functionality.

     

    TECHNICAL NOTES

    All RWBROOK functions, although written in C++, are implemented as FORTRAN subroutines. Your C or C++ code must be able to link to FORTRAN code, and this is all what needed.

    The definitions of RWBROOK functions are collected in header file mmdb_rwbrook.h. In order to invoke the definitions into C/C++ code, this file should be simply included on the top of the corresponding program files:

    #include "mmdb_rwbrook.h"
    

    Programs written and compiled in plain C, also must set on the definition of __PlainC before including the mmdb_rwbrook.h:

    #define __PlainC
    #include "mmdb_rwbrook.h"
    

    NOTE: a program written in plain C may be compiled with a C++ compiler as well. If this is the case, the definition of __PlainC must not be set on.

    Linking C/C++ and FORTRAN is architecture-dependent. The Library provides a few useful macros, which unify C/C++ <=> FORTRAN linking over variety of platforms (the list of acceptible platforms is found in file machine_.h). Definitions of these macros come automatically with the inclusion of mmdb_rwbrook.h. The macros are described below.

    INDEX OF C/C++ <=> FORTRAN LINKING MACROS
    FORTRAN_CALL
    FORTRAN_SUBR
    char_struct
    fill_char_struct
    FTN_STR
    FTN_LEN

     


    FORTRAN_CALL ( name_in_capital,name_in_small,
                   ( length_at_end_list ),
                   ( length_in_structure_list ),
                   ( length_follow_list ) )
    
    PURPOSE:
    Makes a platform-independent link to a FORTRAN subroutine.

    PARAMETERS:

    name_in_capital
    name of FORTRAN subroutine in capital letters.

    name_in_small
    name of FORTRAN subroutine in small letters.

    length_at_end_list
    list of parameters, which are to be passed to the FORTRAN subroutine, with lengths of string parameters collected at the end. Non-string parameters are passed as pointers.

    String parameters must be declared as having the char_struct macro-type, or they must come as fpstr parameters of macro FORTRAN_SUBR. The char_struct macro-type has different implementation for different platforms.

    The lengths of string parameters are passed as values in the end of length_at_end_list, preserving the order of string parameters. The names of string lengths must be composed as StrName_len, where StrName is name of the corresponding string parameter. Parameters are separated by commas. See examples below.

    length_in_structure_list
    list of parameters, which are to be passed to the FORTRAN subroutine, with strings and their lengths combined into a special structure. Non-string parameters are passed as pointers.

    String parameters must be declared as having the char_struct macro-type, or they must come as fpstr parameters of macro FORTRAN_SUBR.

    The lengths of string parameters are not specified explicitely in this list. The parameter list replicates precisely that one of the actual FORTRAN subroutine. Parameters are separated by commas. See examples below.

    length_follow_list
    list of parameters, which are to be passed to the FORTRAN subroutine, with strings are immedistely followed by their lengths. Non-string parameters are passed as pointers.

    String parameters must be declared as having the char_struct macro-type, or they must come as fpstr parameters of macro FORTRAN_SUBR.

    The length of each string parameter is passed as a value and it must immediately follow the string parameter. The names of string lengths must be composed as StrName_len, where StrName is name of the corresponding string parameter. Parameters are separated by commas. See examples below.

     

    EXAMPLE 1

    FORTRAN subroutine

    subroutine XYZClose ( iUnit,iRet )
    integer    iUnit,iRet
    

    should be linked (called) from a C/C++ module as

    int  iUnit,iRet;
    ...............
    FORTRAN_CALL ( XYZCLOSE,xyzclose,
                   ( *iUnit,*iRet ),  // length-at-end list
                   ( *iUnit,*iRet ),  // length-in-structure list
                   ( *iUnit,*iRet )   // length-follow list
                 );
    

    In this example, there is no string parameters to pass into FORTRAN subroutine, therefore all three parameter lists are identical.

     

    EXAMPLE 2

    FORTRAN subroutine

    subroutine XYZOpen ( LName,RWStat,FType,iUnit,iRet )
    character*(*) LName,RWStat,FType
    integer       iUnit,iRet
    

    should be linked (called) from a C/C++ module as

    int    iUnit,iRet;
    char_struct(LName)
    char_struct(RWStat)
    char_struct(FType)
    
    ...............
    
    fill_char_struct ( FName ,"XYZIN" )
    fill_char_struct ( RWStat,"INPUT" )
    fill_char_struct ( FTYPE ,"CIF"   )
    
    FORTRAN_CALL ( XYZOPEN,xyzopen,
                   (    // lengths-at-end list
                    LName,RWStat,FType,*iUnit,*iRet,
                    LName_len,RWStat_len,FType_len
                   ), ( // lengths-in-structure list
                    LName,RWStat,FType,*iUnit,*iRet       
                   ), ( // lengths-follow list
                    LName,LName_len, RWStat,RWStat_len,   
                    FType,FType_len, *iUnit,*iRet
                   )
                 );
    

    Note that there is no explicit declarations for string length parameters LName_len, RWStat_len and FType_len; do not declare string lengths if macro char_struct is used. Note also the way of handling the macro-type char_struct variables.

     

    REMARKS: It is important to keep the suggested way of C/C++ <=> FORTRAN linking if you want your programs to be portable between different platforms. Note the special way of handling the macro-type char_struct variables. Generally, you should not handle these variables directly but through macros char_struct, FTN_STR and char_struct only.

    An attention should be given to the real-type parameters, which are to be passed to a FORTRAN subroutine. As a standard, RWBROOK uses real*4 real types in its FORTRAN interface. This is defined by type apireal found on the top of file mmdb_rwbrook.h. This type may be freely changed to real*8, if necessary (the corresponding line in mmdb_rwbrook.h is commented, cf. there). This definition does not affect non-RWBROOK FORTRAN subroutines, therefore they should be given special attention.

     


    FORTRAN_SUBR ( name_in_capital,name_in_small,
                   ( length_at_end_list ),
                   ( length_in_structure_list ),
                   ( length_follow_list ) )
    
    PURPOSE:
    Makes a platform-independent definition of a FORTRAN subroutine.

    PARAMETERS:

    name_in_capital
    name of FORTRAN subroutine in capital letters.

    name_in_small
    name of FORTRAN subroutine in small letters.

    length_at_end_list
    list of parameters, which are to be passed to the FORTRAN subroutine, with lengths of string parameters collected at the end. Non-string parameters are declared as pointers. Real-type parameters in RWBROOK are declared as 'apireal *'.

    String parameters must be declared as having the fpstr type. This type has different implementation on different platforms.

    The lengths of string parameters are declared as values in the end of length_at_end_list, preserving the order of string parameters. The names of string lengths must be composed as StrName_len, where StrName is name of the corresponding string parameter. Parameters are separated by commas. See examples below.

    length_in_structure_list
    list of parameters, which are to be passed to the FORTRAN subroutine, with strings and their lengths combined into a special structure. Non-string parameters are passed as pointers. Real-type parameters in RWBROOK are declared as 'apireal *'.

    String parameters must be declared as having the fpstr type.

    The lengths of string parameters are not specified explicitely in this list. The parameter list replicates precisely that one of the actual FORTRAN subroutine. Parameters are separated by commas. See examples below.

    length_follow_list
    list of parameters, which are to be passed to the FORTRAN subroutine, with strings are immedistely followed by their lengths. Non-string parameters are passed as pointers. Real-type parameters in RWBROOK are declared as 'apireal *'.

    String parameters must be declared as having the fpstr type.

    The length of each string parameter is declared as a value and it must immediately follow the string parameter. The names of string lengths must be composed as StrName_len, where StrName is name of the corresponding string parameter. Parameters are separated by commas. See examples below.

     

    EXAMPLE 1

    FORTRAN subroutine

    subroutine XYZClose ( iUnit,iRet )
    integer    iUnit,iRet
    

    gets the following declaration in a C/C++ module:

    FORTRAN_SUBR ( XYZCLOSE,xyzclose,
                   ( int * iUnit, int * iRet ),  // length-at-end list
                   ( int * iUnit, int * iRet ),  // length-in-structure list
                   ( int * iUnit, int * iRet )   // length-follow list
                 );
    

    In this example, there is no string parameters to pass into FORTRAN subroutine, therefore all three parameter lists are identical.

     

    EXAMPLE 2

    FORTRAN subroutine

    subroutine XYZOpen ( LName,RWStat,FType,iUnit,iRet )
    character*(*) LName,RWStat,FType
    integer       iUnit,iRet
    

    is declared in a C/C++ module as

    FORTRAN_SUBR ( XYZOPEN,xyzopen,
                   (    // lengths-at-end list
                    fpstr LName,  fpstr RWStat, fpstr FType,
                    int * iUnit,  int * iRet,
                    int   LName_len,
                    int   RWStat_len,
                    int   FType_len
                   ), ( // lengths-in-structure list
                    fpstr LName,  fpstr RWStat, fpstr FType,      
                    int * iUnit,  int * iRet       
                   ), ( // lengths-follow list
                    fpstr LName,  int LName_len,    
                    fpstr RWStat, int RWStat_len,   
                    fpstr FType,  int FType_len,   
                    int * iUnit,  int * iRet
                   )
                 );
    

     

    EXAMPLE 3

    FORTRAN subroutine

    subroutine XYZCoord1 ( iUnit,XFlag,BFlag,
                           x,y,z,occ,BIso,U,iRet )
    integer       iUnit,iRet
    character*(*) XFlag,BFlag
    real          x,y,z,occ,BIso,U(6)
    

    is declared in a C/C++ module as

    FORTRAN_SUBR ( XYZCOORD1,xyzcoord1,
                   (    // lengths-at-end list
                    int * iUnit,    // unit number
                    fpstr XFlag,    // "F" or "O" flag for the fractional
                                    // or orthogonal coordinates x,y,z
                                    // for output files XFlag may also be
                                    // set to "HF" or "HO", where "F" and
                                    // "O" have the same meaning as before
                                    // and "H" indicates that the atom
                                    // should be marked as heteroatom
                    fpstr BFlag,    // "F" or "O" flag for temperature
                                    // factor in fractional or orthogonal
                                    // Us
                    apireal * x,    // x-coordinate
                    apireal * y,    // y-coordinate
                    apireal * z,    // z-coordinate
                    apireal * occ,  // occupancy
                    apireal * BIso, // isotropic temperature factor
                    apireal * U,    // array(6) of the anisotr. t-factor
                    int * iRet,     // returns
                                    //  RWBERR_NoChannel     if iUnit was not
                                    //                       initialized
                                    //  RWBERR_EmptyPointer  if atom was not
                                    //                       advanced
                                    //  RWBERR_NoMatrices    if transformation
                                    //                       matrices are
                                    //                       undefined
                                    //  RWBERR_NoCoordinates if coordinates were
                                    //                       not set in the atom
                                    //
                                    //  >=0 : success, warning flags:
                                    //  RWBERR_NoOccupancy   if occupancy was  
                                    //                       not set in the atom
                                    //  RWBERR_NoTempFactor  if temp. factor was
                                    //                       not set in the atom
                                    //
                    int XFlag_len,  // fortran-hidden length of XFlag
                    int BFlag_len   // fortran-hidden length of BFlag
                   ), ( // lengths-in-structure list
                    int * iUnit,   fpstr XFlag,    fpstr BFlag,
                    apireal * x,   apireal * y,    apireal * z,
                    apireal * occ, apireal * BIso, apireal * U,
                    int * iRet
                   ), ( // lengths-follow list
                    int * iUnit,
                    fpstr XFlag,   int XFlag_len,
                    fpstr BFlag,   int BFlag_len,
                    apireal * x,   apireal * y,    apireal * z,
                    apireal * occ, apireal * BIso, apireal * U,
                    int * iRet
                   )
                 );
    

    In this example, put attention on the way of declaration of real-type parameters.

     

    REMARKS:

    It is important to keep the suggested way of C/C++ <=> FORTRAN linking if you want your programs to be portable between different platforms.

    An attention should be given to the real-type parameters, which are to be passed to a FORTRAN subroutine. As a standard, RWBROOK uses real*4 real types in its FORTRAN interface. This is defined by type apireal found on the top of file mmdb_rwbrook.h. This type may be freely changed to real*8, if necessary (the corresponding line in mmdb_rwbrook.h is commented, cf. there). This definition does not affect non-RWBROOK FORTRAN subroutines, therefore they should be given special attention.

     


    char_struct(StrName)
    
    PURPOSE:
    Makes a platform-independent definition of a string parameter, which can be passed to a FORTRAN subroutine.

    PARAMETERS:

    StrName
    name of the string parameter

     

    REMARKS:

    Implementation of char_struct is platform-dependent, but in any case it declares a pointer to the string buffer and an integer containing its length. It is advisable to use this definition only for parameters which are to be passed to a FORTRAN subroutine. There are three important points to note here.

    First, a char_struct-variable does not allocate space for the string's buffer. A char_struct-variable should be neither allocated nor disposed dynamically.

    Second, one should never try to access a char_struct-variable directly. These variables are assigned values with macro fill_char_struct before passing into a FORTRAN subroutine. An example of this technique is given above. One should never try to retrieve data from a char_struct-variable, except for the FORTRAN subroutine, into which the variable is passed.

    Third, in declarations of FORTRAN subroutines inside C/C++ modules, char_struct-variables are referred to as having the fpstr type. The string is retrieved from fpstr variable with macro FTN_STR, and length of the string's buffer - with macro FTN_LEN. Both macros FTN_STR and FTN_LEN may appear on the left side of assignment operator, however one is not allowed to change the length of buffer of the string passed into a FORTRAN subroutine.

     


    fill_char_struct(StrName,Str)
    
    PURPOSE:
    Assignes a value to a char_struct variable.

    PARAMETERS:

    StrName
    name of a char_struct variable

    Str
    string that is to be assigned to char_struct variable StrName.

     

    REMARKS:

    Since implementation of char_struct variables is platform-dependent, one should never try to assign any values to such variables directly. Using the macro fill_char_struct is the only correct way of doing that. An example of this technique is given above. See also remarks made for using the char_struct macro.

     


    FTN_STR(StrName)
    
    PURPOSE:
    Returns pointer to the string passed as a fpstr parameter into a FORTRAN-interface function (declared with macro FORTRAN_SUBR) in a C/C++ module.

    PARAMETERS:

    StrName
    name of a fpstr variable.

     

    REMARKS:

    Since implementation of fpstr variables is platform-dependent, one should never try either to assign any values to such variables nor to retrieve them directly. Using the macro FTN_STR is the only correct way of doing that. The macro must not appear on the left side of assignment operator. The following example demonstrates usage of macros FTN_STR and FTN_LEN:

    A C/C++ equivalent of FORTRAN subroutine

          subroutine JustSomething ( A )
          character*(*) A
          write ( *,1000 )  len(A),A
          A = '0123456789'
          return
     1000 format ( I5,A )
          end
    

    looks like the following:

    FORTRAN_SUBR ( JUSTSOMETHING,justsomething,
                   ( fpstr A, int A_len ),
                   ( fpstr A ),
                   ( fpstr A, int A_len ) )  {
      printf  ( "%5i     %s\n",FTN_LEN(A),FTN_STR(A) );
      memset  ( FTN_STR(A),' ',FTN_LEN(A) );
      strncpy ( FTN_STR(A),"0123456789",strlen("0123456789") );
    }
    

    where we assume that length of buffer for string A is gretaer than 10. Note that there is no explicit use of A_len parameter.

     


    FTN_LEN(StrName)
    
    PURPOSE:
    Returns length of the buffer of the string passed as a fpstr parameter into a FORTRAN-interface function (declared with macro FORTRAN_SUBR) in a C/C++ module.

    PARAMETERS:

    StrName
    name of a fpstr variable.

     

    REMARKS:

    The macro may be used only for learning the physical length of fpstr-string's buffer. Since implementation of fpstr variables is platform-dependent, one should never try to find this length by direct reading the fpstr fields. Using the macro FTN_LEN is the only correct way of doing that. The macro must not appear on the left side of assignment operator. Usage of macros FTN_LEN and FTN_STR is demonstrated above.

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_rdwr.html0000644000175100017510000004133607237521006015422 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Reading/Writing Files.


    INDEX:
    XYZOpen
    XYZOpen1
    AutoSerials
    SetReadCoords
    SimRWBROOK
    XYZSetType
    XYZSetName
    XYZWrite
    XYZClose


    subroutine XYZOpen ( LName,RWStat,FType,iUnit,iRet )

    PURPOSE:
    Associates a coordinate file with channel number given in iUnit. If the file is to be opened for input, it is read and the hierarchical coordinate struicture is created in RAM.

    PARAMETERS:

    character*(*) LName
    logical name of the file. This is name of the environmental variable (e.g. XYZIN or XYZOUT) containing the physical file name.

    character*(*) RWStat
    string 'INPUT' if the file is to be read, and string 'OUTPUT' if the file is to be written. If the channel is open for input, it is read and the coordinate hierarchy is created. If the channel is opened for output, an empty coordinate hierarchy is created in RAM.

    character*(*) FType
    string 'CIF' for mmCIF files and 'BIN' for the Library's portable binary file. Specifying an empty string ' ' will make the Library to attempt to identify the input file format automatically. In the case of output file, ' ' for file type means "use the format of the last read file on this channel or PDB if no files were read.

    integer iUnit
    the channel number; if zero than the channel number will be assigned automatically and returned in iUnit. If iUnit was previously associated with another or the same file, the file gets complete logical reinitialization, which means that all previous modifications to the file are lost unless stored on disk.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions.

    Example:

    iUnit = 0
    call XYZOpen ( 'XYZIN','INPUT','PDB',iUnit,iRet )
    if (iRet.ne.0)  then
      call XYZQuit
      write ( *,* )  'errors at reading the XYZIN file'
      stop
    endif
    

     


    subroutine XYZOpen1 ( FName,RWStat,FType,iUnit,iRet )

    This function represents a slightly different version of XYZOpen.

    The only difference is that first parameter must give the physical, rather than logical, file name. All other parameters and functionality are identical to those of XYZOpen.

    NOTE:  CCP4 programs use logical file names.

     


    subroutine AutoSerials ( iOnOff )

    PURPOSE:
    Switches On/Off the regime of automatic generation of atom serial numbers at reading from PDB ASCII file.

    PARAMETERS:

    integer iOnOff
    non-zero: the autoserial regime is on, otherwise off. The setting will last until next call to AutoSerials for all channels in processing.

    DEFAULT STATE:  Off.

    DESCRIPTION:

    When the autoserials regime is Off, all atom serial numbers in an input file are expected to be in strictly incremental order and any deviation from this rule will cause end of reading: XYZOpen will issue the RWBERR_AlreadySet error code. If this code is then passed to error checkers ( RBErrStop or RBCheckErr, the application will stop. It is Ok, however, for serial numbers to increment by 2 or more.

    When the autoserials regime is On, XYZOpen does not pay attention to the serial numbers in the file and generates them for each atom on fly in a strict increment-by-one order. This will work correctly only if all atom records ('ATOM'/'HETATM', 'SIGATM', 'ANISOU' and 'SIGUIJ') are grouped for every atom as they ought to (precisely, 'ATOM' or 'HETATM' opens the group, then 'SIGATM', 'ANISOU' and 'SIGUIJ' should follow until next 'ATOM'/'HETATM' is encountered).

    NOTE 1:  AutoSerials must be called before XYZOpen, whose behavior is to be affected.
    NOTE 2:  the autoserials regime is one designed for reading imperfect PDB files. You don't have to use it if your PDB file is in due order.

     


    subroutine SetReadCoords ( iOnOff )

    PURPOSE:
    Switches On/Off reading the atomic coordinates from a coordinate file.

    PARAMETERS:

    integer iOnOff
    non-zero: the regime is on (coordinates are read), otherwise off. The setting will last until next call to SetReadCoords for all channels in processing.

    DEFAULT STATE:  On.

    DESCRIPTION:

    The only purpose of this function is to save execution time and RAM when only e.g. crystallographic information is to be retrieved from a file.

    NOTE:  SetReadCoords must be called before XYZOpen, whose behavior is to be affected.

     


    subroutine SimRWBROOK ( iOnOff )

    PURPOSE:
    Switches On/Off the regime of exact following the old FORTRAN rwbrook.f's way of issuing the messages and warnings.

    PARAMETERS:

    integer iOnOff
    non-zero: the regime is on (the old RWBROOK behavior is simulated), otherwise off. The setting will last until next call to SimRWBROOK for all channels in processing.

    DEFAULT STATE:  Off.

    DESCRIPTION:

    This function is useful at converting CCP4 programs based on older rwbrook.h. When the simulation is On, RWBROOK will be issuing messages (info, warnings and errors) replicating those of older interface. As a result, the outlook of printout nearly does not change after converting.

     


    subroutine XYZSetType ( iUnit,FType,RWState,iRet )

    PURPOSE:
    Changes the type and/or the read/write mode of channel iUnit, previously initialized with XYZOpen or XYZOpen1. The file is neither read from nor purged onto disk, and no change in data occurs.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the last mentioned (in the previous call to RWBROOK) channel number is taken.

    character*(*) FType
    the file type that should be assigned to the channel. This parameter has the same meaning and may take the same values as FType in XYZOpen or XYZOpen1 functions.

    character*(*) RWState
    the input/output mode that should be assigned to the channel. This parameter has the same meaning and may take the same values as RWState in XYZOpen or XYZOpen1 functions.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZSetType may return either RWBERR_Ok or RWBERR_NoChannel.

    DESCRIPTION:

    This function may be used for changing the format of output file. It must be used if a channel was initially open for input and its content is now to be stored on disk. Note that re-opening a channel with XYZOpen or XYZOpen1 would erase its content.

     


    subroutine XYZSetName ( iUnit,FName,iRet )

    PURPOSE:
    Changes the file name for channel iUnit, previously initialized with XYZOpen or XYZOpen1. The file is neither read from nor purged onto disk, and no change in data occurs.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the last mentioned (in the previous call to RWBROOK) channel number is taken.

    character*(*) FName
    the new file name that should be associated with the channel. This parameter has the same meaning and may take the same values as FName in XYZOpen1 (not in XYZOpen) function.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions. XYZSetName may return either RWBERR_Ok or RWBERR_NoChannel.

    DESCRIPTION:

    This function should be used for writing coordinate data into a file different from that used for reading the data, if copying the data into another channel is not required.

     


    subroutine XYZWrite ( iUnit,iRet )

    PURPOSE:
    Writes the content of channel iUnit into a disk file. The name of the file and its format are determined in calls to either XYZOpen/ XYZOpen1 or XYZSetType/ XYZSetName, whichever was the latest. No change in data occurs.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the last mentioned (in the previous call to RWBROOK) channel number is taken.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions.

    DESCRIPTION:

    This function should be used for writing the coordinate data into a file in the case if the data should be further modified and stored on disk again. An implicit (hidden) writing of the data is also done automatically when a channel, opened for output, is closed with XYZClose; see NOTE 2.

    NOTE 1: it is perfectly legal to apply XYZWrite to channels opened for input! It will work properly.

    NOTE 2: it is not a good practice to use both XYZWrite and XYZClose for channels opened for output. Although it will work correctly, XYZClose will rewrite the file over again: XYZWrite does not set any flag that the file was written. Therefore, if you are going "to write and dispose", use just

    call XYZClose ( iUnit,iRet )

    instead of

    call XYZWrite ( iUnit,iRet )
    call XYZClose ( iUnit,iRet )

     


    subroutine XYZClose ( iUnit,iRet )

    PURPOSE:
    Closes the channel iUnit, which means that the data is disposed and iUnit is not a valid handle anymore. If the channel was opened for output, it is saved into a disk file prior to the disposal of the data. The name of the file and its format are determined in calls to either XYZOpen/ XYZOpen1 or XYZSetType/ XYZSetName, whichever was the latest.

    PARAMETERS:

    integer iUnit
    the channel number. If iUnit is less than or equal to zero, then the last mentioned (in the previous call to RWBROOK) channel number is taken. After the function returns, iUnit is no longer a valid channel number.

    integer iRet
    the return (error) code. Return codes are listed in Error Handling and Return Codes. Read that section also for learning how to automate the checking of return codes issued by RWBROOK interface functions.

    DESCRIPTION:

    This function should be used for disposal of any opened channel, when its content is no longer needed. Note that if the channel was opened for output, it will be purged onto disk before the disposal. Use XYZSetType to change the channel's input/output mode if you want to prevent this.

     


    Back to index mmdb-1.23.2.1/docs/rwbrook/cl_rwb_index.html0000644000175100017510000002710107237532046015553 00000000000000 CCP4 Coordinate Library Project / RWBROOK interface

    CCP4 Coordinate Library Project

    RWBROOK interface functions: Alphabetical Function Index.


    A   C   R   S   X   W

    Function name Old name Action
    AutoSerials ***** Switches On/Off the regime of automatic generation of atom serial numbers at reading from PDB ASCII file.
    CvAnisou1 CvAnisou Converts between crystallographic bs and orthogonal Us or the other way round for a given channel.
    RBCell1 RBCell Retrieves the crystal cell properties from a channel.
    RBCell2 ***** Retrieves the crystal cell properties and orthogonalization code from a channel.
    RBFrac3 RBFrac2 Sets the crystal cell properties and calculates the orthogonal-fractional transformation matrices for a channel.
    RBFRO1n RBFRO1 Calculates the matrices for standard orthogonalisations and the cell volume for a channel.
    RBRInv RBRInv Inverts a 4x4 matrix.
    RBRORF2n RBRORF2 Stores/retrieves the fractionalising and orthogonalising 4x4 matrices, as well as the orthogonalisation code into/from a channel.
    RBSpGrp1 RBSpGrp Reads the space group identifier from a channel.
    Res3to1 Res3to1 Returns the 3-character or 1-character residue codes.
    SetReadCoords ***** Switches On/Off reading the atomic coordinates from a coordinate file.
    SimRWBROOK ***** Switches On/Off the regime of exact following the old FORTRAN rwbrook.f's way of issuing the messages and warnings.
    XYZAdvance1 XYZAdvance Advances the internal channel pointer to the next atom in the channel.
    XYZAtom1 XYZAtom Reads or writes the atom identification: name, residue name, chain name and other data, from/to a channel.
    XYZBksp XYZBksp Sets the internal channel pointer on the previous atom in the channel ("backspaces" a file).
    XYZClose XYZClose Closes a channel: purges content of output channels onto disk and disposes all channel's data.
    XYZCoord1 XYZCoord Reads or writes the atom coordinates, occupancy and temperature factor, from/to a channel.
    XYZCopy ***** Copies the specified data from one channel to another.
    XYZDelete ***** Deletes the specified data from a channel.
    XYZInit XYZInit General initialization of the Library.
    XYZOpen XYZOpen Associates a logical coordinate file name with a channel. If the file is to be opened for input, it is read and the hierarchical coordinate struicture is created in RAM.
    XYZOpen1 ***** Associates a physical coordinate file name with a channel. If the file is to be opened for input, it is read and the hierarchical coordinate struicture is created in RAM.
    XYZQuit ***** General deinitialization of the Library.
    XYZRewd XYZRewd Resets the internal channel pointer into initial "before-the-first" position ("rewinds" a file).
    XYZSeek ***** Sets the internal channel pointer into a certain position.
    XYZSetHet ***** Converts the current atom in a channel into 'Het-atom' (PDB 'HETATM' card).
    XYZSetName ***** Changes the file name associated with a channel.
    XYZSetTer ***** Converts the current atom in a channel into chain terminator (PDB 'TER' card).
    XYZSetType ***** Changes the type and/or the read/write mode of a channel.
    XYZWrite ***** Purges the content of a channel into a disk file.
    WBCell1 WBCell Sets the crystal cell properties and calculates the orthogonal-fractional transformation matrices for a channel.
    WBSpGrp1 WBSpGrp Sets the space group identifier for a channel.
    WRemark1 WRemark Writes a "remark" line into channel. "Remark" may be any valid PDB record.

     


    Back to index mmdb-1.23.2.1/docs/cl_intro.html0000644000175100017510000000232307235236163013236 00000000000000 CCP4 Coordinate Library Project / Introduction

    CCP4 Coordinate Library Project

    INTRODUCTION

    The Coordinate Library is designed to assist CCP4 developers in working with coordinate files. The major source of coordinate information remains the PDB files, although more information becomes available in mmCIF format.

    The Library features working with both file formats plus an internal binary format portable between different platforms. This is achieved at uniformity of the Library's interface functions, so that there is no difference in handling different formats.

    The Library provides various high-level tools for working with coordinate files, which include not only reading and writing, but also orthogonal-fractional coordinate transforms, generation of symmetry mates, editing the molecular structure and some others. The Library is supposed as a general low-level tool for unifying the coordinate-related operations. mmdb-1.23.2.1/docs/index.html0000644000175100017510000000544511200323430012521 00000000000000 CCP4 Coordinate Library Project

    CCP4 Coordinate Library Project

    Eugene B. Krissinel
    European Bioinformatics Institute
    Genome Campus, Hinxton
    Cambridge CB10 1SD
    UNITED KINGDOM

    E-mail: keb@ebi.ac.uk
    Tel: +44 (0) 1223 494628
    EBI staff page


    Last update: 06.05.2009

    Take the Library source code (version 1.21) from here (please read Part 2 in file src/README if you are updating an existing version of the Library) . The Library is accompanied by optional monomer database. Starting from 26.03.2004, this database is not compatible with earlier versions of the Library (version 1.04 and lower). However, newer version of Library will support all functionality of older monomer databases.

    DISCLAIMER
    This is not an official release of the Library, please refer to CCP4 for the official release. The released interface will not change, non-released options may be changed and new functions added. There is no error-free guarantee. Documentation covers most significant and vital functionality, but not all functions. Reports on noticed errors and suggestions on interface and functionality are welcome.



    CONTENTS

    1. Introduction
    2. General scheme
    3. RWBROOK interface for FORTRAN and C programmers
    4. Object interface for C and C++ programmers
    5. Object library for reading/writing CIF files

     

    mmdb-1.23.2.1/docs/scheme.jpg0000644000175100017510000036247107234032124012510 00000000000000ÿØÿàJFIF,,ÿÛCÿÛCÿÀ®9"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þü(¢¼ö°øçÿ ¿û,þÒ¿´·ü"ÿðœÃ<|øÉñÏþ¯í¿øF¿á0ÿ…KðëÄ~>ÿ„_þ?ìCþÿíøGþÉöï°_}“íhûÏ—ä¸tÿE~ ÿÃÇ?oú1Ùÿ-ñŸÿ¥“GüÏæ}šm€ÿEPEñ‹?টðMßx§Ä¾ñ×üö!ð_¼â gÂ~1ðw‹?jÿ€þñO„üSáÍFçGñ†¼KáícǰÝè^ °Õ¬îíol®¡ŠæÖæÖX'Š9ctoQ_ÿÃØ?à–ô’¿Øÿ#övÿçGü=ƒþ gÿI+ý€ñ2?goþxÔ÷õðü=ƒþ gÿI+ý€ñ2?goþxÔÃØ?à–ô’¿Øÿ#övÿç@Q_ÿÃØ?à–ô’¿Øÿ#övÿçGü=ƒþ gÿI+ý€ñ2?goþxÔ÷õðü=ƒþ gÿI+ý€ñ2?goþxÔÃØ?à–ô’¿Øÿ#övÿç@Q_ÿÃØ?à–ô’¿Øÿ#övÿçGü=ƒþ gÿI+ý€ñ2?goþxÔ÷õðü=ƒþ gÿI+ý€ñ2?goþxÕõÿÂï‹ >8øBø£ðWâ_€>0|2ñGöŸü#_~xËÿ< â/ì]cPðî³ý…âï êWz~­öOi:­…×Ùî$û=æ™qk.Éà–5ï袊(®Åž,ð·€¼-â_xëľð_‚|áýgÅž1ñ‹5;Þ🅼9§\ë!ñ/‰|C¬\Ãi¡x~ÃI³»º½½ºš+k[kYgžXâÜ|Cÿ`ÿ‚YÿÒJÿ`üLÙÛÿž5}ýE|ÿ`ÿ‚YÿÒJÿ`üLÙÛÿž5ðöø%Ÿý$¯öÿÄÈý¿ùãPßÔWÀ?ðöø%Ÿý$¯öÿÄÈý¿ùãQÿ`ÿ‚YÿÒJÿ`üLÙÛÿž5}ýE|ÿ`ÿ‚YÿÒJÿ`üLÙÛÿž5ðöø%Ÿý$¯öÿÄÈý¿ùãPßÔWÀ?ðöø%Ÿý$¯öÿÄÈý¿ùãQÿ`ÿ‚YÿÒJÿ`üLÙÛÿž5}ýE|ÿ`ÿ‚YÿÒJÿ`üLÙÛÿž5ðöø%Ÿý$¯öÿÄÈý¿ùãPßÔWÀ?ðöø%Ÿý$¯öÿÄÈý¿ùãQÿ`ÿ‚YÿÒJÿ`üLÙÛÿž5}ýEp ¾,|,øãàM âÁ_‰~øÁðËÅÚð|Eø]ã/ü@ð'ˆ¿±uCúÏö‹¼'©]éú·Ù#ýš¿gÿÚJúþÃÀýƒ> ÚižµÒh-KŠYøiû>xĵgŠ¿kýKö*ø±ðâ_íâ/‡? >üSðÿìoñ/öÞÔµý;ã·ƒgŸÝ|Hð¯ðOÁ~ Ö<'wmàí?Q¾Ó¾0hÑx³Jð?ŠtÿxKCõÿ þÑ¿<⟠h_¶‡ÀÏ„<7ñ#Ä7þ|Rø!ûEøÓöŠøgÄÍwQ¶Ò|3ðÛã.µãßÙ“áußÂx¯VÔôÝ7À—ÃOÖü=â/£ø>û[ÐÞ¢¿ ¾þÙ?ðSOŽ?²ÏÃOÚ¯áwüóöAñG‡þ0|ðoíðëáü<§â~‹ñOÄZ?ćZwÄøoˆ¿à›6žÒ~ ]ÙjÚ~Ÿ‹ÿZè6úÆ.µØ4ô“P_¯þ(þݳŸØ{]ÿ‚†ë>2þÑý™´ï€gí!áÿÁ¯…µxÅ>ÓüYðãGðŽñ:û@ÙñÅÛžÒ¼9¢jÓiW—Ú÷ŠtíU¶½¹(×ÔWÈ?³wí=ÿ çÿ5ßøIdsþÏ€>8ø×Ïý›¿k¿øhïê¿ð¨~)øá×Û> x‹þ¯…¿átøÓþï³øç_û.ƒÿ?Š®ô? føƒûsû_OçþþÞÿï?cÙköÐý¢þ$| ý’¼ûNü ø#ñKãWÆoøGÂÚŠ~4ü)±ø­cðÆÃâ'ŽŸ@´ñgˆ-t–×F;k;›ûo Ýß&ŸoSGÛÔQEðßùJgí‘ÿfÿÔÿÖŠÿ‚°WßÕðßùJgí‘ÿfÿÔÿÖŠÿ‚°PßÔQEüÀþÏò ý ?ìÿ¿à§_úñ¿Úž¿§êþ`gù~ÐößðS¯ýxßíOW ß§ê€÷ê(¢µ¢¾YñƯ‹¾*×õÍ'öcøSðãⶉàcSð¯Ž<}ñOãG‰þ xOé7³éÚç‚~j~øãËŸˆúLJõë]›=/FÑu—_ ÚjšÇ‰t¯hþ<ûEëúïÅß|ñ‡Â}cÀ^6×þ|wñwŒÍö­{ hzÿÀßþÍzÛ|<׿ðµ·Å߇!Ó¿h½;UÒÔ5‹Xx“⇎<1àû_»²Ô5+]ÏXñ^©ims¬K§i:­Äv©+Nði—¬f8eeôz(¢€ û þùÿ&Eý÷ü»ÿ^Sû[WǵöüóþLŠ/û;ïø)wþ¼§ö¶¨žß?óôúŠ(¬€øþ Áÿ(³ÿ‚•ÿÙ€þÙúÎß«ïêøþ Áÿ(³ÿ‚•ÿÙ€þÙúÎß«ïê(¢¿8gý§ÿlÿüný¨~þΟ²×ìÁãOþÌŸü%ðWTñ·Æ¯Û[â·Áø³Å>#ýš¿gÿÚJúþÃÀýƒ> ÚižµÒh-KŠY?À/_|ÑöñŠg˯‚ÿcÑcÓ¼3s¡x7âˆn5¹í|Kà-kÂ׿ðëö°ý–~0xî…ß i_€~&Ûxÿ.~|:øÉðëÆÞ;·øYâýÂ>"ðŸÄ¹ü#á¯ÝjxTðÿÄßéÚË[:öÏÆÚEյ̰jVRNïôW€xûö°ý–~üSðWÀÏŠ?´¯À†ß>$ÿÂ9ÿ ëàï¾2|:ðwÅ?Âcâ+ÏøGþ¯‡Þ"ñ¶¯âŸí_éÚ†—¦ý‚ÎãíÚ„Ö6¾mÔRD§Æ/ÚÃöYýž>Õÿ ÿö•øð3ì_ð‡ý³þÆO‡_ ¾Éÿ þü ?jÿ„×Äv>Göçü*_Š¿Øûöÿiÿ²ñؼÿì]KìÀÿEsúÏ‹<-áÍGÂz?ˆ|Káý Vñïˆ.|'à]/YÖtí/Qñ§Šlü-â_]økÂv7·1Ëâ?EàŸøÇY–ÊÍ&¹J𞧨¼BÒÂêh¾!ý£¿à  >~Ôß³'ìwÿ À _Ÿ´O™âßì/´_‡~ÿe|,°ø‹à…Û<¦Â-â_âgÇÿx·â“ðÛÁÙz6ãøV>9þ-ëÃ_gÔ>þ¢¾AÖjì?~ÌþÃð‹¿á¤kÿ²¿öïÃO‹?ðšxwÀŸð¥¾~Øÿ·5-Oþ[?íOˆ ÿ ÿç‹<%åÚÂ!â¯k:Göî¹ÿ·Ú5Ï_Ñ¿hO€~#øÉâÏÙÓÃß>k¿´€¼?mâÏ| Ѿ%ø/TøÉà¿ ^Aá««Oø³á…–µ&·áÏËmãOIíåŒ6ÒGâÍ1ÒR·ö¦P_¢Š(àø&§ü›·Äoû?ïø+þ½3öȯ¿«àø&§ü›·Äoû?ïø+þ½3öȯ¿¨¢Š(¢Š(¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾þ¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ€??h¢ŠèLðö¢Þø‡RÑô=IÔ|]¬Aâßéše•…ï‰õûmC𥶹â«XMkXÂÞðÖ›ÕËK:iþ±³Yµ¥¼Qšg‡´ ÷Ä:–¡èúN£âíbø®ÿLÓ,¬/|O¯Ûh…-µÏÝZÀ’kZÄ~ðdž´Øî®ZYÓOðõšÈ-­-âðóÆñ÷įiðMß…'ÿ„7â?ìõãÛ ÛÁÚÕæµ­hŸtO„ÿ g½*çö$Ñl|O¡Û]kºÇŒ>]~ÞðOm^ÓTÔ4¹u+~ÎZÿŠ¡Ö5/xÃzlj~Öý—¾(hµÇÆ_~Ô¾³Ö-~ø7àGÁ…ÿ 4ÛÙi1ð¾¿ûC|<øsû_|k¼¾Óü;¨^XêZ>µð×Ç?±mŠÉw¨ßO§k¿üEm¥[Øi÷3ê~'ý¯ý¡ÿäû?ÿÙÿÁ1õã²Å{õxíÿ ÏÙÿþÏûþ ‹ÿ¯ý–)KgèÀþŸ¨¢ŠÀŠ( Š( Š( Š( Š( €àšŸònß¿ìÿ¿à¬úôÏÛ"¾þ¯€àšŸònß¿ìÿ¿à¬úôÏÛ"¾þ ¿¾|ø­ñSö³ÿ‚¨ø‡À¿¶çí?û6i6¶÷ÂýãÀ¿|'ûk¾Õuø&'ü¦úo_ÝþѲ'õ¸üA=¶£ig,VºÍ¶”¶Ú£Á¦Cv÷×W¿³´Pãí_¦üý‡|KÿËñ§Äß‹^ðO…›þ =ãß|xý¥ÿh¯x/ÂzÄO‰ž/ÿ‚]ÁA|~$üeø‘«G¢è–¾ Ô®`ð_‡´{H4h:V—áÏx+DÐ<)¢xkÃzo |iý¡>þßú'Àÿ±Ç„´×‰4¯Úö6øïñ/ÅŸ>%ø/â§Ã?‚ ÿeïÚßàŸí/âmSã/޼­j6ž ñ‰´Ÿ„Z—†¼ áònü@×<%?칪kz6§y>£ñ_NøY¤_hVÚ¯Á¿K¡ÿWTPÄ?ðNoø§áŸì}ðËÂ^-½ñÕÌ^ øË¯ønÛ_ø7¨þÎpxwáŸ>9|Jñ§Âx#öx×~'øÃUøðƒÃÿ |AàÍÀÞ×5¨üCáøAð÷ˆt ëzn¡áMíê( ¾øsÿ)Lý²?ìÀàšŸúÑ_ðV ûú¾øsÿ)Lý²?ìÀàšŸúÑ_ðV ûúŠ( ¿˜ÙãþAŸ´ýŸ÷üëÿ^7ûS×ôý_Ììñÿ ÏÚþÏûþ uÿ¯ý©êá»ôýPýEV ~}|0øÇð‹ö@Òümð—öœø©ðãàf·¨|wý¥¾,øÄ?üqáx⟾<~Ñ?~8èwÿ øEû]_|VÖ?h/ÙÇöiø]­~Î?>ü:ø“ûV|5Ö¼}à|}iñ7ã‰>3øÀ~1µý¤~iß¼aªøv_€·ú¦™s5ïÄ/é×ZL°|4ÖdÒ¿S( –bÏëþý›ü áß\ëǬ|LÕôH5†—¿âÑ| âŠÞ7ñ?à x[àÖ­ã¿j>hÿõ é^𦫩¦³áÏ èúN¬é>Õl¯xãþ #ûz|Nñ?ÅÏø®ã˽øµöïÚgÇ´5†‰ñV·“Yø¥á_ hõ_|D½ñlßð·‚ÿb¿ø5÷Gðw†¼?á=&óÄ ¼Yw¥økFÓ´-:ëÅ>=ÿ‚)þß¾:ñ׉nl´»h¢ŸÄ×¼GâgV½t7:–«®Þê7’Íwu<ÒC”PòKû~üð³þÉðV†×ÿ¶/ÂÙcÆ>!ðÿü^ûQý„>x+Nø•ÿø×⟠hŸþxgÆŸ´'Š>3xÓǾ%ñìÁñàOƒ¼1ã«&ð×Â?Üü3ø!¨x<9ñCBøOðáµ½Wõ÷[øðoãïü‹öùðwÅ߇¾ñ–“ãßø%ìYð Ä—w0Ï¥ø¦Oƒ><ÁQ´¿‹ÿtohSÚë~ðÿˆm¼1ágÔÓJÔl¤žçÂzMá]éz|öß«´Pãìoâ_ŒŸ´í+àøh+ojž$ÿ‚m| ø¥ð[Ç^0ñ/„àÒ´?µ¿Ä/Þ9ø!iûIÛxËFÓôo€ÿá“ÿf ?â6“£éÑê·ÖŸ ÿà°V:N§kàÝR×Wø‰ôÿÄoùJgìqÿfÿ+ÿÖŠÿ‚O׿þÏŸ³æû?èþ;UñßÄ‹^?øµñ¾(üaøÃñE¼ Žþ'øîxáF‹®ëº'ÂøWÂ^þÎøKð³á†ím|7áÎk?Ûê…½÷ˆ/µgS÷úüø9ÿ8åÿ´þÁiÿø>UóìÃmñóXøgû~ÈÞ?ý®ÿf ßÚà'ÅÿÙâ_Ç?ÙcáìqãFÿ‚Š|%ø™à_ˆZŒ?kߊ>2xþ "-|]Ö¼Iñsã·ÀƒŸ¾ |8ø¡êvß>6xGÀšþ½ðÓÀ^'ø¥àìü)ãÚÆº=¿Š|}ñIcÔm,Ñï'»¸¶¹º¸]>Ú+O_øM¡ü4Ñ| auð‚}ûáÿŽ5ü^ÑõŸx†_è'½øÝãã‰Ûmäý‡ì²ý³×ÿa¾>jQOûÍb×öýµ,¼[}îtÝoÇÖ?¶gÇË?ˆ~%ðî”þd¾ð†«ã˜1ñgÅÿø%‡<-á? xsN¹Ö.ðŸ‰à£Vz¿> h>-ÑõÍÄ~Öìtý{Ú÷‡õ\Ó´ý_O½²ƒ×ü'û0x§â¯Š|5ñwöæ„|mà_hÞ4øðgÂ~ Ôo~þËÞ)Óuoiž5ðÓüD¾½»øÕûOèú°J²øÇ}¥xFæ×EÐ">øð®_|C¶ñ‡AñGöiþÌñÞ»ûK~ÌO€>~ÔÚŸöd¾?¿¾°ÿ„_ÀŸµÏ‡|?£éú—ð«ö§Õ¼- Ýê·Ùk¿|,¿ðO/Ú?â.™¬~×ÿ¶ïÅ xïÀ_ÿ`ˆ<'âÏ|pý°¾8üiø}®éVŸÿmë–hð?ü?$öº¦§^ZÜ´Öó[«E¹¿¦Ú)§mPÎØ?mßúE÷í}ÿ‡oþ ­ÿÓ£ì¶ïý"ûö¾ÿ÷ÿÖÿé€Wô}EW;òüÌçì¶ïý"ûö¾ÿ÷ÿÖÿé€QöÛwþ‘}û_áÛÿ‚kôÀ+ú>®âÅ|ð&»ñ'âN»ÿÿ„¼?ý™ÍÌf±â cUÖ|oøóñwÅ_¼ð×öý§¼_⟃ž _ |DÑô¯Œ?ðMÖŸDÔN£âIsk-Çíó^#ðü^6ð_Äo ÜjÚ\—ºU·Œ¾x×Áw±x¯Á^+Ñ´ÙÿøB¾)þÚ¿ñ0ø»gÿ Ëö&ñï,?fOxÄ^øëûHxvË'Tý¨õ]{Äp²øâ¶Ü]j¦ð´*Ö4oèV|K§éž'ø—ðÓ×þ#þÇ¿þ x[ᎅ§xÃÿ üIû?ø}¼?û-üRøGáø?âgì£iÞÒmWöxÖŸÃVžðùÒ|'á7TðÃi÷~ ñ_‡´ƒàÿøoÄ~ ½Ô¼?zs¿/ÇüÀü`ûí»ÿH¾ý¯¿ðíÿÁ5¿ú`}ƒöÝÿ¤_~×ßøvÿàšßý0 ý`ðŸí?⟅^)ð×Â/Û™>|ñ·Ž¼A£x/à_Æo øÓQ²øûPø§RÔm¼3¦x+ÃIñÆÊïà¯í?¬jÆ=VËàåö«âë›­_ˆx âÅI|/ñçÁÿoQÎü¿óùÁûí»ÿH¾ý¯¿ðíÿÁ5¿ú`}ƒöÝÿ¤_~×ßøvÿàšßý0 þ¨£ù~?æóƒöÛwþ‘}û_áÛÿ‚kôÀ+ôãþ wð³â·ÁߨëÃþø×ðëXøMñTøïûh|PÔ>ø‡^ð‰µÿ hÿm/Ú ãO€ìõÍgáŒ/ÞêÞ ð®£ªø¿Å÷׉µW@µÕµ]VóR‰n€Ãd~Ñ?ô‰ÿÛûÿ7üÏÿ¦WGü6GíÿHŸý¿¿ðãÁ,ÿúetÂkñOö*ÿ‰ÅÛÏøY¿±7‡ÿwaûMø›ÇÞ"ñÇ_ٿ÷¼i:_íG¥kÞŸþoÀ }Šâ×Pøã7ŠgñV£xƒB¿ø³á­CLðÇÄ¿÷oxOÅžñï…¼5ã¯ø—Ãþ4ðO ý¶i=cö}ø'ðã㎣cûþÈÚž±áOüvÕ>ë÷÷º_ůÛöëÃ^ð-ÌüS¥kšÆ«?ö±“[Ô¼3§ØO›O|ö×77Ñÿ±f™eoû7øÅZoˆtéßõ‰Ÿ´Õ†©áè5ø´¬¿jÏŠÞ7ý¥mt=èzV««hú\£Ó-uOFе R "=Fó@Ðnn¥Ñì€>¦¯ý¡ÿäû?ÿÙÿÁ1õã²Å{õxíÿ ÏÙÿþÏûþ ‹ÿ¯ý–)KgèÀþŸ¨¢ŠÀŠ( Š( Š( Š( Š( Š( Š+Ÿñg†´ïx[ľÖ.|Ag¤ø³ÃúφµK¿ ø³Å>ñM®®é×:]íφ¼uà]gMÖüâí®¥{-[FÔl5]6åb¼Ó¯mná†xÀ>Añgí?⟊¾)ñ/Â/Øe>|añ·|A¬ø/ã§ÆoxÓQ½øû/x§MÔn|3©ø+Ä©ðîÆöïãWí?£êÂMV÷à厫á›]@”x÷â¹|QðòçÆ¿ð3öoð'ÀøJ5+XøñâoÄ?ìI¾(üjøÅãmcâÅ?ˆwZö½ÖŸiuªêr&ŸðÿÀ¾ ñGŽ5mÀ^ ÓÔ¼Sð¯ãÇü‹Gð‰l<=ûI|mñe§†üA¦é?>#ZÅ{¥Ães%·‹nถh™?Wh¢Šò_|-ñÇÂÖ»â ø“¾ µñÇÂߊ^ºÓ´¿‰Ÿ¾&izv«¤è¿~kZ¶•igâtw_Óo¬u-?Tð÷‰¼=â}oÁþ0Ññgüþ wâ? x³ÂÞ#Ó®tøkľÖ?kù­5ßßé7—v·¶WPËmumu,Å$R:Ñê+ŸðŸ†´ïø[Ã^Ñî|Ay¤øOÃú7†´»¿x³Å>=ñMÖ¡iÖÚ]•ω|uã­gRÖüiâ -­b{Ý[YÔoõ]J奼Ôon®æšy: (¢Š(¢Š(¢Š(¢ŠùƒãWí?áo‡*°ø#ðý|;ÖdÓô|@Óü%âhúŸÆ-gÃVüWÄ_YÛI࿇zö™ð«Âþ©ÿÁ3¿eÝGÇ~$Ûkµÿ…¼[ñ§â¡ñGâuÏïø(ßüGávâŸê:>…á¦×gðŸÃÚ›JÒ4ï³xK¾Ñ4ë[+k=+AðŽ‘¡é–öšF•§Ù[|ÁûZ~É~ý›<ð—âïÂ/‹_¶ö•ãm+öÞÿ‚oxN9Ötïø[Åžñm¬x{ľñs5¦»áûý&òÒêÊöÖim®­®¢ž dŠDsÐW€~Íÿ³Â/Ù;ÀšÇÃo‚¶Ÿ,<%¯|@ñ·ÅRÛâ/Æ¿µ‰¼wñ'X“ľ?×`ñgLj^%Õì?¶|[uªëz­½ôVwZ÷ˆõ}r[vÕõVöóß袊(¢Š(¢Š(¢Š(€ø£ñcágÀïk¿~5|KðÁÿ†^þÌÿ„—â/Åxwáÿ<;ýµ¬iþÑ¿·|]âÍJÓOÒ~×â [J°µûEÄh¼Ôííbß<ñFß ÂñOöÕÿ‰‡ÅÛ?øV_±7ˆ?yaû2x›À>"ðÿÇ_ÚCö\é:§íGªëÞ#ƒþ—Àý¶âëPø7… ñV±£xB°ø³â]?Lñ?Ä¿€ž¿ûF~Çßj­Gá^±ñ}~/®­ðKÄ$ñgà Sá/í/ûJþÎz…¼SâÏ _xZñ,wß³·Å¿ ˪ø¼¬ø“F¶½¿{«?Jñ–½§iòÚÚkúÌ7ÞAÿÔý¿è£~ßßø¶ø*gÿFE}ýE|CÿËñgŠ|{ÿÝÿ‚}xëÇ^%ñ,øKñ“àŠ|KñKöQÃþ'øyâok?~3þÆú¾›Œþ?ñ¦·¨Üê^9ñ·ì¡ñ/Tñæ¢~ÏÿüGs«ë> ñ‡âK-OÀ?%|XÖ¾Þ¯Ä?ø'¿ìMðÃãì ûüjø£ñöþñGÄߌ²ìÓñGâ/‰áé¿ðSMþ/ü@ø1à¿x»]þÆðïíoi§é?kñ­¨\}–ÂÒÖÎßíU­¼$q(êïÁ_¿ÿh¯ _øÇà·Ä/ø÷IмAuàÏÚi³Og⟆ÿ´½;JÕ(|Tø5ð?_³ñ'Šô½boˆt{}o…ÿ>!üdø»âŸ|;½Ô/ãžóŸü¯x–÷áLJu¿‰7+&£qft-Tø¥om-Õ¦¡â[HµÃá6¹ðÓÄþ°ñ'ÂH4{oø‡Xñ~¸ÖÚG‡¥ðŒ¶þ1Õ¼c¯ßüLƒÅ>½Ó,¯¼1ñ>%\xµ|W§jÖvší—‰—V¶×­mõ˜¯âO–|_ñ À?³ÇíuñKâ·ÇxCàïÂïŠß³ìÙð÷À~$ø—Eðw€uŸ|!ø›ûZø“Ç>ŸÆ:íìv‡ãü;ñ—À·ún™¨\Ú^ëöM¬ÝhjpxcÄòhýì¥ÿÿþÖôôï‡ÿhýâÂÅòé¿< þÊÿ³ÁÙ¼qáÑ&Ùnü!{㟅~5]S1­—ˆ4›;/hSê>Ö4m[Púú¼ö‡ÿgìÿÿgýÿÅÿ×þËïÕà?´?üƒ?gÿû?ïø&/þ¼oöX¥-Ÿ£ú~¢Š+ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ øâ7ü¥3ö8ÿ³ÿ‚•ÿëEÁ'ëïêøâ7ü¥3ö8ÿ³ÿ‚•ÿëEÁ'èïê(¢€>øÿ)LýŽ?ìÀà¥úÑ_ðIúûú¾øÿ)LýŽ?ìÀà¥úÑ_ðIúûú€ (¢€ (¢€ (¢€ (¢€ (¢€ øþ Wÿ&íðçþÏûþ ?ÿ¯LýŽ+ïêøþ Wÿ&íðçþÏûþ ?ÿ¯LýŽ(ïê(¢€>ÿ‚•ÿÉ»|9ÿ³þÿ‚OÿëÓ?cŠûú¾ÿ‚•ÿÉ»|9ÿ³þÿ‚OÿëÓ?cŠûú€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>ÿ‚OÿÊ,ÿàšŸö`?±Çþ³·Ãšûú¾ÿ‚OÿÊ,ÿàšŸö`?±Çþ³·Ãšûú€ øþ ?ÿ(³ÿ‚jÙ€þÇúÎßkïêøþ ?ÿ(³ÿ‚jÙ€þÇúÎßhïê(¢€ (¢€ (¢€ (¢€ (¢€ øþ Áÿ(³ÿ‚•ÿÙ€þÙúÎß«ïêøþ Áÿ(³ÿ‚•ÿÙ€þÙúÎߨóöŠ(®€<ƒâ·Ç_‡??°`ñ¥ÇŒ/µÿjK xKá·ÂÿŠ|}©éºörxƒÄP|<ø7àí]Ónµ¿ÚêZÓéˤé×¾+Ѭoo`¼Ö4È.ûx÷Â|'¥xÛÁ:¯öLJu·EòØêZ>¥a©hú•æ‡âøÃÚå¶£á?i>"Óu]/ZÑuKK=[EÕ´{Ý+U²³Ôlî­bùÅÿ¼û<~×_¾+|xñÇ„>ü.ø­û8þÍŸ|ñ'âO‰t_xYñ÷‰¿µ¯‰£á½cFÕµ¯«Àhù~ÏÿößðL_ýxßì±^ý^ûCÿÈ3öÿ³þÿ‚bÿëÆÿeŠRÙú0?§ê(¢°¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯€~#ÊS?cû0ø)_þ´Wü~¾þ¯€~#ÊS?cû0ø)_þ´Wü~€>þ¢Š(àˆßò”ÏØãþÌþ Wÿ­ÿŸ¯¿«àˆßò”ÏØãþÌþ Wÿ­ÿŸ¯¿¨¢Š(¢Š(¢Š(¢Š(¢Š(¯€à¥ònßìÿ¿à“ÿúôÏØâ¾þ¯€à¥ònßìÿ¿à“ÿúôÏØâ€>þ¢Š(àø)_ü›·ÃŸû?ïø$ÿþ½3ö8¯¿«àø)_ü›·ÃŸû?ïø$ÿþ½3ö8¯¿¨¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(àø$ÿü¢Ïþ ©ÿfûë;|9¯¿«àø$ÿü¢Ïþ ©ÿfûë;|9¯¿¨¯€à“ÿò‹?ø&§ý˜ìqÿ¬íðæ¾þ¯€à“ÿò‹?ø&§ý˜ìqÿ¬íðæ€>þ¢Š(¢Š(¢Š(¢Š(¢Š(¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾þ¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ€??h¢ŠèÎ4¿Š­ñwÇí¬õ„ñO€~|+ø¡¬_ÏodºÎñ{Äÿü)á«=2ê=A®fÖ Ô~ø­ï£–Ò"ƒPÓšÞâêI®b´>üPÐ>.èž0ð}ž±/‚eÖ.,|ã;ë{+}â†oe§ÌŸþ<:„·:·Ã‹½FçQµÒ5{«k(5ø4V×ôÕ<'ªxÄÏÂ?fÿ‰jßV¾6Ö>ü'×?eŸÙÇR’_†Ñx§Áß)³ð·‰nü £xÄ~6µðþ³sàïx³Äº‚ü-®ø¦ :æ_hÞ%ñŽá=~ïÂ~ºÕ–Ò ÝN×BÖ®l-§–ê 'R–$³› ¢€? ¾~ÚßðQð”hÚWì?û ü;ø›ðóûŠ?~1~ÞŸµÃÏŠ.µïí{]>îëJÔÿà“o§ü@ð׈Aá?ÚÅ? ¼Sᯄ_·2| ø=ãoxƒFð_À¿ŒÞñ¦£eðö¡ñN¥¨ÛxgLðW†“â%•ßÁ_ÚXÕŒz­—ÁËíWÅ×7Z.¿ðÄŠ’ø_âσÀ>Þ¢Š(àÚ[áíMÿ Mû9þÒß³O>|Oÿ…aðö°øã_|søõñöÿ“€ø‹ûxûÞ(ð¿ˆüû3|MþÚûü36½i}cwa¦ÈÍgqoy7“45àÿmoø(ÀøEômWöý~"|Mø‡ý·Âï‚¿oOÚ‹âÅ?ˆwZöE®¡wm¥iŸðI´Óþø×Ä(ð>“¬x÷ÆšŸ…þxSQø‡áè¼eãÁ¬Ø\MõÿÅÚÇz§Žõ߀_²ï?áb|ZÒ?³4ˆÿ5õÑæýœdícÄú>ŸâÉñÔ/Ž´o|Iø/ÃûÿøHtφþŽ÷^¼‹TðŠxë[øMá/ˆ^øˆýÿÀÏÙóGø-ÿ Gˆ5?ü@øÛñâö$>>üboKñOÇ:?„?µáøá¨>øÂþðw€<;e¯k£Gðç…¼7 h0ê>(ñ‰î4ë¯x»Åþ!×À=Âw>)¼ð·†®üu£xÞ6ºðþsãxOĺ<-¡x¦}:Ú_èÞñޱá=ïÅžµÕšî -NëBÑnoí Šê}'M–W³‡ ¢Š(¢Š(¢Š(¢Š(¢Šü¢ñgí›ûthŸ´ÿ‰fÛOØãö`Ð¤Ô ÿ‚‘~Òš'ƾ:ýžb…¾ Ò¿iÿØÛãWŒ|má?Û«ãÇÅOé¾ý™¿k‚´—ˆl<5à cþ Åá;OxƒRÒ~ÝévQ]xH¶ŽçYŠâ{µŠGýø£ð»ÀŸ< ®ü6ø“¡ÂAá/fOsm§¬xXÒµë‰|'âïø³ÃZ…ž¯àOˆ‹t}[ðçˆôKí?^ðæ½áý;\Ðõ?WÓì¯`ùþ_бWüKþ.ÞÂÍý‰¼?û»ÚoÄÞ>ñˆ>:þÍþ½ãIÒÿj=+^ðäÿð³~xcìWº‡Ç¼S?Š´}ÄÿÅŸ jg†>%ü»ûúŠçü'âÏ x÷ÂÞñ×|Káÿx'ÆžѼYàïøOYÓ¼Gáox[Äzu¶±áïøkÄ:=ÌÖšï‡ïô›ËK«+ÛY¥¶º¶ºŠx%’)ÏA@ þÜÿ~)üqø„~ ÛxPø›áÿ±çÇ? hÿ|aâ/‡þñü3/í}ð/öÖ|/®øÛ¼W¨x[ûWÃÿ u]:ÖúßÚ¿Ùï5;y%³x¬¾ñGö—ÿ‚ˆüð&»ñ'âOì©ûøÂ^þÌ‚ææø(ÇíEâ cUÖ~Ïž;Õ"ðŸŸøOã—ü‹Ç¾ð׎¼ û.ÿÁ8|iàŸxFñgƒ¼cá?ø*'Çø[Åžñm¬x{ľñÿ§šÓ]ðýþ“yiue{k4¶×V×QO²E"9ý¯ˆ|YðWâgÀx—ãGì±âxoYñ³ãŠŸ°ô×_t¯†µ¿j7:×Å_‰?¼KâM*Êïà¯í?¬jÆÛ[ŽÆ÷Å?ügâñ ž,Ñ<+ã/ˆþ"øÝ €wÿ±Á_þÍŸ±‡ì‰û:xêÿÃú¯¾~̾ øÇTðÖ£}ámKÅ? þøOÀ¾!¿ðÕî±¥X]Þx~m[B»’Ê[«+™-¤‰ç´¶•žú~¼ƒà¯Æ¯ |qðµþ»¡XxƒÂ¾$ð¯ˆ.¼ñKáoŽ-tí/âgÁ¯‰š^¥jÚ×Ão‰:.“ªßÚYø‚']Ð5+í7PÕ<=âoxŸDñ‡ƒõ¿ø7Ä>ñ©ëôWäìŸá/ø*gì¿û,þÍ_³Oü3ìãøg€þÂkÿý¢|5ÿ ‡ü*_‡^ðü%ðŽíµøGÿ´?áû_Ø~ß}öOµýŸí—>_œÿ§ß~(øà¿5߉?ußøGü%áÿìÈ.n`Ó5k®±â cOðׄü#á økO¼Õüwñ^ñn±¡èžðæ‰c¨kÞ#×¼A§hz¨jú…•”ÿ ®ø»ûdÄ×ö”о ~ÏŸ³œ¿ñ'ŸöÕu?‚ž"ñÇ]?ŸÄR~Ú¾4øu¨xÃO¸ðïˆ,´ø´¯†ÿׯ×È?·ü‘ÿÙßÁ>?õ¾?fªúú€ ðÚþAŸ³ÿýŸ÷üÿ^7û,W¿W€þÐÿò ýŸÿìÿ¿à˜¿úñ¿Ùb”¶~ŒéúŠ+ó‡öïýª|YðæãÁ¿³·À-O±øûñK§ŒüYie¦ø—Xý˜~M¥xÒ)þ>Ïá­M¹Ðï|a¬øã°x7áþ›â’Þÿ^Õµ'†¼wá†>=ðÔ˜o°Çìýûtø/öý®ÿmÙgÀÞÖûèÿ—ZøÁ6¯¤ßxCâ—>/j?tøwáÜ:?Ú#¼Ñü⟂z§…uíBk仇Ç:?‹|)y¤i·>’ëUûš¿¿à”>ðŸÂ¿Úëö¯ø_à-+ûÀß ÿa/ø&'€¼¡ý»RÕ?±¼'àÿ‰¿ðRŸxsJþÓÖo.o5³húuœ>}ÝÄ÷3y>dóK+<ûÛM«6€(¢Š@QEðÏíÉûtø/ö´ý˜|GñÂ:Æ¿à?Úö§ðÇìßâïéZ¾“¤Ú|Ð|Lø¬~ÇPÕ€ø‡ÅŸðSOø&Sâ_øëþ ûø/ÆÞ ñ³á?ø;ÅŸµÀx§Â~)ðæ£s£ø‡Ã^%ðö±ãØnô/XjÖwv·¶WPÅsksk,űºþÁÿ³ÿ¤•þÀ?ø™³·ÿñƒ¼YûWþÌž#ð·‹<-â=:çGñ†¼KáícdzZk¾¿Òo.íol®¡–ÚêÚêX'ŠH¤t?ÑG³óü?à'ü=ƒö(ýŒç%?m?Ùšçþ¯#öEø‡ûS~ËZ^ÿuDñíðËáþŸÿSÏí|G ÿÍq½ñïü[®ƒÅŸðWŸØ_öœñO‰~xWöÿý˜?gŸÙóÃÞ Ö|?ñKöƒÕÿmÙ»á¯ÄÏŽzv…¨Üø{Zøgû(iúOƵñ—¿Þø“Jñ-‡ˆ¾+kšo„õXü=§Új†ºÞ7ðÿƇ\Ý{??Ãþaü.ÿ‚‡ÿÁ> øBømðÛþ ûøÂ^þÓžÚÚÛoàwˆ5WXñ±¨x—Åž.ñw‹*~ÃÓ~Ú_±¦•ðÏâv·âíFçZø«ñ'à‰|Iã+¿‚¿´þ±«mn;ßXü#ñŸˆ_Ä2x³D𯌾#ø‹ãv‚k?ð_oØ_âá?|ý¥füPñχîgñ7Œ¿h¯Ú+önðWÁ¿ÙGQ‹Å>%ðV£7Æ]ÿ´&wûAx‚ÏVðÄ7Ñü=ðsQñf•â¹4/^_øÿÀ¿ þ#x3âÅï7EÏÏðÿ‚Ð?mø#ÇÀøJ5+þ ‡û üDø›ñûoŠ?¾1~ßß¾!üSø‡u ÿkÝiö—Z®§ñ)4ÿ‡þµñŠ(| ã¶â xZƒ¿ ?kØÓâ/…¾'O®iÞ,¾¸ñÿÁ¿ÚK\øûῇ±| Hþ|Gž ¯‰šïÂï[Ûhú¯‰<áŸüBøsá¿ótQìüÿø z'ÂïÛGþ —¨øïBý£¿iø*ìã¿ÚÇûNóÂ~Ð?oìãû5Zë>¡áÛo | øw¬üJÓô|@Óü%âhúŸÆ-gÃVüWÄ_YÛI࿇zö™ð«Âÿ_ÃØ?à–ô’¿Øÿ#övÿç_Ÿ´Qìüÿø ~ÃØ?à–ô’¿Øÿ#övÿçGü=ƒþ gÿI+ý€ñ2?goþxÕùûEÏÏðÿ‚èü=ƒþ gÿI+ý€ñ2?goþxÔÃØ?à–ô’¿Øÿ#övÿç_Ÿ´Qìüÿø ~ÃØ?à–ô’¿Øÿ#övÿçGü=ƒþ gÿI+ý€ñ2?goþxÕùûEÏÏðÿ‚èü=ƒþ gÿI+ý€ñ2?goþxÔÃØ?à–ô’¿Øÿ#övÿç_Ÿ´Qìüÿø ~ÃØ?à–ô’¿Øÿ#övÿçGü=ƒþ gÿI+ý€ñ2?goþxÕùû_äS(òÛ[Ü™K–Ú^çûøWÀ?ðVùEŸü¯þÌöÈÿÖvø_WÀ?ðVùEŸü¯þÌöÈÿÖvøRQùûEW@úgˆt j÷Ä:n®hú¶£ábx®ÃLÔì¯ï|1¯ÜèŠí´?ÚÚÎòhºÄžñ?†µ(ínV)ßOñ âÆm®íåÓ!j~Ó¼]ãËwØüeøÙÿ ­ñLñÞu§ß~̳¿Ä ­cöQÕ´çi¿4ðÖÿø¾ãáÅÏ \\ø·àwÆ]3L]_^ø/ñrÓDÖ4 |GÑô¶¿´M~ÞÞoR²Ö´»…Ñü[á­w[ðw‰ ¿ðψ56óö£öEý¦t¯Ú«á øù|9ÿŽ|/ãü-øÃðº}~ÛÄZ‡Ã_Š~Õ¤Ó5½ êÂÂòûÂÆ'‡ü[à½STÑô GÄ¿þ#xOųh#Óþ|*ý§¾XhúˆõþÏÞøâKë/ˆ^ ±Ðì/u¸>'ü-¶ø¹ñwźf‘áÛ VëÇúV§â¿‡5oêÞñ‚fqº¿Uøåÿ³Çüƒ?hû?ïø)×þ¼oö§¯~¯˜dÏx[Ǿøµã¯ø—Ãþ4ðO?mïø)‹<ã ë:wˆü-âÏ xþ ûOkñ/†¼C£ÜÍi®ø~ÿI¼´º²½µš[k«k¨§‚Y"‘ý=T¶^ˆŠ(¦EPE|ƒñÃþ.?Çς߳?‰ÿÒ>|DøAûB|]ø—á¸?sÿ þ׌ÿf¯xwᇌgmÿÚ5/ø^úÕï‰tH–øI?áÓt-bêëÁ÷Þ)ð׉<ãá6·û!üøïaðŸàσ¾#þϺuü4ág‡¿dÿ¿fO‰ü£ëþ9›ÅÚˆõ_zo‚o~#ÚxáÏ…®½áÍzÕ<_áûXãÔåñM·‡üúè-ùñþ {àj_¾ OûCþÈ>ð7ÀO|YðW‹eøËE¶ý°¾#ÿÂñg‰¼ñ\ð}ûüa³³ðWŒ/µ ø†ëÀž ºð~¿ÿ †áö¾ñw„¥ñÄëà_Gø«ûLþÓ~oÛ·â/†ãøcðwöÖ/õKŸkžøâO‰4 þÉ_ÿioø ~Ãâ¥|Ök~â¦ÓükÊxžÔÜø6ͼ-,Þ3ý5¢¿>¿iŸÛ@øeñv?€Öß´Oì³û.ø§LøqáO‹ºÇÄÚÎîËPÐ!ñ‡Ä/?‰þ5ø;Ã:ÿì™ñßà¯ÀýG\øEÿ‰¼-Ç?‡ߊ|aâøtk«­CÁÓê·£xÆI4û.ëÀúèé­ùõûF~Ó^1ð7Ä»¯‡ø½ð#ྷ¦húN«áßøãáGŽkÚ'ö²Ö¢’{ï|ý—ÿgo¾ñ§ÃôýbÒëTksPÔn¼7â«ËÃ~ð”#ñ^?ìñ[þ¿ÇÏ|pþÁÿ„Wþ/ü‹þ «ñ[þíOíÏøFÿábxÏöíñöö×öuŸöÇØÿ¶>Ïö¯²Zý£ìþwÙ ßå èíñO~!~Ó~*ý¦üðྵð#À^ðÀoþ |Pøñ⦿&¿ñSâí)àÛ¯YøŸ¼m}£Ï§|Ò¯cÖÄ6“è³é7M£xŠ?E}á/8ø/ûOü|ñµ§ìgñkǺG áwíÉý“eà¿„~°ñž¯ãðþÍ??i_ø—ÅõŸYéßþÑáß„·–7º§Ã¿ ÿfÞü@‰ ñ¯†žëÅ£´WäÞ¯ûxxÇGø‡áiÄ%ÓµŽÿ ¾ xßö\ømðóÇ?þ.ü½ø¯ñ—´û?ÚCö®øKñs\ðÀÿˆú~«â™õË^𥮟«jžÖþxOÄž$¹°>9—¯ÐÿiŸÚmô9þ5ø–?|ÓÿmoþÉ–ß4? |@»ø—âý÷öóÔÿbï |OŸâ…ÿÄ4¯‡:Æ›>«£ê:‡WÂ~)ƒ[O]Omâ/·‹"Ó¼úkE~}~ÑŸ´×Œ| ñ.ëádžþ/|ø/­éš>“ªøwÀ¾8øQãŸÚãö‰ý lµ¨¤žûÅ_?eÿÙÛão‡üciðãA}?X´ºÕÇ\Ô5¯ øªòçDð߆¼%ˆüV|>ý¦~.þÔZ›o€Ñü8ø3âŸþË?³¯ígñXø»áOüpÐ0ø…ãñ?Æ¿xg_ý“>;üø¨ëŸ¿áñ7…£øçðã[ñOŒ<_uu¨x:}CBÖôoÉ&Ÿs¥Ýx]ä>°Ñô}j hòj²Câoè ü¥ÙE,)©x«Çß~Ó³ø;ö)ý©jo†>~Ïÿ~|›_ýš¬¾@Þ°ñÞ»ñ«Æ^ý¥t}G_ø¡go¬MàØÏàËχچ‡­‡ÕuˆŠû)E|ƒà?‰?4/žøAñÆ„Çü-¿„>1øbÛáO†üg¡¤ÿ…=ã?žÖ¾ëÞ/ñŒuø^¿kÿ†€ÒV×ÄÖþøy·þíÍÔÞ_øH"²ð÷È?~$ü|øÙðö}øûÿ-¿g_ß´üƒÇžøk/†üg¤üjð€|eûf~Í>*øyâÏüNOêZ|a}j|<5¯ÚøWÃöZ ž7½ŠÇÇ^&_ Aqã`×Ê+åŸÚkÄ:úꟳ‡Â]'\Ö<1¢~Ñ_õ?„Þ>ñ…u;ßøæÃÀÚ/ìíû@|qÔì<âÍ:t¹ðf±«j?ôïX±1ë:vâmRãÃz†…âTÑüE¤yÄÿƒŸ¿d /Á?¿f?…>kz‡ÇÙ§á7Ž<=ð³Àþð¾)øãÇíð»àv¹añ/Â~Òì­¼M¬hZwÄ[ísÂzÁë>ÖtÆ·´Ô†µÿxwÄÀ ´WæWØ?i¹ÿhoÛòçྦྷð#Jð¶…ûSxT¿Ñþ(h5ýâ–¾ÿ°§ì_%×ìüIáOé–ß4xôí;JŠ?>“ñ&yçñ•ÅÃx6Þ? EmâÍ ~ÙÞ½ÿ…áûIÿÂöO…Þÿ‚q~Êÿ¶wö­—…tX>>kþñ¿ü67áñ-÷ü%-§j¿Ùø}æèzWÛã²Óõ¯ø…ÿµfƒSó ý¢¿2¾ ~ÝÚŠ>2ü3øe¬~Ò±OÇÍGãÞ±â=žý“|ueâ_ü×ü7ðóÆŸ®tÿj_µ‰>3ü8o x'Äš\¾7¶Ð~Ïm®éÚ 7‚d¶ñ…Àðg¯ü!ø…ûMüuðwƒ¾:x7Zøáσ¿¾Gã_…¾ ñ7ÃÿˆÄ¿…ºü 7‰¾øÿÇÞ*Ò¾)C¥|^Ö&ü+'ˆü§i~ ƒLOjZgÄ­e¼-m¨øÈíj+âŸø'V©ñwÄ?±7ìÇâ¿t‰~)ñ—À‚þ.°ñ%†¼O¡kí x‡á/‚5+[oˆzÇŠþ$x–çâ'Äs¨ÏªÜjþ&Itx5yïÖUÐtùV¸ðŸ|xøùâÏü=øCð?Ãÿ³Ã?øX>0ÿ‚¥k^'ñ6½àêº/…¿á–ÿnï |%Ñ|_§|8ð‡Ž´_øX>0ñ_ü'úµ×Šâ¸ñ‡¾×¯øºëÆ0ê‹ý™/„¼Fú™E~Mø×âïí7ñV/ØgQøuñ#áǯßþÚßµoì÷ñ1õ†ßÿÁ6þ |Yñˆ?g Ä_¼!ðo⇾$ò>5hºíׄ>Ö¢¿>¿fÛ@ø›ñvO€×?´Oì³ûQx§Søqâ¿‹º?ÄÙ2îËOÐ<1 xÄÿ¼â_|OðŸ<{sáb]GâO…/|;¬Eâàñ â++@“ÂÖ×Þ+ý Š( Š( ¿È>¿×¿È>³©ÓçúÔéóý÷ð¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾þ¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ³4??h¢ŠèÎ<ð¿@ð‰þ1ø¯G¼Ö.ußô¿Š+‡S¸²šËO×ôŸ„_ þ ÛYøz;]>-4vð·Â \IÌ·sBúúU¸[imí-xÿ_³ŸÃOÙÊ/‰¶ -u'@øŸñ/‰w^¾Õ¥Ôô^Û|4øoðªÃÂ?-.có<+ðâÇÂß ¼9‘ ¤²éú´ -7ÃöšN¦üãûdøãg„t»O‰¿¿k¯Žÿ ñ?ÇÙ3áz|<ð÷„?e-kÀÞÐ>1þÑ?¾øÎóC¸øû3ë~ “Xmƺþ©k&¡¯_Áo¬ÜFâÝô¨“J_|/ð?‰ü ^hþ+øÇñãv£s¬\jpø¯â†—ð‹I×ôû)¬´ûXü=gmð_á_„4§ÑážÎææ9.4Ùõ>­p²ßKl¶–ö _0þÖ~Ó¼ià/„¾Ö.|Ag¤ø³öÞÿ‚oxkT»ðŸ‹-|9¸ðqð»ãïÇZF—§Ûx?áLjtë=kJŸKÓ,O‡¼1㟆ž;ðªø†ÇÁG]¿öjýÿ‚ƒþÍ~&øÓðÓDø©ðwGþØý¦føMþ#|ðÜ>ÐGÆÄÔü«é1ý•ü]ãnúÃþÏxïËðÔÝOª[èÚ~ü?ñÞ»§xŽËÁ#ÃÚ—æ·ƒ|eáïxzÏż¸»Òîî5]>hu +Wðþ»¢ë¾Õï¼;⟠ø³ÂÞ"±´Õ<ãÄúV±¤kº¯ge¬hZÆ‹}¤jö6Z••Õ¬*2ºóþµ§¢Š*€(¢Š(¢Š(¢Š+€øƒã WÂöþѼ%á¿øN>&üOøàÿ„ß ¼šÎ˜|Wãïj©ck6©y¦hÚ¦¡¦xÃþ‹Ä>.ñ¶¯¦hÚåðóÅ*]SƒCžÒNŸÄ>!Ð<# kž+ñ^¹£øcÂÞÑõ?ø—Äž!Ôì´]ÃÚ‹e>¥¬k𿱩O¶“£ÚiÖ×7WWǼòK,‰3²¿à?³çˆà¹ñOí‹ñÂþ ðÅ‹~¸øsð§áŸŒtÒµ‚¿³†~ ø¯TðΨÚˆ¡߃>'üV¶ÿ„+Æž=Òî­¼5{§ØøoáÏ€üQáh|QðÂ÷[ÖfNËÏ ðNŸ…¿¿fY¾ê^"Ñü_¨üý¥ÿnŸ…þ,ð÷€ô…šŠ/~þÜ´W„.¼E¡ü1ð¤¥|8Ñï§Ñä¹µÐtÇ}?G‚æ=>ÍšÚÚ"~å¯ýž?äû@ÙÿÁN¿õãµ={õ5²ô@QE0 (¢€<ƒâ·ÂŸøO¿°|Oá{þ‹þþÔŸá§Ä¸4¿í¯ì_í¯ìæñƒ¼cáåÔl¿á>øA¯ÿbè±x—ÃRÞÙ}·ûMÖ4}K@ñ†áo臀¾xúoi_¿hˆžø¹ãŸýº†6~øg­|%ø_ðëû[M¼Òµßé^ñ'Å?^jõVÕ´yüK{¯MýŸáË™´O i¾‹]ñ¼þ/ú:Šù_Ù·ÇÚ^¥â?xã_ü ?³¯|aãOˆ8ðàÝj?V^$ø›âÍgÇÿ4Ï…´^—ñ*Æ_†¾ñ/Žu½oR¾i¼5­x³F“Ç^"Á^0ðšÿÂ|xçöSÿ„Óá·íéð÷þÏìßømßøL?âoÿ¿Û?áYÂYû(|*ý˜?ãÃþ(¿á4û?ü+/íÏõúO›ý·ý™û¯³h\}}E|ãñ'à箼}?Åÿ€ÿ Ö¼câA?„4/Š~ Ôth^"ñÿŽ›MÔ´ÿ[Ù\YxÿYµ×ômvx¼1{áƒÃŸ³×ü#Ÿ>üIˆÞ0ñm×Âß„¾jsøöoøHüYãÝkãïÄo€ÿuÏê¾$‚âÒÏÃßeÖ> _Gƒ¤hÖZ·‹¡Ó|;aáÝ CÓ´côuò±ðãVñ⿉> |wð‡Ãoüyñ†‰ãߊ~ ø!qñâ†âË…ÿþ j¯Á¿\|XÓ<;àì|<øSà¹ôÈ|Køáý½öøXŸ>ü)ÿ„cû/ÉþÇÿ…5ã?ÚÅÿÛßÛ_Ú/ý¡ý¥ÿ ßìÿeû$cÿ„WÎûM×Û¼«? ð7ì§ÿ_ÃoØ3áïü'ŸÚ_ðÄ_ð‡ÿÄßþ±ÿÂÍÿ„OöPø­û0LJü$RÿÂöøY¿ÛŸëõo+ûû3÷¿iþзúúŠüâ°ý‹~5AðçàÇÀKÚWÂß³÷ì÷ãÙ“YøsáÏþÏ—&xƒãN­§x§í~øsg©¨ø_ÂÞ ¹›ÄqiúÕº[hÚŸ‚õÏ_ÿ†Sÿ‹1ÿ ‹þÏù»ïøjÏøHáÿ«øÿ†áÿ„û'þ/û•ÿµ>ÕÿQ¿ìïù„W×ÔPÈ:ÇÀ?Z?ÄoŠþ$ø1ñß ¼ñçÆ'~(Yøƒà…ÇÄoŠ?‹,>ü;ø)¨j¿üyqñcLððóáO‚çÓ ñ7¼omgâ4Ô5=JoG»‡Ãv,ê¾Ö?c-à_…~xŸâ>•ñÁ¿²ÏÀŸÙÏÄ? ýˆ¾;þؾ4ø;à5—‰´í×Sø[û4x×þ_ƒ_ü;­ø‡_Ôìnõ gJе-/ㆣ§ñæ¡£CwàÖJ(ó‹àwì§ñcÂ_>øŽ/ÂûOxGƵ‡‰tüPð¿†þ)AsàÚßöŽ×¾:ø³áïÇ_|*ñ…t-gÆZ§Ã+ÝfkZ%–•ã_‡q§†õÍKÀòjº?Š=Þ/ÙÓ_¿Õ>ø¯Æ5xÛágÇ|~ñž­}¤ÞÅ x»_ñ/ìíñƒö|<ð„Þ)žÛà·Ã3Nø£§\iu¬º´æ4ºýïˆ|Y¯xƒÆzÔÔPÈ>9ý”ÿá4ømûz|=ÿ„óû7þwþø›ÿÂ/öÏøV_ð–~Ê ¿føðÿ„Š/øM>Ïÿ Ëûsý~“æÿmÿf~ëìßڇğƒž>ºñôÿþüDð‡Ã/Š:÷„<7ðÛÇ—?~ë_üãOø/Zñ‰ü þо)ø7QÐ|a¡x‹Çþ:m7RÓüAoeqeãýf×_ѵÙâðÅï†>Ž¢€>qðçìõÿçŃÿ_â7Œ<[uð·áÇï†Zœþ=›þ?x÷Zøûñà?ÄsÇ:¯‰ ¸´³ð÷ÙuƒÑÁ é5–cmâètߨxwBÐôíù±û#xûNðŸÂ»?…ÿ¼!á¿ü%ý¯¿iÚ³Cñ~ë_<'¨ÿÃEê_µtºŸ€õ_ø{ã'†/û/Gý©µ Õ!×áûMσa»“NŠ+Ù,­¾í¢€<ƒã¯ÂŸø\ÿn<½ÿƱcã…ÿ|%¯Ë¥ÿoiºg¾ |PðwÆO‡“øÃ鍨Ëâ?ø ÃÉ­i¶ºŽ“{¨é2^ÙXë:=äðjvŸ üHý‹~5|tÿ…‡¨|ký¥|!ªë3ýjoÙFÓ>~Ï—ð„4ßÚWþ<òüKƒCñÆŸëºßŒ,n¾¼z•­ÏŠ“ªÙcC¥XøbóOÖµ~ŽÑ@A­|)þØøùðÓã‡ö÷Ùÿá]ü øáð§þì¿;ûcþ/Œÿg¿ÿomh§ööoü(³ý—ì“ý³þ¯;í6¿aò¯>YÔ¿c?‰rxcá§ÁmöƒÑü3û2|øû;øãáÛoƒjáðÇìëñwá×Äï|ñ߯ _âDÖÞ+øqe§xhúEÖŸá} Åð&á›ïø«Å³éþ)Æÿ ´Pœ|Pø_ |UÐ,ôZóXÐ5½X·ñW€|}á[‹+ü3ñÍ…–¡§iž6ðN§¨é÷vÖÚÄZv­«ØÝÚ_YßèÚæ®êžñ&—¬økYÖ4{ÿ ð÷Á_‹¾*×ô=[öœø­ðãⶉàcLñWüð³à¿‰þ xOé7°j:¾%éž.øéãËŸˆúLJõï Ú Í/FÑu—o]ézljt¯ëúšŠø¦_ÙÃ㿇þ)|xñ¿Â¿ÚcGðG…¿hψþñ¿Œü-­ü Ñüm¯ø -à‡Áÿ‚O¨üñ|Þ<°¶Ðþ#Ýiß ®¯æÔ¼]¢øãÃ)8ðü0x*8ô¯?Œ¼ãáOÀ‡>&ñ÷í/ð¾Ëá—Œ4ÏÙLþÈ?³—ì#e¡ø¿Hø¡à/íÍ7àÆµû^x{âƒ<1©øàiÞ$ñg„-¾|_ø{ —ôË‹½'[þÛ–Mĺ•þ©Égú;E|ãà/…_¬¼Y¥k¿høY>ð'Û“áÖ‡á/‡÷õ-râÿM¼ðññOí©è>>¾Ó¾2øÂÜL-­´mÁ V×5-u¼&£iàÉ<ð‡àOÄ¿ƒ×¾ð&ñ“G_Ù“áfƒð¿áE·ÂÈ¢ø—cá3@›Ã¾øuã¿z¿õ o|8ðöx#ÒŸá=Å󧃼2|Gã?Ïoâ™ücõ5óì›ðsÇß³ßÀ?†ÿü{ñÂÿáRøCÁÿ ¼â|3Ö¾y¾ðƒ<9áÁâYø§âÏí7ö-åÅî¥iw¦Ù\hE 5ŸÙÞ[ž?áWì§ÿ ËâOƒþ!Âyý·ÿŸü7§üJ?áþÍûü6ïíaàoÚþ?ÿá"¸û/ü#ð…ÿaÿ¨—ûkûKûOþ%>Oö|¿_Q@ k²7´ï ü+³ø_ñ‹ÂñÏÂ_Úûöý«4?x÷àþµñÂzü4^¥ûWK©øUð_‡¾2xbñÿ²ôÚ›P‚ R~´Üø6¹4袽’ÊÛÑüUð'â]ŸŽ|mâŸ?4„wÆcJ×¾8Yk "ø£¯ÝøŸGðw…þÛ|Eø-®êž7Ó¬~|G†¾ð®™1ñãÏ4þðþ£ƒ"¹ÿ„¬x¿êj(Â< ð6ËÀ|_ñ3Mñ.±¨éÞ#øû>ü °Ð8GÔú™“P3ø^KûÍKR¹Ôå6¾Aaû&kþýŸ¿d/…¾øŸ£Ø|JýŒt‡P|8ø‰â¯‡w¾%ð7ˆõÿüñoìÝ­ê~6ø[¤|CÑõ ÍPøñ Æ—6–6.ÓçÓu™4»¹µNÆÂïLÕ>Ö¢€>Ó¿c¯x«ÄŸ|kñïã‡ü'Þ+ø»áÙ£FÓ®~|4Ó~迼Yû)üXø«ñ‡áO>é:÷‰ü]-ßÙ$|2ðLJ¼¥lëwíûøöòÏíÚnäøOá_íuð?â‡u_´j·E'Ø< àÿ_y #\Ýg}–ʛɠ·—èêø¦_Žÿ´ß‹¾)|xðGÁ€K]NóÄž+ø9à‹›aõ5X¤±M&â ³·¸]Fi.¥¶´ôzðÚþAŸ³ÿýŸ÷üÿ^7û,W¿W€þÐÿò ýŸÿìÿ¿à˜¿úñ¿Ùb”¶~Œéú¿ lƒ±þË?4ÿŒ^³·Óg/ړǃ|má}ÎëOÐ> ~Õþ,¼øâiþ5j·~f™¡x#ãµsá j‘[]hp¯ÆðÍÝŽ‡â¯ümñv»¦~ëW?âÏ ø[Ǿñ/|uá¯øÓÁ>4ðþ³á?ø;Åš6â? x³ÂÞ#Ó®tøkľÖ-¦´×|?¤Þ]ÚÞÙ]C-µÕµÔ°O‘HèqNÎà<_²·ìŸû,þÔ·Çí}ÿ -û5|ý¡ÿáý`OøB¿áyüøuñkþÿøI~3ÿÁGÿá#ÿ„_þïjðÿhÂ? ý»ìžOÚÿ±,þÑæ}šŸ§ÿðéÿø%Ÿý#SöÿÄ7ý¿ùÜ×ÈðM/Ù¯ãÏìÏûm~ÝÞø¡£ü@ñ7ÂÏþÎ?ðOO…³Çí3ã«“«ê_´×< ¯~Ûž%¾ñ'‹õè¯®ã¹øßáë‰Z†ür&žÖóZÕ´8¼áÇ^Ðìÿoh“»oúØ€áÓÿðK?úF§ìÿˆoû;ó¹£þ?ÿ³ÿ¤j~À?ø†ÿ³·ÿ;šûúŠ@|ÿŸÿ‚YÿÒ5?`üCÙÛÿÍðéÿø%Ÿý#SöÿÄ7ý¿ùÜ×ßÔPÀ?ðéÿø%Ÿý#SöÿÄ7ý¿ùÜ×çüö#ýŒ?fÏÿÁ:;k>9ðŸŽÀ² Ãé› šÞч‚>!|MÒµB?„uxGZð¿‹¼ñ‹]}ú¯ýþx/öeø!ðÓà?€&Ö5 ü5𽞄=k´í¾¿4±øŸRÐüCñWľ9ñ«ªëAâKcµÔuiç²ÓïìmàŽ =láLþØß²/¿j¾ø¡ûT~Î? üs ý‡ûsÁ~=øáðËÁþ,Ñ¿µ4Û=gLþÕðïˆ|Omy§}§GÔtû¸<èSζ¾†x÷E,nÞíáïè.Ð4?øS\ÑüOáoèúgˆ|5âOjvZÖâZ²ƒRÑõÍXÓg–ÛVÑîôë›k‹[«yd‚â ˆåŠGÕˆÅxíÿ ÏÙÿþÏûþ ‹ÿ¯ý–+ß«Àhù~ÏÿößðL_ýxßì±J[?FôýEVQEQEQEQEQEQEQEQEQEQE|ÿ`ÿ”YÿÁJÿìÀlýgoˆÕðüéÿ(*ý†¿îæõ°ÿh*ûûþ Áÿ(³ÿ‚•ÿÙ€þÙúÎß«àø5ÓþPUû ÝÌÿëaþÐT ªôš?(¢ŠQEQE ¿ðn?ü¥3þnÿ³þÓÿõ¢¿oÚþ¾«ùÿƒqÿå)ŸðswýŸöŸÿ­û~×õõ@—êÿ6QE (¢€ (¢€ (¢€ (¢€ þAcù\‡þ ÁÿfðçÿPoø&¥_Uü‚þÇò¹üƒþÌáÏþ ßðMJ÷^¿£?¯ª(¢…Q@Q@Q@ ¿ðeoü¢ÏãçýŸ÷Å?ýgoÙZ¿¯ªþAàÊßùEŸÇÏû?ïŠúÎß²µê½æëêŠ( aEP_ ÿÂûdÃ|ÿÂÁÿ…±àøwÏü2ü!¿ð£?³láiÿÃdÂçþÛÿ…±ý¯ÿ Óí_ð€“ÿ‰?Ù¿á1ò?´{ÿÏ™ÿJúú¿0¿á2ýÿáóÿð¯¿áSü@ÿ‡ƒð¿á2ÿ…çý¥}ÿ ³þßþ³ûþ?öGü,¿²ÿÂÀÿ…Ùÿ´ÿÂçÿg~ëþo/þ%tú{_ þÞš¯ˆ´_Ù?â¶§á?ÛWÀðNÿ[ öÛâ…~xÛÀŸüï‰>·ºþÝðÇÆ­KðƧÿ ”·>µþÓ¿ƒÈ¼ñµ½Å—›¨Ci Ÿ_WÀ?ðTo ü ñì)ñËß´·ì¹ñÿöÑø'¨ÿ³ÿ„×öiý— xÃñiúN³o©ê7j:MÌWW÷s¬—{ýðüƒþQgÿ+ÿ³ý²?õ¾#WßÕðüƒþQgÿ+ÿ³ý²?õ¾#PçíQ]~YøkãÏŒþ |gÿ‚Œ^hß²§íñßú?íá_ê¾"øÿ Xû?öìûK}á?Á~=øóáßø«Æ c¥Å<6Z.©}»ûbÒÓN–óQy¬ ú›öMÐïGƒ¼qñHO£éþý£¾#ÜþÐüá¯è-ðÇÃ_xûÀÞ‚;Kñ?ƒ5;¯ëºÇ‰õý_ø‡âKŸMu¡Iâÿ!þÏÖ|Yoø‹×üð¿@ð‰þ1ø¯G¼Ö.ußô¿Š+‡S¸²šËO×ôŸ„_ þ ÛYøz;]>-4vð·Â \IÌ·sBúúU¸[imí-O…ÿ ô„Zçƒüy¬Eà˜µ‹‹ïx2úâÊã@ø_ \Yið§Ãχ‰ŸΓðâÓQ¶Ôn´"êæö  i´ ´¿ é~ðþŒèõà?´?üƒ?gÿû?ïø&/þ¼oöX¯~¯ý¡ÿäû?ÿÙÿÁ1õã²Å)lýÓõQXQEQEQEQ_0|jý·?cÙ³Å6ý¢ÿk¿Ùƒàµ_Úø³KðwƯ¿ ~ø§Rðµö£ªèö^%°ð÷޼Yawyáùµm \µŠö8ZÚKî•¥¶™È?áìðK?úI_ìÿ‰‘û;óÆ ¿¨¯€áìðK?úI_ìÿ‰‘û;óÆ£þÁÿ³ÿ¤•þÀ?ø™³·ÿÙÿ|SÿÖvý•«úú¯äþ ­ÿ”Yü|ÿ³þø§ÿ¬íû+P.«Ñþhþ¾¨¢ŠQEàñ”ßðÔßó@?ቿá@ÕEÿ†¦ÿ†¦ÿ…‹ÿ„—ü(øT¿÷1ÿÂGÿPÊ÷úüÂÿ„7ö7ÿ‡ÏÿÂÁÿ…±ñþ ÿÂÿ„7þgöm÷ü*ÏøcøjÏí¿ø[Úÿð­>Ëÿ þgüIþÍÿ ŸýûßøF|¿øšPéí|ƒûzx7öÈøû'üVðüûâÇ€>~×:·ü ßð©~(üQÓluox_ì|©øóûwOÔ¾x ¶ü2²ñžk¿ÃšŽËÍZÞEû#ªßÚý}_˜_ðY~Æÿÿà›_´‹¿à ? þ |qý‘´ŸøTð¶¾|.Ô¯´Ÿø£íÿ¾ižþÂÔ4߉~žßì_o|¨Ýlñ¾ÏI¸¾ÖŒÖ@?ë§ãÐû{ö{Ѿ2xsàÀÿ~Ñ~,ðÿh= áÃMã·Ž¼'mŸ…¼iñ“Kð^‹cñ?Åž´µðÖ‹¯‡õ/A®^YE¤ÇµäHše‚k¯×̱³ðoı‡ì‰âÙÓÂ~ ðìù®þ̵Ÿ>ñeÌ÷ž)ð_Á½SáO„ï¾xOÄ·w^%Ö¥ºñ›à™ô;;ÙdÖui$¹³•ßS¿bn¥ú~€ øþ Áÿ(³ÿ‚•ÿÙ€þÙúÎß«ïêøþ Áÿ(³ÿ‚•ÿÙ€þÙúÎߨóöŠ(®€>ñ}ÅÿŠŸµ×Å/…þý¦~/ü ð7ÃÙÇölñü)ð¿ìãªlø³â¿ÄßÚ×ÃÞ)ÕuíOã_À?Þ>Ýàï‚ᵂÊâÊÚ&æG†YnEú›áüOàóGñ_Æ?ˆÿµbãS‡Å4¿„ZN¿§ÙMe§ÚÇáë;o‚ÿ ü!¥> öw71Éq¦Ï¨õk…–ú[e´·µùgÅÿ±÷ÂÿŒÿµ×Å/Šg¯„ü 7ìãû6x ᮹ñ[À~$fx³Âk_üNÒ´3ÅV7מÆãß…“]N-í­µµ[G×Ré×Ú}}à/‡¾øWá=+À_ üá†þÐ~Ýý‡à¿xkEð„ôoíMJóYÔÿ²¼;áë+k=;í:Æ£¨]ÏäžuÍôÓɺYdvëëÀhù~ÏÿößðL_ýxßì±^ý^ûCÿÈ3öÿ³þÿ‚bÿëÆÿeŠRÙú0?§ê(¢°¢Š(¢Š(¢Š(ðö¢ÿ”¦|vÿ³ý‚ÿõ¢¿à¦TÚwíEÿ)LøíÿfûÿëEÁL©µ´~óüØWæWß‹¿<ûC~ßš?…?e¯Žÿ´ëŸÚ›ÀzœÞ+ø_âÙ“IÐ4ûÙ¿aOؾÖO^[|hý£4ø7¥ü)ðÃx–ÒëÃZ,¶¾ Ô¼‡y{š6“$w7’£é– ¬_OÐ_ÿÁX?åðR¿û0Û#ÿYÛâ5}ý_ÿÁX?åðR¿û0Û#ÿYÛâ5~~ÑEÐË?µ¿íM ~É4Ÿˆÿ…uÁ©ë+´ÍòËO–ß@øiðkâ¯íñ3S[›ÐË6±Áß‚?[B±(k&mEÔ5JÔoüI£}M_œ^1Ñ~>|cýµ ~ÈÅßì³â‹­C½ðý•þðËKÑn~øª{ ëC¬x›ödñÁj0Ùê×ðXj;ºÓ&6…î“§€}­^ûCÿÈ3öÿ³þÿ‚bÿëÆÿeŠ÷êðÚþAŸ³ÿýŸ÷üÿ^7û,R–ÏÑý?QE€Q@Q@Q@€?µü¥3ã·ý˜ìÿ­ÿ2¦×Ô_µ?üûãçÆÚ›]ý¥¾þÓŸ>Â[ðàÏÀÏø+â·ì³ã?ŽÞoü)oˆ¿´G´_h>#ð‡íeðóû#íŸðÐÚµ¥Õņ¡øG-®!¼O:XWÇÿáÜ·Çý?ìƒÿŠéøÏÿÓ6­c$’Mþ}ÀóÚò†Ÿ á]øÏö„ñö÷öÇü/‹ú/Åoìÿì¿ìÿøE±þüøýƒö¿íÿ·<ÏøS_ÚŸjò¬öÂIö/³?Øþ×uõü;öøÿ£çýñ]?ÿúfÔøÿoú>ÙÿÓñŸÿ¦mOž=ÿþ@|/}û,èô_´§ˆ¼U¬<~;ü6ý 4KÿYÙhúÿÂü!øiû8øSáÆ±¡ÝjÇSÓüQ¬hÿ?fÿ ø®Ôjº\Ú5Ô÷QèÚÎ…«iPÞE©ãê³o¾-øâÿ‚ÿi¯ð›ÂÙøAñà9³øàÝkàg€|)à‰š,šW‹|A§ø ÅŸ¼yÿ 'Åû6‡_×uRËI²Ñ-,¼;¡hŸÚ>1ŸÅß ðî?ÛãþŸöAÿÅtügÿé›Qÿãý¾?èùÿdüWOÆþ™µñïø?òóž/Ùóö‰ñÅ/€ÿþ6þÑ_~κ§Â½Å—¾(ø!ñƒàÍÛøÇSñ¿ÇŸê­¬ið|PŠïGŸJ¾Òôø MfÏXÒ5ËKEÔü+Èj_±ŸÄ¹<1ðÓà¶ûAèþý™> |Gýüqð¿áÍ·Áˆµ?‰pøcöuø»ðëâw„>xïã¯ñ"koü8²Ó¼4}"ëOð¾…âøFðÍ÷ˆüUâÙôÿÇãÔøwíñÿGÏû ÿâº~3ÿôͨÿ‡qþßô|ÿ²þ+§ã?ÿLÚŽh÷üÀüÿ—ömñö—©xÁÞø×ÿìëãßxÓâŽ<£ø7ZãU—‰>&ø³YñÿÅM3áGí¥üJ±—ᯄ~Ýß¶ì·ð‹ötýº~/ÿÁ>ümáÏÙƒöÕøª|fø+'ñO‰¼-¤|Výƒ<3{ðÆý< ñÁWcÃ÷º·‹ô=VS&«ql.|hO–S ͧEÿãÿÁS?éfïÛûÿÿ´OÿGí~Î~ËðOjm ö–øáûN| ø»ÿ—ÀŒß<1௅?²ÏŒþù_ðº~"þÎþ>Ö¼Q¯xÅÿµ—Ä?í±ÿÃ<é6–¶6ö~á#¹¸šñü˜¡oÕêÎNíµýh+/?½¯Ôþ¿mÏø wü‹àçìaû]ü]ñ×üAûo|lðO¿كãïÄüñeÇ„ð·Å¿ xáO‹%}cöÞÕ­Ãúþ“¥ÝéW¦ëJÔí…¶«)ŸO½ˆ=´¿³¿ðk§ü «öÿ»™ÿÖÃý «ïïø+ü¢Ïþ Wÿfûdë;|F¯€à×OùAWì5ÿw3ÿ­‡ûATŠÖ'Õ¾«¹ûùEPPQEQEü‚ÿÁ¸ÿò”Ïø9»þÏûOÿÖŠý¿kúú¯äþ Çÿ”¦ÁÍßöÚþ´Wíû_×Õ_«üØQE (¢Š(¢Š(¢Š(¢Š+ùýŽ?årø+ý˜ßýA¿àš•ý}Wò ûÊä?ðVû0‡?úƒÁ5(ÝzþŒþ¾¨¢ŠQEQEQEü‚ÿÁ•¿ò‹?Ÿößÿõ¿ejþ¾«ùÿƒ+å?ìÿ¾)ÿë;~ÊÔ ªôš?¯ª(¢…Q@|ÿ ·üm3þÇü0ÏüØü&ßðòßøDêâ¿°¿á†á<ÿ…]ÿsÿöGü&¿ôûÿ·üÅ«ïêøþŸøÚgü,ønoù°øBáÚ_ð—ÕÅnÿÃsÂÿ GþäíøB¿éËþŸù„ÐßÕòíéã/Û#áÿìŸñ[ÅßðOï„þøãû\é?ðƒÂ¥ø]ñGR±Ò| â·üIðv™ãÏíÝCRø—àø-þÅðÊ÷Æz®ÿéÛï4›x×ínËauõõ|ÿFñ7À¯~Ÿ¼GûK~Ôÿbï‚zwü+?øMioÙsÄ1ð·Ç_†ßkøÃðúÃßðƒkÞð7‰u{íŸÝh:§öM÷ÍѼS¨CqökY&»·úö{Ö~2xàÀÿþÑ~ðÿ€¿h=wáÃMgã·|'sç…¼ñ“Tð^‹}ñ?Â~»µñ.µׇôßO®YÙK³«G%µœNšú‘u/¯×€~ÉúŸ5¯ÙgöjÖ~|QøñÇá–­ðàÞ§ðëãWÅCXÕ¾)ü`ð%ÿï]xGâĽWÄZ—¨jøöÞÖÖúîÞò_øF.e[ G+øÿü>ö"ÿž¿µ÷þ+Gþ SÿГ_þÔ_ò”ÏŽßö`?°_þ´WüÊ›ZF ¤õì/ø|ìEÿ=kïüVü§ÿ¡&ø|ìEÿ=kïüVü§ÿ¡&¿+ü{ûVü øwâÍWÁ:œ_üYâ/ý†/Áðwömý£¾>é¾Ôµ-6Ï\²ðï‹|Cð7áGˆ´ï øÁü;ªhz¡Ñu»mY4Ÿé:¬–K§jÚmÕ×»x{Ä:‹´ Å~×4ø[Äú>™â x“ÃÚ–µ x‡@Ö¬ Ô´}sCÖ4Ùå¶Õ´{½:æÚâÖêÞY ¸‚â9b‘ãubùŸáþ@}µÿƒýˆ¿ç¯í}ÿŠÑÿ‚”ÿô$Ñÿƒýˆ¿ç¯í}ÿŠÑÿ‚”ÿô$×Ç´Qȼÿòì/ø|ìEÿ=kïüVü§ÿ¡&ø|ìEÿ=kïüVü§ÿ¡&¾%ÐüC xžÊ}KÃZæâ:ÛXñ‡®oô=NËV²·×ü#¯ê~ñ^‡=Õ„òG±¥ø§EÖ4ÝFÕ˜Oe¨i7Vw1Åso,I±G"óü?Ȱ¿áð±üõý¯¿ñZ?ðRŸþ„š?áð±üõý¯¿ñZ?ðRŸþ„šø;áï|'ñSÀ>ø¡à-Wû{Àߨø»Â–÷×QDðZOâ}:+‰#’öÙe9Ÿáþ@}µÿƒýˆ¿ç¯í}ÿŠÑÿ‚”ÿô$Ñÿƒýˆ¿ç¯í}ÿŠÑÿ‚”ÿô$×Ç´Qȼÿòô‹àüOöVý¦~)Ÿ‚¿ õÿ‹ðüMox§â§†¾+~Ê¿µoì÷ý­àOø‹Àžñn» ë?´ÁO iþ!þÎñÄï[ÝZØÝÜ^Eÿ =´­oä%O·«ðö]ÿ”¦| ÿ³ý½?õ¢¿à™µûýYÉY´À?ðVùEŸü¯þÌöÈÿÖvø_ÿÁ®Ÿò‚¯Økþîgÿ[ö‚¯¿¿à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾ÿƒ]?å_°×ýÜÏþ¶íH]W£üÑûùEP0®âÇÅ|øYñ/ãWÅwþ†_üã/Š?|Ký™¬k_ðŽøáÿ‡u/x»]þÆðîŸw¨jßdðþ“¨\}–ÂÒêòãìþU­¼ó¼q7_ÿÁX?åðR¿û0Û#ÿYÛâ5yÿü>ö"ÿž¿µ÷þ+Gþ SÿГGü>ö"ÿž¿µ÷þ+Gþ SÿГ_ÑZò/?Ãü€ü†ÿ‚*þÑþý’oŸø.ŸÆ¯Úáwí}ðÿá—íû_ÙüQý›üKÿ ûpx¯þ7"øÏû_x²MwûÁ?³Ö¥¨xCø£à[²ëÖš]áþÜò…¹žÖò+èïþûÏ_Úûÿ£ÿ)ÿèI¯h£‘yþä~?ާß_ ?ਟ±×Æ/Šß¾ xGÄô¿ˆŸu{Ãßôÿбí¥ðC@ñ>¿áŸxÃ↳¡ÙøóãOìûáýßXÀ>ñž§­Æ§ ÷0xzá-cšeX›ô¿œù=ßø%÷ý÷Å¿ýv·ü¿£ê‰+;QE QEQEùSáïø-'ìâíCñ_…ö"ÿž¿µ÷þ+Gþ SÿГ_Î'ìÓûGøKáÿü³ÿÿ‚€ø»áwí}¤þÈßdü.ø]ñkþ+öà¿ÿ„£ÇzO…?aý7PпáÓ?g©üO¢ùw¿þ"§ÚµÒÍÿáÝÃ%݃]~¼ÑWȼÿòÞ_ðß©öü>ö"ÿž¿µ÷þ+Gþ SÿГZ'üÓö×ë¿þ5ëºÇ‡>øsXð7‡µ CÃÞñïĽ~}â_|1ð¿Àz‡à?…þÖµÿë§¼gá2Ö×LÓ.çiõhÝãHRYSâø|ìEÿ=kïüVü§ÿ¡&ø,'ü™¿öwßðMýyOì“_ÕÆ)«»îØ_ðø?Ø‹þzþ×ßø­ø)OÿBM8Ÿðlíá/ø'ì ñwà¯í‰ð»ö¾ø?ñ7ŵÿ¾(è^ÿ† ý¸> }»Àš×Á€Ó5ßퟅַ߳§Ûy¾ ðO‰íþË5Üw‰ý™æÉnOo,߯4Ur/?ÃüƒÏúÖßä}…ÿƒýˆ¿ç¯í}ÿŠÑÿ‚”ÿô$×°|ÿ‚‰þÊß´ÏÅ3ðWá^¿ñ~‰­àüQ´ð×ÅoÙWö­ýžÿµ¼ àŸxÂ~-×tgö€ø)á?Ä?ÙÞ øà+{«[»‹È¿á'¶•­üƒ$©ù»Ný—å)ŸìÀoOýh¯ø&m)A$Þ ~ÿQE˜~aexwþ?ý·ÿ UñþßøvöWü<[þ¯Šð«?áÿ†¬û_ü1Wü!Øð„ÿÂÀþÓÿŠëûWûSþ¯ìïô?ìÿìôšý=¯€á&øëÿLÿ„7þàü37ü0ü$ßðÅ_ðx;þ›þ¯ü4WöWü5ü"¿ðƒÂAÿ þÿüRÚð“cÂGþý…ößø˜PßÕòíé¥x‹Zý“þ+ižýмÿñÏü ß`ýŽþ(ø«ág‚| ñƒÉø“à닯íßüjÐ5O iŸðÙEsâ›_í; üûÏÛÛÙyZ„Ö“Gõõ|ÿFðOü,_ØSã—ƒṿáÛÛð¬ÿã5á.ÿ„þ¿öƇگü_ð´|ý•ÿ Øáÿ‘›Móÿá;û7úgýŸvôÿì÷k¨Øüøe¬|ðÿìÙ«Yü øikª~ΞÕ|-®ø[à£oà½ß‚¾×< ai¢k>ð­ÊK¡Y]èÖ¶ÚUͶ…Úu¼6 këõà²~‰ÿ×ì³û5xsþŸü5ü#ÿ> èŸðÒßÚÿðÃCÿe|:ðå‡ü/?íïøJ5Ïí¿øK|íÿ¶mëiÿ„ƒÎþÔÔ7ý®o ¾ÿ‚°Ê,ÿà¥ö`?¶Gþ³·Äjûú¾ÿ‚°Ê,ÿà¥ö`?¶Gþ³·Äjüý¢Š+ ø¡ð*/ëö~7ðÄ߈ÿþ%E£ÛøWUøðŠ/†—ÿŠü g{¨júw‚|c¢|\øoâÏø—G°×õ=FÿG»ºÑ_YðüúÖ³ªiv>&ñM¦·±ð§àî›ðÃû{X¾ñoŒ>)|Gñ‡ö\^6ø½ñ$øNOx¯MðçöŒ~ðìðøÂz…á¯h¶º¶ª4Ý@Ñ4&+Ý{Y×f²ŸÄž"ñ³«þekž!ø=­~Ó¶~›ñ»\ÿ‚‚êÚ„~;ø ÃÞ°ýœõ?ø*ÿÃO xçö?ý–üWý‡kkûÎþÑu‰T¸mZÂÕãÕòìÝëÀhù~ÏÿößðL_ýxßì±^ý^ûCÿÈ3öÿ³þÿ‚bÿëÆÿeŠRÙú0?§ê(¢°¢Š(¢Š(¢Š(ðö¢ÿ”¦|vÿ³ý‚ÿõ¢¿à¦TÚwíEÿ)LøíÿfûÿëEÁL©µ´~óüØ þÀ_òe³/Ûäpÿ…Aáø[_jÿ‘“þçØþþ/›þ•ÿ þŸü,/øM?´ÿâuÿ göÏöçüN>Ý^Añ¾ø›ûPþÏß ¼ ñ+Æ ø-¬ü ý¿¼iñ¿³ÄíKá^‹ãïŠ ý¢ÿdí+ÄÑx¯Å µ [Gñ†™ñoÆ¿¯5{ÝUѼGý¾úÞ“¬j3išÏ‹tMkèÿþÊ_>"x³Uñ¶§/Åÿ ø‹Äa—ijüý¤¿hï€Zoе-7M³Ðì¼Eâß| ø¯áÝ;Å^0Oéz–u­FÒçV}'ÃZN•%ëiÚN›kkèú_†š¿ðûÄšƒ´j? >x—áËoG.ƒ x7á§‹¯~ßë~Ðü)¤M•i£´ÿ~-ª‹2ú|ŽÛO{[k‹¸®(ϯ‡Ÿ¼}­é¿³/ìg{ã]|iøEñ~oþÓ~0ĺÔ_¼GðŸö6ðŸ~#i¿îÃâφÿ¿á/øû¦þ×Ú6±¨þÑÿØúí#àÚMÔe ¼'ñSãü"_³g‹ßÙzçã´ñGöÿxÃágÃ/ß‚Ëskâ]GSñ„^"¶¼…>(Eõ7ºþ™ûDüný ¼máχÔ|g£øoáï´ê7¾-½mÂú¦»&½ñÄ~$Õ¼ Iá߈þ9ðµ¿ÁÄÚ®©¾Ÿû/ø. ¼[â;m7H¶ðþÇü2oÀïøO¿áb`øÃíßð˜ÂÂÿ„'þ÷Æ/øQßðŸmÂWÿ Çü3ü'ßð¯¿á0ÿ„÷þ*¯í?øF~Ûÿ üV^ü%?ñ7 ÿ‚rü+ðÇÿ„¿/ô Sâ>¡>¹ûS~ÚZì~:øÇñwâ”^ý¶iO èSèúoÄÏjöÞÖ.4åëzŽŸ®¡â]C:·ˆîµ]T›Ã±cá]Kö’ø¿ûLÁâ‰_üÿ ãñÂß ¾ ¯Á߉Þ,øm¦øzãPýœ~üw¾øâß hÚÑþ4xÂ_üakS¦xóNñG‚£Ò|¤ØÃá(ÿ´¼c7о޸]ð+áÏÁ­Kâ§ðú߯oü,ßkþ=ñF¬üPø¡ãO Ûø³Åž,ñW޼Uªø/Á^6ñŽ££ü3þÔñ¼K¨ê0xnÇI¶¾¹¿I.¡—ìÖ‚ гOÁ¯ŒzýŸ‰<á½cPÔcÑíü3®Ûhž=ø‡à­â?ƒ­/u ûOüið§‚·âu‡Ãž3³×´( ñ¯ˆ-£ÓÖÛÄÔWà–/µÿþÌŸ°ßÁÏ èßþ(Oáïø'×ì}ã;Ÿ‡¾1^þÊ:€µÿˆßï<-à?Š?´?íáÏŒžñŽ·ðâùþøÂÇOÐ|¤xž} ø£\ñ7„üYªÞü8µÒOÙËÂzÇÅŸÚ3öDñOÆ-wâ:|@ø{ðãþ “à•²ð¿í#ñÞó@±²ý–¿à¢Ÿ~ü3𾫮ÙkÞ“ãFgáhàÓ5½WÅZ3j ðþ•¨üB´Ö5 >ÀXþŽß~Æ?n4‡žÒ4ˆþÓ¾|8ð— Üü"øÿû@ü×åøià '°ðƒ¼câ¿„Ÿ4MWâN¡Ás«6޾$¼ÕŸKŸÄÚÍÍ‹Ás­êòÞšìYû7øF_„rxÀºÇÈ>ëu…ú_Âÿ‰Ÿ¾è‹ãĽâÿį ^xsÀ>7Ótÿ|8Õ> xsA¼“š½µÿ†màÒ-ôÛM&ßJ‰,ý~^_×ä_——õù~q~Õ^6ø»ªü4ý«¿h_„šÇø“à.ûHëþ øïsûHxŸöjý—<ìÙ/Ž´;¿xönømñ'Äwß´Ä |Jðf«¯oñ[Àþø‹ªø{ÄÎÞ-Ó~Ïà Çû‡_ üBý„f/ŠŸðœYø÷Áž0×¼)ñ#þY|ið·þoÇ]/àv³©xÃí·^"ñü(MâU·‚´ï\ø›Q¼ñ'öÕ¦ƒ­Œfÿ„Ú Ø¼\©­/×ÔïÙwþR™ð'þÌöôÿÖŠÿ‚f×ïõ´ïüàü“öÏý–ÿgOÚ/ÅßüàŸþ̶¯Æ­/Tø+¯ø/Þ)¸ñO‡>+~Áž²°¿½ñ×€>üjðv—âωï¼-©x§á_ŸxëÃÖ%²Ñÿf» »ÏÍ«hV‘ÞÅk}es%´’¤vÒ²LŸ³¿ðk§ü «öÿ»™ÿÖÃý ªE­õ][õ^Hýü¢Š((+àø+ü¢Ïþ Wÿfûdë;|F¯¿«àø+ü¢Ïþ Wÿfûdë;|F ÏÚ(¢º(¢Šàl?ä÷à—ßöwßÿõÚßðP þ«ùÁ°ÿ“Ýÿ‚_Ùß|[ÿ×kÁ@+ú>¬§¿Ëõ`QE@Q@Q@(?ðOù0؃þÍöjÿÕ1àºþ¯«ùAÿ‚|ɃþÄöh?³Wþ©Öëòý@úúŠ(­+Àhù~ÏÿößðL_ýxßì±^ý^ûCÿÈ3öÿ³þÿ‚bÿëÆÿeŠRÙú0?§ê(¢°¢Š(óþ ÿ&E/ý÷üGÿ^Sû$×ǵöüþLŠ_û;ïø&þ¼§öI¯kXlýÈŠ(«§~Ë¿ò”Ï?ö`?·§þ´Wü6›Ný—å)ŸìÀoOýh¯ø&mLþýu÷úŠ(¬@+ó þ/Øßþ?ÿ ûþ?Äøx7ü; þ/ø^ÚWßð«?áÿá«?±?áSÿdÂËû/ü,ø]Ÿñ8ûOü!Þöwî¿á&òÿâW_§µòü!¿¶Gü7Ïü,ø[ÿ‡|ÿà ÿÂÿ 3û6ÇþŸü6Gü.í¿ø[Úÿð­>Õÿü)?ø“ý›þ#ûG÷¿ðŒùŸñ4 ¯«àø*7¿á]~Ÿ¼eÿ 3ÿ'þÇÿ…gÿUÿü'ðº?´>0ü>Ò¿äUÿ…]ãOí_øG>Ýÿ gü‹:—‘ÿ'ÚÐüŸí O¿«äÛÓUñ‹û'üVÔü'ûjøþ ßâ oøA¾Áûb|Qð¯ÂÏxàÿñ'ÁÖ÷_Û¾øÕ¯é~Ôÿá ²–çÂÖ¿Úwðyž6·¸²óum!¿ý“õ¿øIeŸÙ«Äð£?á—ÿá øðo[ÿ†iþÈÿ„þãûWáׇ/ÿáF`ÿÂ/¡ÿbÂ%çÿ`}ûGû7ü#þOö^Ÿ³ìûýyì÷u¨ß|ø{¬|jðÿí'«^| øiuª~Ñ~Ò¼-¡x[ãî£qà½kß^Ðü w¢hÞñUËË®ÙZh×W:Uµ¶»:uÄÖ‰ ëôWÀ?ðVùEŸü¯þÌöÈÿÖvø_WÀ?ðVùEŸü¯þÌöÈÿÖvø@Ÿ´QEtð•„?k¯…ÿiŸ|/ø[û8üHð7Ç‹þø­¡ê^=ý¤þ&ü(ñfý—û8üø)©è:¯…¼=û%xÆÍöëu Ø.¡ÖŸÎ¶Ö¡I-­åŠEo©¾êŸumòçãGþxÅ)¬\Aa£ü/ø©â‹Ú΀¶Z|–ºç‰5x“Tø+/ìÁ§x[Þø­ãOŒ^ðe…ýïÇ¿ÚkÀ·w¾ ŸVøã¹%‹O±½¶·¶ŠÑå»YnD)ãÿðöÍOþ‘±ûáAÿäÿé…U.n—·•À?áÒzŸý$ŸöþÿÂþ ÉÿÒõ£þ'©ÿÒIÿoïü'ÿàœŸý/Z?á횟ý#cöþÿƒþ ÉÿÓ £þÙ©ÿÒ6?oïü(?àœŸý0ª=ÿ?Äþ'©ÿÒIÿoïü'ÿàœŸý/Z?áÒzŸý$ŸöþÿÂþ ÉÿÒõ£þÙ©ÿÒ6?oïü(?àœŸý0ª?á횟ý#cöþÿƒþ ÉÿÓ £ßóü@?áÒzŸý$ŸöþÿÂþ ÉÿÒõ£þ'©ÿÒIÿoïü'ÿàœŸý/Z?á횟ý#cöþÿƒþ ÉÿÓ £þÙ©ÿÒ6?oïü(?àœŸý0ª=ÿ?Äþ'©ÿÒIÿoïü'ÿàœŸý/Z?áÒzŸý$ŸöþÿÂþ ÉÿÒõ£þÙ©ÿÒ6?oïü(?àœŸý0ª?á횟ý#cöþÿƒþ ÉÿÓ £ßóü@?áÒzŸý$ŸöþÿÂþ ÉÿÒõ£þ'©ÿÒIÿoïü'ÿàœŸý/Z?á횟ý#cöþÿƒþ ÉÿÓ £þÙ©ÿÒ6?oïü(?àœŸý0ª=ÿ?Ä`ý›?à›þýž>>XþÑz§íGûOþÐ>6Ñ~|Gø+á½/ãT_³áox[â·>øëÆwö_?f_ÝÞø‚}[àg#Š]BúöÚÞÚ+´ŠÑe¹3'èõ~pþÍŸðRþÐÿ,gMSö\ý§ÿgïk_>#üjðÞ©ñª_ÙƒQð·ˆü-ð§ÆŸ| ã; ߀Ÿ´×Ž®ì¼A­ñÏÀ’E¡cemqm-ÛÅvÒÛ_ôz“¿[ßÌ€à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾ÿƒ]?å_°×ýÜÏþ¶í_ÁX?åðR¿û0Û#ÿYÛâ5|ÿºÊ ¿a¯û¹Ÿýl?Ú º¯Gù£÷òŠ( a_ÿÁX?åðR¿û0Û#ÿYÛâ5}ý_ÿÁX?åðR¿û0Û#ÿYÛâ5~~×ç×íùâŽú~Ègöv×5‹Oˆ?µ6£¨Éà3SÑô›/ŽZÃÿÙ+ö«øµ©~Ïž!ÔãIþXè1ë:Œwx_PÕ¬|Y´º†ƒfè-xGÅß…úÿ¾ ~Ë^+Ñï4{m;àÇüPñ\:Åì7º†«~ÌŸ´gÁ{k?Gk§ÍÞ°¾)ø½á«‰#¹–Ò§ØßJ· s½¥×@ ÁCÿi½Ä±6¯¨~É¿õx§ãoì³ñƒö›ðoÅÏZÞèzÿƒÿfÿ„ l>*x«â>‡eâm6ÎæÏX×5üð¬QO¦x¯ÃÓþÐ1øËL¶’Oj1CúÉ_™ZÇì!¯ÅðÓþ 3áO xG:ÿíeðãâÿÂÿ„³kÚ½ïö>‹ |O—ö„øÐ/>"ɧø@O§kþÓ¶í ndÓ"Ô Àzƒ"û=Lj-u˽SôÖ€8ù=ßø%÷ý÷Å¿ýv·ü¿£êþpl?ä÷à—ßöwßÿõÚßðP þ«)ïòýXQPEPEP_ÊüãþLö ÿ³Aýš¿õLx.¿«êþPàŸò`ÿ±ýšìÕÿªcÁu¤:ü¿P1ÿà ·ãý™î¬>|PÖ> üJñ?ÇØûÀ¾ø§¡éñkW¾ ½øƒû`| ð5α?‡.¯-í¼]£;Ä7‘j:%ì«§ëz}ÅÖ“¨±¼¸FÈñ/í'âψ³OÃÛï‡Vßð­h¯ÚÆ¿³g†´?;Mñ—ü(ÿÚD»ñLJ¿hkŸí=sBƒBø—ÿ †×áOÇŸl¸[Çÿð¤?²4;÷oèÒ\û·íð¿_ø½ðÿÃÞðÕæc¨é?ÿe¯Š3k—¶ÖO |ý¦þ|hñ]œXi÷R6±qáoëútmÁ6¡skÍÅ¥³Ëwœx;ö`ÿ„[öÂø¡ûI_ÎÑüaá ì(_ùš”>ø‘¡| ðÆ_í{áøâ‹Âxö3ý–eðÇ“-ìz¶½ñõ_>ÎëÃéZ±û x‡_ñwìMûø¯Åzæ±âøŸöYýŸ¡âŸ„?>|/ñ-ÿ‡®/nô íÀ?ü=áMbóCºÔ´ûK›]GI¹{Y.--gx6–Þ D°~Ðÿò ýŸÿìÿ¿à˜¿úñ¿Ùb”¶~ŒéúŠ(¬(¢ŠüÁÿ‚ÂÉ‘Kÿg}ÿÑÿ×”þÉ5ñí}…ÿ„ÿ“"—þÎûþ £ÿ¯)ý’kãÚÖ?_òó+öÍø½ñ/àÇí7û2ü@ðïŒu;àïÃ_µ§ÅïÚWáüDt|ð—ÄØãÁž/ñާ ðÜɱðïÂß¼Mñ Å´« ßk|;Ô|£$mã¦cöéø½ñ.ÛÇŸþ| ñޱà¨<ñßö&øûEkz‘[Þêß >/þÙÿ >|7ø#;\ÃÌz?õ¾/kŽ¥£^NöšìçuáØ +ÇÖ²Kõ÷ˆ~ëú·í7ð‹ãEµæŽžðÀÚ3á~±a=Åêë÷:ÿÅ׊ü5y¦Zǧµ´Ú<wÁ¥ô’ÝÃÙµÕ—„-æÿ…}û&~É¿Ÿ]ŒZ .ëâ.µ­¶Ÿq¥øjæÂ-6Àý5§~Ë¿ò”Ï?ö`?·§þ´Wü6›Ný—å)ŸìÀoOýh¯ø&mLþýu÷úŠ(¬@+ò þ1gþåÿ5ÿþgþÿTëþgþgþ;ÿ ßø_ÿð¶¿î\ÿ„sþ¢uúû_ ÿÂeûdÃ|ÿ¾ÿ…OàøwÏü2ü&_ð¼ÿ´¬áiÿÃdÂçþÄÿ…Oý‘ÿ /í_ð€“ÿ‰ÇÚáò?´uÿ 7™ÿºúú¾ÿ‚£xgàWŒaOŽ^ý¥¿eÏÿ¶Á=GþŸü&¿³Oì¹áÿø§ã¯ÄŸ²|aø}áÏøA´øçÃZ½ÿö7‹mtSû&·eåhÞÔ&¸ûM¬sZ\}ý_ þÞž ý²> ~Éÿ¼#ÿþø±àߵέÿ7ü*_Š?tÛ[ÀžûÄŸj~<þÝÓõ/†ž0‚ãí¿ ¬¼g§Zïðæ£²óV·‘~Èê·ö ÿ쟦xEý–f­áwÂi?> 韾 üXÓõ'âŸÁÿX|:ð寄~|KÒ¼E®êš†™ñÃþ‹OÒu›{ýOQ¼ƒQÒnbº¿»d¸“ßëÈ?g½ã'‡>üð÷íâÏø÷öƒÐ¾|4Ѿ;xëÂvÐYø[ÆŸ4¿è¶?üYá«K_ h±ZøRñ´åå”QèÚLqÛ^D‰¦X(±zýðüƒþQgÿ+ÿ³ý²?õ¾#WßÕÏø³Â~ñï…¼Kà_xkÃþ4ðOñf§xÂÞ,ð·ˆôëÄ>ñ/‡µ‹i­5ßßé7—v·¶WPËmumu,Å$R:Áú+ô þ?ÿ³ÿ¤j~À?ø†ÿ³·ÿ;š?áÓÿðK?úF§ìÿˆoû;ó¹­=§—ãÿÏÚ+ô þ?ÿ³ÿ¤j~À?ø†ÿ³·ÿ;š?áÓÿðK?úF§ìÿˆoû;ó¹£Úy~?ðüý¯ý¡ÿäû?ÿÙÿÁ1õã²Å~Àçÿà–ôOØÿßövÿçs]„ÿà™ðMßx§Ã^:ð/üëö!ð_¼â Åžñ„ÿe€þñO„üSáÍFÛXð÷‰|5âÀPÝè^ °Õ¬í.¬¯mfŠæÖæÖ)à–9cGÓVßÏþoQE˜Q@Q@Q@€?µü¥3ã·ý˜ìÿ­ÿ2¦Ó¿j/ùJgÇoû0Ø/ÿZ+þ eM­£ð¯ŸæÀùþÚãRÿŠ“Á³Oíñ?à³ÿ§XþÐl~ ë>ñ„í¹Õ|{à^|mµø‹ñ#ÂG üúdÞð6­sã +H5?Zx«LÕô Í[êox‡@ñv¡ø¯Âšæâ xŸGÓ™ª|?ƒÅÖ6ºt:Lõ»]J€ý”¢¿ þÙê_ ý>þÒ—ÞøÇð3â7„?mmfUÕ|YñCà¯ÄÿxãWÃÛ¿ÙÁwž?ø»à/ß~ÔÿÙ?²íçÅ}[@Ôuý2þÛâ çøÃlž#ºðþã[?8øM¡ü4ð¿í+aá„èíðÿÂÿðYOøgGÓ|=â|G xV÷ÃßðD Gñ'€t9$ÔîãðÞáÏÙkZ ¯‡-^ßOð¤ÃnŸ¥éúE¶›hû‡E~5ø÷âF¿kðóþ ƒã‚ž%Ñõ9ì?à ¿³ÿƒ¼Yâ #â ïƒt ÀÚÁ¯ø'OÃoÚvü`ð^—ªjô}áüí|Wâý:Øë? Ð5m~°Õ|>³[yÆÿøÇá?Â/Û“À:WÁßÙgö`øwÿÊý°|_㿲ÏÄOü@Ð5ÿÝøbÏEøOñgÅ^?²—€¼5ðwXmJøÑ£Ã¨-Ô:ïÄX4ólöúöŸð¾9<.ûçE~}x_áÃO€¿¶ÏÁ¿ üðvà-;âWì³ûWø›â­Î‰£_øÅã|ZýЬ<ãï>+»š]WãÄ{>#üFh|Gâ{Í[]iþ"x‚æMBKoT–ïö5ðÁ[ÿ…ÿ²ÿíãí+Âoí‰ñSÂU‡Å/Š×ÖþøÕñö„“áψ.>=üñî¡kyi¨ø·þÏx[â4S|1ÔãCð$Ÿm-4Ï èIð÷E‡@ý¢¿>éŸï< û&|}Ö¾þË??h?Š¿þèÿi›Ž_¼OûZüRñ=ÇŒttý©¾|CøC£~Ç &µ¬Gáo |_ѵ†ú—‰¦ð‡Ácðñu+VðÆ›ð‹JÕ|5ûç@ý—å)ŸìÀoOýh¯ø&m~ÿWóEàÚàì×ÿ"ýž¼uûEüpøAð Á:¯ìCûuxOKñƯ‰~ øWámKÅ7ß?àœZÅ—†¬‰û:üwÔþ,øûÃÞÓ/|Aã›ÿk_³·íð;S¿ðO„ôèçÆzÆ“¨üdÒ5˽ÄI¬ê:7†uK éúï‰_Gðî¯Ðáï_|+¯èzOí9ð§áÇÂÆÚÆ™á_øûágÆügð4~9Õ¯`Ó´?üKÔü]ð/Àw?5j7Ö6>»z¦­k(Þ»Õ4ê¾ Ñü[õ5~}|OøÇð‹ö¿Òüð—öcø©ðããž·§üwýš~,øãÄ? 5x'þ+ÿE¦x'Jÿ„ƒÄ^ø¿û6übƒÃQ_iºn¥â­7àíð£ã—ˆ|%áÛÝrò×N‡Æ¯‡~êºvŠ5Kí3I}[R²UÕ´9®µ+_œ?hOÿj¯€?f€|!ñ+ã¿ÇO„þØü.Ñ5{uñ÷ÂKâƒ5¯j¾-ý¡üxb×~xCÂWZÁ“ŧÄúfŸ«i×¶iáK='Qñæ© xOWÐÑÚðÚþAŸ³ÿýŸ÷üÿ^7û,W¿W€þÐÿò ýŸÿìÿ¿à˜¿úñ¿Ùb”¶~ŒéúŠ(¬(¢ŠüÁÿ‚ÂÉ‘Kÿg}ÿÑÿ×”þÉ5ñí}…ÿ„ÿ“"—þÎûþ £ÿ¯)ý’kãÚÖ?_òÈ>+|Vÿ„ûÃÐá>ø¿ãïíH>|4ƒTþÅþÚþÅþÎ_xÇÆ>!]:÷þ„öÖ‹/‰|K-•ïØ¿¶´ÝGÓuÿkþð¶¿Èx ã¡ñf•ðçö‡øwá„~9ñ—Û§øcyà/‰š×ů…ÿ²tÛÍW]ðv•ãß|,ð]æ™ñNÑô[XŸÃWº ?Ú¶›[ðÖ¥â´/Áá?ã‡ü[Ÿ¿iÿ£ü øwðƒö„øEñ/Ä~ûþÇü._þÍ^1ðïÄÿÀÛ?³þi¿ð¢5«/ëq4ÿðÿÂU¦ëºÅ­¯ƒì|Sâ_ òß¼ûWü_ý™µŸÙãÇø¹àoÙçâÿŠ~.üNø¥à/è¾.ø_¦ÿk~Î?>h_ 4¯ønöîÏÄ?úNµ>‰dóaøsÃój>%ºÑ%×|iâËîÚwì»ÿ)LøÿfûzëEÁ3i´ïÙwþR™ð'þÌöôÿÖŠÿ‚fÔÏá×P?¨¢ŠÄ¿0¿á ýÿáóÿð°ál|@ÿ‡ƒð¿á ÿ…ý›}ÿ ³þßþ³ûoþÇö¿ü+O²ÿÂÀÿ…Ùÿ³Âcçÿg~÷þŸ/þ&•ú{_ÿÂ3ñ×þ™ÿ —ü2çÀøfoø`øFáµáðwü57ü/_øh¯í_øeÏøJ¿á9ÿ„ƒþü+ÿø«?³ÿáþÆÿ„ý'ûwí¿ñ/ ¿«ó þ /ã/Øßáÿüköñwüá?ÄŽ?²6“ÿ ƒþ×Âï…Ú•ö“ã¿}¿ã×Âí3ÀØZ†›ñ/ÁóÛý‹âmïƒ5­ž#Ó·Ùé7·ÚÑšÂëôö¼ö£ÿ†¦ÿ…ãŸøb¯øPðÓ?ñLÿ´ÿ†£ÿ…‹ÿ +þGÿÂeÿ Ïü*ø¨?äŸÿÂUý™ýŸÿ1Ÿìÿµÿ¡}¦€9ÿØYø7â?ØÃöDñìéá?x ö|×f€ZÏÀŸø²æ{Ïø/àÞ©ð§Âwß <'â[»¯ëRÝxƒMðLúì²k:´’\ÙÊï©ß±7Rý?\ÂøZð«>Âóÿ„þgü  ÿ…Åÿ Ÿþ/øUŸð´ÿáÓ¿á`ÿ´ÿ„Ãþ&ÿð€Â[ý¯ýý©ÿìï³}»ý+Í®þ€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?j/ùJgÇoû0Ø/ÿZ+þ eM¯Ò/ÿðNÏÙ[ö™ø¦>5|TÐ>/Ãñ5¼áo…×~%øSûU~Õ¿³ßö·<â/ø³ÂZ½£~Ïÿü1§ø‡û;ļ{qku}iqyü$÷1-Çc‰<þùûÏ/Úûÿ]ÿ)ÿè¶­#4’Zù®~Ë_³'‰þ%Áñ£Ä¿³ŸÀüb¶Ö<=âo‹çÂ/‡ú·Ä»}Â1ixS\ƒÇwþ“U‹XÒàÑttÓ®–ìOdšMªÛIÛİø¡ðsáÆíÏŸ>ü8ø½ám?X·ñ ‡†þ(xÃ>Ð,uûK-CMµ×,ôéwvÖÚÄZv­ªÛÇt‘,é§qÈ#šUoПøsçìEÿ<¿kïüYwü§ÿ¢ÚøsçìEÿ<¿kïüYwü§ÿ¢ÚŸ:óü?̃¼{ð÷À?<'ªø â‡ü!ñ#ÀÚ÷Ø·<ãß h¾0ðž³ý—©Yë:gö¯‡|Cesg¨ý›XÓ´û¸<è_ɹ±†xöËn¾áÙá…£ü}ð7‰|ðãÇ?~7|Gð'm¾ ëŸ ü17ÃOè¾~Ï¿¼)àX<~—zV¯£ØOðGÕôâ¶Piï}kimf­¦EyqúÑÿ|ýˆ¿ç—í}ÿ‹.ÿ‚”ÿô[Qÿ|ýˆ¿ç—í}ÿ‹.ÿ‚”ÿô[Qμÿóàïü=ðÃ}6]áçü!à-ìo?Jð_†´_ i³Â9á?ø ÃÞmއeR}ƒÀÞð–‹e¹ÙtŸ iÚt]¬1qþýžþü>ðŠ>ø àÂ|.ñ¿ö×ü&Ÿ ¼!ðÓÁžð‹¿á%Ñm¼7â/øJ<£h°iÚÿö‡‡l¬ì/~×m7Úì­"µŸÌ‚4HáÏŸ±üòý¯¿ñeßðRŸþ‹j?áÏŸ±üòý¯¿ñeßðRŸþ‹j9ןáþ`|K?‡´ Lñ]·£Üx§EÑõÏhþ$ŸL²—_ÒtÞø{Rñ.‡¦k@nl4}GQð…./­b• »ŸÃt·É%•³EÈiŸ>h¿üCñ£GøWðãIøÅâíx¯âÆ™à X|Kñ>m‡¶‡âÚéiªëZ3ý‚ÿdÿø(íóû5|ý±>ÿÂàøeáÙöàø£¡xkþŸ‰?þÃã½ã?üßÂzf»ý³ð»Æ:&¡såxÆÞ'·û,×rY¿öŸ›%»Ï¼°ýÿºÁ ¿èÆ¿ófl/þˆýøÿìý•¿foŠgãW½âüßWÀ)ø]iâ_ŠßµWí[ûBdøÆÞ"ð'‹<[¡h:7íñ¯Äú‡¿´|AðÇÀWWV6–÷’ÿÂ1m\yHŸíêÎNí±Yv_qü¢ÿÁB?àÜ_ø#'ÀïØöàøÕð»ö7ÿ„_âoÁÿÙö–ø£ðëÄ¿ðÐßµVµÿïŽþüñ¯‹<#®ÿcx‹ãÞŸ«}“ÄNŸqö[ûK«;³ùWVóÀòDß_Á®Ÿò‚¯Økþîgÿ[ö‚¯¿¿à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾ÿƒ]?å_°×ýÜÏþ¶íH,“VVÑþhýü¢Š(WÀ?ðVùEŸü¯þÌöÈÿÖvø_WÀ?ðVùEŸü¯þÌöÈÿÖvø@Ÿµç~,øà¯þ"üE¿Ö4ÿ iúÇ„<<ïáïxÇÇÚýö¿ãïèü¡è~ ø jšÏˆõKÆ^(Ð4û[]?OºçÔã&1w_G¯nù# ÿ³¾ÿ‚|ë|~ÍUÐaà/Ú·áÄOi^ Ó"ø¿á?xƒíÑxjŒ_³oíð MñV¥¦é·šåï‡|'âŽ_ <;§x«Æ áÝ/\Õ‹§]ÜêϤøkVÕc²m;IÔ®­~ޝoïù2¿Úoì_ò8 ñwü*_²ÿÈÉÿ óì ÿ ñÿ ëÊÿJÿ…¿ÿ Ïþïü!ÙŸñ:ÿ„³ûûþ'a¯¯¨°ÿ“Ýÿ‚_Ùß|[ÿ×kÁ@+ú>¯çÃþOwþ }ÿg}ñoÿ]­ÿ¯èú²žÿ/Õ€QEQEQEü ÿÁ>?äÁÿbû4Ù«ÿTÇ‚ëú¾¯åþ ñÿ&ûÙ þÍ_ú¦<ZC¯Ëõèÿˆ^=ðŸÂ¿øãâ‡u_ì|7ð‡‰|{ãMsì:–©ýá?è·¾!ñ«ý™£YÜÞj?fÑôëɼ‹Kyîfò|¸!–VHÛÂ<=ûdüñ¿¡øvKOŽþ ŸÄZÆ™áí/[ø³û&~Õ¿| Úþ»{“áÍÿâ?Åÿ‚Ú‡ô}cV×ï4Ý+Gµ¼ÔíçÕõgOÑ´Øîµ]BÊÎãþ ÿ&ûpÙ þÒ¿ú¦ÿ†Eý•ÿákÂaÿ GþÇàü,ŸøX_Û_ðŸÂ}ÿ ËÃð˜ÿÂqÿ 'üLá0ÿ„‹ûGûOíÿé¿móþÕûÿ2´?hù~ÏÿößðL_ýxßì±J[?FôýEVQE~`ÿÁa?äÈ¥ÿ³¾ÿ‚hÿëÊdšøö¾Âÿ‚ÂÉ‘Kÿg}ÿÑÿ×”þÉ5ñík Ÿ¯ùä¾:ü9ø¦øOSø‡qãø®ü`<àíÀ_ þ(|`ñg‰â›]ãÄ6þø»ð;ãÀ-^Ð,/tý7Z×<£ütøwáËŸèúf£­xvßXºÑ¢¿ƒFŸÅz4Z¬–rk:ZÞyÇí+ÿ%Ÿþ ñÿg}ã_ý`Û‚Û7þDÏ‚ßØÿòPÿ᯿døW_ÙŸò9ÿÉ|ð?ü.øB¾Ëþÿ&»ÿ ëþ°̃ÿ ö·üS¿Û5`}}Ný—å)ŸìÀoOýh¯ø&m6û.ÿÊS>ÿÙ€þÞŸúÑ_ðLÚ™ü/úêïõQX€Wæö¯‡áóÿØŸðÚ¿?á-ÿ‡ajÿúáø§ÿ ³þßøjϲÃjÿÂoý¿ÿOü,í?ø¡²¿²ÿá*þÎÿLþÐþÈÿF¯ÓÚøþoøÚgü+øaŸù°øM¿áå¿ðˆÿÕÅaà ÿÂyÿ »þçÿìøMé÷þoù‹PßÕù…ÿ—ðoìoñþ µûGøGþ ñcâÀïÙVÿ…Aÿ kâÂí6ûVñß…þÁñëáv§à?ì-?Møiã î>Ûñ6ËÁšuÖÏj;,õk‰숭kú{_ þÞž2ý²>þÉÿ¼]ÿþøOàŽ?µÎ“ÿ7ü*_…ßu+'Àž(ûÄŸiž<þÝÔ5/‰~‚ßì_ ¯|g¨Úïñ¾óI·~Öì¶@?ë¯áÔßýˆôoƒ~ýŒ?dO~Ξ,ñgÍ ö`ø£| ñ׋-§³ñO> é |'cðÃÅž%´ºðÖ‹-¯ˆ5/Á¡Þ^Å&¤ÉÍä¨úeƒkÓõä³Þ³ñ“Äþø‡ö‹ðŸ‡üûAë¿>k?¼ á;˜/<-࿌š§‚ô[ï‰þðÕݯ‰u¨®¼?¦øÚ}rÎÊXõZ9-¬âtÔïÔ‹©}~€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€>`ý·> ø§ö“ýŒ?k¿ÙÓÀ·þÒ¼mñ÷ö`øûðWÁÚ§‹.µ i¾)ø©ð§Åžðõÿ‰ot}*þîÏÃðêÚí¤—²ÚØÞÜÇm¯¥Ìª¿Ì?ðFØ«âŸü»þ µû8~ǵÿx£âoÁÿø[ÿð’ë¿ µ_k^¾ÿ…ñëâÅû Sñg…tMBçÊðÿ´¨n¾Ñ¥Úì¼·¸Ž/>Šâo§¿mÍgà߇?cÚïÄ?´_„üAãßÙóBý˜>>ë?¼ á;™ìüSãOƒz_Ÿ_|O🆮í|K¢Ëkâ KÁ0k–vRǬé2Gsy¦§`À]Eóü£Æ_±¿Äø&×ìáâïø'÷ˆ¿dm[þÿü*_…ßu+í[Ç~ûǯŠ:g?·u Kâ_Œ'¸ûoÄÛ/ê6»üG¨ì³Õ­ã_²"­…¨~ÿÐý=¢Š(¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾þ¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ€??kÎ>,ü&ð7Æï_ü:ø‹a¬jÔ5x…ÓÃÞ/ñ€uûÀ>1Ð> x3\Ðügðÿ_ÒõŸkoŒ¼/ j·Z~¡k:O¦F †2èÞ_ÿÁA|C/†?f{­HkŸü=§\üwý¼=â{ÿ„:ŸÄ½'â]Ǽ]û`| ð§ô?]|ž?K¬jž Öµý5m|8ÇY½MYìôøå¹¸Ž'èÒ<û)| øwâÍ+ÆÚd¿üYâ/ýº_ Oñ‹ö’ý£¾>é¾Ôµ-6óC½ñ„ü=ñË⿈´ï øÁü;ªkšXÖ´ëKmY4ŸêÚTw«§jÚ•­×ÑÕù•ð‡Cý–¹¡ëlñ\é:Ŧ£mmqkuo,sÛÏo±H’"°ùÃÚì}â}CðÞ›?ü’ÛQñ±¦hv>!ñüGÂ:½î­{…¬úçŠüW©Ùi^ÑÒ{ˆÚëQÔï-4û(K›Ë«{h¥•4õ’¼ö‡ÿgìÿÿgýÿÅÿ×þËïÕà?´?üƒ?gÿû?ïø&/þ¼oöX¥-Ÿ£ú~¢Š+ (¢€?0à°ŸòdRÿÙßÁ4õå?²M|{_aÁa?äÈ¥ÿ³¾ÿ‚hÿëÊdšøöµ†Ï×ü€òŒ_¾üwÓ|'¦|C·ñ‡üPž0=ðv±à/Š>ø³Ã~,ÿ„OÅž“UÒ¼kð‡Æ:±kæøCÇ>-Ó§o¾Íqm®MðÉòÇø_û7|-øG¯Þx¯Ã+ñ_ñMÖqáë|]øãñ¿ãî¿ è÷º~¥­h~Ö>:|DñÏ´}OQÑ|;q¬ZèÒØA¬ÏáM]V;É4m-¬þqý¿;é?ü]ûSj>ø…aû9ê´M‡Ä¿èß²WíWâ½Cµµý•§OkZ<~<ðǃu+»]1eÃËy¨Æ4ûK™c?g=örÕ¾%Úßü3Ÿþ Š|1£êÚäQþÑž!ÿ‚ªè¿ .l®"Ãw]i¿µ¾§oàïkûoþ«âü%¿ðì/ì¯øx·ü%_ÿáVÂ;ÿ Yö¿øb¯øB?°?á ÿ…ý§ÿ×ö¯ö§ü%_ÙßèÙÿÙé4ú{_˜_ðY}Wú/üköÔüYûjü@ÿ‚wø~ÛþÛÿlO…Þø§ãoüó¾=|.·µþÂðÇÁ]Kñ>§ÿ ì¶ÞºþÌ¿ƒÈ³ñµÅÅï›§Ãw Ÿ§µðüÆßð®¿aOŽ^2ÿ†ÿ‡“ÿcÿ³ÿŒ*ÿ„Gþ¿ø]Ú~i_ò*ÿ®ñ§ö¯ü#Ÿnÿ„³þEKÈÿ„í?è~Oö… úþ‘ëÿ±Ö}û~È—º?Ư~ÒzMçìÁð ëKý¢üY¥x§BñOÇÝ:ãáO„æ²øÕâ]ÇW÷zÞâ[Çý‰£ý›þÿ'û/OÙöH}þ€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?8~%þÚ¿<ÿ,ýžÿaÿ~Âßü{û>|cøA­|Gñ×íë£MãEø7ðOÅ:^•ñÃP´øcâÈ,¾^èâ »Ÿ…~¶ˆÞxËI¹|[Ó6iò°µSù_ÿ‚±þÙúG‚ÿà§þ&±ÿ‚=~Óúέûü_ðÃÙÓ¶·_†£ÿð·‹þ>ø»á¹ñ;ੇöa–X=Mÿ Ç~6ø§¯üðÆ…ö[…Ï?ĵ|M𾻦}«ÂÑkvp}‡í·éòÃw /ŸåÛúð?ø£ÿý©¼ÿ¦ÿ„sþ ‘ñÿâü<þ×ü4·ö%ÇÄUÿ‡rÿÂgÿ û{þŸØ>_yÿØð¶¼köÏíÿøAsÿ sTó¾Çºïû,ø]ÿý©¼yÿYÿ„þ ‘ñÿáïü;ûþ/ü3OöÝÇÄVÿ‡Âÿ çûþgÛþXùÛŸð©|ö?ìøN±ÿ Kò~Ù¶ÓûSßümÿEý…>à ÿÂeñËûþOÿü1Wü[?Œ:‡ü.øNÿáWÂ+ÿ ¯‡Óÿºû_ü.†Ÿò6`ùð’¤ù?cÔ>Èx'þ ‹û |Eÿ†æÿ„7ã—öÇü;cþïøm_ø¶tÿøRÿð‚ÂÑÿ„«þB¿ ÿ…‹öOøRÿÿäSþÞóÿáÿFó¾Ù§ý¬ϯé·ëÿø‡@ÿ‚±þÙú¿‚ÿà˜&¾ÿ‚=~Óú6­ûw|_ñÿÃÚ/·W_Ž£ÿûð·„>>øGá‡ñ;ãQ›öaŠYü?­x'Äz§Œí»mà«a¥xfáaÔ.í š­¿¯øçþ 9ûSxSö°ý½?gÍþ ‘ñÿÅÿ ¿dŸÙÆ?´wÁ_ÚCL¸øŠ< ûcüSðßÃo…>6Ò¿fO…ÑÚüºÓâøªxƒâ‰tvÒußê"óáÍù‹Ã÷›‹;@Ò¿à²ÿðM­oÿ±W‹4ÏÚ?í>ÿ‚ˆ|@ñWÂïØîÿþǨápxïÁ?ô‚¾'оËqð¹'øö_‰¾(дϵx¦-η}¶Þâm>)®ãïüMÿEý…<ñ×ö£ýš|GñËû;ãgì]ðĵí-à¯øVnÿá[| 𷃼 ãí{Ç?ð‘Ø|>—HñÙü%ñ'ÁWÙšþ«¬Ëýµöxtù.­®á·óü»OþñÄ¿ø+íŸàø&Ÿì÷ûpx{þõûOø÷öƒøÇñZøqã¯Ø+Fºø¬¿> ø[KÕ~8iöŸ¼Y=—ìÃ{­¿‡îí¾ø:æ!yàÝ&ØGñoLÙ¨J¢ÖMOë¶¯ÇÏÁK?hOØÄ?°·Åÿ~ÏŸ>h¿ü ûzë3xѾ ülñN©¥|Ô.þøN ß„Z"x‚Òçâ§Œm¥6~2Õ®LŸ 5=ú|Ln£Ó0,Á?¼#ñ[û[ö¹øà ;âÅ„¿ðƒ|I°ÿ„_ÀšµÃMKO×á<Ôü†5¯2Ëãçû.­]Þ'ü$[d·W´¿[P>–»þ§©ùÿªý¾á¿á®¿áÅ¿µÿü.ÏøkÿøgøcO¶|gÿ…§ÿ ³þÇü,ßøi¿7þû_þøKâ•Ûÿ¯öwö?ð}«þ%Õú;ñ/öÕøùàø)gì÷ûø{öø¿ãßÙóã kâ?Ž¿o]o/Á¿‚~)Òô¯Ž…§ÃAeð‚÷D]Üü+ðu´FóÆZMÈ“âÞ™³O•…¬zŸÃú?à“ÿðË?ðÚ¿ðÕñŒßð¿ÿá—?áeÿÂŒý¤¿äºÿºÿ…±ÿ7ü!¿ð§¿á ÿ’ÿí?ì¯ìoùtþÐûoú5}ã/ÛÓöOøûd|'ÿ‚x»â·öOísñÇÀ—Å…ß áø“ÿ G4›‰z–¡®ÿÂy¦x: h¾]—Áÿˆ¯ö]GZ´¼øGvÇnÏw`·@|ûvþµÿ†>@ñÏüsö¦ð§ìŸûz~Ðz7ü#ãÿ‹þ&þÉ?µÿŒg‚¿³~™qñxïöÇøYΈ? |¥~Ó ¤µøu¨Eà SÃÿ ¹¯†n>îìÉ¥[ô&ÿ‚¢þžøûQþÒÞ#øåýðOö.øÿâÙsö–ñ¯ü+?Œ7ð­¾:ø[Æ>ð½àoøG,>K«øÇìþ-ø“à«Oí=ÃUÑ¥þÚûD:„–¶×s[ú•ûz~Éú߈¿b¯ 韾Óâø(‡€à ÿÂeñËûþOÿü1Wü[?Œ:‡ü.øNÿáWÂ+ÿ ¯‡Óÿºû_ü.†Ÿò6`ùð’¤ù?cÔ>Èϯë·éÿà>%þÙŸµ5¥×ü“Á¿?bÿˆÞ ý†þxcÇ߲Ŀh|gàO۟⟿güX‹Á_¼¡x3EŸÄ¿ðüMðÿ‡ü'«é¾ñ6·¨êšüvÂmP– fúûö\ÿ†¦ÿ…àoøm_øPðÓ?ñSÂËÿ†\ÿ…‹ÿ +þGÂÿ7ü-ø¨?äŸÿÂ+ý§ý¡ÿ1Ÿí²¡}š¾`ý¦h¯Ø›ãÏÂ_ø*/ì‘ñ7ã/ˆ4 'ölý˜{±|M½ñžk¿Ãšvû=&ÞEûZ2ßÝÿúù§´QEðüƒþQgÿ+ÿ³ý²?õ¾#WßÕðüƒþQgÿ+ÿ³ý²?õ¾#Pçí|ãûVü6ñ÷ÅO„xwá|¼ñ΃ñömø­¡é¾=ñ&µàÿ ë?ð£?hï…õ=UñO‡¼â ÍûCGø¨YAu‹¨ù77м–Í‘—èêòÚâ·ü(€>8`ÿÂUÿ káÄ¿ŠßðŒjaÿÂIÿ ïÁš×‹ÿ°¶¿³¯?±þÙýöµ}’ëìÿhó¾Í>Ï)úóx»öÙ¹×ô;oþÏŸ²Î‹ákcLƒÄºÇ‡¿l?‹^'×ô[Ø#Ö5=Ãz—ì1¤[x‡X·Óšæ[[‚îx£·—Q²ŽF¹‹êj( ÃþOwþ }ÿg}ñoÿ]­ÿ¯èú¿œù=ßø%÷ý÷Å¿ýv·ü¿£êÊ{ü¿VETQEQEWòƒÿøÿ“ýˆ?ìÐf¯ýS ¯êú¿”ø'Çü˜?ìAÿfƒû5ê˜ð]i¿/ÔGý©~ëÿ¿fOÚ3à¿…/4}?Å?¾|]ø_á«ÿÜ^Úh:ÿ¾ø‡Âš=æ¹u¦é÷w6Ú+Â1ý©ý¹ÿßü,Oh¾/þÁþÚþγþØûöÇÙþÕöK_´}ŸÎû4ü¤Ð_¯ý¡ÿäû?ÿÙÿÁ1õã²Å{õxíÿ ÏÙÿþÏûþ ‹ÿ¯ý–)KgèÀþŸ¨¢ŠÀŠ( Ìø,'ü™¿öwßðMýyOì“_ר_ðXOù2)ìï¿àš?úòŸÙ&¾=­a³õÿ >Yý¦¾ü]ñv©û8xßྋðãÄþ)øñßSø¡áoŠ&üHñfåé·’éŸÙ^ ñìsá[=gÎÖO‚;_°û5µÔ×qýªX#²¹ëþ8|Vÿ…5àÍÅÿØ?ð’l|_ýžþÿgÿjcýŸþ¿ÇφŸÿ·¾×ýuçeÂÄþÔû/”ŸnþÇûÚlþÑö¸=~¬û.ÿÊS>ÿÙ€þÞŸúÑ_ðLÚm;ö]ÿ”¦| ÿ³ý½?õ¢¿à™µ3ø_õÔßê(¢±¯€á&øëÿLÿ„7þàü37ü0ü$ßðÅ_ðx;þ›þ¯ü4WöWü5ü"¿ðƒÂAÿ þÿüRÚð“cÂGþý…ößø˜WßÕù…ÿ —ìoÿŸÿ…}ÿ Ÿâü<þ…ÿ —ü/?í+ïøUŸðÆÿðÕŸØŸð©ÿ²?áeý—þü.Ïøœ}§þï?û;÷_ð“yñ+ ÓÚøþ àŸøX¿°§Ç/ÿÃsö?¶?áYÿÆjÿÂ]ÿ'ü)ìÿŒ?µ_ù¿áhø/û+þ?°ÿÂ'ÿ#6›çÿÂwöoôÏ;û>ïïêüÂÿ‚Ëé^Ö¿à›_´~™âÏØ«âüCÃ÷?ð¨>ßûü.ñWÅ?øïã“ñëáuůö‰þ 觉ôÏøGïb¶ñM×öe„þ}Ÿ‚n-ï|­>k¹£ÿ_Ò>¾ý“ôOøF¿eŸÙ«ÃŸð¼ÿá¨?áøðoDÿ†–þ×ÿ„ƒþû+áׇ,?áyÿoÂQ®mÿÂ[äoý³ûoXûOü$wö¦¡¿ís{ý|ÁûÚéÖ?±‡ì‰e£üñìÙ¤ÙþÌ­t¿ÙÓÅš¯ŠußüÓ­þøN/‚¾%× ð­²E¡^Ýë6¶Ú­ÍÎ…,Ú¼7o4kôýQEQEQEQEQEQEQEQEy³û=üñÆO þÑ~!øðƒ]ý üáûŸ øã¶³ðÓÁz§ÆOøZòÚÝøkÂïtY5¿x~[oxÆ9l¬ï¡¶’?jhñ¿ºùý×ìGû_iß´{ïÙö`¼Òi?i^,ý¢ô»¯€_ n4ï¾)мUã­Ä¿¬fð›EñSÄ^6ÕuMfÒ÷]Kû›mWR¸Ôa•.æ’fÀñ—ìû'ü@ý²>ÿÁ@|]ð§û[ö¹øà KáwÂï‹_ðœüI°ÿ„_ÀšµÄ½7PпáÓÿ‚ˆ|@ð¯ÅÛÃþÿǨápxïÁ?õÿ^×~ÕoñE'øö_‰¾(×u?²øZ]η}ŠâÞm>(m#úþ´ïýt>¾ÖÿdÿÙgÄ¿ð£?á#ýš¾xƒþû#þ§ûoàßíWþãþÿøEÿ°áF}¿Ã’Â¥ûü þ ûööÙ¿áÒüŸÙöžI¢~Éÿ²Ï†¿áyÿÂ9û5|ðÿü5ö¿ü4·ö'Á¿‡ZWü4?ü$ð”oÂóû‡#ÿ…µöïøN0éÿð¥ÿáÿ…]ÿ¯ü‚¾ Áÿ ìŸð¥þÈÙý½çÿÂ7þ“ç}³PûYàŸø%×ì)ðëþ›þß¿ØÿðòøK¿áµâæ|aÔ?átÂwÿ Gþ¯ù üAŸþ×Úÿát|Kÿ‘OûÈÿ„“ýÉûŸö@_µýˆÿc ;à®cû"~ÌzOìÙâ WÅŸ³¦—kð áM¾ð Å:X¾ø‚÷ÆÚV—¬ÝÞèIassªé¶úŒÒ½Ü1̽§û'þË:׎þ(üQÖf¯€·Äߎ>Ô>üjø‹©üøu㿌 5mBðî«ðÓâ‹®¼8ú‡Ä]xÂþ°¸Ñµk‹½:{?ØZËlÐZ[ÇÈ:Wü£þ µ¢xwö*ðž™û8}›ÃÿðNÿˆ*ø£ûØÂßøõ7ü)ÿøÛâžñ«ÄúïÚ®>(¼ÿ>Õñ7Âú§ö_Ë­ÙÁö±[ÛçË5¤ÿ‰¿à—_°§Œ~:þÔ´·ˆþÿhülý´~xƒö\ý¥¼kÿ 3ã §ü,Ÿ^)ðw¼¯xþˈ1iûG„¾x*ÓûO@°Òµ˜¿±~Ñ¡ÕÍÜ×_Öÿ®‡¯ë?±ìaâ?ƒ~ý÷E“[ðç‡å¶ñ§Œc–ÊÎúi#ñf¦[û¡/çü8_þ ?ÿ ³ÿ Uÿ ©ÿÍÿ ÿþþ§ü/?ÚKþK¯ü+¯øTÿðœÿÂeÿ ‡þù'ÿñ/þÌþÕþÆÿ—¿ìÿ¶ÿ¤××þ2ý‚ÿdÿˆ¶GÂø(‹¾ÿk~×?¼©|.ø]ñkþŸ‰6ð‹øV±ø—¦êü zgŒ`ðÆµæY|`øŠŸjÔt[»Äÿ„‹tw ö– jõþ}?¯#¿ÔÿdÿÙgZð'Å…ÚÏìÕðVøeñÇâ¡ñcãWíOàßëÿ|`ø§«kˆµ_‰|#uáÇÓþ |@ºñ…ü5q¬êÖ÷zŒ÷ž°º–å§´·’>‚×ö{øc¨üÖ,~ü ³Õ¿fÏê¾ý5K_†ž ·Ô~x[]ðµ‡uÏ |¾‡EY~ø~÷Á:V—£]ÙhOams¥i¶útÑ=¤1¿0x›þ uû xÇàWíGû4øàoöÁ?ÛGãÿˆ?j?Ú[Á_ð³>0ÚÂÉøëâŸøÇÚ÷Žá#°øƒ¯àï´x·á·‚®ÿ³4 ý+F‹ûìðéñÚÜÝÃqèWìû'èž"ýмY¦|)û7ˆ?àþñWÂïØîÿþŸ‰3Ÿð'¾h|O¡}–ãÆ/ĵ|2ð¾…¦}«Å1kw}‡í¶÷êÍw ¢~Éÿ²Ï†¿áyÿÂ9û5|ðÿü5ö¿ü4·ö'Á¿‡ZWü4?ü$ð”oÂóû‡#ÿ…µöïøNàŸø%×ì)ðëþ›þß¿ØÿðòøK¿áµâæ|aÔ?átÂwÿ Gþ¯ù üAŸþ×Úÿát|Kÿ‘OûÈÿ„“ýÉûŸöCÆßðK¯ØSâ/ü0Ïü&_¶?áÛðˆÿÃÅÌøÃ§ÿ—ÿ„þwü"¿ò øƒü,_²—øiÿ#gö÷ŸÿßúOöÍCí`ûG|Ñô¿‚Ÿ¶×Ž>~Ì>$þÓ?¾xÛLÕ|5ão‡¾Gý¬|wàï„^*ðŸÁ_…ß´†³w£ÂÉð¿oƒÃMoânÞÎÏAׯ,RÿM²–YPý‚üeûd|@ý“þø»þ ðŸÀ¿k[þŸø[_ ¾jV:·1Ó<ý…¨i¿üaÇÛ~Yx3QºÙâ=Geæ­q}‘Õ¬-|ö™ýÿboü%ÿ‚¢üvø›eℚOíû0x‡Fý½~7xO]ñLj´ÚÇ ÝÀð¯ë¹÷õQ@|ÿ`ÿ”YÿÁJÿìÀlýgoˆÕ÷õ|ÿ`ÿ”YÿÁJÿìÀlýgoˆÔùû_ ÿÁB?äÁÿnû4ÚWÿTÇkëê+ œ|ûc~È¿?loÙþö øSÿ Qû8ÿÂÑÿ†qýš¾ÿ¶ÿ…áðËþïøO¿áYx/ÃðƒÿÂÿ ?öü&ð‘ f}›í¿mÿEò<ÿÝ×êe xíÿ ÏÙÿþÏûþ ‹ÿ¯ý–+ß«Àhù~ÏÿößðL_ýxßì±J[?FôýEVQE~`ÿÁa?äÈ¥ÿ³¾ÿ‚hÿëÊdšøö¾Âÿ‚ÂÉ‘Kÿg}ÿÑÿ×”þÉ5ñík Ÿ¯ùñOüÄ:„gÅ~+×4 x[õ7ìâø“Ä:–‹ x{@Ñn¿ÙÃRÖ5ÍsXÔ§ŠÛIÑí4ëk›‹««‰c‚Þ y%–D‡¯ü/ý©fOÚýç…> þÑŸ>/x§OÑîÿÙ€þÞŸúÑ_ðLÚ™ü/úêïõQX€WÈ?ð†þÙðß?ð°álxþóÿ ƒÿoü(ÏìÛøZðÙð¹ÿ¶ÿálkÿ´ûWü ð¤ÿâOöoøL|íÞÿÂ3æÄÒ¾¾¯È/øÅŸø—ü×ÿømŸøtýS¯øeŸøeŸølïü+áÿÂÚÿ¹sþÏú‰Ðëí|ÿFñ7Ç_~Ÿ¼Gû4þÔ?bïšwü+?øB¿ioÚÄð·À¯†ßkøÃðúÃÄðœëÞ>ð7‰t‹íŸ ]kÚ™ö½÷ÍÖ|S§Ãoök©!»·ûú¿0¿à²þ2ýþÿÁ6¿hÿÁ@~ü@øãû#i?ð¨?ám|.ø]©_i>;ñGÛþ=|.Ó<ý…¨i¿ü=¿Ø¾&Þø3QºÙâ=;}ž“q}­¬.€×OÇ¡õ÷쟩øïZý–f­gâÅ|qø›«|ø7©üEøÕðŸPÑõo…Ÿ#þΞ*µµø¬uø'ß…¼!ñ÷Åßuφ?D?´ôRÏáýkÁ>#Òüvt+Ÿ[ +Ã6í6ŸwhcÒ­ÿw( ?­ÿ¯ë]ÏÈ/Š?ðN?ڛǟðêoøG?à¦ÿþÿÿ¿á]ÃKb[üEoøx×ü!Ÿð¡¿·¿áyýƒãý‘ý¹ÿ —Æ¿lþßÿ„ëð¸õO;í›nÿµ…ßðN?Ú›ÀðõŸøHÿà¦ÿþ!ÃÀábÿÃ4ÿmÛüE_øw/ü&ð¾°áF}¿ãý÷Ÿý‡ÿ kÁ_cþÀÿ„?ð§4¿'ì{­?²ÿ_h Â=þ 9ûgé ÿ‚`xfûþ ûOë:·ì#ñÇÿÿh¿]ZüVüÂÞ/øûዺÃBoÚzY`ðþ‹àŸjž ´:íÏmŽ•âk†‡O´´iW¿ãŸø'íMâ¿ÚÃöôý ôoø)¿Çÿ|2ý­¿dþÎ?fý2ßâ)ð'ìqñOÄŸ ¾ø'Jý¦þIkñþ×O—â—â‡þ%×­×Iм-¨›Ïˆ×â/[Î.//¿_h ?­ÿ¯ë]ÏÂ?‰ðIÏÛ?ÇðM?Ùïöð÷üöŸðíðsâþµñÇ_·®kñY¾2|l𶩪üpÔ->ø² /ÚzË[OÚ[|Tðu´FóÆZµ±á&™³O‰M¬zg×ß ?b¯žÿ‚–~П·ˆnŸ‹þ=ýŸ>1ü Ñ~xö Öañ¢üø'â/Jø§ÝüNðœ÷¿ïtGñÝÏ¿ÜÊ,ü¤Ü‰>-ê{õ X]I©þQ@[ŸÎ'ü9Wöùÿ†ÿ†Eÿ‡é~×ÿð»?á¯ÿ᣿á²þÇñŸþŸü*ÏøSð¬¿á™<¯økïíø@?á-ÿŠ«wü%_ÙßÚ<Â?ö¯ø˜×èïĿثãçŽ?य़³ßíÁáïÛ§âÿ€¿gσŸ5¯‡:ý‚´h|hßþ6x§TÒ¾8iöŸ¼Y=—Åû-?ØùÛŸð©|köÏíÿøN±ÿ Tó¾Ù¶ïûSõöŠü‚ý¨ÿbÚ;Ä¿ ¿àµúφ¾?ü@øõÿ õû Ýü.ý˜?d¯_Ýh^ýž%ü8ðwÆo ®¢þ)øIâŸx/Zðχ¾'xi4i7mâ VÕ-5[!kªé—&çJˆA¨YJRæ/ ý‚ÿgвOìŸð§ö|øÕûMü@ý±þ&ü?ÿ„çþ_ÚCâŒ~"‹Ç¿á+ø“ãhßÛ±ø³Çþ)ÔûÃþ$Ò´_´k·ù³ð½¹‹ì°¬íÀÿƒý_ä}}EP_ÿÁX?åðR¿û0Û#ÿYÛâ5}ý_ÿÁX?åðR¿û0Û#ÿYÛâ5~~ÑEÐEPaÿ'»ÿ¾ÿ³¾ø·ÿ®Öÿ‚€Wô}_Î ‡üžïüûþÎûâßþ»[þ _Ñõe=þ_«¢Š*(¢Š(¢Š+ùAÿ‚|ɃþÄöh?³Wþ©×õ}_ÊüãþLö ÿ³Aýš¿õLx.´‡_—ê×ÔQEh^ûCÿÈ3öÿ³þÿ‚bÿëÆÿeŠ÷êðÚþAŸ³ÿýŸ÷üÿ^7û,R–ÏÑý?QE€Q@˜?ðXOù2)ìï¿àš?úòŸÙ&¾=¯°¿à°ŸòdRÿÙßÁ4õå?²M|{ZÃgëþ@QEX;ö]ÿ”¦| ÿ³ý½?õ¢¿à™´Úwì»ÿ)LøÿfûzëEÁ3jgð¿ë¨¿ÔQEb_ ÿÂeûdÃ|ÿ¾ÿ…OàøwÏü2ü&_ð¼ÿ´¬áiÿÃdÂçþÄÿ…Oý‘ÿ /í_ð€“ÿ‰ÇÚáò?´uÿ 7™ÿºúú¿0¿á ýÿáóÿð°ál|@ÿ‡ƒð¿á ÿ…ý›}ÿ ³þßþ³ûoþÇö¿ü+O²ÿÂÀÿ…Ùÿ³Âcçÿg~÷þŸ/þ&”ú{_ þÞž ý²> ~Éÿ¼#ÿþø±àߵέÿ7ü*_Š?tÛ[ÀžûÄŸj~<þÝÓõ/†ž0‚ãí¿ ¬¼g§Zïðæ£²óV·‘~Èê·ö¿_Wäü£þgþ?ûVÃjÿÂÿÿ†fÿ‹ÿ /þsþ×ü/_ù9/ƒßð†ÿ ÿ cþ)ÿù(ðŠÿiÿhÌûCìŸé¿f õÓñè~~Ïz7ÆO|øáïÚ/Åžñïí¡| øi£|vñ×„í ³ð·>2i~ Ñl~'ø³ÃV–¾Ñbµðþ¥ãh5ËË(£Ñ´˜ã¶¼‰L°P-bõúùþ ïÿ ³þöÿ…ÿ þŸü2ìÓÿ wþÇü#¿ð´ÿáV˜ð_ü+ïøYð‡ÿÄ£þü"_ÙÛ?Ùñ.þÑûOØÑ|ªúú€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ øþ Áÿ(³ÿ‚•ÿÙ€þÙúÎß«ïê(ùAÿ‡„~Àÿô{ÿ²þ$¯Áþm(ÿ‡„~Àÿô{ÿ²þ$¯Áþm+î/ø8[þ âŸØ‹ö Õü ðojŸ¶í§â?eoÙ?Áß$Ôo~-I⟈Iã_ˆŸü=àßé>+ohÕ ¯‡µ CªÜé_1ÿÁH¿àâü]øáñâ§‚~ þÛÖ>ø3àïˆÿüiã |$ð³üxý·´wð×Ãx›Zº´ð‡Î“á? Z›-*Kcmá­>ŠÊÙ"ý}ÿ‚²ÿÁ?¼-ÿ3ýƒ~:~ÊZÄ>µñ·ˆü>|Yð'Æ> N‚‡¿<“k þÔ¿³'ÆïÛóþ “áO‚ÿ´gÀ‹Þ)ÓÿjoŒ~!¿ðßÂÿ‹¿ü}¯ØèŸðN?ÛÃMº×/4 x†îæÛG‹QÕ´«y.ž%'Ôíâi“D­ýZ×áüÓÿñOí»ûéøñ7ˆ4¿Û?ö,ñÿ²·íaàïˆrj6_£ñOÃÔ“GðWÄOˆñ—Œõo¯ˆ5ÿ ib×Ä:¿‰aÒ®u_ˆžñôštÚ^Åýܨ“»¸'}{…QHaEPEP_Äßì1ûsþÄÞý‰¿c¿ x¯öÃý–|1⟠~Ë?³ç‡¼Ká¿þÐ t]ÃÚþ‹ð—Â:n±¡ëš>¥âè®tbÓQ¶¹·ºµ¸Š9íç·’)cI”l”UF\·Ò÷ùAÿ‡„~Àÿô{ÿ²þ$¯Áþm(ÿ‡„~Àÿô{ÿ²þ$¯Áþm+ê/ø6žçÅ??boÚ7öÐñáÿ é?ðQ¿ø(÷í£ûnøÀZ7‰uj?¼-ãßi? ®üâÍz÷Âzñg~ë?üiª|ð_Šo<ÿúº»ñ/„þ^ëRhžñ·>4ñŒ’ÞÙØÃs$ž,ÔÝå-te¯iåøÿÀöóÿ+œçü<#öÿ£ßýñ%~ ói^cñ+öÆý‘~*k?³W€¾þÕ³Äëß·÷üSûÁ~øáðËÆ,Ö²ÿà¡?³&³©ÿexwÃÞ'¹¼Ô~Í£éÚ…ÜþL/äÛXÍ<›bŠG_qÿƒ¾?f |gÿ‚LkŸ.ßÃúW¿cß‹ÿ þ#ø{[¹ð^®x§[ð·ÅOhÿÝö µý“íc¶ó<”îš¶þð«^ŸÿÈ÷ú(¢³QEùSÿ¤ñáØÄ>+ñ^¹£øcÂÞý©¿àœž!ñ/‰Áý‘sÿ /ÿ ñý‰ö;Oòÿá0þÒûcÿgý‚ú£+ik‰éwÙyÿýÿè÷ÿdüI_ƒüÚQÿýÿè÷ÿdüI_ƒüÚWô?ûüñOìÙû~ÈŸ³§Ž¯ü?ªøÛàìÁð ௌuO Ýj7ÞÔ¼Sð¯áO„ü âÿ ^ëU…Ýç‡æÕ´+¹,¥º±²¹’ÚHž{KiYáOÀ?ø4_ö„øùûIÿÁ7~6xëö‹øáñãï´¯Û{âG„ô¿üjø—ãOŠž)Ó|-cðökÖ,¼5aâkW÷v~‡V×u˨¬£™m£¹ÖnçH–[™ëÚy~?ðåýioó9ÏøxGìÿG¿û ÿâJüÿæÒ½‡öý¡>üwÿ‚¦|'ÿ…ñÃáÆ_øE`ÛƒþøU?üñþ¿íÏÚ+þ ½ý‹ý½ÿ†µyýöÏì}[ì¿hòþÑý—säïò%ØïÚ²ÛÂß±¯ü‘ÿâý£týgáƒtŸø)¿ìÁûF~Ä_#ñ/†´ïê7>)ø<ñ[áŽ-¾"Aâ˼añÅþ6Ôg߇:M¶­§ÞÜ+Áv^ÓŽ¡wªh‘è?ÒÝ';¦­øÿÀþL(¢Š€ ùû+Ä_ðß?ÛðÅ^ÿ„Kþû+þ-ÿ WÂÏøZð‘Âçû_ü1Wü!Øð›Âý™ÿ×ö¯ö§ü"¿Ú?èÙÿÚÿé5õõ|ÿOüm3þ?ü77üØü!?ðí/øK¿êâ¿·ṿáÿ…£ÿrö¿ü!_ôåÿ OüÂhïêùöôñ—í‘ðÿöOø­âïø'÷Â|qý®tŸøA¿áRü.ø£©Xé>ñGÛþ$ø;Lñçöî¡©|Kð|ÿbøe{ã=F׈ôí÷šM¼kö·e°ºúú¿0¿à²þ ýþ Á6¿hÿÿÁ@~,|@øû#jßð¨?ám|Qø]¦ßjÞ;ð¿Ø>=|.Ôüý…§é¿ k?¼ á;˜/<-࿌š§‚ô[ï‰þðÕݯ‰u¨®¼?¦øÚ}rÎÊXõZ9-¬âtÔïÔ‹©}~¾`ýˆôoƒ~ýŒ?dO~Ξ,ñgÍ ö`ø£| ñ׋-§³ñO> é |'cðÃÅž%´ºðÖ‹-¯ˆ5/Á¡Þ^Å&¤ÉÍä¨úeƒkÓôQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE~ÿÁÂßðPþÄ_°n¯à_€óxƒTý³ÿm?Aû+~Éþøy&£{ñjOüBHôüDøáïøÏIñ[xƒ@ð¶¨m|=«øjVçJø‰ã¯Áw§Omªl`²¹ùÃû'Æì¿à¼ŸnmOþ+ø'Ïü?í¿c¿?þ*…Ÿjk©®ÿá'øÕá_´ÂWàŸ}‡SMwÅ6Þ$ð¶¯á¯ÛiÚOìõ­ÜY-æÇõõ_œ?ðI¯ø'÷…¿à™Ÿ°oÀ¿ÙKG‡Ã÷^6ðç‡Ç‹>;xÇÃñéÓÁñ ãçcâ‰WÄ6¾ Ð.üYáû]Y¢Ð<1{¬éÑëPx7Á~Òµe—M_£Ô -5Ýêÿ¯-äþ Çÿ”¦ÁÍßöÚþ´Wíû_×Õ ¿ðn?ü¥3þnÿ³þÓÿõ¢¿oÚþ¾¨ú¿ÍŸÈ/ícÿMÿ‚ò|"ý¹´Ïø£¿àŸ?ðW³üý±<ø§¾|"ý©­fµÿ„cãWоÏÿ§‚|öíMô/Ýx“Å:¿‰|Gs§jß´.·od$¸‡?×Õ~pÿÁYàŸÞÿ‚™þÁ¿?e-bÚøÛÄ~>,øãG§AÃßž Iµ†%oÝx3_»ðŸ‡îµe—@ñ=î§I­Oàßx“JÓ¥Š]H½|ƒÿôÿÁ@|SûnþÁºG~øá9¼Sg⟠üdøá«¿…Ÿn|5«x. 5/x‚_Œ~4ð-µ–­[Ǥ\ÞE©Ý^ØZZO{oú=_Ïü±m⟉Ÿ±7ìåûø{Yðÿ„ôŸø(ßü{ö.ýˆ¼uãÝgÃZ‹µ‡^ñïŽ5o‰¶ž8ðžƒeâÍ-GÄ>6øEàã-µåɶ¼Ò§ÔìPÙÝÝZêšxÈûûþ ð Ný˜¿à—_°_Á›O‡¾ øU«h_³ŸüAøâÈ|Sg⟠üdøá«OŠ­¼K¤øÒy5/x‚_Œ~4ñÕÍî“:ÛǤ\ÞK¦ZÙXZZAeoøGûÊä?ðVû0‡?úƒÁ5+úú¯äö8ÿ•Èà¬ö`?õÿ‚jP'ö}FOµ‡ÀÏøjÙgö•ýšá(ÿ„þàÆOŸðšÿbÂKÿü-¯‡^#ðü%ðŽkéÿðgÿÂAö¿°ý¾Çídû?Û-¼Ï9?ÿàÒŸ^ø©ÿ]ø=à_Xx‚ÏVýšþ/ü~ø+ã«f×N·Óµ_뿵Ú.ÒÿÂsYj·2ßx}|ñ÷ÁÖ²Ëy …Êêºn§Z=¤6·×¿ÒÝ(¿ðGÿÿÃ3Áy?à¼ÿðOÍ_Çß<}ÿ Gâ…?à¡? ûöOÂÏÂÖ›Hø‹ñ‹Lÿ„vçÆ·ŸÙþÇàg‡¿µll[þ;à·ÛµI4°èú@î¾kõýêêŠ( aEP_Æ7ü£ÿïí_ÿ4ÿ‚ÿÁ6eÿ…ñGÃþ6øþ¿?iÿÙ¿Â?ð´í´}{àW‹þ'ü0ðMÄ¿I࿲Á/ö_Ã/‡ÿµà“Y°½σ4oê“Üèš~¤·—ŸÙͺ5·Šjïø<ËÅ’ø‡Yðÿ„ôŸø&gìCmsà[-ÃZî£ñ7ÂÞ=ø;á«K½Åš¥ï‹ZGˆ-ümÿñŽ£§gfmŸJø{¦hϤý®êë]ŸEݯó‚?±ªþAàÊßùEŸÇÏû?ïŠúÎß²µ_Uü‚ÿÁ•¿ò‹?Ÿößÿõ¿ejªôš>Þÿƒší¼Sàoø'_?lŸë>µñ·ü‹öÞý¿mßxWÅžÔ|Iáo‰^)ð_Å~x{Àþ%:?‹4{½ÃçVøÕi«^ÜÚÜIsqmáIt¨œº’jºwïç„üYáoø[Ã^:ð/‰|?ãOøÓÃú7‹<ã ë:wˆü-âÏ xN¶Ö<=â_ x‡G¹šÓ]ðýþ“yiue{k4¶×V×QO²E"9òÚÃàgü5ì³ûJþÍ?ð”Âÿ ðã'ÀÏøM±?á%ÿ„?þ×ïøþøG?µôÿøH?³ÿá û_Ø~ßcö¿²}Ÿí–ÞgœŸ˜_ðn_í-ÿ Aÿoý‹.мçÿÂÿ ñ®ê? ¾i>5Ó'×µ ¯ü@Ô> øáwˆõ+{©-¾×ÿ Ä:½……Ž‘©éÖè_UùÃþíåQ@¾ÿ„Ûþ6™ÿ ãþgþlþoøyoü"?õq_Ø_ðÃ?ðž®ÿ¹ÿû#þ_ú}ÿ„[þbÕ÷õ|ƒý«â/øoŸìOøm_Â%ÿ ƒý«ÿéÿ„Wágü-?øH¿ásý“þWþíÿøM¿áþÌÿŠû+û/þ_íôÏííôjúú¾ÿ‚£xg㯌aOŽ^ýšeÏ€¶ÆÍGþŸü!_³OíGáÿx§àWÄŸ²|aø}â?øNtxçÃZEÿö7„­uíLû^·eåk>Óæ·ûMÔpÚ\}ý_˜_ðY}Wú/üköÔüYûjü@ÿ‚wø~ÛþÛÿlO…Þø§ãoüó¾=|.·µþÂðÇÁ]Kñ>§ÿ ì¶ÞºþÌ¿ƒÈ³ñµÅÅï›§Ãw €?ëúg×ß²~™ã½öYýš´oŠ? ¼ð;ân“ðàÞ™ñà¯Â}?GÒ~|ñ݇ïZø»áwÃM+úéžðÿˆ"Ô4ÞÃSÔlàÓ´›h­oîàXî$÷úùƒö#ºÓ¯¿cÙ÷GøÕâÚOI¼ý˜>]i´_‹4¯è^)øû§\|)ðœÖ_¼K¡øêþï[ѼAâ«g‹]½´Ön®u[kvXu‰®Òiéú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÊŸÁi?`?hŠü)âÚ›Äþñ>¦x‡Ã^$ð÷ü“þ 9­h!Ð5«(5-\Ðõ7öP–ÛVÑîôë›k‹[«yd‚â ˆåŠGÕŽÇü>ö"ÿž¿µ÷þ+Gþ SÿГNϳû€ý>¢¿0áð±üõý¯¿ñZ?ðRŸþ„š?áð±üõý¯¿ñZ?ðRŸþ„š,û?¹ú}E~`ÿÃàÿb/ùëû_â´à¥?ý 4Ãàÿb/ùëû_â´à¥?ý 4YösôúŠüÁÿ‡ÁþÄ_ó×ö¾ÿÅhÿÁJúhÿ‡ÁþÄ_ó×ö¾ÿÅhÿÁJúh³ìþæéõùƒÿƒýˆ¿ç¯í}ÿŠÑÿ‚”ÿô$Ñÿƒýˆ¿ç¯í}ÿŠÑÿ‚”ÿô$ÑgÙýÌÓê+óþûÏ_Úûÿ£ÿ)ÿèI£þûÏ_Úûÿ£ÿ)ÿèI¢Ï³û˜§ÔWÄ??ࢲ·í3ñLüøW¯ü_‡âkxÅ?m<5ñ[öUý«g¿íox'Ä^ðŸ‹uÝYý > xcOñöwˆ>'x ÞêÖÆîâò/øIí¥k É*}½HŠ( Š+€ø±ñGÀŸ¾|KøÕñG]ÿ„_á—ÁÿxËâÄ_ÿfk×ü#¾øáÝKÅž.×±¼;§Ýê·ÙÏî`~ŸWò û'Æì¿à¼ŸnmOþ+ø'Ïü?í¿c¿?þ*…Ÿjk©®ÿá'øÕá_´ÂWàŸ}‡SMwÅ6Þ$ð¶¯á¯ÛiÚOìõ­ÜY-æÇÓßðV_ø,„oûütðwüÇá¯í½ñ+ö°ø«áóð£áí߇ÿ`ÿÛËáŒÿ ôï¤Ú_þ0¯Ž¼gð·Á2økÄ‚N¾þ¾ÑuGU²ñ•ÿ†ï$Ñ®ôk}^{O`ÿ‚ ê_±gìËû0| ÿ‚t|Ö|/íáÿ„'øûñ®ïÆß²í9ð Šÿ“_ø{¥ü|ø…áÿ|vý˜~Åñ7Ãú'¾(|=ð΄÷pKâk?ÙxNÃRŽUÓžt,û?¸OV»-É~¿qûùE|‘ûKþܳì¯ü:ð§ÆÝâ=¯Š~,hþ>ñ€ü7ð¿ö{ý¢?hMWÐ>ÞøMñæ¹y£þÏŸ üSsáíNÔ~(øÞK­N+8%ŸÄöñ[É4‚Uçø|ìEÿ=kïüVü§ÿ¡&‹7²c?ÿàÜùJgüÝÿgý§ÿëE~ßµý}Wñ ÿUý£ü%û$þß?ð]?_´ÂïÚûáÿÃ/Ûö¿³ø£û7ø—þ+öàñ_ü,oEñŸö¾ñdšïö7‚g­KPð†ö"ÿž¿µ÷þ+Gþ SÿГEŸg÷1/Õþlý>¯äö±ÿ&ÿÁy>~ÜÚgüQßðOŸø+‡Ùþ~ØžGüSß >~ÔÖ³ZÿÂ1ñ«Å_gÿ„SÁ>ûv¦úŠn¼Iâ_ľ#¹ÓµoÚ[·²\CŸêOö}ý ¾þÔ t/5ÝcÄüG¬xçÃÚ~¡âx÷ᦿ¿ðÓǾ'ø_ãÍ\ðÅ hºÿ†5/ÇÞ ñ6™uk©é–“¬úLŽ‘¼/¯ø…ÿ¸ø‡ûþÚ?³'ísÿçø¬üWºøõà‹} ïÁ¾ ðìWû`üiðÏÁoÚnÇáÿ…~4|¹¾ø¹ðƒöJñþ—á»{ï x÷Â6~+µÏˆÀßuÍ"iw©ºªªÓ}×õæè’Šþhÿà“_ðYÓö øàïø(wÃ_Û{á¯íað«ÃãáGÄ+¿~Áÿ·—Äéþ*iÞHt¿|aox3áo¥ñ/ˆ5ÏüO}­j:v«{ã+^G£Zh×D÷£ßðø?Ø‹þzþ×ßø­ø)OÿBM;>Ïîc?O¨¯ÊŸÿÁi?`?èçŠüWâÚ›ÃðÆ©ø‡Ä¾$ñü“þ 9¢èÐ4[)õ-c\×5KöPŠÛIÑí4ëk›‹««‰c‚Þ y%–D‡êµ+[p (¢€ þq?n}3Gý¤àáïø#À‹o…ßðŸÃ|ý°ÿnŒ×þ.Óü wàO øâ¶›¥|ø ã/Úø]kÝsâûLü)ðÔke¥5æ‹y­xsÄdò}‡T»Ðÿ£ºþq?àŸ—ŸðÖ?ð^Oø+ïí‰ÿ ÄøöGðÀßø&7ìû®ÿÂÿ‡Âȳ¦oŠ?¶Ãí=OÀ67¾;øáÚgÁwÛ?µ.~˧|Tó3¨øUð}Ř'ÓÍþZþ‡ôw_È/ìqÿ+ÿÁX?ìÀ~ÿê ÿÔ¯ëê¿_ØãþW!ÿ‚°Ù€ü9ÿÔþ ©@=ׯèÏë꿘Oø(Œ?á?àãø$í-«übÿ„KáÿíÅðã—ü§â‚¿á_ohÂ%â…ñ÷ÁÝ;þ;kmNöÓþÚgö€øiçXØiØŸð¯>Ѫk’øWÖ!²þžëùãÿƒœ~üd×àšv_´ìûâhŸÿàžŸ´ÿÀ?ÛÃÀ±xkáÄuÍGá«­ø:ïZ¹ÑïVâÓIðÿ…4Ÿ‰Ú‡ŽõmGQÓ5*+áU쵂i·7Z€oM~íú¢¼ö\ý¨þ~Ú?¼ ûK~Í>9ÿ…“ðOâOü$ßð…x×þŸø;ûkþïøƒÀ>#ÿŠsÇÞÒµ};ìÞ-ð¶½iþ—aoç}ƒíþm¬°Í'¿Ð0¢Š(¯ãþ ]Ó4Ú'ö¦ÿ‚ÙÿÁKô…ßÙŸ ¿i¯ÚÿUÓ>|Bñ®ŸàEø§£hþ(ø‹ñãïÅ_…×èºî¥¨xCø£û4ßköö÷/ êÚŽŸ¦‹Ký^¼–ÑßüOö£ÿ†.ÿ‚r~Ùÿ´µŸŽá[x·á·Àªñ¯ü#?ð˜ÿbüuñŽ–þøÿä¾Õmu´ülñO€m?âeaq£Cöÿ´k~V‘ìÑþaÁ©ÿ³Oü3Çü¿à·ˆµ 'â‡ü[ûP|@ø¥ûKx»Bñõ‡öWÙ?á ×`ø]ðëVðV™>ƒcu€5Ï‚ ~xM¸º“PþÓÿ„Âm^ÂýôCN·¶Õy]þŸ«?£ºþAàÊßùEŸÇÏû?ïŠúÎß²µ_Uü‚ÿÁ•¿ò‹?Ÿößÿõ¿ejªôš?¯ªþq?àþ#ÿ…ÿ>ÿ‚óÿÁ?5xÄ?Ùßµÿ…?à¡? ûü"ßõïønŸi~1iŸðŽÜøÖÿþ?xÌøáïí[}ºŠ¾ÝªImÿ ¤i¿ÑÝ8Ÿ·»¬~Çð_Ïø&?í…¬êñdÿn/€?à”ŸµMCáwŽõíá§Žÿá`ËñßöqµÓ<á Nk]7âÄOž%ðÖƒag«ic²Ð~x§T–Ym~ÙªøXÓ×óÓõ?£º(¢…|ÿÏÀ¯øzgü&_ðËŸÿá¦á€áÿ†Õÿ„Æ?ðË?ð¢¿á¢¿µá—?á*ÿ„çþÿø_ÿð°?â¬þÏÿ„gûgþÏôŸíß±ľ¾þ¯á ý²?á¾á`ÿÂØðü;çþþßøQŸÙ¶?ð´ÿá²?ásÿmÿÂØþ×ÿ…iö¯ø@?áIÿÄŸìßð˜ùÚ?½ÿ„gÌÿ‰¥}}_ÿÁQ¼mÿ ëöøåã/øaŸøy?ö?ü+?øÂ¯øDá;ÿ…Ñý¡ñ‡áö•ÿ"¯ü*ïjÿÂ9öïøK?äYÔ¼øA>Óþ‡äÿhZ}ý_ÿÁQ¼ÿ öøåàßønoøvÇöÇü+?øÍ_øK¿áÿ…/ýŸñ‡áö«ÿ#Wü-ÿeÂGöøDÿäfÓ|ÿøNþÍþ™çgÝ€{ÿ쟭ÿÂKû,þÍ^#ÿ…ÿ ¿ÿ Àƒzßü3OöGü#ÿðÏÚ¿¼9ÿ 3ûþ}ûþ/?ûìØš?Ù¿áò²ôýŸd‡ßëÀ?dýþ¯Ùgöjðçü/?øjøGþ|Ñ?᥿µÿá ÿ†‡þÊøuáËø^Ûßð”kŸÛð–ùÛÿlþÛÖ>Óÿ ý©¨oû\Þÿ@Q@Q@Q@Q@Q@Q@Q@ÊüãþLö ÿ³Aýš¿õLx.¾¾¯àŸò`ÿ±ýšìÕÿªcÁuõõtWÎ>=ý±¿d_…~,Õ|ñCö¨ýœ~øçAûöç‚ü{ñÃá—ƒüY£ji¶zΙý«áßøžÚóNûN¨é÷pyЧm} ñîŠXÝ¾Ž¯È=cã‡ÇÏÙÿÇðRߊ>ø-ðƒâGÂO~ÑþñÄoxÓö„ñŸÂïxSEÒÿaŸØª_x’/øöjñ|^ ð‡‡< x†öK=Uõûûm3RÓôO jz´Ze–°úùE~MøòŸ³–û þÄÿ5?Žþ-ƒÃ²ÏŒ ñ/ÿfmöRÑ~.ëRþËÖ_³Â]S“Oý³&T·ðôzn¢šU¾¼oºÿüUý¦<ð‹ö@Ö<;«ë2ø¯ð"Š¿|)ûx³ö?×¾.ê1o |"º›WøMsûYø§Wð‹?e3Uñ牭µý[JÔµ}tjž%ønÚ6«u£j:ÝÅÐèî™âZ½ñ›£ëš>­¨øGXƒÃÞ+°Ó5;+ûß k÷:‡â»mÄ6¶³¼š.±'…¼Oá­J;[•ŠwÓüCcx±›k»yd4?è'²ŸRðÖ¹£ø‡N¶Ö|8ð¥×Ç}sQñwÄø*§¬ë³>“ûØ|]°ðÇì›ûpé_>xzFý­äµðJü8·ð­­5i-ìn<_ªx{Ãב_ câY5Ó_ÙïÆž,ø‘ðàÄ?Åáë:oˆü‹ÏåZÛÏ;ÇzüEÿ*ÿ£åÿÍfý°¿ú«üOúèKwc÷òŠüÿˆ¢ÿà…_ô|¿ù¬ß¶ÿCõñ_ü«þ—ÿ5›öÂÿè~©×u÷£÷ò¾ÿ‚°Ê,ÿà¥ö`?¶Gþ³·Äjøþ"‹ÿ‚Ñòÿæ³~Ø_ýÕàµ÷ü£þ ?ûhþÅ?·—ìÓû4þÕð²~6|Iý€nïøB¼ÿ 3ö’ðwö×ü!ß²/Æoxþ*?|Ò´;ìÞð¶½wþ—oç}ƒìöþmÔ°Ã ]×Þ{ÝQ] wì»ÿ)LøÿfûzëEÁ3i´ïÙwþR™ð'þÌöôÿÖŠÿ‚fÔÏá×P=þ ;ÿ'ñû Ù ÿÁE¿õsÿÁ2kÏkпࣿò°Çýšü[ÿW?ü&¼öˆü+çù° (¢¨°¿àŸòdQÙßÁK¿õå?µµ~ßÿÉîÿÁPìï¾뵿àŸõúÿ|ÿ“"‹þÎûþ ]ÿ¯)ý­«óþÿþOwþ ƒÿg}ð“ÿ]­ÿÿ¬ãñËçùßQE  ÿÁB?äÁÿnû4ÚWÿTÇkú¾¯åþ ÿ&ûpÙ þÒ¿ú¦Óÿ “ý—¨oû$Þÿ^ûXhŸð’þË?´¯‡?áyÿÃ/ÿÂAðã&‰ÿ -ý¯ÿÿü3Çö¯Ã¯ØÂóþÞÿ„£CþÄÿ„KÏþßûgöÞöoøGüïíM?gÚáðø%׿ábþŸ|eÿ 3ÿØþØÿ…™ÿUÿü Ÿð¥ÿ³þ0üAÒ¿äUÿ…]à¿ì¯øHþÃÿ gü‹:oŸÿ ßÚÓ<ïí ¿¿«àø%ׂá]~Ÿ|ÿ Íÿ'þÇÿ…™ÿ«ÿ wü'ðº?´>0üAÕäjÿ…£ãOí_øG>ÝÿŸüŒÚ—‘ÿ'Ù¿ÐüŸìûO¿¨¢Š(àø*7¿á]~Ÿ¼eÿ 3ÿ'þÇÿ…gÿUÿü'ðº?´>0ü>Ò¿äUÿ…]ãOí_øG>Ýÿ gü‹:—‘ÿ'ÚÐüŸí Oý“õ¿øIeŸÙ«Äð£?á—ÿá øðo[ÿ†iþÈÿ„þãûWáׇ/ÿáF`ÿÂ/¡ÿbÂ%çÿ`}ûGû7ü#þOö^Ÿ³ìøüÁ?ð±aOŽ^ ÿ†æÿ‡ll³ÿŒÕÿ„»þOøRÿÙÿ~j¿ò5ÂÑð_öWü$aÿ„OþFm7Ïÿ„ïìßéžwö}ß¿þÉú'ü#_²ÏìÕáÏø^ðÔðüø7¢ÃKkÿÂAÿ ý•ðëÖð¼ÿ·¿á(×?¶ÿá-ò?·þÙý·¬}§þ;ûSPßö¹€=þ¿ ¿àŠßám~Ë>>ñü:›þýö/þ)Ñ?ášá]²ÿ„ãìß¾_ÿÂóþÁÿ… ðïíÚÚ_Ølþĺó?áYy?Ú“ýŸì–?¯µùÿVø]ÿ —öYñ÷‡?áë?ðø¶üñN·ÿ -ÿ þoü ÿiøuðªÃþgö÷ü/ŸˆŸdþÌþÍþßûöݯ—ÿ 7Îþ˃ík¾ý}¯€oŸÂÿ Yÿ3ÿ Åÿ oíýû9x'þEøKá?·¿á2ÿŒæÿ’]âøFá_ý“þBÿñNý‹þßùt7ý#ïêøöùðOü&¿ðÅŸñœßðÿð‰~ßß³—¿änÿ„Kþÿûþ/øÁŸù*>ÿ„›þÚÿäÿÛáÿ‘[Wò¿ÑÀ>þ¢Š(¯Ì/øL¿cø|ÿü+ïøTÿ?áàßðì/øL¿áyÿi_¬ÿ†7ÿ†¬þÄÿ…Oý‘ÿ /ì¿ð°?ávÄãí?ð‡yÿÙߺÿ„›Ëÿ‰]~ž×€ÆSÃSÍÿ†&ÿ…ÿUþ›þ›þ/þ_ð ?áRÿÜÇÿ ýC(ßëó þ /¥xwZÿ‚m~Ñúg‹?b¯ˆðQÜÿ ûìwð»Å_ü㿌Oǯ…׿Ø^'ø+ jž'Ó?ὊÛÅ7_Ù–ùö~ ¸·½ò´ù®æôö¾ÿ‚£x›ã¯ƒ¿aOŽ^#ýšj?€±wÆÍ;þŸü!_´·íGâx[àWÃoµüaø}aâ?øNuïxĺE‡öÏ„®µíLû^‰{æë>)Óá·û5ÔÝÛ€ÿ¯éž¿ûÚéÖ?±‡ì‰e£üñìÙ¤ÙþÌ­t¿ÙÓÅš¯ŠußüÓ­þøN/‚¾%× ð­²E¡^Ýë6¶Ú­ÍÎ…,Ú¼7o4kôýx쟩øïZý–f­gâÅ|qø›«|ø7©üEøÕðŸPÑõo…Ÿ‡£é:‹µˆ¿m h~¶×øSãßÿÿ„kE¹ð߇áðv³¢Ï§hÙþ½¼°²û%´?d²»–Ö. 6Øø¡ðsáÆíÏŸ>ü8ø½ám?X·ñ ‡†þ(xÃ>Ð,uûK-CMµ×,ôéwvÖÚÄZv­ªÛÇt‘,é§qÈ#šUo¢áÜ·Çý?ìƒÿŠéøÏÿÓ6£þÇû|ÑóþÈ?ø®ŸŒÿý3j9ãßðäÎÞ*ø9ð‹Çz¼)ã…FÔÿe¯Ù“Zøiáï‚úÇìçð#Vø;ábøSá>§ð‹áýÿÃO k÷2ë“Üëžð%ׇŸJÑu‰'ñ?‰^K«kH§wñ ó4…®î žï^…ÿãý¾?èùÿdüWOÆþ™µðî?ÛãþŸöAÿÅtügÿé›QÏÿƒÿ <öŠô/øwíñÿGÏû ÿâº~3ÿôͨÿ‡qþßô|ÿ²þ+§ã?ÿLÚŽx÷üùãÿ|'áoÿÁH¾xÇ^ðÿ<ãOø'ü7Â~1ðw‹4m;Ä~ñg…¼Gñãþ ­£ø‡Ã^%ðö±m5¦»áûý&òîÖöÊêm®­®¥‚x¤ŠGCúAÿŸÿ‚YÿÒ5?`üCÙÛÿÍxÿì±ÿþøùð{ö¦Ð¿ioŽ´ç‹¿ð‰|øÍð3à øSû,øÏàO•ÿ §â/ìïãíkÅ÷ˆü_ûY|Cþ×ûü3Γikcoa§çþ;›‰¯ÉŠý^¬äîÛ_Ö€|ÿŸÿ‚YÿÒ5?`üCÙÛÿÍðéÿø%Ÿý#SöÿÄ7ý¿ùÜ×ßÔTðü:þ gÿHÔý€ñ ÿgoþw5òü?þ ïû|ÿ‚wÁC¾(üý‡ÿdƒÿ|/ûþÛð|Eø]û4üøã¿ÿm~Ë¿¼;¬ÿax»Â~ ´Ô4ŸµøVÕl.¾ÏqÚ,õ;‹YwÁ<±·íå|ÿ`ÿ”YÿÁJÿìÀlýgoˆÔùûEùõáÿ„? ?iŸŸµÕ×Çohÿ5‚?ü!ð¯à~³­Ç,:ÿÁ \~Ê_³?ÆSà·ˆ4¹­ï¾|G—âWÅ_jÓxË÷o‹åžÇÃñI®5·„¼)‹Ðè-;ö]ÿ”¦| ÿ³ý½?õ¢¿à™µÇ|=¾ÓuOøSѼ{ÿ SGÔ|!á«í+â‡Û<'¨ÿÂÈÓnô[+‹ÿhx J°Ð¯¿¶-d‹Qó´[-&_í3N´¶³haNÇö]ÿ”¦| ÿ³ý½?õ¢¿à™µ3ø_õÔ@ÿ‚ŽÿÉü~Ãöh?ðQoý\ÿðLšóÚô/ø(ïüŸÇì1ÿfƒÿÿÕÏÿɯ=¢? ùþlŠüÊý•~ü"×ÿgoÙGö¿ñ­æà/ÚGâ×ÃÙ»â7Ä¿ÚVÚãÃø—ñcÇ?t¿Ï«|.ñß‹õÍ>XücðãÅ^(ñe—†´ÝG.¢%džl~i¾Õü-à[¯þšÕöüóþLŠ/û;ïø)wþ¼§ö¶¯Ïûÿù=ßø*ý÷ÂOýv·üþ¿@?àŸòdQÙßÁK¿õå?µµ~ßÿÉîÿÁPìï¾뵿àŸõœ~9|ÿ0;ê+åŸÛ'Ä:ÿ‡¾ ÚGáÝsXðìþ2øïû&|&ÖõOjwº¾¾øÕûVüøAñÃCñ“<:‡…5‹ß‡þ8ñ5®±¥\Ùk:D÷ñêZ6¡§ê¶¶w¶û ¾üø ãè4oƒ:„> Âcájw¾Zx3ÀÞñÇü#׃­u‹ð|,Òt˜|hð’èz.¥â ,´,¼s£iÞ.mgû+ÀãAÐ?þ ÿ&ûpÙ þÒ¿ú¦ QY€Wæü#Jðî—ÿÿ„wö*øûhÿÁO¿k W]ÿ„ûÅ_üSÿ câ+¿ø@´ÿm_ÂÑÐ,?áðŽü¸?³t¯}·Â¶ðŠÍý‘¨\ù—?OkàØÄß|Kÿ §ÿ Ïö£øûPÂ?û~Ѿø;ÿ Äñü3ÇÀ­+þßøWß²çÆ¯øCü ¡ÿb|ð—Ÿ«ÿÂI§êŸÛÍ·ü$_n×u ñy WáÀ-Ávÿð__ÛsÄ6_ðL‹ÿ üm}û0xN×Xÿ‚§ë>?øù¨üý¤ôäðß숱|ðŸÃÏøF‡ºˆ,#³Òìå»Ðµ›½Uäø©¼Öë-î²¶ß»•ùðoÇ?µ…ÿüGö°ð‹¿oOÙâì¢üðæ§ð»þ ýàßü6½ý²>xî]öj“Pø£ñcÁšg›Oé>»½Õ¾"ÜÛ\j>-Õ,ÚŒhì#K«Ó€íý_#õö¾`ý·-tëïØÃö»²Ö> øƒö“Òo?f¶º§ìéá=WÅ:Š~>é× |Y ïÁ_ kž°»ÖôoxªÙåЬ®ôk[VÚç]Šm:Þk´†6ú~¼ö°Ôüw¢þË?´®³ð»â€>|MÒ~|dÔþ|jø±¨húOÂσþ;°øuâ;¯üQø—ªø‹BÕ4ý3ÀñZ~­¬Ü_éšœv“s-Õ…Ü %¼€ ÿÁ4¯è¿ðM¯ÙÃLðŸìUñþ ßáûoø[ÿ`ýŽþ(ø«âŸ¼wðÎøõñFâëûwÄÿ´ /ÄúŸü$²Üø¦×ûNÂ"ÏÆÖöö^nŸ ¤Ò~ž×À?ðK¯|uñì)ð7Ä´·íGðöÑøÙ¨ÿÂÌÿ„×ö–ý—ßûü.ñWÅ?øïã“ñëáuůö‰þ 觉ôÏøGïb¶ñM×öe„þ}Ÿ‚n-ï|­>k¹£ú{ö#µÓ¬cÙËGø+âÙ³I³ý˜>Zé³§‹5_ë¾)ø§[ü)ðœ6_|K®xêÂÓ[Ö|Aá[d‹B½»Ömmµ[› YµxnÞh×È?à¨Þ&øëàïØSã—ˆÿfŸÚàì]ñ³Nÿ…gÿWí-ûQøƒÁÞøðÛí~Xxþ{ÇÞñ.‘aý³á+­{@Ó>×¢^ùºÏŠtømþÍu$7vþÿû'ê~;Ö¿eŸÙ«Yø£ñGÀ~&êß> ê~5|'Ô4}[ágÆßü:ðå׋¾(ü4Õ|;¡iz~§àx‚]CVÑ®,4Í:Î};V¶–ÖÂÒŽÞ0?¯Ïúþ™ïõøGÿõè ðçìañ6ËÀ¿ðL‹ÿðI½&_ÚÆ—W³§Æ¯ü|øâŸj/ð§à¬3|j°×?h¿èºÝ¯‡õ+h-4(­-mdÒ£¹øqw4w=ôq~îWäü[Ç?µ‡ÄÙgÇÚÏí‰ûz~È?ðQ‰¶ßüS¦h_¿b¯ü6ñ·ÂÏ ø‡_ ®´Ï…Úþ«ð»áOƒôûˆ^ ½ñ>­wo6™=âiÞ6Ò¥’þX&··µúü¿¯é¯µù…ÿ7Ò¼;ªýÿá"ýо ~Ú?ÙßðSïÙ?UпáñWÅ? Ã'xŠÓþïìÏÛWƿ𫴠ÿøHüàO2í-+Äbð­çü%PÿkêÞ]¾ÿÓÚøöùñ7Ç_ ÃÂŒý¨þ~Ëÿð~ßß³—†~1Âýñƒ¼?ÿ ð+Uÿ„Ëþì¹ðWþkŸÛü[äiðéú_ö>³sÿýïØuÝ?d¾pßÔQEù…ÿoìoÿŸÿ…ƒÿ câü<þ…ÿoü(ÏìÛïøUŸðÆÿðÕŸÛð¶?µÿáZ}—þü.Ïø“ý›þ?û;÷¿ðŒùñ4¯ÓÚùþ/Û#þçþ÷ü*þáá2ÿ…çý¥cÿ Oþ#þ?ö'ü*ìøYjÿ„þŸüN>Óÿw‘ý£û¯øI¼Ïø•Ð×Õù…ÿ—ñ—ìoðÿþ µûGø»þ ðŸâÇÙIÿ…Aÿ káwÂíJûIñߊ>ßñëáv™à?ì-CMø—àùíþÅñ6÷ÁšÖÏéÛìô›ˆÛíhÍauú{_ þÞž ý²> ~Éÿ¼#ÿþø±àߵέÿ7ü*_Š?tÛ[ÀžûÄŸj~<þÝÓõ/†ž0‚ãí¿ ¬¼g§Zïðæ£²óV·‘~Èê·ö 3ö#Ö~ øö0ý‘ ø7ª|)ð÷à ø–îëĺԷ^ Ó|>‡g{,šÎ­$—6r»êwìMÔ¿O×~Ïz7ÆO|øáïÚ/Åžñïí¡| øi£|vñ×„í ³ð·>2i~ Ñl~'ø³ÃV–¾Ñbµðþ¥ãh5ËË(£Ñ´˜ã¶¼‰L°P-bõú(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠüRø{ÿ¨Ñ¾*xÀÿ<ÿîý¿µï|Hð‡†¼{à½sûGþ í¥ÿløOÆ-—ˆ|;ªÿfk?·õµæöQ³›È»·‚æ;Ëž¥Wzÿø{f§ÿHØý¿¿ð ÿ‚rô«òÿþ ñÿ&ûÙ þÍ_ú¦<__V¼‹Ïðÿ >‚ÿ‡¶jôÛûÿ ø''ÿL*ø{f§ÿHØý¿¿ð ÿ‚rô«çÚùgÅ_¶OÁ?øçÆß®m>;øŸÅ?5+ÃÞ7O…ÿ²gí[ñ@ðö¿­x;Âÿ4ýóÆ ~ kz4šÃx7ƾÔ$µ‹P’{x5ëqqR9@r.ïðÿ ?J?á횟ý#cöþÿƒþ ÉÿÓ £þÙ©ÿÒ6?oïü(?àœŸý0ªù—ÃÞ!Ð<] h~+𦹣øŸÂÞ'ÑôÏøkÄžÔìµ­Ä:µe¥£ëš±¦Ï-¶­£Ýé×6×·VòÉÄË«Š9Ÿáþ@}ÿlÔÿé·÷þðNOþ˜UðöÍOþ‘±ûáAÿäÿé…W̺f¹e«^ø†ÂÖ b)ü1¬A¡êRj~×ô[+›ÛCñ$sø{RÖ4Ë{ohãNñ „Rj:L·º|Z…½ö“-Òjº^§gi‘àøOâF‹{âê¿Û:>ãˆ^¼¼û¥§y>,øWãïü/ñî•ö}VÎ dûŽ|â+=#kk¯ìïµYMsg4œ‹Ïðÿ >±ÿ‡¶jôÛûÿ ø''ÿL*ø{f§ÿHØý¿¿ð ÿ‚rô«çÚ(ä^‡ùôü=³Sÿ¤l~ßßøPÁ9?úaTÃÛ5?úFÇíýÿ…ü“ÿ¦_>ÑG"óü?ȸ¿fÏø)‡ÿh–?³¦©û.~Óÿ³÷µ¯„þ5xoTøÕ/ìÁ¨ø[Ä~øSãOƒ¾ñ……ïÀOÚkÇWv^ ƒVøçàI"‹P±²¶¸¶–íâ»imŒ/ú=_€?²ïü¥3àOý˜íéÿ­ÿͯßêÎJÍ  (¢|ÿ`ÿ”YÿÁJÿìÀlýgoˆÕ÷õ|ÿ`ÿ”YÿÁJÿìÀlýgoˆÔùû^ñCöiø5ñ_³ñ'ü7¬jŒz=¿†uÛmÇ¿ü |Gðu¥î¡ià>ðGŠôí+ã¯ÃˆgÖüN°øsÆvzö…5ñ´zzÛxƒZŠÿÝëó+áψi½'ö†ý¿-¾ ü"øãï ?íMà9ïõŠ´gÄ„:ý¶¾ß°§ì_Ö™gá¿ ~Ë^7¶¾ÑÓNJ–;çÕ­ç–{Ë‹vÓ¡ŽÖ+›¾€?Miß²ïü¥3àOý˜íéÿ­ÿͯÿàŸò`ÿ±ýšìÕÿªcÁuöì»ÿ)LøÿfûzëEÁ3jgð¿ë¨ÿÿ“øý†?ìÐà¢ßú¹ÿà™5çµè_ðQßù?ØcþÍþ -ÿ«Ÿþ “^{D~óüØ¡þÍ?¼9ñ.‹O†õˆ|RÚLj|M§iW>=ø‡©ü4ð¿Œ|_§Œ<}àO‚úŸŠæðwÃ߈úÂxƒÅÇWñ… éÚî¨þ>ñ4—ú…Äž&×ÛR÷zü øwâÚnãþ ×ÿòÒ¼Kð‹àF“ðuuø$Þ;Ðÿhψ!ø—.mûF~Éšœÿ ïÿe­/J·Ö/g‹G]FÅ|i,Z_Ý=¶£«µ¤QÞþùÕöüóþLŠ/û;ïø)wþ¼§ö¶¯Ïûÿù=ßø*ý÷ÂOýv·üþ¿@?àŸòdQÙßÁK¿õå?µµ~ßÿÉîÿÁPìï¾뵿àŸõœ~9|ÿ0:oø{@ñv®xSÅzâ xŸGÔü=â_ ø‡L²Ö´èÕ”ún±¡ëš>¥¶Ú¶w§\ÜÛÝZÜE$\I±¼nÊ|ãáOÀ¯‡??·§ð]¿Œ/µÿeůø·âOÅŠ|}©éºö‹øóüCøÉã]Ónµ¿]iº*j+¤é×¾+Öo¬¬ ¼Ö59îü#þ >¿mû<è×>Ó4}kÅ6ÿµ7ì?†´ë—¾Ð5m~/Û¯öp“GÓ5Ïi¾Õî|=£Üj+mÕõ¾“ªOi²\E§^ÉÛKçÖ¾>k·ÇÀø^ >|;û?ìƒûeÿÂ1ÿ §ã‡Œþ2ÿlyßÿ`Ÿí¯íïøKÿg¿ÿÂ7ö+Iû/Ùÿµ~ÙöÛŸ;ì?e‹íšëÿðPù0ÛƒþÍö•ÿÕ1ãZþ¯«ùAÿ‚„ɃþÜöh?´¯þ©×õ}YÔéóý(¢ŠÌ¿0¿à™2ýücÿÿ†;øOñáOü"ßðSïÚÃÁ¿µ7ü'Ú•ö£ÿ 'öÈÐÿáÿ…ßñcÁ_nø—â_°xYûW†?³m¡þÀ‚/ì鼿 é[›í§µà¿á©¿âõÃQÿ€ÿ’ÿñþ×þü,_ù5Ÿø“£ÿ…Õÿ þkÿüŒð’aÅ9ÿ_ÙŸòÞ€=þ¿þ|Kÿ‚iêŸð__Ûsá‡ÃÙïâÿ‡?à§žý˜<'¬þÑ´^³­j³üñïÁ¹ü7û"M¡øOÂzß/í,üA“®ü ŠYbð&‹!“Áz™:œ¦Y$Õ¿w+äÿÃ|ÿÃd|Xÿ…ƒÿ ƒÿùÿ„Nÿ…ÿoü.øløZaøiý¯ÿ cûoþ(Ÿø@?´ÿáq}›ûþ&>Gü#>oï?µ(ëêùƒöÜÖ~ øsö0ý®üCûEøOÄ=ýŸ4/Ùƒãî³ñÛÀ¾¹žÏÅ>4ø7¥ü)ñe÷Äÿ øjî×ĺ,¶¾ Ô¼¹ge,zΓ$w7‘:jv Ô_O×ñcþŸü*ωð£?áÿ…ÙÿŒ¿áNÿÂØÿ„‹þgü-?øGu/øWßð²ÿáÿ‰¿ü ð–ÿdlÿeÿÄÇû;í?aÿJò¨àø#GŒ¿cˆðM¯ÙÃÅßðOï„ÿ>~ÈÚ·ü-ÿøT¿ ¾(êWÚ·Žü/ö_tÏnê—Ä¿Oqö߉¶^3ÔmwøQÙg«[Æ¿dE[ _ÓÚðÙsþ›þW¿áµá@ÃLÿÅMÿ /þsþ/ü(¯ù|Aÿoü ßð¶?â ÿ’ÿ¯öŸö‡üÆ´>Éþ…öj÷ú(¢ŠüÂÿ‚ËøËö7øÿÚý£ü]ÿøOñãì¤ÿ ÿ…µð»áv¥}¤øïÅoøõð»Lðö¡¦üKð|öÿbø›{àÍFëgˆôíözMÄmö´f°ºú{ö#Ö~ øö0ý‘ ø7ª|)ð÷à ø–îëĺԷ^ Ó|>‡g{,šÎ­$—6r»êwìMÔ½íGÿ Mÿ +Ç?ðÅ_ð ?á¦â™ÿ…iÿ Gÿ þWüŽ>ÿ„ËþŸøTÿñPÉ?ÿ„«û3û?þc?ÙÿkÿBûMzÂøZð«>Âóÿ„þgü  ÿ…Åÿ Ÿþ/øUŸð´ÿáÓ¿á`ÿ´ÿ„Ãþ&ÿð€Â[ý¯ýý©ÿìï³}»ý+Í þ¿ÿàÞ¿‰ðM?ŠŸ±‡ÄßÿÁ,?g¿‹ÿ³gìùgûOøÓFñ~5kZ®»âWã%¿ÂŸ‚·Þ!ñe…Þ±ñÃÇòÇáùü¨ü<³Š%Öm£[ íÆ™ ;Ý^þîWÈ?±Wü7Ïü*Íþ-ÿ ƒÿ ³þ«ÿ¿ü1Wü.øUŸð«?áð¯ö'öÿü/?ø›ÿÂÀÿ„·þµý›þ%ßÙßÙ^OúWÛ(ëêüÂÿ‚›øËö7ðwü;ßþá?ÄŠßð”ÿÁO¿dÿþË?ð€êWÚwü+oÛ#\ÿ„ûþ‡Åý‡â_†¾ßà ì¾'þÒ¶›û~ ´aó<3ªí_³þž×€|}ÿ†¦ÿ‹+ÿ ¹ÿ þKÿÃøh¯ø_¿ð±äÖâsÿ sþ¯ü+Ïù¯ÿò/ÿÂ7ý»ÿçü~ÿiÿË ÷ú(¢€ øþo_ðôÏøCá¨þ?ÿÃLÿÃÿÂMÿ Uÿ Œá–áEÃEeÃQÿÂ+ÿ7ü#ÿð¿ÿá`Å'ý¡ÿ 7öÏü#Ÿèߨ_bÿ‰…}ý_ ÿex‹þçûoþ«Àð‰à ÿeÃÅ¿á*øYÿ Oþ/ø\ÿkÿ†*ÿ„#ûþoø@?³?âºþÕþÔÿ„WûGýû?û_ý&€>¾¯È/ø/Gü2Ïü:ö¬ÿ†Õÿ…ÿÿ Íÿ3þ_ü2çü+¯ø^¿òr_¿á ÿ„þÇüSÿòP?áþÓþÐÿ˜7ö‡Ù?Ó~Í_¯µòíéã/Û#áÿìŸñ[ÅßðOï„þøãû\é?ðƒÂ¥ø]ñGR±Ò| â·üIðv™ãÏíÝCRø—àø-þÅðÊ÷Æz®ÿéÛï4›x×ínËatþºþCþ ïÿ ³þöÿ…ÿ þŸü2ìÓÿ wþÇü#¿ð´ÿáV˜ð_ü+ïøYð‡ÿÄ£þü"_ÙÛ?Ùñ.þÑûOØÑ|ªúú¼ƒö{Ö~2xàÀÿþÑ~ðÿ€¿h=wáÃMgã·|'sç…¼ñ“Tð^‹}ñ?Â~»µñ.µׇôßO®YÙK³«G%µœNšú‘u/¯ÐEPEPEPEPEPEPEPòƒÿøÿ“ýˆ?ìÐf¯ýS ¯¯«äø'Çü˜?ìAÿfƒû5ê˜ð]}}]ù¬jŸµ×ƒ|wÿ-ø“û9øáöàÚ?Àþ!Ö>ø«öuø›ñ‡â‡Œ¿°aŸØ«Tñªü5Ô| ûFøV-gÆx$×F_íŸéöúm߉´«=`ßè߯”Pâ§í¨h¿<ûü-øñCÂ~Çz'ìãâ­Kø£ñ'öèñ÷ìEàë_t_ÙÃÿ³–£?íkû:ø2æxÃVø]©|_Ôtß Z› ÅvVÚω–ÖgðŽšlúÿÞ/ñ¾‰ðö5Ö><üwð†…¬j,ámÇñ'ö„ý¡?àšø•ñªãÁŸ n®;ü9ø ªþÚß|=ñÏÅŸüq{û;|CøQð‹Zÿ‚D|ø·¡èÐ>ø»á~¿ãø)&›àßüWñ—ƒíô§„Õ?g_ü_ÿ‚¤j~"~Þ?bï…úæµàïÛšþËúN‰ûZüеO^ÛðZûâ„^ð"ÿ„cZðGöÿ§ðf‹/Œu¯øBüIáj>û_ˆŸQŸû.ÿ@Ðïtÿ?ì—Z>™<2YAëôPEPȼeûd|?ý§áþÐ_à×5(õ?Ê—¿>%è¿´? LJ´ÝcSe›XƒàïÁ dÓ´˜£A§øûV–ÔÈšäž_ŠŸµ]÷ÅÿÚãÄíwà¿ìÍñâý¯ìÕá +À_³ŸÄø£öqðÿÂþÕøãð{ö›øƒ¥|GºøŸñóCÕ¼WðƒBø·û1þÌžÕ'ðÍ•¶£a©i_ü1q0×tí.çGèúùð÷À^øWàü/ð•ýƒào†þð×€¼¡ý»RÕ?±¼'àýËÃÞÒ¿´õ›Ë›ÍGìÚ>gŸwq=ÌÞO™<ÒÊÏ#v?²ïü¥3àOý˜íéÿ­ÿͯ6øCñC@øÏðÓÁßü5g¬i:w‹´xï®|7âk{+ø'_¶–m7Å<}£Øjqøoâ?‡øg‹õ‹ÁZÂ/éÚïì÷®jmý¾ÚÌÚ<2ø#±ºÔ§š nj6—’j1éÀÞï_‡Ÿµ¿ÖßþþÕÚÇìEûSx[QøÝñßâN™ñRëÄ~ÏÓhý¿i=à7Â?„^!‹á_‡¾?ßx÷Â_ô]+öVý‹5ˆêúUů† ¾ø»}5ŠÛA Á¢~áÕöüóþLŠ/û;ïø)wþ¼§ö¶¯Ïûÿù=ßø*ý÷ÂOýv·üþ¿@?àŸòdQÙßÁK¿õå?µµ~ßÿÉîÿÁPìï¾뵿àŸõœ~9|ÿ0/øãÀ^ø‘¢Ùx{ÆšWöΧxÃáïlìþÝ©iÞO‹>øûÃ_<ªý£J¼‚Y>ÁãŸøvûÈyÚëû;ì·°ÜÙÍ=¼¸öÃOxÇ@øÃ£Ï£øŸÅ>Ñþ,ü!Ñ|W¡ø†]JËF²Ö¼sá _‹þžÛKÔÛO›XƒâÁ Ùj+s š†“¨x.ëOW³‘õ+y¼ãö­øÅâÏ‚Ÿ|Mâ…þÿ…ñÏÄ»<û>|0Œi³Ü|CøÕâ˜.­ü¥\iú‹4?µøCLò5øºxu;I4x#Äšü“Ck¤ÜÍÈ?°w†|gð'â7‹~Çû5þÑÿ > kß>ø¿Àž<øßðÆ•Ǿ|/øSû)øÏÃ'ñGìõñgÄNý¡ð“áÿìç«xzÊîÎÊ÷WÕ¬~%ßÅ*é–~a GÁB?äÁÿnû4ÚWÿTÇkú¾¯åþ ÿ&ûpÙ þÒ¿ú¦¾¯Â?€_ ?àšz_ü×öÜøŸðÃö„ø¿â?ø)çˆÿf èß´_ìé¬èº¬üðn þÈè~,ðž¹7Àû KÏM¤è_e–(¼w­H$ñ¦¦™ŠHôŸÝÊüáøiñ/þ YªÁK?hO†ÿg¿„ÿ‚aøsዬþΟ´^­iSüdñïÆIô¯ókžñf‡Ç û»?ëk¿¢ŠY| ¢Æcð^˜F§(–95`;_ðßÒê~W̶æðoı‡íwáïÚ/Åž ðìù®þÌtoŽÞ:ð´÷ž)ð_Á½SáO‹,~'ø³ÃV–¾Ö¥ºñ›à™õËË(£Ñµi$¹³‰L¿b-eú~¼ƒö„Ö~2xsàÇþΞðÿh= áĽgàO|YsŸ…¼iñ“Kð^µ}ðÃÂ~%»ºñ.‹¯‡õ/A¡ÙÞË&³¤Çµä®ú‚ƒuÄ?ðFþÆÿÿà›_³‡„àŸß> |qý‘´Ÿø[ÿð©~(üQÓo´Ÿø£íÿ¾(ê~<þÝÓõ/†žžßì_o|g§Zïðæ¾ÏI·‘~ÖŒ·÷_§µòìã/Û#âìŸð§ÅßðP„þøû\êßðœÿÂÚø]ð»R±Õ¼ á°|IñŽ™à?ì-CMø—ã.>ÛðÊËÁšÖÏê;/5kˆÛ쎭akõõ¿®Ÿ‡@¢Š(ó þ /àߨßâüköðüâÇÄß²6­ÿ ƒþ×Å…Úmö­ã¿ ýƒã×ÂíOÀØZ~›ðÓÆÜ}·âm—ƒ4ë­žÔvYê×7ÙZþ×éïØFø7áÏØÃöDð÷ìéâÏx÷ö|пf€Z7ÀŸx²Ú{?øÓàÞ—ð§Âv? þÉÿ¼]ÿþøOàŽ?µÎ“ÿ7ü*_…ßu+'Àž(ûÄŸiž<þÝÔ5/‰~‚ßì_ ¯|g¨Úïñ¾óI·~Öì¶^¿û=ë?ÿ…!ðŸÆ¿aøiâ_°xYûW‰ÿ´®fþÀ‚/ìè|Ïi[—í§µòíwã/Û#ÁßðÌ?ðÇ üñ[þŸÚÿ௃joøOµ+;þ·ìo®ÂKÿ ¿âÇ‚¾Ýñ/Ã_oø£}—ÃÙ¶ÐÿoÏ/öŒÞ_†u]­öp¯¨¢Š+àøBãiŸð±ÿṿæÀá ÿ‡iÂ]ÿWý»ÿ Íÿü-û?µÿá ÿ§/øJæ_WÀ?ð›ÆÓ?á\à ÿÍ€ÿÂmÿ-ÿ„Gþ®+û þgþÏøUß÷?ÿdÂkÿO¿ð‹ÌZ€>þ¯€à¨Þ&øàïØSã—ˆÿioÚãÿì]ðONÿ…gÿ ¯í-û.xƒÆ>øëðÛí~Xxsþm{À>ñ.¯aý³âÛ­@ÔþÉ¢^ùº7Šun>Ík$×vÿWÈ?·¦•â-köOø­¦xOö*ðüCÄ?ðƒ}ƒö;ø£â¯…ž ð'Æ'âOƒ®.¿·|Oñ«@Õ<1¦Â?eÏŠm´ì'óï<ooeåjZMû'ê~Ö¿eŸÙ«Yø]ñGâdžZ·ÀƒzŸÃ¯_5 cVø§ñƒÀ—ÿ¼9uáŠ?õ_hZ^¡©ü@ñ‡åÓõmfâÿLÓ¯'Ôuk™n¬-'i-ã÷úòÙî×Q±øð>ËXø+áÿÙ³V³øAðÒ×Tý<'ªø[]ð·À-FßÁz,7¿|5®xÂÓDÖ|?á[”—B²»Ñ­m´«›m )´ëxm××袊(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(ñKáïü_FøWàü/ðüGöþÐ| ðßÂð‚ô?ìïø'¶©ýá?è¶^ðî•ý§¬þÀ77šÙ´}:Î>îâ{™¼Ÿ2y¥•žFëÿáÒzŸý$ŸöþÿÂþ ÉÿÒõ¯ž>Á[?mŸß¾ühð§ìû,éþø½ðãÀÿ<5aâø(wÅ«M~Ç@ñ÷†4¿èözå®›ÿÙ»¶¶Ö"ÓµkdºŽÞîê$X®&Œ,­èÿðñÏÛãþŒcöAÿÅ‹|gÿédÕÚ~ü=þ'©ÿÒIÿoïü'ÿàœŸý/Z?áÒzŸý$ŸöþÿÂþ ÉÿÒõ¯?ÿ‡Ž~ßôc²þ,[ã?ÿK&øxçíñÿF1û ÿâž3ÿô²h´üþÿø zü:OSÿ¤“þßßøOÿÁ9?ú^´äõ?úI?íýÿ„ÿü“ÿ¥ë^ÿý¾?èÆ?düX·Æþ–MðñÏÛãþŒcöAÿÅ‹|gÿédÑiùýÿð@ôøtž§ÿI'ý¿¿ðŸÿ‚rô½hÿ‡Iêô’Ûûÿ ÿø''ÿKÖ¼ÿþ9û|ÑŒ~È?ø±oŒÿý,š?á㟷ÇýÇìƒÿ‹øÏÿÒÉ¢Óóûÿàèðé=Oþ’Oûá?ÿäÿézÑÿ“Ôÿé$ÿ·÷þÿðNOþ—­yÿü¹£êÚ„uˆ<=â» 3S²¿½ðÆ¿s h~+¶ÐüCkk;É¢ëx[ÄþÔ£µ¹X§}?Ä67‹¶»·–MŠùöjÿ’Ïÿÿ³¾ð_þ°?ìA__UöüóþLŠ/û;ïø)wþ¼§ö¶¯Ïûÿù=ßø*ý÷ÂOýv·üþ¿@?àŸòdQÙßÁK¿õå?µµ~ßÿÉîÿÁPìï¾뵿àŸõœ~9|ÿ0:mOÃÚµ{áíKXÐô}[Qðޱ?ˆ|)©é–W÷¾×ît s—:燮® y4]bO xŸÄºl—VÍï§ø†úͤ6×wHx{Ä:‹´ Å~×4ø[Äú>™â x“ÃÚ–µ x‡@Ö¬ Ô´}sCÖ4Ùå¶Õ´{½:æÚâÖêÞY ¸‚â9b‘ãuc±_ ÿÁ>?äÁÿbû4Ù«ÿTÇ‚ë@ø(Gü˜?íÁÿfƒûJÿê˜ñ­WÕü ÿÁB?äÁÿnû4ÚWÿTÇkú¾¬êtùþ€QEf_þÀÞ&øâ_øm?øQŸµÇÿÚƒþÿÛûöðÏÆ/ø_¾ ñˆ?áž>:é_ð†ÿÂÁý—> ÿÂaàmûà„¼ý#þ½?KþØÑ­¿á ½û»¨o—Éûú¾Aý‘4¯iðÓßð‘~Å^ý‹¿´kÿZ®…ÿоx§þÇ÷ðf~Ú¾5ÿ…] XÂ9ñÇ~\ÿÚZWˆþÛâ«?øEaþ×Ô.|Ë}€_WäÁ¿þÉ÷ÿðYÚÃÀ~ý½?kÿˆµÎ‹ðÚŸÅø'÷Œ¼cñ&÷ö7øàIt?ÙªM?âÂj m<1¤ü@»²Õ¾\ÜÜiÞ-Õ/Œ&i,#{«ôÓ¿_kó‡á¦ãKø)gí âßø&Â…~ ¾øA¢ÚèÿðTýÇÿõŒŸ´ž¢šWÀõ—ோ>x{Â0üBм?a%ž©gÞ»¬ÝéOÀ-1á·X¯te¶ý¯ý¬5?h¿²Ïí+¬üQø£ñàwÃ-'àÆMOâ/Ư„ú†±¤üSø?àK‡^#ºñwņš¯‡t-SPÓ> xÃñj¶qa¦j7j:M´¶¶s¬vò{ýyí k¨ß|øáe£üðÿí'«^| ø—k¥þΞ,Õ|-¡x[ãî£qà½j/‚¾%×ÿ‚£x›àWƒ¿aOŽ^#ý¥¿j?ÿ±wÁ=;þŸü&¿´·ì¹âø[ã¯Ãoµüaø}aáÏøAµïøĺ½‡öÏ‹n´Sû&‰{æèÞ)Ô!¸û5¬“]Ûûÿ쟩øZý–f­gáwň~jß> ê¾5|XÔ5[âŸÆ_ü:ðåׄ~(üKÕ|E¡iz†§ñÄ—OÕµ›‹ý3N¼ŸQÕ®eº°´¤·€ý½4¯k_²Åm3±W€?ࢠ¹ÿ„ì±ßÅ|,ðO>0y?|quý»âZ©á3þû(®|Ský§a?Ÿyà›{{/+PšÒhýö{µÔl~ü²Ö> øölÕ¬þ|4µÕ?gO ê¾×|-ð Q·ð^‹ ïÁ_ kž°´Ñ5ŸøVå%Ь®ôk[m*æÛBŠm:ÞG†5õúü‚ÿ‚+xçöOøû,øûYýŽÿoOÚÿþ !ðÊÛãÿŠtÍwãWí«ã‰>6ø§áÃðëáUÖ§ð»@Õ~(ü)ð~¡oà /ÞøcV´·‡LžÍ5j²Ç,ó\[Úþ¾×çü@ñ§‡>øºËÇ_ðL„ðI½Z_‹úýÕ¿ìéðWÇÿþ#ø[Æšsø/ÀÃñªÿ\ý<#¢è–¾ Ô®`»Ð¥´ºµ“UŽÛáŤÓÜ=¤ö1Äú=_þß>&øá¯øbÏø^µÇÿÙþÛûörðÏÁßøP^ ñ‡ÿá¡þ:ê¿ð™¾ý—>5Âàmsûoà‹|_þM?TþÇÑ®á²ûv»§ì‹Îûú¾Aý®ô¯jŸðÌ?ðŽþÅ^ý´³¿kÿ‚º®»ÿ ÷оx[þ;öŸð’ÿiþÚ¾ ÿ…£ _ÿÂGñÀždÙºW‡>Åâ«ÏøJ¦þÈÔ-¼»à_QEWÈ?Ú¾"ÿ†ùþÄÿ†Õðü"_ðÈ?Ú¿ðîŸøE~ÂÓÿ„‹þ?Ù?áµá7þßÿ„ÛþìÏø¡²¿²ÿáþÑÿLþÐþ×ÿF¯¯«àøF~ÃÓ?á2ÿ†\øÿÿ 3ÿ ÿÏü6¯ü#þ1ÿ†Yÿ…ÿ ý«ÿ ¹ÿ Wü'?ðÿÂÿÿ…ÿgöü#?Û?ðޤÿný‹þ%ô÷õ|ÿFðOü,_ØSã—ƒṿáÛÛð¬ÿã5á.ÿ„þ¿öƇگü_ð´|ý•ÿ Øáÿ‘›Móÿá;û7úgýŸw÷õ|ÿFñ·ü+¯ØSã—Œ¿á†áäÿØÿð¬ÿã ¿áÿ„ïþGö‡Æ‡ÚWüŠ¿ð«¼iý«ÿçÛ¿á,ÿ‘gRò?áûOú“ý¡hïÿ²~‰ÿ×ì³û5xsþŸü5ü#ÿ> èŸðÒßÚÿðÃCÿe|:ðå‡ü/?íïøJ5Ïí¿øK|íÿ¶mëiÿ„ƒÎþÔÔ7ý®o¯ý“õ¿øIeŸÙ«Äð£?á—ÿá øðo[ÿ†iþÈÿ„þãûWáׇ/ÿáF`ÿÂ/¡ÿbÂ%çÿ`}ûGû7ü#þOö^Ÿ³ìûýQEQEQEQEQEQEQE(?ðOù0؃þÍöjÿÕ1àºúú¾Aÿ‚|ɃþÄöh?³Wþ©××ÕÐ_ ëµoˆác|WøyðóöOý£þ2ÿšñ†‰à/øÇÀZÏ쯡øOþÍsáÿ‹ÑéZT¿i¿ kÞG„>(øI§´ˆí¾Óq4M?ï__Wäߊþ þÕW>.ÿ‚†|Høñ£ã¿ÂÏËñßÁÞ.ø_ð«ÃÞýšíü ñæ/ þDz5¦«m¡øÇãçÀvçEÖ¹wsm£Å¨ê×úL‘êÖú^ u _KŒšTšf¥¨ò þ(h¼1ªx¯ÃVzÅŽ¤üGøÇð¾ærÞÊÚõõÿ‚?|qð_ÅwGa¨]FÚ=ÇŠ|¬\iÒ4«<Ú}ͬ·6ö—/-¤?v? |c.‰¬êŸgˆãàíÇí­ðwÇ_´OÁé>9ý®eÖ¾Aÿˆø7ðÊÇG×,,tojÿ¶.áïÚöÛáõ•Ö·e¦ø•äñ7Éx“Ãú‡Äïë­ïÇ„³Ý5Æ‘©xˆÙø²Okˆš}®­ªZ€~ÊQ_ϯŠþøßÅÞø#âü4ûOÀËï‹ÿðTë¾ ý¡¿àŸß´'í}¦§‹>0þÜÓüCý›¼Y®þÆþÔ|=ãøÂïáüU»Ñ¼c«iBÛÃÚOŠ5=ðY]xÒÂ;¿Ú¿Ùïþ,ðÀ?þñî³ãøçÂß>xwÆž!ø….›?µïhž ÑtÏk>8ŸFñ§‰,æñ…Ö±ky>¦öž"×íšöyÚ kUˆ¥ôà¿EP¿eßùJgÀŸû0ÛÓÿZ+þ ›_¿ÕüÑh?|-ûJ~ÙðþΞ:¿ñ•àŸ¿ðJ/ø)ÿÁ_ꞺӬ|S¦ø[â§Åoø'?|Cá«ÝcJ¿´³ñ:N»w%”·V7¶ÑÜÇÏis¼/óüAYÿ³ÿ¢ùûáÓý¿ú«üOúèôüíú3úú¢¿_ø‚³þ gÿEóöþÿçû;ô+QÿVÁ,ÿè¾~ßßøtÿgoþ…j‘kÙ}ïüëê¾ÿ‚°Ê,ÿà¥ö`?¶Gþ³·Äjüÿˆ+?à–ô_?oïü:³·ÿBµp?àØØþ Ýû1þÚ¿¶'Á_‹¿µÿŠ>&üý€à ?ðh_|}ðcZð%÷ü,Ø·ã¿ÂígûwLðŸÀ P¹ò¼?ãmVk_³ê–»/-íä—Ï%·˜ {/¿þús\‡üP>4Ö¿æPñgˆ¾xÃþ ºîµðËÇÚ—€í¬þ ñ…ÇÂï‰ßôí{.ñ ø´í[ý#¯¯È=;þ,÷íKûa~Õ–?èžð×í}àO„_´Ÿ•û‹KŸ€~7ýˆ?aì/‰úÿ“öX&ÿ…cñFçJ×§ÖõýF=Á ¹¡ëlòÛjÚ=Þsmqkuo,\Aq±Hñº±Úý—å)ŸìÀoOýh¯ø&m|ÿøÿ“ýˆ?ìÐf¯ýS ¯°?eßùJgÀŸû0ÛÓÿZ+þ ›S?…ÿ]@ôø(ïüŸÇì1ÿfƒÿÿÕÏÿɯ=¯Bÿ‚ŽÿÉü~Ãöh?ðQoý\ÿðLšóÚ#ð¯ŸæÀóÄ?´Í~'èçÃ?Âßuø…~!èúŸ†-4‰úÿ¬¼ðïី¾-²m¼k¬kzt´- è\]O©@š&—§É4bÂèõüâü(ÿ‹û~Â%ÿBø]ûNß~.ü,Ýþ¢øcãæûCþÅŸð¿~i»¾Ç§h¿ð–xu4o‰:‰§A¨kZö¿¦|uñ޵tA?£ª >Âÿ‚>É‘Eÿg}ÿ.ÿ×”þÖÕùÿÿ'»ÿAÿ³¾øIÿ®Öÿ‚×èüóþLŠ/û;ïø)wþ¼§ö¶¯Ïûÿù=ßø*ý÷ÂOýv·üþ³Ç/ŸæM®x‡@ðÅ”—‰uÍÃÚuαáï[_ëš–“eq¯ø»_Ó<)áM «ùãŽ]cTñNµ£éºuª±ž÷PÕ­lí£–æâ(Ÿ#Eÿ„Áðˆ|)ðïü"û„.áøm¢ÿbèdðÃïøF<7yÿ‡ƒ¬|Ÿ#Âü$¾ °—ìVËe¦oév¯ä}®Ò9>Xÿ‚€x{@ñwìó£xSÅzâ xŸö¦ý‚¼=â_ ø‡L²Ö´è×í×û8iºÆ‡®hú”ÛjÚ=Þssoukq\Aq$RÆñ»)ùÇàwˆuý3öÙø'û?|@×5âWìÝû,þÚ~ŸÄž)Ôïu_|OøEñkþ ó©|ø×«kÜë¨x×XÖþÇ‘âÏ5•†—©|RøkñÃE…¬t`Ã@>¦ÿ‚„ɃþÜöh?´¯þ©×õ}_Êü#þLöàÿ³Aý¥õLxÖ¿«êΧOŸèEV`ðì àŸøB¿á´ÿã9¿á¸¿á-ý¿¿hßÈÝÿ oü2ö÷ü!¿ñƒ?òT|QÿÏü+ÿ²È#þ)ß±Â[ÿ"¶‘æÿ¤}ý_þÀÞ6ÿ„×þOþ0gþwþ/ÛûöðOüŠ?ð‰Ã_ÿ`ÿÂÿÍÿ$»Âÿð“ÂÀû_ü…ÿâ¢ûoü"_ò4êþWú8ßÕùðoáwöWüGö°ø«ÿYÿ…µÿ /ÀhŸðéOøX¿Ú_ðËþF‡û5Cÿ Ïþ¿ü/CþÿíøGþÛöÏøWúÿøh}ÿÚ“}»ÍÖ?_kò àßÅí_ø,íað«þMÿ —þ¯€Öÿáí𮿳á¨<ýöj›þgü,øPÚü$Ùÿð}‹ìð°5ÍŸðÏ?²áû•£€~¾×€~Ö'ü$¿²Ïí+áÏø^ðËÿð|øÉ¢ÃKkÿÂ?ÿ ñý«ðëÄvð¼ÿ·¿á(Ðÿ±?áóÿ·þÙý·£ý›þÿ;ûSOÙö¸}þ¼ö°Öÿáý–i_ÿÂŒÿ† ÿ„àÆMoþ§û#þøh쯇^#¿ÿ…ýƒÿ¾¹ý·ÿ o‘ýö?ìMcí?ðy?Ùz†ÿ²LàðK¯ÿºý…>ø7þ›þOýÿ 3þ3WþïøNÿáth|aøƒªÿÈÕÿ GÆŸÚ¿ðŽ}»þ?ùµ/#þO³¡ù?ÙöŸWÀ?ðK¯ÂÅý…>øËþgþ±ý±ÿ 3þ0«þøA?áKÿgüaøƒ¥È«ÿ »ÁÙ_ð‘ý‡þÏùtß?þ¿´ÿ¦yßÚPEPÀ?ðToÿÂÅý…>9x7þ›þ±ý±ÿ Ïþ3WþïøA?áKÿgüaø}ªÿÈÕÿ GÁÙ_ð‘ý‡þ?ù´ß?þ¿³¦yßÙ÷~ÿû'èŸð~Ë?³W‡?áyÿÃPÂ?ðàÞ‰ÿ -ý¯ÿ ü4?öWïXÂóþÞÿ„£\þÛÿ„·ÈþßûgöÞ±öŸøH<ïíMCÚæðø*7¿á]~Ÿ¼eÿ 3ÿ'þÇÿ…gÿUÿü'ðº?´>0ü>Ò¿äUÿ…]ãOí_øG>Ýÿ gü‹:—‘ÿ'ÚÐüŸí Oý“õ¿øIeŸÙ«Äð£?á—ÿá øðo[ÿ†iþÈÿ„þãûWáׇ/ÿáF`ÿÂ/¡ÿbÂ%çÿ`}ûGû7ü#þOö^Ÿ³ì€{ý~AÁ¾Â¥ý–|}áÏøzÏü>í¿üS­ÿÃKÂÅÿ…›ÿ?Ú~|*°ÿ…ý½ÿ çâ'Ù?³?³·þÇý·kåÿÂÍó¿²àûGÚï¿_kò þ­ñGþ×ì³ãïÿé¿áÏßbøÿâþ§þ×ü+/øN>ÍðëáUÿü/?ìøPßþ×ý§ý¥ýöÏìK¯3þ—“ý©?ÙþÉbúû_þß> ÿ„×þ³þ3›þwþ/Ûûörñ·üßð‰Ã_ÿ`ÿÂeÿ3ÿ%GÂÿð“ÂÀû_ü‚?â¢ûoü"_ò+jþWú?ßÕðíóãoøB¿á‹?ãḿá-ý¿¿g/ÿÈ£ÿ oü2ö÷ü&_ñœßòK¼QÿÏü+ÿ²È_þ)ß±Â[ÿ#N‘æÿ¤}ýEP_ ÿÂûdÃ|ÿÂÁÿ…±àøwÏü2ü!¿ð£?³láiÿÃdÂçþÛÿ…±ý¯ÿ Óí_ð€“ÿ‰?Ù¿á1ò?´{ÿÏ™ÿJúú¿0¿á2ýÿáóÿð¯¿áSü@ÿ‡ƒð¿á2ÿ…çý¥}ÿ ³þßþ³ûþ?öGü,¿²ÿÂÀÿ…Ùÿ´ÿÂçÿg~ëþo/þ%tú{_ þÞš¯ˆ´_Ù?â¶§á?ÛWÀðNÿ[ öÛâ…~xÛÀŸüï‰>·ºþÝðÇÆ­KðƧÿ ”·>µþÓ¿ƒÈ¼ñµ½Å—›¨Ci Ÿ_WÀ?ðTo ü ñì)ñËß´·ì¹ñÿöÑø'¨ÿ³ÿ„×öiý— xÃñiúN³o©ê7j:MÌWW÷s¬—{ýQEQEQEQEQEQEQE(?ðOù0؃þÍöjÿÕ1àºúú¾ªð÷üoöðŽ¡øSžý©¼1áo húg‡¼5á¿ÁFÿࣚ.áíE²ƒMÑô=GÓjø­´ÓN¶¶·µµ·Š8-à·Ž(£HÑT~=Á[uïø%÷üßNø_ð÷Kømûo~Õ_¶ÇßxgFøû|1ÿ‚£ÿÁL,~!xÓN×üU…‡‹Ò¼ ¦'ˆ5É/èšo‡¼C}û~ÿÁB¾)Að+à¨ù^1øµãOKûUë÷~ðýÖ¬¬Í¯_øÄÚ,^ økñCP‰lµYÞ[CŸðçÏØ‹þy~×ßø²ïø)OÿEµëÏðÿ0¾þGÇ´WØ_ðçÏØ‹þy~×ßø²ïø)OÿEµ4Ÿ ?e}áü‘ñ‡þ ãûO|}ý·µßÙ?ãÇìÁ­üjý¾ø—öìý­åÔu¿ÞøÏY°¶ñ¿Á_Œ~·£øÃ–ß ÿl-I‹Ç:„77:Wû)5;½sY¿Ñ5}`ç^‡ùû3E}…ÿ|ýˆ¿ç—í}ÿ‹.ÿ‚”ÿô[WÈ?·Gü£Â_¿gxkö"ý¦?kïÙ;ö™°òüEðÇâ>§ûw~Ü| ®k]­ò¯Ã¯Š>øñËÄ¿`ð³ö¥ŠãWÐì“^Ðï-l5khõ›+=CÃñμÿó:+òþÍ«~Ë¿´GŽüWÿÕÿ‚•x?ö¾ýž?à«ÿ³ÇÛ|;âÏ ø‹þ CÿðÖûNèþÑÓY¹ø‹ðêÛFý®²?á`Â%ö}wWÒ4)&Ðuíî?ˆ?¤¹ðuΧ¦x7ú;ÿ‡>~Ä_óËö¾ÿÅ—ÁJú-¨ç^‡ù‰;ÿ[zŸþË¿ò”Ï?ö`?·§þ´Wü6¿«â€ðNÏÙ[öfø¦~5|+Ð>/Íñ5|⟅֞%ø­ûU~Õ¿´'öO¾Š*€û þùÿ&Eý÷ü»ÿ^Sû[WçýÿüžïüþÎûá'þ»[þ ÿ_ ðGÏù2(¿ìï¿à¥ßúòŸÚÚ¿?ïÿä÷à¨?öwß ?õÚßðOúÎ?¾˜6¹áíÄöPi¾%ÐôéÖÚLJ¼Cma®i–Zµ•¾¿áLñ_…5È-oà’8µ/Å:.©i×J¢{-CIµ¼¶’+›x¥Bh:þ™â»G¸ñN‹£ëžÑüI>™e.¿¤è'½ðö¥â]LÖ$€ÜØhúŽ£á \_ZÅ*Aw?†4én#’K+f‹bŠÐà¡ò`ÿ·ýší+ÿªcƵý_Wòƒÿÿ“ý¸?ìÐi_ýS5¯êú³©ÓçúQE˜|ƒû"j¾"Õ?á§¿á"ýµ|ûhÿg~×ÿ´­ þ ü,ð·ü2w‡m?áþÌýмkÿ »_¿ÿ„â<Éÿ´µ_ý‹ÅWŸð•Cý¯§Ûyvûþ¾¯€`o ü ð×ü6Ÿü(ÏÙsãÿì¿ÿ íýûFø›ãü/ßøÇÃÿðÐÿu_øCá`þÔá0ñιý·ðžF‘ÿÞ¡¥ÿcè×?ðÞý‡BÓöKç}ý_œ? 5ÿ\ÁK?hO^ÿÁOþ|TðM ëGÿ‚XhÞø§|dý›5Ò¾´¿¼YñÃÞ.›â»áûù/5KÈ­5ÝÓJHþ>é‰ ÃEe£5Ïèõ~A|ð7ìŸaÿ‘ý¬‹Cýš£Óþ|'ñž§ñZïÃ·Ä K-'áյ;á-.ñgø?âe’þGµ¿}Dõö¼ƒö„ºÔl~üp½Ñþ5xölÕ¬þ|KºÒÿh¿i^×|-ð Q·ð^µ5—Ưè~:¿´Ñ5ŸøVå"×om5›«m*æÛB–FâGšEõúðÚÃLð&µû,þÒº7Å…ß>8ü2Õ¾|dÓ>"üøO§ë·Å?Œ¿øuâ;_|.øi¥xw]Òõ O∣«[Eki;Gqûê¾"Ö¿dÿ…:Ÿ‹?m_ÁDóÁ7¾V¡5Ü1ý}_ÿÁ.¼3ð+Áß°§Àß~Í?²çÇÿØ»àžÿ 3þ¯Ù§ö£ðÿŒ|-ñ×á·Úþ0üA¿ñü':¼sâ]^ÃûgÅ·Zö¿¦}¯[½ótoéó[ýšÖHm-þþ Š( oMWÄZ/ìŸñ[SðŸí«àø'ˆ-¿áûí‰ñG¿ 韾 üXÓõ'âŸÁÿX|:ð寄~|KÒ¼E®êš†™ñÃþ‹OÒu›{ýOQ¼ƒQÒnbº¿»d¸ßëó‡þ ¯øÓÄü]{ã¯ø)ÿÂø+&­Åý~Ößö‹ø+à€<-à½9<à ¡ø+¡þΞ.Ö´K¯i·3Ýë²ÝÝ]GªÉmñÒíÒÒ %ý¯È/ø"·¿dÿ‡ÿ²Ï´oØïö ý¯ÿàÿ ®~?ø§S×~ þÚ¾ø“àŸŠ~(ñÜß¾Zêt +âÅoj½ðý—†4›Kˆu8,ßQðN«vO ÅÅÐëí|ƒû]ê¾"Òÿá˜áýµ|ûhþ×ÿt­wþï ü,ñOü5‡nÿá%þÓýмÿ G_°ÿ„sâŽü¸?³u_}·ÅVðŠÍý‘§Üù—>¾¯€oŸ ü ñ/ü1gü/?ÙsãÿíAÿÿíýû9x›àïü(/øÇÄðÏt¯øL¿á_~Ô¿áñ·ý‰ðÂ^~¯ÿ &¡ªlhÖßðY}»BÔ7Åä€}ýEP^ÿMÿ Mÿ4þ›þýT_øjoøjoøX¿øI€ÿ…Kÿsü$õ ¯¯Ì/øCcø|ÿü,ø[?áàßðì/øCáFf߬ÿ†7ÿ†¬þÛÿ…±ý¯ÿ Óì¿ð°?ávÄŸìßð˜ùÿÙß½ÿ„gËÿ‰¥~ž×È?·§ƒlˆ²ÅoÿÁ?¾,xàwís« ÿ —âÅ6ÇVð'…þÁñ'ÁÚŸ?·týKá§Œ ¸ûoÃ+/éÖ»ü9¨ì¼Õ­ä_²:­ý¯×Õù…ÿ—ñ—ìoðÿþ µûGø»þ ðŸâÇÙIÿ…Aÿ káwÂíJûIñߊ>ßñëáv™à?ì-CMø—àùíþÅñ6÷ÁšÖÏéÛìô›ˆÛíhÍatþº~=·¿g½ã'‡>üð÷íâÏø÷öƒÐ¾|4Ѿ;xëÂvÐYø[ÆŸ4¿è¶?üYá«K_ h±ZøRñ´åå”QèÚLqÛ^D‰¦X(±zý|Áûë?üGû~Èž!ý<'â~ÏšïìÁð Yøà_\ÏyâŸüÕ>øNûᇄüKwuâ]j[¯i¾ ŸC³½–MgV’K›9]õ;ö&ê_§è¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¹ÿx³ÂÞð·‰|uã¯øÁ~ ð_‡õŸxÇÆ>,Ötïx[Â~ðæs¬x‡Ä¾%ñ±s ¦…áû &Îîêööêh­­m­ežycŠ7qüc|}ý·o/ø8ûQø…ûÿÁ+üâÙ×þ ¡iñ~oƒßµwüÆú‹éņsxZ _Yðo>êK¢ëv¾Ô­ ÖN¡á=&çPñˆô¯xÇâ÷ÂÏ x£ÄšV  »y·²î}}ÿBÿ‚ð|dÓþ>xÛþ ‹ÿpøâÛöï_ßxkâ'Å¿ZAâφ±ÿ5/xGÀr\ëšmƇu¢x«Ä¹ñ<°x—Vñ6©¡øáçˆuMÛÅ׺ýůŠü%¥ûÿüÿþ üø7ÿéñPý­þþÿ‚hÁ+dø%Á½oáì·áÏOsãO7‰~&ü]ø“¢xã'Å=FÖ}Hx^ÛÆÞ)Ð|9¤Ú7‡ô 'Tº°Ðô7MÓt«²“[ÖµýWUý -ÕïÓ²ÿƒæÏø³Åžð…¼Kã¯x—Ãþ ðO‚ü?¬ø³Æ>1ñf³§xsÂÞð·‡4ëcÄ>%ñ/ˆu‹˜m4/Øi6wwW··SEmkmk,óËQ»Ž‚¿˜Oø9+ö–ø§âÿ~ÎÿðGoÙVókŸø*Ä +À> þÈ¿ñ—_ ¿e3Xƒþ?|{ÿ Ç^—Äþ ð·{m-ž±©OáxsRøqàO‹–÷ð«ég7esÈ?à†^ñOüÏöòý²¿à¾_<5â _øÄßì­ÿÕðwÄ Q‚‡¿üÿØþ*ø‰á¿xºÛ_´ðŸˆ.´•²Ñ.õøÊMxÓã®›s§E¤‰_ÖÕxì­û4ü,ýŽ?gƒ²çÁ]'û'á—ÀïhðןaáÛ c\þɵÛ>5ñwü"z—§êÿ@%eùú…$¿ð_ j?³üþYÿ:ðχþi:í?¥þÆÿ´ïíâÏxZÏÂÞø7ñ;ĺlÚ?ƒüK¡üBÖdÓ|9áù~xÓöÜž÷Å6Z]¼šEµä·:ž»awiái-ÿ­ªüÿƒœ¿eÏøjø#í=ý‘àoøN> ~Ïðˆ~Ô¿â¦ÿ„kþÿøTºì_ð¸¼sþ“â >ËÄÙÿ³7ˆ>9ÿIJûíßkû_üJôûŸG£ììþÿ»S÷òŠùþ ýûKÃcþÃß²oíGs«xVñÇ€ ¼}ãÏøU×ÿoð&‡ñOVðž™ÿ kÁZ™¯j“éŸðüM‹ÅšÖ›{¨]ê:Mç‡n4ÍNfÔ-.qõõ?ÿà³?ðFoÁO< áO‰ß |Wÿ ñÿýž>Åâ/Ù[ö©ðíî±á­cHÖ<5¬?‹¼;ðëâ/ˆ¼"ŸÚÿð€Â[»PÒ5}ÿfÿ‚Ìøïöˆñߊÿàš¿ðR¯ Ã<ÁWÿg¶øwÅžñ–á­öÑü5£¦³sñáÕ¶ŒÿÙð°?áû>»«é“h:öƒwćÒ\ø:çSÓ<ý×âügþÍàOø)ç<)ñ;áŠÿáž?à ß³ÇؼEû+~Õ>½Ö<5¬idžµ‡ñw‡~|Eñ„Sû_þøKwjF¯§‰µïë×rx“ÃqÜÇsâ/ø¤]VýWø=™ûyE8ŸðFoø,ÏŽÿhø¯þ «ÿ*ð§ü3Çüöxûo‡|Yá?YhþÑÿiÝÃZ:k7?~[hÏý‘ÿ þ/³ëº¾‘¡I6ƒ¯h7qüAø}%σ®u=3Á¿ÑÝÿ­½BŠ( a_ÿÁX?åðR¿û0Û#ÿYÛâ5}ý_0~ÛŸ|SûIþƵßìéà[ÿé^6øûû0|}ø+àíSÅ—Z…´ßüTøSâÏøzÿÄ·º>•wgáøumvÒKÙmlonc¶ŽW‚ÒæUH\òzŠwü2ïü3þˆOìÿ‰éûDÿô³hÿ†]ÿ‚¦Ñ ý€ñ=?hŸþ–mmÏÿƒÿ Ný—å)ŸìÀoOýh¯ø&mðË¿ðTÏú!?°þ'§íÿÒͯ`ý‘?dOÛ?¶„ÿh¿Ú/³|à_Ùƒö„ø+¥éhOŠßà6Šwü2ïü3þˆOìÿ‰éûDÿô³hÿ†]ÿ‚¦Ñ ý€ñ=?hŸþ–m>x÷üùöüóþLŠ/û;ïø)wþ¼§ö¶¯Ïûÿù=ßø*ý÷ÂOýv·üþ¿X?àŸ>)þÌß²¶ð¯ãQðüM›âÿíUñ[ĶŸ ¼Sâ/xIÿ†„ý«~5þÐ6ƒ¡x·ÅžðÆ¡âìïüNÒ¬n®®4 /ͼÓî+a•#üñgö/ý¾tÿÚ§ö½ø©ðWÀ¿²¾~Ñ_þ|VðÕßÅÚã?Âè_ðþÊ_³ìÿ¬è:'ûxãO8ñÀýVúÖêß_›Ï³×-Ö[kiã–3 ¥&ú;þ`s”S¿á—੟ôB`üOOÚ'ÿ¥›Gü2ïü3þˆOìÿ‰éûDÿô³jùãßðäÇÿðPù0ÛƒþÍö•ÿÕ1ãZþ¯«ù¢ý¡?`ø*gÇ€>ÿ§ý€|+ÿ —áÄ¿…?ð“ÿÃp~Ñ:çü#ð±<­xCû{ûþ½gý±ö?í´}—ív¿hû?“ö˜7ù©ý.ÔM§kyþ€QE@|ƒû"x7öÈðwü4÷ü6'Å|Vÿ„§ö¿øÕã/Ùgþ6ÇNÿ…mûëŸðÂøOã_°ü4ð×Ûþ hßeñ?ö•ÌßÛóËý£™âmWjýŸëêð€_²çÀ¯ÙþWü(ÏÂÿ ñÿâ?íGñ‹þ*oø—þŽ¿¿±¿á`øçþ+jðÿhÂ?¤ijKûiöOô>ÛÌ—x¿×çÃO†ŸðRÍ/þ YûB|OøŸûB| ñüÄ4]ötý4mJƒã'€¾2A¥|‡\ñg‹5È~Ø]Þx~m[Bøí,QKã½j14À4È„QǤþWÈ> ý‚ÿdÿ‡ÿ¶GÅø(„~ÿdþ×?|§|.ø£ñkþŸ‰7ÿð”xI±øi¦éúü zŸŒgðÆ‹åÙ|øtŸjÓ´[KÇÿ„wt— ÷wítõõyí £|dñÀ?ŽýþÉÿ |#ÿø±àŽ?µÎ“ÿ Ïü-¯Š? ´Û'Àž(ûÄŸê~þÂÓô߆ž‚ßì_ ¯|§]lðæ¾óI¸‘¾Öì×÷__W€~ËŸ²çÀ¯Ø»àW¿fŸÙ§Àßð­¾ ü6ÿ„›þ¯ÂMãÿbÿÂcãxûÄñQøûÄ®¯¨ý§Å¾)×®ÿÒïî<Ÿ·ýžßʵŠc÷ú(¢Šùöôðoí‘ñöOø­áø'÷Å|ý®uoøA¿áRüQø£¦ØêÞð¿Ø>$ø;Sñçö|4ñ„møeeã=:ׇ5—𵼋öGU¿µõÿÙïFøÉáÏ€ü=ûEø³Ãþ=ý ô/„ 4oŽÞ:ð´~ñ§ÆM/Áz-ÄÿxjÒ×ÃZ,V¾Ô¼m¹yez6“vב"i– ¬\ÿíGû.| ý´~xçöiý¥¼ ÿ 'àŸÄŸøFá5ðWü$Þ1ðwö×ü!Þ1ðÿ¼9ÿ€|A¥júwÙ¼[ámïýþßÎûÙî<ÛYf†O@øOð»ÀŸ¾|4ø+ð»Bÿ„_á—Áÿx7áwï ië×ü#¾øáÝ;Â~п¶|E¨]ê·Ù>þËŸ¿jøR¿ð¼ü ÿ Çü3ÇÇÿ‡µÁßø©¼cá¯øCþ:ü%þÙÿ…}ãŸø£üA§ÿÂAýŸÿ ¯ÿÍSíÚ5ßÚÿÓ´ûŸ.-€ÿEP_ÿÂ3ñ×þ™ÿ —ü2çÀøfoø`øFáµáðwü57ü/_øh¯í_øeÏøJ¿á9ÿ„ƒþü+ÿø«?³ÿáþÆÿ„ý'ûwí¿ñ/¯¿«À?áAÆSÃQÿÂêøÿÿ$þü3¯ü,øÅŸù(¿ð°ÿáu£þÆÿ’ÿÿ0/øI?´?ä\ÿ‰gØ¿å½{ýxíGÿ Mÿ +Ç?ðÅ_ð ?á¦â™ÿ…iÿ Gÿ þWüŽ>ÿ„ËþŸøTÿñPÉ?ÿ„«û3û?þc?ÙÿkÿBûM{ýxíGû.| ý´~xçöiý¥¼ ÿ 'àŸÄŸøFá5ðWü$Þ1ðwö×ü!Þ1ðÿ¼9ÿ€|A¥júwÙ¼[ámïýþßÎûÙî<ÛYf†@@øOÿ OþgÃOø^ð€Âìÿ„Á¿ð¸¿áSÿÂEÿ ³þŸü#ºwü,øVŸð˜ÄßþøKµÿ±¿µ?âcýöo·¥yµß×ðŸáw>|,øiðWáv…ÿ¿Ã/ƒþðoÂï‡^þÓÖ5¯øG| ðÿúw„ü#¡lø‹P»Ô5o²xIÓíþÕwuyqö6êâyÞI[¿ Š( Š( Š( Š( Š( ¾Aýº?nÙÇþ Óû8øËöŸý§üeÿ¯€<+åéš6¦Gk¨øïâwŽõ[ëŸ |.ø]á«›ëoøJ¾ j¿Ù×ÍonÓÛYÙYé×úÖµ¥xJÕµk€ટð\ïÙÇþ µÿßÂ_h?ðØÿ·7ĈøuàØ‹àÇŒ­eø§ý±â¿øE59þ&7‡~ÅöÞ)ƒ[øû5ü=øãF×<%¥k:o,Ó4ï…–&ox—âbÿ__¾|ý–¾ ü=ýŸg߇¾øWðsá_‡áð×| á¨gM;HÓ’yï®înnïgšï]ñþ­y¨j:¶­¨Ü]êºÎ«ªÞêÚµíî¥{uu7¯Ñ@%o7Õÿ_QE çüYâÏ x ÂÞ%ñ׎¼Káÿø'Á~Ö|Yãø³YÓ¼9áo ø[Úuαâø—Ä:ÅÌ6š‡ì4›;»«ÛÛ©¢¶µ¶µ–yåŽ(ÝÇò‹ÿ2ðŸŠà¦·—í•ÿòøáá¯Zø'Ä~ Öÿeoø&¯ƒ¾ hÚŒü=øà·þÇñWÄO ø{ÅÖÚý§„üAu¤­–‰w«øÆRh³øËÆŸtÛ:(µ$Jõÿø9+ö–ø§âÿ~ÎÿðGoÙVókŸø*Ä +À> þÈ¿ñ—_ ¿e3Xƒþ?|{ÿ Ç^—Äþ ð·{m-ž±©OáxsRøqàO‹–÷ð«ég¿Ÿ²·ìÓð³ö8ýœ~ ~ËŸtŸìŸ†_¼ xÃ^}‡‡l5sû&Ôlø×Åßð‰è:^Ÿ©ü@ñˆ%ÕußêVú}§ö¶½â-GS–žî\‚Ýù/ϧܿ4{ýQ@¸‹ ¼ ñÇágÄ¿‚¿t/øJ>|`ðŒ¾|Eð×öž±¢ÿÂEàOˆÔ¼'âí ûgú…¦¡¤ý¯Ãú¶¡oö« »[Ë´y¶·N‘ʽýüâÁ­"ñÞ“ÿÁÕ¿eoŠ?¿á\|Mý€?kÿÚ£ö;ø‹aÿ vãíoøÇëñ«Åןjðì §ØgxƒãŽ¡áß.ÃQÖ¬îÿáþ×µÕ N;KOèOø'çƒÿá?àãø+÷ìÓ¤|ÿ„KáÿíÅðàoü[á÷á`ÿohÂ%â†ðÆ-GþË›NöÓþÚgö€øçwäß_éØŸð¯>Ï¥èrøWÑæ²þžèÛÓO»OÄ(¢Š~!ÿÁfàŒÞÿ‚žxŸ¾ø¯þãþ û<}‹Ä_²·íSáÛÝcÃZÆ‘¬xkXxwá×Ä_xE?µÿáÿ„·v¡¤júx›^ð½w'‰<7Ìw>"ðïŠ|þÍÿ™ñßíã¿ÿÁ5à¥^ÿ†xÿ‚¯þÏmðï‹<'â+-ÃZ?í;£økGMfçâ/ëmÿ²?á`Â%ö}wWÒ4)&Ðuíî?ˆ?¤¹ðuΧ¦x7ú;¯Ä?ø,Ïü›ÀŸðSÏxSâwÃÿÃ<ÁA¿g±x‹öVýª|;{¬xkXÒ5 kâïü:ø‹â/§ö¿ü ð–îÔ4_OkÞ×®äñ'†ã¹ŽçÄ^ñH&º­ú®ÿð{3öòŠþq?àŒßðYŸþÑ;ñ_üWþ UáOøgø*ÿìñößø³Â~"²Ñü5£þÓº?†´tÖn~"ü:¶ÑŸû#þü"_g×u}#B’m^ÐnãøƒðúKŸ\êzgƒ£º;ÿ[z…Q@Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¾ÿ‚°Ê,ÿà¥ö`?¶Gþ³·Äjûú¾ÿ‚°Ê,ÿà¥ö`?¶Gþ³·Äjü?ÿ‡{þÀÿôd²þ#WÁþbèÿ‡{þÀÿôd²þ#WÁþbëëêÇñˆtèçŠüW®hþð·†4}OÄ>%ñ'ˆu;-@ðö¢ÙO©k湬jSÅm¤èöšuµÍÅÕÕıÁo¼’Ë"FŒÃ –áÞÿ°?ýìƒÿˆÕðcÿ˜º?áÞÿ°?ýìƒÿˆÕðcÿ˜ºø§öý¸¼ñ_ã|:§ûPü8ø£?íiðãÅ?~ü/Ñþ'øÄ~1ø?{á_Š^<ÕÇŸˆÓõS7Ã_ˆéû&|Dý—tù<)£ í>]wöoø­â;Ú¯öçŠ|aû)@%|!ý–¿fO‚?·çü'Åÿg?|S¨~Ôßü=âO…ÿ¾ø_¾Ð.ÿàœ·†¥u¡Þkðõ¥ÍÎ.£¤éWZ¼­Ϧ[ÊÑ™!‰—úµ¯çÃþOwþ }ÿg}ñoÿ]­ÿ¯èú²žÿ/óø›ý†?aØ›Åß±7ìwâ¿þÇŸ²Ï‰üSâÙgö|ñ‰|IâÙóá.µ¯ø‡_Ö¾øGRÖ5ÍsXÔ¼#-έ¬]ê777WWÉ=Ä÷K,#³©¿áÞÿ°?ýìƒÿˆÕðcÿ˜º?àŸò`ÿ±ýšìÕÿªcÁuõõjÈ?ðïØþŒƒöAÿÄjø1ÿÌ]ðïØþŒƒöAÿÄjø1ÿÌ]|%ð‡þ ð¿Åÿ¶™®[þ׿¹¼Ô~Í£éÚ}¤tÏäÛXÃ{bŠ4_Nÿ‡{þÀÿôd²þ#WÁþbëÐ?gù~ÐößðS¯ýxßíO^ýZ-—¢äøw¿ìÿFAû ÿâ5|ÿæ.øw¿ìÿFAû ÿâ5|ÿæ.¾øCÿø_âÿÛ L×-ÿkß„*ø]ñóâÿÆÙ—áÇÁ]/ãÃWÅžÔ¾è^Ó¾ xëUðEž¶Ðh^ñÅ„Ÿ¶Lš?ˆ´Û«­[Æ–ßµÁí;PMNÐtß~ÕÓòoöçý†?boþÄß¶'Šü)û~Ë>ñO†?eŸÚÄ>ñ'‡¿gÏ„º.¿áíEøKâíKG×4=cMðŒW:N±i¨Û[\ZÝ[ËöóÛÇ,R$ˆ¬?¶JþPà¡ò`ÿ·ýší+ÿªcƵý_Vséóýþ<þþÇ?²/ÅMgö•ñïÅÙ_öqø‘ã{öþÿ‚•ÿnxÓÇ¿þxÃÅšÏö_ü'ö›Ñ´Ïí_x‡Ã7šÙ´};O´ƒÎ™ü›k`lQF‹éßðïØþŒƒöAÿÄjø1ÿÌ]zìñÿ ÏÚþÏûþ uÿ¯ý©ëߪÖËÑòü;ßöÿ£ ýñ¾ óGü;ßöÿ£ ýñ¾ ó_ |^ÿ‚ü/ð‡í…©ë—µï ü.øñà÷ìËñனñ‹áΕâÏj_4/éßüu¥ø"ó[X5ßx{âÅ¿ØÚMcÄZ•Õ®­à»oÙ{㧦™ëÚoŽjéù7ûsþñ7„boÛÅ~ý?eŸ x§Ã²Ïíâ x“Ãß³çÂ]_ðö¿¢ü%ñv¥£ë𱦸F+'X´Ôm­®-n­åŽ{yíã–)DVÛ%(?ðPù0ÛƒþÍö•ÿÕ1ãZþ¯«9ôùþ€QEfEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ÿÁX?åðR¿û0Û#ÿYÛâ5}ý_ÿÁX?åðR¿û0Û#ÿYÛâ5~~ל|Yø_ |dð5ÿÿÞkþÖµ_x–ÃH¸²Š/hñŽâ½cáçŠmu->êÛ]øqâ};D¹ðïŠô‹ˆ kÃ>'Õ´‰Z8ïZTôz+ 8ø—ð¿@ø£eá5‹ÍcFÔ| ñÀŸ<)âO \Yiþ'ÐõÿëöÚ•Íž—¬]i÷iš>¿áfñ/„üI°†}WÂè_eóá9Óõ÷žmCZ¹‹Vø…­xr9›GðÆ«ë¿_Paÿ'»ÿ¾ÿ³¾ø·ÿ®Öÿ‚€Wô}_Î ‡üžïüûþÎûâßþ»[þ _Ñõe=þ_«ùAÿ‚|ɃþÄöh?³Wþ©×Ñÿ¼!ÿ À>8ðü$þ0ðGü&þñ/„?á4ø{­Â5ãïÿÂK¢Þèßð“øÄ_fŸûÆÛ~צ^ù3}’öÒ ü©<½ó‡üãþLö ÿ³Aýš¿õLx.¾¾­@òüð޾ ê¿`Óÿáð4þ±ð‡„¿á\Zh¾Ô¾Â9Ÿü+Ïü%Ù¤Ígà_xGXÒ|=«xJöÖÌÿ`jÞÓ/ìbŽ[6úý|ƒû6üJøÕ㟋ÿ¶ÿ†~(iþµð‡ÂOÚ?þøBþñUÆ»©ZøNÿöqøñm+Y±“ᎅö_7þ?_yæÔ5«˜µoˆZׇ#™´ hÚ¾»õõxíÿ ÏÙÿþÏûþ ‹ÿ¯ý–+ú~¯æö‡ÿgìÿÿgýÿÅÿ×þËý?VSßåú°?˜ÙãþAŸ´ýŸ÷üëÿ^7ûS×§üBð‡ü,øãÀ_ð“øÃÁð›øCľÿ„Óáîµÿ×¼#ÿ .‹{£ÂOà}šìiÿmû^™{äÍöKÛH'ò¤òö7˜~Ïò ý ?ìÿ¿à§_úñ¿Úž½ú´[/Dx÷à€|uðWUø Ÿÿ§ð…„<%ÿ âÓEð¶¥ð£þÈ,ÿá^xŸá.Í&k?øÃÂ:Æ“áí[ÂW¶¶gûVð¶™crØÁ·×ëä|JøÕª~Ü߾뚄#øà¿ÙÇömñï‚§³ñUÅ׋!ñgÄ/þÑ:±ªßxy¾Úù?Ú¿ð®õ;+¸$ñ=ý¶•mðË@¿Ó¡¸ºñv»ká߯©òü#þLöàÿ³Aý¥õLxÖ¿«êþPà¡ò`ÿ·ýší+ÿªcƵý_Vu:|ÿ@?˜ÙãþAŸ´ýŸ÷üëÿ^7ûS׿W€þÏò ý ?ìÿ¿à§_úñ¿Úž½ú­l½Aà/þð/Á]+à,úü'¾ƒÂÞñoü,{MÅ:—ÅøHà¼ÿ…‡â‹[ô˜lüuãk·ˆuoÞÝYíý[Å:ýôRK}>îÃáï„?á_xÀþÿ„ŸÆ7ÿ„#Âð‡ü&Ÿµ¯øI|}âïøF´[-þx‹ìÐoøÃPûÚõ;ß&µÞÝÏ?•™±~pñŸÄ¯Z_íÍðᇧøBOž4ýœi/øÖ{Ï\Zø²o|=ñßìí¡èú­‡—á×ý•ÿ L²´‚?Ø[j¶ßuûýF{¯èV¾"úú˜ ÿÁB?äÁÿnû4ÚWÿTÇkú¾¯åþ ÿ&ûpÙ þÒ¿ú¦“Â~ñg„þø3á ú¯‚äÓ<'k¬Cý«á‡~ ]F WWÕ­’çÃé>—™ö›äºõúüúý˜?iŸ‹¿uÿÙþçâ,.<-û\þË>$ý¬þèþ ð§‰ü/¯üÐ<;{û<Èß ¯çÃþOwþ }ÿg}ñoÿ]­ÿ¯èú²žÿ/Õü ÿÁ>?äÁÿbû4Ù«ÿTÇ‚ëëêùþ ñÿ&ûÙ þÍ_ú¦<__V y€>é¿þ#|uø‡¥x·Æ—ü/ßx?Ǿ!ðv²|''„ü+âÏ ü/ðgÂõ_ɦxN×X‡ûWÂüºŒ®¯«[%χÒ}.3í7ÉuëõùõàÚgâî¹ñ/á¶«¬Gðáþüiý©¿iÙ3žÓ<)â{‰~×ÿfè¿iásñ?Ä?.¾ Ýi^=ÑõÉÿdï´~¶ð_‡§Ò“âŠ7ˆµ6ðÝÄž$ý ý¡ÿäû?ÿÙÿÁ1õã²ÅOÕüÀþÐÿò ýŸÿìÿ¿à˜¿úñ¿Ùb¿§êÊ{ü¿Vóû<È3ö€ÿ³þÿ‚ëÆÿjz÷êðÙãþAŸ´ýŸ÷üëÿ^7ûS׿V‹eè€ò /ƒºnñóÄ¿´Ÿ‹|a±ã„ø;â/çÂrxQÓ~øÏâ|âݲøMµÛOY]|Tñíž`×bÒnlµì]é3ÞZÙ^[zý~}xö™ø»®|Kømªëü8ƒ¿joÚ_öLð§4Ï xžÇâ_5ÿÙº/Úx\üOñÅ‹¯ˆ7ZWt}rÙ;Ä­‡m¼áéô¤ø£bâ-M¼7q'‰?Aiòü#þLöàÿ³Aý¥õLxÖ¿«êþPà¡ò`ÿ·ýší+ÿªcƵý_Vu:|ÿ@?˜ÙãþAŸ´ýŸ÷üëÿ^7ûS׿W€þÏò ý ?ìÿ¿à§_úñ¿Úž½ú­l½Aâoƒºo‰~5|&øä¾-ñ†…â/„þøµà(<=£ ¿„üoá?Œw5?é^4ƒ\ðcñÂêztú&¥¢ÜÇs¤<“^é×7V3zý~}xãö™ø»¡üKø“ªèñü8Oƒ¿¿joÙ£öLñ_5? xžûâ_ŽõÿÚF/Ù„[|Oð÷Å‹_ˆ6ºW€´}ÚÇÃM'‡n|âõTø]|‹â-1¼Io'†ÿAiòü#þLöàÿ³Aý¥õLxÖ¿«êþPà¡ò`ÿ·ýší+ÿªcƵý_Vu:|ÿ@ (¢³¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ¾þ¯€à¬ò‹?ø)_ý˜í‘ÿ¬íñ€??h¢¾qý«~+xûàǼið¿Að‡‰üs}ñömøm¡è=Õ5­ÂzŸü.ŸÚ;áGÁ½N WÄÓ¯¯<9ǺƒÁ©C§jßÙ×1Ã{&¬Ešeß@ÿ ÿfŸƒ_5ûÏxÃzÆŸ¨É£ÜxgB¶Öü{ñƺÃ]Þé÷÷~ø-áOø¯QÒ¾|8š}à 7‡<g èRÁà¯ÛI§µ·‡ôX¬=Þ¿2¢ý¦i¿ ëþ3¶ñ¼4xRÏGÔ+ÑìõË]7P´¹¹ÑåÔt›dºŽÞîÖwäX®!¬«¢Ùz öiø5áωsüXÒ|7¬Câ–Ö|Vÿ„cûSûsþ¿øXž Ñ|_ýƒýµýgý±ö?í³ý«ì–¿hû?öh7ùHÀòø(Gü˜?íÁÿfƒûJÿê˜ñ­WÕü ÿÁB?äÁÿnû4ÚWÿTÇkú¾¬êtùþ€QEfEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_ÿÁX?åðR¿û0Û#ÿYÛâ5}ý_ÿÁX?åðR¿û0Û#ÿYÛâ5~~×!ãxOâF‹eáïi_Û:>ㇾ=³³ûv¥§y>,øWãï |Pð«ö*ò dûŽ|áÛï!äkk¯ìï²ÞÃsg4öòÿ>ŸñçìÿDö¾ÿÂàÇÿ?ú?â'ÏØþ‰í}ÿ„Áþõ½×u÷¡]w_z?võ?€¿ õøM´|)öøXŸþ|zñüO|IöÇŃ_ð¨¿á[x¯÷ÂgÿfÿˆøSþkäi·ŸðŠÿ§ÙÝ}»Rûg¯×ó‹ÿ>~ÀÿôHÿkïü ~ óÿ£þ"|ýÿè‘þ×ßø@üÿçÿE×u÷ ºî¾ô~þXÉîÿÁ/¿ìï¾-ÿ뵿à ýWð»ûÁc¿fOø(Wüëþ Áð_à¿~;øcÅ>øïñËâ…ýÿÅ |?Ñt ´ þ ùûhøRêÎÎëŸõ»™5†Ô|k¥8ø_ãÝ+û{ÀßÒâ ˜|ï2 ¢•REþ_e¯ø8·ö&ø#û2~ÎüWð»ö¦ÔËëõüâÿÄOŸ°?ý?ÚûÿƒüÿèÿˆŸ?`ú$µ÷þ??ùÿÑuÝ}è.»¯½·Ÿ´?üƒ?gÿû?ïø&/þ¼oöX¯éú¿Ï[Áÿð]ßÙöÌøáûþÍŸ þ~ÑúŽ~$~ßßðOì=WǾøe¥øN×þÿÛ“ö|ñî§ý«}áï‹ú­äfámB(<› ÷ÜÍ IåDÒMúÖswzvÿ1ÞûÌìñÿ ÏÚþÏûþ uÿ¯ý©ëÓþ!x Â<ã…þ=Ò¿·¼ ñ#Â%ð4?·jZ_öÏ„üa¢Þø{ÄZWöžymy§}§GÔo!óí. ¹‡Îó š)U$_À_Áwd_ØÏã‡íû6|PøuûGëÞ9øoûÁCÿ·5_xGá–©á;¯øL?nOÚǺgöU÷ˆ~/éW“ùz?Štø§ó¬ Ùs É›Ç4™ßñçìÿDö¾ÿÂàÇÿ?ú´Õ–«eÔW]×Þ~íø×à/ˆŸð·á1ð§öÇü/„gÀ_Šßñ=ñ&Ÿÿ WÂ}þöw…?âW¬Aý‡åÿÂåø“þŸ¦ýRøI?yxÿc°û/¯×ó‹ÿ>~ÀÿôHÿkïü ~ óÿ£þ"|ýÿè‘þ×ßø@üÿçÿNëºûÐ]w_z?_?à¡ò`ÿ·ýší+ÿªcƵý_Wù§~Ô¿ðqoìMñ»ödý£> øSáwíM§ø§â÷À‹¿ ü5âü%´Ð,uÿ|?ñ…4{ÍrëMøßwsm£Å¨êÖÏu%½¥ÔéHÑ[Í X›ý,k9´íg}Âéìî0?³Çüƒ?hû?ïø)×þ¼oö§¯~¯ç[Æð]ßÙö3øáû`~ÍŸ>~Ñú÷Ž~þßßðPÿíÍWÀ^øeªxNëþÛ“öƒñî™ý•}â‹úUäþ^â>)üë6\Ã2GæÄ±Í&wüDùûÿÑ#ý¯¿ðø1ÿÏþ­5eªÙu ®ëï?vüðá?ÿøT_ð‡xSûþG Oà/Ÿøžø“Pÿ„Wá>±ÿ ÃûGŸñ4Ö'þÜó?áM|6ÿOÔ¾Ù©'ü#»¼O¶_ý«°ø{à/ ü+ðþø JþÁð7ÃxkÀ^ ÐþÝ©jŸØÞð~‹eáïé_ÚzÍåÍæ£ömN³‡Ï»¸žæo'Ìžieg‘¿ŸOø‰óöÿ¢Gû_áðcÿŸýñçìÿDö¾ÿÂàÇÿ?úw]×Þ‚ëºûÑúùÿÿ“ý¸?ìÐi_ýS5¯êú¿Í;ö¥ÿƒ‹boß³'íð_Ÿ ¿jm?Å?¾|]ø_á«ÿø'á-¦c¯øûáÿˆ|)£Þk—ZoÆû»›m-GV¶{©-í.§HFŠÞiÄßécYͧk;îOgp¢Š*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙmmdb-1.23.2.1/docs/cl_scheme.html0000644000175100017510000000573307354371053013357 00000000000000 CCP4 Coordinate Library Project / Introduction

    CCP4 Coordinate Library Project

    General Scheme

    The Library may be represented by the following hierarchy:

    Each gray element in this picture is represented by one or several C++ classes featuring the properties of the corresponding object. The relations and links between the classes remain hidden from the application and are maintained automatically. Direct intervention into the structure from an application is neither supposed nor expected and, more likely than not, will result in malfunction of the Library.

    Any application should communicate with the hierarchy only through provided interfaces, which are the RWBROOK -- for FORTRAN programmers, and the Object interface -- for C++ people.

    RWBROOK interface replicates the older CCP4 coordinate library found in file rwbrook.f of the CCP4 suite. The interface uses slightly modified function names, and has a few intrinsic differences from the former implementation. All these details are discussed in the RWBROOK section of this manual. This interface may be also be used from C programs with proper implementation of the interface function calls. This technique is explained in the above mentioned section.

    RWBROOK interface is implemented only to ease the conversion of existing CCP4 algorithms implemented with the use of the older rwbrook.f module. This interface is not likely to be advanced or otherwise modified in the future. It is implemented on the top of more general and perspective Object interface.

    The Object interface is based on using the technology of classes to handle the functionality of the hierarchy. It is described in details in the Object interface section of this manual. It gives direct access to the internal fields of the hierarchy's classes, which are Ok to read, but are not always Ok to modify in a direct way. Generally, any modification of data fields should be done through the provided interface functions even if these fields are accessible for an assignment operator (which means they are found in public section of the corresponding C++ class).

    The Object interface is not fully developed at present. All future development of the Library will most likely be associated with these gates to its inside. The interface may also be used from C programs, however they have to be compiled with a C++ compiler.

    The Library also include a tool for reading/writing CIF classes. The tool is described in details, and may be used separately from the Library in any application wherever an efficient access to CIF files is needed. mmdb-1.23.2.1/docs/object/0000755000175100017510000000000011472715332012063 500000000000000mmdb-1.23.2.1/docs/object/cl_obj_surf.html0000644000175100017510000043311007504104452015156 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Surfing the coordinate hierarchy.

    The Library offers variety of tools for surfing the coordinate hierarchy. Any model, chain, residue or atom may be addressed directly using either characteristics like model number, chain ID, sequence number etc., or a special path string - the "coordinate ID" (CID), or by looking up the hierarchy's internal tables. Different methods provide different flexibility and efficiency. In general, access through internal tables is the most efficient one, while using the coordinate ID provides for maximum flexibility.

    COMMON NOTATIONS

    Coordinate ID
    Coordinate ID is an ASCII string having the following format:
          /mdl/chn/seq(res).ic/atm[elm]:aloc
          
    where
    Item   Type   Description
    mdl   integer   the number of model
    chn   character string   chain ID
    seq   integer   residue sequence number
    res   character string   residue name
    ic   character string   residue insertion code
    atm   character string   atom name
    elm   character string   chemical element ID
    aloc   character string   alternative location indicator

    All spaces in cooridnate ID are ignored. This means that certain atom names may be interpreted correctly only if chemical element name is supplied (compare Calcium CA[CA] and Carbon in alpha-position CA[C]). The residue name represents a redundant information if sequence number and a non-wildcard insertion code is specified.

    Any item in coordinate ID may be replaced by a wildcard "*", which means indefinite value for that item. The wildcard value is automatically implied for any missing item except the chain ID, insertion code and alternative location indicator:

    • Missing chain ID is interpreted as empty ID "" if there is a slash "/" after it. In all other cases, missing chain ID is interpreted as a wildcard "*".
    • Missing insertion code is interpreted as a wildcard "*" if the residue sequence number is not specified or set to a wildcard. In all other cases, missing insertion code is interpreted as "" ('no insertion code').
    • Missing alternative location indicator is defaulted to a wildcard "*" if no atom name or chemical element name is given. If any value for atom and/or chemical element name, even though a wildcard, is provided, missing alternative location indicator is defaulted to "" ('no alternative location indicator').

    A coordinate ID may be incomplete. Below are the rules for interpretation of incomplete IDs. Curling brackets {..} denote parts of ID string that may be omitted as a whole:

    1. If ID starts with slash "/" then it is interpreted as
            /mdl { /chn { /seq(res).ic { /atm[elm]:aloc }}}
                  
    2. If ID starts with a letter:
                    chn { /seq(res).ic { /atm[elm]:aloc }}
                  
    3. If ID starts with a (possibly negative) number, bracket "(" or dot ".":
                           seq(res).ic { /atm[elm]:aloc }
                  
    4. If none of previous applies but ID string contains square bracket "[" or colon ":", it is interpreted as
                                          atm[elm]:aloc
                  
    Below are examples of valid coordinate IDs:

    Coordinate ID   Description
    /1/A/33(SER).B/CA[C].A   model 1, chain A, residue SER with sequence number 33 and insertion code B, C-alpha atom in alternative location A.
    /1/A/*(SER).*   any SER residue in chain A, model 1.
    /1/A/(SER)   any SER residue with no insertion code in chain A, model 1.
    /1//(SER)   any SER residue with no insertion code in chain without a chain ID, model 1.
    /1/A/*.*/CA[C]   any C-alpha atom with no alternative location indicator in chain A, model 1, in residues with any sequence number and insertion code.
    /1/A/*/CA[C]   any C-alpha atom with no alternative location indicator in chain A, model 1, in residues with any sequence number and no insertion code.
    A/*/CA   any C-alpha or Calcium atom with no alternative location indicator in chain A of any model, in residues with any sequence number and no insertion code.
    CA[C]   any C-alpha atom with no alternative location indicator in any chain, any model, in residues with any sequence number and no insertion code.
    CA   any atom of chain CA with no alternative location indicator, in any model, in residues with any sequence number and no insertion code.

    The following coordinate IDs are incorrect:
      1.   /A/23/CA[C]
      2.   /1/CG[C]
      3.   /-15
      4.   */*(*).*/*[*]:*
          
    In the present realization, the CID-using functions will not always recognize the incorrect coordinate IDs. For instance, for the incorrect IDs exampled above, the answers would be
    1. wrong numerical format for model number
    2. Ok, model 1, chain CG, item [C] is not interpreted
    3. Ok, model number is set to -15
    4. Ok, an empty coordinate ID.

    If a CID-using function fails because of a wrong coordinate ID, the reason may be learnt from analysing the public CMMDBManager::CoorIDCode integer variable. If may take the following values:
    Code Value Description
    CID_Ok 0 no problem
    CID_NoModel 1 model not found
    CID_NoChain 2 chain not found
    CID_NoResidue 3 residue not found
    CID_NoAtom 4 atom not found
    CID_WrongPath 5 the coordinate ID is incorrect

    Default Coordinate ID
    An application may set a default coordinate ID, which may be any valid, complete or incomplete ID. If a function needs a complete ID and incomplete one is supplied, the function will try to recover the missing items from the default CID. Here we don't imply analogy with a hierarchical file system. If the supplied CID has wildcard for sequence number, it will attempt to substitute it with that from default CID even if model number and/or chain ID differ.

    Addressing by Coordinate ID
    The following example demonstrates addressing to a residue by its coordinate ID (CID). The CID may be specified either as a string or as a set of CID items:
    CMMDBManager MMDB;
    int          RC;
    PCResidue    res1,res2;
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      // get residue 34.B of chain A model 1 in way #1
      res1 = MMDB.GetResidue ( "/1/A/34.B" );
    
      // the same operation in way #2
      res2 = MMDB.GetResidue ( 1,"A",34,"B" );
    
    Similar approach is used for getting models, chains and atoms. The models, chains and residues have similar functions for addressing the objects that they incapsulate.

    Addressing in way #2 is slightly more efficient than that in way #1. Evidently way #2 is more convenient for a programmer, and way #1 is more natural for an interactive user (although it may be chosen by programmers as well). However, both of them bear overhead of decoding the coordinate ID and therefore they are recommended only for addressing individual objects. If an application needs to address objects in series (e.g. to perform a loop over all atoms in a given chain), the most efficient way to do that is through using the internal tables.

    Addressing through internal tables
    The following example demonstrates addressing to all atoms of model 1 using the internal tables:
    CMMDBManager MMDB;
    int          RC;
    int          nChains,nResidues,nAtoms;
    PPCChain     chain;
    PPCResidue   res;
    PPCAtom      atom;
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      //  get chain table of model 1
      MMDB.GetChainTable ( 1,chain,nChains );
    
      //  loop over all chains:
      for (i=0;i<nChains;i++)
        if (chain[i])  {
          // get residue table for current chain:
          chain[i]->GetResidueTable ( res,nResidues );
          // loop over all residues in current chain:
          for (j=0;j<nResidues;j++)
            if (res[j])  {
              // get atom table for current residue:
              res[j]->GetAtomTable ( atom,nAtoms );
              // loop over all atoms in current residue
              for (k=0;k<nAtoms;k++)
                if (atom[k])  {
                  // doing something with atom, e.g.
                  if (atom[k]->Ter)  printf ( "TER\n" );
                  else {
                    if (atom[k]->Het) printf ( "HETATM  " );
                                 else printf ( "ATOM    " );
                    printf ( " %10.4f %10.4f %10.4f\n",
                             atom[k]->x,atom[k]->y,atom[k]->z );
                  }
                }
            }
        }
    
    
    Addressing through internal tables provides for maximal efficiency achievable in MMDB. Each level of coordinate hierarchy has its own tables and functions for addressing them as well as functions for addressing the lower-level tables. Thus, in the example above,
          chain[i]->GetResidueTable ( res,nResidues );
          res[j]->GetAtomTable ( atom,nAtoms );
          
    could be changed for
          MMDB.GetResidueTable ( 1,chain[i]->GetChainID(),res,nResidues );
          MMDB.GetAtomTable    ( 1,chain[i]->GetChainID(),
                                 res[j]->GetSeqNum(),res[j]->GetInsCode(),
                                 atom,nAtoms );
          
    or even more simpler
          MMDB.GetResidueTable ( 1,i,res,nResidues );
          MMDB.GetAtomTable    ( 1,i,j,atom,nAtoms );
          
    however such replacements are less efficient. The functions for addressing the lower-level tables come however handy if table of an individual object (e.g. a residue) needs to be retrieved. In this section, we consider only addressing capabilities of MMDB Manager. Addressing tools of other objects are discussed in other relevant sections.

    It is important to remember that internal tables should never be deallocated, allocated or otherwise modified by application. Violation of this requirement will cause a major crash. The same restriction applies to all pointers on models, chains, residues and atoms that are obtained with functions described below.

     

     

    Function Purpose
    CMMDBManager::SetDefaultCoordID Setting a default coordinate ID
    CMMDBManager::GetNumberOfModels Obtaining the number of models in the coordinate hierarchy.
    CMMDBManager::GetModel Obtaining a model pointer by model number.
    CMMDBManager::GetModel Obtaining a model pointer by coordinate ID.
    CMMDBManager::GetModelTable Obtaining the model table.
    CMMDBManager::GetNumberOfChains Obtaining the number of chains in a model by model number.
    CMMDBManager::GetNumberOfChains Obtaining the number of chains in a model by coordinate ID.
    CMMDBManager::GetChain Obtaining a chain pointer by model number and chain ID.
    CMMDBManager::GetChain Obtaining a chain pointer by model number and chain number.
    CMMDBManager::GetChain Obtaining a chain pointer by coordinate ID.
    CMMDBManager::GetChainTable Obtaining the chain table by model number.
    CMMDBManager::GetChainTable Obtaining the chain table by coordinate ID.
    CMMDBManager::GetNumberOfResidues Obtaining the number of residues in a chain by model number and chain ID.
    CMMDBManager::GetNumberOfResidues Obtaining the number of residues in a chain by model number and chain number.
    CMMDBManager::GetNumberOfResidues Obtaining the number of residues in a chain by coordinate ID.
    CMMDBManager::GetResidue Obtaining a residue pointer by model number, chain ID, sequence number and insertion code.
    CMMDBManager::GetResidue Obtaining a residue pointer by model number, chain number, sequence number and insertion code.
    CMMDBManager::GetResidue Obtaining a residue pointer by model number, chain ID and residue number.
    CMMDBManager::GetResidue Obtaining a residue pointer by model number, chain number and residue number.
    CMMDBManager::GetResidue Obtaining a residue pointer by coordinate ID.
    CMMDBManager::GetResidueNo Obtaining a residue position in chain by model number, chain ID, residue sequence number and insertion code.
    CMMDBManager::GetResidueNo Obtaining a residue position in chain by model number, chain number, residue sequence number and insertion code.
    CMMDBManager::GetResidueTable Obtaining the residue table by model number and chain ID.
    CMMDBManager::GetResidueTable Obtaining the residue table by model number and chain number.
    CMMDBManager::GetResidueTable Obtaining the residue table by coordinate ID.
    CMMDBManager::GetNumberOfAtoms Obtaining the total number of atoms in coordinate hierarchy.
    CMMDBManager::GetNumberOfAtoms Obtaining the number of atoms in a residue by model number, chain ID, sequence number and insertion code.
    CMMDBManager::GetNumberOfAtoms Obtaining the number of atoms in a residue by model number, chain number, sequence number and insertion code.
    CMMDBManager::GetNumberOfAtoms Obtaining the number of atoms in a residue by model number, chain ID and residue number.
    CMMDBManager::GetNumberOfAtoms Obtaining the number of atoms in a residue by model number, chain number and residue number.
    CMMDBManager::GetNumberOfAtoms Obtaining the number of atoms in a residue by coordinate ID.
    CMMDBManager::GetAtomI Obtaining an atom pointer by its absolute number in coordinate hierarchy.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain ID, sequence number, insertion code and atom name.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain ID, sequence number, insertion code and atom number.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain ID, residue number and atom name.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain ID, residue number and atom number.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain number, sequence number, insertion code and atom name.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain number, sequence number, insertion code and atom number.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain number, residue number and atom name.
    CMMDBManager::GetAtom Obtaining an atom pointer by model number, chain number, residue number and atom number.
    CMMDBManager::GetAtom Obtaining an atom pointer by coordinate ID.
    CMMDBManager::GetAtomTable Obtaining the atom table of all atoms in coordinate hierarchy.
    CMMDBManager::GetAtomTable Obtaining the atom table by model number, chain ID, sequence number and insertion code.
    CMMDBManager::GetAtomTable Obtaining the atom table by model number, chain ID and residue number.
    CMMDBManager::GetAtomTable Obtaining the atom table by model number, chain number, sequence number and insertion code.
    CMMDBManager::GetAtomTable Obtaining the atom table by model number, chain number and residue number.
    CMMDBManager::GetAtomTable Obtaining the atom table by coordinate ID.


    int CMMDBManager::SetDefaultCoordID ( 
    pstr  CID )
    PURPOSE
    Setting a default coordinate ID
    ARGUMENTS
    pstr CID
    A string of coordinate ID. The CID must be of valid syntax but may be incomplete.

    DESCRIPTION

    The function analyses the coordinate ID and stores it for future use. If an incomplete CID is then supplied to another CID-using function, it will try to get it complete by adding the missing items from the default CID. To disable this mechanism, simply call SetDefaultCoordID ( "" )


    RETURN

    The function returns:
    0   - success
    -1   - wrong numerical format for model number
    -2   - wrong numerical format for sequence number

    NOTE : The function performs no checks on the actual presence of items of given CID in the coordinate hierarchy.


    int CMMDBManager::GetNumberOfModels ( 
     )
    PURPOSE
    Obtaining the number of models in the coordinate hierarchy.
    DESCRIPTION

    The function returns the number of models currently contained in the coordinate hierarchy.


    PCModel CMMDBManager::GetModel ( 
    int  modelNo )
    PURPOSE
    Obtaining a model pointer by model number.
    ARGUMENTS
    int modelNo
    The model number. Models are numbered from 1 on.

    DESCRIPTION

    The function returns pointer on the model having the specified model number. If model with such a number does not exist, the function returns NULL.


    PCModel CMMDBManager::GetModel ( 
    pstr  CID )
    PURPOSE
    Obtaining a model pointer by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    DESCRIPTION

    The function returns pointer on the model answering the specified coordinate ID. If the provided CID does not specify a particular model (e.g. it has a wildcard for model) or if such a model does not exist in the coordinate hierarchy, the function returns NULL.


    void CMMDBManager::GetModelTable ( 
    PPCModel &  modelTable, 
    int & NumberOfModels )
    PURPOSE
    Obtaining the model table.
    ARGUMENTS
    PPCModel & modelTable
    The table of models.

    int & NumberOfModels
    The number of models.

    DESCRIPTION

    The function returns table of pointers on all models currently contained in the coordinate hierarchy, and their number. The models are assigned numbers from 1 to NumberOfModels, however they are indexed as 0..NumberOfModels-1 in the table.

    NOTE 1: Certain editing operations might leave models empty. This results in empty cells in the model table. Therefore, it is a good practice for application to check that, for ith model, modelTable[i-1] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the model table.


    int CMMDBManager::GetNumberOfChains ( 
    int  modelNo )
    PURPOSE
    Obtaining the number of chains in a model by model number.
    ARGUMENTS
    int modelNo
    The model number.

    DESCRIPTION

    The function returns the number of chains currently contained in the specified model of coordinate hierarchy. If the specified model number is invalid, the function returns 0.


    int CMMDBManager::GetNumberOfChains ( 
    pstr  CID )
    PURPOSE
    Obtaining the number of chains in a model by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    DESCRIPTION

    The function returns the number of chains currently contained in the model of coordinate hierarchy answering to the specified CID. If the model number derived from CID is invalid (e.g. CID contains a wildcard for the model number), the function returns 0.


    PCChain CMMDBManager::GetChain ( 
    int  modelNo, 
    ChainID chainID )
    PURPOSE
    Obtaining a chain pointer by model number and chain ID.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    DESCRIPTION

    The function returns pointer on the chain with given chain ID in the specified model. If such a chain or model does not exist, the function returns NULL.


    PCChain CMMDBManager::GetChain ( 
    int  modelNo, 
    int chainNo )
    PURPOSE
    Obtaining a chain pointer by model number and chain number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number.

    DESCRIPTION

    The function returns pointer on the chain that has the specified number in the given model. In a model, the chains are numbered as 0..NumberOfChains-1, where NumberOfChains is returned by CMMDBManager::GetNumberOfChains. If such a chain or model does not exist, the function returns NULL.

    The chain number is defined by the order of the chain appearance in the coordinate file. Certain sections of PDB file (e.g. the SEQRES records) may in practice mention the chains in arbitrary order, but it is the order of chains in the coordinate section that matters here.


    PCChain CMMDBManager::GetChain ( 
    pstr  CID )
    PURPOSE
    Obtaining a chain pointer by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    DESCRIPTION

    The function returns pointer on the chain answering the specified coordinate ID. If the provided CID does not specify a particular model and/or chain (e.g. it has a wildcard for chain), or if such model and/or chain does not exist in the coordinate hierarchy, the function returns NULL.


    void CMMDBManager::GetChainTable ( 
    int  modelNo, 
    PPCChain & chainTable,
    int & NumberOfChains )
    PURPOSE
    Obtaining the chain table by model number.
    ARGUMENTS
    int modelNo
    The model number.

    PPCChain & chainTable
    The table of chains.

    int & NumberOfChains
    The number of chains.

    DESCRIPTION

    The function returns table of pointers on all chains currently contained in the specified model, and their number. The chains are indexed as 0..NumberOfChains-1 in the table.

    If the specified model does not exist, the function returns NULL for chainTable and 0 for NumberOfChains.

    NOTE 1: Certain editing operations might leave chains empty. This results in empty cells in the chain table. Therefore, it is a good practice for application to check that chainTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the chain table.


    void CMMDBManager::GetChainTable ( 
    pstr  CID, 
    PPCChain & chainTable,
    int & NumberOfChains )
    PURPOSE
    Obtaining the chain table by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    PPCChain & chainTable
    The table of chains.

    int & NumberOfChains
    The number of chains.

    DESCRIPTION

    The function returns table of pointers on all chains currently contained in the CID-specified model, and their number. The chains are indexed as 0..NumberOfChains-1 in the table.

    If the provided CID does not specify a particular model (e.g. it has a wildcard for the model number), or the specified model does not exist, the function returns NULL for chainTable and 0 for NumberOfChains.

    NOTE 1: Certain editing operations might leave chains empty. This results in empty cells in the chain table. Therefore, it is a good practice for application to check that chainTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the chain table.


    int CMMDBManager::GetNumberOfResidues ( 
    int  modelNo, 
    ChainID chainID )
    PURPOSE
    Obtaining the number of residues in a chain by model number and chain ID.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    DESCRIPTION

    The function returns the number of residues currently contained in the specified chain and model of coordinate hierarchy. If the specified model number is invalid or the chain is not found in the model, the function returns 0.


    int CMMDBManager::GetNumberOfResidues ( 
    int  modelNo, 
    int chainNo )
    PURPOSE
    Obtaining the number of residues in a chain by model number and chain number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    DESCRIPTION

    The function returns the number of residues currently contained in the specified chain and model of coordinate hierarchy. If the specified model number or chain number is invalid, the function returns 0.


    int CMMDBManager::GetNumberOfResidues ( 
    pstr  CID )
    PURPOSE
    Obtaining the number of residues in a chain by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    DESCRIPTION

    The function returns the number of residues currently contained in chain answering to the specified CID. If the chain ID or model number derived from CID is invalid (e.g. CID contains a wildcard for the model number or chain ID), the function returns 0.


    PCResidue CMMDBManager::GetResidue ( 
    int  modelNo, 
    ChainID chainID,
    int seqNo,
    InsCode insCode )
    PURPOSE
    Obtaining a residue pointer by model number, chain ID, sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns pointer on the residue identified by sequence number, insertion code, chain ID and model number. If any of these characteristics is invalid, or such a residue does not exist in the coordinate hierarchy, the function returns NULL.


    PCResidue CMMDBManager::GetResidue ( 
    int  modelNo, 
    int chainNo,
    int seqNo,
    InsCode insCode )
    PURPOSE
    Obtaining a residue pointer by model number, chain number, sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns pointer on the residue identified by sequence number, insertion code, chain number (within a model) and model number. If such a model, chain or residue does not exist, the function returns NULL.


    PCResidue CMMDBManager::GetResidue ( 
    int  modelNo, 
    ChainID chainID,
    int resNo )
    PURPOSE
    Obtaining a residue pointer by model number, chain ID and residue number.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns pointer on the residue identified by the residue number (within the chain), chain ID and model number. If such a model, chain or residue does not exist, the function returns NULL.


    PCResidue CMMDBManager::GetResidue ( 
    int  modelNo, 
    int chainNo,
    int resNo )
    PURPOSE
    Obtaining a residue pointer by model number, chain number and residue number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns pointer on the residue identified by residue number (within a chain), chain number (within a model) and model number. If such a model, chain or residue does not exist, the function returns NULL.


    PCResidue CMMDBManager::GetResidue ( 
    pstr  CID )
    PURPOSE
    Obtaining a residue pointer by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    DESCRIPTION

    The function returns pointer on the residue answering the specified coordinate ID. If the provided CID does not specify a particular model, chain or residue (e.g. it has a wildcard for chain), or if such model, chain or residue does not exist in the coordinate hierarchy, the function returns NULL.


    int CMMDBManager::GetResidueNo ( 
    int  modelNo, 
    ChainID chainID,
    int seqNo,
    InsCode insCode )
    PURPOSE
    Obtaining a residue position in chain by model number, chain ID, residue sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns the residue position (residue number) in the specified chain of the specified model. The residues in a chain are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues.


    RETURN

    Return Value Description
    >=0 Ok - the residue number
    -1 residue with given sequence number and insertion code does not exist in the chain
    -2 chain with given ID does not exist in the model
    -3 incorrect model number


    int CMMDBManager::GetResidueNo ( 
    int  modelNo, 
    int chainNo,
    int seqNo,
    InsCode insCode )
    PURPOSE
    Obtaining a residue position in chain by model number, chain number, residue sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns the residue position (residue number) in the specified chain of the specified model. The residues in a chain are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues.


    RETURN

    Return Value Description
    >=0 Ok - the residue number
    -1 residue with given sequence number and insertion code does not exist in the chain
    -2 incorrect chain number
    -3 incorrect model number


    void CMMDBManager::GetResidueTable ( 
    int  modelNo, 
    ChainID chainID,
    PPCResidue & resTable,
    int & NumberOfResidues )
    PURPOSE
    Obtaining the residue table by model number and chain ID.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    PPCResidue & resTable
    The table of residues.

    int & NumberOfResidues
    The number of residues.

    DESCRIPTION

    The function returns table of pointers on all residues currently contained in the chain with chain ID chainID, model number modelNo. NumberOfResidues returns the number of residues. The residues are indexed as 0..NumberOfResidues-1 in the table.

    If the specified model or chain does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might leave residues empty. This results in empty cells in the residue table. Therefore, it is a good practice for application to check that resTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the residue table.


    void CMMDBManager::GetResidueTable ( 
    int  modelNo, 
    int chainNo,
    PPCResidue & resTable,
    int & NumberOfResidues )
    PURPOSE
    Obtaining the residue table by model number and chain number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    PPCResidue & resTable
    The table of residues.

    int & NumberOfResidues
    The number of residues.

    DESCRIPTION

    The function returns table of pointers on all residues currently contained in the chain number chainNo, model number modelNo. NumberOfResidues returns the number of residues. The residues are indexed as 0..NumberOfResidues-1 in the table.

    If the specified model or chain does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might leave residues empty. This results in empty cells in the residue table. Therefore, it is a good practice for application to check that resTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the residue table.


    void CMMDBManager::GetResidueTable ( 
    pstr  CID, 
    PPCResidue & resTable,
    int & NumberOfResidues )
    PURPOSE
    Obtaining the residue table by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    PPCResidue & resTable
    The table of residues.

    int & NumberOfResidues
    The number of residues.

    DESCRIPTION

    The function returns table of pointers on all residues currently contained in the CID-specified chain and their number. The residues are indexed as 0..NumberOfResidues-1 in the table.

    If the provided CID does not specify a particular chain (e.g. it has a wildcard for the model number and/or chain ID), or the specified model or chain does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might leave residues empty. This results in empty cells in the residue table. Therefore, it is a good practice for application to check that resTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the residue table.


    int CMMDBManager::GetNumberOfAtoms ( 
     )
    PURPOSE
    Obtaining the total number of atoms in coordinate hierarchy.
    DESCRIPTION

    The function returns the total number of atoms currently contained in the coordinate hierarchy.


    int CMMDBManager::GetNumberOfAtoms ( 
    int  modelNo, 
    ChainID chainID,
    int SeqNum,
    InsCode insCode )
    PURPOSE
    Obtaining the number of atoms in a residue by model number, chain ID, sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int SeqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the coordinate hierarchy. The residue is identified by model number, chain ID, sequence number and insertion code. If any of these characteristics is invalid or if the residue is not found, the function returns 0.


    int CMMDBManager::GetNumberOfAtoms ( 
    int  modelNo, 
    int chainNo,
    int SeqNum,
    InsCode insCode )
    PURPOSE
    Obtaining the number of atoms in a residue by model number, chain number, sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    int SeqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the coordinate hierarchy. The residue is identified by model number, chain number, sequence number and insertion code. If any of these characteristics is invalid or if the residue is not found, the function returns 0.


    int CMMDBManager::GetNumberOfAtoms ( 
    int  modelNo, 
    ChainID chainID,
    int resNo )
    PURPOSE
    Obtaining the number of atoms in a residue by model number, chain ID and residue number.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the coordinate hierarchy. The residue is identified by model number, chain ID and residue number. If any of these characteristics is invalid or if the residue is not found, the function returns 0.


    int CMMDBManager::GetNumberOfAtoms ( 
    int  modelNo, 
    int chainNo,
    int resNo )
    PURPOSE
    Obtaining the number of atoms in a residue by model number, chain number and residue number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the coordinate hierarchy. The residue is identified by model number, chain number and residue number. If any of these characteristics is invalid or if the residue is not found, the function returns 0.


    int CMMDBManager::GetNumberOfAtoms ( 
    pstr  CID )
    PURPOSE
    Obtaining the number of atoms in a residue by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    DESCRIPTION

    The function returns the number of atoms currently contained in the residue answering to the specified CID. If the model number, chain ID, sequence number or insertion code derived from CID is invalid (e.g. CID contains a wildcard for any of these items), or if such a residue is not found, the function returns 0.


    PCAtom CMMDBManager::GetAtomI ( 
    int  atomNum )
    PURPOSE
    Obtaining an atom pointer by its absolute number in coordinate hierarchy.
    ARGUMENTS
    int atomNum
    The atom number. This is an absolute index of the atom in the coordinate hierarchy, ranging as 0..TotalNofAtoms-1, where TotalNofAtoms is obtained from CMMDBManager::GetNumberOfAtoms. In an ideal PDB file, atomNum=serNum-1, where serNum is the atom's serial number.

    DESCRIPTION

    The function returns pointer on the atom number atomNum, which refers to all atoms in the coordinate hierarchy as described above. If there is no atom with the specified number, the function returns NULL.

    NOTE : In an ideal PDB file, atomNum=serNum-1, as explained above. However practice shows that this is not a strict rule to rely on.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    ChainID chainID,
    int seqNo,
    InsCode insCode,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by model number, chain ID, sequence number, insertion code and atom name.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue sequence number, residue insertion code, chain ID and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    ChainID chainID,
    int seqNo,
    InsCode insCode,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by model number, chain ID, sequence number, insertion code and atom number.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number. The atom number is the atom's index in the internal atom table of the residue. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CMMDBManager::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's internal table of atoms, residue sequence number, residue insertion code, chain ID and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    ChainID chainID,
    int resNo,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by model number, chain ID, residue number and atom name.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue number (that is the residue's position in the chain's internal table of residues), chain ID and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    ChainID chainID,
    int resNo,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by model number, chain ID, residue number and atom number.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    int atomNo
    The atom number. The atom number is the atom's index in the internal atom table of the residue. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CMMDBManager::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's internal table of atoms, residue number (that is the residue's position in the chain's internal table of residues), chain ID and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    int chainNo,
    int seqNo,
    InsCode insCode,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by model number, chain number, sequence number, insertion code and atom name.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. The chain number is the chain's index in the internal chain table of a model. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CMMDBManager::GetNumberOfChains or its overloaded analogue.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue sequence number, residue insertion code, chain number (that is, the position of chain in the internal chain table of a model) and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    int chainNo,
    int seqNo,
    InsCode insCode,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by model number, chain number, sequence number, insertion code and atom number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. The chain number is the chain's index in the internal chain table of a model. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CMMDBManager::GetNumberOfChains or its overloaded analogue.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number. The atom number is the atom's index in the internal atom table of the residue. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CMMDBManager::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's internal table of atoms, residue sequence number, residue insertion code, chain number (that is, the position of chain in the internal chain table of a model) and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    int chainNo,
    int resNo,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by model number, chain number, residue number and atom name.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. The chain number is the chain's index in the internal chain table of a model. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CMMDBManager::GetNumberOfChains or its overloaded analogue.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue number (that is the residue's position in the chain's internal table of residues), chain number - the position of chain in the internal chain table of a model - and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    int  modelNo, 
    int chainNo,
    int resNo,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by model number, chain number, residue number and atom number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. The chain number is the chain's index in the internal chain table of a model. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CMMDBManager::GetNumberOfChains or its overloaded analogue.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    int atomNo
    The atom number. The atom number is the atom's index in the internal atom table of the residue. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CMMDBManager::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's internal table of atoms, residue number (that is the residue's position in the chain's internal table of residues), chain number - the position of chain in the internal chain table of a model - and model number. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CMMDBManager::GetAtom ( 
    pstr  CID )
    PURPOSE
    Obtaining an atom pointer by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    DESCRIPTION

    The function returns pointer on the atom answering the specified coordinate ID. If the provided CID does not specify a particular model, chain, residue or atom (e.g. it has a wildcard for residue), or if such model, chain, residue or atom does not exist in the coordinate hierarchy, the function returns NULL.


    void CMMDBManager::GetAtomTable ( 
    PPCAtom &  atomTable, 
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the atom table of all atoms in coordinate hierarchy.
    ARGUMENTS
    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the coordinate hierarchy and their number. The atoms are indexed as 0..NumberOfAtoms-1 and retain the order as read from the coordinate file.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the atom table. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the atom table.


    void CMMDBManager::GetAtomTable ( 
    int  modelNo, 
    ChainID chainID,
    int seqNum,
    InsCode insCode,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the atom table by model number, chain ID, sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by sequence number, insertion code, chain ID and model number. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified model, chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the atom table. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the atom table.


    void CMMDBManager::GetAtomTable ( 
    int  modelNo, 
    ChainID chainID,
    int resNo,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the atom table by model number, chain ID and residue number.
    ARGUMENTS
    int modelNo
    The model number.

    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by its position in the internal residue table of a chain, chain ID and model number. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified model, chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the atom table. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the atom table.


    void CMMDBManager::GetAtomTable ( 
    int  modelNo, 
    int chainNo,
    int seqNum,
    InsCode insCode,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the atom table by model number, chain number, sequence number and insertion code.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by sequence number, insertion code, chain number (that is, the position of the chain in the internal chain table of a model) and model number. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified model, chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the atom table. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the atom table.


    void CMMDBManager::GetAtomTable ( 
    int  modelNo, 
    int chainNo,
    int resNo,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the atom table by model number, chain number and residue number.
    ARGUMENTS
    int modelNo
    The model number.

    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CMMDBManager::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CMMDBManager::GetNumberOfResidues or its overloaded analogue.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by its position in the internal residue table of a chain, chain number (that is, the position of the chain in the internal chain table of a model) and model number. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified model, chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the atom table. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the atom table.


    void CMMDBManager::GetAtomTable ( 
    pstr  CID, 
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the atom table by coordinate ID.
    ARGUMENTS
    pstr CID
    The coordinate ID.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the CID-specified residue and their number. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the provided CID does not specify a particular residue (e.g. it has a wildcard for the model number, chain ID or sequence number), or the specified model, chain or residue does not exist, the function returns NULL for atomTable and 0 for NumberOfAtoms.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the atom table. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the atom table.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_query.html0000644000175100017510000006553607505575717015402 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Querying the Coordinate Hierarchy.

    This section presents a collection of different functions for querying the coordinate hierarchy. Only non-specific querying functions are listed here. Querying functions which relate closely to subjects of other sections of this Manual (e.g., retrieving the description of an error code, type of input file etc.), are described in those sections.

    Function Purpose
    CMMDBManager::GetEntryID Obtaining the entry ID (or a PDB ID code).
    CMMDBManager::GetNumberOfAtoms Obtaining the total number of atoms in the coordinate hierarchy.
    CMMDBManager::GetNumberOfModels Obtaining the number of models in the coordinate hierarchy.
    CMMDBManager::isCrystInfo Checking on the presence of crystallographic information in coordinate hierarchy.
    CMMDBManager::isSpaceGroup Checking on the presence of the name of space symmetry group in coordinate hierarchy.
    CMMDBManager::isTransfMatrix Checking on the presence of the orthogonalising/fractionalising matrices.
    CMMDBManager::isScaleMatrix Checking on the presence of orthogonal-fractional transformation matrix in coordinate hierarchy.
    CMMDBManager::isNCSMatrix Checking on the presence of non-crystallographic symmetry transformation matrices in coordinate hierarchy.
    CMMDBManager::CrystReady Checking on quality and completeness of crystallographic information set up in coordinate hierarchy.
    CMMDBManager::GetNumberOfSymOps Obtaining the number of symmetry operations.
    CMMDBManager::GetTMatrix Obtaining the symmetry transformation matrix.
    CMMDBManager::GetAtomStatistics Calculating the averaged properties of all atoms in the coordinate hierarchy.
    CMMDBManager::GetMassCenter Calculating the mass center of a set of atoms.


    pstr CMMDBManager::GetEntryID ( 
     )
    PURPOSE
    Obtaining the entry ID (or a PDB ID code).

    RETURN

    The function returns pointer to a string containing the entry ID. If no entry ID was set or read from coordinate file, the return will be "XXXX".


    int CMMDBManager::GetNumberOfAtoms ( 
     )
    PURPOSE
    Obtaining the total number of atoms in the coordinate hierarchy.

    RETURN

    The function returns total number of atoms, which are currently contained in the coordinate hierarchy.


    int CMMDBManager::GetNumberOfModels ( 
     )
    PURPOSE
    Obtaining the number of models in the coordinate hierarchy.

    RETURN

    The function returns the number of models, which are currently contained in the coordinate hierarchy.


    Boolean CMMDBManager::isCrystInfo ( 
     )
    PURPOSE
    Checking on the presence of crystallographic information in coordinate hierarchy.

    RETURN

    The function returns True if cell parameters a, b, c, alpha, beta and gamma were read from coordinate file or otherwise set up in the hierarchy.


    Boolean CMMDBManager::isSpaceGroup ( 
     )
    PURPOSE
    Checking on the presence of the name of space symmetry group in coordinate hierarchy.

    RETURN

    The function returns True if name of space group of symmetry was read from coordinate file or otherwise set up in the hierarchy.


    Boolean CMMDBManager::isTransfMatrix ( 
     )
    PURPOSE
    Checking on the presence of the orthogonalising/fractionalising matrices.

    RETURN

    The function returns True if the orthogonalising/fractionalising matrices were successfully calculated. The calculations are performed automatically when cell parameters are read from a coordinate file or set up by application.


    Boolean CMMDBManager::isScaleMatrix ( 
     )
    PURPOSE
    Checking on the presence of orthogonal-fractional transformation matrix in coordinate hierarchy.

    RETURN

    The function returns True if the orthogonal-fractional transformation matrix (PDB records SCALEn) was read from coordinate file or otherwise set up in the hierarchy.


    Boolean CMMDBManager::isNCSMatrix ( 
     )
    PURPOSE
    Checking on the presence of non-crystallographic symmetry transformation matrices in coordinate hierarchy.

    RETURN

    The function returns True if the non-crystallographic symmetry transformation matrices (PDB records MTRIXn) were read from coordinate file or otherwise set up in the hierarchy.


    int CMMDBManager::CrystReady ( 
     )
    PURPOSE
    Checking on quality and completeness of crystallographic information set up in coordinate hierarchy.

    RETURN

    The function returns a non-negative value if crystallographic information is usable. Positive return is interpreted as a combination of the following flags:

    Flag Value Description
    CRRDY_Complete 0 Crystallographic information is complete
    CRRDY_NotPrecise 0x00000001 The newly set up crystallographic information somewhat differ from the previous setting or from what was read from a coordinate file
    CRRDY_isTranslation 0x00000002 The orthogonal-to-fractional transformation matrix contains translational component(s)
    CRRDY_NoOrthCode 0x00000004 The orthogonalization code was not supplied or could not be established

    Negative return codes indicate more serious problems:

    Code Value Description
    CRRDY_NoTransfMatrices -1 No orthogonal-to-fractional transformation matrix was read from coordinate file or otherwise set up in the hierarchy
    CRRDY_Unchecked -2 The crystallographic information (cell parameter and/or transformation matrices) was not properly set up in the coordinate hierarchy (e.g. not all SCALEn cards were supplied or part of cell parameters is missing)
    CRRDY_Ambiguous -3 The newly set up crystallographic information differ considerably from the previous setting or from what was read from a coordinate file
    CRRDY_NoCell -4 No cell parameters were read from a coordinate file or otherwise set up in the coordinate hierarchy


    int CMMDBManager::GetNumberOfSymOps ( 
     )
    PURPOSE
    Obtaining the number of symmetry operations.

    RETURN

    The function returns the number of symmetry operations that are present in the space symmetry group currently set up in the coordinate hierarchy.

    The function returns 0 if no space symmetry group is defined.


    int CMMDBManager::GetTMatrix ( 
    mat44 &  TMatrix, 
    int Nop,
    int cellshift_a,
    int cellshift_b,
    int cellshift_c )
    PURPOSE
    Obtaining the symmetry transformation matrix.
    ARGUMENTS
    mat44 & TMatrix
    Matrix to accept the transformation matrix.

    int Nop
    Number of the space group symmetry operation. It should be in the range of 0..NumberOfSymOps-1, where NumberOfSymOps is returned by CMMDBManager::GetNumberOfSymOps.

    int cellshift_a
    Shift of the unit cell in a-directions in a-periods.

    int cellshift_b
    Shift of the unit cell in b-directions in b-periods.

    int cellshift_c
    Shift of the unit cell in c-directions in c-periods.

    DESCRIPTION

    The function calculates and returns the symmetry transformation matrix, which transforms from the principal orthogonal coordinates found in a coordinate file, into orthogonal coordinates of a symmetry mate generated by Nopth symmetry operation of the current space symmetry group in the unit cell shifted by cellshift_a a-periods, cellshift_b b-periods and cellshift_c c-periods from the principal unit cell of coordinate file.


    RETURN

    The function returns 0 if no problems were encountered. Other returns indicate:
    1 Nop is not in the right range or space symmetry group was not set up
    2 fractionalizing/orthogonalizing matrices were not calculated (lack of crystallographic data in the file)
    3 cell parameters a, b, c, alpha, beta, gamma were not set up

    NOTE : First symmetry operation Nop=0 is the identity.


    void CMMDBManager::GetAtomStatistics ( 
    RSAtomStat  AS )
    PURPOSE
    Calculating the averaged properties of all atoms in the coordinate hierarchy.
    ARGUMENTS
    RSAtomStat AS
    Reference to structure SAtomStat , which returns the average results.

    DESCRIPTION

    The function performs an actual calculation of averaged atom properties, none of them are stored as variables. It is therefore advised to avoid unnecessary calls to this function.


    void CMMDBManager::GetMassCenter ( 
    PPCAtom  A, 
    int nA,
    realtype & xmc,
    realtype & ymc,
    realtype & zmc )
    PURPOSE
    Calculating the mass center of a set of atoms.
    ARGUMENTS
    PPCAtom A
    Array of atoms. This array may conveniently come from selection functions.

    int nA
    Number of atoms in array A. The array is indexed as 0..nA-1 .

    realtype & xmc
    X-coordinate of mass center.

    realtype & ymc
    Y-coordinate of mass center.

    realtype & zmc
    Z-coordinate of mass center.

    DESCRIPTION

    The function calculates the mass center of atoms given in array A, with atomic weights peculiar to the element type taken into account.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_classio.html0000644000175100017510000010465107504104415015640 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: File Operations on Library's Classes.

    All classes in the Library employ a uniform technology of storing their content in disk files and its subsequent retrieval. This allows for automatical reading/writing of arbitrary system of linked classes. If an application derives childs from Library's classes, it must provide for this technology, otherwise the file operations on classes will not work correctly.

    In order to comply with the Library's system of class I/O, a class should provide for the following:
    1. it must originate from class CStream (found in file stream_.h). All Library's classes originate from CStream, therefore if they are parents of derived classes, this condition holds automatically.

    2. it must have a default constructor without parameters and a special "stream" constructor
      CDerivedClass ( RPCStream Object );
      
      Both of them should fully initialize the class' data; parameter Object must be passed to the stream constructor of parent untouched (see example below).

    3. it must have member functions
      void write ( RCFile f );
      void read  ( RCFile f );
      
      which, correspondingly, write and read the class' data using the file class CFile. These functions should also call the parent's write and read.

    4. the definition of class must be preceeded by macros
      DefineClass(CDerivedClass)
      DefineStreamFunctions(CDerivedClass)
      
    5. the implementation of class must include macro
      MakeStreamFunctions(CDerivedClass)
      

    After all the above conditions are satisfied, a class (e.g. CLibClass may be stored on disk and retrieved in either of the following ways:

    Method 1: use methods CLibClass::write(RCFile f):
    CFile     f;
    CLibClass LC;
      f.assign ( FileName );
      if (f.rewrite())  {
        LC.write ( f );
        f.shut();
      } else
        printf ( " can't open file for writting\n" );
    
    and CLibClass::read(RCFile f)
    CFile     f;
    CLibClass LC;
      f.assign ( FileName );
      if (f.reset())  {
        LC.read ( f );
        f.shut();
      } else
        printf ( " can't open file for reading\n" );
    
    This method represents merely a uniform unsophisticated approach to streaming the classes, which does not actually involve creation of class instances -- and therefore the special stream constructor from above does not participate in this. However, the all rules listed above must be satisfied if CLibClass is to replace one of the Library classes and the Library is therefore expected to take care of all file operations on it.

    Method 2: use stream functions StreamWrite(RCFile f,RPCLibClass LC):
    CFile      f;
    PCLibClass LC;
      LC = new CLibClass();
      . . . . . . . . . .
      f.assign ( FileName );
      if (f.rewrite())  {
        StreamWrite ( f,LC );
        f.shut();
      } else
        printf ( " can't open file for writting\n" );
    
    and StreamRead(RCFile f,RPCLibClass LC)
    CFile      f;
    PCLibClass LC;
      LC = NULL;
      f.assign ( FileName );
      if (f.reset())  {
        StreamRead ( f,LC );
        f.shut();
      } else
        printf ( " can't open file for reading\n" );
    
    This method will work even if class CLibClass is not found at the specified file position, in which case LC will be assigned NULL. This is a more general method of streaming the classes, which simplifies file operations on arbitrary dynamically-linked class hierarchies. Note that Method 1 and Method 2 cannot be mixed up, and that on each write/StreamWrite executed at writing the file, there should be exactly one call of read/StreamRead, correspondingly, at reading the file.

    EXAMPLE
    The following illustrates the abovewritten on the example of deriving a class from Library's class CAtom:

    in header new_catom.h file:
    DefineClass(CNewAtom)
    DefineStreamFunctions(CNewAtom)
    
    class CNewAtom : public CAtom  {
    
      public :
        CNewAtom();
        CNewAtom( RPCStream Object );
        ~CNewAtom();  // destructor
        void write ( RCFile f );
        void read  ( RCFile f );
    
      protected :
        int      new_int_data;
        realtype new_real_data;
        pstr     new_dynamical_string;
    
        void  InitNewAtom();  // common initializer
    
    };
    

    in implementational new_catom.cpp file:
    CNewAtom::CNewAtom() : CAtom()  {
      InitNewAtom();
    }
    
    CNewAtom::CNewAtom ( RPCStream Object ) : CAtom(Object)  {
      InitNewAtom();
    }
    
    CNewAtom~CNewAtom()  {
      if (new_dynamical_string)  delete new_dynamical_string;
    }
    
    void CNewAtom::InitNewAtom()  {
      new_int_data  = 1;
      new_real_data = 0.001;
      new_dynamical_string = NULL;
      CreateCopy ( new_dynamical_string,"new dynamical string" );
    }
    
    void CNewAtom::write ( RCFile f )  {
      CAtom::write  ( f );
      f.WriteInt    ( &new_int_data  );
      f.WriteReal   ( &new_real_data );
      f.CreateWrite ( new_dynamical_string );
    }
    
    void CNewAtom::read ( RCFile f )  {
    // read() must strictly preserve the order of file operations
    // set in the corresponding write() function
      CAtom::read ( f );
      f.ReadInt    ( &new_int_data  );
      f.ReadReal   ( &new_real_data );
      f.CreateRead ( new_dynamical_string );
    }
    
    MakeStreamFunctions(CNewAtom)
    

    Below, CLibClass stands for the name of any Library class or class derived from a Library class.

    Function Purpose
    CLibClass::CLibClass Default constructor for Library classes
    CLibClass::CLibClass Stream constructor for Library classes.
    CLibClass::write Writing the class data into a disk file.
    CLibClass::read Reading the class data from disk file.
    StreamWrite Writing a class into a disk file.
    StreamRead Reading a class from a disk file.
    DefineClass Macrodefinition of major types associated with the class.
    DefineStructure Macrodefinition of major types associated with the structure.
    DefineStreamFunctions Macrodefinition of prototypes of stream functions (StreamWrite and StreamRead) for a class.
    MakeStreamFunctions Macrogeneration of stream functions (StreamWrite and StreamRead) for a class.


     CLibClass::CLibClass ( 
     )
    PURPOSE
    Default constructor for Library classes
    DESCRIPTION

    Default constructor performs initialization of class' data. All Library classes and classes derived from them must have the default constructor.

    NOTE 1: Default constructors are used in Library's file operations on classes.

    NOTE 2: All Library classes are derived from class CStream, which provides support for file operations on classes.


    EXAMPLE

    CLibClass::CLibClass() : CStream()  {
      CLibClassIntVariable = 0;
    }
    


     CLibClass::CLibClass ( 
    RPCStream  Object )
    PURPOSE
    Stream constructor for Library classes.
    ARGUMENTS
    RPCStream Object
    This parameter must be passed to the parent class untouched.

    DESCRIPTION

    Stream constructor performs initialization of class' data and passes its argument to the parent class. All Library classes and classes derived from them must have the default constructor.

    NOTE 1: Stream constructors are used in Library's file operations on classes.

    NOTE 2: All Library classes are derived from class CStream, which provides support for file operations on classes.


    EXAMPLE

    CLibClass::CLibClass(RPCStream Object) : CStream(Object)  {
      CLibClassIntVariable = 0;
    }
    


     CLibClass::write ( 
    RCFile  f )
    PURPOSE
    Writing the class data into a disk file.
    ARGUMENTS
    RCFile f
    Reference to the instance of file class CFile. The file is supplied already opened and adjusted to the appropriate position -- do not attempt to change that. The file must be left opened when the function returns.

    DESCRIPTION

    This virtual function, first defined in class CStream (file stream_.h), should provide for writing the class data into file given as the function's argument. The given file is already open; the function must not attempt to neither open nor close it, as well as change its current position by means other than normal output operations. It must not attempt to read from the file, either.

    If the class is derived from another class, other than CStream, the write function must also call write function of the class' parent by placing statement
    CParentClass::write(f);
    (CParentClass stands for the name of parential class), where appropriate within the function body.

    NOTE : It is crucially important that write and read functions of a class handle equal amount of bytes in strictly the same order.


    EXAMPLE

    See examples on the top of this page.


     CLibClass::read ( 
    RCFile  f )
    PURPOSE
    Reading the class data from disk file.
    ARGUMENTS
    RCFile f
    Reference to the instance of file class CFile. The file is supplied already opened and adjusted to the appropriate position -- do not attempt to change that. The file must be left opened when the function returns.

    DESCRIPTION

    This virtual function, first defined in class CStream (file stream_.h), should provide for reading the class data from file given as the function's argument. The given file is already open; the function must not attempt to neither open nor close it, as well as change its current position by means other than normal input operations. It must not attempt to write into the file, either.

    If the class is derived from another class, other than CStream, the read function must also call read function of the class' parent by placing statement
    CParentClass::read(f);
    (CParentClass stands for the name of parential class), where required within the function body.

    NOTE : It is crucially important that write and read functions of a class handle equal amount of bytes in strictly the same order.


    EXAMPLE

    See examples on the top of this page.


    void StreamWrite ( 
    RCFile  f, 
    RPCStream Object )
    PURPOSE
    Writing a class into a disk file.
    ARGUMENTS
    RCFile f
    Reference to the instance of file class CFile.

    RPCStream Object
    Reference to the pointer of a class, which is to be written. The class must be derived from CStream and satisfy all the conditions listed on top of this page.

    DESCRIPTION

    This function is part of the Library's technology of performing file operation on classes. Combined with StreamRead, it allows for automatical writing/reading an arbitrary dynamically linked hierarchy of classes.

    The function writes the class data into disk file, preceeding it with a few bytes of auxilary information. It is perfectly Ok to give this function a NULL pointer for Object which is interpreted as "empty" class or "no class".

    NOTE 1: The function is generated automatically by macros DefineStreamFunctions and MakeStreamFunctions.

    NOTE 2: For each call to StreamWrite made at writing a file, there must be exactly one call to StreamRead at reading it at strictly the same file position.


    EXAMPLE

    See examples on the top of this page.


    void StreamRead ( 
    RCFile  f, 
    RPCStream Object )
    PURPOSE
    Reading a class from a disk file.
    ARGUMENTS
    RCFile f
    Reference to the instance of file class CFile.

    RPCStream Object
    Reference to the pointer of a class, which is to be read. The class must be derived from CStream and satisfy all the conditions listed on top of this page.

    DESCRIPTION

    This function is part of the Library's technology of performing file operation on classes. Combined with StreamWrite, it allows for automatical reading/writing an arbitrary dynamically linked hierarchy of classes.

    If Object is set to NULL, the corresponding class will be allocated, initialized and read from the disk file; Object will then return pointer on it. If Object points to an existing instance of the class before being passed to StreamRead, the function will use that instance to stuff it with data from the file.

    If StreamWrite has placed an "empty" class at given position in the file, StreamRead will always return Object=NULL; in this case, if Object pointed to an allocated class before being passed to StreamRead, that class will be automatically disposed.

    NOTE 1: The function is generated automatically by macros DefineStreamFunctions and MakeStreamFunctions.

    NOTE 2: For each call to StreamRead made at reading a file, there must be exactly one call to StreamWrite at writing it at strictly the same file position.


    EXAMPLE

    See examples on the top of this page.


     DefineClass ( 
      ClassName )
    PURPOSE
    Macrodefinition of major types associated with the class.
    ARGUMENTS
    ClassName
    Name of a class.

    DESCRIPTION

    This macro defines the types of class pointer, class reference, pointer on pointer and reference to pointer. Each pointer is made by prefix "P", and each reference - by prefix "R". Thus
    PClassName - is pointer on class ClassName
    RClassName - is reference to class ClassName
    PPClassName - is pointer on PClassName
    RPClassName - is reference to PClassName

    NOTE 1: These type definitions are used by macros DefineStreamFunctions and MakeStreamFunctions and through all the Library, therefore definition of each class should be prefaced with this macro.

    NOTE 2: In the Library, the class names always start with capital "C". This however is not a requirement of any syntax or macrodefinition(s).


    EXAMPLE

    See example on the top of this page.


     DefineStructure ( 
      StructName )
    PURPOSE
    Macrodefinition of major types associated with the structure.
    ARGUMENTS
    StructName
    Name of a structure.

    DESCRIPTION

    This macro defines the types of structure pointer, structure reference, pointer on pointer and reference to pointer. Each pointer is made by prefix "P", and each reference - by prefix "R". Thus
    PStructName - is pointer on structure StructName
    RStructName - is reference to structure StructName
    PPStructName - is pointer on PStructName
    RPStructName - is reference to PStructName

    NOTE : In the Library, the structure names always start with capital "S". This however is not a requirement of any syntax or macrodefinition(s).


     DefineStreamFunctions ( 
      ClassName )
    PURPOSE
    Macrodefinition of prototypes of stream functions (StreamWrite and StreamRead) for a class.
    ARGUMENTS
    ClassName
    Name of a class.

    DESCRIPTION

    This macro defines the prototypes of stream functions (StreamWrite and StreamRead) for class ClassName. These prototypes may be implicitely used by the Library, therefore always issue this macro.

    NOTE 1: This macro will not work if DefineClass macro for that class was not issued before it.

    NOTE 2: In the Library, the class names always start with capital "C". This however is not a requirement of any syntax or macrodefinition(s).


    EXAMPLE

    See example on the top of this page.


     MakeStreamFunctions ( 
      ClassName )
    PURPOSE
    Macrogeneration of stream functions (StreamWrite and StreamRead) for a class.
    ARGUMENTS
    ClassName
    Name of a class.

    DESCRIPTION

    This macro generates stream functions StreamWrite and StreamRead for class ClassName.

    NOTE 1: This macro will not work if DefineClass macro for that class was not issued before it.

    NOTE 2: In the Library, the class names always start with capital "C". This however is not a requirement of any syntax or macrodefinition(s).


    EXAMPLE

    See example on the top of this page.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_chain.html0000644000175100017510000036132507505573533015304 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Data class CChain.

    Data class CChain represents a chain in the coordinate hierarchy.

    CChain contains all information, which is relevant to particular chain, and reference to model that contains the chain. It also contains table of pointers on all residues (represented as classes of type CResidue) that belong to the chain.

    Function Purpose
    CChain::CChain Default constructor.
    CChain::~CChain The class' destructor.
    CChain::GetModelNum Obtaining number of model containing the chain.
    CChain::GetModel Obtaining pointer on model containing the chain.
    CChain::isInSelection Checking if chain is selected.
    CChain::GetChainID Obtaining identifier of the chain.
    CChain::SetChainID Setting the chain identifier.
    CChain::GetChainID Obtaining a full chain's coordinate ID.
    CChain::CheckID Checking the chain's ID by chainID.
    CChain::CheckIDS Checking the chain's ID by coordinate ID.
    CChain::GetNumberOfResidues Obtaining the number of residues in chain.
    CChain::GetResidue Obtaining a residue pointer by residue sequence number and insertion code.
    CChain::GetResidue Obtaining a residue pointer by residue number.
    CChain::GetResidueNo Obtaining a residue position in the chain by residue sequence number and insertion code.
    CChain::GetResidueTable Obtaining the chain's table of residues.
    CChain::DeleteResidue Deleting a residue by residue sequence number and insertion code.
    CChain::DeleteResidue Deleting a residue by residue number.
    CChain::GetNumberOfAtoms Calculating the total number of atoms in the chain.
    CChain::GetNumberOfAtoms Obtaining the number of atoms in residue by residue sequence number and insertion code.
    CChain::GetNumberOfAtoms Obtaining the number of atoms in residue by residue number.
    CChain::GetAtom Obtaining an atom pointer by residue sequence number, insertion code, atom name, element name, and alternative location indicator.
    CChain::GetAtom Obtaining an atom pointer by residue sequence number, residue insertion code and atom number.
    CChain::GetAtom Obtaining an atom pointer by residue number, atom name, element name and alternative location indicator.
    CChain::GetAtom Obtaining an atom pointer by residue number and atom number.
    CChain::GetAtomTable Obtaining the residue's table of atoms by residue sequence number and insertion code.
    CChain::GetAtomTable Obtaining the residue's table of atoms by residue number.
    CChain::DeleteAtom Deleting an atom specified by residue sequence number, insertion code, atom name, element name, and alternative location indicator.
    CChain::DeleteAtom Deleting an atom specified by residue sequence number, residue insertion code and atom number.
    CChain::DeleteAtom Deleting an atom specified by residue number, atom name, element name and alternative location indicator.
    CChain::DeleteAtom Deleting an atom specified by residue number and atom number.
    CChain::DeleteAllAtoms Deleting all atoms in the residue specified by sequence number and insertion code.
    CChain::DeleteAllAtoms Deleting all atoms in the residue specified by its position in the chain.
    CChain::DeleteAllAtoms Deleting all atoms in the chain.
    CChain::AddAtom Adding an atom to the residue specified by sequence number and insertion code.
    CChain::AddAtom Adding an atom to the residue specified by its position in the chain.
    CChain::SetEntryID Setting the entry ID.
    CChain::GetEntryID Obtaining the entry ID.
    CChain::GetAtomStatistics Calculating the averaged properties of all atoms in the chain.
    CChain::GetNofModResidues Obtaining the number of modified residues annotated in the chain.
    CChain::GetModResidues Obtaining the information on modified residue.
    CChain::ApplyTransform Applying a transformation matrix to coordinates of all atoms in the chain.
    CChain::isSolventChain Checking if the chain consists only of solvent molecules.
    CChain::PutUDData Storing an integer User-Defined Data (UDD) in the chain.
    CChain::PutUDData Storing a real-type User-Defined Data (UDD) in the chain.
    CChain::PutUDData Storing a string-type User-Defined Data (UDD) in the chain.
    CChain::GetUDData Retrieving an integer User-Defined Data (UDD) from the chain.
    CChain::GetUDData Retrieving a real-type User-Defined Data (UDD) from the chain.
    CChain::GetUDData Retrieving a string-type User-Defined Data (UDD) from the chain, dynamic buffer.
    CChain::GetUDData Retrieving a string-type User-Defined Data (UDD) from the chain, fixed-size buffer.
    CChain::Copy Copying the chain contents.


     CChain::CChain ( 
     )
    PURPOSE
    Default constructor.
    DESCRIPTION

    Default constructor creates an empty CChain object.


     CChain::~CChain ( 
     )
    PURPOSE
    The class' destructor.
    DESCRIPTION

    The destructor is called implicitely whenever the class instance is deleted. It deletes all atoms and residues containing in the chain and the chain itself. If the chain is properly associated with the coordinate hierarchy, the destructor removes all references on the chain, its residues and atoms, from the hierarchy.

    NOTE : Deleting a chain is an editing operation. If it is done by application explicitely, like in the following example:

        PCMMDBManager MMDB;
        PCChain       chain;
          chain = MMDB->GetChain ( "/1/A" );
          delete chain;  // this is where the destructor is called!
        
    then the application must call CMMDBManager::FinishStructEdit function before using any results of such deletion(s).

    If the deletion is done implicitely by a Library function in the course of other action(s), there is no need for application to call CMMDBManager::FinishStructEdit after that.


    int CChain::GetModelNum ( 
     )
    PURPOSE
    Obtaining number of model containing the chain.
    DESCRIPTION

    The function returns number of model that contains the chain. Models are numbered 1.. on. If chain is not properly associated with coordinate hierarchy, the function returns 0.


    PCModel CChain::GetModel ( 
     )
    PURPOSE
    Obtaining pointer on model containing the chain.
    DESCRIPTION

    The function returns pointer on model that contains the chain. If chain is not properly associated with coordinate hierarchy, the function returns NULL.


    Boolean CChain::isInSelection ( 
    int  selHnd )
    PURPOSE
    Checking if chain is selected.
    ARGUMENTS
    int selHnd
    Selection handle.

    DESCRIPTION

    The function returns True if chain is selected for the specified selection handle, and False otherwise.

    NOTE : The function returns False if chain is not properly associated with coordinate hierarchy.


    pstr CChain::GetChainID ( 
     )
    PURPOSE
    Obtaining identifier of the chain.
    DESCRIPTION

    The function returns identifier of the chain. If the chain does not have an ID, the function returns empty string "".


    void CChain::SetChainID ( 
    ChainID  chainID )
    PURPOSE
    Setting the chain identifier.
    ARGUMENTS
    ChainID chainID
    New chain ID.

    DESCRIPTION

    The function sets a new chain ID, i.e. renames the chain. Other parts of the coordinate file, such as PDB records DBREF, SEQRES and others, are updated automatically.


    pstr CChain::GetChainID ( 
    pstr  CID )
    PURPOSE
    Obtaining a full chain's coordinate ID.
    ARGUMENTS
    pstr CID
    A string to accept the chain's coordinate ID.

    DESCRIPTION

    The function calculates a coordinate ID of the chain and returns it in the supplied string. The same string is returned as the function value.

    If chain is not properly associated with coordinate hierarchy, the coordinate ID will contain dash "-" for model number.

    NOTE : The function does not make any checks on the sufficiency of string buffer CID to accept the information.


    int CChain::CheckID ( 
    ChainID  chID )
    PURPOSE
    Checking the chain's ID by chainID.
    ARGUMENTS
    ChainID chID
    The chain ID, represented as a null-terminated string without spaces. For unnamed chains, chID should be set to empty string "". chID may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function returns 1 if the chain is identified by given chain ID, and 0 otherwise. If chID is set to NULL or wildcard "*" then any chain is identified.

    NOTE 1: The model serial number is not taken into account by this function.

    NOTE 2: Comparison is case-sensitive. Consider that " " is not an empty string.


    int CChain::CheckIDS ( 
    pstr  CID )
    PURPOSE
    Checking the chain's ID by coordinate ID.
    ARGUMENTS
    pstr CID
    The chain's coordinate ID. Only the part of coordinate ID containing the chain ID is taken into consideration.

    DESCRIPTION

    The function returns 1 if the chain is identified by chain ID found in the provided coordinate ID, and 0 otherwise. If CID contains a wildcard for chain ID, any chain is identified.

    NOTE 1: The model serial number, as well as any residue and atom-related information in the coordinate ID are not taken into account by this function.

    NOTE 2: Comparison is case-sensitive. Any spaces in the coordinate ID are ignored.


    int CChain::GetNumberOfResidues ( 
     )
    PURPOSE
    Obtaining the number of residues in chain.
    DESCRIPTION

    The function returns the number of residues currently contained in the chain.


    PCResidue CChain::GetResidue ( 
    int  seqNum, 
    InsCode insCode )
    PURPOSE
    Obtaining a residue pointer by residue sequence number and insertion code.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    DESCRIPTION

    The function returns pointer on the residue identified by residue sequence number and insertion code. If any of these characteristics is invalid or if such a residue does not exist in chain, the function returns NULL.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    PCResidue CChain::GetResidue ( 
    int  resNo )
    PURPOSE
    Obtaining a residue pointer by residue number.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residues in the table are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    DESCRIPTION

    The function returns pointer on the resNoth residue in the chain's table of residues. If resNo is invalid or if such a residue does not exist in the chain, the function returns NULL.


    int CChain::GetResidueNo ( 
    int  seqNum, 
    InsCode insCode )
    PURPOSE
    Obtaining a residue position in the chain by residue sequence number and insertion code.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    DESCRIPTION

    The function returns the residue position (residue number) in the chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    The residue is identified by residue sequence number and insertion code. If any of these characteristics is invalid or if such a residue does not exist in chain, the function returns -1.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    void CChain::GetResidueTable ( 
    PPCResidue &  resTable, 
    int & NumberOfResidues )
    PURPOSE
    Obtaining the chain's table of residues.
    ARGUMENTS
    PPCResidue & resTable
    The table of residues.

    int & NumberOfResidues
    The number of residues.

    DESCRIPTION

    The function returns table of pointers on all residues currently contained in the chain. NumberOfResidues returns the number of residues. The residues are indexed as 0..NumberOfResidues-1 in the table.

    If there is no residues in the chain, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose residues. This results in empty cells in the table of residues. Therefore, it is a good practice for application to check that resTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of residues.


    int CChain::DeleteResidue ( 
    int  seqNum, 
    InsCode insCode )
    PURPOSE
    Deleting a residue by residue sequence number and insertion code.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represenyted as null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    DESCRIPTION

    The function deletes residue identified by residue sequence number and insertion code, and all atoms contained in it. If the requested residue does not exist in the chain, the function does nothing.


    RETURN

    The function returns the number of deleted residues, that is 1 or 0.

    NOTE 1: Comparison is case-sensitive. Consider that " " is not an empty string.

    NOTE 2: Deleted residues and atoms are completely disposed and are not retrievable.

    NOTE 3: The application must call CMMDBManager::FinishStructEdit function after a set of editing operations is complete, before using the results of the editing.


    int CChain::DeleteResidue ( 
    int  resNo )
    PURPOSE
    Deleting a residue by residue number.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    DESCRIPTION

    The function deletes the resNoth residue in the chain's table of residues, and all atoms contained in it. If resNo is invalid or if such a residue does not exist in the chain, the function does nothing.


    RETURN

    The function returns the number of deleted residues, that is 1 or 0.

    NOTE 1: Deleted residues and atoms are completely disposed and are not retrievable.

    NOTE 2: The application must call CMMDBManager::FinishStructEdit function after a set of editing operations is complete, before using the results of the editing.


    int CChain::GetNumberOfAtoms ( 
    Boolean  countTers )
    PURPOSE
    Calculating the total number of atoms in the chain.
    ARGUMENTS
    Boolean countTers
    Flag specifying if any termination records ("TER") should be counted as atoms. In MMDB, the termination records are kept as a special case of CAtom objects. If countTers is set to True, the termination records will be counted as atoms, otherwise they are ignored.

    DESCRIPTION

    The function performs an actual calculation of all atoms in the chain, not just returning the sum of lengths of atom tables. If some cells in atom tables are empty (set to NULL), they are not counted.


    int CChain::GetNumberOfAtoms ( 
    int  seqNum, 
    InsCode insCode )
    PURPOSE
    Obtaining the number of atoms in residue by residue sequence number and insertion code.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns the number of atoms currently contained in the chain's residue identified by residue sequence number and insertion code. If the residue identification is invalid or if such a residue is not found in the chain, the function returns 0.

    NOTE : The function actually returns the length of atom table of the residue. In the course of editing operations, the table may contain empty cells, which will be counted as atoms. Besides, a residue may contain a termination record ("TER"), which is kept in MMDB as a special case of CAtom object; the function will count such an object as atom.


    int CChain::GetNumberOfAtoms ( 
    int  resNo )
    PURPOSE
    Obtaining the number of atoms in residue by residue number.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    DESCRIPTION

    The function returns the number of atoms currently contained in the chain's residue identified by residue number (that is, the residue position in the chain's table of residues). If the residue number is invalid or if such a residue is not found in the chain, the function returns 0.

    NOTE : The function actually returns the length of atom table of the residue. In the course of editing operations, the table may contain empty cells, which will be counted as atoms. Besides, a residue may contain a termination record ("TER"), which is kept in MMDB as a special case of CAtom object; the function will count such an object as atom.


    PCAtom CChain::GetAtom ( 
    int  seqNum, 
    InsCode insCode,
    AtomName aname,
    Element elname,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by residue sequence number, insertion code, atom name, element name, and alternative location indicator.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName aname
    The atom name. It may or may not be aligned (as in a PDB file), only first word of the name will be considered (thus "CA", " CA" and " CA B" are all considered as "CA"). aname may be set to NULL or to wildcard "*", then this parameter is ignored.

    Element elname
    The atom's chemical element code. This parameter will work only if the element code was set up for the atom (which may take place in the case of reading atoms from old PDB files that do not contain the chemical element names; or if the atom was created in a tricky way by application). elname should be used to distinguish between, e.g. "Ca" and "C_alpha". All spaces in elname are ignored. elname may be set to NULL or to the wildcard "*", then this parameter is ignored.

    AltLoc aloc
    The atom's alternative location indicator. If atom does not have alternative location, this is indicated by empty string "". aloc may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function returns pointer on the atom identified by residue sequence number and insertion code, atom name, chemical element name and alternative location indicator. If any of these characteristics is invalid or if such an atom does not exist in the chain, the function returns NULL.

    The atom is considered as identified, if all non-NULL, non-wildcard parameters do match. If the specified parameters allow for identification of more than one atom in the chain, the first one from the begining of the chain's table of residues and the residue's table of atoms is taken.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    PCAtom CChain::GetAtom ( 
    int  seqNum, 
    InsCode insCode,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by residue sequence number, residue insertion code and atom number.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number, that is the atom's position in the residue's table of atoms. The atoms in the table are numbered as 0..NumberOfAtoms-1 where NumberOfAtoms is returned by CChain::GetNumberOfAtoms.

    DESCRIPTION

    The function returns pointer on the atomNoth atom in the atom table of the chain's residue identified by residue sequence number and insertion code. If atom identification is invalid or if such an atom does not exist in the chain, the function returns NULL.


    PCAtom CChain::GetAtom ( 
    int  resNo, 
    AtomName aname,
    Element elname,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by residue number, atom name, element name and alternative location indicator.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    AtomName aname
    The atom name. It may or may not be aligned (as in a PDB file), only first word of the name will be considered (thus "CA", " CA" and " CA B" are all considered as "CA"). aname may be set to NULL or to wildcard "*", then this parameter is ignored.

    Element elname
    The atom's chemical element code. This parameter will work only if the element code was set up for the atom (which may take place in the case of reading atoms from old PDB files that do not contain the chemical element names; or if the atom was created in a tricky way by application). elname should be used to distinguish between, e.g. "Ca" and "C_alpha". All spaces in elname are ignored. elname may be set to NULL or to the wildcard "*", then this parameter is ignored.

    AltLoc aloc
    The atom's alternative location indicator. If atom does not have alternative location, this is indicated by empty string "". aloc may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function returns pointer on the atom identified by residue number (that is, the residue's position in the chain's table of residues), atom name, chemical element name and alternative location indicator. If any of these characteristics is invalid or if such an atom does not exist in the chain, the function returns NULL.

    The atom is considered as identified, if all non-NULL, non-wildcard parameters do match. If the specified parameters allow for identification of more than one atom in the chain, the first one from the begining of the chain's table of residues and the residue's table of atoms is taken.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    PCAtom CChain::GetAtom ( 
    int  resNo, 
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by residue number and atom number.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    int atomNo
    The atom number, that is the atom's position in the residue's table of atoms. The atoms in the table are numbered as 0..NumberOfAtoms-1 where NumberOfAtoms is returned by CChain::GetNumberOfAtoms.

    DESCRIPTION

    The function returns pointer on the atomNoth atom in the atom table of the resNoth residue in the chain's table of residues. If atom identification is invalid or if such an atom does not exist in the chain, the function returns NULL.


    void CChain::GetAtomTable ( 
    int  seqNum, 
    InsCode insCode,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the residue's table of atoms by residue sequence number and insertion code.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the chain's residue identified by residue sequence number and insertion code. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If there is no atoms in the residue or if the specified residue is not found in the chain, the function returns NULL for atomTable and 0 for NumberOfAtoms.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the table of atoms. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of atoms.


    void CChain::GetAtomTable ( 
    int  resNo, 
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the residue's table of atoms by residue number.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the resNoth residue in the chain's table of residues. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If there is no atoms in the residue or if the specified residue is not found in the chain, the function returns NULL for atomTable and 0 for NumberOfAtoms.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the table of atoms. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of atoms.


    PCAtom CChain::DeleteAtom ( 
    int  seqNum, 
    InsCode insCode,
    AtomName aname,
    Element elname,
    AltLoc aloc )
    PURPOSE
    Deleting an atom specified by residue sequence number, insertion code, atom name, element name, and alternative location indicator.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName aname
    The atom name. It may or may not be aligned (as in a PDB file), only first word of the name will be considered (thus "CA", " CA" and " CA B" are all considered as "CA"). aname may be set to NULL or to wildcard "*", then this parameter is ignored.

    Element elname
    The atom's chemical element code. This parameter will work only if the element code was set up for the atom (which may take place in the case of reading atoms from old PDB files that do not contain the chemical element names; or if the atom was created in a tricky way by application). elname should be used to distinguish between, e.g. "Ca" and "C_alpha". All spaces in elname are ignored. elname may be set to NULL or to the wildcard "*", then this parameter is ignored.

    AltLoc aloc
    The atom's alternative location indicator. If atom does not have alternative location, this is indicated by empty string "". aloc may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function deletes the specified atom from the coordinate hierarchy: the atom is checked out and disposed.
    The function returns the number of actually deleted atoms, which may be more than one if NULL or wildcard parameters have been supplied (cf. above). A zero return indicates that either the requested residue or atom in the residue were not found.

    NOTE 1: Comparison is case-sensitive. Consider that " " is not an empty string.

    NOTE 2: If deletion of an atom leaves residue empty, the latter is not deleted. Empty residue gives no records in PDB file.


    PCAtom CChain::DeleteAtom ( 
    int  seqNum, 
    InsCode insCode,
    int atomNo )
    PURPOSE
    Deleting an atom specified by residue sequence number, residue insertion code and atom number.
    ARGUMENTS
    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number, that is the atom's position in the residue's table of atoms. The atoms in the table are numbered as 0..NumberOfAtoms-1 where NumberOfAtoms is returned by CChain::GetNumberOfAtoms.

    DESCRIPTION

    The function deletes the specified atom from the coordinate hierarchy: the atom is checked out and disposed.
    The function returns the number of actually deleted atoms, which may be more than one if NULL or wildcard parameters have been supplied (cf. above). A zero return indicates that either the requested residue or atom in the residue were not found.

    NOTE : If deletion of an atom leaves residue empty, the latter is not deleted. Empty residue gives no records in PDB file.


    PCAtom CChain::DeleteAtom ( 
    int  resNo, 
    AtomName aname,
    Element elname,
    AltLoc aloc )
    PURPOSE
    Deleting an atom specified by residue number, atom name, element name and alternative location indicator.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    AtomName aname
    The atom name. It may or may not be aligned (as in a PDB file), only first word of the name will be considered (thus "CA", " CA" and " CA B" are all considered as "CA"). aname may be set to NULL or to wildcard "*", then this parameter is ignored.

    Element elname
    The atom's chemical element code. This parameter will work only if the element code was set up for the atom (which may take place in the case of reading atoms from old PDB files that do not contain the chemical element names; or if the atom was created in a tricky way by application). elname should be used to distinguish between, e.g. "Ca" and "C_alpha". All spaces in elname are ignored. elname may be set to NULL or to the wildcard "*", then this parameter is ignored.

    AltLoc aloc
    The atom's alternative location indicator. If atom does not have alternative location, this is indicated by empty string "". aloc may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function deletes the specified atom from the coordinate hierarchy: the atom is checked out and disposed.
    The function returns the number of actually deleted atoms, which may be more than one if NULL or wildcard parameters have been supplied (cf. above). A zero return indicates that either the requested residue or atom in the residue were not found.

    NOTE 1: Comparison is case-sensitive. Consider that " " is not an empty string.

    NOTE 2: If deletion of an atom leaves residue empty, the latter is not deleted. Empty residue gives no records in PDB file.


    PCAtom CChain::DeleteAtom ( 
    int  resNo, 
    int atomNo )
    PURPOSE
    Deleting an atom specified by residue number and atom number.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    int atomNo
    The atom number, that is the atom's position in the residue's table of atoms. The atoms in the table are numbered as 0..NumberOfAtoms-1 where NumberOfAtoms is returned by CChain::GetNumberOfAtoms.

    DESCRIPTION

    The function deletes the specified atom from the coordinate hierarchy: the atom is checked out and disposed.
    The function returns the number of actually deleted atoms, which may be 0 or 1. A zero return indicates that either the requested residue or atom in the residue were not found.

    NOTE : If deletion of an atom leaves residue empty, the latter is not deleted. Empty residue gives no records in PDB file.


    int CChain::DeleteAllAtoms ( 
    int  seqNo, 
    InsCode insCode )
    PURPOSE
    Deleting all atoms in the residue specified by sequence number and insertion code.
    ARGUMENTS
    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function deletes all atoms in the specified residue of the chain. The function returns the number of actually deleted atoms.

    NOTE : Note that the residue is not deleted, however stays empty. Empty residue gives no records in a PDB file.


    int CChain::DeleteAllAtoms ( 
    int  resNo )
    PURPOSE
    Deleting all atoms in the residue specified by its position in the chain.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    DESCRIPTION

    The function is completely identical to CChain::DeleteAllAtoms except that the residue is specified by its position in the chain.


    int CChain::DeleteAllAtoms ( 
     )
    PURPOSE
    Deleting all atoms in the chain.
    DESCRIPTION

    The function deletes all atoms in the chain. The function returns the number of actually deleted atoms.

    NOTE : Note that the chain is not deleted, however stays empty. Empty chain gives no coordinate records in a PDB file.


    int CChain::AddAtom ( 
    int  seqNo, 
    InsCode insCode,
    PCAtom atom )
    PURPOSE
    Adding an atom to the residue specified by sequence number and insertion code.
    ARGUMENTS
    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    PCAtom atom
    The atom to be added to the residue.

    DESCRIPTION

    The function adds atom atom to the specified residue, placing it on the top of the residue's table of atoms. The atom and the residue may be or may be not associated with a coordinate hierarchy.

    If atom atom is not associated with a coordinate hierarchy, it is taken over by the residue, which means that its pointer is saved in the residue's table of atoms. If atom atom already belongs to a coordinate hierarchy (even though that of the residue), the residue adopts its (automatically created) copy, thus the atom is not removed from its own coordinate hierarchy.

    If residue is associated with a coordinate hierarchy, the newly added atom is automatically associated with it. Otherwise, the atom is checked in the hierarchy once the residue is checked in (see example below).


    RETURN

    Upon success, the function returns the number of atoms in the residue, which should be a positive integer greater than 0. A negative or zero return means that the atom is already in the residue, found at position equal to minus return. Zero return may also mean that the residue is not found in the chain.

    NOTE 1: Note the difference between adding atoms associated and not associated with a coordinate hierarchy as described above.

    NOTE 2: Calling CMMDBManager::FinishStructEdit function is not necessary after adding atoms. However, it is advisable to call CMMDBManager::PDBCleanup with input flags PDBCLEAN_SERIAL and PDBCLEAN_INDEX after adding all atoms (don't call CMMDBManager::PDBCleanup after every addition of an atom). PDBCLEAN_SERIAL will put atoms' serial numbers in due order, and "cleaning" on PDBCLEAN_INDEX is needed for the internal consistency of data.


    int CChain::AddAtom ( 
    int  resNo, 
    PCAtom atom )
    PURPOSE
    Adding an atom to the residue specified by its position in the chain.
    ARGUMENTS
    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    PCAtom atom
    The atom to be added to the residue.

    DESCRIPTION

    The function is completely identical to CChain::AddAtom except that the residue is specified by its position in the chain.


    void CChain::SetEntryID ( 
    IDCode  idCode )
    PURPOSE
    Setting the entry ID.
    ARGUMENTS
    IDCode idCode
    New entry ID.

    DESCRIPTION

    The function sets the new entry ID, that is normally the 4-letter PDB entry code. The function will accomplish successfully only if the chain is properly associated with coordinate hierarchy.


    pstr CChain::GetEntryID ( 
     )
    PURPOSE
    Obtaining the entry ID.
    DESCRIPTION

    The function returns the entry ID, that is normally the 4-letter PDB entry code. The ID is returned as a null-teminated string. If chain is not properly associated with coordinate hierarchy, the function returns empty string "".


    void CChain::GetAtomStatistics ( 
    RSAtomStat  AS )
    PURPOSE
    Calculating the averaged properties of all atoms in the chain.
    ARGUMENTS
    RSAtomStat AS
    Reference to structure SAtomStat , which returns the average results.

    DESCRIPTION

    The function performs an actual calculation of averaged atom properties, none of them are stored as variables. It is therefore advised to avoid unnecessary calls to this function.


    int CChain::GetNofModResidues ( 
     )
    PURPOSE
    Obtaining the number of modified residues annotated in the chain.
    DESCRIPTION

    The function returns the number of modified residues annotated in the chain, i.e. the number of PDB MODRES records showing the chain's ID.


    PCModRes CChain::GetModResidues ( 
    int  modResNo )
    PURPOSE
    Obtaining the information on modified residue.
    ARGUMENTS
    int modResNo
    The modified residue number. Modified residues, found in the chain, are enumerated as 0..NmodRes-1, where NmodRes is returned by CChain::GetNofModResidues.

    DESCRIPTION

    The function returns pointer to the class data containing all contents of the corresponding PDB MODRES record.


    RETURN

    The CModRes class has the following public fields that may be read by application:
     
    Type Name Description
    ResName   resName   The residue name used
    ResName stdRes Standard residue name
    int seqNum The residue sequence number
    InsCode insCode The residue insertion code
    pstr comment Description of the residue modification

    Changing these values by application is generally harmless.

    NOTE : The class returned by the function, can not be disposed. An attempt to do so by application will eventually crash the latter.


    void CChain::ApplyTransform ( 
    mat44 &  TMatrix )
    PURPOSE
    Applying a transformation matrix to coordinates of all atoms in the chain.
    ARGUMENTS
    mat44 & TMatrix
    The transformation matrix.

    DESCRIPTION

    The function applies the rotational-translational transformation given by matrix TMatrix, to coordinates of all atoms in the chain.

    The transformation matrix TMatrix contains rotational part in columns 0,1,2, rows 0,1,2 (stands for x,y,z) and translational part in column 3, rows 0,1,2.


    Boolean CChain::isSolventChain ( 
     )
    PURPOSE
    Checking if the chain consists only of solvent molecules.
    DESCRIPTION

    The function returns True if the chain consists only of solvent residues.


    int CChain::PutUDData ( 
    int  UDDhandle, 
    int iudd )
    PURPOSE
    Storing an integer User-Defined Data (UDD) in the chain.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int iudd
    The integer number to be stored in the chain.

    DESCRIPTION

    The function stores an integer contained in iudd in the chain, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully stored
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the chain, the data was not stored
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in chains, the data was not stored


    int CChain::PutUDData ( 
    int  UDDhandle, 
    realtype rudd )
    PURPOSE
    Storing a real-type User-Defined Data (UDD) in the chain.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    realtype rudd
    The real number to be stored in the chain.

    DESCRIPTION

    The function stores the real number contained in rudd in the chain, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CChain::PutUDData, see returns there.


    int CChain::PutUDData ( 
    int  UDDhandle, 
    pstr sudd )
    PURPOSE
    Storing a string-type User-Defined Data (UDD) in the chain.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    The string to be stored in the chain.

    DESCRIPTION

    The function stores the string pointed by sudd in the chain, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CChain::PutUDData, see returns there.


    int CChain::GetUDData ( 
    int  UDDhandle, 
    int & iudd )
    PURPOSE
    Retrieving an integer User-Defined Data (UDD) from the chain.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int & iudd
    The buffer to accept the integer data.

    DESCRIPTION

    The function retrieves an integer previously stored in the chain by function CChain::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in iudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the chain. iudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the chain. iudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in chains. iudd does not change.


    int CChain::GetUDData ( 
    int  UDDhandle, 
    real & rudd )
    PURPOSE
    Retrieving a real-type User-Defined Data (UDD) from the chain.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    real & rudd
    The buffer to accept the real-type data.

    DESCRIPTION

    The function retrieves a real number previously stored in the chain by function CChain::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in rudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the chain. rudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the chain. rudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in chains. rudd does not change.


    int CChain::GetUDData ( 
    int  UDDhandle, 
    pstr & sudd )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the chain, dynamic buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr & sudd
    A pointer to dynamically-allocated string accepting the data.

    DESCRIPTION

    The function retrieves a string previously stored in the chain by function CChain::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd. If sudd was not set to NULL, it will be deallocated first. The string is allocated within the function, and it is responsibility of the application to eventually deallocate it.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the chain. sudd returns NULL.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the chain. sudd returns NULL.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in chains. sudd does not change.


    int CChain::GetUDData ( 
    int  UDDhandle, 
    pstr sudd,
    int maxlen )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the chain, fixed-size buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    A pointer to a string accepting the data.

    int maxlen
    A maximal number of characters, including the terminating NULL that sudd may to accept (not more than the physical length of sudd).

    DESCRIPTION

    The function retrieves a string previously stored in the chain by function CChain::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd, with no more than maxlen symbols, including the terminating NULL returned. The string sudd is not allocated or deallocated within the function.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the chain. sudd returns empty string "".
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the chain. sudd returns empty string "".
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in chains. sudd does not change.


    void CChain::Copy ( 
    PCChain  chain )
    PURPOSE
    Copying the chain contents.
    ARGUMENTS
    PCChain chain
    The source chain, whose contents is to be copied.

    DESCRIPTION

    The function copies the content of chain chain into internal class' fields. The function does copy all the chain's table of residues and it does redefine the residues' chain for the destination one. As a result, a new chain is created that is identical to the source one, but physically they do not overlap.

    NOTE : An application should never copy contents of classes by direct assignment; in most cases this will result in crash because of inducing a mess in cross-references. See the following example:

          PCChain chain1,chain2;
          chain1 = new CChain();
          chain2 = new CResidue();
          // doing something with chain2
          
          *chain1 = *chain2;  // never do this!
          
          // the right way:
          chain1->Copy ( chain2 );
        
    Function Copy is supplied for all classes in the Library.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_residue.html0000644000175100017510000030514107505600235015642 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Data class CResidue.

    Data class CResidue represents a residue in the coordinate hierarchy.

    CResidue contains all information, which is relevant to particular residue, and reference to chain that contains the residue. It also contains table of pointers on all atoms (represented as classes of type CAtom) that belong to the residue.

    Public Data Fields


    Function Purpose
    CResidue::CResidue Default constructor.
    CResidue::~CResidue The class' destructor.
    CResidue::GetModelNum Obtaining number of model containing the residue.
    CResidue::GetChainID Obtaining identifier of chain containing the residue.
    CResidue::GetResName Obtaining the residue name.
    CResidue::SetResName Setting the residue name.
    CResidue::GetSeqNum Obtaining the residue sequence number.
    CResidue::GetInsCode Obtaining the residue insertion code.
    CResidue::GetChain Obtaining pointer on chain containing the residue.
    CResidue::GetModel Obtaining pointer on model containing the residue.
    CResidue::isInSelection Checking if residue is selected.
    CResidue::GetResidueID Obtaining a full residue's coordinate ID.
    CResidue::CheckID Checking the residue's ID by sequence number, insertion code and residue name.
    CResidue::CheckIDS Checking the residue's ID by coordinate ID.
    CResidue::GetNumberOfAtoms Calculating the number of atoms in the residue.
    CResidue::GetNumberOfAtoms Obtaining the number of atoms in residue.
    CResidue::GetAtom Obtaining an atom pointer by atom name, element name, and alternative location indicator.
    CResidue::GetAtom Obtaining an atom pointer by atom number.
    CResidue::GetAtomTable Obtaining the residue's table of atoms.
    CResidue::DeleteAtom Deleting an atom by atom name, element name, and alternative location indicator.
    CResidue::DeleteAtom Deleting an atom by atom number.
    CResidue::DeleteAllAtoms Deleting all atoms in the residue.
    CResidue::AddAtom Adding an atom to the residue.
    CResidue::GetAtomStatistics Calculating the averaged properties of atoms in the residue.
    CResidue::ApplyTransform Applying a transformation matrix to coordinates of all atoms in the residue.
    CResidue::isAminoacid Checking if the residue represents an aminoacid.
    CResidue::isNucleotide Checking if the residue represents a nucleotide.
    CResidue::isSugar Checking if the residue represents a sugar molecule.
    CResidue::isSolvent Checking if the residue represents a solvent molecules.
    CResidue::isModRes Checking if the residue represents a modified standard residue.
    CResidue::PutUDData Storing an integer User-Defined Data (UDD) in the residue.
    CResidue::PutUDData Storing a real-type User-Defined Data (UDD) in the residue.
    CResidue::PutUDData Storing a string-type User-Defined Data (UDD) in the residue.
    CResidue::GetUDData Retrieving an integer User-Defined Data (UDD) from the residue.
    CResidue::GetUDData Retrieving a real-type User-Defined Data (UDD) from the residue.
    CResidue::GetUDData Retrieving a string-type User-Defined Data (UDD) from the residue, dynamic buffer.
    CResidue::GetUDData Retrieving a string-type User-Defined Data (UDD) from the residue, fixed-size buffer.
    CResidue::Copy Copying the residue contents.


    PUBLIC DATA FIELDS

    It is a good practice for any application not to modify the public fields directly if there are class' functions for doing that. Even better, avoid also direct reading them if the class provides functions for that, as the fields may be made protected in the future.

    Type Field Ok to
    Modify*
    Description
    ResName name N/R,R The residue's (3-letter) name, represented as a null-terminated string. The field is left-aligned, all spaces are cut.
    int seqNum N/R,R The residue's sequence number.
    InsCode insCode N/R,R The residue's insertion code, represented as a null-terminated string. The field is left-aligned, all spaces are cut. For a residue without insertion code, insCode is set to empty string "".
    PCChain chain N Pointer on chain (class CChain) containing the residue. If this pointer is NULL, it indicates a serious problem in the coordinate hierarchy, not yet a crash.
    int index N Index (position) of the residue in the parential chain's table of residues. The index ranges as 0.. on.
    *N: modification of the field by application may cause malfunction or crash;
    Y: the field may be modified by application;
    R: reading function is available;
    Y/H: the field may be modified by application however there are conditions;
    N/R: modification of the field is generally harmless but not recommended.


     CResidue::CResidue ( 
     )
    PURPOSE
    Default constructor.
    DESCRIPTION

    Default constructor creates an empty CResidue object.


     CResidue::~CResidue ( 
     )
    PURPOSE
    The class' destructor.
    DESCRIPTION

    The destructor is called implicitely whenever the class instance is deleted. It deletes all atoms containing in the residue and the residue itself. If the residue is properly associated with the coordinate hierarchy, the destructor removes all references on the residue and its atoms from the hierarchy.

    NOTE : Deleting a residue is an editing operation. If it is done by application explicitely, like in the following example:

        PCMMDBManager MMDB;
        PCResidue     res;
          res = MMDB->GetResidue ( "/1/A/33(SER).A" );
          delete res;  // this is where the destructor is called!
        
    then the application must call CMMDBManager::FinishStructEdit function before using any results of such deletion(s).

    If the deletion is done implicitely by a Library function in the course of other action(s), there is no need for application to call CMMDBManager::FinishStructEdit after that.


    int CResidue::GetModelNum ( 
     )
    PURPOSE
    Obtaining number of model containing the residue.
    DESCRIPTION

    The function returns number of model that contains the residue. Models are numbered 1.. on. If residue is not properly associated with coordinate hierarchy, the function returns 0.


    pstr CResidue::GetChainID ( 
     )
    PURPOSE
    Obtaining identifier of chain containing the residue.
    DESCRIPTION

    The function returns identifier of chain that contains the residue. If the chain does not have an ID, the function returns empty string "". If residue is not properly associated with coordinate hierarchy, the function returns NULL.


    pstr CResidue::GetResName ( 
     )
    PURPOSE
    Obtaining the residue name.
    DESCRIPTION

    The function returns the residue name.


    pstr CResidue::SetResName ( 
    ResName  resName )
    PURPOSE
    Setting the residue name.
    ARGUMENTS
    ResName resName
    New residue name.

    DESCRIPTION

    The function sets new residue name, i.e. renames the residue.


    int CResidue::GetSeqNum ( 
     )
    PURPOSE
    Obtaining the residue sequence number.
    DESCRIPTION

    The function returns the residue sequence number.


    pstr CResidue::GetInsCode ( 
     )
    PURPOSE
    Obtaining the residue insertion code.
    DESCRIPTION

    The function returns the residue insertion code. If the residue does not have insertion code, the function returns empty string "".


    PCChain CResidue::GetChain ( 
     )
    PURPOSE
    Obtaining pointer on chain containing the residue.
    DESCRIPTION

    The function returns pointer on chain that contains the residue. If residue is not properly associated with coordinate hierarchy, the function returns NULL.


    PCModel CResidue::GetModel ( 
     )
    PURPOSE
    Obtaining pointer on model containing the residue.
    DESCRIPTION

    The function returns pointer on model that contains the residue. If residue is not properly associated with coordinate hierarchy, the function returns NULL.


    Boolean CResidue::isInSelection ( 
    int  selHnd )
    PURPOSE
    Checking if residue is selected.
    ARGUMENTS
    int selHnd
    Selection handle.

    DESCRIPTION

    The function returns True if residue is selected for the specified selection handle, and False otherwise.

    NOTE : The function returns False if residue is not properly associated with coordinate hierarchy.


    pstr CResidue::GetResidueID ( 
    pstr  ResidueID )
    PURPOSE
    Obtaining a full residue's coordinate ID.
    ARGUMENTS
    pstr ResidueID
    A string to accept the residue's coordinate ID.

    DESCRIPTION

    The function calculates a coordinate ID of the residue and returns it in the supplied string. The same string is returned as the function value.

    If residue is not properly associated with coordinate hierarchy, the coordinate ID will contain dashes "-" for those elements that could not be identified.

    NOTE : The function does not make any checks on the sufficiency of string buffer ResidueID to accept the information.


    int CResidue::CheckID ( 
    int *  sNum, 
    InsCode inscode,
    ResName resname )
    PURPOSE
    Checking the residue's ID by sequence number, insertion code and residue name.
    ARGUMENTS
    int * sNum
    Pointer on sequence number. If sNum is set to NULL then this parameter is ignored.

    InsCode inscode
    The insertion code, represented as a null-terminated string without spaces. For a residue without insertion code, inscode should be set to empty string "" (default). inscode may be set to NULL or to wildcard "*", then this parameter is ignored.

    ResName resname
    The residue's name (3-letter code). resname may be set to NULL (default) or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function returns 1 if the residue is identified by given sequence number, insertion code and residue name, and 0 otherwise.

    The residue is considered as identified, if all non-NULL, non-wildcard parameters do match. If all parameters are set NULL or wildcard, any residue is identified. Default values for inscode and resname correspond to 'no insertion code' and 'any residue name'.

    NOTE 1: The model serial number and chain ID are not taken into account by this function.

    NOTE 2: Comparison is case-sensitive. Consider that " " is not an empty string.


    int CResidue::CheckIDS ( 
    pstr  CID )
    PURPOSE
    Checking the residue's ID by coordinate ID.
    ARGUMENTS
    pstr CID
    The residue's coordinate ID. Only the part of coordinate ID containing the sequence number, insertion code and residue name is taken into consideration.

    DESCRIPTION

    The function returns 1 if the residue is identified by residue sequence number, insertion code ans residue name found in the provided coordinate ID, and 0 otherwise.

    The residue is considered as identified, if all identifying items in the provided coordinate ID do match those of residue. If all coordinate ID items are set to wildcards "*", any residue is identified.

    NOTE 1: The model serial number and chain ID, as well as any atom-related information in the coordinate ID are not taken into account by this function.

    NOTE 2: Comparison is case-sensitive. Any spaces in the coordinate ID are ignored.


    int CResidue::GetNumberOfAtoms ( 
    Boolean  countTers )
    PURPOSE
    Calculating the number of atoms in the residue.
    ARGUMENTS
    Boolean countTers
    Flag specifying if any termination records ("TER") should be counted as atoms. In MMDB, the termination records are kept as a special case of CAtom objects. If countTers is set to True, the termination records will be counted as atoms, otherwise they are ignored.

    DESCRIPTION

    The function performs an actual calculation of all atoms in the residue, not just returning the length of atom tables. If some cells in the atom table are empty (set to NULL), they are not counted.


    int CResidue::GetNumberOfAtoms ( 
     )
    PURPOSE
    Obtaining the number of atoms in residue.
    DESCRIPTION

    The function returns the number of atoms currently contained in the residue.

    NOTE : The function actually returns the length of atom table of the residue. In the course of editing operations, the table may contain empty cells, which will be counted as atoms. Besides, a residue may contain a termination record ("TER"), which is kept in MMDB as a special case of CAtom object; the function will count such an object as atom.


    PCAtom CResidue::GetAtom ( 
    AtomName  aname, 
    Element elname,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by atom name, element name, and alternative location indicator.
    ARGUMENTS
    AtomName aname
    The atom name. It may or may not be aligned (as in a PDB file), only first word of the name will be considered (thus "CA", " CA" and " CA B" are all considered as "CA"). aname may be set to NULL or to wildcard "*", then this parameter is ignored.

    Element elname
    The atom's chemical element code. This parameter will work only if the element code was set up for the atom (which may take place in the case of reading atoms from old PDB files that do not contain the chemical element names; or if the atom was created in a tricky way by application). elname should be used to distinguish between, e.g. "Ca" and "C_alpha". All spaces in elname are ignored. elname may be set to NULL (default), or to wildcard "*", then this parameter is ignored.

    AltLoc aloc
    The atom's alternative location indicator. If atom does not have alternative location, this is indicated by empty string ""(default). aloc may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name and alternative location indicator. If any of these characteristics is invalid or if such an atom does not exist in residue, the function returns NULL.

    The atom is considered as identified, if all non-NULL, non-wildcard parameters do match. If the specified parameters allow for identification of more than one atom in the residue, the first one from the begining of the residue's table of atoms is taken. Thus, if all parameters are set NULL or wildcard, pointer on the very first atom in the residue's table of atoms is returned. Default values for elname and aloc correspond to 'any element' and 'no alternative location indicator'.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    PCAtom CResidue::GetAtom ( 
    int  atomNo )
    PURPOSE
    Obtaining an atom pointer by atom number.
    ARGUMENTS
    int atomNo
    The atom number, that is the atom's position in the residue's table of atoms. The atoms in the table are numbered as 0..NumberOfAtoms-1 where NumberOfAtoms is returned by CResidue::GetNumberOfAtoms.

    DESCRIPTION

    The function returns pointer on the atomNoth atom in the residue's table of atoms. If atomNo is invalid or if such an atom does not exist in residue, the function returns NULL.


    void CResidue::GetAtomTable ( 
    PPCAtom &  atomTable, 
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the residue's table of atoms.
    ARGUMENTS
    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If there is no atoms in the residue, the function returns NULL for atomTable and 0 for NumberOfAtoms.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the table of atoms. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of atoms.


    int CResidue::DeleteAtom ( 
    AtomName  aname, 
    Element elname,
    AltLoc aloc )
    PURPOSE
    Deleting an atom by atom name, element name, and alternative location indicator.
    ARGUMENTS
    AtomName aname
    The atom name. It may or may not be aligned (as in a PDB file), only first word of the name will be considered (thus "CA", " CA" and " CA B" are all considered as "CA"). aname may be set to NULL or to wildcard "*", then this parameter is ignored.

    Element elname
    The atom's chemical element code. This parameter will work only if the element code was set up for the atom (which may take place in the case of reading atoms from old PDB files that do not contain the chemical element names; or if the atom was created in a tricky way by application). elname should be used to distinguish between, e.g. "Ca" and "C_alpha". All spaces in elname are ignored. elname may be set to NULL (default), or to wildcard "*", then this parameter is ignored.

    AltLoc aloc
    The atom's alternative location indicator. If atom does not have alternative location, this is indicated by empty string ""(default). aloc may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function deletes all atoms in the residue that answer to the provided atom name, chemical element name and alternative location indicator. An atom is considered as answering the conditions if all non-NULL, non-wildcard parameters do match. Thus, if all parameters are set NULL or wildcard, all atoms in the residue are deleted. Default values for elname and aloc correspond to 'any element' and 'no alternative location indicator'.


    RETURN

    The function returns the number of deleted atoms.

    NOTE 1: Comparison is case-sensitive. Consider that " " is not an empty string.

    NOTE 2: Deleted atoms are completely disposed and are not retrievable.

    NOTE 3: The application must call CMMDBManager::FinishStructEdit function after a set of editing operations is complete, before using the results of the editing.


    int CResidue::DeleteAtom ( 
    int  atomNo )
    PURPOSE
    Deleting an atom by atom number.
    ARGUMENTS
    int atomNo
    The atom number, that is the atom's position in the residue's table of atoms. The atoms in the table are numbered as 0..NumberOfAtoms-1 where NumberOfAtoms is returned by CResidue::GetNumberOfAtoms.

    DESCRIPTION

    The function deletes the atomNoth atom as found in the residue's table of atoms. If atomNo is invalid or if such an atom does not exist in residue, the function does nothing.


    RETURN

    The function returns the number of deleted atoms, that is 1 or 0.

    NOTE 1: Deleted atoms are completely disposed and are not retrievable.

    NOTE 2: The application must call CMMDBManager::FinishStructEdit function after a set of editing operations is complete, before using the results of the editing.


    int CResidue::DeleteAllAtoms ( 
     )
    PURPOSE
    Deleting all atoms in the residue.
    DESCRIPTION

    The function deletes all atoms in the residue, leaving the residue empty.


    RETURN

    The function returns the number of actually deleted atoms.

    NOTE 1: Deleted atoms are completely disposed and are not retrievable.

    NOTE 2: The application must call CMMDBManager::FinishStructEdit function after a set of editing operations is complete, before using the results of the editing.

    NOTE 3: The function does not dispose the residue; neither does it delete it from a chain.


    int CResidue::AddAtom ( 
    PCAtom  atom )
    PURPOSE
    Adding an atom to the residue.
    ARGUMENTS
    PCAtom atom
    The atom that should be added to the residue.

    DESCRIPTION

    The function adds atom atom to the residue, placing it on the top of the residue's table of atoms. The atom and the residue may be or may be not associated with a coordinate hierarchy.

    If atom atom is not associated with a coordinate hierarchy, it is taken over by the residue, which means that its pointer is saved in the residue's table of atoms. If atom atom already belongs to a coordinate hierarchy (even though that of the residue), the residue adopts its (automatically created) copy, thus the atom is not removed from its own coordinate hierarchy.

    If residue is associated with a coordinate hierarchy, the newly added atom is automatically associated with it. Otherwise, the atom is checked in the hierarchy once the residue is checked in (see example below).


    RETURN

    Upon success, the function returns the number of atoms in the residue, which should be a positive integer greater than 0. A negative or zero return means that the atom is already in the residue, found at position equal to minus return.

    NOTE 1: Note the difference between adding atoms associated and not associated with a coordinate hierarchy as described above.

    NOTE 2: Calling CMMDBManager::FinishStructEdit function is not necessary after adding atoms. However, it is advisable to call CMMDBManager::PDBCleanup with input flags PDBCLEAN_SERIAL and PDBCLEAN_INDEX after adding all atoms (don't call CMMDBManager::PDBCleanup after every addition of an atom). PDBCLEAN_SERIAL will put atoms' serial numbers in due order, and "cleaning" on PDBCLEAN_INDEX is needed for the internal consistency of data.


    EXAMPLE

    Create a chain containing one residue having a few atoms, and add it to model 1 of a coordinate hierarchy:

    CMMDBManager MMDB;
    PCModel      model;
    PCChain      chain;
    PCResidue    res;
    PCAtom       atom;
    int          RC;
    
      // ... read data into MMDB
      RC = MMDB.ReadCoorFile ( filename );
      // ... check for errors -- see details for 
      // CMMDBManager::ReadCoorFile(..)
      if (RC)  {
        printf ( " errors.\n" );
        exit(0);
      }
    
      // ... create a new residue
      res = new CResidue();     // the residue IS NOT associated
                                // with MMDB
    
      // ... stuff it with atoms now:
    
      atom = new CAtom();       // the atom IS NOT associated with
                                // a residue or MMDB
      // ... set atom characteristics:
      atom->SetAtomName    ( " CA " );  // it has to be a PDB name!
      atom->SetElementName ( "C"    );
      atom->SetCoordinates ( x,y,z,occupancy,tFactor );
      // ... add atom to the residue:
      RC = res->AddAtom ( atom );
      if (RC<=0)  {
        // this may happen only if you try to add the same atom twice.
        printf ( " error adding atom.\n" );
        exit(0);
      }
    
      // ... a slightly different way of doing the same:
      atom = new CAtom ( res ); // the atom IS ALREADY associated with
                                // and added to the residue, but it
                                // IS NOT associated with MMDB
                                // NOTE: this way assures that the atom
                                // is added to the residue, because
                                // it was freshly allocated -- no other
                                // atom with the same pointer may exist.
      // ... we still need to set the atom's characteristics:
      atom->SetAtomName    ( " CB " );  // it has to be a PDB name!
      atom->SetElementName ( "C"    );
      atom->SetCoordinates ( x,y,z,occupancy,tFactor );
    
      // ... add other atoms as necessary ...
    
      // ... create a new chain
      chain = new CChain();       // the chain IS NOT associated with MMDB
      chain->SetChainID ( "X" );  // new chain ID
      // ... and add residue to it
      chain->AddResidue ( res );
    
      // ... now add the chain to the model 1 of MMDB:
      model = MMDB.GetModel ( 1 );
      if (!model)  {
        // MMDB was empty. We have to create a new model:
        model = new CModel();
        MMDB.AddModel ( model ); // add empty model on the top of MMDB
      }
      model->AddChain ( chain ); // at this point, the chain is associated with
                                 // and added to MMDB, all its residues and
                                 // atoms get associated automatically
    
      // The following call is more of a "gentleman" nature now,
      // but it may be an absolute must for compliency with later
      // versions of MMDB. You are strongly advised to call at least
      // PDBCleanup(PDBCLEAN_INDEX) after adding or inserting
      // atoms/residues/chains/models into MMDB. However don't make
      // this call after every insertion/addition for the sake of
      // computational efficiency. Do this call once as you finished
      // building the structure and are going to proceed further.
      MMDB.PDBCleanup ( PDBCLEAN_SERIAL | PDBCLEAN_INDEX );
    
    


    void CResidue::GetAtomStatistics ( 
    RSAtomStat  AS )
    PURPOSE
    Calculating the averaged properties of atoms in the residue.
    ARGUMENTS
    RSAtomStat AS
    Reference to structure SAtomStat, which returns the average results. The structure has the following fields:

    Type Field(s)   Description
    int nAtoms   Number of averaged atoms
    realtype xmin,ymin,zmin   Minimum X,Y,Z-coordinates
    realtype xmax,ymax,zmax   Maximum X,Y,Z-coordinates
    realtype xm,ym,zm   Average X,Y,Z-coordinates
    realtype xm2,ym2,zm2   Square average X,Y,Z-coordinates
    realtype occ_min,occ_max   Minimum and maximum occupancies
    realtype occ_m,occ_m2   Average and square average occupancies
    realtype tFmin,tFmax   Minimum and maximum isotropic temperature factors
    realtype tFm,tFm2   Average and square average isotropic temperature factors
    realtype u11_min,u22_min,
    u33_min,u12_min,
    u13_min,u23_min
      Minimum anisotropic temperature factors
    realtype u11_max,u22_max,
    u33_max,u12_max,
    u13_max,u23_max
      Maximum anisotropic temperature factors
    realtype u11_m,u22_m,
    u33_m,u12_m,
    u13_m,u23_m
      Average anisotropic temperature factors
    realtype u11_m2,u22_m2,
    u33_m2,u12_m2,
    u13_m2,u23_m2
      Square average anisotropic temperature factors
    word WhatIsSet   A word of bit flags, indicating which from the above fields have meaningful values. This field is identical to the WhatIsSet field of CAtom class. If any atom from the average does not have a particular attribute, the corresponding bit in WhatIsSet will be cleared and the averages for that attribute are not calculated.


    DESCRIPTION

    The function performs an actual calculation of averaged atom properties, none of them are stored as variables. It is therefore advised to avoid unnecessary calls to this function.


    void CResidue::ApplyTransform ( 
    mat44 &  TMatrix )
    PURPOSE
    Applying a transformation matrix to coordinates of all atoms in the residue.
    ARGUMENTS
    mat44 & TMatrix
    The transformation matrix.

    DESCRIPTION

    The function applies the rotational-translational transformation given by matrix TMatrix, to coordinates of all atoms in the residue.

    The transformation matrix TMatrix contains rotational part in columns 0,1,2, rows 0,1,2 (stands for x,y,z) and translational part in column 3, rows 0,1,2.


    Boolean CResidue::isAminoacid ( 
     )
    PURPOSE
    Checking if the residue represents an aminoacid.
    DESCRIPTION

    The function returns True if the residue represents an aminoacid.


    Boolean CResidue::isNucleotide ( 
     )
    PURPOSE
    Checking if the residue represents a nucleotide.
    DESCRIPTION

    The function returns True if the residue represents a nucleotide.


    Boolean CResidue::isSugar ( 
     )
    PURPOSE
    Checking if the residue represents a sugar molecule.
    DESCRIPTION

    The function returns True if the residue represents a sugar molecule.


    Boolean CResidue::isSolvent ( 
     )
    PURPOSE
    Checking if the residue represents a solvent molecules.
    DESCRIPTION

    The function returns True if the residue represents a solvent molecule.


    Boolean CResidue::isModRes ( 
     )
    PURPOSE
    Checking if the residue represents a modified standard residue.
    DESCRIPTION

    The function returns True if the residue represents a modified standard residue.


    int CResidue::PutUDData ( 
    int  UDDhandle, 
    int iudd )
    PURPOSE
    Storing an integer User-Defined Data (UDD) in the residue.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int iudd
    The integer number to be stored in the residue.

    DESCRIPTION

    The function stores an integer contained in iudd in the residue, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully stored
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the residue, the data was not stored
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in residues, the data was not stored


    int CResidue::PutUDData ( 
    int  UDDhandle, 
    realtype rudd )
    PURPOSE
    Storing a real-type User-Defined Data (UDD) in the residue.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    realtype rudd
    The real number to be stored in the residue.

    DESCRIPTION

    The function stores the real number contained in rudd in the residue, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CResidue::PutUDData, see returns there.


    int CResidue::PutUDData ( 
    int  UDDhandle, 
    pstr sudd )
    PURPOSE
    Storing a string-type User-Defined Data (UDD) in the residue.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    The string to be stored in the residue.

    DESCRIPTION

    The function stores the string pointed by sudd in the residue, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CResidue::PutUDData, see returns there.


    int CResidue::GetUDData ( 
    int  UDDhandle, 
    int & iudd )
    PURPOSE
    Retrieving an integer User-Defined Data (UDD) from the residue.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int & iudd
    The buffer to accept the integer data.

    DESCRIPTION

    The function retrieves an integer previously stored in the residue by function CResidue::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in iudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the residue. iudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the residue. iudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in residues. iudd does not change.


    int CResidue::GetUDData ( 
    int  UDDhandle, 
    real & rudd )
    PURPOSE
    Retrieving a real-type User-Defined Data (UDD) from the residue.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    real & rudd
    The buffer to accept the real-type data.

    DESCRIPTION

    The function retrieves a real number previously stored in the residue by function CResidue::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in rudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the residue. rudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the residue. rudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in residues. rudd does not change.


    int CResidue::GetUDData ( 
    int  UDDhandle, 
    pstr & sudd )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the residue, dynamic buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr & sudd
    A pointer to dynamically-allocated string accepting the data.

    DESCRIPTION

    The function retrieves a string previously stored in the residue by function CResidue::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd. If sudd was not set to NULL, it will be deallocated first. The string is allocated within the function, and it is responsibility of the application to eventually deallocate it.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the residue. sudd returns NULL.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the residue. sudd returns NULL.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in residues. sudd does not change.


    int CResidue::GetUDData ( 
    int  UDDhandle, 
    pstr sudd,
    int maxlen )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the residue, fixed-size buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    A pointer to a string accepting the data.

    int maxlen
    A maximal number of characters, including the terminating NULL that sudd may to accept (not more than the physical length of sudd).

    DESCRIPTION

    The function retrieves a string previously stored in the residue by function CResidue::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd, with no more than maxlen symbols, including the terminating NULL returned. The string sudd is not allocated or deallocated within the function.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the residue. sudd returns empty string "".
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the residue. sudd returns empty string "".
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in residues. sudd does not change.


    void CResidue::Copy ( 
    PCResidue  residue )
    PURPOSE
    Copying the residue contents.
    ARGUMENTS
    PCResidue residue
    The source residue, whose contents is to be copied.

    DESCRIPTION

    The function copies the content of residue residue into internal class' fields. The function does copy all the table of residue's atoms and it does redefine the atoms' residue for the destination one. As a result, a new residue is created that is identical to the source one, but physically they do not overlap.

    NOTE : An application should never copy contents of classes by direct assignment; in most cases this will result in crash because of inducing a mess in cross-references. See the following example:

          PCResidue res1,res2;
          res1 = new CResidue();
          res2 = new CResidue();
          // doing something with res2
          
          *res1 = *res2;  // never do this!
          
          // the right way:
          res1->Copy ( res2 );
        
    Function Copy is supplied for all classes in the Library.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_model.html0000644000175100017510000061327707506037416015324 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Data class CModel.

    Data class CModel represents a model in the coordinate hierarchy.

    CModel contains all information, which is relevant to particular model and table of pointers on all chains (represented as classes of type CChain) that belong to the model.

    Function Purpose
    CModel::CModel Default constructor.
    CModel::~CModel The class' destructor.
    CModel::isInSelection Checking if model is selected.
    CModel::GetSerNum Obtaining the model's serial number.
    CModel::GetModelID Obtaining the model's coordinate ID.
    CModel::SetEntryID Setting the entry ID.
    CModel::GetEntryID Obtaining the entry ID.
    CModel::GetNumberOfChains Obtaining the number of chains in the model.
    CModel::GetChain Obtaining a chain pointer by chain ID.
    CModel::GetChain Obtaining a chain pointer by chain number.
    CModel::GetChainTable Obtaining the model's table of chains.
    CModel::AddChain Adding a chain to the model.
    CModel::DeleteAtom Deleting an atom specified by chain ID, sequence number, insertion code and atom name.
    CModel::DeleteAtom Deleting an atom specified by chain ID, sequence number, insertion code and atom number.
    CModel::DeleteAtom Deleting an atom specified by chain ID, residue number and atom name.
    CModel::DeleteAtom Deleting an atom specified by chain ID, residue number and atom number.
    CModel::DeleteAtom Deleting an atom specified by chain number, sequence number, insertion code and atom name.
    CModel::DeleteAtom Deleting an atom specified by chain number, sequence number, insertion code and atom number.
    CModel::DeleteAtom Deleting an atom specified by chain number, residue number and atom name.
    CModel::DeleteAtom Obtaining an atom pointer by chain number, residue number and atom number.
    CModel::DeleteAllAtoms Deleting all atoms in the residue specified by chain ID, sequence number and insertion code.
    CModel::DeleteAllAtoms Deleting all atoms in the residue specified by chain ID and residue position in the chain.
    CModel::DeleteAllAtoms Deleting all atoms in the model's chain specified by chain ID.
    CModel::DeleteAllAtoms Deleting all atoms in the residue specified by chain number, sequence number and insertion code.
    CModel::DeleteAllAtoms Deleting all atoms in the residue specified by chain number and residue position in the chain.
    CModel::DeleteAllAtoms Deleting all atoms in the model's chain specified by chain number.
    Cmodel::DeleteAllAtoms Deleting all atoms in the model.
    CModel::DeleteChain Deleting a chain by chain ID.
    CModel::DeleteChain Deleting a chain by chain number.
    CModel::DeleteSolventChains Deleting all solvent chains from the model.
    CModel::GetNumberOfResidues Obtaining the total number of residues in model.
    CModel::GetNumberOfResidues Obtaining the number of residues in a chain by chain ID.
    CModel::GetNumberOfResidues Obtaining the number of residues in a chain by chain number.
    CModel::GetResidue Obtaining a residue pointer by chain ID, sequence number and insertion code.
    CModel::GetResidue Obtaining a residue pointer by chain number, sequence number and insertion code.
    CModel::GetResidue Obtaining a residue pointer by chain ID and residue number.
    CModel::GetResidue Obtaining a residue pointer by chain number and residue number.
    CModel::GetResidueNo Obtaining a residue position in chain by chain ID, residue sequence number and insertion code.
    CModel::GetResidueNo Obtaining a residue position in chain by chain number, residue sequence number and insertion code.
    CModel::GetResidueTable Obtaining the residue table by chain ID.
    CModel::GetResidueTable Obtaining the residue table by chain number.
    CModel::GetNumberOfAtoms Calculating the total number of atoms in the model.
    CModel::GetNumberOfAtoms Obtaining the number of atoms in a residue by chain ID, sequence number and insertion code.
    CModel::GetNumberOfAtoms Obtaining the number of atoms in a residue by chain number, sequence number and insertion code.
    CModel::GetNumberOfAtoms Obtaining the number of atoms in a residue by chain ID and residue number.
    CModel::GetNumberOfAtoms Obtaining the number of atoms in a residue by chain number and residue number.
    CModel::GetAtom Obtaining an atom pointer by chain ID, sequence number, insertion code and atom name.
    CModel::GetAtom Obtaining an atom pointer by chain ID, sequence number, insertion code and atom number.
    CModel::GetAtom Obtaining an atom pointer by chain ID, residue number and atom name.
    CModel::GetAtom Obtaining an atom pointer by chain ID, residue number and atom number.
    CModel::GetAtom Obtaining an atom pointer by chain number, sequence number, insertion code and atom name.
    CModel::GetAtom Obtaining an atom pointer by chain number, sequence number, insertion code and atom number.
    CModel::GetAtom Obtaining an atom pointer by chain number, residue number and atom name.
    CModel::GetAtom Obtaining an atom pointer by chain number, residue number and atom number.
    CModel::GetAtomTable Obtaining the residue's table of atoms by chain ID, sequence number and insertion code.
    CModel::GetAtomTable Obtaining the residue's table of atoms by chain ID and residue number.
    CModel::GetAtomTable Obtaining the residue's table of atoms by chain number, sequence number and insertion code.
    CModel::GetAtomTable Obtaining the residue's table of atoms by chain number and residue number.
    CModel::AddAtom Adding an atom to the residue of the model specified by chain ID, sequence number and insertion code.
    CModel::AddAtom Adding an atom to the residue of the model specified by chain number, sequence number and insertion code.
    CModel::AddAtom Adding an atom to the residue of the model specified by chain ID and residue number.
    CModel::AddAtom Adding an atom to the residue of the model specified by chain number and residue number.
    CModel::GetNumberOfHelices Obtaining the number of helices in the model.
    CModel::GetHelix Obtaining pointer on helix by helix number.
    CModel::GetNumberOfSheets Obtaining the number of sheets in the model.
    CModel::GetSheetID Obtaining the sheet ID by sheet serial number.
    CModel::GetSheet Obtaining the sheet by sheet serial number.
    CModel::GetSheet Obtaining the sheet by sheet ID.
    CModel::GetNumberOfStrands Obtaining the number of strands in a sheet by sheet number.
    CModel::GetNumberOfStrands Obtaining the number of strands in a sheet by sheet ID.
    CModel::GetStrand Obtaining the number of strands in a sheet by sheet ID.
    CModel::GetStrand Obtaining the number of strands in a sheet by sheet serial number.
    CModel::RemoveSecStructure Removing the annotation of secondary structure from the model.
    CModel::ApplyTransform Applying a transformation matrix to coordinates of all atoms in the model.
    CModel::GetAtomStatistics Calculating the averaged properties of all atoms in the model.
    CModel::PutUDData Storing an integer User-Defined Data (UDD) in the model.
    CModel::PutUDData Storing a real-type User-Defined Data (UDD) in the model.
    CModel::PutUDData Storing a string-type User-Defined Data (UDD) in the model.
    CModel::GetUDData Retrieving an integer User-Defined Data (UDD) from the model.
    CModel::GetUDData Retrieving a real-type User-Defined Data (UDD) from the model.
    CModel::GetUDData Retrieving a string-type User-Defined Data (UDD) from the model, dynamic buffer.
    CModel::GetUDData Retrieving a string-type User-Defined Data (UDD) from the model, fixed-size buffer.
    CModel::Copy Copying the model contents.


     CModel::CModel ( 
     )
    PURPOSE
    Default constructor.
    DESCRIPTION

    Default constructor creates an empty CModel object.


     CModel::~CModel ( 
     )
    PURPOSE
    The class' destructor.
    DESCRIPTION

    The destructor is called implicitely whenever the class instance is deleted. It deletes all atoms, residues and chains containing in the model and the model itself. If the model is properly associated with the coordinate hierarchy, the destructor removes all references on the mode, its chains, residues and atoms, from the hierarchy.

    NOTE : Deleting a model is an editing operation. If it is done by application explicitely, like in the following example:

        PCMMDBManager MMDB;
        PCModel       model;
          model = MMDB->GetModel ( "/1" );
          delete model;  // this is where the destructor is called!
        
    then the application must call CMMDBManager::FinishStructEdit function before using any results of such deletion(s).

    If the deletion is done implicitely by a Library function in the course of other action(s), there is no need for application to call CMMDBManager::FinishStructEdit after that.


    Boolean CModel::isInSelection ( 
    int  selHnd )
    PURPOSE
    Checking if model is selected.
    ARGUMENTS
    int selHnd
    Selection handle.

    DESCRIPTION

    The function returns True if model is selected for the specified selection handle, and False otherwise.

    NOTE : The function returns False if model is not properly associated with coordinate hierarchy.


    int CModel::GetSerNum ( 
     )
    PURPOSE
    Obtaining the model's serial number.
    DESCRIPTION

    The function returns number of the model. Models are numbered 1.. on. If chain is not properly associated with coordinate hierarchy, the function returns 0.


    pstr CModel::GetModelID ( 
    pstr  CID )
    PURPOSE
    Obtaining the model's coordinate ID.
    ARGUMENTS
    pstr CID
    A string to accept the model's coordinate ID.

    DESCRIPTION

    The function calculates a coordinate ID of the model and returns it in the supplied string. The same string is returned as the function value.

    NOTE : The function does not make any checks on the sufficiency of string buffer CID to accept the information.


    void CModel::SetEntryID ( 
    IDCode  idCode )
    PURPOSE
    Setting the entry ID.
    ARGUMENTS
    IDCode idCode
    New entry ID.

    DESCRIPTION

    The function sets the new entry ID, that is normally the 4-letter PDB entry code. The function will accomplish successfully only if the model is properly associated with coordinate hierarchy.


    pstr CModel::GetEntryID ( 
     )
    PURPOSE
    Obtaining the entry ID.
    DESCRIPTION

    The function returns the entry ID, that is normally the 4-letter PDB entry code. The ID is returned as a null-teminated string. If model is not properly associated with coordinate hierarchy, the function returns empty string "".


    int CModel::GetNumberOfChains ( 
     )
    PURPOSE
    Obtaining the number of chains in the model.
    DESCRIPTION

    The function returns the number of chains currently contained in the model


    PCChain CModel::GetChain ( 
    ChainID  chainID )
    PURPOSE
    Obtaining a chain pointer by chain ID.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    DESCRIPTION

    The function returns pointer on the chain identified by chain ID. If such a chain does not exist in the model, the function returns NULL.


    PCChain CModel::GetChain ( 
    int  chainNo )
    PURPOSE
    Obtaining a chain pointer by chain number.
    ARGUMENTS
    int chainNo
    The chain number.

    DESCRIPTION

    The function returns pointer on the chain that identified by its position in the table of chains in the model. The chains are numbered as 0..NumberOfChains-1, where NumberOfChains is returned by CModel::GetNumberOfChains. If the chain number is invalid or if such a chain does not exist in the model, the function returns NULL.

    The chain number is defined by the order of the chain appearance in the coordinate file. Certain sections of PDB file (e.g. the SEQRES records) may in practice mention the chains in arbitrary order, but it is the order of chains in the coordinate section that matters here.


    void CModel::GetChainTable ( 
    PPCChain &  chainTable, 
    int & NumberOfChains )
    PURPOSE
    Obtaining the model's table of chains.
    ARGUMENTS
    PPCChain & chainTable
    The table of chains.

    int & NumberOfChains
    The number of chains.

    DESCRIPTION

    The function returns table of pointers on all chains currently contained in the model, and their number. The chains are indexed as 0..NumberOfChains-1 in the table.

    NOTE 1: Certain editing operations might leave chains empty. This results in empty cells in the chain table. Therefore, it is a good practice for application to check that chainTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the chain table.


    void CModel::AddChain ( 
    PCChain  chain )
    PURPOSE
    Adding a chain to the model.
    ARGUMENTS
    PCChain chain
    The chain to be added. The chain must be associated with a coordinate hierarchy.

    DESCRIPTION

    The function adds the specified chain on the top of current chain table. No checks on the duplication of chain IDs is being made. The chain with all atoms and residues, is copied, not moved.

    Both the model and the added chain must be associated with coordinate hierarchies. If both model and chain belong to the same coordinate hierarchy, the chain will be duplicated.

    NOTE 1: The application does not have to call CMMDBManager::FinishStructEdit after return from this function, although such a call would be completely harmless.

    NOTE 2: The function does not take care about serial numbers of copied atoms. If they need to be put in order, the application should call CMMDBManager::PDBCleanup with input flag PDBCLEAN_SERIAL. Similarly, possible clashes of duplicated chain IDs can be resolved by CMMDBManager::PDBCleanup with input flag PDBCLEAN_CHAIN or PDBCLEAN_CHAIN_STRONG.


    int CModel::DeleteAtom ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Deleting an atom specified by chain ID, sequence number, insertion code and atom name.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function deletes the specified atom from the coordinate hierarchy: the atom is checked out and disposed. The function returns the number of actually deleted atoms, which may be more than one if NULL or wildcard parameters have been supplied (cf. above). A zero return indicates that either the requested chain, residue or atom in the residue were not found.

    NOTE 1: Comparison is case-sensitive. Consider that " " is not an empty string.

    NOTE 2: If deletion of an atom leaves residue or chain empty, the latter are not deleted. Empty residues and chains give no records in PDB file.


    int CModel::DeleteAtom ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode,
    int atomNo )
    PURPOSE
    Deleting an atom specified by chain ID, sequence number, insertion code and atom number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAtom, see there for details.


    int CModel::DeleteAtom ( 
    ChainID  chainID, 
    int resNo,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Deleting an atom specified by chain ID, residue number and atom name.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAtom, see there for details.


    int CModel::DeleteAtom ( 
    ChainID  chainID, 
    int resNo,
    int atomNo )
    PURPOSE
    Deleting an atom specified by chain ID, residue number and atom number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAtom, see there for details.


    int CModel::DeleteAtom ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Deleting an atom specified by chain number, sequence number, insertion code and atom name.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAtom, see there for details.


    int CModel::DeleteAtom ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode,
    int atomNo )
    PURPOSE
    Deleting an atom specified by chain number, sequence number, insertion code and atom number.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAtom, see there for details.


    int CModel::DeleteAtom ( 
    int  chainNo, 
    int resNo,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Deleting an atom specified by chain number, residue number and atom name.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAtom, see there for details.


    int CModel::DeleteAtom ( 
    int  chainNo, 
    int resNo,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by chain number, residue number and atom number.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's position in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAtom, see there for details.

    [undoc] CModel::DeleteAllAtoms ( int chNo, int seqNo, InsCode insCode ); [undoc] CModel::DeleteAllAtoms ( int chNo, int resNo ); [undoc] CModel::DeleteAllAtoms ( int chNo ); [undoc] CModel::DeleteAllAtoms ();


    int CModel::DeleteAllAtoms ( 
    ChainID  chainID, 
    int seqNo,
    InsCode insCode )
    PURPOSE
    Deleting all atoms in the residue specified by chain ID, sequence number and insertion code.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function deletes all atoms in the specified residue of the model. The function returns the number of actually deleted atoms.

    NOTE : Note that the residue is not deleted, however stays empty. Empty residue gives no records in a PDB file.


    int CModel::DeleteAllAtoms ( 
    ChainID  chainID, 
    int resNo )
    PURPOSE
    Deleting all atoms in the residue specified by chain ID and residue position in the chain.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAllAtoms except that the residue is specified by its position in the chain.


    int CModel::DeleteAllAtoms ( 
    ChainID  chainID )
    PURPOSE
    Deleting all atoms in the model's chain specified by chain ID.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    DESCRIPTION

    The function deletes all atoms in the specified chain of the model. The function returns the number of actually deleted atoms.

    NOTE : Note that the chain and residues in it are not deleted, however stay empty. Empty chain and residues give no records in a PDB file.


    int CModel::DeleteAllAtoms ( 
    int  chainNo, 
    int seqNo,
    InsCode insCode )
    PURPOSE
    Deleting all atoms in the residue specified by chain number, sequence number and insertion code.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int seqNo
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function deletes all atoms in the specified residue of the model. The function returns the number of actually deleted atoms.

    NOTE : Note that the residue is not deleted, however stays empty. Empty residue gives no records in a PDB file.


    int CModel::DeleteAllAtoms ( 
    int  chainNo, 
    int resNo )
    PURPOSE
    Deleting all atoms in the residue specified by chain number and residue position in the chain.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int resNo
    The residue number. It has nothing in common with the residue sequence number and represents the residue position in the chain's table of residues. The residue in the table are numbered as 0..NumberOfResidues-1 where NumberOfResidues is returned by CChain::GetNumberOfResidues.

    DESCRIPTION

    The function is conceptually identical to CModel::DeleteAllAtoms except that the residue is specified by its position in the chain.


    int CModel::DeleteAllAtoms ( 
    int  chainNo )
    PURPOSE
    Deleting all atoms in the model's chain specified by chain number.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    DESCRIPTION

    The function deletes all atoms in the specified chain of the model. The function returns the number of actually deleted atoms.

    NOTE : Note that the chain and residues in it are not deleted, however stay empty. Empty chain and residues give no records in a PDB file.


    int Cmodel::DeleteAllAtoms ( 
     )
    PURPOSE
    Deleting all atoms in the model.
    DESCRIPTION

    The function deletes all atoms in the model. The function returns the number of actually deleted atoms.

    NOTE : Note that the model, its chains and residues are not deleted, however stay empty. Empty model gives no coordinate records in a PDB file.


    int CModel::DeleteChain ( 
    ChainID  chainID )
    PURPOSE
    Deleting a chain by chain ID.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    DESCRIPTION

    The function deletes the chain identified by chain ID and all residues and atoms contained in it. If the requested chain does not exist in the model, the function does nothing.


    RETURN

    The function returns the number of deleted chains, that is 1 or 0.

    NOTE 1: Comparison is case-sensitive. A chain that does not have a chain ID is identified by empty string "". Consider that " " is not an empty string.

    NOTE 2: Deleted chains, residues and atoms are completely disposed and are not retrievable.

    NOTE 3: The application must call CMMDBManager::FinishStructEdit function after a set of editing operations is complete, before using the results of the editing.


    int CModel::DeleteChain ( 
    int  chainNo )
    PURPOSE
    Deleting a chain by chain number.
    ARGUMENTS
    int chainNo
    The chain number.

    DESCRIPTION

    The function deletes chain that identified by its position in the table of chains in the model, and all residues and atoms contained in it. The chains are numbered as 0..NumberOfChains-1, where NumberOfChains is returned by CModel::GetNumberOfChains. If the chain number is invalid or if such a chain does not exist in the model, the function does nothing.

    The chain number is defined by the order of the chain appearance in the coordinate file. Certain sections of PDB file (e.g. the SEQRES records) may in practice mention the chains in arbitrary order, but it is the order of chains in the coordinate section that matters here.


    RETURN

    The function returns the number of deleted chains, that is 1 or 0.

    NOTE 1: Deleted chains, residues and atoms are completely disposed and are not retrievable.

    NOTE 2: The application must call CMMDBManager::FinishStructEdit function after a set of editing operations is complete, before using the results of the editing.


    int CModel::DeleteSolventChains ( 
     )
    PURPOSE
    Deleting all solvent chains from the model.
    DESCRIPTION

    The function deletes all solvent chains from the model. A solvent chain is a chain that contains only solvent molecules.


    RETURN

    The function returns the number of deleted chains.


    int CModel::GetNumberOfResidues ( 
     )
    PURPOSE
    Obtaining the total number of residues in model.
    DESCRIPTION

    The function returns the number of residues currently contained in the model. The function performs an actual counting the residues, not just returning the sum of lengths of residue tables. If some cells of residue tables are empty (sert to NULL), they are not counted.


    int CModel::GetNumberOfResidues ( 
    ChainID  chainID )
    PURPOSE
    Obtaining the number of residues in a chain by chain ID.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    DESCRIPTION

    The function returns the number of residues currently contained in the chain identified by chain ID. If the specified chain is not found in the model, the function returns 0.


    int CModel::GetNumberOfResidues ( 
    int  chainNo )
    PURPOSE
    Obtaining the number of residues in a chain by chain number.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    DESCRIPTION

    The function returns the number of residues currently contained in the chain identified by its position in the model's table of chains. If the specified chain number is invalid or such chain does not exist in the model, the function returns 0.


    PCResidue CModel::GetResidue ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode )
    PURPOSE
    Obtaining a residue pointer by chain ID, sequence number and insertion code.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    DESCRIPTION

    The function returns pointer on the model's residue identified by sequence number, insertion code and chain ID. If any of these characteristics is invalid, or such a residue does not exist in the model, the function returns NULL.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    PCResidue CModel::GetResidue ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode )
    PURPOSE
    Obtaining a residue pointer by chain number, sequence number and insertion code.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    DESCRIPTION

    The function returns pointer on the model's residue identified by sequence number, insertion code and position of chain in the model's table of chains (chain number). If such a chain or residue does not exist, the function returns NULL.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    PCResidue CModel::GetResidue ( 
    ChainID  chainID, 
    int resNo )
    PURPOSE
    Obtaining a residue pointer by chain ID and residue number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns pointer on the residue identified by the residue number (within the chain) and chain ID. If such a chain or residue does not exist, the function returns NULL.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    PCResidue CModel::GetResidue ( 
    int  chainNo, 
    int resNo )
    PURPOSE
    Obtaining a residue pointer by chain number and residue number.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns pointer on the residue identified by residue number (within a chain) and chain number (within the model). If such a chain or residue does not exist, the function returns NULL.


    int CModel::GetResidueNo ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode )
    PURPOSE
    Obtaining a residue position in chain by chain ID, residue sequence number and insertion code.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    DESCRIPTION

    The function returns the residue position (residue number) in the specified chain of the model. The residues in a chain are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues.

    The residue is identified by chain ID, residue sequence number and insertion code. If chain with given chain ID does not exist, the function returns -2; if the residue does not exist in the chain, the return is -1.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    int CModel::GetResidueNo ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode )
    PURPOSE
    Obtaining a residue position in chain by chain number, residue sequence number and insertion code.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    DESCRIPTION

    The function returns the residue position (residue number) in the specified chain of the model. The residues in a chain are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues.

    The residue is identified by chain number (that is, the chain position in the model), residue sequence number and insertion code. If chain number is incorrect, the function returns -2; if the residue does not exist in the chain, the return is -1.

    NOTE : Comparison is case-sensitive. Consider that " " is not an empty string.


    void CModel::GetResidueTable ( 
    ChainID  chainID, 
    PPCResidue & resTable,
    int & NumberOfResidues )
    PURPOSE
    Obtaining the residue table by chain ID.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    PPCResidue & resTable
    The table of residues.

    int & NumberOfResidues
    The number of residues.

    DESCRIPTION

    The function returns table of pointers on all residues currently contained in the chain identified by chain ID. NumberOfResidues returns the number of residues. The residues are indexed as 0..NumberOfResidues-1 in the table.

    If the specified chain does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might leave residues empty. This results in empty cells in the residue table. Therefore, it is a good practice for application to check that resTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the residue table.


    void CModel::GetResidueTable ( 
    int  chainNo, 
    PPCResidue & resTable,
    int & NumberOfResidues )
    PURPOSE
    Obtaining the residue table by chain number.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    PPCResidue & resTable
    The table of residues.

    int & NumberOfResidues
    The number of residues.

    DESCRIPTION

    The function returns table of pointers on all residues currently contained in the chain identified by chain number (that is, the chain's position in the model's table of chains). NumberOfResidues returns the number of residues. The residues are indexed as 0..NumberOfResidues-1 in the table.

    If the specified chain does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might leave residues empty. This results in empty cells in the residue table. Therefore, it is a good practice for application to check that resTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the residue table.


    int CModel::GetNumberOfAtoms ( 
    Boolean  countTers )
    PURPOSE
    Calculating the total number of atoms in the model.
    ARGUMENTS
    Boolean countTers
    Flag specifying if any termination records ("TER") should be counted as atoms. In MMDB, the termination records are kept as a special case of CAtom objects. If countTers is set to True, the termination records will be counted as atoms, otherwise they are ignored.

    DESCRIPTION

    The function performs an actual calculation of all atoms in the model, not just returning the sum of lengths of atom tables. If some cells in atom tables are empty (set to NULL), they are not counted.


    int CModel::GetNumberOfAtoms ( 
    ChainID  chainID, 
    int SeqNum,
    InsCode insCode )
    PURPOSE
    Obtaining the number of atoms in a residue by chain ID, sequence number and insertion code.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int SeqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the model. The residue is identified by chain ID, residue sequence number and insertion code. If any of these characteristics is invalid or if the residue is not found, the function returns 0.

    NOTE : The function actually returns the length of atom table of the residue. In the course of editing operations, the table may contain empty cells, which will be counted as atoms. Besides, a residue may contain a termination record ("TER"), which is kept in MMDB as a special case of CAtom object; the function will count such an object as atom.


    int CModel::GetNumberOfAtoms ( 
    int  chainNo, 
    int SeqNum,
    InsCode insCode )
    PURPOSE
    Obtaining the number of atoms in a residue by chain number, sequence number and insertion code.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int SeqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the model. The residue is identified by chain number (that is, the chain's position in the model's table of chains), residue sequence number and insertion code. If any of these characteristics is invalid or if the residue is not found, the function returns 0.

    NOTE : The function actually returns the length of atom table of the residue. In the course of editing operations, the table may contain empty cells, which will be counted as atoms. Besides, a residue may contain a termination record ("TER"), which is kept in MMDB as a special case of CAtom object; the function will count such an object as atom.


    int CModel::GetNumberOfAtoms ( 
    ChainID  chainID, 
    int resNo )
    PURPOSE
    Obtaining the number of atoms in a residue by chain ID and residue number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the model. The residue is identified by chain ID and residue number (that is, the residue position in the chain's table of residues). If any of these characteristics is invalid or if the residue is not found, the function returns 0.

    NOTE : The function actually returns the length of atom table of the residue. In the course of editing operations, the table may contain empty cells, which will be counted as atoms. Besides, a residue may contain a termination record ("TER"), which is kept in MMDB as a special case of CAtom object; the function will count such an object as atom.


    int CModel::GetNumberOfAtoms ( 
    int  chainNo, 
    int resNo )
    PURPOSE
    Obtaining the number of atoms in a residue by chain number and residue number.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    DESCRIPTION

    The function returns the number of atoms currently contained in the specified residue of the model. The residue is identified by chain number (that is, the chain's position in the model's table of chains) and residue number (i.e. the residue's position in the chain's table of residues). If any of these characteristics is invalid or if the residue is not found, the function returns 0.

    NOTE : The function actually returns the length of atom table of the residue. In the course of editing operations, the table may contain empty cells, which will be counted as atoms. Besides, a residue may contain a termination record ("TER"), which is kept in MMDB as a special case of CAtom object; the function will count such an object as atom.


    PCAtom CModel::GetAtom ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by chain ID, sequence number, insertion code and atom name.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue sequence number, residue insertion code and chain ID. If any of these characteristics is invalid or if such an atom does not exist in coordinate hierarchy, the function returns NULL.


    PCAtom CModel::GetAtom ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by chain ID, sequence number, insertion code and atom number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's table of atoms, residue sequence number, residue insertion code and chain ID. If any of these characteristics is invalid or if such an atom does not exist in the model, the function returns NULL.


    PCAtom CModel::GetAtom ( 
    ChainID  chainID, 
    int resNo,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by chain ID, residue number and atom name.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue number (that is the residue's position in the chain's table of residues) and chain ID. If any of these characteristics is invalid or if such an atom does not exist in the model, the function returns NULL.


    PCAtom CModel::GetAtom ( 
    ChainID  chainID, 
    int resNo,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by chain ID, residue number and atom number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's table of atoms, residue number (that is the residue's position in the chain's table of residues) and chain ID. If any of these characteristics is invalid or if such an atom does not exist in the model, the function returns NULL.


    PCAtom CModel::GetAtom ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by chain number, sequence number, insertion code and atom name.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue sequence number, residue insertion code and chain number (that is, the position of chain in the model's table of chains). If any of these characteristics is invalid or if such an atom does not exist in the model, the function returns NULL.


    PCAtom CModel::GetAtom ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by chain number, sequence number, insertion code and atom number.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's table of atoms, residue sequence number, residue insertion code and chain number (that is, the position of chain in the model's table of chains). If any of these characteristics is invalid or if such an atom does not exist in the model, the function returns NULL.


    PCAtom CModel::GetAtom ( 
    int  chainNo, 
    int resNo,
    AtomName atomName,
    Element chelem,
    AltLoc aloc )
    PURPOSE
    Obtaining an atom pointer by chain number, residue number and atom name.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's index in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    AtomName atomName
    The atom name. This is the name that appears on PDB ATOM card, however all spaces are ignored.

    Element chelem
    The chemical element name. This parameter is optional and may be set to NULL, which stands for not taking it into account. The chemical element name should be however used for differentiating between atoms that have identical names after removing the aligning spaces. This is the case for, e.g., C-alphas and Calcium atoms.

    AltLoc aloc
    The alternative location indicator. The value of "" means "no alternative location indicator".

    DESCRIPTION

    The function returns pointer on the atom identified by its name, chemical element name, alternative location indicator, residue number (that is the residue's position in the chain's table of residues) and chain number - the position of chain in the model's table of chains. If any of these characteristics is invalid or if such an atom does not exist in the model, the function returns NULL.


    PCAtom CModel::GetAtom ( 
    int  chainNo, 
    int resNo,
    int atomNo )
    PURPOSE
    Obtaining an atom pointer by chain number, residue number and atom number.
    ARGUMENTS
    int chainNo
    The chain number. The chain number is the chain's position in the model's table of chains. This table keeps chains in the order as they appear in the coordinate file. The table is indexed as chainNo=0..NumberOfChains-1, where NumberOfChains is obtained from CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    int atomNo
    The atom number. The atom number is the atom's index in the residue's table of atoms. This table keeps atoms in the order as they appear in the coordinate file. The table is indexed as atomNo=0..NumberOfAtoms-1, where NumberOfAtoms is obtained from CModel::GetNumberOfAtoms or one of its overloaded analogues.

    DESCRIPTION

    The function returns pointer on the atom identified by its position in the residue's table of atoms, residue number (that is the residue's position in the chain's table of residues) and chain number - the position of chain in the model's table of a chains. If any of these characteristics is invalid or if such an atom does not exist in the model, the function returns NULL.


    void CModel::GetAtomTable ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the residue's table of atoms by chain ID, sequence number and insertion code.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by sequence number, insertion code and chain ID. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the table of atoms. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of atoms.


    void CModel::GetAtomTable ( 
    ChainID  chainID, 
    int resNo,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the residue's table of atoms by chain ID and residue number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by chain ID and the residue's position in the chain's table of residues. NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the table of atoms. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of atoms.


    void CModel::GetAtomTable ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the residue's table of atoms by chain number, sequence number and insertion code.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by sequence number, insertion code and chain number (that is, the position of the chain in the model's table of chains). NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the table of atoms. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of atoms.


    void CModel::GetAtomTable ( 
    int  chainNo, 
    int resNo,
    PPCAtom & atomTable,
    int & NumberOfAtoms )
    PURPOSE
    Obtaining the residue's table of atoms by chain number and residue number.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    PPCAtom & atomTable
    The table of atoms.

    int & NumberOfAtoms
    The number of atoms.

    DESCRIPTION

    The function returns table of pointers on all atoms currently contained in the residue identified by its position in the chain's table of residues and chain number (that is, the chain's position in the model's table of chains). NumberOfAtoms returns the number of atoms. The atoms are indexed as 0..NumberOfAtoms-1 in the table.

    If the specified model, chain or residue does not exist, the function returns NULL for resTable and 0 for NumberOfResidues.

    NOTE 1: Certain editing operations might dispose atoms. This results in empty cells in the table of atoms. Therefore, it is a good practice for application to check that atomTable[i] is not NULL before using it.

    NOTE 2: Under no circumstances should the application deallocate, reallocate or otherwise modify the table of atoms.


    int CModel::AddAtom ( 
    ChainID  chainID, 
    int seqNum,
    InsCode insCode,
    PCAtom atom )
    PURPOSE
    Adding an atom to the residue of the model specified by chain ID, sequence number and insertion code.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    PCAtom atom
    The atom that should be added to the residue.

    DESCRIPTION

    The function adds atom atom to the specified residue, placing it on the top of the residue's table of atoms. The atom and the residue (chain and model) may be or may be not associated with a coordinate hierarchy.

    If atom atom is not associated with a coordinate hierarchy, it is taken over by the residue, which means that its pointer is saved in the residue's table of atoms. If atom atom already belongs to a coordinate hierarchy (even though that of the residue), the residue adopts its (automatically created) copy, thus the atom is not removed from its own coordinate hierarchy.

    If residue is associated with a coordinate hierarchy, the newly added atom is automatically associated with it. Otherwise, the atom is checked in the hierarchy once the residue is checked in (see example below).


    RETURN

    Upon success, the function returns the number of atoms in the residue, which should be a positive integer greater than 0. A negative or zero return means that the atom is already in the residue, found at position equal to minus return.

    NOTE 1: Note the difference between adding atoms associated and not associated with a coordinate hierarchy as described above.

    NOTE 2: Calling CMMDBManager::FinishStructEdit function is not necessary after adding atoms. However, it is advisable to call CMMDBManager::PDBCleanup with input flags PDBCLEAN_SERIAL and PDBCLEAN_INDEX after adding all atoms (don't call CMMDBManager::PDBCleanup after every addition of an atom). PDBCLEAN_SERIAL will put atoms' serial numbers in due order, and "cleaning" on PDBCLEAN_INDEX is needed for the internal consistency of data.


    int CModel::AddAtom ( 
    int  chainNo, 
    int seqNum,
    InsCode insCode,
    PCAtom atom )
    PURPOSE
    Adding an atom to the residue of the model specified by chain number, sequence number and insertion code.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int seqNum
    The residue sequence number.

    InsCode insCode
    The residue insertion code represented as a null-terminated string without spaces. If a residues does not have insertion code, an empty string "" should be supplied.

    PCAtom atom
    The atom that should be added to the residue.

    DESCRIPTION

    The function is conceptually identical to CModel::AddAtom, see there for details.


    int CModel::AddAtom ( 
    ChainID  chainID, 
    int resNo,
    PCAtom atom )
    PURPOSE
    Adding an atom to the residue of the model specified by chain ID and residue number.
    ARGUMENTS
    ChainID chainID
    The chain ID.

    int resNo
    The residue number. The residue number does not have any relation to residue sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    PCAtom atom
    The atom that should be added to the residue.

    DESCRIPTION

    The function is conceptually identical to CModel::AddAtom, see there for details.


    int CModel::AddAtom ( 
    int  chainNo, 
    int resNo,
    PCAtom atom )
    PURPOSE
    Adding an atom to the residue of the model specified by chain number and residue number.
    ARGUMENTS
    int chainNo
    The chain number. All chains in the model are numbered as 0..NumberOfChains-1, where NumberOfChains is given by CModel::GetNumberOfChains.

    int resNo
    The residue number. The residue number does not have any relation to sequence number, and is merely a serial number of the residue in chain. The residues are numbered as 0..NumberOfResidues-1, where NumberOfResidues is returned by CModel::GetNumberOfResidues or its overloaded analogue.

    PCAtom atom
    The atom that should be added to the residue.

    DESCRIPTION

    The function is conceptually identical to CModel::AddAtom, see there for details.


    int CModel::GetNumberOfHelices ( 
     )
    PURPOSE
    Obtaining the number of helices in the model.
    DESCRIPTION

    The function returns the number of helices in the model.

    NOTE : The function does not perform identification of the secondary structure elements. It returns number of helices as annotated in PDB file.


    PCHelix CModel::GetHelix ( 
    int  helixSerNum )
    PURPOSE
    Obtaining pointer on helix by helix number.
    ARGUMENTS
    int helixSerNum
    The helix' serial number. The helices are numbered as 1..NumberOfHelices, where NumberOfHelices is returned by CModel::GetNumberOfHelices.

    DESCRIPTION

    The function returns pointer on the specified helix. If helix with given serial number is not found in the model, the function returns NULL.

    NOTE : The function does not perform identification of the secondary structure elements. It returns the helix information block as annotated in PDB file.


    int CModel::GetNumberOfSheets ( 
     )
    PURPOSE
    Obtaining the number of sheets in the model.
    DESCRIPTION

    The function returns the number of sheets in the model.

    NOTE : The function does not perform identification of the secondary structure elements. It returns number of sheets as annotated in PDB file.


    int CModel::GetSheetID ( 
    int  sheetSerNum, 
    SheetID sheetID )
    PURPOSE
    Obtaining the sheet ID by sheet serial number.
    ARGUMENTS
    int sheetSerNum
    The serial number of the sheet. The sheets are numbered as 1..NumberOfSheets, where NumberOfSheets is returned by CModel::GetNumberOfSheets.

    SheetID sheetID
    String buffer to accept the sheet ID. The ID is returned as null-terminated string.

    DESCRIPTION

    The function returns the sheet ID corresponding to the sheet identified by the sheet's serial number. If this number is not valid, the function returns empty string "".

    NOTE : The function does not perform identification of the secondary structure elements. It returns the sheet ID as annotated in PDB file.


    PCSheet CModel::GetSheet ( 
    int  sheetSerNum )
    PURPOSE
    Obtaining the sheet by sheet serial number.
    ARGUMENTS
    int sheetSerNum
    The serial number of the sheet. The sheets are numbered as 1..NumberOfSheets, where NumberOfSheets is returned by CModel::GetNumberOfSheets.

    DESCRIPTION

    The function returns pointer on the specified sheet. If the provided sheet's serial number is invalid, the function returns NULL.

    NOTE : The function does not perform identification of the secondary structure elements. It returns the sheet information block as annotated in PDB file.


    PCSheet CModel::GetSheet ( 
    SheetID  sheetID )
    PURPOSE
    Obtaining the sheet by sheet ID.
    ARGUMENTS
    SheetID sheetID
    The sheet ID given as a null-terminated string.

    DESCRIPTION

    The function returns pointer on the specified sheet. If the provided sheet ID is invalid, the function returns NULL.

    NOTE : The function does not perform identification of the secondary structure elements. It returns the sheet information block as annotated in PDB file.


    int CModel::GetNumberOfStrands ( 
    int  sheetSerNum )
    PURPOSE
    Obtaining the number of strands in a sheet by sheet number.
    ARGUMENTS
    int sheetSerNum
    The serial number of the sheet. The sheets are numbered as 1..NumberOfSheets, where NumberOfSheets is returned by CModel::GetNumberOfSheets.

    DESCRIPTION

    The function returns the number of strands in the specified sheet found in the model.

    NOTE : The function does not perform identification of the secondary structure elements. It returns number of strands as annotated in PDB file.


    int CModel::GetNumberOfStrands ( 
    SheetID  sheetID )
    PURPOSE
    Obtaining the number of strands in a sheet by sheet ID.
    ARGUMENTS
    SheetID sheetID
    The sheet ID, represented as a null-terminated string.

    DESCRIPTION

    The function returns the number of strands in the specified sheet found in the model.

    NOTE : The function does not perform identification of the secondary structure elements. It returns number of strands as annotated in PDB file.


    PCStrand CModel::GetStrand ( 
    SheetID  sheetID, 
    int strandSerNum )
    PURPOSE
    Obtaining the number of strands in a sheet by sheet ID.
    ARGUMENTS
    SheetID sheetID
    The sheet ID, represented as a null-terminated string.

    int strandSerNum
    The strand serial number. For a given sheet, the strands are numbered as 1..NumberOfStrands, where NumberOfStrands is returned by CModel::GetNumberOfStrands.

    DESCRIPTION

    The function returns a pointer on strand identified by sheet ID and the strand's serial number in the sheet. If such a strand is not found, the function returns NULL.

    NOTE : The function does not perform identification of the secondary structure elements. It returns the strand information block as annotated in PDB file.


    PCStrand CModel::GetStrand ( 
    int  sheetSerNum, 
    int strandSerNum )
    PURPOSE
    Obtaining the number of strands in a sheet by sheet serial number.
    ARGUMENTS
    int sheetSerNum
    The serial number of the sheet. The sheets are numbered as 1..NumberOfSheets, where NumberOfSheets is returned by CModel::GetNumberOfSheets.

    int strandSerNum
    The strand serial number. For a given sheet, the strands are numbered as 1..NumberOfStrands, where NumberOfStrands is returned by CModel::GetNumberOfStrands.

    DESCRIPTION

    The function returns a pointer on strand identified by sheet serial number and the strand's serial number in the sheet. If such a strand is not found, the function returns NULL.

    NOTE : The function does not perform identification of the secondary structure elements. It returns the strand information block as annotated in PDB file.


    void CModel::RemoveSecStructure ( 
     )
    PURPOSE
    Removing the annotation of secondary structure from the model.
    DESCRIPTION

    The function removes annotation of secondary structure elements (PDB records HELIX, SHEET and TURN) from the model.


    void CModel::ApplyTransform ( 
    mat44 &  TMatrix )
    PURPOSE
    Applying a transformation matrix to coordinates of all atoms in the model.
    ARGUMENTS
    mat44 & TMatrix
    The transformation matrix.

    DESCRIPTION

    The function applies the rotational-translational transformation given by matrix TMatrix, to coordinates of all atoms in the model.

    The transformation matrix TMatrix contains rotational part in columns 0,1,2, rows 0,1,2 (stands for x,y,z) and translational part in column 3, rows 0,1,2.


    void CModel::GetAtomStatistics ( 
    RSAtomStat  AS )
    PURPOSE
    Calculating the averaged properties of all atoms in the model.
    ARGUMENTS
    RSAtomStat AS
    Reference to structure SAtomStat , which returns the average results.

    DESCRIPTION

    The function performs an actual calculation of averaged atom properties, none of them are stored as variables. It is therefore advised to avoid unnecessary calls to this function.


    int CModel::PutUDData ( 
    int  UDDhandle, 
    int iudd )
    PURPOSE
    Storing an integer User-Defined Data (UDD) in the model.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int iudd
    The integer number to be stored in the model.

    DESCRIPTION

    The function stores an integer contained in iudd in the model, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully stored
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the model, the data was not stored
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in models, the data was not stored


    int CModel::PutUDData ( 
    int  UDDhandle, 
    realtype rudd )
    PURPOSE
    Storing a real-type User-Defined Data (UDD) in the model.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    realtype rudd
    The real number to be stored in the model.

    DESCRIPTION

    The function stores the real number contained in rudd in the model, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CModel::PutUDData, see returns there.


    int CModel::PutUDData ( 
    int  UDDhandle, 
    pstr sudd )
    PURPOSE
    Storing a string-type User-Defined Data (UDD) in the model.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    The string to be stored in the model.

    DESCRIPTION

    The function stores the string pointed by sudd in the model, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CModel::PutUDData, see returns there.


    int CModel::GetUDData ( 
    int  UDDhandle, 
    int & iudd )
    PURPOSE
    Retrieving an integer User-Defined Data (UDD) from the model.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int & iudd
    The buffer to accept the integer data.

    DESCRIPTION

    The function retrieves an integer previously stored in the model by function CModel::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in iudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the model. iudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the model. iudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in models. iudd does not change.


    int CModel::GetUDData ( 
    int  UDDhandle, 
    real & rudd )
    PURPOSE
    Retrieving a real-type User-Defined Data (UDD) from the model.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    real & rudd
    The buffer to accept the real-type data.

    DESCRIPTION

    The function retrieves a real number previously stored in the model by function CModel::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in rudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the model. rudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the model. rudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in models. rudd does not change.


    int CModel::GetUDData ( 
    int  UDDhandle, 
    pstr & sudd )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the model, dynamic buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr & sudd
    A pointer to dynamically-allocated string accepting the data.

    DESCRIPTION

    The function retrieves a string previously stored in the model by function CModel::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd. If sudd was not set to NULL, it will be deallocated first. The string is allocated within the function, and it is responsibility of the application to eventually deallocate it.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the model. sudd returns NULL.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the model. sudd returns NULL.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in models. sudd does not change.


    int CModel::GetUDData ( 
    int  UDDhandle, 
    pstr sudd,
    int maxlen )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the model, fixed-size buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    A pointer to a string accepting the data.

    int maxlen
    A maximal number of characters, including the terminating NULL that sudd may to accept (not more than the physical length of sudd).

    DESCRIPTION

    The function retrieves a string previously stored in the model by function CModel::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd, with no more than maxlen symbols, including the terminating NULL returned. The string sudd is not allocated or deallocated within the function.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the model. sudd returns empty string "".
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the model. sudd returns empty string "".
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in models. sudd does not change.


    void CModel::Copy ( 
    PCModel  model )
    PURPOSE
    Copying the model contents.
    ARGUMENTS
    PCModel model
    The source model, whose contents is to be copied.

    DESCRIPTION

    The function copies the content of model model into internal class' fields. The function does copy all the model's table of chains and it does redefine the chains' model pointers for the destination one. As a result, a new model is created that is identical to the source one, but physically they do not overlap.

    NOTE : An application should never copy contents of classes by direct assignment; in most cases this will result in crash because of inducing a mess in cross-references. See the following example:

          PCModel model1,model2;
          model1 = new CModel();
          model2 = new CModel();
          // doing something with model2
          
          *model1 = *model2;  // never do this!
          
          // the right way:
          model1->Copy ( model2 );
        
    Function Copy is supplied for all classes in the Library.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_contact.html0000644000175100017510000014310207504104437015634 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Looking for contacts.

    A contact is pair of atoms that are on a certain distance from each other. The Library offers a few functions for finding such pairs of contacting atoms.

    Function Purpose
    CMMDBManager::SeekContacts Finding contacts between vector of atoms and one atom from the same vector.
    CMMDBManager::SeekContacts Finding contacts between atom and vector of atoms.
    CMMDBManager::SeekContacts Finding contacts between two vectors of atoms.
    SortContacts Sorting contacts.
    CMMDBManager::MakeBricks Bricking the coordinate space and assigning atoms to the bricks
    CMMDBManager::GetBrickDimension Retrieving the number of bricks in X, Y and Z - directions
    CMMDBManager::GetBrick Retrieving a brick
    CMMDBManager::GetBrickCoor Getting coordinates of a brick that contains given atom
    CMMDBManager::GetBrickCoor Getting coordinates of a brick that contains given point of space
    CMMDBManager::RemoveBricks Removing bricking


    void CMMDBManager::SeekContacts ( 
    PPCAtom  Atom, 
    int alen,
    int atomNum,
    realtype dist1,
    realtype dist2,
    int seqDist,
    RPSContact contact,
    int & ncontacts,
    int maxlen,
    long group )
    PURPOSE
    Finding contacts between vector of atoms and one atom from the same vector.
    ARGUMENTS
    PPCAtom Atom
    A vector of atoms; it may be obtained, for example, as a result of atom selection with CMMDBManager::GetSelIndex function. All atoms must be present in the coordinate hierarchy; no outside atoms are allowed. The vector may contain NULL pointers.

    int alen
    Number of atoms in vector Atom. The vector's index space is 0..alen-1.

    int atomNum
    Number of 1st contacting atom in vector Atom. All other atoms in the vector are checked for contact conditions with this one.

    realtype dist1
    Minimal contact distance, in angstroms.

    realtype dist2
    Maximal contact distance, in angstroms.

    int seqDist
    The minimal sequence distance of contacts. The contacting atoms are required to be in residues separated by not less than seqDist inter-residue spaces if they are in the same chain. Thus, seqDist=0 allows contacting atoms to be in the same residue, seqDist=1 requires them to be in different residues.

    RPSContact contact
    Array of found contacts. For ith contacting pair, contact[i].id1 is set to atomNum and contact[i].id2 is set to the index of 2nd contacting atom, which it has in the input vector Atom. The distance between contacting atoms is returned in contact[i].dist. A special field contact[i].group will contain the contact group ID (see below, parameter group).

    int & ncontacts
    Number of found contacts. The array contact is indexed as 1..ncontacts-1. If ncontacts>0 on input, it is assumed that ncontacts contacts were already found and newly found contacts are added to them.

    int maxlen
    Maximal number of contacts to find. If maxlen<=0 (default) then vector contact is allocated dynamically by SeekContacts for all found contacts.
    If maxlen>0, then array contact is prohibited of dynamical allocation/deallocation. In this case, not more than maxlen contacts will be returned.
    In either case, it is the application, rather than Manager, that is responsible for deallocation of array contact after use.

    long group
    A contact group ID. This ID is simply stored in contact[i].group fields and may be useful if contacts are calculated in multiple calls to the function (e.g. in the course of generation of symmetry mates). This parameter has default value of 0.

    DESCRIPTION

    The function attempts to find atoms in vector Atom, which are within the distance dist1<=r<=dist2 from atom Atom[atomNum], and which belong to residues separated by at least seqDist inter-residue spaces. Indices of contacting atoms (i.e. their positions in input array Atom) are returned in dynamically-allocated or static array contact.

    NOTE 1: The number of inter-residue spaces between given residues is calculated from the actual number of residues between them, and not from the residues' sequence numbers.

    NOTE 2: A coordinate file may be missing some residues or even whole parts of a chain. If this is the case and if the missing residue(s) fall within the sequence distance of seqDist from one of the contacting atoms, the algorithm assumes that not less than seqDist residues are missed. A gap of missing residues is assumed if C-alpha atoms of neighbouring residues are separated by more than 4 angstroms.


    EXAMPLE

    Looking for 5-angstrom contacts between C-alpha of 33rd residue of chain A (which is not a residue with sequence number 33, but merely a residue in 33rd position in the chain counted as 0..nResidues-1) and C-alpha atoms of all other residues of the same chain that are at more than one residue position apart from each other:

    CMMDBManager MMDB;
    int          RC,selHnd,alen,ncontacts,i;
    PPCAtom      Atom;
    PSContact    contact;
    char         S1[100];
    char         S2[100];
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      // select C-alpha atoms of chain A:
      SelHnd = MMDB.NewSelection();
      MMDB.Select       ( selHnd,STYPE_ATOM,1,"A",
                          ANY_RES,"*",ANY_RES,"*",
                          "*","CA","C",SKEY_NEW );
      MMDB.GetSelIndex  ( selHnd,Atom,alen );
    
      // get contacts:
      contact   = NULL;  // prepare for dynamical allocation
      ncontacts = 0;     // of vector contact
      MMDB.SeekContacts ( Atom,      // vector of selected atoms
                          alen,      // number of selected atoms
                          33,        // 1st contacting atom nr 33
                          0.0,       // minimal contact distance
                          5.0,       // maximal contact distance
                          2,         // sequence distance
                          contact,   // vector of contacts
                          ncontacts, // number of contacts
                          0,         // allocate contact dynamically
                          0          // zero group ID
                        );
    
      // print contacts
      if (ncontacts>0)  {
        printf ( " Found %i contacts:\n",ncontacts );
        for (i=0;i<ncontacts;i++)
          printf ( " %s <-> %s   %10.4f A\n",
                   Atom[contact[i].id1]->GetAtomID(S1),
                   Atom[contact[i].id2]->GetAtomID(S2),
                   contact[i].dist );
      } else
        printf ( " No contact found.\n" );
    
      // dispose array contact:
      if (contact)  delete contact;
    


    void CMMDBManager::SeekContacts ( 
    PCAtom  A, 
    PPCAtom Atom,
    int alen,
    realtype dist1,
    realtype dist2,
    int seqDist,
    RPSContact contact,
    int & ncontacts,
    int maxlen,
    long group )
    PURPOSE
    Finding contacts between atom and vector of atoms.
    ARGUMENTS
    PCAtom A
    1st contacting atom. The atom must be present in the coordinate hierarchy; an application may not supply an "outside" atom here.

    PPCAtom Atom
    A vector of atoms; it may be obtained, for example, as a result of atom selection with CMMDBManager::GetSelIndex function. All atoms must be present in the coordinate hierarchy; no outside atoms are allowed. The vector may contain NULL pointers.

    int alen
    Number of atoms in vector Atom. The vector's index space is 0..alen-1.

    realtype dist1
    Minimal contact distance, in angstroms.

    realtype dist2
    Maximal contact distance, in angstroms.

    int seqDist
    The minimal sequence distance of contacts. The contacting atoms are required to be in residues separated by not less than seqDist inter-residue spaces if they are in the same chain. Thus, seqDist=0 allows contacting atoms to be in the same residue, seqDist=1 requires them to be in different residues.

    RPSContact contact
    Array of found contacts. For ith contacting pair, contact[i].id1 is set to -1, and contact[i].id2 is set to the index of 2nd contacting atom, which it has in the input vector Atom. The distance between contacting atoms is returned in contact[i].dist. A special field contact[i].group will contain the contact group ID (see below, parameter group).

    int & ncontacts
    Number of found contacts. The array contact is indexed as 1..ncontacts-1. If ncontacts>0 on input, it is assumed that ncontacts contacts were already found and newly found contacts are added to them.

    int maxlen
    Maximal number of contacts to find. If maxlen<=0 (default) then vector contact is allocated dynamically by SeekContacts for all found contacts.
    If maxlen>0, then array contact is prohibited of dynamical allocation/deallocation. In this case, not more than maxlen contacts will be returned.
    In either case, it is the application, rather than Manager, that is responsible for deallocation of array contact after use.

    long group
    A contact group ID. This ID is simply stored in contact[i].group fields and may be useful if contacts are calculated in multiple calls to the function (e.g. in the course of generation of symmetry mates). This parameter has default value of 0.

    DESCRIPTION

    The function attempts to find atoms in vector Atom, which are within the distance dist1<=r<=dist2 from atom A, and which belong to residues separated by at least seqDist inter-residue spaces. Indices of contacting atoms (i.e. their positions in input array Atom) are returned in dynamically-allocated or static array contact.

    NOTE 1: The number of inter-residue spaces between given residues is calculated from the actual number of residues between them, and not from the residues' sequence numbers.

    NOTE 2: A coordinate file may be missing some residues or even whole parts of a chain. If this is the case and if the missing residue(s) fall within the sequence distance of seqDist from one of the contacting atoms, the algorithm assumes that not less than seqDist residues are missed. A gap of missing residues is assumed if C-alpha atoms of neighbouring residues are separated by more than 4 angstroms.


    EXAMPLE

    Looking for 5-angstrom contacts between C-alpha atom of residue with sequence number 34 of chain A and C-alpha atoms of all other residues of the same chain that are at more than two residue position apart from each other:

    CMMDBManager MMDB;
    int          RC,selHnd,alen,ncontacts,i;
    PCAtom       A;
    PPCAtom      Atom;
    PSContact    contact;
    char         S1[100];
    char         S2[100];
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      // select C-alpha atoms of chain A:
      SelHnd = MMDB.NewSelection();
      MMDB.Select      ( selHnd,STYPE_ATOM,1,"A",
                         ANY_RES,"*",ANY_RES,"*",
                         "*","CA","C",SKEY_NEW );
      MMDB.GetSelIndex ( selHnd,Atom,alen );
    
      // get 1st contacting atom:
      strcpy ( S1,"/1/A/34/CA[C]" );
      A = MMDB.GetAtom ( S1 );
      if (!A)  {
        // atom not found, identify the reason:
        printf ( " Atom '%s' not found: ",S1 );
        switch (MMDB.AtomExtrCode)  {
          case AEXTR_NoModel   : printf ( "no such model.\n" );           break;
          case AEXTR_NoChain   : printf ( "no such chain in model.\n" );  break;
          case AEXTR_NoResidue : printf ( "no such residue in chain\n" ); break;
          case AEXTR_NoAtom    : printf ( "no such atom in residue\n" );  break;
          case AEXTR_WrongPath : printf ( "wrong atom ID syntax\n" );     break;
          default              : printf ( "unknown error code\n" );
        }
        exit(2);
      }
    
      // get contacts:
      contact   = NULL;  // prepare for dynamical allocation
      ncontacts = 0;     // of vector contact
      MMDB.SeekContacts ( A,         // 1st contacting atom
                          Atom,      // vector of selected atoms
                          alen,      // number of selected atoms
                          0.0,       // minimal contact distance
                          5.0,       // maximal contact distance
                          2,         // sequence distance
                          contact,   // vector of contacts
                          ncontacts, // number of contacts
                          0,         // allocate contact dynamically
                          0          // zero group ID
                        );
    
      // print contacts
      if (ncontacts>0)  {
        printf ( " Found %i contacts:\n",ncontacts );
        for (i=0;i<ncontacts;i++)
          printf ( " %s <-> %s   %10.4f A\n",
                   S1,Atom[contact[i].id2]->GetAtomID(S2),
                   contact[i].dist );
      } else
        printf ( " No contact found.\n" );
    
      // dispose array contact:
      if (contact)  delete contact;
    


    void CMMDBManager::SeekContacts ( 
    PPCAtom  Atom1, 
    int alen1,
    PPCAtom Atom2,
    int alen2,
    realtype dist1,
    realtype dist2,
    int seqDist,
    RPSContact contact,
    int & ncontacts,
    int maxlen,
    mat44 * TMatrix,
    long group )
    PURPOSE
    Finding contacts between two vectors of atoms.
    ARGUMENTS
    PPCAtom Atom1
    1st vector of contacting atoms. All atoms must be present in the coordinate hierarchy; an application may not supply an "outside" atoms here. The vector may contain NULL pointers.

    int alen1
    Number of atoms in vector Atom1. The vector's index space is 0..alen1-1.

    PPCAtom Atom2
    2nd vector of contacting atoms. Both vectors may be obtained, for example, as a result of atom selection with CMMDBManager::GetSelIndex function. All atoms must be present in the coordinate hierarchy; no outside atoms are allowed. The vector may contain NULL pointers.

    int alen2
    Number of atoms in vector Atom2. The vector's index space is 0..alen2-1.

    realtype dist1
    Minimal contact distance, in angstroms.

    realtype dist2
    Maximal contact distance, in angstroms.

    int seqDist
    The minimal sequence distance of contacts. The contacting atoms are required to be in residues separated by not less than seqDist inter-residue spaces if they are in the same chain. Thus, seqDist=0 allows contacting atoms to be in the same residue, seqDist=1 requires them to be in different residues.

    RPSContact contact
    Array of found contacts. For ith contacting pair, contact[i].id1 is set to the index of contacting atom from vector Atom1, and contact[i].id2 - to the index of contacting atom from vector Atom2. The distance between contacting atoms is returned in contact[i].dist. A special field contact[i].group will contain the contact group ID (see below, parameter group).

    int & ncontacts
    Number of found contacts. The array contact is indexed as 1..ncontacts-1. If ncontacts>0 on input, it is assumed that ncontacts contacts were already found and newly found contacts are added to them.

    int maxlen
    Maximal number of contacts to find. If maxlen<=0 (default) then vector contact is allocated dynamically by SeekContacts for all found contacts.
    If maxlen>0, then array contact is prohibited of dynamical allocation/deallocation. In this case, not more than maxlen contacts will be returned.
    In either case, it is the application, rather than Manager, that is responsible for deallocation of array contact after use.

    mat44 * TMatrix
    A transformation matrix that should be applied to 2nd set of atoms Atom2. This may be used for finding contacts between symmetry mates.
    If TMatrix is set to NULL (default), this parameter is ignored.
    Even if the transformation is applied, the coordinates of atoms in Atom2 do not change upon return from the function.

    long group
    A contact group ID. This ID is simply stored in contact[i].group fields and may be useful if contacts are calculated in multiple calls to the function (e.g. in the course of generation of symmetry mates). This parameter has default value of 0.

    DESCRIPTION

    The function attempts to find all such pairs of atoms {Atom1[i],Atom2[j]} that are within the distance dist1<=r<=dist2 from each other and belong to residues separated by at least seqDist inter-residue spaces. Indices of contacting atoms (i.e. their positions in input arrays Atom1 and Atom2) are returned in dynamically-allocated or static array contact.

    The function employs the bricking algorithm and therefore considerably outperforms a trivial scheme of applying the atom-to-vector version of CMMDBManager::SeekContacts to all atoms of vector Atom1, if its length is greater than alen2=2.

    NOTE 1: The number of inter-residue spaces between given residues is calculated from the actual number of residues between them, and not from the residues' sequence numbers.

    NOTE 2: A coordinate file may be missing some residues or even whole parts of a chain. If this is the case and if the missing residue(s) fall within the sequence distance of seqDist from one of the contacting atoms, the algorithm assumes that not less than seqDist residues are missed. A gap of missing residues is assumed if C-alpha atoms of neighbouring residues are separated by more than 4 angstroms.


    EXAMPLE

    Looking for 5-angstrom contacts between C-alpha atoms of chain A with all sulphur atoms. Only contacts between not-the-same residues should be considered.

    CMMDBManager MMDB;
    int          RC,selHnd1,selHnd2,alen1,alen2,ncontacts,i;
    PPCAtom      Atom1,Atom2
    PSContact    contact;
    char         S1[100];
    char         S2[100];
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      // select C-alpha atoms of chain A:
      SelHnd1 = MMDB.NewSelection();
      MMDB.Select      ( selHnd1,STYPE_ATOM,1,"A",
                         ANY_RES,"*",ANY_RES,"*",
                         "*","CA","C",SKEY_NEW );
      MMDB.GetSelIndex ( selHnd1,Atom1,alen1 );
    
      // select all sulphurs:
      SelHnd2 = MMDB.NewSelection();
      MMDB.Select      ( selHnd2,STYPE_ATOM,1,"*",
                         ANY_RES,"*",ANY_RES,"*",
                         "*","*","S",SKEY_NEW );
      MMDB.GetSelIndex ( selHnd2,Atom2,alen2 );
    
      // get contacts:
      contact   = NULL;  // prepare for dynamical allocation
      ncontacts = 0;     // of vector contact
      MMDB.SeekContacts ( Atom1,     // 1st vector of atoms
                          alen1,     // length of 1st vector
                          Atom2,     // 2nd vector of atoms
                          alen2,     // length of 2nd vector
                          0.0,       // minimal contact distance
                          5.0,       // maximal contact distance
                          2,         // sequence distance
                          contact,   // vector of contacts
                          ncontacts, // number of contacts
                          0,         // allocate contact dynamically
                          NULL,      // no transformation matrix
                          0          // zero group ID
                        );
    
      // print contacts
      if (ncontacts>0)  {
        printf ( " Found %i contacts:\n",ncontacts );
        for (i=0;i<ncontacts;i++)
          printf ( " %s <-> %s   %10.4f A\n",
                   Atom1[contact[i].id1]->GetAtomID(S1),
                   Atom2[contact[i].id2]->GetAtomID(S2),
                   contact[i].dist );
      } else
        printf ( " No contact found.\n" );
    
      // dispose array contact:
      if (contact)  delete contact;
    


    void SortContacts ( 
    PSContact  contact, 
    int ncontacts,
    int sortmode )
    PURPOSE
    Sorting contacts.
    ARGUMENTS
    PSContact contact
    Vector of contacts to sort.

    int ncontacts
    Length of vector contact.

    int sortmode
    The sort mode. This parameter may take the following values:

    Value   Description
    CNSORT_1INC   sorting by increasing index of 1st contacting atom contact[i].id1.
    CNSORT_1DEC   sorting by decreasing index of 1st contacting atom contact[i].id1.
    CNSORT_2INC   sorting by increasing index of 2nd contacting atom contact[i].id2.
    CNSORT_2DEC   sorting by decreasing index of 2nd contacting atom contact[i].id2.
    CNSORT_DINC   sorting by increasing contact distance contact[i].dist.
    CNSORT_DDEC   sorting by decreasing contact distance contact[i].dist.


    DESCRIPTION

    The function sorts contacts found in the vector contact according to the sort mode specified by sortmode.

    NOTE : This function is a standalone procedure rather than a member of CMMDBManager or any other class of the Library.


    void CMMDBManager::MakeBricks ( 
    PPCAtom  atmvec, 
    int avlen,
    realtype Margin,
    realtype BrickSize )
    PURPOSE
    Bricking the coordinate space and assigning atoms to the bricks
    ARGUMENTS
    PPCAtom atmvec
    A vector of atoms; it may be obtained, for example, as a result of atom selection with CMMDBManager::GetSelIndex function. The atoms do not have to be associated with a coordinate hierarchy. The vector may contain NULL pointers.

    int avlen
    Length of vector atmvec. The vector must be indexed as 0..avlen-1.

    realtype Margin
    The margin (in angstroms) which is added in all X, Y and Z directions to the minimal bar encapsulating all atoms before bricking (see below).

    realtype BrickSize
    Size of bricks in angstroms. All bricks are cubes. This parameter has a default value of 6.

    DESCRIPTION

    The function cuts the volume occupied by atoms given in vector atmvec into cubical bricks and for each brick it makes a list of atoms contained in the brick. The bricked volume is approximated as a minimal bar that contains all atoms covered by layer of width not less than Margin angstroms from all sides such that integer number of bricks of size BrickSize would fit on each face of it.

    NOTE 1: The function removes previously existing bricking, if there was any.

    NOTE 2: The contact-seeking function CMMDBManager::SeekContacts removes previously existing bricking.


    EXAMPLE

    Make bricking of all C-alphas and print atoms found in the brick of 33rd residue's C-alpha:

    CMMDBManager MMDB;
    int          RC,selHnd,alen, nx,ny,nz, i;
    PPCAtom      Atom;
    PCBrick      Brick;
    char         S[100];
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      // select C-alpha atoms of chain A:
      SelHnd = MMDB.NewSelection();
      MMDB.Select       ( selHnd,STYPE_ATOM,1,"A",
                          ANY_RES,"*",ANY_RES,"*",
                          "*","CA","C",SKEY_NEW );
      MMDB.GetSelIndex  ( selHnd,Atom,alen );
    
      MMDB.MakeBricks   ( Atom,alen,6.0,6.0 );
      MMDB.GetBrickCoor ( Atom[32], nx,ny,nz );
      Brick = MMDB.GetBrick ( nx,ny,nz );
    
      MMDB.GetBrickDimension ( nx,ny,nz );
      printf ( " total bricks:\n"
               " %5i on X\n"
               " %5i on Y\n"
               " %5i on Z\n",nx,ny,nz );
    
      if (!Brick)  {
        printf ( " *****  no brick found: mmdb misfunction\n" );
      } else  {
        printf ( " atoms found in brick (%i,%i,%i):\n\n"
                 " sel.No.     Coordinate ID\n",nx,ny,nz );
        for (i=0;i<Brick->nAtoms;i++)
          printf ( " %4i  %s\n",Brick->id[i],
                   Brick->Atom[i]->GetAtomID(S1) );
      }
    
      MMDB.RemoveBricks    ();
      MMDB.DeleteSelection ( selHnd );
      
    


    void CMMDBManager::GetBrickDimension ( 
    int &  nxmax, 
    int & nymax,
    int & nzmax )
    PURPOSE
    Retrieving the number of bricks in X, Y and Z - directions
    ARGUMENTS
    int & nxmax
    Number of bricks in X-direction

    int & nymax
    Number of bricks in Y-direction

    int & nzmax
    Number of bricks in Z-direction

    DESCRIPTION

    The function returns number of bricks in X, Y and Z - directions created by function CMMDBManager::MakeBricks. The bricks are indexed like [0..nxmax-1, 0..nymax-1,0..nzmax-1]. The function returns zeros if bricks were not created.


    PCBrick CMMDBManager::GetBrick ( 
    int  nx, 
    int ny,
    int nz )
    PURPOSE
    Retrieving a brick
    ARGUMENTS
    int nx
    X-index of the brick to retrieve

    int ny
    Y-index of the brick to retrieve

    int nz
    Z-index of the brick to retrieve

    DESCRIPTION

    The function returns pointer to the brick having indices of nx, ny,nz in X, Y and Z - directions, respectively. If such a brick does not exists, if indices are wrong (beyond the valid range) or if bricking was not done, the function returns NULL.

    NOTE : The application must not dispose or alterate the bricks.


    void CMMDBManager::GetBrickCoor ( 
    PCAtom  A, 
    int & nx,
    int & ny,
    int & nz )
    PURPOSE
    Getting coordinates of a brick that contains given atom
    ARGUMENTS
    PCAtom A
    The atom, a brick for which should be found.

    int & nx
    X-index of the brick containing atom A

    int & ny
    Y-index of the brick containing atom A

    int & nz
    Z-index of the brick containing atom A

    DESCRIPTION

    The function returns indices nx, ny and nz of the brick that contains atom A. If such a brick does not exist, or if bricking was not done, the function returns a negative value for nx.


    void CMMDBManager::GetBrickCoor ( 
    realtype  x, 
    realtype y,
    realtype z,
    int & nx,
    int & ny,
    int & nz )
    PURPOSE
    Getting coordinates of a brick that contains given point of space
    ARGUMENTS
    realtype x
    X-coordinate of the point a brick for which should be found (in angstroms)

    realtype y
    Y-coordinate of the point a brick for which should be found (in angstroms)

    realtype z
    Z-coordinate of the point a brick for which should be found (in angstroms)

    int & nx
    X-index of the brick containing atom A

    int & ny
    Y-index of the brick containing atom A

    int & nz
    Z-index of the brick containing atom A

    DESCRIPTION

    The function returns indices nx, ny and nz of the brick that contains point (x,y,z) (given in angstroms). If such a brick does not exist, or if bricking was not done, the function returns a negative value for nx.


    void CMMDBManager::RemoveBricks ( 
     )
    PURPOSE
    Removing bricking
    DESCRIPTION

    The function removes bricks created by function CMMDBManager::MakeBricks. There is no particular need in calling this function other than freeing RAM: the bricks are disposed automatically when necessary.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_transf.html0000644000175100017510000007400107504104510015467 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Coordinate Transformations.

    This section presents a collection of different functions for performing different types of coordinate transformations on the coordinate hierarchy, such as fractionalizing/orthogonalizing, symmetry mating and rotation.

    Function Purpose
    CMMDBManager::ApplyTransform Applying the transformation matrix to all coordinates.
    CMMDBManager::Orth2Frac Orthogonal-to-fractional transformation of coordinates.
    CMMDBManager::Frac2Orth Fractional-to-orthogonal transformation of coordinates.
    CMMDBManager::GenerateSymMates Generating the symmetry mates of the coordinate hierarchy.
    CMMDBManager::EulerRotation Euler rotation of coordinates.
    CMMDBManager::VectorRotation Rotating coordinates about an arbitrary vector.


    void CMMDBManager::ApplyTransform ( 
    mat44 &  TMatrix )
    PURPOSE
    Applying the transformation matrix to all coordinates.
    ARGUMENTS
    mat44 & TMatrix
    The transformation matrix.

    DESCRIPTION

    The function applies the rotational-translational transformation given by matrix TMatrix, to coordinates of all atoms in the coordinate hierarchy.

    The transformation matrix TMatrix contains rotational part in columns 0,1,2, rows 0,1,2 (stands for x,y,z) and translational part in column 3, rows 0,1,2.


    Boolean CMMDBManager::Orth2Frac ( 
    realtype  xorth, 
    realtype yorth,
    realtype zorth,
    realtype & xfrac,
    realtype & yfrac,
    realtype & zfrac )
    PURPOSE
    Orthogonal-to-fractional transformation of coordinates.
    ARGUMENTS
    realtype xorth
    orthogonal X-coordinate

    realtype yorth
    orthogonal Y-coordinate

    realtype zorth
    orthogonal Z-coordinate

    realtype & xfrac
    fractional X-coordinate

    realtype & yfrac
    fractional Y-coordinate

    realtype & zfrac
    fractional Z-coordinate

    DESCRIPTION

    The function calculates fractional coordinates (xfrac,yfrac,zfrac) corresponding to orthogonal coordinates (xorth,yorth,zorth) using crystallographic information (cell dimension data) currently set in the coordinate hierarchy.


    RETURN

    The function returns True if the fractional coordinates have been successfully calculated. Return of False indicates that cell parameters were not set up. In the latter case, the fractional coordinates are not calculated.


    Boolean CMMDBManager::Frac2Orth ( 
    realtype  xfrac, 
    realtype yfrac,
    realtype zfrac,
    realtype & xorth,
    realtype & yorth,
    realtype & zorth )
    PURPOSE
    Fractional-to-orthogonal transformation of coordinates.
    ARGUMENTS
    realtype xfrac
    fractional X-coordinate

    realtype yfrac
    fractional Y-coordinate

    realtype zfrac
    fractional Z-coordinate

    realtype & xorth
    orthogonal X-coordinate

    realtype & yorth
    orthogonal Y-coordinate

    realtype & zorth
    orthogonal Z-coordinate

    DESCRIPTION

    The function calculates orthogonal coordinates (xorth,yorth,zorth) corresponding to fractional coordinates (xfrac,yfrac,zfrac) using crystallographic information (cell dimension data) currently set in the coordinate hierarchy.


    RETURN

    The function returns True if the orthogonal coordinates have been successfully calculated. Return of False indicates that cell parameters were not set up. In the latter case, the orthogonal coordinates are not calculated.


    int CMMDBManager::GenerateSymMates ( 
    PCGenSym   GenSym )
    PURPOSE
    Generating the symmetry mates of the coordinate hierarchy.
    ARGUMENTS
    PCGenSym GenSym
    The symmetry operations container. It may be set to NULL, in which case the function uses symmetry operations corresponding to the space group currently set in the coordinate hierarchy.

    DESCRIPTION

    The function generates symmetry mates according to symmetry operations found in GenSym. Results of first symmetry operation (number 0) always replace the existing set of atoms, others are added as additional sets.

    The symmetry operations container GenSym contains only the set of symmetry operations and, as an option, the rules for naming the newly generated chains. The function uses the cell geometry information currently set in the coordinate hierarchy.

    If GenSym is set to NULL, the function generates all symmetry mates for the unit cell according to the symmetry information currently set in the coordinate hierarchy.

    The newly generated chains are added to each model. These chains have many-character chain names, composed as 'x_n', where 'x' is the original chain name and 'n' is a unique number, which coincides with the symmetry operation (order) number; number '_0' (for the very first symmetry operation) is missing so that the original set of chains (after performing the 0th symmetry operation on it) is not renamed. Another side effect of the function is the disorder in atoms' serial numbers. The hierarchy should therefore be cleaned after generating the symmetry mates. An appropriate way to do that could be to issue the following call (see CMMDBManager::PDBCleanup):
       CMMDBManager::PDBCleanup ( PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL );
        


    RETURN

    Return Code   Value   Description
    GSM_Ok   0   Success
    GSM_NoSymOps   1   No symmetry operations found
    GSM_NoTransfMatrices   2   No fractionalization/orthogonalization matrices found
    GSM_NoCell   3   No cell parameters found


    EXAMPLE 1

    Generate a unit cell:

    CMMDBManager MMDB;
    int          RC;
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        // i/o error handling
        . . . . . . . . . .
        exit(1);
      }
    
      // if coordinate file does not contain space group or it is
      // incorrect, the application must set one
      if (!MMDB.isSpaceGroup())  {
        // space group name is for demonstration only
        RC = MMDB.SetSpaceGroup ( "P 21 21 21" );
        if (RC!=SYMOP_Ok)   {
          switch (RC)  {
            case SYMOP_NoLibFile :
                printf ( " **** error: can't find symop.lib\n" );
              break;
            case SYMOP_UnknownSpaceGroup :
                printf ( " **** error: attempt to set up unknown space group\n" );
              break;
            case SYMOP_NoSymOps :
                printf ( " **** error: no symmetry operations found\n" );
              break;
            default :
                printf ( " **** error: unknown return code from "
                         "CMMDBManager::SetSpaceGroup()\n" );
          }
          exit(2);
        }
      }
    
      // if coordinate file does not contain cell parameters or they are
      // incorrect, the application must set them
      if (!MMDB.isCrystInfo())  {
        // numerical values are for demonstration only
        a        = 100.0;
        b        = 100.0;
        c        = 100.0;
        alpha    = 90.0;
        beta     = 90.0;
        gamma    = 90.0;
        OrthCode = 0;
        MMDB.SetCell ( a,b,c,alpha,beta,gamma,OrthCode );
      }
    
      // it is a good idea to check the completeness of the crystallographic
      // information before generating the symmetry mates. Although the
      // generating function (see below) would return a signal if unit
      // cell cannot be generated.
      RC = MMDB.CrystReady();
      if (RC>0)  {
        // warnings and infos:
        if (RC & CRRDY_NotPrecise)
          printf ( " --- warning: cryst data is not precise\n" );
        if (RC & CRRDY_isTranslation)
          printf ( " --- warning: cryst data contains translation\n" );
        if (RC & CRRDY_NoOrthCode)
          printf ( " --- warning: no orthogonalization code\n" );
      } else  {
        // fatal errors:
        switch (RC)  {
          case CRRDY_Complete : break;   // it's Ok
          case CRRDY_NoTransfMatrices :
               printf ( " *** error : transformation matrices were not "
                        "calculated\n" );
             break;
          case CRRDY_Unchecked :
               printf ( " *** error : fail to check cryst data\n" );
             break;
          case CRRDY_Ambiguous :
               printf ( " *** error : cryst data is ambiguous\n" );
             break;
          case CRRDY_NoCell    :
               printf ( " *** error : missing cryst data\n" );
             break;
          default :
               printf ( " *** error : unknown return code from "
                        "CMMDBManager::CrystReady()\n" );
        }
        exit(3);
      }
    
      // now generate the unit cell:
      RC = MMDB.GenerateSymMates ( NULL );
      switch (RC)  {
        case GSM_Ok       : break;  // it's Ok
        case GSM_NoSymOps : printf ( " *** error: no symmetry operations "
                                     "found\n" );
                         exit(4);
        case GSM_NoTransfMatrices :
                            printf ( " *** error: Fractionalization/"
                                     "Orthogonalization is not defined\n" );
                         exit(4);
        case GSM_NoCell   : printf ( " *** error: No cell parameters were "
                                     "set up\n" );
                         exit(4);
        default : printf ( " *** error: unknown return from "
                           "CMMDBManager::GenerateSymMates()\n" );
                         exit(4);
      }
    
      // make 1-character chain names and recalculate the atom serial
      // numbers
      MMDB.PDBCleanup ( PDBCLEAN_CHAIN_STRONG | PDBCLEAN_SERIAL );
    
    


    EXAMPLE 2

    Generate specific symmetry mates:

    CMMDBManager MMDB;
    int          RC;
    CGenSym      GenSym;
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        // i/o error handling
        . . . . . . . . . .
        exit(1);
      }
    
      // if coordinate file does not contain cell parameters or they are
      // incorrect, the application must set them
      if (!MMDB.isCrystInfo())  {
        // numerical values are for demonstration only
        a        = 100.0;
        b        = 100.0;
        c        = 100.0;
        alpha    = 90.0;
        beta     = 90.0;
        gamma    = 90.0;
        OrthCode = 0;
        MMDB.SetCell ( a,b,c,alpha,beta,gamma,OrthCode );
      }
    
      // ===================================================================
      // unlike example #1, we do not perform a check for crystallographic
      // information here. This checking is done by the
      // CMMDBmanager::GenerateSymMates() function.
      // ===================================================================
    
      //  Fill in the CGenSym class by symmetry operations.
      //  First operation - the identity. It does not have to be so,
      // however it is convenient if identity should be there
      GenSym.AddSymOp ( "X,Y,Z" );  // first operation don't rename chains
    
      //  Set up 2nd operation (example only)
      GenSym.AddSymOp    ( "X-1/2,-Y+1/2,Z" );
      //  2nd operation will rename chains. We can specify the renaming
      //  rules here instead of calling CMMDBManager::PDBCleanup() for
      //  making 1-character chain IDs after generating new chains
      GenSym.AddRenChain ( 1,"A","C" );  //  rename A to C
      GenSym.AddRenChain ( 1,"B","D" );  //  rename B to D
    
      //  Set up 3rd operation
      GenSym.AddSymOp    ( "-X,-Y,Z+1" );
      GenSym.AddRenChain ( 1,"A","E" );  //  rename A to E
      GenSym.AddRenChain ( 1,"B","F" );  //  rename B to F
    
      // now generate the symmetry mates:
      RC = MMDB.GenerateSymMates ( &GenSym );
      switch (RC)  {
        case GSM_Ok       : break;  // it's Ok
        case GSM_NoSymOps : printf ( " *** error: no symmetry operations "
                                     "found\n" );
                         break;
        case GSM_NoTransfMatrices :
                            printf ( " *** error: Fractionalization/"
                                     "Orthogonalization is not defined\n" );
                         break;
        case GSM_NoCell   : printf ( " *** error: No cell parameters were "
                                     "set up\n" );
                         break;
        default : printf ( " *** error: unknown return from "
                           "CMMDBManager::GenerateSymMates()\n" );
      }
    
      // ====================================================================
      // unlike example #1, we do not call CMMDBManager::PDBCleanup() here.
      // If GenSym contains renaming rules for all chains and all operations,
      // the newly generated chains already have proper IDs. In this example,
      // if the original file had chains A and B only, we get chains:
      //   A and B  - former A and B transformed as X,Y,Z (identity)
      //   C and D  - former A and B transformed as X-1/2,-Y+1/2,Z
      //   E and F  - former A and B transformed as -X,-Y,Z+1
      // ====================================================================
    
    


    void CMMDBManager::EulerRotation ( 
    PPCAtom  A, 
    int nA,
    realtype alpha,
    realtype beta,
    realtype gamma,
    realtype x0,
    realtype y0,
    realtype z0 )
    PURPOSE
    Euler rotation of coordinates.
    ARGUMENTS
    PPCAtom A
    Array of atoms to be rotated. This array may conveniently come from selection functions.

    int nA
    Number of atoms in array A. The array is indexed as 0..nA-1 .

    realtype alpha
    Euler angle of alpha-rotation (first rotation about original Z-axis), in radians.

    realtype beta
    Euler angle of beta-rotation (second rotation about new Y-axis), in radians.

    realtype gamma
    Euler angle of gamma-rotation (third rotation about newest Z-axis), in radians.

    realtype x0
    X-coordinate of the rotation center (orthogonal).

    realtype y0
    Y-coordinate of the rotation center (orthogonal).

    realtype z0
    Z-coordinate of the rotation center (orthogonal).

    DESCRIPTION

    The function performs the Euler rotation of atoms given in array A. First the atoms are rotated about original Z-axis through angle alpha, then about new Y-axis through angle beta, and finally about the newest Z-axis through angle gamma. The rotation center is given by point (x0,y0,z0).


    EXAMPLE 1

    Rotate all coordinate hierarchy through Euler angles of 90,180,45 degrees about the coordinate center:

    CMMDBManager  MMDB;
    PPCAtom       A;
    int           nA;
    
      //  reading the coordinate file
      . . . . . . . . . . . .
    
      MMDB.GetAtomTable  ( A,nA );
      MMDB.EulerRotation ( A,nA, Pi/2.0,Pi,Pi/4.0, 0.0,0.0,0.0 );
    


    EXAMPLE 2

    Rotate chain A through Euler angles of -30,90,60 degrees about its center of mass:

    CMMDBManager  MMDB;
    PPCAtom       A;
    int           nA,selHnd;
    realtype      xmc,ymc,zmc;
    
      //  reading the coordinate file
      . . . . . . . . . . . .
    
      selHnd = MMDB.NewSelection();
      MMDB.Select      ( selHnd,STYPE_ATOM,0,"A",ANY_RES,"*",ANY_RES,"*",
                         "*","*","*","*",SKEY_NEW );
      MMDB.GetSelIndex ( selHnd,A,nA );
    
      if (nA>0)  {
        MMDB.GetMassCenter ( A,nA, xmc,ymc,zmc );
        MMDB.EulerRotation ( A,nA, -Pi/6.0,Pi/2.0,Pi/3.0, xmc,ymc,zmc );
      }
    
      MMDB.DeleteSelection ( selHnd );
    


    int CMMDBManager::VectorRotation ( 
    PPCAtom  A, 
    int nA,
    realtype alpha,
    realtype vx,
    realtype vy,
    realtype vz,
    realtype x0,
    realtype y0,
    realtype z0 )
    PURPOSE
    Rotating coordinates about an arbitrary vector.
    ARGUMENTS
    PPCAtom A
    Array of atoms to be rotated. This array may conveniently come from selection functions.

    int nA
    Number of atoms in array A. The array is indexed as 0..nA-1 .

    realtype alpha
    rotation angle, in radians.

    realtype vx
    X-component of the rotation vector.

    realtype vy
    Y-component of the rotation vector.

    realtype vz
    Z-component of the rotation vector.

    realtype x0
    X-origin of the rotation vector.

    realtype y0
    Y-origin of the rotation vector.

    realtype z0
    Z-origin of the rotation vector.

    DESCRIPTION

    The function performs rotation of atoms given in array A about vector (vx,vy,vz) originating in point (x0,y0,z0). The rotation is done clockwise in the direction of the vector.

    The vector {(x0,y0,z0) -> (x0+vx,y0+vy,z0+vz)} specifies only the rotation axis, thus it may be of any non-zero length.


    EXAMPLE 1

    Rotate all coordinate hierarchy through angle of 90 degrees about axis forming angle of 45 degrees with X-axis in XY-plane:

    CMMDBManager  MMDB;
    PPCAtom       A;
    int           nA;
    
      //  reading the coordinate file
      . . . . . . . . . . . .
    
      MMDB.GetAtomTable   ( A,nA );
      MMDB.VectorRotation ( A,nA, Pi/2.0, 1.0,1.0,0.0, 0.0,0.0,0.0 );
    


    EXAMPLE 2

    Rotate chain A through angle of 90 degrees about vector connecting atoms A/33/CA[C] and A/34/CA[C]:

    CMMDBManager  MMDB;
    PPCAtom       A;
    int           nA,selHnd;
    PCAtom        A1,A2;
    realtype      vx,vy,vz;
    
      //  reading the coordinate file
      . . . . . . . . . . . .
    
      A1 = MMDB.GetAtom ( 1,"A",33,"","CA","C","" );
      if (!A1)  {
        printf ( " **** error: atom /1/A/33/CA[C] does not exist\n" );
        exit ( 1 );
      }
      A2 = MMDB.GetAtom ( "/1/A/34/CA[C]" );
      if (!A2)  {
        printf ( " **** error: atom /1/A/34/CA[C] does not exist\n" );
        exit ( 1 );
      }
    
      selHnd = MMDB.NewSelection();
      MMDB.Select      ( selHnd,STYPE_ATOM,0,"A",ANY_RES,"*",ANY_RES,"*",
                         "*","*","*","*",SKEY_NEW );
      MMDB.GetSelIndex ( selHnd,A,nA );
    
      if (nA>0)  {
        vx = A2->x - A1->x;
        vy = A2->y - A1->y;
        vz = A2->z - A1->z;
        MMDB.VectorRotation ( A,nA, Pi/2.0, vx,vy,vz, A1->x,A1->y,A1->z );
      }
    
      MMDB.DeleteSelection ( selHnd );
    



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_atom.html0000644000175100017510000030160707622702653015154 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Data class CAtom.

    Data class CAtom represents an atom in the coordinate hierarchy. As a special case, it may also represent a chain terminator - the equivalent of PDB TER card.

    CAtom contains all information, which is relevant to particular atom, and reference to residue that contains the atom. Each instance of the class may be represented by several PDB records - ATOM, HETATM, SIGATM, ANISOU, SIGUIJ or TER.

    Public Data Fields


    Function Purpose
    CAtom::CAtom Default constructor.
    CAtom::CAtom Add-to-residue constructor.
    CAtom::~CAtom The class' destructor.
    CAtom::GetModelNum Obtaining number of model containing the atom.
    CAtom::GetChainID Obtaining identifier of chain containing the atom.
    CAtom::GetResName Obtaining name of residue containing the atom.
    CAtom::GetSeqNum Obtaining sequence number of residue containing the atom.
    CAtom::GetInsCode Obtaining insertion code of residue containing the atom.
    CAtom::GetResidue Obtaining pointer on residue containing the atom.
    CAtom::GetChain Obtaining pointer on chain containing the atom.
    CAtom::GetModel Obtaining pointer on model containing the atom.
    CAtom::isInSelection Checking if atom is selected.
    CAtom::SetAtomName Setting the atom name.
    CAtom::SetElementName Setting the chamical element name.
    CAtom::MakeTer Converting atom into chain terminator.
    CAtom::SetCoordinates Setting coordinates, occupancy and temperature factor for the atom.
    CAtom::GetAtomID Obtaining a full atom's coordinate ID.
    CAtom::GetAtomIDfmt Obtaining a full, formatted atom's coordinate ID.
    CAtom::CheckID Checking the atom's ID by atom name, chemical element name and alternative location indicator.
    CAtom::CheckIDS Checking the atom's ID by coordinate ID.
    CAtom::Transform Transformation of atom coordinates with 3x3-matrix and 3-vector.
    CAtom::Transform Transformation of atom coordinates with 4x4-matrix.
    CAtom::isMetal Checking if the atom is identified as a metal.
    CAtom::PutUDData Storing an integer User-Defined Data (UDD) in the atom.
    CAtom::PutUDData Storing a real-type User-Defined Data (UDD) in the atom.
    CAtom::PutUDData Storing a string-type User-Defined Data (UDD) in the atom.
    CAtom::GetUDData Retrieving an integer User-Defined Data (UDD) from the atom.
    CAtom::GetUDData Retrieving a real-type User-Defined Data (UDD) from the atom.
    CAtom::GetUDData Retrieving a string-type User-Defined Data (UDD) from the atom, dynamic buffer.
    CAtom::GetUDData Retrieving a string-type User-Defined Data (UDD) from the atom, fixed-size buffer.
    CAtom::AddBond Adding an atom to the list of binded atoms.
    CAtom::GetNBonds Getting the total number of bonds set up for the atom.
    CAtom::FreeBonds Removing all bonds set up for the atom.
    CAtom::GetBonds Getting the list of indices of bonded atoms.
    CAtom::GetBonds Getting the dynamically-allocated list of bonded atoms.
    CAtom::GetBonds Getting the dynamically-allocated list of bonded atoms.
    CAtom::Copy Copying the atom contents.


    PUBLIC DATA FIELDS

    It is a good practice for any application not to modify the public fields directly if there are class' functions for doing that. Even better, avoid also direct reading them if the class provides functions for that, as the fields may be made protected in the future.

    Type Field Ok to
    Modify*
    Description
    int serNum N/R Atom's serial number as it appears in coordinate (PDB) file. Although the PDB standard requires all atoms to have unique serial numbers, increasing monotonically by one, the Library does not enforce this, unless the MMDBF_AutoSerials flag is not set prior reading the coordinate file (cf. function CMMDBManager::SetFlag. The serial numbers thus may be considered as free additional atom identifiers.
    int index N Atom's index in the Manager's global atom table. This table may be retrieved by function CMMDBManager::GetAtomTable.
    AtomName name N/R A PDB name of the atom, represented as null-terminated string. The name is aligned by spaces in accordance with PDB rules.
    AltLoc altLoc N/R The alternative location indicator, represented as null-terminated string. If there is no alternative location of the atom, altLoc is set to empty string "" rather than to space.
    PCResidue residue N,R Pointer on residue (class CResidue) containing the atom. If this pointer is NULL, it indicates a serious problem in the coordinate hierarchy, not yet a crash.
    realtype x,y,z YH x,y,z orthogonal coordinates of the atom, in angstroms; see interpretation of WhatIsSet field.
    realtype occupancy YH Occupancy factor of the atom; see interpretation of WhatIsSet field.
    realtype tempFactor YH Isotropic temperature factor; see interpretation of WhatIsSet field.
    SegID segID N/R Identifier of segment containing the atom represented as left-justified null-terimnated string.
    Element element N/R Atom's chemical element name represented as null-terminated string. The field is aligned with spaces in accordance with PDB rules. Note that old PDB files do not contain the element name. After reading such files, element represents a double-space null-terminated string.
    AtCharge charge N/R Charge on the atom represented as left-justified null-terminated string.
    realtype sigX,sigY,
    sigZ
    YH Standard deviations of the x,y,z coordinates; see interpretation of WhatIsSet field.
    realtype sigOcc YH Standard deviation of occupancy; see interpretation of WhatIsSet field.
    realtype sigTemp YH Standard deviation of temperature factor; see interpretation of WhatIsSet field.
    realtype u11,u22,
    u33,u12,
    u13,u23
    YH Anisotropic temperature factors; see interpretation of WhatIsSet field.
    realtype su11,su22,
    su33,su12,
    su13,su23
    YH Standard deviations of anisotropic temperature factors; see interpretation of WhatIsSet field.
    Boolean Het Y An indicator that the atom belongs to a non-standard residue. When Het is set to True, the corresponding PDB record is output with keyword HETATM rather than ATOM.
    Boolean Ter N/R An indicator that the atom class represents a chain terminator rather than a real atom. When Ter is set to True, the corresponding PDB record is output with keyword TER rather than ATOM or HETATM. Converting an atom into chain terminator is generally somewhat more than just toggling this field, therefore use function CAtom::MakeTer for this purpose.
    word WhatIsSet N/R A word of bit flags, indicating which fields have meaningful values. Many fields, such as standard deviations, have an optional character and may be missing in coordinate files. If this is the case, the corresponding bit in WhatIsSet is set to zero.

    Correspondingly, if an application modifies a field that is associated with one of the set flags below, that flag should be set on in WhatIsSet. Otherwise, the field is neglected at file output.

    Table of set flags:

    Flag name Meaning
    ASET_Coordinates x,y,z coordinates are set
    ASET_Occupancy atom occupancy is set
    ASET_tempFactor the temperature factor is set
    ASET_CoordSigma standard deviations for atom coordinates are set
    ASET_OccSigma standard deviation for occupancy is set
    ASET_tFacSigma standard deviation for temperature factor is set
    ASET_Anis_tFac anisotropic temperature factors are set
    ASET_Anis_tFSigma  standard deviations for anisotropic temperature factors are set
    *N: modification of the field by application may cause malfunction or crash;
    Y: the field may be modified by application;
    R: reading function is available;
    Y/H: the field may be modified by application however there are conditions;
    N/R: modification of the field is generally harmless but not recommended.


     CAtom::CAtom ( 
     )
    PURPOSE
    Default constructor.
    DESCRIPTION

    Default constructor creates an empty CAtom object. The object is not associated with any residue or coordinate hierarchy.

    NOTE : The atom should be stuffed with data (set up using the class' functions or copied from another atom) and added to a residue (unless it has a special use like temporary storage). Empty atom does not make any record in PDB output.


     CAtom::CAtom ( 
    PCResidue  res )
    PURPOSE
    Add-to-residue constructor.
    ARGUMENTS
    PCResidue res
    The residue that should be the atom's owner.

    DESCRIPTION

    The constructor creates an empty CAtom object and adds it to the specified residue. If the residue is associated with a coordinate hierarchy, the atom is automatically associated with it.

    NOTE 1: The atom should be stuffed with data (set up using the class' functions or copied from another atom). Empty atom does not make any record in PDB output.

    NOTE 2: Statement "new CAtom(NULL)" is equivalent to "new CAtom()".


     CAtom::~CAtom ( 
     )
    PURPOSE
    The class' destructor.
    DESCRIPTION

    The destructor is called implicitely whenever the class instance is deleted. If the atom is properly associated with the coordinate hierarchy, the destructor removes all references on the atom from the hierarchy.

    NOTE : Deleting an atom is an editing operation. If it is done by application explicitely, like in the following example:

        PCMMDBManager MMDB;
        PCAtom        atom;
          atom = MMDB->GetAtom ( "/1/A/33(SER).A/CA[C]" );
          delete atom;  // this is where the destructor is called!
        
    then the application must call CMMDBManager::FinishStructEdit function before using any results of such deletion(s).

    If the deletion is done implicitely by a Library function in the course of other action(s), there is no need for application to call CMMDBManager::FinishStructEdit after that.


    int CAtom::GetModelNum ( 
     )
    PURPOSE
    Obtaining number of model containing the atom.
    DESCRIPTION

    The function returns number of model that contains the atom. Models are numbered 1.. on. If atom is not properly associated with coordinate hierarchy, the function returns 0.


    pstr CAtom::GetChainID ( 
     )
    PURPOSE
    Obtaining identifier of chain containing the atom.
    DESCRIPTION

    The function returns identifier of chain that contains the atom. If the chain does not have an ID, the function returns empty string "". If atom is not properly associated with coordinate hierarchy, the function returns NULL.


    pstr CAtom::GetResName ( 
     )
    PURPOSE
    Obtaining name of residue containing the atom.
    DESCRIPTION

    The function returns name of residue that contains the atom. If atom is not properly associated with coordinate hierarchy, the function returns NULL.


    int CAtom::GetSeqNum ( 
     )
    PURPOSE
    Obtaining sequence number of residue containing the atom.
    DESCRIPTION

    The function returns sequence number of residue that contains the atom. If atom is not properly associated with coordinate hierarchy, the function returns ATOM_NoSeqNum.


    pstr CAtom::GetInsCode ( 
     )
    PURPOSE
    Obtaining insertion code of residue containing the atom.
    DESCRIPTION

    The function returns insertion code of residue that contains the atom. If the residue does not have insertion code, the function returns empty string "". If atom is not properly associated with coordinate hierarchy, the function returns NULL.


    PCResidue CAtom::GetResidue ( 
     )
    PURPOSE
    Obtaining pointer on residue containing the atom.
    DESCRIPTION

    The function returns pointer on residue that contains the atom. If atom is not properly associated with coordinate hierarchy, the function returns NULL.


    PCChain CAtom::GetChain ( 
     )
    PURPOSE
    Obtaining pointer on chain containing the atom.
    DESCRIPTION

    The function returns pointer on chain that contains the atom. If atom is not properly associated with coordinate hierarchy, the function returns NULL.


    PCModel CAtom::GetModel ( 
     )
    PURPOSE
    Obtaining pointer on model containing the atom.
    DESCRIPTION

    The function returns pointer on model that contains the atom. If atom is not properly associated with coordinate hierarchy, the function returns NULL.


    Boolean CAtom::isInSelection ( 
    int  selHnd )
    PURPOSE
    Checking if atom is selected.
    ARGUMENTS
    int selHnd
    Selection handle.

    DESCRIPTION

    The function returns True if atom is selected for the specified selection handle, and False otherwise.

    NOTE : The function returns False if atom is not properly associated with coordinate hierarchy.


    pstr CAtom::SetAtomName ( 
    AtomName  atomName )
    PURPOSE
    Setting the atom name.
    ARGUMENTS
    AtomName atomName
    The new atom name.

    DESCRIPTION

    This function assigns a new name to the atom, i.e. renames it.

    NOTE : The function does not align atom names. It is responsibility of application to check that the new atom name complies with PDB standard.


    pstr CAtom::SetElementName ( 
    Element  elName )
    PURPOSE
    Setting the chamical element name.
    ARGUMENTS
    Element elName
    The new chemical element name.

    DESCRIPTION

    This function assigns a new chemical element name to the atom, i.e. renames its chemical name.

    NOTE : The function does align the chemical element name to the right of 2-character field, if necessary. The function however does not check validity of the new name.


    void CAtom::MakeTer ( 
     )
    PURPOSE
    Converting atom into chain terminator.
    DESCRIPTION

    The function converts atom into chain terminator. Using this function is the only proper way of setting a terminator in the end of chain. An application should simply add an atom to chain and then convert it to chain terminator.


    void CAtom::SetCoordinates ( 
    realtype  xx, 
    realtype yy,
    realtype zz,
    realtype occ,
    realtype tFac )
    PURPOSE
    Setting coordinates, occupancy and temperature factor for the atom.
    ARGUMENTS
    realtype xx
    The x-coordinate of the atom, in angstroms.

    realtype yy
    The y-coordinate of the atom, in angstroms.

    realtype zz
    The z-coordinate of the atom, in angstroms.

    realtype occ
    The atom occupancy factor.

    realtype tFac
    The atom temperature factor.

    DESCRIPTION

    The function writes the values of x,y,z coordinates, occupancy and temperature factors into the corresponding class' fields, and set up the relevant bits in WhatIsSet word.


    pstr CAtom::GetAtomID ( 
    pstr  AtomID )
    PURPOSE
    Obtaining a full atom's coordinate ID.
    ARGUMENTS
    pstr AtomID
    A string to accept the atom's coordinate ID.

    DESCRIPTION

    The function calculates a full coordinate ID of the atom and returns it in the supplied string. The same string is returned as the function value.

    If atom is not properly associated with coordinate hierarchy, the coordinate ID will contain dashes "-" for those elements that could not be identified.

    NOTE : The function does not make any checks on the sufficiency of string buffer AtomID to accept the information. A value of 100 characters for the buffer length is recommended.


    pstr CAtom::GetAtomIDfmt ( 
    pstr  AtomID )
    PURPOSE
    Obtaining a full, formatted atom's coordinate ID.
    ARGUMENTS
    pstr AtomID
    A string to accept the atom's coordinate ID.

    DESCRIPTION

    The function is similar to CAtom::GetAtomID, but it produces CIDs aligned with spaces such that they look uniformly when output tablewise.

    The alignment is reached by giving all necessary space for the model number (depends on the total number of models present in the coordinate hierarchy, not less than 3 symbols for the sequence number and exactly 1, 3, 1, 4, 2 and 1 symbols for the chain ID, residue name, insertion code, atom name, chemical element name and alternative location indicator, respectively.

    If atom is not properly associated with coordinate hierarchy, the coordinate ID will contain dashes "-" for those elements that could not be identified. The number of dashes is chosen such that to suite the alignment criteria.

    NOTE : The function does not make any checks on the sufficiency of string buffer AtomID to accept the information. A value of 100 characters for the buffer length is recommended.


    int CAtom::CheckID ( 
    AtomName  aname, 
    Element elname,
    AltLoc aloc )
    PURPOSE
    Checking the atom's ID by atom name, chemical element name and alternative location indicator.
    ARGUMENTS
    AtomName aname
    The atom name. It may or may not be aligned (as in a PDB file), only first word of the name will be considered (thus "CA", " CA" and " CA B" are all considered as "CA"). aname may be set to NULL or to wildcard "*", then this parameter is ignored.

    Element elname
    The atom's chemical element code. This parameter will work only if the element code was set up for the atom (which may take place in the case of reading atoms from old PDB files that do not contain the chemical element names; or if the atom was created in a tricky way by application). elname should be used to distinguish between, e.g. "Ca" and "C_alpha". All spaces in elname are ignored. elname may be set to NULL (default), or to wildcard "*", then this parameter is ignored.

    AltLoc aloc
    The atom's alternative location indicator. If atom does not have alternative location, this is indicated by empty string ""(default). aloc may be set to NULL or to wildcard "*", then this parameter is ignored.

    DESCRIPTION

    The function returns 1 if the atom is identified by given atom name, chemical element and alternative location indicator, and 0 otherwise.

    The atom is considered as identified, if all non-NULL, non-wildcard parameters do match. If all parameters are set NULL or wildcard, any atom is identified. Default values for elname and aloc correspond to 'any element' and 'no alternative location indicator'.

    NOTE 1: The model serial number, chain ID, residue sequence number and insertion code are not taken into account by this function.

    NOTE 2: Comparison is case-sensitive. Consider that " " is not an empty string.


    int CAtom::CheckIDS ( 
    pstr  CID )
    PURPOSE
    Checking the atom's ID by coordinate ID.
    ARGUMENTS
    pstr CID
    The atom's coordinate ID. Only the part of coordinate ID containing atom name, chemical element name and alternative location indicator is taken into consideration.

    DESCRIPTION

    The function returns 1 if the atom is identified by atom name, chemical element and alternative location indicator found in the provided coordinate ID, and 0 otherwise.

    The atom is considered as identified, if all identifying items in the provided coordinate ID do match those of atom. If all coordinate ID items are set to wildcards "*", any atom is identified.

    NOTE 1: The model serial number, chain ID, residue sequence number and insertion code are not taken into account by this function.

    NOTE 2: Comparison is case-sensitive. Any spaces in the coordinate ID are ignored.

    NOTE 3: This function allows for coordinate ID containing only atom name, e.g. "CA", without accompanying square brackets or colon, as is generally required by the coordinate ID syntax.


    void CAtom::Transform ( 
    mat33 &  m, 
    vect3 & v )
    PURPOSE
    Transformation of atom coordinates with 3x3-matrix and 3-vector.
    ARGUMENTS
    mat33 & m
    The transformation matrix.

    vect3 & v
    The translation vector.

    DESCRIPTION

    The function performs the following transformation of atom's x,y,z coordinates:

          x := m[0][0]*x + m[0][1]*y + m[0][2]*z + v[0]
          y := m[1][0]*x + m[1][1]*y + m[1][2]*z + v[1]
          z := m[2][0]*x + m[2][1]*y + m[2][2]*z + v[2]
        


    void CAtom::Transform ( 
    mat44 &  m )
    PURPOSE
    Transformation of atom coordinates with 4x4-matrix.
    ARGUMENTS
    mat44 & m
    The transformation matrix.

    DESCRIPTION

    The function performs the following transformation of atom's x,y,z coordinates:

          x := m[0][0]*x + m[0][1]*y + m[0][2]*z + m[0][3]
          y := m[1][0]*x + m[1][1]*y + m[1][2]*z + m[1][3]
          z := m[2][0]*x + m[2][1]*y + m[2][2]*z + m[2][3]
        


    Boolean CAtom::isMetal ( 
     )
    PURPOSE
    Checking if the atom is identified as a metal.
    DESCRIPTION

    The function returns True if the atom is identified as a metal.


    int CAtom::PutUDData ( 
    int  UDDhandle, 
    int iudd )
    PURPOSE
    Storing an integer User-Defined Data (UDD) in the atom.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int iudd
    The integer number to be stored in the atom.

    DESCRIPTION

    The function stores an integer contained in iudd in the atom, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully stored
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the atom, the data was not stored
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in atoms, the data was not stored


    int CAtom::PutUDData ( 
    int  UDDhandle, 
    realtype rudd )
    PURPOSE
    Storing a real-type User-Defined Data (UDD) in the atom.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    realtype rudd
    The real number to be stored in the atom.

    DESCRIPTION

    The function stores the real number contained in rudd in the atom, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CAtom::PutUDData, see returns there.


    int CAtom::PutUDData ( 
    int  UDDhandle, 
    pstr sudd )
    PURPOSE
    Storing a string-type User-Defined Data (UDD) in the atom.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    The string to be stored in the atom.

    DESCRIPTION

    The function stores the string pointed by sudd in the atom, associating it with UDD handle UDDhandle. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The function is conceptually identical to CAtom::PutUDData, see returns there.


    int CAtom::GetUDData ( 
    int  UDDhandle, 
    int & iudd )
    PURPOSE
    Retrieving an integer User-Defined Data (UDD) from the atom.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    int & iudd
    The buffer to accept the integer data.

    DESCRIPTION

    The function retrieves an integer previously stored in the atom by function CAtom::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDInteger in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in iudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the atom. iudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the atom. iudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in atoms. iudd does not change.


    int CAtom::GetUDData ( 
    int  UDDhandle, 
    real & rudd )
    PURPOSE
    Retrieving a real-type User-Defined Data (UDD) from the atom.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    real & rudd
    The buffer to accept the real-type data.

    DESCRIPTION

    The function retrieves a real number previously stored in the atom by function CAtom::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDReal in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The data is returned in rudd.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the atom. rudd returns zero.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the atom. rudd returns zero.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in atoms. rudd does not change.


    int CAtom::GetUDData ( 
    int  UDDhandle, 
    pstr & sudd )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the atom, dynamic buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr & sudd
    A pointer to dynamically-allocated string accepting the data.

    DESCRIPTION

    The function retrieves a string previously stored in the atom by function CAtom::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd. If sudd was not set to NULL, it will be deallocated first. The string is allocated within the function, and it is responsibility of the application to eventually deallocate it.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the atom. sudd returns NULL.
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the atom. sudd returns NULL.
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in atoms. sudd does not change.


    int CAtom::GetUDData ( 
    int  UDDhandle, 
    pstr sudd,
    int maxlen )
    PURPOSE
    Retrieving a string-type User-Defined Data (UDD) from the atom, fixed-size buffer.
    ARGUMENTS
    int UDDhandle
    The UDD handle.

    pstr sudd
    A pointer to a string accepting the data.

    int maxlen
    A maximal number of characters, including the terminating NULL that sudd may to accept (not more than the physical length of sudd).

    DESCRIPTION

    The function retrieves a string previously stored in the atom by function CAtom::PutUDData. The UDD handle UDDhandle identifies the data. The handle must be previously obtained from CMMDBManager::RegisterUDString in the course of UDD registration or from CMMDBManager::GetUDDHandle after the registration has been done.

    The string is returned in buffer pointed by sudd, with no more than maxlen symbols, including the terminating NULL returned. The string sudd is not allocated or deallocated within the function.


    RETURN

    The function may return:
    Return Description
    UDDATA_Ok the data has been successfully retrieved.
    UDDATA_NoData no data found for the handle UDDhandle in the atom. sudd returns empty string "".
    UDDATA_WrongHandle    the UDD handle UDDhandle does not correspond to any registered UDD for the atom. sudd returns empty string "".
    UDDATA_WrongUDRType    the UDD handle UDDhandle was not registered for use in atoms. sudd does not change.


    int CAtom::AddBond ( 
    PCAtom  bond_atom, 
    int bond_order,
    int nAdd_bonds )
    PURPOSE
    Adding an atom to the list of binded atoms.
    ARGUMENTS
    PCAtom bond_atom
    The atom that should be considered as bonded to "this one". Both atoms must be belong to the same coordinate hierarchy, which essentially means that application may establish bond relations only between atoms, whose pointers were obtained from CMMDBManager (or from CModel/CChain/CResidue contained in CMMDBManager).

    int bond_order
    The bond order. Although an arbitrary integer < 256 may be employed, use of MMDB's constants BOND_SINGLE, BOND_DOUBLE, BOND_AROMATIC and BOND_TRIPLE is recommended.

    int nAdd_bonds
    The number of memory units to be reserved (not less than 1) additionally in the case the atom's bond memory is exchausted. Setting this parameter to a value greater than 1 deacreases the number of memory reallocations, which results in a better performance and a possible waste of RAM. Ideally, this parameter should be set to the number of atom's bonds if that is known a priori. This parameter has default setting of 1.

    DESCRIPTION

    The function adds pointer on the bond_atom and bond order characteristics bond_order to the atom's list of bonds.


    RETURN

    The function returns a positive (>0) number of total bonds for the atom in the case of successful completion. A zero or negative return means that the atom has already been added into the list of bonds and if found there at position -return.

    NOTE : Setting bond_atom bonded to "this" atom does not imply that "this" atom is automatically bonded to bond_atom. The application should take care of setting symmetrical bonds if necessary.


    int CAtom::GetNBonds ( 
     )
    PURPOSE
    Getting the total number of bonds set up for the atom.
    DESCRIPTION

    The function returns the total number of bonds set up for the atom by function CAtom::AddBond.


    void CAtom::FreeBonds ( 
     )
    PURPOSE
    Removing all bonds set up for the atom.
    DESCRIPTION

    The function removes all bonds set up for the atom by function CAtom::AddBond.


    void CAtom::GetBonds ( 
    RPSAtomBondI  AtomBondI, 
    int & nAtomBonds )
    PURPOSE
    Getting the list of indices of bonded atoms.
    ARGUMENTS
    RPSAtomBondI AtomBondI
    A pointer to the list of indices of bonded atoms.

    int & nAtomBonds
    Returns the total number of bonds set up for the atom by function CAtom::AddBond.

    DESCRIPTION

    The function returns the list of indices of bonded atoms. Each item is represented by SAtomBondI structure:

    struct SAtomBondI  {
      int  index;  // bonded atom index
      byte order;  // bond order
    }
    
    where index is the absolute position of atom in coordinate hierarchy plus one. In an ideal PDB file, index is equal to the atom's serial number, however in MMDB these generally do not coincide.

    If no bonds were set for the atom, the function returns AtomBondI=NULL and nAtomBonds=0.

    NOTE : The application must not attempt to deallocate or alterate AtomBondI obtained from this function. Violation of this will eventually cause a crash.


    void CAtom::GetBonds ( 
    RPSAtomBond  AtomBond, 
    int & nAtomBonds )
    PURPOSE
    Getting the dynamically-allocated list of bonded atoms.
    ARGUMENTS
    RPSAtomBond AtomBond
    A pointer to the dynamically-allocated list of bonded atoms.

    int & nAtomBonds
    Returns the total number of bonds set up for the atom by function CAtom::AddBond.

    DESCRIPTION

    The function returns the list of bonded atoms. Each item is represented by SAtomBond structure:

    struct SAtomBond  {
      PCAtom atom;  // bonded atom pointer
      byte  order;  // bond order
    }
    
    If AtomBond was not set to NULL before calling this function, the latter will first try to deallocate it. The list of atoms is then allocated in memory, and filled up with atom pointers retrieved from coordinate hierarchy.

    If no bonds were set for the atom, the function returns AtomBond=NULL and nAtomBonds=0.

    NOTE : It is responsibility of the application to deallocate AtomBond obtained from this function.


    void CAtom::GetBonds ( 
    PSAtomBond  AtomBond, 
    int & nAtomBonds,
    int maxlength )
    PURPOSE
    Getting the dynamically-allocated list of bonded atoms.
    ARGUMENTS
    PSAtomBond AtomBond
    A vector of SAtomBond structures to accept the bond data.

    int & nAtomBonds
    Returns the total number of bonds set up for the atom by function CAtom::AddBond.

    int maxlength
    The length of vector AtomBond.

    DESCRIPTION

    The function returns the list of bonded atoms (no more than maxlength first items) in the vector AtomBond allocated by the application. The structure SAtomBond is defined as follows:

    struct SAtomBond  {
      PCAtom atom;  // bonded atom pointer
      byte  order;  // bond order
    }
    

    If no bonds were set for the atom, the function returns nAtomBonds=0.

    NOTE : It is responsibility of the application to allocate and deallocate vector AtomBond.


    void CAtom::Copy ( 
    PCAtom  atom )
    PURPOSE
    Copying the atom contents.
    ARGUMENTS
    PCAtom atom
    The source atom, whose contents is to be copied.

    DESCRIPTION

    The function copies the content of atom atom into internal class' fields. The function does not copy the residue pointer. As a result, a new atom is created that is identical to the source one, but physically they do not overlap.

    NOTE : An application should never copy contents of classes by direct assignment; in most cases this will result in crash because of inducing a mess in cross-references. See the following example:

          PCAtom a1,a2;
          a1 = new CAtom();
          a2 = new CAtom();
          a2->SetCoordinates ( 1.0,2.0,3.0,1.0,1.0 );
          
          *a1 = *a2;  // never do this!
          
          // the right way:
          a1->Copy ( a2 );
        
    Function Copy is supplied for all classes in the Library.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_misc.html0000644000175100017510000006037307504104422015136 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Initialization, Memory Allocation and Miscellaneous Functions.

    On most systems, the Library does not need any special initialization. Some (hopefully obsolete) C++ environments however fail to initialize static variables. All vital static variables in the Library may be forcefully initialized by calling function InitMatType.

    It is important to keep in mind that through the Library, a pointer is considered as allocated unless it has value "NULL". The Library may attempt to deallocate any pointer which is not set "NULL". If a pointer was obtained from a Library function, the Library normally is responsible for deallocation of it (exceptions from this rule are mentioned wherever necessary); therefore the application should not attempt to change such pointer in any way. If an allocated pointer was given to a Library function and is then returned as a result, it may appear reallocated or even deallocated - check remarks for that Library function.

    Finally, the Library provides various tools for working with dynamically allocated objects such as vectors and matrices. Using them is encouraged, although is not mandatory.

    Function Purpose
    InitMatType Initialization of static variables.
    GetVectorMemory Allocating a vector object.
    FreeVectorMemory Deallocating a vector object.
    GetMatrixMemory Allocating a matrix object.
    FreeMatrixMemory Deallocating a matrix object.
    GetMatrix3Memory Allocating a 3D matrix object.
    FreeMatrix3Memory Deallocating a 3D matrix object.


    Boolean InitMatType ( 
     )
    PURPOSE
    Initialization of static variables.
    DESCRIPTION

    This function performs initialization of vital data kept in Library's static fields. Using it is necessary only in certain C++ environments, which fail to perform the initialization automatically. It is absolutely cheap and completely harmless to call this function multiple times, however an application needs to call it only once from the application's top.


    RETURN

    The function always returns True, there is no need to check on it.


    Boolean GetVectorMemory ( 
    vectortype &  V, 
    word N,
    word Shift )
    PURPOSE
    Allocating a vector object.
    ARGUMENTS
    vectortype & V
    A vector object. Overloaded instances of this function work with real vectors (type rvector), integer vectors (ivector), word vectors (wvector), byte and logical vectors (bvector), long integer vectors (lvector) and character string vectors (psvector). See definition of these types in Mathematical Types.

    word N
    Required length of the vector.

    word Shift
    Requred offset of the vector. This parameter has default value of 1.

    DESCRIPTION

    The function allocates N elements of type *V, shifts them according to the value of Shift and returns as allocated vector V. As a result, the vector elements are accessible as V[i] where i ranges as [Shift ... Shift+N-1].


    RETURN

    The function returns True if memory was successfully allocated, and False otherwise. If allocation fails, V returns NULL.

    NOTE 1: This function does not check if V was previously allocated and does not try to deallocate it. It is responsibility of the application to deallocate V prior calling GetVectorMemory, if necessary.

    NOTE 2: This function does not initialize the allocated memory.


    void FreeVectorMemory ( 
    vectortype &  V, 
    word Shift )
    PURPOSE
    Deallocating a vector object.
    ARGUMENTS
    vectortype & V
    A vector object. Overloaded instances of this function work with real vectors (type rvector), integer vectors (ivector), word vectors (wvector), byte and logical vectors (bvector), long integer vectors (lvector) and character string vectors (psvector). See definition of these types in Mathematical Types.

    word Shift
    Offset of the vector that was used at allocation. This parameter has default value of 1.

    DESCRIPTION

    The function checks if vector V was allocated, and if it was, deallocates it. V always returns NULL.

    NOTE 1: The value of Shift must be the same as that used at allocation of the vector. If this condition does not hold, the application may crash in unpredictable place.

    NOTE 2: It is perfectly Ok to give V=NULL to this function.


    Boolean GetMatrixMemory ( 
    matrixtype &  A, 
    word N,
    word M,
    word ShiftN,
    word ShiftM )
    PURPOSE
    Allocating a matrix object.
    ARGUMENTS
    matrixtype & A
    A matrix object. Overloaded instances of this function work with real matrices (type rmatrix), integer matrices (imatrix), word matrices (wmatrix), byte and logical matrices (bmatrix), long integer matrices (lmatrix) and character string matrices (psmatrix). See definition of these types in Mathematical Types.

    word N
    Required "vertical" (first-index) dimension of the matrix.

    word M
    Required "horizontal" (second-index) dimension of the matrix.

    word ShiftN
    Requred "vertical" (first-index) offset of the matrix. This parameter has default value of 1.

    word ShiftM
    Requred "horizontal" (second-index) offset of the matrix. This parameter has default value of 1.

    DESCRIPTION

    The function returns matrix A allocated as N elements of type *A, shifted by the value of ShiftN, each of them allocated as vectors of length M with offset ShiftM. As a result, the matrix' elements are accessible as A[i][j] where index i ranges as [ShiftN ... ShiftN+N-1] and index j - as [ShiftM ... ShiftM+M-1].


    RETURN

    The function returns True if memory was successfully allocated, and False otherwise. If allocation fails, A returns NULL.

    NOTE 1: This function does not check if A was previously allocated and does not try to deallocate it. It is responsibility of the application to deallocate A prior calling GetMatrixMemory, if necessary.

    NOTE 2: This function does not initialize the allocated memory.


    void FreeMatrixMemory ( 
    matrixtype &  A, 
    word N,
    word ShiftN,
    word ShiftM )
    PURPOSE
    Deallocating a matrix object.
    ARGUMENTS
    matrixtype & A
    A matrix object. Overloaded instances of this function work with real matrices (type rmatrix), integer matrices (imatrix), word matrices (wmatrix), byte and logical matrices (bmatrix), long integer matrices (lmatrix) and character string matrices (psmatrix). See definition of these types in Mathematical Types.

    word N
    The "vertical" (first-index) dimension, used at allocation of the matrix.

    word ShiftN
    The "vertical" (first-index) offset, used at allocation of the matrix. This parameter has default value of 1.

    word ShiftM
    The "horizontal" (second-index) offset, used at allocation of of the matrix. This parameter has default value of 1.

    DESCRIPTION

    The function checks if matrix A was allocated, and if it was, deallocates it. A always returns NULL.

    NOTE 1: The values of N, ShiftN and ShiftM must be same as those used at allocation of the matrix. If this condition does not hold, the application may crash in unpredictable place.

    NOTE 2: It is perfectly Ok to give A=NULL to this function.


    Boolean GetMatrix3Memory ( 
    matrix3type &  A, 
    word N,
    word M,
    word K,
    word ShiftN,
    word ShiftM,
    word ShiftK )
    PURPOSE
    Allocating a 3D matrix object.
    ARGUMENTS
    matrix3type & A
    A 3D matrix object. Overloaded instances of this function work with real 3D matrices (type rmatrix3), integer 3D matrices (imatrix3), word 3D matrices (wmatrix3), byte and logical 3D matrices (bmatrix3), long integer 3D matrices (lmatrix3) and character string 3D matrices (psmatrix3). See definition of these types in Mathematical Types.

    word N
    Required "vertical" (first-index) dimension of the matrix.

    word M
    Required "horizontal" (second-index) dimension of the matrix.

    word K
    Required "depth" (third-index) dimension of the matrix.

    word ShiftN
    Requred "vertical" (first-index) offset of the matrix. This parameter has default value of 1.

    word ShiftM
    Requred "horizontal" (second-index) offset of the matrix. This parameter has default value of 1.

    word ShiftK
    Requred "depth" (third-index) offset of the matrix. This parameter has default value of 1.

    DESCRIPTION

    The function returns 3D matrix A allocated as N elements of type *A, shifted by the value of ShiftN, each of them allocated as matrices of "vertical" dimension/offset M/ShiftM and "horizontal" dimension/offset K/ShiftK. As a result, the matrix' elements are accessible as A[i][j][k] where index i ranges as [ShiftN ... ShiftN+N-1], index j - as [ShiftM ... ShiftM+M-1] and index k - as [ShiftK ... ShiftK+K-1].


    RETURN

    The function returns True if memory was successfully allocated, and False otherwise. If allocation fails, A returns NULL.

    NOTE 1: This function does not check if A was previously allocated and does not try to deallocate it. It is responsibility of the application to deallocate A prior calling GetMatrix3Memory, if necessary.

    NOTE 2: This function does not initialize the allocated memory.


    void FreeMatrix3Memory ( 
    matrix3type &  A, 
    word N,
    word M,
    word ShiftN,
    word ShiftM,
    word ShiftK )
    PURPOSE
    Deallocating a 3D matrix object.
    ARGUMENTS
    matrix3type & A
    A matrix object. Overloaded instances of this function work with real matrices (type rmatrix3), integer matrices (imatrix3), word matrices (wmatrix3), byte and logical matrices (bmatrix3), long integer matrices (lmatrix3) and character string matrices (psmatrix3). See definition of these types in Mathematical Types.

    word N
    The "vertical" (first-index) dimension, used at allocation of the matrix.

    word M
    The "horizontal" (second-index) dimension, used at allocation of the matrix.

    word ShiftN
    The "vertical" (first-index) offset, used at allocation of the matrix. This parameter has default value of 1.

    word ShiftM
    The "horizontal" (second-index) offset, used at allocation of of the matrix. This parameter has default value of 1.

    word ShiftK
    The "depth" (third-index) offset, used at allocation of of the matrix. This parameter has default value of 1.

    DESCRIPTION

    The function checks if 3D matrix A was allocated, and if it was, deallocates it. A always returns NULL.

    NOTE 1: The values of N, M, ShiftN, ShiftM and ShiftK must be same as those used at allocation of the matrix. If this condition does not hold, the application may crash in unpredictable place.

    NOTE 2: It is perfectly Ok to give A=NULL to this function.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_edit.html0000644000175100017510000011125707504104474015135 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Editing the coordinate hierarchy.

    The Library allows for editing the coordinate hierarchy, that is, deletion and insertion of models, chains, residues or atoms. Editing operations change internal references between the elements of coordinate hierarchy and are therefore sensitive to program errors. An application may perform editing operations only by means provided by the Library.

    In order to save computation time on calculations of all internal references after every editing operation, the Library, instead, provides a special function CMMDBManager::FinishStructEdit for such calculations, which must be called after all editing operations are done. It is important to keep in mind that a set of editing operations is not complete until this function is activated. From the other hand, CMMDBManager::FinishStructEdit is not a "commit" function and therefore applying any editing operation already means a change.

    The following two examples demonstrate two (and these are not the only two) alternative, perhaps equally efficient, ways of deletion of all oxygen atoms from the coordinate hierarchy:

    Example 1: using internal tables
    CMMDBManager MMDB;
    int          RC, im,ic,ir;
    int          nModels,nChains,nResidues;
    PPCModel     model;
    PPCChain     chain;
    PPCResidue   res;
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      //  get table of models
      MMDB.GetModelTable ( model,nModels );
    
      //  loop over all models
      for (im=0;im<nModels;im++)
        if (model[im])  {
          //  get chain table of im-th model
          model[im]->GetChainTable ( chain,nChains );
          //  loop over all chains:
          for (ic=0;ic<nChains;ic++)
            if (chain[ic])  {
              // get residue table for current chain:
              chain[ic]->GetResidueTable ( res,nResidues );
              // loop over all residues in current chain:
              for (ir=0;ir<nResidues;ir++)
                // delete all oxygens in the residue
                if (res[ir])  res[ir]->DeleteAtom ( "*","O","*" );
            }
        }
    
      //  update internal references; all tables above become
      //  invalid.
      MMDB.FinishStructEdit();
    
    

    Example 2: using atom selection
    CMMDBManager MMDB;
    int          RC, i;
    int          nAtoms;
    int          selHnd;
    PPCAtom      atom;
    
      // read coordinate file
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        .. checking for errors
        exit(1);
      }
    
      //  get new selection handle
      selHnd = MMDB.NewSelection();
    
      //  select all oxygens
      MMDB.Select ( selHnd,STYPE_ATOM,0,"*",
                    ANY_RES,"*",ANY_RES,"*",
                    "*","*","O","*",SKEY_NEW );
    
      //  get selected set of atoms
      MMDB.GetSelIndex ( selHnd,atom,nAtoms );
    
      //  deletion loop over all selected atoms.
      //  NOTE that the atom array itself must
      //  be neither deleted nor changed!
      for (i=0;i<nAtoms;i++)
        delete atom[i];
    
      //  update internal references
      MMDB.FinishStructEdit();
    
    

     

    Function Purpose
    CMMDBManager::PDBCleanup Adjusting the coordinate hierarchy to the PDB format.
    CMMDBManager::FinishStructEdit Making internal references after editing operations.
    CMMDBManager::DeleteModel Deleting a model from coordinate hierarchy by model number.
    CMMDBManager::DeleteModel Deleting a model from coordinate hierarchy by coordinate ID.
    CMMDBManager::DeleteAllModels Deleting all models from coordinate hierarchy.
    CMMDBManager::DeleteSelObjects Deleting selected objects.
    CMMDBManager::AddModel Adding a model on the top of coordinate hierarchy.
    CMMDBManager::InsModel Inserting a model into the coordinate hierarchy.
    CMMDBManager::RotateModels Rearranging (rotating) models in the coordinate hierarchy.
    CMMDBManager::SwapModels Rearranging (swapping) models in the coordinate hierarchy.


    word CMMDBManager::PDBCleanup ( 
    word  CleanKey )
    PURPOSE
    Adjusting the coordinate hierarchy to the PDB format.
    ARGUMENTS
    word CleanKey
    A bitwise flag indicating which pieces of information should be adjusted to the PDB standard. It may be any combination (bitwise OR) of the following flags:

    Flag Name Value   Description
    PDBCLEAN_ATNAME 0x00000001   Pads atom names with spaces to form the PDB 4-character names
    PDBCLEAN_TER 0x00000002   Inserts TER records in the end of each chain
    PDBCLEAN_CHAIN 0x00000004   Generates 1-character chain IDs for chains having many-character IDs
    PDBCLEAN_CHAIN_STRONG 0x00000008   Renames all the chains such that all the chains have 1-character IDs starting from 'A' for the first chain. Even 1-character chain IDs are renamed if chains are not named incrementally starting from 'A'.
    PDBCLEAN_ALTCODE 0x00000010   Generates 1-character alternative location indicators for atoms having many-character alternative location IDs
    PDBCLEAN_ALTCODE_STRONG 0x00000020   Renames all alternative location indicators such that all of them are of 1-character length starting from 'A'. Even 1-character indicators are renamed if they are not named incrementally starting from 'A'.
    PDBCLEAN_SERIAL 0x00000040   Generates new serial numbers of atoms incrementally-by-one starting from 1.
    PDBCLEAN_SEQNUM 0x00000080   Generates new sequence numbers for residues such that they go incrementally-by-one starting from 1 without insertion codes.
    PDBCLEAN_CHAIN_ORDER 0x00000100   Rearranges chains in order of atoms' serial numbers.
    PDBCLEAN_SOLVENT 0x00000200   Identifies chains consisting only of solvent molecules, and puts them in the end of models. Solvent molecules are those named ADE, CYT, GUA, INO, THY, URA, WAT, HOH, TIP, H2O, DOD or MOH.
    PDBCLEAN_INDEX 0x00000400   Rearranges atoms in the internal table of atoms such that they follow precisely the order given by the model/chain/residue hierarchy. This flag may be used after adding or inserting atoms into residues (see the corresponding functions).


    DESCRIPTION

    The function should be used after operations that may result in violation of PDB standards, if the information is to be output into a PDB file. For example, insertion or deletion of atoms will create gaps in atoms' serial numbers, symmetry operations will assign many-character chain names to newly generated chains and so on. Checking for compliency with PDB rules is not implemented as a part of such operations in order to keep the computational costs down. PDBCleanup does not have to be called after each such operation. Probably a good style would be to call it once before writing the PDB file, if necessary.


    RETURN

    The function returns 0 after successful operation. A non-zero return should be considered as a bitwise message:

    Return Bit Description
    PDBCLEAN_CHAIN there are too many chains to generate 1-character chain IDs
    PDBCLEAN_ATNAME there is no element names (as read from a coordinate file or otherwise set up for all atoms) to generate 4-character PDB atom names
    PDBCLEAN_ALTCODE there are too many alternative locations to generate 1-character alternative location indicators


    void CMMDBManager::FinishStructEdit ( 
     )
    PURPOSE
    Making internal references after editing operations.
    DESCRIPTION

    The function checks the coordinate hierarchy for new and deleted items and makes new internal reference tables. The function must be called after all editing operations (insertion/deletion) are complete. There is no limit on the number of editing operations between calls to this function.

    NOTE 1: An edited coordinate hierarchy is not usable if CMMDBManager::FinishStructEdit is not called after editing. Violation of this rule will cause memory fault in most cases.

    NOTE 2: After the function returns, the previous tables of atoms, residues, chains and models become invalid. The function may change the number of atoms, residues etc. on all levels of coordinate hierarchy. The function also changes CAtom::index fields.


    int CMMDBManager::DeleteModel ( 
    int  modelNum )
    PURPOSE
    Deleting a model from coordinate hierarchy by model number.
    ARGUMENTS
    int modelNum
    Model's serial number. The models are numbered as 1..NumberOfModels, where NumberOfModels is returned by CMMDBManager::GetNumberOfModels.

    DESCRIPTION

    The function deletes the specified model from coordinate hierarchy. The model and all chains, residues and atoms contained in it, are disposed.


    RETURN

    The function returns 1 if the model was deleted, and 0 if model with specified serial number was not found.

    NOTE : An application must call CMMDBManager::FinishStructEdit in order to validate the deletion.


    int CMMDBManager::DeleteModel ( 
    pstr  CID )
    PURPOSE
    Deleting a model from coordinate hierarchy by coordinate ID.
    ARGUMENTS
    pstr CID
    Model's coordinate ID.

    DESCRIPTION

    The function deletes the model found in the provided coordinate ID from coordinate hierarchy. The model and all chains, residues and atoms contained in it, are disposed.


    RETURN

    The function returns 1 if the model was deleted, and 0 if model with serial number as found from the provided coordinate ID was not found.

    NOTE : An application must call CMMDBManager::FinishStructEdit in order to validate the deletion.


    int CMMDBManager::DeleteAllModels ( 
     )
    PURPOSE
    Deleting all models from coordinate hierarchy.
    DESCRIPTION

    The function deletes all model from coordinate hierarchy. All models, chains, residues and atoms contained in the hierarchy, are disposed.


    RETURN

    The function returns the number of deleted models.

    NOTE : As an exception, an application does not have to call CMMDBManager::FinishStructEdit in order to validate the deletion after this function. However, such a call would be completely harmless.


    void CMMDBManager::DeleteSelObjects ( 
    int  selHnd )
    PURPOSE
    Deleting selected objects.
    ARGUMENTS
    int selHnd
    The selection handle.

    DESCRIPTION

    The function deletes all selected objects associated with the given selection handle. The type of selected object is unambiguously defined by the handle. See more details about selection toold in Selection functions.

    NOTE : An application must call CMMDBManager::FinishStructEdit in order to validate the deletion.


    int CMMDBManager::AddModel ( 
    PCModel  model )
    PURPOSE
    Adding a model on the top of coordinate hierarchy.
    ARGUMENTS
    PCModel model
    Model that should be added. The model must be associated with a coordinate hierarchy.

    DESCRIPTION

    The function adds the specified model on the top of coordinate hierarchy. All chains, residues and atoms contained in the model, are physically copied into the hierarchy. The model may belong to the same hierarchy, in which case it will be duplicated.


    RETURN

    The function returns the resulting number of models, which is the serial number of the model added.

    NOTE 1: The model must be associated with a coordinate hierarchy. It may be retrieved from that hierarchy by calling CMMDBManager::GetModel.

    NOTE 2: The function does change the models' serial numbers so that they are always incremental-by-one in PDB file. However, the function does not change the serial numbers of atoms. They may be put into proper order by calling the CMMDBManager::PDBCleanup with input flag PDBCLEAN_SERIAL.

    NOTE 3: As an exception, an application does not have to call CMMDBManager::FinishStructEdit in order to validate the addition. However, such a call would be completely harmless.


    int CMMDBManager::InsModel ( 
    PCModel  model, 
    int modelNo )
    PURPOSE
    Inserting a model into the coordinate hierarchy.
    ARGUMENTS
    PCModel model
    Model that should be added. The model must be associated with a coordinate hierarchy.

    int modelNo
    The number of model, before which the new model should be inserted.

    DESCRIPTION

    The function inserts the specified model on the modelNo-th position in the coordinate hierarchy. All chains, residues and atoms contained in the model, are physically copied into the hierarchy. The model may belong to the same hierarchy, in which case it will be duplicated.
    The model is assigned the serial number modelNo, the former modelNo-th model gets the serial number modelNo+1, and serial numbers of all models greater than modelNo are increased by 1.


    RETURN

    The function returns the resulting number of models.

    NOTE 1: The model must be associated with a coordinate hierarchy. It may be retrieved from that hierarchy by calling CMMDBManager::GetModel.

    NOTE 2: The function does change the models' serial numbers so that they are always incremental-by-one in PDB file. However, the function does not change the serial numbers of atoms. They may be put into proper order by calling the CMMDBManager::PDBCleanup with input flag PDBCLEAN_SERIAL.

    NOTE 3: As an exception, an application does not have to call CMMDBManager::FinishStructEdit in order to validate the insertion. However, such a call would be completely harmless.


    void CMMDBManager::RotateModels ( 
    int  modelNo1, 
    int modelNo2,
    int rotdir )
    PURPOSE
    Rearranging (rotating) models in the coordinate hierarchy.
    ARGUMENTS
    int modelNo1
    Starting model serial number.

    int modelNo2
    Ending model serial number

    int rotdir
    Direction of the rotation

    DESCRIPTION

    The function rearranges model in the coordinate hierarchy by cyclically shifting them. The shift is performed on models with serial numbers ranging from modelNo1 to modelNo2 in the direction specified by rotdir.
    If rotdir is positive, the models are shifted to the left, with modelNo1-th model replaced by modelNo2-th.
    If rotdir is negative, the models are shifted to the right, with modelNo2-th model replaced by modelNo1-th.

    NOTE 1: The function does change the models' serial numbers so that they are always incremental-by-one in PDB file. However, the function does not change the serial numbers of atoms. They may be put into proper order by calling the CMMDBManager::PDBCleanup with input flag PDBCLEAN_SERIAL.

    NOTE 2: As an exception, an application does not have to call CMMDBManager::FinishStructEdit in order to validate the insertion. However, such a call would be completely harmless.


    void CMMDBManager::SwapModels ( 
    int  modelNo1, 
    int modelNo2 )
    PURPOSE
    Rearranging (swapping) models in the coordinate hierarchy.
    ARGUMENTS
    int modelNo1
    First swapping model serial number.

    int modelNo2
    Second swapping model serial number

    DESCRIPTION

    The function rearranges model in the coordinate hierarchy by swapping models modelNo1 and modelNo2.

    NOTE 1: The function does change the models' serial numbers so that they are always incremental-by-one in PDB file. However, the function does not change the serial numbers of atoms. They may be put into proper order by calling the CMMDBManager::PDBCleanup with input flag PDBCLEAN_SERIAL.

    NOTE 2: As an exception, an application does not have to call CMMDBManager::FinishStructEdit in order to validate the insertion. However, such a call would be completely harmless.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_selfnc.html0000644000175100017510000027232207504104430015453 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Selection functions.

    Selection functions allows for selecting atoms, residues, chains and models. Selected objects are represented on a uniform indexed space, which may be used for extracting the objects' properties and performing different sort of operations, such as looking for contacts between atoms, on them.

    COMMON NOTES AND DEFINITIONS
    Technology
    Physically, the selection of an object is done by assigning a dynamical-length bitwise mask to it. The mask is unique for each selection and all generated masks are orthogonal to each other (that is, they do not have common bits). The assignment of the mask is followed by compilation of an index for each selection. Any selection set may be expanded up or shrinked down using the Manager functions.

    The selection masks are not available for application. Instead, they are associated with selection handles, which are the only references to particular selections.

    There is no principal limitations on the number of selection sets; however each selection consumes certain amount of RAM, which may be roughly estimated as 2*Nsel words, where Nsel stands for the number of selected objects.

    Selection Handle
    Each selection is associated with an ID, called the selection handle (uniformly designated as selHnd below). Selection handles are generated by the Manager (see CMMDBManager::NewSelection) and cannot be otherwise created, changed or interpreted by application. Any object may participate in arbitrary number of selections simultaneously, however objects of different types cannot be mixed in one selection set (that is, e.g., atoms and chains cannot be addressed by the same selection handle). Thus each selection handle is assigned a selection type - STYPE_ATOM, STYPE_RESIDUEe, STYPE_CHAIN or STYPE_MODEL (see below) - which cannot be changed after first selection has been done. The assignment of the selection type takes place automatically at first selection according to the type of selection object. However, the selection of an object may be propagated up and down the coordinate hierarchy (it is possible, e.g., to select all atoms in selected chains or to select all chains containing selected residues).

    Selection Key
    The type of selection operation is defined by the value of selection key (uniformly designated as selKey below), which is a parameter of every selection function. The The key specifies how the requested selection operation applies to the existing selection associated with given selection handle:
    Selection Key Value Description
    SKEY_NEW 0 the previous selection, if existed, is wiped out. In the case of preexisting selection, the newly selected objects must have the same selection type (atom for this function).
    SKEY_OR 1 the new selection is added to already selected set; if no selection preexists, SKEY_NEW and SKEY_OR are equivalent. This key is the default one in all selection functions
    SKEY_AND 2 the new selection is made on already selected set; this corresponds to logical 'and' of the former and current selections. If no selection preexists, no selection will be made.
    SKEY_XOR 3 only those atoms will be selected which are found in either former or newly selected sets, but not in both of them; this corresponds to logical 'exclusive or' of the former and current selections. If no selection preexists, SKEY_XOR, SKEY_OR and SKEY_NEW are equivalent.
    SKEY_CLR 4 the atoms, which satisfy the selection criteria, are removed from the selection set. If no selection preexists, no changes occur apart of assigning a selection type (always atom for this function) to the selection handle.

    Selection Type
    Selection type, uniformly designated as selType below, specifies which objects are affected by the selection operation:
    Selection Type Value Description
    STYPE_ATOM 1 the selected objects are atoms satisfying the selection criteria
    STYPE_RESIDUE 2 the selected objects are residues containing atoms that satisfy the selection criteria
    STYPE_CHAIN 3 the selected objects are chains containing atoms that satisfy the selection criteria
    STYPE_MODEL 4 the selected objects are models containing atoms that satisfy the selection criteria

    Selection List
    Many parameters, supplied to selection functions, may represent lists of values, for example, list of chains, list of residues, list of chemical elements etc. A selection list is always given as ASCII string containing comma-separated objects; all spaces in selection lists are ignored. For example, "A,B,C" is a list of chain IDs meaning that the selection operation should be applied to chains A, B and C. Selection list may contain a single asterisk character "*", which means that the selection operation should be applied to all objects of specified type.

    Generally, any spaces in selection lists are ignored. This may cause potential problem in the selection on atom names, as PDB atom names contain significant spaces. In most cases this may be cured by specifying also the chemical element name, so that selection on "CA" for atom name and "C" for chemical element name assures that calcium atoms are not selected (selection on just "CA" for atom name would include calcium atoms if there are any in the coordinate hierarchy). In older PDB files, however, chemical element names may be missing or wrong (if ATOM records contain numbering in columns 72-80). If this is the case, significant spaces may be included into selection list by using the square brackets: "[ CA ],N" stands for the selection of C-alphas and nitrogen atoms, while "[CA  ],N" will select calciums and nitrogens (both are examples of atom name selection lists). Although all selection lists support square brackets, their use seems to be reasonable only for atom names. Consider that empty chain ID, insertion code and alternative location indicator correspond to empty items of the corresponding selection lists: the chain selection list ",A,B" (or " ,A,B") will select chains A, B and that without chain ID, while "[ ],A,B" selects only chains A and B.

    The action of selection list may be inverted by setting the exclamation mark "!" as its first non-space symbol. For example, "!A,B,C" means that the selection operation should be applied to all chains except A, B and C. Note that selection list "!*" is invalid.

    Invalid Selection Handle
    If selection handle, given to a selection function, is invalid, the function does nothing. The selection handle may be invalid if
    a) it has not been obtained from CMMDBManager::NewSelection
    b) the previous selection, identified by this selection handle, was deleted explicitely (through CMMDBManager::DeleteSelection or CMMDBManager::DeleteAllSelections)
    c) it has been used for the selection of different type of objects.

    Empty Selection
    If selection results in empty selection set, the selection handle remains valid, retaining its selection type or obtaining the specified selection type if no selection for that handle preexisted.

    It should be kept in mind, that there may be interference between selecting and editing operations on the coordinate hierarchy. E.g., the Library cannot provide for automatical selection of atom which was inserted into selection range after a selection, for which it would qualify, has been done. Similarly, at deleting a selected atom, the Library cannot automatically update the selection index (which may have been passed to the application already).

    In this section, only object selection tools are considered. All operations on selected objects are referred to in subject-specific sections.

    Function Purpose
    CMMDBManager::NewSelection Generating a new selection mask and its handle
    CMMDBManager::DeleteSelection Deleting selection by selection handle
    CMMDBManager::DeleteAllSelections Deleting all selections in the coordinate hierarchy
    CMMDBManager::SelectAtoms Selecting atoms by their serial numbers
    CMMDBManager::UnselectAtoms Unselecting atoms by their serial numbers
    CMMDBManager::SelectAtoms Selecting atoms by their ID, space restriction and other bits
    CMMDBManager::SelectAtoms Selecting atoms by their ID only
    CMMDBManager::Select Selecting atoms, residues, chains and models by their ID, space restriction and other bits
    CMMDBManager::Select Selecting atoms, residues, chains and models by their ID only.
    CMMDBManager::Select Selecting atoms, residues, chains and models by their Coordinate ID.
    CMMDBManager::Select Propagating the selection up and down the coordinate hierarchy.
    CMMDBManager::SelectSphere Selecting atoms, residues, chains or models in a sphere.
    CMMDBManager::SelectCylinder Selecting atoms, residues, chains or models in a cylinder.
    CMMDBManager::SelectSlab Selecting atoms, residues, chains or models in a slab.
    CMMDBManager::SelectNeighbours Selecting atoms, which are on a given distance from already selected atoms, or other objects containing such atoms.
    CMMDBManager::GetSelIndex Obtaining the selection index.
    CMMDBManager::GetAtomStatistics Calculating the averaged properties of all atoms in the selection.


    int CMMDBManager::NewSelection ( 
     )
    PURPOSE
    Generating a new selection mask and its handle
    DESCRIPTION

    The function generates a new, unique, selection mask and returns its handle (the selection handle). The handle is always a positive (non-zero) integer. Calling CMMDBManager::NewSelection() is the only way to create a new selection mask. Notice, however, that the masks will be automatically copied from another coordinate hierarchy (cf. Copying coordinate hierarchies), if atom coordinates are copied; if this is the case, the mask handles will be inherited from the source MMDB as well. The masks and their handles will be automatically deleted from the hierarchy (cf. CMMDBManager::Delete) if all atomic coordinates are deleted.

    Immediately after creation of a new selection mask, the type of selection object for that mask is undefined. Therefore the mask may be used for selection of either atoms, residues, chains or models. On the first selection, the mask is assigned a particular selection type (e.g. STYPE_ATOM), which cannot be changed in the future. An attempt to perform any selection operation with unmatching type of selection objects will be silently ignored.


    RETURN

    The function returns the selection handle.


    void CMMDBManager::DeleteSelection ( 
    int  selHnd )
    PURPOSE
    Deleting selection by selection handle
    ARGUMENTS
    int selHnd
    Selection handle.

    DESCRIPTION

    The function deletes the selection mask, identified by the given selection handle, and removes the corresponding selection attributes from all selection objects that were selected with that mask. If a selection object was selected also with other mask(s), the other selection(s) will be kept.

    NOTE 1: After CMMDBManager::DeleteSelection returns, the selection handle becomes invalid. This means that it cannot be used in new selections.

    NOTE 2: It is completely harmless to use any integer input to this function. If the supplied argument does not represent a valid selection handle, the function does nothing.


    void CMMDBManager::DeleteAllSelections ( 
     )
    PURPOSE
    Deleting all selections in the coordinate hierarchy
    DESCRIPTION

    The function deletes all selection mask and unselects all selection objects in the coordinate hierarchy.

    NOTE : After CMMDBManager::DeleteAllSelection returns, all selection handles become invalid. This means that they cannot be used in new selections.


    void CMMDBManager::SelectAtoms ( 
    int  selHnd, 
    int iSer1,
    int iSer2,
    int selKey )
    PURPOSE
    Selecting atoms by their serial numbers
    ARGUMENTS
    int selHnd
    Selection handle.

    int iSer1
    Starting serial number

    int iSer2
    Ending serial number

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    The function selects atoms with serial numbers ranging from iSer1 to iSer2 by adding them to the set of atoms associated with given selection handle. If iSer1=iSer2=0 then all atoms in coordinate hierarchy are selected. Each atom may participate in arbitrary number of selections simultaneously.

    The selection is done according to the value of selection key (selKey) given.

    NOTE : Serial numbers in a valid PDB file should count from 1 on, incrementing by one, including TER records. In reality this condition often does not hold. The Library differentiates position (index) of an atom, from its serial number. In ideal PDB file, index of atom always coincide with serial number. CMMDBManager::SelectAtoms operates on the serial numbers as they are given in the coordinate file, and not on the atom indices.


    void CMMDBManager::UnselectAtoms ( 
    int  selHnd, 
    int iSer1,
    int iSer2 )
    PURPOSE
    Unselecting atoms by their serial numbers
    ARGUMENTS
    int selHnd
    Selection handle.

    int iSer1
    Starting serial number

    int iSer2
    Ending serial number

    DESCRIPTION

    The function unselects atoms with serial numbers ranging from iSer1 to iSer2, rtemoving them from the set of atoms associated with given selection handle. If iSer1=iSer2=0 then the unselection applies to all atoms in coordinate hierarchy. If selHnd=0, the operation applies to all currently defined selection handles.

    NOTE : Serial numbers in a valid PDB file should count from 1 on, incrementing by one, including TER records. In reality this condition often does not hold. The Library differentiates position (index) of an atom, from its serial number. In ideal PDB file, index of atom always coincide with serial number. CMMDBManager::UnselectAtoms operates on the serial numbers as they are given in the coordinate file, and not on the atom indices.


    void CMMDBManager::SelectAtoms ( 
    int  selHnd, 
    int iModel,
    pstr Chains,
    int ResNo1,
    pstr Ins1,
    int ResNo2,
    pstr Ins2,
    pstr RNames,
    pstr ANames,
    pstr Elements,
    pstr altLocs,
    pstr Segments,
    pstr Charges,
    realtype occ1,
    realtype occ2,
    realtype x0,
    realtype y0,
    realtype z0,
    realtype d0,
    int selKey )
    PURPOSE
    Selecting atoms by their ID, space restriction and other bits
    ARGUMENTS
    int selHnd
    Selection handle.

    int iModel
    Model number. Model #1 is always present in coordinate hierarchy. iModel=0 means "any model".

    pstr Chains
    Chain ID or list of chain IDs.

    int ResNo1
    Starting residue sequence number.

    pstr Ins1
    Starting residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code".

    int ResNo2
    Ending residue sequence number.

    pstr Ins2
    Ending residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code". Combination of ResNo1=ResNo2=ANY_RES and Ins1=Ins2="*" means "any residue".

    pstr RNames
    Residue name or list of residue names.

    pstr ANames
    Atom name or list of atom names.

    pstr Elements
    Chemical element name or list of chemical element names.

    pstr altLocs
    Alternative location indicator or list of alternative location indicators. No alternative location indicator is specified by empty string "", "*" means 'any alternative location indicator'.

    pstr Segments
    Segment ID or list of segment IDs.

    pstr Charges
    Atom charge or list of atom charges.

    realtype occ1
    Lowest occupancy.

    realtype occ2
    Highest occupancy. occ1=occ2<0.0 means "any occupancy".

    realtype x0
    x-center of a selection sphere, in angstroms.

    realtype y0
    y-center of selection sphere, in angstroms.

    realtype z0
    z-center of selection sphere, in angstroms.

    realtype d0
    radius of selection sphere, in angstroms. d0<=0.0 means "no selection sphere" and values of x0, y0 and z0 are ignored.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    The function selects atoms which satisfy all selection criteria given by its arguments. All conditions implied by values of arguments are applied as logical "and" after applying logical "or" to all selection lists.


    EXAMPLE

    Select all C-alpha atoms in chains A and B:

    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.SelectAtoms (
         selHnd,0,    // any model
         "A,B",       // chains "A" and "B" only
         ANY_RES,"*", // any residue numbers,
         ANY_RES,"*", //    any insertion codes
         "*",         // any residue name
         "CA",        // atoms named "CA" only
         "C",         // carbons only ("CA" might stand for calcium as well)
         "*",         // any alternative location indicator
         "*",         // any segment
         "*",         // any charges
         -1.0,-1.0,   // any occupancy
         0.0,0.0,0.0,-1.0,  // no selection sphere
         SKEY_OR      // OR-selection
                       );
    


    void CMMDBManager::SelectAtoms ( 
    int  selHnd, 
    int iModel,
    pstr Chains,
    int ResNo1,
    pstr Ins1,
    int ResNo2,
    pstr Ins2,
    pstr RNames,
    pstr ANames,
    pstr Elements,
    pstr altLocs,
    int selKey )
    PURPOSE
    Selecting atoms by their ID only
    ARGUMENTS
    int selHnd
    Selection handle.

    int iModel
    Model number. Model #1 is always present in coordinate hierarchy. iModel=0 means "any model".

    pstr Chains
    Chain ID or list of chain IDs.

    int ResNo1
    Starting residue sequence number.

    pstr Ins1
    Starting residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code".

    int ResNo2
    Ending residue sequence number.

    pstr Ins2
    Ending residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code". Combination of ResNo1=ResNo2=ANY_RES and Ins1=Ins2="*" means "any residue".

    pstr RNames
    Residue name or list of residue names.

    pstr ANames
    Atom name or list of atom names.

    pstr Elements
    Chemical element name or list of chemical element names.

    pstr altLocs
    Alternative location indicator or list of alternative location indicators. No alternative location indicator is specified by empty string "", "*" means 'any alternative location indicator'.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    The function selects atoms which satisfy all selection criteria given by its arguments. All conditions implied by values of arguments are applied as logical "and" after applying logical "or" to all selection lists.

    The function represents a simplified call to the more general CMMDBManager::SelectAtoms. The code
      MMDB.SelectAtoms (
         selHnd,modNo,chainList,res1,insCode1,res2,insCode2,
         residueList,atomList,elementList,alocList,selKey );
    
    is functionally identical to the following one:
      MMDB.SelectAtoms (
         selHnd,modNo,chainList,res1,insCode1,res2,insCode2,
         residueList,atomList,elementList,alocList,
         "*",               // any segment
         "*",               // any charges
         -1.0,-1.0,         // any occupancy
         0.0,0.0,0.0,-1.0,  // no selection sphere
         selKey );
    


    EXAMPLE

    Select all C-alpha and nitrogen atoms in GLU and SER residues of chains A and B:

    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.SelectAtoms (
         selHnd,0,    // any model
         "A,B",       // chains "A" and "B" only
         ANY_RES,"*", // any residue numbers,
         ANY_RES,"*", //    any insertion codes
         "GLU,SER",   // GLU and SER residues only
         "CA",        // atoms named "CA" only
         "C",         // carbons only ("CA" might stand for calcium as well)
         "*",         // any alternative location indicator
         SKEY_NEW     // NEW-selection
                       );
      MMDB.SelectAtoms (
         selHnd,0,    // any model
         "A,B",       // chains "A" and "B" only
         ANY_RES,"*", // any residue numbers,
         ANY_RES,"*", //    any insertion codes
         "GLU,SER",   // GLU and SER residues only
         "*",         // any atom names
         "N",         // nitrogens only
         "*",         // any alternative location indicator
         SKEY_OR      // OR-selection
                       );
    


    void CMMDBManager::Select ( 
    int  selHnd, 
    int selType,
    int iModel,
    pstr Chains,
    int ResNo1,
    pstr Ins1,
    int ResNo2,
    pstr Ins2,
    pstr RNames,
    pstr ANames,
    pstr Elements,
    pstr altLocs,
    pstr Segments,
    pstr Charges,
    realtype occ1,
    realtype occ2,
    realtype x0,
    realtype y0,
    realtype z0,
    realtype d0,
    int selKey )
    PURPOSE
    Selecting atoms, residues, chains and models by their ID, space restriction and other bits
    ARGUMENTS
    int selHnd
    Selection handle.

    int selType
    Selection type.

    int iModel
    Model number. Model #1 is always present in coordinate hierarchy. iModel=0 means "any model".

    pstr Chains
    Chain ID or list of chain IDs.

    int ResNo1
    Starting residue sequence number.

    pstr Ins1
    Starting residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code".

    int ResNo2
    Ending residue sequence number.

    pstr Ins2
    Ending residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code". Combination of ResNo1=ResNo2=ANY_RES and Ins1=Ins2="*" means "any residue".

    pstr RNames
    Residue name or list of residue names.

    pstr ANames
    Atom name or list of atom names.

    pstr Elements
    Chemical element name or list of chemical element names.

    pstr altLocs
    Alternative location indicator or list of alternative location indicators. No alternative location indicator is specified by empty string "", "*" means 'any alternative location indicator'.

    pstr Segments
    Segment ID or list of segment IDs.

    pstr Charges
    Atom charge or list of atom charges.

    realtype occ1
    Lowest occupancy.

    realtype occ2
    Highest occupancy. occ1=occ2<0.0 means "any occupancy".

    realtype x0
    x-center of a selection sphere, in angstroms.

    realtype y0
    y-center of selection sphere, in angstroms.

    realtype z0
    z-center of selection sphere, in angstroms.

    realtype d0
    radius of selection sphere, in angstroms. d0<=0.0 means "no selection sphere" and values of x0, y0 and z0 are ignored.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects either atoms satisfying all selection criteria, given by its arguments, or other objects (residues, chains or models), which contain such atoms. All conditions implied by values of arguments are applied as logical "and" after applying logical "or" to all selection lists. The selection operation is given by the value of selKey.

    The following code
      MMDB.Select ( selHnd, STYPE_ATOM, .... );
    
    is equivalent to (cf. CMMDBManager::SelectAtoms)
      MMDB.SelectAtoms ( selHnd, .... );
    
    provided that the rest of parameters is identical in both examples.


    EXAMPLE

    Select all residues in chains A and B, which are not SER or GLU and which contain at least one non-hydrogen, non-oxygen atom falling into a sphere of a given radius:

    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.Select (
         selHnd,
         STYPE_RESIDUE, // select residues
         0,             // any model
         "A,B",         // chains "A" and "B" only
         ANY_RES,"*",   // any residue numbers,
         ANY_RES,"*",   //    any insertion codes
         "!SER,GLU",    // any residue but SER and GLU
         "*",           // any atom
         "!H,O",        // any chemical element but O and H
         "*",           // any alternative location indicator
         "*",           // any segment
         "*",           // any charges
         -1.0,-1.0,     // any occupancy
         1.0,2.0,3.0,   // (x,y,z) center of the sphere
         10.0,          // radius of the sphere
         SKEY_OR        // OR-selection
                       );
    


    void CMMDBManager::Select ( 
    int  selHnd, 
    int selType,
    int iModel,
    pstr Chains,
    int ResNo1,
    pstr Ins1,
    int ResNo2,
    pstr Ins2,
    pstr RNames,
    pstr ANames,
    pstr Elements,
    pstr altLocs,
    int selKey )
    PURPOSE
    Selecting atoms, residues, chains and models by their ID only.
    ARGUMENTS
    int selHnd
    Selection handle.

    int selType
    Selection type.

    int iModel
    Model number. Model #1 is always present in coordinate hierarchy. iModel=0 means "any model".

    pstr Chains
    Chain ID or list of chain IDs.

    int ResNo1
    Starting residue sequence number.

    pstr Ins1
    Starting residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code".

    int ResNo2
    Ending residue sequence number.

    pstr Ins2
    Ending residue insertion code. Ins1="" means "residue without insertion code, Ins1="*" means "any insertion code". Combination of ResNo1=ResNo2=ANY_RES and Ins1=Ins2="*" means "any residue".

    pstr RNames
    Residue name or list of residue names.

    pstr ANames
    Atom name or list of atom names.

    pstr Elements
    Chemical element name or list of chemical element names.

    pstr altLocs
    Alternative location indicator or list of alternative location indicators. No alternative location indicator is specified by empty string "", "*" means 'any alternative location indicator'.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects either atoms satisfying all selection criteria, given by its arguments, or other objects (residues, chains or models), containing such atoms. All conditions implied by values of arguments are applied as logical "and" after applying logical "or" to all selection lists. The selection operation is given by the value of selKey.

    The function is a simplified version of a more general CMMDBManager::Select. The code
      MMDB.Select (
         selHnd,selType,modNo,chainList,res1,insCode1,res2,insCode2,
         residueList,atomList,elementList,alocList,selKey );
    
    is functionally identical to the following one:
      MMDB.Select (
         selHnd,selType,modNo,chainList,res1,insCode1,res2,insCode2,
         residueList,atomList,elementList,alocList,
         "*",               // any segment
         "*",               // any charges
         -1.0,-1.0,         // any occupancy
         0.0,0.0,0.0,-1.0,  // no selection sphere
         selKey );
    


    EXAMPLE

    Select all residues in range 30 to 100 in chains A and B, which do not contain sulphur:

    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.Select (
         selHnd,
         STYPE_RESIDUE,  // select residues
         0,              // any model
         "A,B",          // chains "A" and "B" only
         30,"*",100,"*", // any residue in range 30 to 100,
                         // any insertion code
         "*",            // any residue name
         "*",            // any atom name
         "!S",           // any chemical element but sulphur
         "*",            // any alternative location indicator
         SKEY_OR         // OR-selection
                  );
    


    void CMMDBManager::Select ( 
    int  selHnd, 
    int selType,
    pstr CID,
    int selKey )
    PURPOSE
    Selecting atoms, residues, chains and models by their Coordinate ID.
    ARGUMENTS
    int selHnd
    Selection handle.

    int selType
    Selection type.

    pstr CID
    The selection coordinate ID.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects either atoms satisfying the provided coordinate ID, or other objects (residues, chains or models), containing such atoms. The selection operation is given by the value of selKey.

    The selection coordinate ID has generally the same syntax as the "ordinary" CID, however there are the following important extensions:
    1. Specifications for chains, residue names, atom names, chemical elements and alternative location indicators may represent lists rather than single values. These lists should contain comma-separated items, for example "A,B,H" for selecting chains A, B and H only. If a list is preceeded by an exclamation mark "!", its meaining gets inversed. For example, "!ALA,SER" means 'any residue name but ALA and SER'.

    2. A range (but not a list) of residue sequence numbers and insertion codes may be specified in the following form:

      "seq1.ic1-seq2.ic2"

      where seq1, seq2 stand for the sequence numbers, and ic1, ic2 - for the insertion codes. A yet more complicated form of this range is

      "seq1.ic1-seq2(reslist).ic2"

      where reslist is a list of (comma-separated, optionally "!"-prefixed) residue names to be only selected in the specified range.

    3. Default items and incomplete selection CIDs are interpreted in exactly the same way as in "ordinary" CID.

    4. All spaces are ignored.

    5. All names are case-sensitive.

    The following examples represent valid selection CIDs:

    Coordinate ID Description
    * all atoms in all models/chains/residues
    [C] all carbons in all models/chains/residues
    /1///:A all atoms in alternate location A in all residues of chain without a chain ID, in model 1
    /1/*/*/*:A same as above
    30-120 all atoms in residues 30 to 120 in all models and chains.
    A/30.A-120.S all atoms in residues 30 insertion code A to 120 insertion code S in A-chains of all models.
    A/30.A-120.S/[!S] all atoms but sulphur in residues 30 insertion code A to 120 insertion code S in A-chains of all models.
    (ALA,SER) all atoms in residues ALA and SER in all models/chains.
    /1/A/(!ALA,SER)/CA[C] all C-alpha atoms in all residues but ALA and SER in model 1 chain A.


    EXAMPLE

    The following codes perform identical actions.

    Code 1:
    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.Select (
         selHnd,
         STYPE_ATOM,                             // select atoms
         "/0/A,B/30.A-100(!ALA,SER)./*[C,O,N]:", // full precise CID
         SKEY_OR                                 // OR-selection
                  );
      //
      // Equivalent selection CIDs:
      //  "/*/A,B/30.A-100(!ALA,SER)./*[C,O,N]:"
      //
      // incomplete equivalent selection CIDs:
      //  "A,B/30.A-100(!ALA,SER)./*[C,O,N]:"
      //  "A,B/30.A-100(!ALA,SER)/*[C,O,N]:"
      //  "A,B/30.A-100(!ALA,SER)/[C,O,N]"
      //
    

    Code 2:
    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.Select (
         selHnd,
         STYPE_ATOM,     // select atoms
         0,              // any model
         "A,B",          // chains "A" and "B" only
         30,"A",100,"",  // any residue in range 30.A to 100.
         "!ALA,SER",     // any residue name but ALA and SER
         "*",            // any atom name
         "C,O,N",        // carbons, oxygens and nitrogens only
         "",             // no alternate location
         SKEY_OR         // OR-selection
                  );
    


    void CMMDBManager::Select ( 
    int  selHnd1, 
    int selType,
    int selHnd2,
    int selKey )
    PURPOSE
    Propagating the selection up and down the coordinate hierarchy.
    ARGUMENTS
    int selHnd1
    Selection handle for the "destination" selection.

    int selType
    Selection type for the "destination" selection.

    int selHnd2
    Selection handle for the "source" selection.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects objects (atoms, residues, chains or models), which are contained in objects belonging to selection selHnd2, or which contain such objects. The selection operation is given by the value of selKey.


    EXAMPLE 1

    Select all residues, which contain selected atoms:

    CMMDBManager MMDB;
    int          RC,selHnd_a,selHnd_r;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd_a = MMDB.NewSelection();
      MMDB.Select (
         selHnd_a,       // atom selection handle
         STYPE_ATOM,     // select atoms
         0,              // any model
         "A,B",          // chains "A" and "B" only
         30,"*",100,"*", // any residue in range 30 to 100
         "*",            // any residue name
         "*",            // any atom name
         "*",            // any chemical element
         "*",            // any alternative location indicator
         SKEY_NEW        // NEW-selection
                  );
      selHnd_r = MMDB.NewSelection();
      MMDB.Select (
         selHnd_r,       // residue selection handle
         STYPE_RESIDUE,  // select residues
         selHnd_a,       // reference to selected atoms
         SKEY_OR         // OR-selection
                  );
    


    EXAMPLE 2

    Select all atoms, which are contained in selected residues:

    CMMDBManager MMDB;
    int          RC,selHnd_a,selHdn_r;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd_r = MMDB.NewSelection();
      MMDB.Select (
         selHnd_r,       // atom selection handle
         STYPE_RESIDUE,  // select residues
         0,              // any model
         "A,B",          // chains "A" and "B" only
         30,"*",100,"*", // any residue in range 30 to 100
         "*",            // any residue name
         "*",            // any atom name
         "*",            // any chemical element
         "*",            // any alternative location indicator
         SKEY_NEW        // NEW-selection
                  );
      selHnd_a = MMDB.NewSelection();
      MMDB.Select (
         selHnd_a,       // residue selection handle
         STYPE_ATOM,     // select atoms
         selHnd_r,       // reference to selected atoms
         SKEY_OR         // OR-selection
                  );
    


    void CMMDBManager::SelectSphere ( 
    int  selHnd, 
    int selType,
    realtype x,
    realtype y,
    realtype z,
    realtype r,
    int selKey )
    PURPOSE
    Selecting atoms, residues, chains or models in a sphere.
    ARGUMENTS
    int selHnd
    Selection handle.

    int selType
    Selection type.

    realtype x
    x-coordinate of the center of the sphere.

    realtype y
    y-coordinate of the center of the sphere.

    realtype z
    z-coordinate of the center of the sphere.

    realtype r
    radius of the sphere.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects either atoms found inside the specified sphere, or other objects (residues, chains or models), containing such atoms. The selection operation is given by the value of selKey.


    EXAMPLE

    Select all residues in chains A and B, which contain at least one atom in the specified sphere:

    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.SelectSphere (
         selHnd,
         STYPE_RESIDUE,  // select residues
         1.0,2.0,3.0,    // (x,y,z)-center of the sphere
         10.0,           // radius of the sphere
         SKEY_NEW        // NEW-selection
                        );
    


    void CMMDBManager::SelectCylinder ( 
    int  selHnd, 
    int selType,
    realtype x1,
    realtype y1,
    realtype z1,
    realtype x2,
    realtype y2,
    realtype z2,
    realtype r,
    int selKey )
    PURPOSE
    Selecting atoms, residues, chains or models in a cylinder.
    ARGUMENTS
    int selHnd
    Selection handle.

    int selType
    Selection type.

    realtype x1
    x1-coordinate of the cylinder's axis.

    realtype y1
    y1-coordinate of the cylinder's axis.

    realtype z1
    z1-coordinate of the cylinder's axis.

    realtype x2
    x2-coordinate of the cylinder's axis.

    realtype y2
    y2-coordinate of the cylinder's axis.

    realtype z2
    z2-coordinate of the cylinder's axis.

    realtype r
    radius of the cylinder.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects either atoms found inside the specified cylinder, or other objects (residues, chains or models), containing such atoms. The selection operation is given by the value of selKey.

    The cylinder is specified as that of radius r with axis running from point {x1,y1,z1} to point {x2,y2,z2}.


    EXAMPLE

    Select all atoms in chains A and B, which contain at least one atom in the specified cylinder:

    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.SelectCylinder (
         selHnd,
         STYPE_ATOM,   // select atoms
         1.0,0.0,0.0,  // {x1,y1,z1}-point of the cylinder's axis
         10.0,0.0,0.0, // {x2,y2,z2}-point of the cylinder's axis
         10.0,         // radius of the cylinder
         SKEY_NEW      // NEW-selection
                        );
    


    void CMMDBManager::SelectSlab ( 
    int  selHnd, 
    int selType,
    realtype a,
    realtype b,
    realtype c,
    realtype d,
    realtype r,
    int selKey )
    PURPOSE
    Selecting atoms, residues, chains or models in a slab.
    ARGUMENTS
    int selHnd
    Selection handle.

    int selType
    Selection type.

    realtype a
    a-parameter of the slab's plane.

    realtype b
    b-parameter of the slab's plane.

    realtype c
    c-parameter of the slab's plane.

    realtype d
    d-parameter of the slab's plane.

    realtype r
    r distance to the slab's plane.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects either atoms found inside the specified slab, or other objects (residues, chains or models), containing such atoms. The selection operation is given by the value of selKey.

    The slab is defined as set of all points on a distance not greater than r from the slab's plane. The plane is defined as set of points that obey the equation a*x + b*y + c*z = d.


    EXAMPLE

    Select all chains, which contain at least one atom with x-coordinate in the region of -20 to -10 angstroms:

    CMMDBManager MMDB;
    int          RC,selHnd;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.SelectSlab (
         selHnd,
         STYPE_CHAIN,       // select chains
         1.0,0.0,0.0,-15.0, // slab's plane equation x=-15
         5.0,               // +/- 5 angstroms from the slab's plane
         SKEY_NEW           // NEW-selection
                      );
    


    void CMMDBManager::SelectNeighbours ( 
    int  selHnd, 
    int selType,
    PPCAtom sA,
    int alen,
    realtype d1,
    realtype d1,
    int selKey )
    PURPOSE
    Selecting atoms, which are on a given distance from already selected atoms, or other objects containing such atoms.
    ARGUMENTS
    int selHnd
    Selection handle.

    int selType
    Selection type.

    PPCAtom sA
    vector of selected atoms (may be obtained from CMMDBManager::GetSelIndex).

    int alen
    length of array sA.

    realtype d1
    minimal distance to atoms in sA.

    realtype d1
    maximal distance to atoms in sA.

    int selKey
    Selection key. This parameter has default value of SKEY_OR.

    DESCRIPTION

    Depending on the value of selType, the function selects either atoms that are on distance d1<=r<=d2 from at least one atom in array sA, or other objects (residues, chains or models), containing such atoms. The selection operation is given by the value of selKey.

    The function employs the bricking algorithm and is therefore considerably more efficient than straightforward checking the selection criteria for every atom in sA and in the coordinate hierarchy.


    EXAMPLE

    Select all residues, which contain at least one atom closer than 10 angstrom to C-alpha atoms of chain A:

    CMMDBManager MMDB;
    PPCAtom      SelAtom;
    int          RC,selHnd,nSelAtoms;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.Select (
         selHnd,      // selection handle
         STYPE_ATOM,  // select atoms
         0,           // any model
         "A",         // chains "A" and "B" only
         ANY_RES,"*", // any residue
         ANY_RES,"*", //   any insertion code
         "*",         // any residue name
         "CA",        // C-alphas only
         "C",         // carbons only
         "*",         // any alternative location indicator
         SKEY_NEW     // NEW-selection
                  );
      MMDB.GetSelIndex ( selHnd,SelAtom,nSelAtoms );
      MMDB.SelectNeighbours (
         selHnd,        // selection handle
         STYPE_RESIDUE, // select residues
         SelAtom,       // array of already selected atoms
         nSelAtoms,     // number of already selected atoms
         0.0,10.0,      // distance range 0 to 10 angstroms
         SKEY_OR        // OR-selection
                            );
    


    void CMMDBManager::GetSelIndex ( 
    int  selHnd, 
    PPCObject SelObject,
    int nSelObjects )
    PURPOSE
    Obtaining the selection index.
    ARGUMENTS
    int selHnd
    Selection handle.

    PPCObject SelObject
    Pointer to the array of objects to receive the index. Overloaded instances of this function work with selected atoms, residues, chains and models, for which this parameter should have type of either PPCAtom, PPCResidue, PPCChain or PPCModel, correspondingly.

    int nSelObjects
    Length of index. The selected objects are addressed as SelObject[i], i=[0..nSelObjects-1].

    DESCRIPTION

    Depending on the type of selObject, the function returns the continuous-space indices of selected atoms, residues, chains or models, associated with the selection handle selHnd. The type of requested selection should coincide with what was actually selected for that handle. If this condition does not hold, or if the selection set is empty, the function returns SelObject=NULL and nSelObjects=0.

    NOTE 1: The selection index is dynamically allocated and deallocated by the Manager. The application must not attempt to either dispose or reallocate the selection index.

    NOTE 2: The application may delete objects from the index. Using ordinary delete operator will make a proper deletion of an object (i.e. it will be disposed and removed from the coordinate hierarchy), e.g. "delete SelObject[i]". However, and this is very important, the application must null the pointer of the object: "SelObject[i] = NULL" immediately after deletion.

    NOTE 3: After the selection index has been passed to the application, it cannot be updated by the Manager if, for example, new selections for that selection handle are done. It should therefore be a common practice for application to be obtaining the selection indices immediately prior using them, making sure that those are the latest ones. Obtaining the selection index is very cheap; it invokes neither calculations nor compilation of the index.


    EXAMPLE

    Select all residues in chain A and obtain their index:

    CMMDBManager MMDB;
    PPCResidue   SelResidue;
    int          RC,selHnd,nSelResidues;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC)  {
        // interprete the error code
        ........................
        exit ( 1 );
      }
      selHnd = MMDB.NewSelection();
      MMDB.Select (
         selHnd,        // selection handle
         STYPE_RESIDUE, // select residues
         0,             // any model
         "A",           // chains "A" and "B" only
         ANY_RES,"*",   // any residue
         ANY_RES,"*",   //   any insertion code
         "*",           // any residue name
         "*",           // any atom names
         "*",           // any chemical elements
         "*",           // any alternative location indicator
         SKEY_NEW       // NEW-selection
                  );
      MMDB.GetSelIndex ( selHnd,SelResidue,nSelResidues );
    
    See also an example for function CMMDBManager::SelectNeighbours.


    void CMMDBManager::GetAtomStatistics ( 
    int  selHnd, 
    RSAtomStat AS )
    PURPOSE
    Calculating the averaged properties of all atoms in the selection.
    ARGUMENTS
    int selHnd
    Selection handle.

    RSAtomStat AS
    Reference to structure SAtomStat , which returns the average results.

    DESCRIPTION

    The function calculates the average properties of atoms regardless of the selection type. If, e.g., selHnd is associated with selected chains, the properties of all atoms belonging to those chains will be averaged.

    The function performs an actual calculation of averaged atom properties, none of them are stored as variables. It is therefore advised to avoid unnecessary calls to this function.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_rdwr.html0000644000175100017510000016557607504104354015200 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Reading/Writing Coordinate Files.

    Reading/Writing coordinate files are functions of the Library Manager class (CMMDBManager). A typical application would always contain pieces like the following:

    //  include the MMDB coordinate Manager file header
    #ifndef  __MMDB_Manager__
    #include "mmdb_manager.h"
    #endif
    
    ................................
    
    int           RC;
    PCMMDBManager MMDB;
    
      //  create an instance of MMDB manager -- eesentially an
      //  empty coordinate hierarchy
      MMDB = new CMMDBManager();
    
      //  read coordinate file
      RC   = ReadCoorFile ( "coorfile.pdb" );
      //  interprete the return code
      if (RC)  {
        ............................
        return Error;
      }
    
      //  work with coordinates
      ..............................
    
      //  write coordinate file (if necessary)
      RC =  WritePDBASCII ( "output_coord.pdb" );
      //  interprete the return code
      if (RC)  {
        ............................
        return Error;
      }
    

    The coordinate Manager provides a variety of functions for reading/writing coordinate files, supporting 3 data formats: PDB, mmCIF and Library's internal binary format (referred to as MMDB Binary). At present, mmCIF is supported only partially and does not allow for dynamical use of CIF dictionaries. MMDB Binary format is portable between different platforms. Below we list all functions which relate to reading/writing coordinate files.

    Function Purpose
    CMMDBManager::ReadCoorFile Reading coordinate files with automatical recognition of file format.
    CMMDBManager::ReadCoorFile1 Reading coordinate files with automatical recognition of file format, by logical file name.
    CMMDBManager::ReadPDBASCII Reading PDB coordinate files.
    CMMDBManager::ReadPDBASCII1 Reading PDB coordinate files, by logical file name.
    CMMDBManager::AddPDBASCII Adding data from a PDB coordinate file.
    CMMDBManager::AddPDBASCII1 Adding data from a PDB coordinate file, by logical file name.
    CMMDBManager::PutPDBString Adding data from a character string.
    CMMDBManager::ReadCIFASCII Reading mmCIF coordinate files.
    CMMDBManager::ReadCIFASCII1 Reading mmCIF coordinate files, by logical file name.
    CMMDBManager::ReadMMDBF Reading MMDB Binary coordinate files.
    CMMDBManager::ReadMMDBF1 Reading MMDB Binary coordinate files, by logical file name.
    CMMDBManager::GetFileType Retrieves the type (format) of coordinate file that has been read.
    isPDB Checking on PDB ASCII files.
    isMMDBBIN Checking on MMDB Binary files.
    isCIF Checking on mmCIF files.
    CMMDBManager::SetFlag Setting flag(s) of extra functionality.
    CMMDBManager::RemoveFlag Removing flag(s) of extra functionality.
    CMMDBManager::WritePDBASCII Writing PDB coordinate files.
    CMMDBManager::WritePDBASCII1 Writing PDB coordinate files, by logical file name.
    CMMDBManager::WriteCIFASCII Writing mmCIF coordinate files.
    CMMDBManager::WriteCIFASCII1 Writing mmCIF coordinate files, by logical file name.
    CMMDBManager::WriteMMDBF Writing MMDB Binary files.
    CMMDBManager::WriteMMDBF1 Writing MMDB Binary files, by logical file name.


    int CMMDBManager::ReadCoorFile ( 
    pstr  FileName )
    PURPOSE
    Reading coordinate files with automatical recognition of file format.
    ARGUMENTS
    pstr FileName
    Name of file to be read.

    DESCRIPTION

    The coordinate file is read, the coordinate hierarchy is created and stored permanently in memory. Any data existing in the hierarchy before the reading, is automatically disposed.

    The function automatically recognizes between PDB, mmCIF and MMDB binary formats. Format of a file that has been read, may be obtained through function CMMDBManager::GetFileType.


    RETURN

    Upon successful completion, the function returns 0. Non-zero returns indicate a problem, which prevented the Manager from completion the reading. See return codes and way of their handling in Error handling and return codes.


    EXAMPLE

    The following example reads a coordinate file and checks for errors:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  Location of the error may be identified as precise as line
        //  number and the line itself. This information is now
        //  retrieved from MMDB input buffer:
        MMDB.GetInputBuffer ( S, lcount );
        if (lcount>=0) 
          printf ( "       LINE #%i:\n%s\n\n",lcount,S );
        else if (lcount==-1)
          printf ( "       CIF ITEM: %s\n\n",S );
        exit(1);
      }
    


    int CMMDBManager::ReadCoorFile1 ( 
    pstr  LogFileName )
    PURPOSE
    Reading coordinate files with automatical recognition of file format, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be read. This is a name of environmental variable (e.g. "xyzin"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::ReadCoorFile but takes a logical, rather than physical, name of the file.


    int CMMDBManager::ReadPDBASCII ( 
    pstr  FileName )
    PURPOSE
    Reading PDB coordinate files.
    ARGUMENTS
    pstr FileName
    Name of PDB file to be read.

    DESCRIPTION

    The function is identical to CMMDBManager::ReadCoorFile but reads only PDB coordinate files. Application may check for PDB format prior reading the file through function isPDB.


    EXAMPLE

    The following example reads a PDB coordinate file and checks for errors:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
      RC = MMDB.ReadPDBASCII ( "pdb1sar.ent" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  Location of the error may be identified as precise as line
        //  number and the line itself. This information is now
        //  retrieved from MMDB input buffer:
        MMDB.GetInputBuffer ( S, lcount );
        if (lcount>=0) 
          printf ( "       LINE #%i:\n%s\n\n",lcount,S );
        exit(1);
      }
    


    int CMMDBManager::ReadPDBASCII1 ( 
    pstr  LogFileName )
    PURPOSE
    Reading PDB coordinate files, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be read. This is a name of environmental variable (e.g. "xyzin"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::ReadPDBASCII but takes a logical, rather than physical, name of the file.


    int CMMDBManager::AddPDBASCII ( 
    pstr  FileName )
    PURPOSE
    Adding data from a PDB coordinate file.
    ARGUMENTS
    pstr FileName
    Name of PDB file to be read.

    DESCRIPTION

    The function is identical to CMMDBManager::ReadPDBASCII, however it does not dispose data, which previously existed in the coordinate hierarchy. The newly read data is appended correspondingly to each item of the hierarchy.

    The function is useful for composing a PDB file from parts, e.g. adding the REMARK records, CRYST data, SEQRES etc.. All the data will be put on proper place regardless the order in which the files are read. However the order of reading files will determine the order of records within PDB sections. Thus, for example, addition of two files containing SEQRES records yields two SEQRES blocks placed one after another in the order of their appearance, even if these blocks are identical; in contrary, adding several CRYST cards will leave the latest one only.


    EXAMPLE

    The following example reads a PDB coordinate file and appends data from another PDB file to it:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
      RC = MMDB.ReadPDBASCII ( "pdb1sar.ent" );
      if (RC) {
        // check for errors
        .........................
        exit(1);
      }
      RC = MMDB.AddPDBASCII ( "add.pdb" );
      if (RC) {
        // check for errors
        .........................
        exit(1);
      }
    


    int CMMDBManager::AddPDBASCII1 ( 
    pstr  LogFileName )
    PURPOSE
    Adding data from a PDB coordinate file, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be read. This is a name of environmental variable (e.g. "xyzin"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::AddPDBASCII but takes a logical, rather than physical, name of the file.


    int CMMDBManager::PutPDBString ( 
    pstr  PDBString )
    PURPOSE
    Adding data from a character string.
    ARGUMENTS
    pstr PDBString
    A character string formatted as a valid PDB record.

    DESCRIPTION

    The function adds data from a single PDB record, given as a character string PDBString, to the coordinate hierarchy. The string is namely added, which means that it will be interpreted like a last string in its group, e.g. last "REMARK", last "JRNL", last "ATOM" etc. according to the PDB keyword found in it.


    RETURN

    The function returns the same codes as CMMDBManager::ReadPDBASCII.


    EXAMPLE

    The following example is identical to that given for CMMDBManager::AddPDBASCII but less efficient:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
    CFile        f;
      RC = MMDB.ReadPDBASCII ( "pdb1sar.ent" );
      if (RC) {
        // check for errors
        .........................
        exit(1);
      }
      RC = isPDB ( "add.pdb" );
      if (RC<0)  {
        printf ( " file 'add.pdb' does not exist\n" );
        exit(2);
      }
      if (RC>0)  {
        printf ( " file 'add.pdb' is not a PDB file\n" );
        exit(3);
      }
      f.assign ( "add.pdb" );
      if (f.reset())  {
        RC = 0;
        while ((!f.FileEnd()) && (!RC))  {
          f.ReadLine ( S,sizeof(S) );
          RC = MMDB.PutPDBString ( S );
        }
        f.shut();
        if (RC) {
          // check for errors
          .........................
          exit(4);
        }
      } else
        printf ( " can't open file 'add.pdb'\n" );
    


    int CMMDBManager::ReadCIFASCII ( 
    pstr  FileName )
    PURPOSE
    Reading mmCIF coordinate files.
    ARGUMENTS
    pstr FileName
    Name of mmCIF file to be read.

    DESCRIPTION

    The function is identical to CMMDBManager::ReadCoorFile but reads only mmCIF coordinate files. Application may check for CIF format prior reading the file through function isCIF.


    EXAMPLE

    The following example reads a mmCIF coordinate file and checks for errors:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
      RC = MMDB.ReadCIFASCII ( "amylase.mmcif" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  Location of the error may be identified as precise as line
        //  number and the line itself. This information is now
        //  retrieved from MMDB input buffer:
        MMDB.GetInputBuffer ( S, lcount );
        if (lcount>=0) 
          printf ( "       LINE #%i:\n%s\n\n",lcount,S );
        else if (lcount==-1)
          printf ( "       CIF ITEM: %s\n\n",S );
        exit(1);
      }
    


    int CMMDBManager::ReadCIFASCII1 ( 
    pstr  LogFileName )
    PURPOSE
    Reading mmCIF coordinate files, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be read. This is a name of environmental variable (e.g. "xyzin"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::ReadCIFASCII but takes a logical, rather than physical, name of the file.


    int CMMDBManager::ReadMMDBF ( 
    pstr  FileName )
    PURPOSE
    Reading MMDB Binary coordinate files.
    ARGUMENTS
    pstr FileName
    Name of MMDB Binary file to be read.

    DESCRIPTION

    The function is identical to CMMDBManager::ReadCoorFile but reads only MMDB Binary coordinate files. Application may check for MMDB Binary format prior reading the file through function isMMDBBIN.

    NOTE : MMDB Binary files cannot be edited, therefore no sensible identification of read errors is provided. Neglecting mistakes in the Library, errors at reading a MMDB Binary file may appear only if the file is corrupted.


    EXAMPLE

    The following example reads a MMDB Binary coordinate file and checks for errors:

    CMMDBManager MMDB;
    int          RC;
      RC = MMDB.ReadMMDBF ( "coor.mmdb" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  no further identification of the error may be given
        exit(1);
      }
    


    int CMMDBManager::ReadMMDBF1 ( 
    pstr  LogFileName )
    PURPOSE
    Reading MMDB Binary coordinate files, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be read. This is a name of environmental variable (e.g. "xyzin"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::ReadMMDBF but takes a logical, rather than physical, name of the file.


    int CMMDBManager::GetFileType ( 
     )
    PURPOSE
    Retrieves the type (format) of coordinate file that has been read.
    DESCRIPTION

    This function is useful when coordinate file is read with automatical format recognition (cf. CMMDBManager::ReadCoorFile).


    RETURN

    The function returns one of the following codes:
    Code Value Description
    MMDB_FILE_Undefined -1 No file has been read
    MMDB_FILE_PDB 0 A PDB file has been read
    MMDB_FILE_CIF 1 A mmCIF file has been read
    MMDB_FILE_Binary 2 A MMDB Binary file has been read


    EXAMPLE

    The following example reads a coordinate file and checks for its format after reading:

    CMMDBManager MMDB;
    int          RC;
      RC = MMDB.ReadCoorFile ( CoorFileName );
      if (RC) {
        // check for errors
        ...................
        exit ( 1 );
      }
      // report format of the file
      switch (MMDBManager->GetFileType())  {
        case MMDB_FILE_PDB    : printf ( " PDB"         );  break;
        case MMDB_FILE_CIF    : printf ( " mmCIF"       );  break;
        case MMDB_FILE_Binary : printf ( " MMDB binary" );  break;
        default : printf ( " Unknown (report as a bug!)" );
      }
      printf ( " file %s has been read in.\n",CoorFileName );
    


    int isPDB ( 
    pstr  FileName )
    PURPOSE
    Checking on PDB ASCII files.
    ARGUMENTS
    pstr FileName
    Name of file to check on.

    DESCRIPTION

    The function makes a very fast check on whether FileName is a PDB ASCII file or not. No coordinate information is read.


    RETURN

    The function returns one of the following codes:
    -1 if file FileName does not exist
    0 if file FileName is likely a PDB file
    1 if file FileName is not a PDB file.


    int isMMDBBIN ( 
    pstr  FileName )
    PURPOSE
    Checking on MMDB Binary files.
    ARGUMENTS
    pstr FileName
    Name of file to check on.

    DESCRIPTION

    The function makes a very fast check on whether FileName is a MMDB Binary file or not. No coordinate information is read.


    RETURN

    The function returns one of the following codes:
    -1 if file FileName does not exist
    0 if file FileName is likely a MMDB Binary file
    1 if file FileName is not a MMDB Binary file.
    2 if file FileName is likely a MMDB Binary file but of a wrong edition (produced by Coordinate Library of a higher version).


    int isCIF ( 
    pstr  FileName )
    PURPOSE
    Checking on mmCIF files.
    ARGUMENTS
    pstr FileName
    Name of file to check on.

    DESCRIPTION

    The function makes a very fast check on whether FileName is a mmCIF file or not. No coordinate information is read.


    RETURN

    The function returns one of the following codes:
    -1 if file FileName does not exist
    0 if file FileName is likely a mmCIF file
    1 if file FileName is not a mmCIF file.


    void CMMDBManager::SetFlag ( 
    word  flag )
    PURPOSE
    Setting flag(s) of extra functionality.
    ARGUMENTS
    word flag
    The flag(s) to be set.

    DESCRIPTION

    Flags of extra functionality affect behavior of different Library functions. Several flags may be set up at once using the bitwise "or" ("|") operation. The following flags are defined:
    Flag Hexagonal Value Description
    MMDBF_AutoSerials 0x00000001 enforcing the serial numbers of atoms in Coordinate Section at reading a PDB file. Many PDB files violate requirement for strictly incremental order of serial numbers of atoms. Although such PDB files may be handled painlessly by Library, setting up this flag will assure that serial numbers of atoms will comply with PDB requirements.
    MMDBF_NoCoordRead 0x00000002 ignoring the coordinates at reading coordinate file. This may save time if information from only file header is required.
    MMDBF_SimRWBROOK 0x00000004 simulating messages, which were issuing by former RWBROOK interface at reading PDB file.
    MMDBF_PrintCIFWarnings 0x00000008 enforcing printout of all warning messages at reading mmCIF coordinate files. Normally coordinate files are read silently, and all warnings are reported through return code. Setting this flag on will make Library to print all warning messages immediately on discovering a potential problem. This may give better identification of the problem(s) in certain cases.
    MMDBF_EnforceSpaces 0x00000010 replacing unprintable characters for spaces at ASCII coordinate files. This affects symbols with decimal code less than 32 (<SPACE>), excluding <TAB>, <LF> and <CR>.
    MMDBF_IgnoreDuplSeqNum 0x00000020 ignoring duplicate sequence numbers and insertion codes for different residues. In a correct PDB file, each residue should have a unique combination of sequence number and insertion code. This rule is sometimes violated for heterogroups. Setting this flag On switches off checking for unique sequence number and insertion code.
    MMDBF_IgnoreSegID 0x00000040 ignoring different segment IDs met on different PDB records such as "ANISOU" that belong to the same atom. In a correct PDB file, this redundant information should be kept identical on all records belonging to the same file. Some programs violate this rule, hence there is an option to set this flag on.
    MMDBF_IgnoreElement 0x00000080 ignoring different element names met on different PDB records such as "ANISOU" that belong to the same atom. In a correct PDB file, this redundant information should be kept identical on all records belonging to the same file. Some programs violate this rule, hence there is an option to set this flag on.
    MMDBF_IgnoreCharge 0x00000100 ignoring different charges met on different PDB records such as "ANISOU" that belong to the same atom. In a correct PDB file, this redundant information should be kept identical on all records belonging to the same file. Some programs violate this rule, hence there is an option to set this flas on.


    void CMMDBManager::RemoveFlag ( 
    word  flag )
    PURPOSE
    Removing flag(s) of extra functionality.
    ARGUMENTS
    word flag
    The flag(s) to be removed.

    DESCRIPTION

    Flags of extra functionality affect behavior of different Library functions. Several flags may be removed at once using the bitwise "or" ("|") operation. The list of defined flags is found above.


    int CMMDBManager::WritePDBASCII ( 
    pstr  FileName )
    PURPOSE
    Writing PDB coordinate files.
    ARGUMENTS
    pstr FileName
    Name of PDB file to be written.

    DESCRIPTION

    The function outputs data from coordinate hierarchy as a PDB file. Only data which may be expressed in PDB terms is output. The data in the hierarchy does not change.


    RETURN

    Upon successful completion, the function returns 0. Non-zero returns indicate a problem, which prevented the Manager from completion the writing. See return codes and way of their handling in Error handling and return codes.


    EXAMPLE

    The following example reads mmCIF coordinate file and writes it back as a PDB file:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
      RC = MMDB.ReadCIFASCII ( "amylase.mmcif" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  Location of the error may be identified as precise as line
        //  number and the line itself. This information is now
        //  retrieved from MMDB input buffer:
        MMDB.GetInputBuffer ( S, lcount );
        if (lcount>=0) 
          printf ( "       LINE #%i:\n%s\n\n",lcount,S );
        else if (lcount==-1)
          printf ( "       CIF ITEM: %s\n\n",S );
        exit(1);
      }
      RC = MMDB.WritePDBASCII ( "amylase.pdb" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i WRITE:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        exit(2);
      }
    


    int CMMDBManager::WritePDBASCII1 ( 
    pstr  LogFileName )
    PURPOSE
    Writing PDB coordinate files, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be written. This is a name of environmental variable (e.g. "xyzout"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::WritePDBASCII but takes a logical, rather than physical, name of the file.


    int CMMDBManager::WriteCIFASCII ( 
    pstr  FileName )
    PURPOSE
    Writing mmCIF coordinate files.
    ARGUMENTS
    pstr FileName
    Name of mmCIF file to be written.

    DESCRIPTION

    The function outputs data from coordinate hierarchy as a mmCIF file. Only data which may be expressed in predefined mmCIF terms is output. "Predefined mmCIF terms" basically include data set, which is equivalent to that of PDB. The data in the hierarchy does not change.


    RETURN

    Upon successful completion, the function returns 0. Non-zero returns indicate a problem, which prevented the Manager from completion the writing. See return codes and way of their handling in Error handling and return codes.


    EXAMPLE

    The following example reads a PDB coordinate file and writes it back as a mmCIF file:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
      RC = MMDB.ReadPDBASCII ( "pdb1sar.ent" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  Location of the error may be identified as precise as line
        //  number and the line itself. This information is now
        //  retrieved from MMDB input buffer:
        MMDB.GetInputBuffer ( S, lcount );
        if (lcount>=0) 
          printf ( "       LINE #%i:\n%s\n\n",lcount,S );
        exit(1);
      }
      RC = MMDB.WriteCIFASCII ( "1sar.mmcif" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i WRITE:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        exit(2);
      }
    


    int CMMDBManager::WriteCIFASCII1 ( 
    pstr  LogFileName )
    PURPOSE
    Writing mmCIF coordinate files, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be written. This is a name of environmental variable (e.g. "xyzout"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::WriteCIFASCII but takes a logical, rather than physical, name of the file.


    int CMMDBManager::WriteMMDBF ( 
    pstr  FileName )
    PURPOSE
    Writing MMDB Binary files.
    ARGUMENTS
    pstr FileName
    Name of MMDB Binary file to be written.

    DESCRIPTION

    The function outputs data from coordinate hierarchy as a mmCIF file. All data which is contained in the hierarchy is output. The data in the hierarchy does not change.


    RETURN

    Upon successful completion, the function returns 0. Non-zero returns indicate a problem, which prevented the Manager from completion the writing. See return codes and way of their handling in Error handling and return codes.


    EXAMPLE

    The following example reads a PDB coordinate file and writes it back as MMDB Binary file:

    CMMDBManager MMDB;
    int          RC,lcount;
    char         S[500];
      RC = MMDB.ReadPDBASCII ( "pdb1sar.ent" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  Location of the error may be identified as precise as line
        //  number and the line itself. This information is now
        //  retrieved from MMDB input buffer:
        MMDB.GetInputBuffer ( S, lcount );
        if (lcount>=0) 
          printf ( "       LINE #%i:\n%s\n\n",lcount,S );
        exit(1);
      }
      RC = MMDB.WriteMMDBF ( "1sar.mmdb" );
      if (RC) {
        //  An error was encountered. MMDB provides an error messenger
        //  function for easy error message printing.
        printf ( " ***** ERROR #%i WRITE:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        exit(2);
      }
    


    int CMMDBManager::WriteMMDBF1 ( 
    pstr  LogFileName )
    PURPOSE
    Writing MMDB Binary files, by logical file name.
    ARGUMENTS
    pstr LogFileName
    Logical name of file to be written. This is a name of environmental variable (e.g. "xyzout"), whose value is physical name of the file.

    DESCRIPTION

    The function is completely similar to CMMDBManager::WriteMMDBF but takes a logical, rather than physical, name of the file.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_genrem.html0000644000175100017510000002056507504104345015463 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: General Remarks

    The Object interface represents a library of C++ classes, which match closely the General scheme. The data exchange in Object interface may therefore be represented as:

    for retrieval -
    locating the instance of needed class in the coordinate hierarchy and reading its data from public fields or through public functions
    for storing -
    either 1) creating the instance of needed class and placing it on the proper place in the coordinate hierarchy, or 2) rewriting public data fields (or protected data fields through the class' public functions) in the instance of needed class that is already present in the hierarchy.
    In most cases, these and many other functions (e.g. reading/writing the coordinate files, selection of atoms etc.) are provided by a special class called Manager, which excuses the application programmer of surfing the coordinate hierarchy and (most important) of direct changing it. Ideally, all communication with the hierarchy should go through the Manager; in practice, however, the Manager often provides a pointer to a class with fields opened for public access (e.g. atom class CAtom).

    It should be emphasized here that all public data fields are Ok to read, but they are not always Ok to change, unless there is a clear understanding of what is being done. Therefore many public data fields are to be changed only through the corresponding class' functions. This is mentioned wherever necessary. Although such fields should have been declared as protected, they are left public in order to avoid overhead of function calls at reading. This manual does not aim on exchaustive description of the Library's inside, therefore it should be kept in mind that relations between the most innocent data fields in classes may be not as trivial as they seem to be. Breaking such relations in a dynamically linked hierarchy will, as a normal, cause crash.

    This manual does not describe all data fields and functions of classes (not even all public functions and fields) and far not all the classes, which are in the Library. The application developer is expected to keep along the following simple rule: if something is not documented, it must not be used. Undocumented classes, functions and fields are only for internal Library functioning, and some of them were temporary left public only because the Library is being developed.

    Knowing the following will help to understand some pieces of code and write applications which comply by data types with the Library:
    1. Source file relations: any *.cpp file has a corresponding header file *.h. The opposite is not always correct. Therefore in this manual we refer only to header files, assuming that implementational part of them, if there is any, may be easily located.

    2. Class and structure name conventions
      • class names always start with capital "C", for example CMMDBManager, CChain, CResidue
      • similarly, structure names always start with capital "S"
      • pointers on classes and structures are formed with prefix "P", for example PCChain, PCResidue
      • references to classes and structures are formed with prefix "R", for example RCChain, RCResidue
      • for each class and structure, the Library automatically provides type of the corresponding class, its pointer, reference, pointer on pointer and reference of pointer. For example, definition of class CChain is accompanied by definition of types PCChain, RCChain, PPCChain and RPCChain.

    3. Type definitions
      • all used mathematical types, which are not part of standard C and C++, are defined in file mattype_.h
      • all types, which are specific to coordinate context, are defined in file mmdb_defs.h
      • it is strongly advised to use realtype instead of float or double float types in applications.

    4. File input/output: all file operations in the Library are done through the class CFile (found in file file_.h). There is no requirement for application to use it instead of standard means. However, if application derives classes from those of Library, it must assure compliency with Library on input/output of classes. The only way to do that implies using the class CFile for input/output operations within each derived class. More details about this are found in File operations on Library's classes.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_types.html0000644000175100017510000010231207504104362015340 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Types and Constants



    Table Description
    Mathematical types Mathematical types used by Library.
    Mathematical constants Mathematical constants used by Library.
    Coordinate-relating types Data types relating to coordinate context.


    Mathematical types

    All mathematical types used by Library, which are not part of standard C and C++ (except those for classes, see below), are defined in file mattype_.h. They are collected in the table below.

    Some type definitions depend on whether the Library was compiled with UseDoubleFloat flag on or off. This flag is set on the very top of file mattype_.h. By default, this flag is set "on".

    Type definitions for classes and structures are made in places where the classes/structures are first introduced (normaly in header files). These definitions are done in a uniform way by applying macros DefineClass and DefineStructure. Class and structure type definition convention is described in General Remarks.

    Type Definition
    "double float on"
    Definition
    "double float off"
    Description
    pstr char * char * pointer on character, or string of characters
    byte unsigned char unsigned char byte
    byteptr byte * byte * pointer on byte, or string of bytes
    shortint signed char signed char 8-bit integer
    Boolean unsigned char unsigned char logical variable ('True' or 'False')
    word unsigned int unsigned int 32-bit word
    realtype double (64-bit) float (32-bit) real variable
    rvector double * float * vector of real numbers
    ivector int * int * vector of integer numbers
    wvector word * word * vector of words
    bvector byte * byte * vector of bytes or logical numbers
    lvector long * long * vector of long integers
    psvector pstr * pstr * vector of character strings
    rmatrix rvector * rvector * matrix of real numbers
    imatrix ivector * ivector * matrix of integer numbers
    wmatrix wvector * wvector * matrix of words
    bmatrix bvector * bvector * matrix of bytes or logical numbers
    lmatrix lvector * lvector * matrix of long integers
    psmatrix psvector * psvector * matrix of character strings
    rmatrix3 rmatrix * rmatrix * 3D matrix of real numbers
    imatrix3 imatrix * imatrix * 3D matrix of integer numbers
    wmatrix3 wmatrix * wmatrix * 3D matrix of words
    bmatrix3 bmatrix * bmatrix * 3D matrix of bytes or logical numbers
    lmatrix3 lmatrix * lmatrix * 3D matrix of long integers
    psmatrix3 psmatrix * psmatrix * 3D matrix of character strings


    Mathematical constants

    All mathematical constants used by Library, which are not part of standard C and C++, are defined in file mattype_.h. They are collected in the table below.

    Some constant definitions depend on whether the Library was compiled with UseDoubleFloat flag on or off. This flag is set on the very top of file mattype_.h. By default, this flag is set "on".

    Constant Definition
    "double float on"
    Definition
    "double float off"
    Description
    MinReal 2.2250e-308 1.1755e-38 minimal real number
    MaxReal 1.7976e+308 3.4020e+38 maximal real number
    True 1 1 logical "true"
    False 0 0 logical "false"
    MinInt -32768 -32768 minimal 16-bit integer number
    MaxInt 32767 32767 maximal 16-bit integer number
    MaxWord 65535 65535 maximal 16-bit word
    MinInt4 -2147483647 -2147483647 minimal 32-bit integer number
    MaxInt4 2147483647 2147483647 maximal 32-bit integer number
    MaxWord4 4294967295 4294967295 maximal 32-bit word
    Pi 3.141592653589793238462643 3.141592653589793238462643 Arkhimed's "Pi"
    Eu 2.718281828459045235360287 2.718281828459045235360287 Euler's "e"
    ln10 2.3025850929940456840179915 2.3025850929940456840179915 logarithm of 10


    Coordinate-relating types

    Data types, which relate to coordinate context, are defined in file mmdb_defs.h. They are collected in the table below.

    It is important that application uses the proposed types, for compliency with future changes of the Library.

    Type Definition Description
    ChainID char[10] Chain ID (extension of 1-letter PDB chain ID). Chain ID is set to empty string (""), if no chain ID is given in the coordinate file. Only first character (space if chain ID is empty) may be output into PDB file
    PChainID ChainID * Pointer on chain ID
    ResName char[20] Residue name (extension of 3-letter PDB residue name). A minimum of 1 character must be in the name, leading and padding spaces must not appear. Only 3 first characters (right-justified) may be output into PDB file
    InsCode char[10] Insertion code (extension of 1-letter PDB insertion code). Insertion code is set to empty string (""), if no insertion code is given in the coordinate file. Only first character (space if insertion code is empty) may be output into PDB file
    AtomName char[20] Atom name (extension of 4-letter PDB atom name). Leading and padding spaces are significant. Only first 4 characters (left-justified, leading spaces do count) may be output into PDB file
    AltLoc char[20] Alternate location indicator (extension of 1-letter PDB alternate location indicator). The field is set to empty string (""), if no alternate location indicator is given in the coordinate file. Only first character (space if the field is empty) may be output into PDB file
    Element char[20] Chemical element name (extension of 2-letter PDB chemical element name). A minimum of 2 characters must be in the field. All spaces are significant: 1-letter element codes come with leading space (" H" for hydrogen). Only first 2 characters may be output into PDB file
    SegID char[20] Segment ID (extension of 4-letter PDB segment ID). Leading and padding spaces are significant. Only first 4 characters (left-justified, leading spaces do count) may be output into PDB file
    AtCharge char[20] Charge on atom (extension of 2-letter PDB description of atom charge). All spaces are significant, and only 2 first characters (left-justified, leading spaces do count) may be output into PDB file.
    IDCode char[12] Entry code (extension of 4-letter PDB code). A minimum of 4 characters must be in entry code; only first 4 characters may be output into PDB file
    PIDCode IDCode * Pointer on entry code
    HelixID char[20] Helix ID (extension of 3-letter PDB helix ID). Only up to first 3 characters may be output into PDB file
    StrandID char[20] Strand ID (extension of 3-letter PDB strand ID). Only up to first 3 characters may be output into PDB file
    SheetID char[20] Sheet ID (extension of 3-letter PDB sheet ID). Only up to first 3 characters may be output into PDB file
    TurnID char[20] Turn ID (extension of 3-letter PDB turn ID). Only up to first 3 characters may be output into PDB file
    SymGroup char[30] Group of space symmetry (extension of 11-letter PDB space symmetry group name). Only up to first 11 characters may be output into PDB file
    Date char[12] Date in format DD-MMM-YYYY. When output into PDB file, the field is converted to DD-MMM-YY; when output into mmCIF file - to YYYY-MM-DD
    RecName char[7] Name of PDB record (PDB record keyword)
    DBName char[10] Sequence database name
    DBAcCode char[20] Sequence database accession code
    DBIdCode char[20] Sequence database identification code
    vect3 realtype[3] vector of 3 real numbers
    vect4 realtype[4] vector of 4 real numbers
    mat33 vect3[3] matrix 3x3 of real numbers
    mat44 vect4[4] matrix 4x4 of real numbers
    mat633 mat33[6] 3D matrix 6x3x3 of real numbers



    Back to index
    mmdb-1.23.2.1/docs/object/cl_obj_uddata.html0000644000175100017510000003631207505557043015455 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: User-defined data.

    User-defined data (UDD) is the type of data, which is not found in PDB and mmCIF coordinate files, which does not have predefined meaning and which becomes known only at run-time. UDD may be saved into and retrieved from MMDB binary files.

    UDD are allowed on any level of the coordinate hierarchy. This means that arbitrary number of UDDs may be added to any atom, any residue and any model.

    In MMDB, UDDs are identified by three characteristics:
     
    Identification Description
    math type   real numbers, integers or strings
    registration type    coordinate hierarchy level:
    UDR_ATOM   UDD for atoms
    UDR_RESIDUE   UDD for residues
    UDR_CHAIN   UDD for chains
    UDR_MODEL   UDD for models
    name   a unique UDD name

    Before a UDD may be used, its name and type must be registered. You may register any number of UDDs for any level of the coordinate hierarchy, however you are free in how to populate them. For example, if you register a integer UDD for atoms may be named "colour", and another one - "history", they may be found both in the same atom, or one without another, or none.

    After registering a UDD, application gets a unique handle, which is then used in all UDD-related functions. These functions are provided as methods of atoms, residues, chains and models.

    Function Purpose
    CMMDBManager::RegisterUDInteger Registering a user-defined data of integer type.
    CMMDBManager::RegisterUDReal Registering a user-defined data of real type.
    CMMDBManager::RegisterUDString Registering a user-defined data of string type.
    CMMDBManager::GetUDDHandle Obtaining a handle for already registered UDD..


    int CMMDBManager::RegisterUDInteger ( 
    int  udr_type, 
    pstr UDDataID )
    PURPOSE
    Registering a user-defined data of integer type.
    ARGUMENTS
    int udr_type
    The UDD registration type.

    pstr UDDataID
    The UDD name, or ID. This name has to be unique for each registration.

    DESCRIPTION

    The function registers an integer User-Defined Data for the level of coordinate hierarchy identified by udr_type under name UDDataID.


    RETURN

    The function returns a UDD handle, which provides further access to the registered UDD. The handle is non-zero and unique. Zero return means registration failure. If the function returns UDDATA_WrongUDRType it means that udr_type was given a wrong value (this will not happen if you use constants UDR_XXXX described above.


    EXAMPLE

    Register two UDD integers for atoms, named "color" and "history", then write and read them:

    PCMMDBManager  MMDB;
    PCAtom         A;
    int            uddHandle1,uddHandle2, V,rc;
    
      . . . . . . . . . . . . . . . . . . . . . . . .
    
      uddHandle1 = MMDB->RegisterUDInteger ( UDR_ATOM,"color"   );
      uddHandle2 = MMDB->RegisterUDInteger ( UDR_ATOM,"history" );
      if ((!uddHandle1) || (!uddHandle2))  {
        printf ( " registration failed.\n" );
        exit ( 1 );
      }
      if ((uddHandle1==UDDATA_WrongUDRType) || 
          (uddHandle2==UDDATA_WrongUDRType))  {
        printf ( " wrong registration type used.\n" );
        exit ( 2 );
      }
    
      A = MMDB->GetAtom ( "/1/A/33(SER).B/CA[C].A" );
      if (A->PutUDData(uddHandle1,12)!=UDDATA_Ok)  {
        printf ( " failed to store UDD 'color'.\n" );
        exit ( 3 );
      }
      if (A->PutUDData(uddHandle2,22)!=UDDATA_Ok)  {
        printf ( " failed to store UDD 'history'.\n" );
        exit ( 4 );
      }
    
      rc = A->GetUDData ( uddHandle1,V );
      switch (rc)  {
    
        case  UDDATA_WrongUDRType :
          printf ( " wrong UDD registration type when accessing 'color'.\n" );
          exit ( 5 );
    
        case  UDDATA_WrongHandle  :
          printf ( " wrong UDD handle when accessing 'color'.\n" );
          exit ( 6 );
    
        case  UDDATA_NoData :
          printf ( " UDD 'color' not found.\n" );
          exit ( 7 );
    
        case  UDDATA_Ok :
          printf ( " UDD 'color' is set to %i.\n",V );
          break;
    
        default :
          printf ( " Unknown UDD return %i.\n",rc );
          exit ( 8 );
      }
    
      A->GetUDData ( uddHandle2,V );
      printf ( " UDD 'history' is set to %i.\n",V );
    
      . . . . . . . . . . . . . . . . . . . . . . . . . .
    
    


    int CMMDBManager::RegisterUDReal ( 
    int  udr_type, 
    pstr UDDataID )
    PURPOSE
    Registering a user-defined data of real type.
    ARGUMENTS
    int udr_type
    The UDD registration type.

    pstr UDDataID
    The UDD name, or ID. This name has to be unique for each registration.

    DESCRIPTION

    The function registers a real-type User-Defined Data for the level of coordinate hierarchy identified by udr_type under name UDDataID.

    The function is conceptually identical to CMMDBManager::RegisterUDInteger.


    int CMMDBManager::RegisterUDString ( 
    int  udr_type, 
    pstr UDDataID )
    PURPOSE
    Registering a user-defined data of string type.
    ARGUMENTS
    int udr_type
    The UDD registration type.

    pstr UDDataID
    The UDD name, or ID. This name has to be unique for each registration.

    DESCRIPTION

    The function registers a string-type User-Defined Data for the level of coordinate hierarchy identified by udr_type under name UDDataID.

    The function is conceptually identical to CMMDBManager::RegisterUDInteger.


    int CMMDBManager::GetUDDHandle ( 
    int  udr_type, 
    pstr UDDataID )
    PURPOSE
    Obtaining a handle for already registered UDD..
    ARGUMENTS
    int udr_type
    The UDD registration type.

    pstr UDDataID
    The UDD name, or ID.

    DESCRIPTION

    The function retrieves the UDD handle for the specified data. The UD data must be already registered with either of functions CMMDBManager::RegisterUDInteger, CMMDBManager::RegisterUDReal or CMMDBManager::RegisterUDString. The function accepts exactly the same parameters as those used at registration.


    RETURN

    A positive return represents the UDD handle, which may be then used for retrieving the UDD (cf. example). A zero return means that the UDD was not registered (no handle found). Return UDDATA_WrongUDRType means that udr_type was given a wrong value (this will not happen if you use constants UDR_XXXX described above.

    NOTE : The UDD handles may change after reading from MMDB binary file. It is therefore advisable that you do not store UDD handles in the file, but rather obtain them from GetUDDHandle as necessary.



    Back to index
    mmdb-1.23.2.1/docs/object/cl_object.html0000644000175100017510000000640507504104465014622 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface for C and C++ programmers

    CONTENTS

    1. General remarks

    2. Types and constants

    3. Initialization, memory allocation and miscellaneous functions

    4. Interface functionality

    5. File operations on Library's classes

    6. Error handling and return codes

    7. Index



    Back to general Library index
    mmdb-1.23.2.1/docs/object/cl_obj_irets.html0000644000175100017510000005604607504104374015341 00000000000000 CCP4 Coordinate Library Project / Object interface

    CCP4 Coordinate Library Project

    Object interface: Error Handling and Return Codes.

    It is common for Library functions and class functions to use integer return as an indicator on the success of operation. Successful operations normally return 0 (with a few exceptions for this rule; these are mentioned wherever necessary). An application may then check the return code and branch the execution according to that.

    The Library provides a function which returns a sensible ASCII description for every error code. This feature may be not always convenient, since grammar of the message cannot be adjust to any situation; however it will definitely save for developing. A special function delivers location of problems arising at reading coordinate files. Description of these functions and table of error codes are found below.

    Function Purpose
    GetErrorDescription Returns a sensible ASCII description for error codes.
    CMMDBManager::GetInputBuffer Retrieves the location of input error.


    Table Description
    Error Codes Library's error codes


    pstr GetErrorDescription ( 
    int  ErrorCode )
    PURPOSE
    Returns a sensible ASCII description for error codes.
    ARGUMENTS
    int ErrorCode
    An error code returned by Library function.

    NOTE : For successful operation (return code 0), this function returns non-empty line "No errors".


    void CMMDBManager::GetInputBuffer ( 
    pstr  Line, 
    int & count )
    PURPOSE
    Retrieves the location of input error.
    ARGUMENTS
    pstr Line
    A buffer to accept the information on input error; must be at least 100 bytes long (physical input buffer, from which the information is copied, is 500 bytes long).

    int & count
    An integer return code, which is interpreted as described below.

    DESCRIPTION

    The meaning of information, returned in Line, is determined by the value of return in count.

    Non-negative values of count mean that the error was encountered on the stage of reading an input ASCII file. In this case, Line gives the erroneous input line and count gives its number as counted from the top of file.

    If count returns -1, it means that the error was encountered at interpreting the mmCIF context, after the whole mmCIF file has been read. In this case, Line countains mmCIF item (category.name), which caused the fault.

    If count returns -2, the error was found at reading the MMDB binary file. Line is set to an empty string ("") in this case; such errors are not recoverable and may occur only if the binary file was corrupted.


    EXAMPLE

    PCMMDBManager  MMDB;
    char           S[100];
    int            RC,lcount;
    
      MMDB = new CMMDBManager();
    
      // read a coordinate file
      RC = MMDB->ReadCoorFile ( CoorFileName );
    
      // Check for possible errors:
      if (RC) {
        //  first issue a general message identifying the nature of error:
        printf ( " ***** ERROR #%i READ:\n\n %s\n\n",RC,GetErrorDescription(RC) );
        //  now try to locate the error
        MMDB->GetInputBuffer ( S,lcount );
        if (lcount>=0)       // it was an erroneous line in input file
          printf ( "       LINE #%i:\n%s\n\n",lcount,S );
        else if (lcount==-1) // something was wrong with mmCIF context
          printf ( "       CIF ITEM: %s\n\n",S );
        else if (lcount==-2) // corrupted binary file
          printf ( "       CORRUPTED BINARY FILE\n\n" );
        else
          printf ( "       ERROR CANNOT BE LOCATED\n\n" );
        //  dispose instance of MMDB and quit:
        delete MMDB;
        exit ( 1 );
      }
    
      // go on working on coordinates
      ...............................
    


    Error Codes

    The Library's Error Codes are listed in file mmdb_defs.h; their names start with prefix Error_. Existing error codes are not likely to change in the future, however the list of codes may be expanded. Nevertheless it is strictly advisable to error codes them by their names (as given below) and not by their numerical values.

    Code Name Value Description
    Error_NoError
    Error_Ok
    0 No error encountered
    Error_WrongSection 1 Records in PDB file are in a wrong order.
    Error_WrongChainID 2 A sequence of PDB or mmCIF records that ought to have the same chain ID, shows different chain IDs.
    Error_WrongEntryID 3 A PDB or mmCIF record that ought to display this entry's ID, shows an ID contradicting to that in header.
    Error_SEQRES_serNum 4 Serial numbers of SEQRES records do not increment by 1.
    Error_SEQRES_numRes 5 Different SEQRES records that belong to the same sequence show different number of residues in the sequence.
    Error_SEQRES_extraRes 6 SEQRES records contain more residues than specified.
    Error_NCSM_Unrecognized 7 Unrecognized numerical format of input in MTRIXn PDB records.
    Error_NCSM_AlreadySet 8 A duplicate MTRIXn PDB record encountered.
    Error_NCSM_WrongSerial 9 Wrong serial number in MTRIXn PDB record.
    Error_NCSM_UnmatchIG 10 A sequence of MTRIXn PDB records that ought to have the same iGiven flag, shows different flags on different records.
    Error_ATOM_Unrecognized 11 Unrecognized numerical format of data fields in a record from the Coordinate Section of a PDB file (ATOM, HETATM, SIGATM, ANISOU, SIGUIJ, TER, MODEL).
    Error_ATOM_AlreadySet 12 Duplicate record from the Coordinate Section of a PDB file (ATOM, HETATM, SIGATM, ANISOU, SIGUIJ, TER, MODEL).
    Error_ATOM_NoResidue 13 Missing residue name or sequence number or ambiguity in residue names/sequence numbers/insertion codes in record(s) from the Coordinate Section of a PDB file (ATOM, HETATM, SIGATM, ANISOU, SIGUIJ, TER).
    Error_ATOM_Unmatch 14 Ambiguity between different records record(s) from the Coordinate Section of a PDB file (ATOM, HETATM, SIGATM, ANISOU, SIGUIJ, TER) belonging to the same atom.
    Error_CantOpenFile 15 A file can not be opened.
    Error_UnrecognizedInteger 16 Wrong ASCII format of an integer.
    Error_WrongModelNo 17 Model number is not positive.
    Error_DuplicatedModel 18 Repeating serial model number encountered.
    Error_NoModel 19 No model defined.
    Error_ForeignFile 20 Attempt to read a file of unknown type.
    Error_WrongEdition 21 The MMDB binary file attempted to be read, was created by a higher-version Library.
    Error_NotACIFFile 22 A file attempted to be read as a mmCIF file, was not recognized as such.
    Error_NoData 23 Expected data field in mmCIF file (either following a tag or in loop) not found.
    Error_UnrecognizedCIFItems 24 Unrecognized syntactical elements were encountered in a mmCIF file.
    Error_MissingCIFField 25 Expected item(s) in mmCIF file were not found.
    Error_EmptyCIFLoop 26 An empty CIF loop encountered.
    Error_UnexpectedEndOfCIF 27 A mmCIF file is terminated incorrectly.
    Error_MissgCIFLoopField 28 Inconsistent CIF loop (wrong number of loop fields).
    Error_NotACIFStructure 29 A CIF category expected to be a structure, is a loop.
    Error_NotACIFLoop 30 A CIF category expected to be a loop, is a structure.
    Error_UnrecognizedReal 31 Wrong ASCII format of a real.
    Error_NoSheetID 32 A PDB SHEET record is missing sheet ID code.
    Error_WrongSheetID 33 A sequence of PDB SHEET records that ought to have the same sheet ID, shows different IDs on different records.
    Error_WrongStrandNo 34 Non-positive strand serial number encountered.
    Error_WrongNumberOfStrands 35 Contradiction in number of strands, derived from different categories of a mmCIF file for a given sheet.
    Error_WrongSheetOrder 36 Incomplete category _struct_sheet_order in mmCIF file.
    Error_HBondInconsistency 37 Inconsistency in category _struct_sheet_hbond in mmCIF file.
    Error_EmptyResidueName 38 A PDB record from coordinate section does not have a residue name.
    Error_DuplicateSeqNum 39 PDB records from coordinate section show the same sequence number and insertion code in the same chain assigned to more than one residue name.
    Error_NoLogicalName 40 Logical file name was not found. This means that the corresponding environmental variable was not set properly.



    Back to index
    mmdb-1.23.2.1/configure.ac0000644000175100017510000000042711475672031012077 00000000000000 AC_INIT AM_INIT_AUTOMAKE(mmdb, 1.23.2.1) # AM_MAINTAINER_MODE AC_PROG_CXX MMDB_LT_VERSION="0:1:0" AC_SUBST(MMDB_LT_VERSION) AC_CONFIG_MACRO_DIR([m4]) # for autoheader to work, AM_CONFIG_HEADER(config.h) AM_PROG_LIBTOOL AC_OUTPUT(Makefile src/Makefile examples/Makefile) mmdb-1.23.2.1/missing0000755000175100017510000002623311475672046011221 00000000000000#! /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 , 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 . # 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 ." 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: