commoncpp2-1.8.1/0000755000175000017500000000000011463572774010617 500000000000000commoncpp2-1.8.1/demo/0000755000175000017500000000000011463572774011543 500000000000000commoncpp2-1.8.1/demo/buffer.cpp0000644000175000017500000000667411463314534013441 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class MyThread : public Buffer, public Thread { private: short chars[8]; unsigned head, tail; void run(void); size_t onWait(void *buf); size_t onPost(void *buf); size_t onPeek(void *buf); public: MyThread(); ~MyThread(); }; MyThread::MyThread() : Buffer(8), Thread() { head = tail = 0; } MyThread::~MyThread() { terminate(); } size_t MyThread::onWait(void *buf) { char *bp = (char *)buf; *bp = (char)chars[head++]; if(head >= 8) head = 0; return 1; } size_t MyThread::onPost(void *buf) { char *bp = (char *)buf; chars[tail++] = *bp; if(tail >= 8) tail = 0; return 1; } size_t MyThread::onPeek(void *buf) { char *bp = (char *)buf; if(head == tail) return 0; *bp = (char)chars[head]; return 1; } void MyThread::run(void) { int rc; char cbuf; for(;;) { rc = wait(&cbuf, 5000); if(rc < 0) cout << "timeout" << endl; else { cout << "char " << cbuf << endl; Thread::sleep(50); } } } extern "C" int main(int argc, char **argv) { char buffer[32]; const char *cp; MyThread *thr = new MyThread(); thr->start(); for(;;) { cin.getline(buffer, sizeof(buffer)); if(!strnicmp(buffer, "bye", 3)) break; cp = buffer; while(*cp) thr->post((void *)(cp++), 0); cout << "post complete!" << endl; } delete thr; return 0; } commoncpp2-1.8.1/demo/test_alog.cpp0000644000175000017500000000672611463314534014147 00000000000000/* * ===================================================================================== * * Filename: test_alog.cpp * * Description: file to test alog and AppLog * * Version: 1.0 * Created: 17/03/2009 14:49:21 * Compiler: g++ * * Author: Angelo Naselli (an), anaselli@linux.it (C) 2009 * Copyright: See COPYING file that comes with this distribution * * ===================================================================================== */ #include #include #ifdef CCXX_NAMESPACES using namespace ost; #endif class ThreadTest: public Thread { static AppLog::Ident mod_name; void final ( void ); void initial ( void ); int _id; public: ThreadTest ( int id ); void run(); }; AppLog::Ident ThreadTest::mod_name ( "ThreadTest" ); ThreadTest::ThreadTest ( int id ) : Thread(), _id ( id ) { } void ThreadTest::final() { alog << mod_name << info << __PRETTY_FUNCTION__ << " id " << _id << endl; alog.unsubscribe(); } void ThreadTest::initial() { //Init applog data alog.subscribe(); alog.level ( Slog::levelInfo ); alog << mod_name << info << __PRETTY_FUNCTION__ << " id " << _id << endl; } void ThreadTest::run() { alog << mod_name << debug << __PRETTY_FUNCTION__ << " id " << _id << endl; alog << mod_name << info << __PRETTY_FUNCTION__ << " id " << _id << endl; alog << mod_name << warn << __PRETTY_FUNCTION__ << " id " << _id << endl; alog << mod_name << alert << __PRETTY_FUNCTION__ << " id " << _id << endl; Thread::sleep ( 10 ); alog << mod_name << error << __PRETTY_FUNCTION__ << " id " << _id << endl; alog << mod_name << notice << __PRETTY_FUNCTION__ << " id " << _id << endl; alog << mod_name << critical << __PRETTY_FUNCTION__ << " id " << _id << endl; alog << mod_name << emerg << __PRETTY_FUNCTION__ << " id " << _id << endl; Thread::sleep ( 100 ); } int main() { AppLog::Ident mod_name ( "main" ); // uncomment third parameter to test log over pipe alog.logFileName ( "./test_alog.log", false /*, true */); alog.subscribe(); alog.level ( Slog::levelDebug ); alog.slogEnable ( false ); // default false alog.clogEnable ( true ); alog << mod_name << info << "testAlog V. 1.0.0" << std::endl; alog.clogEnable ( false ); // change level for module ThreadTest to info alog.identLevel ( "ThreadTest", AppLog::levelTranslate ( "warn" ) ); alog << mod_name << debug << __PRETTY_FUNCTION__ << " Starting t1 warn level" << endl; ThreadTest t1 ( 1 ); t1.start(); t1.join(); alog << mod_name << debug << __PRETTY_FUNCTION__ << " t1 finished" << endl; alog << mod_name << debug << __PRETTY_FUNCTION__ << " Starting t2 and t3 enabling debug level" << endl; alog.identLevel ( "ThreadTest", AppLog::levelTranslate ( "debug" ) ); ThreadTest t2 ( 2 ), t3 ( 3 ); t2.start(); t3.start(); alog << mod_name << info << __PRETTY_FUNCTION__ << " Waiting 1000 ms" << endl; Thread::sleep ( 1000 ); alog << mod_name << warn << __PRETTY_FUNCTION__ << " end test" << endl; alog << mod_name << info << "open a new log file, called testAlog.log" << endl; AppLog newLog ( "./testAlog.log" ); newLog.subscribe(); newLog << mod_name << info << "This is a new log" << endl; // HEXdump testing unsigned char buff[10] ; for (int i=0; i<10; i++) buff[i] = i+48; newLog << info << HEXdump(buff, 10) << std::endl; newLog << info << __PRETTY_FUNCTION__ << " end test" << endl; return 0; } commoncpp2-1.8.1/demo/dccpserver.cpp0000644000175000017500000001013711463314534014315 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2009 Leandro Melo de Sales // // This example demonstrates the operation of a server DCCP, // where awaiting connections locally, when a client connects, // the server creates a client to make operations for reading and writing data // in socket. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class MyDCCPSocket : public DCCPSocket { public: MyDCCPSocket(IPV4Host &ia, tpport_t port); ssize_t myReadLine(char* buf); ssize_t myWriteData(const char *buf); void myBufferSize(unsigned size); }; void MyDCCPSocket::myBufferSize(unsigned size){ this->bufferSize(size); } MyDCCPSocket::MyDCCPSocket(IPV4Host &ia, tpport_t port) : DCCPSocket(ia, port) {} //This method read data on socket ssize_t MyDCCPSocket::myReadLine(char* buf){ return this->readLine(buf, 200); } //This method writes data on socket ssize_t MyDCCPSocket::myWriteData(const char *buf){ return this-> writeData(buf,strlen(buf)); } int main(int argc, char *argv[]) { //address of local interface tpport_t port = 7000; IPV4Host addr = "127.0.0.1"; //Startup of server DCCP MyDCCPSocket server(addr,port); //message to be written to the socket char mss[] = "Hello Client\n"; char buffer[200]; cout << "Server wait connections in " << addr << ":" << port << endl; //loop of waiting for connections while(server.isPendingConnection(30000)) { //accept the connection to the client if (server.onAccept(addr,port)) { //Is created to a client operation of reading and writing data in socket MyDCCPSocket client(server); //reading data from socket client.myReadLine(buffer); client.myBufferSize(15); //printing the data read cout << buffer << endl; ///call the method of writing data client.myWriteData(mss); } else cout << "Unable to accept the connection to the remote client" << endl; } cout << "timeout after 30 seconds inactivity, exiting" << endl; return 0; } commoncpp2-1.8.1/demo/xmlfetch.cpp0000644000175000017500000000734311463314534013774 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class myXMLParser : public URLStream, public XMLStream { private: void httpHeader(const char *header, const char *value) { cout << "HEADER " << header << "=" << value << endl; } int read(unsigned char *buffer, size_t len) { URLStream::read((char *)buffer, len); len = gcount(); return len; } void startDocument(void) { cout << "START DOCUMENT" << endl; } void endDocument(void) { cout << "END DOCUMENT" << endl; } void characters(const unsigned char *text, size_t len) { cout << "CHARS="; while(len--) cout << *(text++); cout << endl; } void comment(const char *text) { cout << "COMMENT=" << text << endl; } void startElement(const unsigned char *name, const unsigned char **attr) { cout << "<" << name; if(attr) { while(*attr) { cout << " " << *(attr++); cout << "=" << *(attr++); } } cout << ">" << endl; } void endElement(const unsigned char *name) { cout << "" << endl; } public: void Close(void) { URLStream::close(); } }; int main(int argc, char **argv) { myXMLParser xml; URLStream::Error status; // url.setProxy("home.sys", 8000); #ifdef CCXX_EXCEPTIONS try { #endif while(--argc) { ++argv; cout << "fetching " << *argv << endl; status = xml.get(*argv); if(status) { cout << "failed; reason=" << status << endl; xml.Close(); continue; } cout << "Parsing..." << endl; if(!xml.parse()) cout << "not well formed..." << endl; xml.Close(); cout << ends; } #ifdef CCXX_EXCEPTIONS } catch(...) { cerr << "url " << *argv << " failed" << endl; } #endif } commoncpp2-1.8.1/demo/dccpclient.cpp0000644000175000017500000000673411463314534014275 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2009 Leandro Melo de Sales // // This example demonstrates the operation of a client DCCP, // where it connects to a server through the address and port, // after you connect to the server it writes data to the socket. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class MyDCCPSocket : public DCCPSocket { public: ssize_t myWriteData(const char *buf); ssize_t myReadLine(char* buf); void myBufferSize(unsigned size); }; void MyDCCPSocket::myBufferSize(unsigned size){ this->bufferSize(size); } //This method writes data on socket ssize_t MyDCCPSocket::myWriteData(const char *buf){ return this-> writeData(buf,strlen(buf)); } //This method read data on socket ssize_t MyDCCPSocket::myReadLine(char* buf){ return this->readLine(buf, 200); } int main(int argc, char *argv[]) { //port and address of the server to connect tpport_t port = 7000; IPV4Host addr= "127.0.0.1"; //Startup of client DCCP MyDCCPSocket client; cout << "Try connect server in " << addr << ":" << port << endl; //client connects to the server client.connect(addr,port); //message to be written to the socket char mss[] = "Hello Server\n"; //call the method of writing data client.myWriteData(mss); //call the method of reading data char buffer[200]; client.myReadLine(buffer); //printing the data read cout << buffer << endl; return 0; } commoncpp2-1.8.1/demo/serialecho.h0000644000175000017500000000232011463314534013733 00000000000000/** ******************************************************************** * C/C++ Source: serialecho.h * * Class definitions for the SerialEcho and related classes. * This package requires the Serial, TTYSession and Thread classes * from the FSF Common C++ library (v 1.2.4 cplusplus.sourceforge.net) * * SerialEcho is a monitor on the serial port which runs in its own * thread and is responsible for detecting and echoing any serial * input. The class is based on the ttysession class so it can be * used as any fstream-like class * * @author: Gary Lawrence Murphy * Copyright: 2000 TeleDynamics Communications Inc (www.teledyn.com) ******************************************************************** */ #ifndef SERIALECHO_H #define SERIALECHO_H #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class SerialEcho : public TTYSession { public: SerialEcho(const char *device, int priority = 0, int stacksize = 0); // Exception classes class xError{}; // nebulous inexplicable error class xLocked{}; // port is there but we are locked out class xOverrun{}; // too much data, too little time protected: void run(); }; #endif commoncpp2-1.8.1/demo/timer.cpp0000644000175000017500000000077111463314534013300 00000000000000 #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif int main(int argc, char* argv[]) { TimerPort timer; unsigned i = 12; time_t now, start; time(&start); timer.setTimer(); fflush(stdout); while(i--) { timer.incTimer(250); Thread::sleep(250); printf("!"); fflush(stdout); } time(&now); printf("%ld", now - start); for(;;) { timer.incTimer(100); timer.sleepTimer(); printf("."); fflush(stdout); } return 0; } commoncpp2-1.8.1/demo/SampleSocketPort.h0000644000175000017500000001267311463314534015070 00000000000000/** * * This class demonstrates use of the CommonC++ SocketPort class. * * Copyright 2001 - Nick Liebmann * * This sample code is distributed under the same terms and conditions of the CommonC++ library. */ #include #ifdef CCXX_NAMESPACES using namespace ost; using namespace std; #endif #define MAX_RXBUF 32768 /**< Specifies the maximum number of bytes in a 'packet' */ #define MAX_RXTIMEOUT 10000 /**< Specifies how long we will wait for a complete packet */ #define DISCONNECT_MS 500 /**< Specifies the timeout for the diconnect timer */ class SampleSocketPort : public SocketPort { public: SampleSocketPort(SocketService *pService, TCPSocket & tcpSocket); virtual ~SampleSocketPort(); /** * Overridden from class SocketPort. * Called when data is available in the receive buffer. */ virtual void pending(); /** * Overridden from class SocketPort. * Called when the socket has been disconnected from the client-side. * Under some conditions this function is NOT called, which is why we have * some additional disconnection functionality within pending(). */ virtual void disconnect(void); /** * Overridden from class SocketPort. * This function is called by the system when our timer expires. * We use the timer for 2 things: * 1) To determine whether reception has timed out. (Timer started in pending()) * 2) To call CloseInterface to safely destroy the port. */ virtual void expired(void); /** * This function will send the specified number of bytes, or the whole string * (without the terminating '\0') */ bool WriteData(const char *szTxData, const size_t nByteCount = -1); /** * Our function to provide uniform closure of the Socket. * Can be called from the outside! */ bool CloseSocket(void); /** * This function should be called from pending() when the first bytes of our * data has been received. If the complete data has not been received by the time * this expires we consider this an error. * */ void ResetReadTimeout(timeout_t timeout) { m_bTimedOut = false; setTimer(timeout); } /** * This function should be use in the event of a reception error, to flush out * the receive buffer. */ void FlushRxData(void) { while(receive(m_pBuf, MAX_RXBUF) > 0); cerr << "FLUSHED" << endl; } /* * Some virtual function placeholders..... */ /** * This function is called just before the port is closed. * Do not send any data from this function! */ virtual void OnConnectionClosed(void) { cerr << "Connection Closed!" << endl; } /** * Called when the receive timeout occurs */ virtual void OnRxTimeout(void) { cerr << "Receive timeout occurred" << endl; FlushRxData(); } /** * Called when a 'packet' of data has been received. */ virtual void OnDataReceived(char *pszData, unsigned int nByteCount) { } protected: bool m_bOpen; /**< Flag set to true while Socket is open */ bool m_bDoDisconnect; /**< Flag set to true when disconnection event has occurred */ bool m_bTimedOut; /**< Flag set to true when reception has timed out */ bool m_bReceptionStarted; /**< Flag set to true when the first bytes of a transmission have arrived */ int m_nLastBytesAvail; /**< Count of last number of bytes received in pending() */ char *m_pBuf; /**< Buffer used to store received data for parsing */ /** * Little utility function for sending data to the client. * @return Number of bytes sent to client */ ssize_t DoSend(void *buf, size_t len); }; /* * This class implements a Thread that manages a SocketService. Simply * create an instance of this class with the specified address and port, and * signal the semaphore when you want it to start. * * A new SampleSocketPort object will be created for every connection that arrives. * */ class SampleSocketServiceServer : public virtual TCPSocket, public virtual Thread { public: SampleSocketServiceServer(InetHostAddress & machine, int port) : TCPSocket(machine, port), Thread(), m_bQuitServer(true) { m_pSocketService = new SocketService(0); //IMPORTANT SOCKET SERVICE MUST NOW BE EXPLICITLY STARTED m_pSocketService->start(); } virtual ~SampleSocketServiceServer() { terminate(); delete m_pSocketService; } virtual void run(void) { waitMutex.enterMutex(); m_bQuitServer = false; while(!m_bQuitServer) { try { // new does all the work to accept a new connection // and attach itself to the SocketService. CreateSocketPort(m_pSocketService, *((TCPSocket *)this)); } catch ( ... ) { // Bummer - there was an error. cerr << "SampleSocketPort create failed\n"; exit(); } } waitMutex.leaveMutex(); } /** * This abstract function is used to create a SocketPort of the desired type. */ virtual SocketPort *CreateSocketPort(SocketService *pService, TCPSocket & Socket) = 0; virtual void StartServer() { m_bQuitServer = true; start(); while(m_bQuitServer) { Thread::yield(); } } /** * If the server is not stopped like this then the SocketPort created in CreateSocketPort * is leaked. This allows it to complete construction, and be deleted cleanly. */ virtual void StopServer() { m_bQuitServer = true; InetHostAddress host; tpport_t port; host = getLocal(&port); //This is required so that CreateSocketPort can return. TCPStream strm(host, port); waitMutex.enterMutex(); waitMutex.leaveMutex(); } protected: SocketService *m_pSocketService; bool m_bQuitServer; Mutex waitMutex; private: }; commoncpp2-1.8.1/demo/Makefile.am0000644000175000017500000000472311463413242013505 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = README test.xml Makefile.bcc AM_CXXFLAGS = $(THREAD_FLAGS) @WARN_FLAGS@ -Wno-deprecated INCLUDES = -I$(top_srcdir)/inc LDADD = ../src/libccgnu2.la $(THREAD_LIBS) $(DYN_LOADER) Z_LIBS = -lz noinst_PROGRAMS = tcp tcpthread tcpservice dccpclient dccpserver serial dir \ str buffer keydump urlfetch xmlfetch portsample netdevices slogTest \ crc32 cmdlineopt timer testAlog noinst_HEADERS = serialecho.h SampleSocketPort.h urlfetch_SOURCES = urlfetch.cpp urlfetch_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) xmlfetch_SOURCES = xmlfetch.cpp xmlfetch_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) buffer_SOURCES = buffer.cpp buffer_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) cmdlineopt_SOURCES = cmdlineopt.cpp cmdlineopt_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) slogTest_SOURCES = slogTest.cpp dir_SOURCES = dir.cpp keydump_SOURCES = keydump.cpp str_SOURCES = str.cpp str_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) tcp_SOURCES = tcp.cpp tcpthread_SOURCES = tcpthread.cpp dccpclient_SOURCES = dccpclient.cpp dccpserver_SOURCES = dccpserver.cpp timer_SOURCES = timer.cpp tcpservice_SOURCES = tcpservice.cpp tcpservice_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) portsample_SOURCES = SampleSocketPort.cpp portsample_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) netdevices_SOURCES = netdevices.cpp netdevices_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) serial_SOURCES = serialmain.cpp serialecho.cpp serial_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) crc32_SOURCES = crc32.cpp crc32_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) testAlog_SOURCES = test_alog.cpp testAlog_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) commoncpp2-1.8.1/demo/slogTest.cpp0000644000175000017500000000066311463314534013764 00000000000000 #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif int main(int argc, char* argv[]) { slog("slogTest", Slog::classUser, Slog::levelInfo); slog << "Howdy daemon and clog." << endl; slog.clogEnable(false); slog << "This is only for the daemon." << endl; slog.clogEnable(true); slog << "Are you still there?" << endl; return 0; } commoncpp2-1.8.1/demo/test.xml0000644000175000017500000000020511463314534013145 00000000000000 ]> some texttagged & text commoncpp2-1.8.1/demo/README0000644000175000017500000000056011463314534012330 00000000000000This directory will include demo programs that were used for testing out the APE library. These demos are not nessisarly meant to serve any purpose other than educational. They are not normally "built" unless you enter this directory, and they are not meant to be "installed" for general use. They are here both to educate how APE works and for internal testing. commoncpp2-1.8.1/demo/Makefile.in0000644000175000017500000006474311463364513013534 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ noinst_PROGRAMS = tcp$(EXEEXT) tcpthread$(EXEEXT) tcpservice$(EXEEXT) \ dccpclient$(EXEEXT) dccpserver$(EXEEXT) serial$(EXEEXT) \ dir$(EXEEXT) str$(EXEEXT) buffer$(EXEEXT) keydump$(EXEEXT) \ urlfetch$(EXEEXT) xmlfetch$(EXEEXT) portsample$(EXEEXT) \ netdevices$(EXEEXT) slogTest$(EXEEXT) crc32$(EXEEXT) \ cmdlineopt$(EXEEXT) timer$(EXEEXT) testAlog$(EXEEXT) subdir = demo DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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_buffer_OBJECTS = buffer.$(OBJEXT) buffer_OBJECTS = $(am_buffer_OBJECTS) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) buffer_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_cmdlineopt_OBJECTS = cmdlineopt.$(OBJEXT) cmdlineopt_OBJECTS = $(am_cmdlineopt_OBJECTS) cmdlineopt_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_crc32_OBJECTS = crc32.$(OBJEXT) crc32_OBJECTS = $(am_crc32_OBJECTS) crc32_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_dccpclient_OBJECTS = dccpclient.$(OBJEXT) dccpclient_OBJECTS = $(am_dccpclient_OBJECTS) dccpclient_LDADD = $(LDADD) dccpclient_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_dccpserver_OBJECTS = dccpserver.$(OBJEXT) dccpserver_OBJECTS = $(am_dccpserver_OBJECTS) dccpserver_LDADD = $(LDADD) dccpserver_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_dir_OBJECTS = dir.$(OBJEXT) dir_OBJECTS = $(am_dir_OBJECTS) dir_LDADD = $(LDADD) dir_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_keydump_OBJECTS = keydump.$(OBJEXT) keydump_OBJECTS = $(am_keydump_OBJECTS) keydump_LDADD = $(LDADD) keydump_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_netdevices_OBJECTS = netdevices.$(OBJEXT) netdevices_OBJECTS = $(am_netdevices_OBJECTS) netdevices_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_portsample_OBJECTS = SampleSocketPort.$(OBJEXT) portsample_OBJECTS = $(am_portsample_OBJECTS) portsample_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_serial_OBJECTS = serialmain.$(OBJEXT) serialecho.$(OBJEXT) serial_OBJECTS = $(am_serial_OBJECTS) serial_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_slogTest_OBJECTS = slogTest.$(OBJEXT) slogTest_OBJECTS = $(am_slogTest_OBJECTS) slogTest_LDADD = $(LDADD) slogTest_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_str_OBJECTS = str.$(OBJEXT) str_OBJECTS = $(am_str_OBJECTS) str_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_tcp_OBJECTS = tcp.$(OBJEXT) tcp_OBJECTS = $(am_tcp_OBJECTS) tcp_LDADD = $(LDADD) tcp_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_tcpservice_OBJECTS = tcpservice.$(OBJEXT) tcpservice_OBJECTS = $(am_tcpservice_OBJECTS) tcpservice_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_tcpthread_OBJECTS = tcpthread.$(OBJEXT) tcpthread_OBJECTS = $(am_tcpthread_OBJECTS) tcpthread_LDADD = $(LDADD) tcpthread_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_testAlog_OBJECTS = test_alog.$(OBJEXT) testAlog_OBJECTS = $(am_testAlog_OBJECTS) testAlog_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_timer_OBJECTS = timer.$(OBJEXT) timer_OBJECTS = $(am_timer_OBJECTS) timer_LDADD = $(LDADD) timer_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_urlfetch_OBJECTS = urlfetch.$(OBJEXT) urlfetch_OBJECTS = $(am_urlfetch_OBJECTS) urlfetch_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_xmlfetch_OBJECTS = xmlfetch.$(OBJEXT) xmlfetch_OBJECTS = $(am_xmlfetch_OBJECTS) xmlfetch_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/autoconf/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 = $(buffer_SOURCES) $(cmdlineopt_SOURCES) $(crc32_SOURCES) \ $(dccpclient_SOURCES) $(dccpserver_SOURCES) $(dir_SOURCES) \ $(keydump_SOURCES) $(netdevices_SOURCES) $(portsample_SOURCES) \ $(serial_SOURCES) $(slogTest_SOURCES) $(str_SOURCES) \ $(tcp_SOURCES) $(tcpservice_SOURCES) $(tcpthread_SOURCES) \ $(testAlog_SOURCES) $(timer_SOURCES) $(urlfetch_SOURCES) \ $(xmlfetch_SOURCES) DIST_SOURCES = $(buffer_SOURCES) $(cmdlineopt_SOURCES) \ $(crc32_SOURCES) $(dccpclient_SOURCES) $(dccpserver_SOURCES) \ $(dir_SOURCES) $(keydump_SOURCES) $(netdevices_SOURCES) \ $(portsample_SOURCES) $(serial_SOURCES) $(slogTest_SOURCES) \ $(str_SOURCES) $(tcp_SOURCES) $(tcpservice_SOURCES) \ $(tcpthread_SOURCES) $(testAlog_SOURCES) $(timer_SOURCES) \ $(urlfetch_SOURCES) $(xmlfetch_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = README test.xml Makefile.bcc AM_CXXFLAGS = $(THREAD_FLAGS) @WARN_FLAGS@ -Wno-deprecated INCLUDES = -I$(top_srcdir)/inc LDADD = ../src/libccgnu2.la $(THREAD_LIBS) $(DYN_LOADER) Z_LIBS = -lz noinst_HEADERS = serialecho.h SampleSocketPort.h urlfetch_SOURCES = urlfetch.cpp urlfetch_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) xmlfetch_SOURCES = xmlfetch.cpp xmlfetch_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) buffer_SOURCES = buffer.cpp buffer_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) cmdlineopt_SOURCES = cmdlineopt.cpp cmdlineopt_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) slogTest_SOURCES = slogTest.cpp dir_SOURCES = dir.cpp keydump_SOURCES = keydump.cpp str_SOURCES = str.cpp str_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) tcp_SOURCES = tcp.cpp tcpthread_SOURCES = tcpthread.cpp dccpclient_SOURCES = dccpclient.cpp dccpserver_SOURCES = dccpserver.cpp timer_SOURCES = timer.cpp tcpservice_SOURCES = tcpservice.cpp tcpservice_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) portsample_SOURCES = SampleSocketPort.cpp portsample_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) netdevices_SOURCES = netdevices.cpp netdevices_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) serial_SOURCES = serialmain.cpp serialecho.cpp serial_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) crc32_SOURCES = crc32.cpp crc32_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) testAlog_SOURCES = test_alog.cpp testAlog_LDADD = ../src/libccext2.la $(SSL_LIBS) $(XML_LIBS) $(Z_LIBS) $(LDADD) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu demo/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu demo/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(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 buffer$(EXEEXT): $(buffer_OBJECTS) $(buffer_DEPENDENCIES) @rm -f buffer$(EXEEXT) $(CXXLINK) $(buffer_OBJECTS) $(buffer_LDADD) $(LIBS) cmdlineopt$(EXEEXT): $(cmdlineopt_OBJECTS) $(cmdlineopt_DEPENDENCIES) @rm -f cmdlineopt$(EXEEXT) $(CXXLINK) $(cmdlineopt_OBJECTS) $(cmdlineopt_LDADD) $(LIBS) crc32$(EXEEXT): $(crc32_OBJECTS) $(crc32_DEPENDENCIES) @rm -f crc32$(EXEEXT) $(CXXLINK) $(crc32_OBJECTS) $(crc32_LDADD) $(LIBS) dccpclient$(EXEEXT): $(dccpclient_OBJECTS) $(dccpclient_DEPENDENCIES) @rm -f dccpclient$(EXEEXT) $(CXXLINK) $(dccpclient_OBJECTS) $(dccpclient_LDADD) $(LIBS) dccpserver$(EXEEXT): $(dccpserver_OBJECTS) $(dccpserver_DEPENDENCIES) @rm -f dccpserver$(EXEEXT) $(CXXLINK) $(dccpserver_OBJECTS) $(dccpserver_LDADD) $(LIBS) dir$(EXEEXT): $(dir_OBJECTS) $(dir_DEPENDENCIES) @rm -f dir$(EXEEXT) $(CXXLINK) $(dir_OBJECTS) $(dir_LDADD) $(LIBS) keydump$(EXEEXT): $(keydump_OBJECTS) $(keydump_DEPENDENCIES) @rm -f keydump$(EXEEXT) $(CXXLINK) $(keydump_OBJECTS) $(keydump_LDADD) $(LIBS) netdevices$(EXEEXT): $(netdevices_OBJECTS) $(netdevices_DEPENDENCIES) @rm -f netdevices$(EXEEXT) $(CXXLINK) $(netdevices_OBJECTS) $(netdevices_LDADD) $(LIBS) portsample$(EXEEXT): $(portsample_OBJECTS) $(portsample_DEPENDENCIES) @rm -f portsample$(EXEEXT) $(CXXLINK) $(portsample_OBJECTS) $(portsample_LDADD) $(LIBS) serial$(EXEEXT): $(serial_OBJECTS) $(serial_DEPENDENCIES) @rm -f serial$(EXEEXT) $(CXXLINK) $(serial_OBJECTS) $(serial_LDADD) $(LIBS) slogTest$(EXEEXT): $(slogTest_OBJECTS) $(slogTest_DEPENDENCIES) @rm -f slogTest$(EXEEXT) $(CXXLINK) $(slogTest_OBJECTS) $(slogTest_LDADD) $(LIBS) str$(EXEEXT): $(str_OBJECTS) $(str_DEPENDENCIES) @rm -f str$(EXEEXT) $(CXXLINK) $(str_OBJECTS) $(str_LDADD) $(LIBS) tcp$(EXEEXT): $(tcp_OBJECTS) $(tcp_DEPENDENCIES) @rm -f tcp$(EXEEXT) $(CXXLINK) $(tcp_OBJECTS) $(tcp_LDADD) $(LIBS) tcpservice$(EXEEXT): $(tcpservice_OBJECTS) $(tcpservice_DEPENDENCIES) @rm -f tcpservice$(EXEEXT) $(CXXLINK) $(tcpservice_OBJECTS) $(tcpservice_LDADD) $(LIBS) tcpthread$(EXEEXT): $(tcpthread_OBJECTS) $(tcpthread_DEPENDENCIES) @rm -f tcpthread$(EXEEXT) $(CXXLINK) $(tcpthread_OBJECTS) $(tcpthread_LDADD) $(LIBS) testAlog$(EXEEXT): $(testAlog_OBJECTS) $(testAlog_DEPENDENCIES) @rm -f testAlog$(EXEEXT) $(CXXLINK) $(testAlog_OBJECTS) $(testAlog_LDADD) $(LIBS) timer$(EXEEXT): $(timer_OBJECTS) $(timer_DEPENDENCIES) @rm -f timer$(EXEEXT) $(CXXLINK) $(timer_OBJECTS) $(timer_LDADD) $(LIBS) urlfetch$(EXEEXT): $(urlfetch_OBJECTS) $(urlfetch_DEPENDENCIES) @rm -f urlfetch$(EXEEXT) $(CXXLINK) $(urlfetch_OBJECTS) $(urlfetch_LDADD) $(LIBS) xmlfetch$(EXEEXT): $(xmlfetch_OBJECTS) $(xmlfetch_DEPENDENCIES) @rm -f xmlfetch$(EXEEXT) $(CXXLINK) $(xmlfetch_OBJECTS) $(xmlfetch_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleSocketPort.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdlineopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc32.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dccpclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dccpserver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keydump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netdevices.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serialecho.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serialmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slogTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcpservice.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcpthread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_alog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/urlfetch.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmlfetch.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) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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 # 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: commoncpp2-1.8.1/demo/tcp.cpp0000644000175000017500000000700011463314534012736 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class myTCPSocket : public TCPSocket { protected: bool onAccept(const InetHostAddress &ia, tpport_t port); public: myTCPSocket(InetAddress &ia); }; myTCPSocket::myTCPSocket(InetAddress &ia) : TCPSocket(ia, 4096) { cout << "binding segsize: " << getSegmentSize() << endl; } bool myTCPSocket::onAccept(const InetHostAddress &ia, tpport_t port) { cout << "accepting from: " << ia << ":" << port << endl;; return true; } int main(int argc, char *argv[]) { tpport_t port; int i; TCPStream tcp; InetAddress addr; addr = "255.255.255.255"; cout << "testing addr: " << addr << ":" << 4096 << endl; addr = "127.0.0.1"; cout << "binding for: " << addr << ":" << 4096 << endl; Thread::setException(Thread::throwException); try { myTCPSocket server(addr); while(server.isPendingConnection(30000)) { tcp.connect(server); // tcp.unsetf(ios::binary); tcp << "welcome to " << addr << "; segment size=" << tcp.getSegmentSize() << endl; tcp << "connected from " << tcp.getPeer(&port) << endl; if(tcp.isPending(Socket::pendingInput, 2000)) { tcp >> i; tcp << "user entered " << i << endl; } tcp << "exiting now" << endl; tcp.disconnect(); } } catch(SockException& e) { cout << e.getString() << ": " << e.getSystemErrorString() << endl; exit(-1); } cout << "timeout after 30 seconds inactivity, exiting" << endl; return 0; } commoncpp2-1.8.1/demo/dir.cpp0000644000175000017500000000476411463314534012744 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif int main(int argc, char **argv) { const char *name; char path[PATH_MAX]; if(argc < 2) { Dir dir("."); while(NULL != (name = dir++)) { File::getRealpath(name, path); cout << path << endl; } dir.close(); return 0; } DirTree dt(argv[1], 16); while(NULL != (name = dt.getPath())) cout << name << endl; return 0; } commoncpp2-1.8.1/demo/str.cpp0000644000175000017500000001052511463314534012766 00000000000000// Copyright (C) 2001 Open Source Telecom Corporation. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif String x; int main(int argc, char **argv) { String a("abc"); String b(40, "abcdefghixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); printf("B %p\n", b.getText()); String mystring(65); String *pstr; for(int i = 1; i < 20; ++i) { pstr = new String(i, "abcdefg"); String zstr(i, "abc"); zstr = *pstr + zstr; delete pstr; zstr.clear(); } const char *cp = a.index(1); printf("part of A %ld is %s\n", a.length(), cp); x = b; printf("X %p %ld %s\n", x.getText(), x.getLength(), x.getText()); x = a; printf("X %p %ld %ld %s\n", x.getText(), x.size(), x.length(), x.getText()); x += b; printf("X %p %ld %ld %s\n", x.getText(), x.capacity(), x.length(), x.getText()); x += a; printf("X %p %ld %ld %s\n", x.getText(), x.capacity(), x.length(), x.getText()); x += "0123456789abcdefg"; printf("X %p %ld %ld %s\n", x.getText(), x.capacity(), x.length(), x.getText()); cout << "A = " << a << endl; cout << "B = " << b << endl; if(a > b) printf("a > b\n"); else printf("a <= b\n"); if(a > "123") printf("a > 123\n"); else printf("a < 123\n"); if(x *= "def") printf("def contained in X\n"); if(!(x *= "zebra")) printf("zebra not in X\n"); printf("X IS %p\n", x.getText()); b.erase(10,20); cout << b.length() << " " << b << endl; printf("B IS %p\n", b.getText()); b.insert(3, "123456"); cout << b << endl; cout << b.substr(5, 3) << endl; printf("find x %ld\n", b.find("x")); printf("find 3rd x %ld\n", b.find(3, "x")); String l(",1,2222222222222222222222222222222,3"); cout << "list is " << l << endl; cout << "first is empty" << l.token(",") << endl; cout << l.token(",") << endl; cout << l.token(",") << endl; cout << "remaining " << l << endl; cout << l.token(",") << endl; cout << "final " << l << " size=" << l.capacity() << endl; String f; snprintf(f, 80, "testing %f done", 1.03); cout << f << endl; String p1(20, "hello"); String p2(20, "Count %d words", 10); cout << p1 << endl; cout << p2 << endl; SString ss; ss << "Counting " << 10 << " words"; ss << " and more"; cout << ss << endl; ss << " and more"; cout << ss << endl; String zip; zip = ss; cout << zip << endl; String num; #ifdef HAVE_SNPRINTF num = 17; num += 23; cout << "number " << num << " should be 1723" << endl; #endif } commoncpp2-1.8.1/demo/cmdlineopt.cpp0000644000175000017500000002276311463314534014323 00000000000000// Copyright (C) 2001 Gianni Mariani // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // // // Example for Common C++ the command line parser interface. // // // This exmaple code shows how to use the command line parser provided by // CommonC++. The command line parser provides an interface which is // "object oriented" such that command line parameters are true "objects". // // Each command line option needs to be created. By defining "CommandOption"s // statically, the C++ constructor is called when the objects are loaded and // before the "main" function is called. The constructor links itself to // a list of other CommandOptionXXX in the list provided. If no // list is specified in the constructor, a default one is used. Because of // the undefined nature as to the order in which constructors are called, // no assumption as to the order in which the CommandOptionXXX constructors // are called should be made. // // CommandOptionXXX classes can be used to derive specialized parameter // classes that are specific to applications. The second example shows // just how this can be done. // // // Include the CommandOption definitions // #include #include #ifndef WIN32 #include #endif #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif // // The following definition of options all use the list header // defaultCommandOptionList (which is specified as the value of the // default parameter in the constructor. This convention would // allow other object files to link into the same list and add parameters // to the command line of this executable. CommandOptionArg test_option1( "test_option1", "p", "This option takes an argument", true ); CommandOptionNoArg test_noarg( "test_noarg", "b", "This option does not take an argument" ); CommandOptionNoArg helparg( "help", "?", "Print help usage" ); CommandOptionCollect restoargs( 0, 0, "Collect all the parameters", true ); // // Normally this would me the regular main(). In this example // this processes the first command option list. // int Example_main( int argc, char ** argv ) { // Create a CommandOptionParse object. This takes the // defaultCommandOptionList and parses the command line arguments. // CommandOptionParse * args = makeCommandOptionParse( argc, argv, "CommonC++ command like option interface. This is example\n" " code only." ); // If the user requested help then suppress all the usage error // messages. if ( helparg.numSet ) { cerr << args->printUsage(); ::exit(0); } // Print usage your way. if ( args->argsHaveError() ) { cerr << args->printErrors(); cerr << args->printUsage(); ::exit(1); } // Go off and run any option specific task args->performTask(); // print all the -p options for ( int i = 0; i < test_option1.numValue; i ++ ) { cerr << "test_option1 = " << test_option1.values[ i ] << endl; } // print all the other options. for ( int i = 0; i < restoargs.numValue; i ++ ) { cerr << "restoargs " << i << " : " << restoargs.values[ i ] << endl; } delete args; return 0; } // // This shows how to build a second option list. The example is similar to // the first as well as it shows how to derive a new command object. // CommandOption * TestList = 0; extern CommandOptionRest test_restoargs; #include #include #include #include #include #include #include #include #include // // This is a parameter class derived from CommandOptionArg that takes // a file name parameter and detects wether the file is accessible // flagging an error if the file is inaccessible to read. // class file_option : public CommandOptionArg { public: // the constructor calls the regular CommandOptionArg constructor // and all should be well. file_option( const char * in_option_name, const char * in_option_letter, const char * in_description, bool in_required = false, CommandOption ** pp_next = & defaultCommandOptionList ) : CommandOptionArg( in_option_name, in_option_letter, in_description, in_required, pp_next ) { } // // When parsing is done check if the file is accessible and register // an error with the CommandOptionParse object to let it know so. virtual void parseDone( CommandOptionParse * cop ) { if ( numValue ) { if ( ::access( values[ numValue - 1 ], R_OK ) ) { int errno_s = errno; strstream msg; msg << "Error: " << optionName << " '" << values[ numValue - 1 ]; msg << "' : " << ::strerror( errno_s ); cop->registerError( msg.str() ); } } } // // Open said file. Do some operations on things - like open the file. int OpenFile() { // Should put in way more error handling here ... return ::open( values[ numValue - 1 ], O_RDONLY ); } // // The most elaborate way to spit the contents of a file // to standard output. pid_t pid; virtual void performTask( CommandOptionParse * cop ) { pid = ::fork(); if ( pid ) { return; } int fd = OpenFile(); if ( fd < 0 ) { int errno_s = errno; cerr << "Error: '" << values[ numValue - 1 ] << "' : " << ::strerror( errno_s ) ; ::exit( 1 ); } dup2(fd, 0); ::execvp( test_restoargs.values[0], (char**) test_restoargs.values ); ::exit(1); } ~file_option() { if ( pid <= 0 ) return; int status; ::wait(&status); } }; // // This is the linked list head for the options in the second example. // Note that the first example used the default value defined in the // method. Here it is explicitly specified as TestList in all the following // CommandOption constructors. file_option test_file( "test_file", "f", "Filename to read from", true, &TestList ); CommandOptionNoArg test_xnoarg( "test_xnoarg", "b", "This option does not take an argument", false, &TestList ); CommandOptionNoArg test_helparg( "help", "?", "Print help usage", false, &TestList ); CommandOptionRest test_restoargs( 0, 0, "Command to be executed", true, &TestList ); // // in most apps this would be the regular "main" function. int Test_main( int argc, char ** argv ) { CommandOptionParse * args = makeCommandOptionParse( argc, argv, "Command line parser X test.\n" " This example is executed when the command ends in 'x'\n" " It shows how the -f parameter can be specialized.\n", TestList ); // If the user requested help then suppress all the usage error // messages. if ( test_helparg.numSet ) { cerr << args->printUsage(); ::exit(0); } // Print usage your way. if ( args->argsHaveError() ) { cerr << args->printErrors(); cerr << "Get help by --help\n"; ::exit(1); } // Go off and run any option specific task args->performTask(); for ( int i = 0; i < test_file.numValue; i ++ ) { cerr << "test_file = " << test_file.values[ i ] << endl; } for ( int i = 0; i < test_restoargs.numValue; i ++ ) { cerr << "test_restoargs " << i << " : " << test_restoargs.values[ i ] << endl; } delete args; return 0; } // // This switches behaviour of this executable depending of wether it is // invoked with a command ending in "x". This is mimicking for example // the behaviour of bunzip2 and bzip2. These executables are THE SAME // file i.e. // 0 lrwxrwxrwx 1 root root 5 Oct 11 14:04 /usr/bin/bunzip2 -> bzip2* // and the behaviour is determined by the executable name. // // This example is way more complex than the way most people will end up // using feature. int main( int argc, char ** argv ) { int i = ::strlen( argv[ 0 ] ); // determine which real "main" function do I call if ( argv[ 0 ][ i - 1 ] == 'x' ) { return Test_main( argc, argv ); } else { return Example_main( argc, argv ); } } commoncpp2-1.8.1/demo/serialecho.cpp0000644000175000017500000000414111463314534014271 00000000000000/********************************************************************** * C/C++ Source: serialecho.cc * * Defines the methods for the SerialEcho class * * @author: Gary Lawrence Murphy * Copyright: 2000 TeleDynamics Communications Inc (www.teledyn.com) ******************************************************************** */ // Copyright (C) 1999-2000 Teledynamics Communications Inc. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "serialecho.h" #ifndef WIN32 #include #endif using namespace std; SerialEcho::SerialEcho(const char *device, int priority, int stacksize) : TTYSession( device, priority, stacksize ) { cout << "Creating SerialEcho" << endl; if (!(*this)) { throw xError(); ::exit(1); } else { cout << "modem ready" << endl; } interactive(false); if (setSpeed(38400)) cout << getErrorString() << endl; if (setCharBits(8)) cout << getErrorString() << endl; if (setParity(Serial::parityNone)) cout << getErrorString() << endl; if (setStopBits(1)) cout << getErrorString() << endl; if (setFlowControl(Serial::flowHard)) cout << getErrorString() << endl; cout << "config done" << endl; } void SerialEcho::run() { char* s = new char[getBufferSize()]; cout << "start monitor" << endl; while (s[0] != 'X') { while (isPending(Serial::pendingInput)) { cout.put( TTYStream::get() ); } sleep(500); } cout << "end of monitor" << endl; delete [] s; exit(); } commoncpp2-1.8.1/demo/keydump.cpp0000644000175000017500000000506211463314534013634 00000000000000// Copyright (C) 2001 Open Source Telecom Corporation. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif int main(int argc, char **argv) { Keydata etc; char *idx[512]; unsigned count; char *keyval; if(argc < 2 || argc > 3) { cerr << "use: keydump keypath | keyfile keys" << endl; exit(-1); } putenv((char *)"CONFIG_KEYDATA=/etc/"); if(argc == 2) etc.load(argv[1]); else etc.loadFile(argv[1], argv[2]); count = etc.getIndex(idx, 512); while(count) { keyval = idx[--count]; cout << keyval << " = " << etc.getLast(keyval) << endl; } exit(0); } commoncpp2-1.8.1/demo/Makefile.bcc0000644000175000017500000000354411463314534013643 00000000000000####################################################### # MAKEFILE for building ccgnu demo programs # # # # (c) 2004 by Darko Miletic # # e-mail: kiklop@fibertel.com.ar # ####################################################### .autodepend ILINK32=ilink32 #C compile flags CFLAGS=-q -v- -O2 -k- -tWC -tWM -D$(USERDEFINES);$(SYSDEFINES) -I$(INCDIR) -L$(LIBDIR) LINKFLAGS=-q -v- -ap -Gn -c -L$(LIBDIR) .cpp.obj: @$(CC) $(CFLAGS) -I$(INCDIR) /c -o$@ $< .c.obj: @$(CC) $(CFLAGS) -I$(INCDIR) /c -o$@ $< INCDIR=..\w32;..\Include LIBDIR=..\w32\Release SRC=. OBJ=. BIN=. SYSDEFINES= USERDEFINES=_WINVER=0x0400;_WIN32_WINNT=0x0400;STRICT;_MBCS;NODEBUG;WIN32 ################################ # Target ################################ PROJECT=buffer.exe crc32.exe netdevices.exe SampleSocketPort.exe slogTest.exe tcp.exe tcpservice.exe tcpthread.exe urlfetch.exe xmlfetch.exe OBJFILES=buffer.obj crc32.obj netdevices.obj SampleSocketPort.obj slogTest.obj tcp.obj tcpservice.obj tcpthread.obj urlfetch.obj xmlfetch.obj RESFILES= LIBFILES=ccgnu2.lib ccext2.lib DEFFILE= BCC32STARTUP=c0x32.obj BCC32RTLIB=cw32mt.lib ALLOBJS=$(BCC32STARTUP) $(OBJFILES) ALLLIBS=$(LIBFILES) import32.lib $(BCC32RTLIB) all: $(OBJFILES) $(PROJECT) cleanobj copy_dll cleanobj:: -@echo Deleting intermediate files for project -@if exist $(OBJ)\*.obj del $(OBJ)\*.obj -@if exist $(BIN)\*.tds del $(BIN)\*.tds -@if exist $(BIN)\*.map del $(BIN)\*.map cleantgt:: -@echo Deleting output files for project -@if exist *.exe del *.exe -@if exist cc*.dll del cc*.dll clean: cleanobj cleantgt dirs:: -@echo Creating output directory -@md $(OBJ) copy_dll: -@copy /V /Y ..\w32\Release\cc*.dll $(BIN)\ .obj.exe: -@$(ILINK32) $(LINKFLAGS) $(BCC32STARTUP) $&.obj,$@,,$(ALLLIBS),$(DEFFILE) commoncpp2-1.8.1/demo/tcpservice.cpp0000644000175000017500000002166411463314534014333 00000000000000// // tcpservice.cpp // // Copyright 2000 - Gianni Mariani // // An example of a simple chatty server using CommonC++. // // This simple application basically operates as a // very simple chat system. From a telnet session // on localhost:3999 , any messages typed from a telnet // client are written to all participating sessions. // // This is free software licensed under the terms of the GNU // Public License // // This example: // // This demostrates a simple threaded server, actually, // the sessions are not all threaded though they could be // if that's what you wanted. Basically it demonstrates the // use of SocketService, SocketPorts and Threads. // // For those familiar with Unix network programming, SocketService // basically encapsulates all the work to communicate with // the select() or poll() system calls. SocketPorts are // basically encapsulations of sessions or open file descriptors. // // Anyhow, this example is a very simple echo server but // it echos to all connected clients. So it's a poor man's // IRC ! You connect via telnet to localhost port 3999 and // it will echo to all other connected clients what you type in ! // #include #include // For starters, we need a thread safe list, we'll make one // out of the STL list<> template - // http://www.sgi.com/Technology/STL/index.html // // Thread safe list class // #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class ts_list_item; typedef list ts_list; // a list head - containing a list and a Mutex. // It would be really nice to teach stl to do this. class ts_list_head { public: // No point inheriting, I'd have to implement // alot of code. We'll hold off on that exercise. // Using the CommonC++ Mutex class. Mutex linkmutex; // And the STL template. ts_list list_o_items; // Not nessasary, but nice to be explicit. ts_list_head() : linkmutex(), list_o_items() { } // This thing knows how to remove and insert items. void RemoveListItem( ts_list_item * li ); void InsertListItem( ts_list_item * li ); // And it knows how to notify that it became empty // or an element was deleted and it was the last one. virtual void ListDepleted() { } virtual ~ts_list_head() { } }; // This item knows how to remove itself from the // list it belongs to. class ts_list_item { public: ts_list::iterator linkpoint; ts_list_head * listhead; virtual ~ts_list_item() { listhead->RemoveListItem( this ); } ts_list_item( ts_list_head * head ) { listhead = head; head->InsertListItem( this ); } }; void ts_list_head::RemoveListItem( ts_list_item * li ) { bool is_empty; linkmutex.enterMutex(); list_o_items.erase( li->linkpoint ); is_empty = list_o_items.empty(); linkmutex.leaveMutex(); // There is a slim possibility that at this time // we recieve a connection. if ( is_empty ) { ListDepleted(); } } void ts_list_head::InsertListItem( ts_list_item * li ) { linkmutex.enterMutex(); list_o_items.push_front( li ); li->linkpoint = list_o_items.begin(); linkmutex.leaveMutex(); } // ChatterSession operates on the individual connections // from clients as are managed by the SocketService // contained in CCExec. ChatterThread simply waits in // a loop to create these, listening forever. // // Even though the SocketService contains a list of // clients it serves, it may actually serve more than // one type of session so we create our own list by // inheriting the ts_list_item. // class ChatterSession : public virtual SocketPort, public virtual ts_list_item { public: enum { size_o_buf = 2048 }; // Nothing special to do here, it's all handled // by SocketPort and ts_list_item virtual ~ChatterSession() { cerr << "ChatterSession deleted !\n"; } // When you create a ChatterSession it waits to accept a // connection. This is done by it's own ChatterSession( TCPSocket & server, SocketService * svc, ts_list_head * head ) : SocketPort( NULL, server ), ts_list_item( head ) { cerr << "ChatterSession Created\n"; tpport_t port; InetHostAddress ia = getPeer( & port ); cerr << "connecting from " << ia.getHostname() << ":" << port << endl; // Set up non-blocking reads setCompletion( false ); // Set yerself to time out in 10 seconds setTimer( 100000 ); attach(svc); } // // This is called by the SocketService thread when it the // object has expired. // virtual void expired() { // Get outa here - this guy is a LOOSER - type or terminate cerr << "ChatterSession Expired\n"; delete this; } // // This is called by the SocketService thread when it detects // that there is somthing to read on this connection. // virtual void pending() { // Implement the echo cerr << "Pending called\n"; // reset the timer setTimer( 100000 ); try { int len; unsigned int total = 0; char buf[ size_o_buf ]; while ( (len = receive(buf, sizeof(buf) )) > 0 ) { total += len; cerr << "Read '"; cerr.write( buf, len ); cerr << "'\n"; // Send it to all the sessions. // We probably don't really want to lock the // entire list for the entire time. // The best way to do this would be to place the // message somewhere and use the service function. // But what are examples for ? bool sent = false; listhead->linkmutex.enterMutex(); for ( ts_list::iterator iter = listhead->list_o_items.begin(); iter != listhead->list_o_items.end(); iter ++ ) { ChatterSession * sess = dynamic_cast< ChatterSession * >( * iter ); if ( sess != this ) { sess->send( buf, len ); sent = true; } } listhead->linkmutex.leaveMutex(); if ( ! sent ) { send( ( void * ) "No one else listening\n", sizeof( "No one else listening\n" ) - 1 ); send( buf, len ); } } if (total == 0) { cerr << "Broken connection!\n" << endl; delete this; } } catch ( ... ) { // somthing wrong happened here ! cerr << "Socket port write sent an exception !\n"; } } virtual void disconnect() { // Called by the SocketService thread when the client // hangs up. cerr << "ChatterSession disconnected!\n"; delete this; } }; class ChatterThread; // // This is the main application object containing all the // state for the application. It uses a SocketService object // (and thread) to do all the work, however, that object could // theoretically be use by more than one main application. // // It creates a ChatterThread to sit and wait for connections // from clients. class CCExec : public virtual ts_list_head { public: SocketService * service; ChatterThread * my_Chatter; Semaphore mainsem[1]; CCExec():my_Chatter(NULL) { service = new SocketService( 0 ); } virtual void ListDepleted(); // These methods defined later. virtual ~CCExec(); int RunApp( char * hn = (char *)"localhost" ); }; // // ChatterThread simply creates ChatterSession all the time until // it has an error. I suspect you could create as many of these // as the OS could take. // class ChatterThread : public virtual TCPSocket, public virtual Thread { public: CCExec * exec; void run () { while ( 1 ) { try { // new does all the work to accept a new connection // attach itself to the SocketService AND include // itself in the CCExec list of sessions. new ChatterSession( * ( TCPSocket * ) this, exec->service, exec ); } catch ( ... ) { // Bummer - there was an error. cerr << "ChatterSession create failed\n"; exit(); } } } ChatterThread( InetHostAddress & machine, int port, CCExec * inexec ) : TCPSocket( machine, port ), Thread(), exec( inexec ) { start(); } }; // // Bug here, this should go ahead and shut down all sessions // for application. An exercise left to the reader. CCExec::~CCExec() { // MUST delete my_Chatter first or it may end up using // a deleted service. if ( my_Chatter ) delete my_Chatter; // Delete whatever is left. delete service; } // // Run App would normally read some config file or take some // parameters about which port to connect to and then // do that ! int CCExec::RunApp( char * hn ) { // which port ? InetHostAddress machine( hn ); if ( machine.isInetAddress() == false ) { cerr << "machine is not address" << endl; } cerr << "machine is " << machine.getHostname() << endl; // Start accepting connections - this will bind to the // port as well. try { my_Chatter = new ChatterThread( machine, 3999, this ); } catch ( ... ) { cerr << "Failed to bind\n"; return false; } return true; } // When there is no one else connected - terminate ! void CCExec::ListDepleted() { mainsem->post(); } int main( int argc, char ** argv ) { CCExec * server; server = new CCExec(); // take the first command line option as a hostname // to listen to. if ( argc > 1 ) { server->RunApp( argv[ 1 ] ); } else { server->RunApp(); } server->mainsem->wait(); delete server; return 0; } commoncpp2-1.8.1/demo/netdevices.cpp0000644000175000017500000000252111463314534014304 00000000000000// Copyright (C) 2002 Christian Prochnow. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include int main(int argc, char* argv[]) { std::vector devs; if(!enumNetworkDevices(devs)) { std::cerr << "Could not get list of network devices!" << std::endl; return -1; } std::cout << "Available network devices:" << std::endl; std::vector::const_iterator i = devs.begin(); while(i != devs.end()) { std::cout << (*i).name() << " address: " << (*i).address() << ", brdcast: " << (*i).broadcast() << ", netmask: " << (*i).netmask() << ", mtu: " << (*i).mtu() << std::endl; ++i; } } commoncpp2-1.8.1/demo/urlfetch.cpp0000644000175000017500000000607711463314534014001 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class myURLStream : public URLStream { private: void httpHeader(const char *header, const char *value) {cout << "HEADER " << header << "=" << value << endl;} }; int main(int argc, char **argv) { myURLStream url; char cbuf[1024]; URLStream::Error status; int len; // url.setProxy("home.sys", 8000); #ifdef CCXX_EXCEPTIONS try { #endif while(--argc) { ++argv; cout << "fetching " << *argv << endl; status = url.get(*argv); if(status) { cout << "failed; reason=" << status << endl; url.close(); continue; } cout << "loading..." << endl; while(!url.eof()) { url.read(cbuf, sizeof(cbuf)); len = url.gcount(); if(len > 0) cout.write(cbuf, len); // url.getline(cbuf, sizeof(cbuf) - 1); // cout << cbuf << endl; } url.close(); cout << ends; } #ifdef CCXX_EXCEPTIONS } catch(...) { cerr << "url " << *argv << " failed" << endl; } #endif return 0; } commoncpp2-1.8.1/demo/tcpthread.cpp0000644000175000017500000001023611463314534014133 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of APE. // // The exception is that, if you link the APE library with other files // to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the APE library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name APE. If you copy code from other releases into a copy of // APE, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for APE, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class myTCPSocket : public TCPSocket { protected: bool onAccept(const InetHostAddress &ia, tpport_t port); public: myTCPSocket(InetAddress &ia); }; class myTCPSession : public TCPSession { private: static Mutex mutex; void run(void); void final(void); public: myTCPSession(TCPSocket &server); static volatile int count; }; myTCPSocket::myTCPSocket(InetAddress &ia) : TCPSocket(ia, 4096) {} bool myTCPSocket::onAccept(const InetHostAddress &ia, tpport_t port) { cout << "accepting from: " << ia.getHostname() << ":" << port << endl;; return true; } volatile int myTCPSession::count = 0; Mutex myTCPSession::mutex; myTCPSession::myTCPSession(TCPSocket &server) : TCPSession(server) { cout << "creating session client object" << endl; mutex.enterMutex(); ++count; mutex.leaveMutex(); // unsetf(ios::binary); } void myTCPSession::run(void) { tpport_t port; IPV4Address addr = getLocal(&port); *tcp() << "welcome to " << addr.getHostname() << " from socket " << (int)so << endl; mutex.enterMutex(); *tcp() << "called from thread " << count << endl; mutex.leaveMutex(); sleep(5000); *tcp() << "ending session" << endl; } void myTCPSession::final(void) { } int main() { myTCPSession *tcp; BroadcastAddress addr; addr = "255.255.255.255"; cout << "testing addr: " << addr.getHostname() << ":" << 4096 << endl; addr = "127.0.0.1"; cout << "binding for: " << addr.getHostname() << ":" << 4096 << endl; try { myTCPSocket server(addr); while(server.isPendingConnection(30000)) { cout << "before create" << endl; tcp = new myTCPSession(server); cout << "after create" << endl; tcp->detach(); } } catch(Socket *socket) { tpport_t port; int err = socket->getErrorNumber(); InetAddress saddr = (InetAddress)socket->getPeer(&port); cerr << "socket error " << saddr.getHostname() << ":" << port << " = " << err << endl; if(err == Socket::errBindingFailed) { cerr << "bind failed; port busy" << endl; ::exit(-1); } else cerr << "client socket failed" << endl; } cout << "timeout after 30 seconds inactivity, exiting" << endl; return 0; } commoncpp2-1.8.1/demo/serialmain.cpp0000644000175000017500000000366511463314534014311 00000000000000/********************************************************************** * C/C++ Source: main.cc * * Test harness for the serialecho class * * @author: Gary Lawrence Murphy * Copyright: 2000 TeleDynamics Communications Inc (www.teledyn.com) ******************************************************************** */ // Copyright (C) 1999-2000 Teledynamics Communications Inc. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // Created 2000/10/14 10:56:35 EDT by garym@teledyn.com #include "serialecho.h" #ifndef WIN32 #include #endif int main(int argc, char **argv) { cout << "Serial Echo to TCP Sessions" << endl; SerialEcho *modem = NULL; try { modem = new SerialEcho("/dev/modem2"); } catch (SerialEcho::xError *e) { cout << "Modem Error; aborting" << endl; ::exit(1); } catch (Serial *e) { cout << "Serial Error: " << modem->getErrorString() << "; aborting" << endl; ::exit(1); } char* b = new char[modem->getBufferSize()]; cout << "Modem code:" << modem->start() << endl; while (cin >> b, b[0]) { *modem << b << "\r" << endl; cout << "sent: " << b << endl; memset( b, 0, sizeof(b)); } cout << "fin" << endl; delete [] b; return 0; } /** 2000 by TeleDynamics Communications Inc - teledynamics@canada.com*/ commoncpp2-1.8.1/demo/SampleSocketPort.cpp0000644000175000017500000002637111463413443015422 00000000000000/** * * This class demonstrates use of the CommonC++ SocketPort class. * * Copyright 2001 - Nick Liebmann * * The SampleSocketPort is an implementation of the CommonC++ SocketPort class * that irons out some problems that I found with disconnection, and also demonstrates * a way of using the SocketPort to reliably extract and send data from/to a TCP/IP socket. * * In addition to this the SampleSocketPort includes some additional functionality * to determine whether the data stream has become corrupted * (missing terminator / incorrect formatting). For this feature a timer is used which if it is * allowed to expire, indicates that a 'packet' took too long to arrive, and as such the data * in the buffer is 'corrupt'. * * The SampleSocketPort can be used as-is...Modify the contents of the pending() * function if your data is formatted differently to the default (i.e. not terminated with \r\n) * * * This sample code is distributed under the same terms and conditions of the CommonC++ library. * * CHANGE HISTORY: * * * 07/01/02 NL There have been slight changes to the way CommonC++ starts threads, * a possible bug in InetHostAddress constructor, and a bug fix for SocketService * #496276. The following changes address those issues * * New thread start semantics. SocketService Thread is now explicitly started * by the SampleSocketServiceServer. * * Added SampleSocketServiceServer::StartServer() to start the server and wait * for the thread to get up and running. * * Added SampleSocketServiceServer::StopServer() to cleanly stop the server, and * ensure that there are no partially constructed SocketPorts left lying around * * Removed setDetectOutput(true)...this does not seem to be required anymore * as the SocketService functions correctly now. * * InetHostAddress constructor does not treat INADDR_ANY as it used to. * * 07/01/02 NL main() - now waits for a 'quit' command, and deletes the Server object. */ #include "SampleSocketPort.h" SampleSocketPort::SampleSocketPort(SocketService *pService, TCPSocket & tcpSocket) : SocketPort(pService, tcpSocket) { tpport_t port; InetHostAddress ia = getPeer( & port ); cerr << "connecting from " << ia.getHostname() << ":" << port << endl; // Set up non-blocking reads setCompletion( false ); //1.9.3 THIS LINE DOES NOT SEEM TO BE REQUIRED ANYMORE! //This sorts out a bug which prevents connections after a disconnect //setDetectOutput(true); m_bOpen = true; m_bDoDisconnect = false; m_bTimedOut = false; m_bReceptionStarted = false; m_nLastBytesAvail = 0; m_pBuf = new char[MAX_RXBUF]; } SampleSocketPort::~SampleSocketPort() { endSocket(); delete [] m_pBuf; } void SampleSocketPort::pending(void) { //cerr << "Pending called " << endl; if(!m_bOpen) return; // Read all available bytes into our buffer int nBytesAvail = peek(m_pBuf, MAX_RXBUF); //cerr << "Pending .. " << nBytesAvail << endl; if(!m_bReceptionStarted) { //Start the receive timer ResetReadTimeout(MAX_RXTIMEOUT); //Got 'n' seconds to get all the data else we timeout m_bReceptionStarted = true; } else { if(m_bTimedOut) //The receive timer has expired...this is a timeout condition { ResetReadTimeout(MAX_RXTIMEOUT); //Clear the timeout flag m_nLastBytesAvail = 0; //Reset the flags m_bReceptionStarted = false; OnRxTimeout(); //Do whatever 'we' do for a timeout (probably a flush or disconnect)... return; } } if(m_nLastBytesAvail == nBytesAvail) //Check if any more data has been received since last time { //No point in parsing unless this has changed! //Maybe yield in here! //Thread::yield(); if(nBytesAvail == 0) //If we have been called with 0 bytes available (twice now) { //a disconnection has occurred if(!m_bDoDisconnect) { CloseSocket(); //Force the close } } return; } //Depending on your application you may want to attempt to process the extra data //(or change your MAX_RXBUF). // //Here I just flush the whole lot, because I assume a 'legal' client wont send more than //we can receive....maybe someone is trying to flood / overrun us! if(nBytesAvail > MAX_RXBUF) { cerr << "TCP/IP overflow..." << endl; FlushRxData(); m_nLastBytesAvail = 0; m_bReceptionStarted = false; return; } m_nLastBytesAvail = nBytesAvail; //In this loop you may parse the received data to determine whether a whole //'packet' has arrived. What you do in here depends on what data you are sending. //Here we will just look for a /r/n terminator sequence. for(int i=0; i < nBytesAvail; i++) { /***************************SHOULD BE CUSTOMISED*******************/ if(m_pBuf[i] == '\r') { if(i+1 < nBytesAvail) { if(m_pBuf[i+1] == '\n') { //Terminator sequence found /**************************************************************/ // COMPULSORY ... Clear the flag and count.. // do this when you have received a good packet m_nLastBytesAvail = 0; m_bReceptionStarted = false; /**************************************************************/ // Now receive the data into a buffer and call our receive function int nLen = i+2; char *pszRxData = new char[nLen+1]; //Allow space for terminator receive(pszRxData, nLen); //Receive the data pszRxData[nLen] = '\0'; //Terminate it OnDataReceived(pszRxData, nLen); delete [] pszRxData; return; } } } /***************************END CUSTOMISATION*******************/ } } void SampleSocketPort::disconnect(void) { if(m_bOpen) { m_bDoDisconnect = true; CloseSocket(); } } void SampleSocketPort::expired(void) { if(m_bDoDisconnect && m_bOpen) { CloseSocket(); } else if(m_bOpen && m_bReceptionStarted) { //Timer must have expired because the rx data has not all been received m_bTimedOut = true; } } bool SampleSocketPort::CloseSocket(void) { if(m_bOpen && m_bDoDisconnect) { //This is where the disconnection really occurs m_bOpen = false; //If m_bDoDisconnect == true we know this has been called OnConnectionClosed(); //through the timer, so 'delete this' is safe! delete this; } else if(m_bOpen) { m_bDoDisconnect = true; //Just set the timer and the flag so we can setTimer(DISCONNECT_MS); //disconnect safely, in DISCONNECT_MS } return(true); } ssize_t SampleSocketPort::DoSend(void *buf, size_t len) { //If we are disconnecting, just pretend all the bytes were sent if(m_bDoDisconnect) return((ssize_t)len); ssize_t nSent = send(buf, len); while(!isPending(Socket::pendingOutput, 0)) //Wait for output to complete { if(m_bDoDisconnect || !m_bOpen) { //If we are disconnecting, just pretend all the bytes were sent return((ssize_t)len); } //I like to yield whenever waiting for things... //this is optional and may not suit your implementation! Thread::yield(); } return(nSent); } bool SampleSocketPort::WriteData(const char *szTxData, const size_t nByteCount) { //First calculate how many bytes we are to send ssize_t nLen = nByteCount; if(nLen == -1) nLen = (ssize_t)strlen(szTxData); size_t nBytesToSend = nLen; while(m_bOpen && nLen) { nLen -= DoSend((void *)&(szTxData[nBytesToSend - nLen]), nLen); } // If we are sending a terminator.....uncomment the following lines // char chTerminator = '\n'; // while(DoSend((void *)&chTerminator, 1) != 1); return(true); } #define WITH_EXAMPLE #ifdef WITH_EXAMPLE /************ THE FOLLOWING CODE DEMONSTRATES THE USE OF THE ABOVE CLASS ******************** **** **** To test it, compile with: **** **** g++ SampleSocketPort.cpp -lccgnu -lpthread -ldl -oSampleSocketPort -ggdb -I/usr/local/include/cc++/ **** Run the program. **** **** From another terminal telnet to port 3999 of the server **** **** 'telnet localhost 3999' **** **** Anything you type should be sent back to you in reverse! **** **** To test the corrupt data detection, send a control code (like ^D), **** if the terminating charcters are not detected within the specified time **** the receive timeout will occur. **** ****/ //define the following to include the example classes and functions int g_nOpenPorts = 0; //Dirty global to allow us to quit simply class ReverserPort : public SampleSocketPort { public: ReverserPort(SocketService *pService, TCPSocket & tcpSocket) : SampleSocketPort(pService, tcpSocket) { g_nOpenPorts++; } virtual ~ReverserPort() { g_nOpenPorts--; } virtual void OnConnectionClosed(void) { cerr << "Connection Closed!" << endl; } /** * Called when a 'packet' of data has been received. * This implementation simply reverses all the data and sends it back */ virtual void OnDataReceived(char *pszData, unsigned int nByteCount) { //Reverse the data and send it back size_t nLen = strlen(pszData); char *szToSend = new char[nLen+1]; //No need to reverse the \r\n or \0 size_t nIndex = nLen-3; size_t i; for(i=0; i < nLen - 2; i++) { szToSend[i] = pszData[nIndex - i]; } szToSend[i++] = '\r'; szToSend[i++] = '\n'; szToSend[nLen] = '\0'; WriteData(szToSend, nLen); delete [] szToSend; } }; class ReverserServer : public SampleSocketServiceServer { public: ReverserServer(InetHostAddress & machine, int port) : TCPSocket(machine, port), Thread(), SampleSocketServiceServer(machine, port) {} virtual ~ReverserServer() {} virtual SocketPort *CreateSocketPort(SocketService *pService, TCPSocket & Socket) { return(new ReverserPort(pService, Socket)); } }; int main(void) { InetHostAddress LocalHost; LocalHost = htonl(INADDR_ANY); ReverserServer *Server = NULL; try { Server = new ReverserServer(LocalHost, 3999); Server->StartServer(); } catch(...) { cerr << "Failed to start server" << endl; return(false); } cerr << "Waiting for connections...type \"quit\" to exit." << endl; char cmd[255]; cin.getline(cmd, 255); while(strcmp(cmd, "quit") != 0) { cin.getline(cmd, 255); } Server->StopServer(); delete Server; return 0; } #endif //WITH_EXAMPLE commoncpp2-1.8.1/demo/crc32.cpp0000644000175000017500000000707611463314534013101 00000000000000// // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif int main(int argc, char *argv[]) { unsigned char test[44]; union { unsigned char buf[4]; uint32 value; } data; uint32 crc; int i; cout << "CRC32 Algorithm Test\n\n"; cout << "AAL-5 Test #1 - 40 Octets filled with \"0\" - "; cout << "CRC32 = 0x864d7f99\n"; for (i = 0; i < 40; i++) test[i] = 0x0; test[40] = test[41] = test[42] = 0x0; test[43] = 0x28; CRC32Digest crc1; crc1.putDigest(test, 44); crc1.getDigest(data.buf); crc = data.value; cout << "Test #1 CRC32 = " << hex << crc << "\n\n"; if (crc == 0x864d7f99) cout << "Test #1 PASSED\n\n\n"; else cout << "Test #1 FAILED\n\n\n"; cout << "AAL-5 Test #2 - 40 Octets filled with \"1\" - "; cout << "CRC32 = 0xc55e457a\n"; for (i = 0; i < 40; i++) test[i] = 0xFF; test[40] = test[41] = test[42] = 0x0; test[43] = 0x28; CRC32Digest crc2; crc2.putDigest(test, 44); crc2.getDigest(data.buf); crc = data.value; cout << "Test #2 CRC32 = " << hex << crc << "\n\n"; if (crc == 0xc55e457a) cout << "Test #2 PASSED\n\n\n"; else cout << "Test #2 FAILED\n\n\n"; cout << "AAL-5 Test #3 - 40 Octets counting 1 to 40 - "; cout << "CRC32 = 0xbf671ed0\n"; for (i = 0; i < 40; i++) test[i] = i+1; test[40] = test[41] = test[42] = 0x0; test[43] = 0x28; CRC32Digest crc3; crc3.putDigest(test, 44); crc3.getDigest(data.buf); crc = data.value; cout << "Test #3 CRC32 = " << hex << crc << "\n\n"; if (crc == 0xbf671ed0) cout << "Test #3 PASSED\n\n\n"; else cout << "Test #3 FAILED\n\n\n"; } commoncpp2-1.8.1/src/0000755000175000017500000000000011463572774011406 500000000000000commoncpp2-1.8.1/src/md5.cpp0000644000175000017500000002341511463400502012477 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #ifdef WIN32 #include #endif #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif static inline unsigned long rotate_left(unsigned long x, unsigned long n) { // is unsigned long > 32 bit mask #if ~0lu != 0xfffffffflu return (x << n) | ((x & 0xffffffffu) >> (32-n)); #else return (x << n) | (x >> (32-n)); #endif } static inline unsigned long F(unsigned long x, unsigned long y, unsigned long z) { return (x & y) | (~x & z); } static inline unsigned long G(unsigned long x, unsigned long y, unsigned long z) { return (x & z) | (y & ~z); } static inline unsigned long H(unsigned long x, unsigned long y, unsigned long z) { return x ^ y ^ z; } inline unsigned long I(unsigned long x, unsigned long y, unsigned long z) { return y ^ (x | ~z); } static void FF(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) { a += F(b, c, d) + x + ac; a = rotate_left(a, s) + b; } static void GG(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) { a += G(b, c, d) + x + ac; a = rotate_left(a, s) + b; } static void HH(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) { a += H(b, c, d) + x + ac; a = rotate_left(a, s) + b; } static void II(unsigned long &a, unsigned long b, unsigned long c, unsigned long d, unsigned long x, unsigned long s, unsigned long ac) { a += I(b, c, d) + x + ac; a = rotate_left(a, s) + b; } MD5Digest::MD5Digest() : Digest() { initDigest(); updated = true; } void MD5Digest::initDigest(void) { count[0] = count[1] = 0; state[0] = 0x67452301; state[1] = 0xefcdab89; state[2] = 0x98badcfe; state[3] = 0x10325476; bpos = 0; updated = true; // CCY Added setp((char*)buf,(char*)buf+64); } int MD5Digest::overflow(int c) { updated = true; bpos = (unsigned)((unsigned char*)pptr() - buf); if(bpos >= 64) update(); if (c != EOF) buf[bpos++] = (unsigned char)c; setp((char*)buf + bpos,(char*)buf + 64); return c; } void MD5Digest::update(void) { unsigned long x[16], a, b, c, d; int i; if(!bpos) return; while(bpos < 64) buf[bpos++] = 0; bpos = 0; if((count[0] += 512) < 512) ++count[1]; a = state[0]; b = state[1]; c = state[2]; d = state[3]; for(i = 0; i < 16; ++i) x[i] = (unsigned long)(buf[i * 4]) | (unsigned long)(buf[i * 4 + 1] << 8) | (unsigned long)(buf[i * 4 + 2] << 16) | (unsigned long)(buf[i * 4 + 3] << 24); FF(a, b, c, d, x[ 0], S11, 0xd76aa478); FF(d, a, b, c, x[ 1], S12, 0xe8c7b756); FF(c, d, a, b, x[ 2], S13, 0x242070db); FF(b, c, d, a, x[ 3], S14, 0xc1bdceee); FF(a, b, c, d, x[ 4], S11, 0xf57c0faf); FF(d, a, b, c, x[ 5], S12, 0x4787c62a); FF(c, d, a, b, x[ 6], S13, 0xa8304613); FF(b, c, d, a, x[ 7], S14, 0xfd469501); FF(a, b, c, d, x[ 8], S11, 0x698098d8); FF(d, a, b, c, x[ 9], S12, 0x8b44f7af); FF(c, d, a, b, x[10], S13, 0xffff5bb1); FF(b, c, d, a, x[11], S14, 0x895cd7be); FF(a, b, c, d, x[12], S11, 0x6b901122); FF(d, a, b, c, x[13], S12, 0xfd987193); FF(c, d, a, b, x[14], S13, 0xa679438e); FF(b, c, d, a, x[15], S14, 0x49b40821); GG(a, b, c, d, x[ 1], S21, 0xf61e2562); GG(d, a, b, c, x[ 6], S22, 0xc040b340); GG(c, d, a, b, x[11], S23, 0x265e5a51); GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa); GG(a, b, c, d, x[ 5], S21, 0xd62f105d); GG(d, a, b, c, x[10], S22, 0x2441453); GG(c, d, a, b, x[15], S23, 0xd8a1e681); GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8); GG(a, b, c, d, x[ 9], S21, 0x21e1cde6); GG(d, a, b, c, x[14], S22, 0xc33707d6); GG(c, d, a, b, x[ 3], S23, 0xf4d50d87); GG(b, c, d, a, x[ 8], S24, 0x455a14ed); GG(a, b, c, d, x[13], S21, 0xa9e3e905); GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8); GG(c, d, a, b, x[ 7], S23, 0x676f02d9); GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); HH(a, b, c, d, x[ 5], S31, 0xfffa3942); HH(d, a, b, c, x[ 8], S32, 0x8771f681); HH(c, d, a, b, x[11], S33, 0x6d9d6122); HH(b, c, d, a, x[14], S34, 0xfde5380c); HH(a, b, c, d, x[ 1], S31, 0xa4beea44); HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9); HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60); HH(b, c, d, a, x[10], S34, 0xbebfbc70); HH(a, b, c, d, x[13], S31, 0x289b7ec6); HH(d, a, b, c, x[ 0], S32, 0xeaa127fa); HH(c, d, a, b, x[ 3], S33, 0xd4ef3085); HH(b, c, d, a, x[ 6], S34, 0x4881d05); HH(a, b, c, d, x[ 9], S31, 0xd9d4d039); HH(d, a, b, c, x[12], S32, 0xe6db99e5); HH(c, d, a, b, x[15], S33, 0x1fa27cf8); HH(b, c, d, a, x[ 2], S34, 0xc4ac5665); II(a, b, c, d, x[ 0], S41, 0xf4292244); II(d, a, b, c, x[ 7], S42, 0x432aff97); II(c, d, a, b, x[14], S43, 0xab9423a7); II(b, c, d, a, x[ 5], S44, 0xfc93a039); II(a, b, c, d, x[12], S41, 0x655b59c3); II(d, a, b, c, x[ 3], S42, 0x8f0ccc92); II(c, d, a, b, x[10], S43, 0xffeff47d); II(b, c, d, a, x[ 1], S44, 0x85845dd1); II(a, b, c, d, x[ 8], S41, 0x6fa87e4f); II(d, a, b, c, x[15], S42, 0xfe2ce6e0); II(c, d, a, b, x[ 6], S43, 0xa3014314); II(b, c, d, a, x[13], S44, 0x4e0811a1); II(a, b, c, d, x[ 4], S41, 0xf7537e82); II(d, a, b, c, x[11], S42, 0xbd3af235); II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb); II(b, c, d, a, x[ 9], S44, 0xeb86d391); state[0] += a; state[1] += b; state[2] += c; state[3] += d; updated = true; } void MD5Digest::commit(void) { unsigned char cbuf[8]; unsigned long i, len; static unsigned char pad[64]={ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; bpos = (unsigned)((unsigned char*)pptr() - buf); if(!updated && !bpos) return; count[0] += (unsigned long)(bpos << 3); if(count[0] < (unsigned long)(bpos << 3)) ++count[1]; for(i = 0; i < 2; ++i) { cbuf[i * 4] = (unsigned char)count[i] & 0xff; cbuf[i * 4 + 1] = (unsigned char)((count[i] >> 8) & 0xff); cbuf[i * 4 + 2] = (unsigned char)((count[i] >> 16) & 0xff); cbuf[i * 4 + 3] = (unsigned char)((count[i] >> 24) & 0xff); } i = (unsigned) ((count[0] >> 3) & 0x3f); len = (i < 56) ? (56 - i) : (120 - i); if(len) putDigest(pad, len); putDigest(cbuf, 8); for(i = 0; i < 4; ++i) { md5[i * 4] = (unsigned char)state[i] & 0xff; md5[i * 4 + 1] = (unsigned char)((state[i] >> 8) & 0xff); md5[i * 4 + 2] = (unsigned char)((state[i] >> 16) & 0xff); md5[i * 4 + 3] = (unsigned char)((state[i] >> 24) & 0xff); } initDigest(); } unsigned MD5Digest::getDigest(unsigned char *buffer) { commit(); memcpy(buffer, md5, 16); return 16; } void MD5Digest::putDigest(const unsigned char *buffer, unsigned len) { bpos = (unsigned)((unsigned char*)pptr()-buf); if(bpos >= 64) update(); while(len--) { buf[bpos++] = *(buffer++); if(bpos >= 64) update(); } setp((char*)buf+bpos,(char*)buf+64); } ostream &MD5Digest::strDigest(ostream &os) { char dbuf[36]; int i; commit(); for(i = 0; i < 16; ++i) sprintf(dbuf + 2 * i, "%02x", md5[i]); os << dbuf; return os; } #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/in6addr.cpp0000644000175000017500000003146411463377350013362 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include "private.h" #include #ifdef CCXX_IPV6 #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef WIN32 Mutex IPV6Address::mutex; #endif const IPV6MulticastValidator IPV6Multicast::validator; void IPV6MulticastValidator::operator()(const in6_addr address) const { #ifdef CCXX_EXCEPTIONS // "0000:" is always accepted, as it is an "empty" address. if ( (address.s6_addr[0] != 0 || address.s6_addr[1] != 0) && (address.s6_addr[0] != 0xff || address.s6_addr[1] < 0x1f)) { throw "Multicast address not in the valid prefix ff00-ff1f:"; } #endif } IPV6Address::IPV6Address(const IPV6Validator *_validator) : validator(_validator), hostname(NULL) { addr_count = 1; ipaddr = new struct in6_addr[1]; memcpy(ipaddr, &in6addr_any, sizeof(in6_addr)); } IPV6Address::IPV6Address(const char *address, const IPV6Validator *_validator) : validator(_validator), ipaddr(NULL), addr_count(0), hostname(NULL) { if ( this->validator ) this->validator = validator; if(address == 0 || !strcmp(address, "*")) setAddress(NULL); else setAddress(address); } IPV6Address::IPV6Address(struct in6_addr addr, const IPV6Validator *_validator) : validator(_validator), ipaddr(NULL), hostname(NULL) { if ( this->validator ){ this->validator = validator; (*validator)(addr); } addr_count = 1; ipaddr = new struct in6_addr[1]; memcpy(&ipaddr, &addr, sizeof(struct in6_addr)); } IPV6Address::IPV6Address(const IPV6Address &rhs) : validator(rhs.validator), addr_count(rhs.addr_count), hostname(NULL) { ipaddr = new struct in6_addr[addr_count]; memcpy(ipaddr, rhs.ipaddr, sizeof(struct in6_addr) * addr_count); } IPV6Address::~IPV6Address() { if(ipaddr) { delete[] ipaddr; ipaddr = NULL; } if(hostname) { delString(hostname); hostname = NULL; } } struct in6_addr IPV6Address::getAddress(void) const { return ipaddr[0]; } struct in6_addr IPV6Address::getAddress(size_t i) const { return (i < addr_count ? ipaddr[i] : ipaddr[0]); } bool IPV6Address::isInetAddress(void) const { struct in6_addr addr; memset(&addr, 0, sizeof(addr)); if(!ipaddr) return false; if(memcmp(&addr, &ipaddr[0], sizeof(addr))) return true; return false; } IPV6Address &IPV6Address::operator=(const char *str) { if(str == 0 || !strcmp(str, "*")) str = "::"; setAddress(str); return *this; } IPV6Address &IPV6Address::operator=(struct in6_addr addr) { if(ipaddr) delete[] ipaddr; if ( validator ) (*validator)(addr); addr_count = 1; ipaddr = new struct in6_addr[1]; ipaddr[0] = addr; if(hostname) delString(hostname); hostname = NULL; return *this; } IPV6Address &IPV6Address::operator=(const IPV6Address &rhs) { if(this == &rhs) return *this; addr_count = rhs.addr_count; if(ipaddr) delete[] ipaddr; ipaddr = new struct in6_addr[addr_count]; memcpy(ipaddr, rhs.ipaddr, sizeof(struct in6_addr) * addr_count); validator = rhs.validator; if(hostname) delString(hostname); hostname = NULL; return *this; } bool IPV6Address::operator==(const IPV6Address &a) const { const IPV6Address *smaller, *larger; size_t s, l; if(addr_count > a.addr_count) { smaller = &a; larger = this; } else { smaller = this; larger = &a; } // Loop through all addr's in the smaller and make sure // that they are all in the larger for(s = 0; s < smaller->addr_count; s++) { // bool found = false; for(l = 0; l < larger->addr_count && memcmp((char *)&ipaddr[s], (char *)&a.ipaddr[l], sizeof(struct in6_addr)); l++); if(l == larger->addr_count) return false; } return true; } bool IPV6Address::operator!=(const IPV6Address &a) const { // Impliment in terms of operator== return (*this == a ? false : true); } IPV6Host &IPV6Host::operator&=(const IPV6Mask &ma) { for(size_t i = 0; i < addr_count; i++) { struct in6_addr mask = ma.getAddress(); unsigned char *a = (unsigned char *)&ipaddr[i]; unsigned char *m = (unsigned char *)&mask; for(size_t j = 0; j < sizeof(struct in6_addr); ++j) *(a++) &= *(m++); } if(hostname) delString(hostname); hostname = NULL; return *this; } IPV6Host::IPV6Host(struct in6_addr addr) : IPV6Address(addr) {} IPV6Host::IPV6Host(const char *host) : IPV6Address(host) { char namebuf[256]; if(!host) { gethostname(namebuf, 256); setAddress(namebuf); } } bool IPV6Address::setIPAddress(const char *host) { if(!host) return false; struct in6_addr l_addr; #ifdef WIN32 struct sockaddr saddr; int slen = sizeof(saddr); struct sockaddr_in6 *paddr = (struct sockaddr_in6 *)&saddr; int ok = WSAStringToAddress((LPSTR)host, AF_INET6, NULL, &saddr, &slen); l_addr = paddr->sin6_addr; #else int ok = inet_pton(AF_INET6, host, &l_addr); #endif if ( validator ) (*validator)(l_addr); if ( !ok ) return false; *this = l_addr; return true; } #if defined(HAVE_GETADDRINFO) && !defined(HAVE_GETHOSTBYNAME2) void IPV6Address::setAddress(const char *host) { if(hostname) delString(hostname); hostname = NULL; if(!host) // The way this is currently used, this can never happen host = "::"; #ifdef WIN32 if(!stricmp(host, "localhost")) host = "::1"; #endif if(!setIPAddress(host)) { struct addrinfo hint, *list = NULL, *first; memset(&hint, 0, sizeof(hint)); hint.ai_family = AF_INET6; struct in6_addr *addr; struct sockaddr_in6 *ip6addr; if(getaddrinfo(host, NULL, &hint, &list) || !list) { if(ipaddr) delete[] ipaddr; ipaddr = new struct in6_addr[1]; memset((void *)&ipaddr[0], 0, sizeof(ipaddr)); return; } // Count the number of IP addresses returned addr_count = 0; first = list; while(list) { ++addr_count; list = list->ai_next; } // Allocate enough memory if(ipaddr) delete[] ipaddr; // Cause this was allocated in base ipaddr = new struct in6_addr[addr_count]; // Now go through the list again assigning to // the member ipaddr; list = first; int i = 0; while(list) { ip6addr = (struct sockaddr_in6 *)list->ai_addr; addr = &ip6addr->sin6_addr; if(validator) (*validator)(*addr); ipaddr[i++] = *addr; list = list->ai_next; } freeaddrinfo(first); } } #else void IPV6Address::setAddress(const char *host) { if(hostname) delString(hostname); hostname = NULL; if(!host) // The way this is currently used, this can never happen host = "::"; #ifdef WIN32 if(!stricmp(host, "localhost")) host = "::1"; #endif if(!setIPAddress(host)) { struct hostent *hp; struct in6_addr **bptr; #if defined(__GLIBC__) char hbuf[8192]; struct hostent hb; int rtn; if(gethostbyname2_r(host, AF_INET6, &hb, hbuf, sizeof(hbuf), &hp, &rtn)) hp = NULL; #elif defined(sun) char hbuf[8192]; struct hostent hb; int rtn; hp = gethostbyname2_r(host, AF_INET6, &hb, hbuf, sizeof(hbuf), &rtn); #elif (defined(__osf__) || defined(_OSF_SOURCE) || defined(__hpux)) hp = gethostbyname(host); #elif defined(WIN32) && (!defined(_MSC_VER) || _MSC_VER < 1300) hp = gethostbyname(host); #elif defined(WIN32) hp = gethostbyname2(host, AF_INET6); #else mutex.enterMutex(); hp = gethostbyname2(host, AF_INET6); mutex.leaveMutex(); #endif if(!hp) { if(ipaddr) delete[] ipaddr; ipaddr = new struct in6_addr[1]; memset((void *)&ipaddr[0], 0, sizeof(ipaddr)); return; } // Count the number of IP addresses returned addr_count = 0; for(bptr = (struct in6_addr **)hp->h_addr_list; *bptr != NULL; bptr++) { addr_count++; } // Allocate enough memory if(ipaddr) delete[] ipaddr; // Cause this was allocated in base ipaddr = new struct in6_addr[addr_count]; // Now go through the list again assigning to // the member ipaddr; bptr = (struct in6_addr **)hp->h_addr_list; for(unsigned int i = 0; i < addr_count; i++) { if ( validator ) (*validator)(*bptr[i]); ipaddr[i] = *bptr[i]; } } } #endif IPV6Broadcast::IPV6Broadcast(const char *net) : IPV6Address(net) { } IPV6Mask::IPV6Mask(const char *mask) : IPV6Address(mask) { } const char *IPV6Address::getHostname(void) const { struct hostent *hp = NULL; struct in6_addr addr0; static char strbuf[64]; memset(&addr0, 0, sizeof(addr0)); if(!memcmp(&addr0, &ipaddr[0], sizeof(addr0))) return NULL; if(!memcmp(&in6addr_loopback, &ipaddr[0], sizeof(addr0))) return "localhost"; #if defined(__GLIBC__) char hbuf[8192]; struct hostent hb; int rtn; if(gethostbyaddr_r((char *)&ipaddr[0], sizeof(addr0), AF_INET6, &hb, hbuf, sizeof(hbuf), &hp, &rtn)) hp = NULL; #elif defined(sun) char hbuf[8192]; struct hostent hb; int rtn; hp = gethostbyaddr_r((char *)&ipaddr[0], sizeof(addr0), AF_INET6, &hb, hbuf, (int)sizeof(hbuf), &rtn); #elif defined(__osf__) || defined(WIN32) hp = gethostbyaddr((char *)&ipaddr[0], sizeof(addr0), AF_INET6); #else mutex.enterMutex(); hp = gethostbyaddr((char *)&ipaddr[0], sizeof(addr0), AF_INET6); mutex.leaveMutex(); #endif if(hp) { if(hostname) delString(hostname); hostname = newString(hp->h_name); return hostname; } else { #ifdef WIN32 struct sockaddr saddr; struct sockaddr_in6 *paddr = (struct sockaddr_in6 *)&saddr; DWORD slen = sizeof(strbuf); memset(&saddr, 0, sizeof(saddr)); paddr->sin6_family = AF_INET6; paddr->sin6_addr = ipaddr[0]; WSAAddressToString(&saddr, sizeof(saddr), NULL, strbuf, &slen); return strbuf; #else return inet_ntop(AF_INET6, &ipaddr[0], strbuf, sizeof(strbuf)); #endif } } IPV6Host operator&(const IPV6Host &addr, const IPV6Mask &mask) { IPV6Host temp = addr; temp &= mask; return temp; } IPV6Multicast::IPV6Multicast() : IPV6Address(&validator) {} IPV6Multicast::IPV6Multicast(const char *address) : IPV6Address(address,&validator) {} #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/map.cpp0000644000175000017500000001315611463400424012573 00000000000000// Copyright (C) 2004-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif MapIndex& MapIndex::operator=(MapObject *theObject) { thisObject = theObject; return *this; } MapIndex& MapIndex::operator++() { if ( thisObject == NULL ) return *this; if (thisObject->nextObject != NULL) { thisObject = thisObject->nextObject; } else if (thisObject->table != NULL) { MapObject* obj = NULL; unsigned i = thisObject->table->getIndex(thisObject->idObject) + 1; thisObject->table->enterMutex(); for ( ; obj == NULL && i < thisObject->table->range; i++) obj = thisObject->table->map[i]; thisObject->table->leaveMutex(); thisObject = obj; } return *this; } MapTable::MapTable(unsigned size) : Mutex() { map = new MapObject *[size + 1]; memset(map, 0, sizeof(MapObject *) * (size + 1)); range = size; count = 0; } MapTable::~MapTable() { cleanup(); } void MapTable::cleanup(void) { enterMutex(); if(map) delete[] map; map = NULL; leaveMutex(); } unsigned MapTable::getIndex(const char *id) { unsigned key = 0; while(*id) key = (key << 1) ^ (*(id++) & 0x1f); return key % range; } void *MapTable::getObject(const char *id) { if(!map) return NULL; enterMutex(); MapObject *obj = map[getIndex(id)]; while(obj) { if(!stricmp(obj->idObject, id)) break; obj = obj->nextObject; } leaveMutex(); return (void *)obj; } void *MapTable::getFirst() { MapObject *obj; if(!map) return NULL; enterMutex(); obj = *map; for (register unsigned i = 0; obj == NULL && i < range; i++) obj = map[i]; leaveMutex(); return obj; } void *MapTable::getLast() { MapObject *obj = NULL; if(!map) return NULL; enterMutex(); for (register int i = range - 1; obj == NULL && i >= 0; i--) obj = map[i]; if ( obj != NULL ) while ( obj->nextObject != NULL ) obj = obj->nextObject; leaveMutex(); return obj; } void *MapTable::getFree(void) { enterMutex(); MapObject *obj = map[range]; if(obj) map[range] = obj->nextObject; leaveMutex(); return obj; } void MapTable::addFree(MapObject *obj) { obj->detach(); enterMutex(); obj->nextObject = map[range]; map[range] = obj; leaveMutex(); } void MapTable::addObject(MapObject &obj) { unsigned idx = getIndex(obj.idObject); if(obj.table == this || !map) return; obj.detach(); enterMutex(); obj.nextObject = map[idx]; map[idx] = &obj; obj.table = this; count++; leaveMutex(); } MapTable &MapTable::operator+=(MapObject &obj) { addObject(obj); return *this; } MapTable &MapTable::operator-=(MapObject &obj) { if(obj.table == this) obj.detach(); return *this; } MapObject::MapObject(const char *id) { table = NULL; idObject = id; } void MapObject::detach(void) { MapObject *node, *prev = NULL; unsigned idx; if(!table) return; idx = table->getIndex(idObject); table->enterMutex(); node = table->map[idx]; while(node) { if(node == this) break; prev = node; node = prev->nextObject; } if(node && !prev) table->map[idx] = nextObject; else if(node) prev->nextObject = nextObject; table->count--; table->leaveMutex(); table = NULL; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/buffer.cpp0000644000175000017500000001674311463374160013303 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #ifdef CCXX_NAMESPACES namespace ost { #endif const size_t Buffer::timeout = ((size_t)(-1l)); #ifdef WIN32 Buffer::Buffer(size_t capacity) : Mutex() #else Buffer::Buffer(size_t capacity) : Conditional() #endif { #ifdef WIN32 sem_head = ::CreateSemaphore((LPSECURITY_ATTRIBUTES)NULL, 0, MAX_SEM_VALUE, (LPCTSTR)NULL); sem_tail = ::CreateSemaphore((LPSECURITY_ATTRIBUTES)NULL, (LONG)capacity, MAX_SEM_VALUE, (LPCTSTR)NULL); #endif _size = capacity; _used = 0; } Buffer::~Buffer() { #ifdef WIN32 ::CloseHandle(sem_head); ::CloseHandle(sem_tail); #endif } #ifdef WIN32 size_t Buffer::wait(void *buf, timeout_t timeout) { size_t rc; if(!timeout) timeout = INFINITE; if(Thread::waitThread(sem_head, timeout) != WAIT_OBJECT_0) return Buffer::timeout; enterMutex(); rc = onWait(buf); --_used; leaveMutex(); ::ReleaseSemaphore(sem_tail, 1, (LPLONG)NULL); return rc; } size_t Buffer::post(void *buf, timeout_t timeout) { size_t rc; if(!timeout) timeout = INFINITE; if(Thread::waitThread(sem_tail, timeout) != WAIT_OBJECT_0) return Buffer::timeout; enterMutex(); rc = onPost(buf); ++_used; leaveMutex(); ::ReleaseSemaphore(sem_head, 1, (LPLONG)NULL); return rc; } #else size_t Buffer::wait(void *buf, timeout_t timeout) { size_t rc = 0; enterMutex(); while(!_used) { if(!Conditional::wait(timeout, true)) { leaveMutex(); return Buffer::timeout; } } rc = (ssize_t)onWait(buf); --_used; Conditional::signal(false); leaveMutex(); return rc; } size_t Buffer::post(void *buf, timeout_t timeout) { size_t rc = 0; enterMutex(); while(_used == _size) { if(!Conditional::wait(timeout, true)) { leaveMutex(); return Buffer::timeout; } } rc = (ssize_t)onPost(buf); ++_used; Conditional::signal(false); leaveMutex(); return rc; } size_t Buffer::peek(void *buf) { size_t rc; enterMutex(); if(!_used) { leaveMutex(); return 0; } rc = onPeek(buf); leaveMutex(); return rc; } #endif bool Buffer::isValid(void) { return true; } FixedBuffer::FixedBuffer(size_t capacity, size_t osize) : Buffer(capacity) { objsize = osize; buf = new char[capacity * objsize]; #ifdef CCXX_EXCEPTIONS if(!buf && Thread::getException() == Thread::throwObject) throw(this); #ifdef COMMON_STD_EXCEPTION else if(!buf && Thread::getException() == Thread::throwException) throw(SyncException("fixed buffer failure")); #endif #endif head = tail = buf; } FixedBuffer::~FixedBuffer() { if(buf) delete[] buf; } bool FixedBuffer::isValid(void) { if(head && tail) return true; return false; } #define MAXBUF (buf + (getSize() * objsize)) size_t FixedBuffer::onWait(void *data) { memcpy(data, head, objsize); if((head += objsize) >= MAXBUF) head = buf; return objsize; } size_t FixedBuffer::onPost(void *data) { memcpy(tail, data, objsize); if((tail += objsize) >= MAXBUF) tail = buf; return objsize; } size_t FixedBuffer::onPeek(void *data) { memcpy(data, head, objsize); return objsize; } ThreadQueue::ThreadQueue(const char *id, int pri, size_t stack) : Mutex(), Thread(pri, stack), Semaphore(), name(id) { first = last = NULL; started = false; timeout = 0; } ThreadQueue::~ThreadQueue() { data_t *data, *next; if(started) { started = false; } data = first; while(data) { next = data->next; delete[] data; data = next; } } void ThreadQueue::run(void) { bool posted; data_t *prev; started = true; for(;;) { posted = Semaphore::wait(timeout); if(!posted) { onTimer(); if(!first) continue; } if(!started) sleep((timeout_t)~0); startQueue(); while(first) { runQueue(first->data); enterMutex(); prev = first; first = first->next; delete[] prev; if(!first) last = NULL; leaveMutex(); if(first) Semaphore::wait(); // demark semaphore } stopQueue(); } } void ThreadQueue::final() { #ifndef WIN32 // Unlock is needed to unlock the mutex in the case of a cancel during Semaphore::wait() // see PTHREAD_COND_TIMEDWAIT(3P) Semaphore::force_unlock_after_cancellation(); #endif } void ThreadQueue::onTimer(void) { } void ThreadQueue::setTimer(timeout_t timed) { enterMutex(); timeout = timed; leaveMutex(); if(!started) { start(); started = true; } else if(!first) Semaphore::post(); } void ThreadQueue::post(const void *dp, unsigned len) { data_t *data = (data_t *)new char[sizeof(data_t) + len]; memcpy(data->data, dp, len); data->len = len; data->next = NULL; enterMutex(); if(!first) first = data; if(last) last->next = data; last = data; if(!started) { start(); started = true; } leaveMutex(); Semaphore::post(); } void ThreadQueue::startQueue(void) { } void ThreadQueue::stopQueue(void) { } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/libccgnu2.pc.in0000644000175000017500000000053511463314535014117 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ sysconfdir=@sysconfdir@ modflags=@MODULE_FLAGS@ dynloader=@ost_cv_dynloader@ Name: libccgnu2 Description: GNU Common C++ core library Version: @VERSION@ Libs: -lccgnu2 @DYN_LOADER@ @SOCKET_LIBS@ @THREAD_LIBS@ Cflags: @THREAD_FLAGS@ @COMMON_FLAGS@ -I@includedir@ commoncpp2-1.8.1/src/numbers.cpp0000644000175000017500000001235511463401321013466 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #ifdef CCXX_NAMESPACES namespace ost { #endif Number::Number(char *buf, unsigned width) { if(width > 10) width = 10; if(width < 1) width = 1; size = width; buffer = buf; } long Number::getValue(void) const { int count = size; bool sign = false; long ret = 0; char *bp = buffer; if(*bp == '-') { --count; ++bp; sign = true; } else if(*bp == '+') { --count; ++bp; } while(count && *bp >='0' && *bp <='9') { ret = ret * 10l + (*bp - '0'); --count; ++bp; } if(sign) ret = -ret; return ret; } void Number::setValue(long value) { int count = size; char *bp = buffer; long max = 1; int exp; bool z = false; if(value < 0) { value = -value; --count; *(bp++) = '-'; } exp = count; while(--exp) max *= 10; while(max) { if(value >= max || z) { --count; *(bp++) = '0' + ((char)(value / max)); } if(value >= max) { z = true; value -= (value / max) * max; } max /= 10; } while(count-- && *bp >= '0' && *bp <='9') *(bp++) = ' '; } long Number::operator=(long value) { setValue(value); return value; } long Number::operator+=(const long value) { long value1 = getValue() + value; setValue(value1); return value1; } long Number::operator-=(const long value) { long value1 = getValue() - value; setValue(value1); return value1; } long Number::operator--() { long val = getValue(); setValue(--val); return val; } long Number::operator++() { long val = getValue(); setValue(++val); return val; } int Number::operator==(const Number &num) { return getValue() == num.getValue(); } int Number::operator!=(const Number &num) { return getValue() != num.getValue(); } int Number::operator<(const Number &num) { return getValue() < num.getValue(); } int Number::operator<=(const Number &num) { return getValue() <= num.getValue(); } int Number::operator>(const Number &num) { return getValue() > num.getValue(); } int Number::operator>=(const Number &num) { return getValue() >= num.getValue(); } ZNumber::ZNumber(char *buf, unsigned chars) : Number(buf, chars) {} void ZNumber::setValue(long value) { int count = size; char *bp = buffer; long max = 1; int exp; if(value < 0) { value = -value; --count; *(bp++) = '-'; } exp = count; while(--exp) max *= 10; while(max) { --count; *(bp++) = '0' + (char)(value / max); value -= (value / max) * max; max /= 10; } } long ZNumber::operator=(long value) { setValue(value); return value; } long operator+(const Number &num, long val) { return num.getValue() + val; } long operator+(long val, const Number &num) { return num.getValue() + val; } long operator-(const Number &num, long val) { return num.getValue() - val; } long operator-(long val, const Number &num) { return num.getValue() - val; } #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/persist.cpp0000644000175000017500000001016711463401570013511 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #if !defined(_MSC_VER) || _MSC_VER >= 1300 #include #include #include #include "assert.h" #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif #ifdef CCXX_EXCEPTIONS # ifndef COMMON_STD_EXCEPTION PersistException::PersistException(String const& reason) : _what(reason) {} // Nothing :) const String& PersistException::getString() const { return _what; } # endif #endif const char* BaseObject::getPersistenceID() const { return "BaseObject"; } BaseObject::BaseObject() {} // Do nothing BaseObject::~BaseObject() {} // Do nothing bool BaseObject::write(Engine& archive) const { // Do nothing return true; // Successfully } bool BaseObject::read(Engine& archive) { // Do nothing return true; // Successfully } static TypeManager::StringFunctionMap* theInstantiationFunctions = 0; static int refCount = 0; TypeManager::StringFunctionMap& _internal_GetMap() { return *theInstantiationFunctions; } void TypeManager::add(const char* name, NewBaseObjectFunction construction) { if (refCount++ == 0) { theInstantiationFunctions = new StringFunctionMap; } assert(_internal_GetMap().find(String(name)) == _internal_GetMap().end()); _internal_GetMap()[String(name)] = construction; } void TypeManager::remove(const char* name) { assert(_internal_GetMap().find(String(name)) != _internal_GetMap().end()); _internal_GetMap().erase(_internal_GetMap().find(String(name))); if (--refCount == 0) { delete theInstantiationFunctions; theInstantiationFunctions = 0; } } BaseObject* TypeManager::createInstanceOf(const char* name) { if (!refCount || _internal_GetMap().find(String(name)) == _internal_GetMap().end()) return NULL; return (_internal_GetMap()[String(name)])(); } TypeManager::Registration::Registration(const char *name, NewBaseObjectFunction func) : myName(name) { TypeManager::add(name, func); } TypeManager::Registration::~Registration() { TypeManager::remove(myName.c_str()); } #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/libccgnu2.pc0000644000175000017500000000051011463364531013504 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib64 includedir=${prefix}/include sysconfdir=/etc modflags=-module -shared -avoid-version dynloader=yes Name: libccgnu2 Description: GNU Common C++ core library Version: 1.8.1 Libs: -lccgnu2 -ldl -lrt -pthread -lpthread Cflags: -D_GNU_SOURCE -I${prefix}/include commoncpp2-1.8.1/src/process.cpp0000644000175000017500000003211711463401773013502 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include #include #include #ifdef MACOSX #undef _POSIX_PRIORITY_SCHEDULING #endif #ifndef WIN32 #ifdef HAVE_SYS_TIME_H #include #endif #ifdef HAVE_SYS_WAIT_H #include #endif #include #include #ifdef SIGTSTP #include #include #endif #ifndef _PATH_TTY #define _PATH_TTY "/dev/tty" #endif #endif #ifdef WIN32 #include #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif static char *_pUser = NULL; static char *_pHome = NULL; bool Process::rtflag = false; #ifdef WIN32 static SYSTEM_INFO sysinfo; static LPSYSTEM_INFO lpSysInfo = NULL; static void init_sysinfo(void) { if(!lpSysInfo) { lpSysInfo = &sysinfo; memset(&sysinfo, 0, sizeof(sysinfo)); GetSystemInfo(lpSysInfo); } } const char *Process::getUser(void) { static char userid[65]; DWORD length = sizeof(userid); if(GetUserName(userid, &length)) return userid; return NULL; } size_t Process::getPageSize(void) { init_sysinfo(); return (size_t) lpSysInfo->dwPageSize; } int Process::spawn(const char *exename, const char **args, bool wait) { int mode = P_NOWAIT; if(wait) mode = P_WAIT; return (int)::spawnvp(mode, (char *)exename, (char **)args); } int Process::join(int pid) { int status, result; if(pid == -1) return pid; result = (int)cwait(&status, pid, WAIT_CHILD); if(status & 0x0) return -1; return result; } bool Process::cancel(int pid, int sig) { HANDLE hPid = OpenProcess(PROCESS_TERMINATE, FALSE, pid); bool rtn = true; if(!hPid) return false; switch(sig) { case SIGABRT: case SIGTERM: if(!TerminateProcess(hPid, -1)) rtn = false; case 0: break; default: rtn = false; } CloseHandle(hPid); return rtn; } void Process::setPriority(int pri) { DWORD pc = NORMAL_PRIORITY_CLASS; DWORD pid = GetCurrentProcessId(); HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, TRUE, pid); #ifdef BELOW_NORMAL_PRIORITY_CLASS if(pri == -1) pc = BELOW_NORMAL_PRIORITY_CLASS; else if(pri == 1) pc = ABOVE_NORMAL_PRIORITY_CLASS; else #endif if(pri == 2) pc = HIGH_PRIORITY_CLASS; else if(pri > 2) pc = REALTIME_PRIORITY_CLASS; else if(pri < -1) pc = IDLE_PRIORITY_CLASS; SetPriorityClass(hProcess, pc); CloseHandle(hProcess); } void Process::setScheduler(const char *cp) { if(!stricmp(cp, "fifo")) setPriority(3); else if(!stricmp(cp, "rr")) setPriority(2); else if(!stricmp(cp, "idle")) setPriority(-2); else setPriority(0); } void Process::setRealtime(int pri) { setPriority(3); } bool Process::isScheduler(void) { return false; } #else #ifndef WEXITSTATUS #define WEXITSTATUS(status) ((unsigned)(status) >> 8) #endif #ifndef WIFEXITED #define WIFEXITED(status) (((status) & 255) == 0) #endif #ifndef WTERMSIG #define WTERMSIG(status) (((unsigned)(status)) & 0x7F) #endif #ifndef WIFSIGNALLED #define WIFSIGNALLED(status) (((status) & 255) != 0) #endif #ifndef WCOREDUMP #define WCOREDUMP(status) (((status) & 0x80) != 0) #endif static void lookup(void) { struct passwd *pw = NULL; #ifdef HAVE_GETPWUID_R struct passwd pwd; char buffer[1024]; ::getpwuid_r(geteuid(), &pwd, buffer, 1024, &pw); #else pw = ::getpwuid(geteuid()); #endif if(_pHome) delString(_pHome); if(_pUser) delString(_pUser); _pUser = _pHome = NULL; if(pw != NULL && pw->pw_dir != NULL) _pHome = newString(pw->pw_dir); if(pw != NULL && pw->pw_name != NULL) _pUser = newString(pw->pw_name); endpwent(); } const char *Process::getUser(void) { if(!_pUser) lookup(); return (const char *)_pUser; } const char *Process::getConfigDir(void) { #ifdef ETC_CONFDIR return ETC_CONFDIR; #else return ETC_PREFIX; #endif } const char *Process::getHomeDir(void) { if(!_pHome) lookup(); return (const char *)_pHome; } #ifdef HAVE_GETPAGESIZE size_t Process::getPageSize(void) { return (size_t)getpagesize(); } #else size_t Process::getPageSize(void) { return 1024; } #endif bool Process::setUser(const char *id, bool grp) { struct passwd *pw = NULL; #ifdef HAVE_GETPWNAM_R struct passwd pwd; char buffer[1024]; ::getpwnam_r(id, &pwd, buffer, 1024, &pw); #else pw = ::getpwnam(id); #endif if(!pw) return false; if(grp) if(setgid(pw->pw_gid)) return false; if(setuid(pw->pw_uid)) return false; lookup(); return true; } bool Process::setGroup(const char *id) { struct group *group = NULL; #ifdef HAVE_GETGRNAM_R struct group grp; char buffer[2048]; ::getgrnam_r(id, &grp, buffer, 1024, &group); #else group = ::getgrnam(id); #endif if(!group) { endgrent(); return false; } #ifdef HAVE_SETEGID setegid(group->gr_gid); #endif if(setgid(group->gr_gid)) { endgrent(); return false; } endgrent(); return true; } bool Process::cancel(int pid, int sig) { if(!sig) sig = SIGTERM; if(pid < 1) return false; if(::kill(pid, sig)) return false; return true; } int Process::join(int pid) { int status; if(pid < 1) return -1; #ifdef HAVE_WAITPID waitpid(pid, &status, 0); #else #ifdef HAVE_WAIT4 wait4(pid, &status, 0, NULL); #else int result; while((result = wait(&status)) != pid && result != -1) ; #endif #endif if(WIFEXITED(status)) return WEXITSTATUS(status); else if(WIFSIGNALLED(status)) return -WTERMSIG(status); else return -1; } int Process::spawn(const char *exename, const char **args, bool wait) { int pid; pid = vfork(); if(pid == -1) return -1; if(!pid) { execvp((char *)exename, (char **)args); _exit(-1); } if(!wait) return pid; return join(pid); } Process::Trap Process::setInterruptSignal(int signo, Trap func) { struct sigaction sig_act, old_act; memset(&sig_act, 0, sizeof(sig_act)); sig_act.sa_handler = func; sigemptyset(&sig_act.sa_mask); if(signo != SIGALRM) sigaddset(&sig_act.sa_mask, SIGALRM); sig_act.sa_flags = 0; #ifdef SA_INTERRUPT sig_act.sa_flags |= SA_INTERRUPT; #endif if(sigaction(signo, &sig_act, &old_act) < 0) return SIG_ERR; return old_act.sa_handler; } Process::Trap Process::setPosixSignal(int signo, Trap func) { struct sigaction sig_act, old_act; memset(&sig_act, 0, sizeof(sig_act)); sig_act.sa_handler = func; sigemptyset(&sig_act.sa_mask); sig_act.sa_flags = 0; if(signo == SIGALRM) { #ifdef SA_INTERRUPT sig_act.sa_flags |= SA_INTERRUPT; #endif } else { sigaddset(&sig_act.sa_mask, SIGALRM); #ifdef SA_RESTART sig_act.sa_flags |= SA_RESTART; #endif } if(sigaction(signo, &sig_act, &old_act) < 0) return SIG_ERR; return old_act.sa_handler; } void Process::detach(void) { attach("/dev/null"); } void Process::attach(const char *dev) { int pid; int fd; if(getppid() == 1) return; ::close(0); ::close(1); ::close(2); #ifdef SIGTTOU setPosixSignal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN setPosixSignal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP setPosixSignal(SIGTSTP, SIG_IGN); #endif if((pid = fork()) < 0) THROW(pid); else if(pid > 0) exit(0); #if defined(SIGTSTP) && defined(TIOCNOTTY) if(setpgid(0, getpid()) == -1) THROW(-1); if((fd = open(_PATH_TTY, O_RDWR)) >= 0) { ioctl(fd, TIOCNOTTY, NULL); close(fd); } #else #ifdef HAVE_SETPGRP if(setpgrp() == -1) THROW(-1); #else if(setpgid(0, getpid()) == -1) THROW(-1); #endif setPosixSignal(SIGHUP, SIG_IGN); if((pid = fork()) < 0) THROW(-1); else if(pid > 0) exit(0); #endif if(dev && *dev) { ::open(dev, O_RDWR); ::open(dev, O_RDWR); ::open(dev, O_RDWR); } } void Process::setScheduler(const char *pol) { #ifdef _POSIX_PRIORITY_SCHEDULING struct sched_param p; int policy; sched_getparam(0, &p); if(pol) { #if defined(SCHED_TS) policy = SCHED_TS; #elif defined(SCHED_OTHER) policy = SCHED_OTHER; #else policy = 0; #endif #ifdef SCHED_RR if(!stricmp(pol, "rr")) policy = SCHED_RR; #endif #if !defined(SCHED_RR) && defined(SCHED_FIFO) if(!stricmp(pol, "rr")) policy = SCHED_FIFO; #endif #ifdef SCHED_FIFO if(!stricmp(pol, "fifo")) { rtflag = true; policy = SCHED_FIFO; } #endif #ifdef SCHED_TS if(!stricmp(pol, "ts")) policy = SCHED_TS; #endif #ifdef SCHED_OTHER if(!stricmp(pol, "other")) policy = SCHED_OTHER; #endif } else policy = sched_getscheduler(0); int min = sched_get_priority_min(policy); int max = sched_get_priority_max(policy); if(p.sched_priority < min) p.sched_priority = min; else if(p.sched_priority > max) p.sched_priority = max; sched_setscheduler(0, policy, &p); #endif } void Process::setPriority(int pri) { #ifdef _POSIX_PRIORITY_SCHEDULING struct sched_param p; int policy = sched_getscheduler(0); int min = sched_get_priority_min(policy); int max = sched_get_priority_max(policy); sched_getparam(0, &p); if(pri < min) pri = min; if(pri > max) pri = max; p.sched_priority = pri; sched_setparam(0, &p); #else if(pri < -20) pri = -20; if(pri > 20) pri = 20; nice(-pri); #endif } bool Process::isScheduler(void) { #ifdef _POSIX_PRIORITY_SCHEDULING return true; #else return false; #endif } void Process::setRealtime(int pri) { if(pri < 1) pri = 1; setScheduler("rr"); setPriority(pri); } #endif // not win32 #ifdef _OSF_SOURCE #undef HAVE_SETENV #endif void Process::setEnv(const char *name, const char *value, bool overwrite) { #ifdef HAVE_SETENV ::setenv(name, value, (int)overwrite); #else char strbuf[256]; snprintf(strbuf, sizeof(strbuf), "%s=%s", name, value); if(!overwrite) if(getenv(strbuf)) return; ::putenv(strdup(strbuf)); #endif } const char *Process::getEnv(const char *name) { return ::getenv(name); } #if defined(HAVE_MLOCKALL) && defined(MCL_FUTURE) #include bool Process::lock(bool future) { int rc; if(future) rc = mlockall(MCL_CURRENT | MCL_FUTURE); else rc = mlockall(MCL_CURRENT); if(rc) return false; return true; } void Process::unlock(void) { munlockall(); } #else bool Process::lock(bool future) { return false; } void Process::unlock(void) { } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/libccext2.pc0000644000175000017500000000033411463364531013517 00000000000000prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib64 includedir=${prefix}/include Name: libccext2 Description: GNU Common C++ Extension library Version: 1.8.1 Requires: libccgnu2 = 1.8.1 Libs: -lccext2 -lz commoncpp2-1.8.1/src/getopt.c0000644000175000017500000007301611463314535012770 00000000000000/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include #endif #if defined(WIN32) || defined(_WIN32) #define HAVE_STRING_H 1 #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. */ # if defined HAVE_LIBINTL_H || defined _LIBC # include # ifndef _ # define _(msgid) gettext (msgid) # endif # else # define _(msgid) (msgid) # endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else # if HAVE_STRING_H # include # else # include # endif /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Stored original parameters. XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ extern int __libc_argc; extern char **__libc_argv; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } # else # define SWAP_FLAGS(ch1, ch2) # endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS if (posixly_correct == NULL && argc == __libc_argc && argv == __libc_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { int print_errors = opterr; if (optstring[0] == ':') print_errors = 0; if (argc < 1) return -1; optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (print_errors) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (print_errors) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ commoncpp2-1.8.1/src/getopt.h0000644000175000017500000001436611463314535013000 00000000000000/* Declarations for getopt. Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifndef _GETOPT_H #ifndef __need_getopt # define _GETOPT_H 1 #endif /* If __GNU_LIBRARY__ is not already defined, either we are being used standalone, or this is the first header included in the source file. If we are being used with glibc, we need to include , but that does not exist if we are standalone. So: if __GNU_LIBRARY__ is not defined, include , which will pull in for us if it's from glibc. (Why ctype.h? It's guaranteed to exist and it doesn't flood the namespace with stuff the way some other headers do.) */ #if !defined __GNU_LIBRARY__ # include #endif #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #ifndef __need_getopt /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { # if (defined __STDC__ && __STDC__) || defined __cplusplus const char *name; # else char *name; # endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ # define no_argument 0 # define required_argument 1 # define optional_argument 2 #endif /* need getopt */ /* Get definitions and prototypes for functions to process the arguments in ARGV (ARGC of them, minus the program name) for options given in OPTS. Return the option character from OPTS just read. Return -1 when there are no more options. For unrecognized options, or options missing arguments, `optopt' is set to the option letter, and '?' is returned. The OPTS string is a list of characters which are recognized option letters, optionally followed by colons, specifying that that letter takes an argument, to be placed in `optarg'. If a letter in OPTS is followed by two colons, its argument is optional. This behavior is specific to the GNU `getopt'. The argument `--' causes premature termination of argument scanning, explicitly telling `getopt' that there are no more options. If OPTS begins with `--', then non-option arguments are treated as arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ #if (defined __STDC__ && __STDC__) || defined __cplusplus # ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int __argc, char *const *__argv, const char *__shortopts); # endif /* __GNU_LIBRARY__ */ # ifndef __need_getopt extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); extern int getopt_long_only (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int __argc, char *const *__argv, const char *__shortopts, const struct option *__longopts, int *__longind, int __long_only); # endif #else /* not __STDC__ */ extern int getopt (); # ifndef __need_getopt extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); # endif #endif /* __STDC__ */ #ifdef __cplusplus } #endif /* Make sure we later can get all the definitions and declarations. */ #undef __need_getopt #endif /* getopt.h */ commoncpp2-1.8.1/src/url.cpp0000644000175000017500000005155311463412101012616 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #include #include #include #ifdef WIN32 #include #endif #ifdef HAVE_SSTREAM #include #else #include #endif #include #ifndef WIN32 // cause problem on Solaris #if !defined(__sun) && !defined(__SUN__) #ifdef HAVE_NET_IF_H #include #endif #endif #include #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif URLStream::URLStream(Family fam, timeout_t to) : TCPStream(fam) { persistent = false; proxyPort = 0; timeout = to; protocol = protocolHttp1_0; follow = true; proxyAuth = authAnonymous; encoding = encodingBinary; proxyUser = proxyPasswd = NULL; auth = authAnonymous; cookie = agent = pragma = referer = user = password = NULL; localif = NULL; setError(false); } int URLStream::aRead(char *buffer, size_t len, timeout_t timer) { return readData(buffer, len, 0, timer); } int URLStream::aWrite(char *buffer, size_t len, timeout_t timer) { return writeData(buffer, len, timer); } void URLStream::httpHeader(const char *header, const char *value) { } char **URLStream::extraHeader(void) { return NULL; } int URLStream::underflow(void) { ssize_t len = 0, rlen; char *buf; if(bufsize == 1) return TCPStream::underflow(); if(!gptr()) return EOF; if(gptr() < egptr()) return (unsigned char)*gptr(); rlen = (ssize_t)((gbuf + bufsize) - eback()); if(encoding == encodingChunked) { buf = (char *)eback(); *buf = '\n'; while(!chunk && (*buf == '\n' || *buf == '\r')) { *buf = 0; len = readLine(buf, rlen, timeout); } if(len) { if(!chunk) chunk = strtol(buf, NULL, 16); if(rlen > (int)chunk) rlen = chunk; } else rlen = -1; } if(rlen > 0) { if(Socket::state == STREAM) rlen = aRead((char *)eback(), rlen, timeout); else if(timeout) { if(Socket::isPending(pendingInput, timeout)) rlen = readData(eback(), rlen); else rlen = -1; } else rlen = readData(eback(), rlen); } if(encoding == encodingChunked && rlen > 0) chunk -= rlen; if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } setg(eback(), eback(), eback() + rlen); return (unsigned char)*gptr(); } void URLStream::setProxy(const char *host, tpport_t port) { switch(family) { #ifdef CCXX_IPV6 case IPV6: v6proxyHost = host; break; #endif case IPV4: proxyHost = host; break; default: proxyPort = 0; return; } proxyPort = port; } URLStream::Error URLStream::submit(const char *path, const char **vars, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpGet; path = strchr(path + 5, '/'); status = sendHTTPHeader(path, vars, buf); } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } else { saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; else if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } } URLStream::Error URLStream::post(const char *path, MIMEMultipartForm &form, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpPostMultipart; path = strchr(path + 5, '/'); status = sendHTTPHeader(path, (const char **)form.getHeaders(), buf); } if(status == errInvalid || status == errTimeout) { if(Socket::state != AVAILABLE) close(); return status; } saved = status; status = getHTTPHeaders(); if(status == errSuccess) { form.body(dynamic_cast(this)); return saved; } if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } URLStream::Error URLStream::post(const char *path, const char **vars, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpPost; path = strchr(path + 5, '/'); status = sendHTTPHeader(path, vars, buf); } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } URLStream::Error URLStream::head(const char *path, size_t buf) { Error status = errInvalid, saved; if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpGet; path = strchr(path + 5, '/'); status = sendHTTPHeader(path, NULL, buf); } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } else { saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; else if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } } URLStream &URLStream::getline(char *buffer, size_t size) { size_t len; *buffer = 0; // TODO: check, we mix use of streambuf with Socket::readLine... iostream::getline(buffer, (unsigned long)size); len = strlen(buffer); while(len) { if(buffer[len - 1] == '\r' || buffer[len - 1] == '\n') buffer[len - 1] = 0; else break; --len; } return *this; } URLStream::Error URLStream::get(size_t buffer) { String path = String("http://") + m_host; if ( m_address.operator[](0) != '/' ) path += "/"; path += m_address; return get(path.c_str(), buffer); } URLStream::Error URLStream::get(const char *urlpath, size_t buf) { const char *path = urlpath; Error status = errInvalid, saved; urlmethod = methodFileGet; if(Socket::state != AVAILABLE) close(); if(!strnicmp(path, "file:", 5)) { urlmethod = methodFileGet; path += 5; } else if(!strnicmp(path, "http:", 5)) { urlmethod = methodHttpGet; path = strchr(path + 5, '/'); } switch(urlmethod) { case methodHttpGet: status = sendHTTPHeader(path, NULL, buf); break; case methodFileGet: if(so != INVALID_SOCKET) ::close((int)so); so = ::open(path, O_RDWR); if(so == INVALID_SOCKET) so = ::open(path, O_RDONLY); // FIXME: open return the same handle type as socket call ?? if(so == INVALID_SOCKET) return errInvalid; Socket::state = STREAM; allocate(buf); return errSuccess; default: break; } if((status == errInvalid || status == errTimeout)) { if(Socket::state != AVAILABLE) close(); return status; } else { saved = status; status = getHTTPHeaders(); if(status == errSuccess) return saved; else if(status == errTimeout) { if(Socket::state != AVAILABLE) close(); } return status; } } URLStream::Error URLStream::getHTTPHeaders() { char buffer[512]; size_t buf = sizeof(buffer); Error status = errSuccess; char *cp, *ep; ssize_t len = 1; char nc = 0; chunk = ((unsigned)-1) / 2; encoding = encodingBinary; while(len > 0) { len = readLine(buffer, buf, timeout); if(len < 1) return errTimeout; // FIXME: for multiline syntax ?? if(buffer[0] == ' ' || buffer[0] == '\r' || buffer[0] == '\n') break; cp = strchr(buffer, ':'); if(!cp) continue; *(cp++) = 0; while(*cp == ' ' || *cp == '\t') ++cp; ep = strchr(cp, '\n'); if(!ep) ep = &nc; while(*ep == '\n' || *ep == '\r' || *ep == ' ') { *ep = 0; if((--ep) < cp) break; } if(!stricmp(buffer, "Transfer-Encoding")) { if(!stricmp(cp, "chunked")) { chunk = 0; encoding = encodingChunked; } } httpHeader(buffer, cp); } return status; } void URLStream::close(void) { if(Socket::state == AVAILABLE) return; endStream(); so = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(so != INVALID_SOCKET) Socket::state = AVAILABLE; } URLStream::Error URLStream::sendHTTPHeader(const char *url, const char **vars, size_t buf) { // TODO: implement authentication char reloc[4096]; // "//" host ":" port == max 2 + 128 + 1 + 5 + 1(\0) = 137, rounded 140 char host[140]; // TODO: add support for //user:pass@host:port/ syntax #ifdef HAVE_SSTREAM ostringstream str; #else char buffer[4096]; strstream str(buffer, sizeof(buffer), ios::out); #endif char *ref, *cp, *ep; char *hp; const char *uri = "/"; int count = 0; size_t len = 0; tpport_t port = 80; const char **args = vars; const char *var; bool lasteq = true; struct servent *svc; retry: #ifdef HAVE_SSTREAM str.str(""); #else buffer[0] = 0; str.seekp(0); #endif setString(host, sizeof(host), url); reformat: hp = strchr(host, '/'); if(!hp) { host[0] = '/'; setString(host + 1, sizeof(host) - 1, url); goto reformat; } while(*hp == '/') ++hp; cp = strchr(hp, '/'); if (cp) *cp = 0; ep = strrchr(hp, ':'); if(ep) { *ep = 0; ++ep; if(isdigit(*ep)) port = atoi(ep); else { Socket::mutex.enter(); svc = getservbyname(ep, "tcp"); if(svc) port = ntohs(svc->s_port); Socket::mutex.leave(); } } if(!proxyPort) { const char* ep1 = url; while(*ep1 == '/') ++ep1; ep1 = strchr(ep1, '/'); if(ep1) uri = ep1; } switch(urlmethod) { case methodHttpGet: str << "GET "; if(proxyPort) { str << "http:" << url; if(!cp) str << '/'; } else str << uri; break; case methodHttpPost: case methodHttpPostMultipart: str << "POST "; if(proxyPort) { str << "http:" << url; if(!cp) str << '/'; } else str << uri; break; default: return errInvalid; } if(vars && urlmethod == methodHttpGet) { str << "?"; while(*vars) { if(count++ && lasteq) str << "&"; str << *vars; if(!lasteq) lasteq = true; else if(strchr(*vars, '=')) lasteq = true; else { lasteq = false; str << "="; } ++vars; } } switch(protocol) { case protocolHttp1_1: str << " HTTP/1.1" << "\r\n"; break; case protocolHttp1_0: str << " HTTP/1.0" << "\r\n"; break; } if ( m_host.empty() ) m_host = hp; str << "Host: " << hp << "\r\n"; if(agent) str << "User-Agent: " << agent << "\r\n"; if(cookie) str << "Cookie: " << cookie << "\r\n"; if(pragma) str << "Pragma: " << pragma << "\r\n"; if(referer) str << "Referer: " << referer << "\r\n"; switch(auth) { case authBasic: str << "Authorization: Basic "; snprintf(reloc, 64, "%s:%s", user, password); b64Encode(reloc, reloc + 64, 128); str << reloc + 64 << "\r\n"; case authAnonymous: break; } switch(proxyAuth) { case authBasic: str << "Proxy-Authorization: Basic "; snprintf(reloc, 64, "%s:%s", proxyUser, proxyPasswd); b64Encode(reloc, reloc + 64, 128); str << reloc + 64 << "\r\n"; str << "Proxy-Connection: close" << "\r\n"; case authAnonymous: break; } str << "Connection: close\r\n"; char **add = extraHeader(); if(add) { while(*add) { str << *(add++) << ": "; str << *(add++) << "\r\n"; } } if(vars) switch(urlmethod) { case methodHttpPost: while(*args) { var = *args; if(count++ || !strchr(var, '=')) len += strlen(var) + 1; else len = strlen(var); ++args; } count = 0; len += 2; str << "Content-Type: application/x-www-form-urlencoded" << "\r\n"; str << "Content-Length: " << (unsigned)len << "\r\n"; break; case methodHttpPostMultipart: while(*args) str << *(args++) << "\r\n"; default: break; } str << "\r\n"; #ifdef HAVE_SSTREAM // sstream does not want ends #else str << ends; #endif if(Socket::state != AVAILABLE) close(); #ifndef WIN32 #ifdef SOICGIFINDEX if (localif != NULL) { struct ifreq ifr; switch(family) { #ifdef CCXX_IPV6 case IPV6: sockaddr_in6 source; int alen = sizeof(source); memset(&ifr, 0, sizeof(ifr)); setString(ifr.ifr_name, sizeof(ifr.ifr_name), localif); if (ioctl(so, SIOCGIFINDEX, &ifr) < 0) return errInterface; else { if (setsockopt(so, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1) return errInterface; else if(getsockname(so, (struct sockaddr*)&source,(socklen_t *) &alen) == -1) return errInterface; else if (bind(so, (struct sockaddr*)&source, sizeof(source)) == -1) return errInterface; else source.sin6_port = 0; } break; #endif case IPV4: sockaddr_in source; int alen = sizeof(source); memset(&ifr, 0, sizeof(ifr)); setString(ifr.ifr_name, sizeof(ifr.ifr_name), localif); if (ioctl(so, SIOCGIFINDEX, &ifr) < 0) return errInterface; else { if (setsockopt(so, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr)) == -1) return errInterface; else if(getsockname(so, (struct sockaddr*)&source,(socklen_t *) &alen) == -1) return errInterface; else if (bind(so, (struct sockaddr*)&source, sizeof(source)) == -1) return errInterface; else source.sin_port = 0; } } } #endif #endif if(proxyPort) { switch(family) { #ifdef CCXX_IPV6 case IPV6: connect(v6proxyHost, proxyPort, (unsigned)buf); break; #endif case IPV4: connect(proxyHost, proxyPort, (unsigned)buf); break; } } else { switch(family) { #ifdef CCXX_IPV6 case IPV6: connect(IPV6Host(hp), port, (unsigned)buf); break; #endif case IPV4: connect(IPV4Host(hp), port, (unsigned)buf); } } if(!isConnected()) return errUnreachable; // FIXME: send (or write) can send less than len bytes // use stream funcion ?? #ifdef HAVE_SSTREAM writeData(str.str().c_str(), _IOLEN64 str.str().length()); #else writeData(str.str().c_str(), _IOLEN64 str.str().length()); #endif if(urlmethod == methodHttpPost && vars) { #ifdef HAVE_SSTREAM str.str() = ""; #else str.seekp(0); #endif bool sep = false; while(*vars) { if(sep) writeData("&", 1); else sep = true; var = *vars; if(!strchr(var, '=')) { snprintf(reloc, sizeof(reloc), "%s=%s", var, *(++vars)); writeData(reloc, strlen(reloc)); } else writeData(var, strlen(var)); ++vars; } writeData("\r\n", 2); } cont: #ifdef HAVE_SSTREAM char buffer[4096]; #else // nothing here #endif len = readLine(buffer, sizeof(buffer) - 1, timeout); if(len < 1) return errTimeout; if(strnicmp(buffer, "HTTP/", 5)) return errInvalid; ref = strchr(buffer, ' '); while(*ref == ' ') ++ref; switch(atoi(ref)) { default: return errInvalid; case 100: goto cont; case 200: return errSuccess; case 401: return errUnauthorized; case 403: return errForbidden; case 404: return errMissing; case 405: return errDenied; case 500: case 501: case 502: case 503: case 504: case 505: return errFailure; case 300: case 301: case 302: break; } if(!follow) return errRelocated; for(;;) { len = readLine(reloc, sizeof(reloc), timeout); if(len < 1) return errTimeout; if(!strnicmp(reloc, "Location: ", 10)) break; } if(!strnicmp(reloc + 10, "http:", 5)) { url = strchr(reloc + 15, '/'); ep = (char *)(url + strlen(url) - 1); while(*ep == '\r' || *ep == '\n') *(ep--) = 0; } else url = reloc + 10; close(); goto retry; } void URLStream::setAuthentication(Authentication a, const char *value) { auth = a; if (auth != authAnonymous) { if(!user) user = "anonymous"; if(!password) password = ""; } } void URLStream::setProxyAuthentication(Authentication a, const char *value) { proxyAuth = a; if (proxyAuth != authAnonymous) { if(!proxyUser) proxyUser = "anonymous"; if(!proxyPasswd) proxyPasswd = ""; } } void URLStream::setReferer(const char *str) { if(!str) return; referer = str; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/friends.cpp0000644000175000017500000001044711463377247013470 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include "private.h" #include #ifndef WIN32 #include #ifdef SIGTSTP #include #include #endif #ifndef _PATH_TTY #define _PATH_TTY "/dev/tty" #endif #endif // !WIN32 #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef WIN32 timespec *getTimeout(struct timespec *spec, timeout_t timer) { static struct timespec myspec; if(spec == NULL) spec = &myspec; #ifdef PTHREAD_GET_EXPIRATION_NP struct timespec offset; offset.tv_sec = timer / 1000; offset.tv_nsec = (timer % 1000) * 1000000; pthread_get_expiration_np(&offset, spec); #else struct timeval current; SysTime::getTimeOfDay(¤t); spec->tv_sec = current.tv_sec + ((timer + current.tv_usec / 1000) / 1000); spec->tv_nsec = ((current.tv_usec / 1000 + timer) % 1000) * 1000000; #endif return spec; } #if !defined(__CYGWIN32__) && !defined(__MINGW32__) void wait(signo_t signo) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, signo); #ifdef HAVE_SIGWAIT2 sigwait(&mask, &signo); #else sigwait(&mask); #endif } #endif /* void Thread::yield(void) { #ifdef HAVE_PTHREAD_YIELD pthread_yield(); #endif } */ #ifdef CCXX_SIG_THREAD_CANCEL #if defined(HAVE_PTHREAD_NANOSLEEP) || defined(HAVE_PTHREAD_DELAY) void Thread::sleep(timeout_t timeout) { struct timespec ts; Cancel old = Thread::enterCancel(); ts.tv_sec = timeout / 1000; ts.tv_usec = (timeout % 1000) * 1000000; #ifdef HAVE_PTHREAD_DELAY pthread_delay(&ts); #else nanosleep(&ts); #endif Thread::exitCancel(old); } #else void Thread::sleep(timeout_t timeout) { Cancel old = Thread::enterCancel(); usleep(timeout * 1000); Thread::exitCancel(old); } #endif #else #if defined(HAVE_PTHREAD_DELAY) || defined(HAVE_PTHREAD_NANOSLEEP) void Thread::sleep(timeout_t timeout) { struct timespec timer; timer.tv_sec = timeout / 1000; timer.tv_nsec = (timeout % 1000) * 1000000; #ifdef HAVE_PTHREAD_DELAY pthread_delay(&timer); #else nanosleep(&timer); #endif } #else void Thread::sleep(timeout_t timeout) { usleep(timeout * 1000); } #endif #endif #endif // !WIN32 #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/missing.cpp0000644000175000017500000001150011463400703013456 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #ifdef WIN32 #ifndef _WIN32_WCE #include #endif #else #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_FILE_H #include #endif #ifdef HAVE_SYS_LOCKF_H #include #endif #ifdef COMMON_AIX_FIXES #undef LOCK_EX #undef LOCK_SH #endif #ifndef F_LOCK #define MISSING_LOCKF enum { F_ULOCK = 1, F_LOCK, F_TLOCK, F_TEST }; #endif #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif #ifdef WIN32 #ifdef _WIN32_WCE int gettimeofday(struct timeval *tv_, void *tz_) { // We could use _ftime(), but it is not available on WinCE. // (WinCE also lacks time.h) // Note also that the average error of _ftime is around 20 ms :) DWORD ms = GetTickCount(); tv_->tv_sec = ms / 1000; tv_->tv_usec = ms * 1000; return 0; } #else int gettimeofday(struct timeval *tv_, void *tz_) { #if defined(_MSC_VER) && _MSC_VER >= 1300 struct __timeb64 tb; _ftime64(&tb); #else # ifndef __BORLANDC__ struct _timeb tb; _ftime(&tb); # else struct timeb tb; ftime(&tb); # endif #endif tv_->tv_sec = (long)tb.time; tv_->tv_usec = tb.millitm * 1000; return 0; } #endif #endif #ifndef WIN32 #ifdef HAVE_GETTIMEOFDAY unsigned long getTicks(void) { unsigned long ticks; struct timeval now; gettimeofday(&now, NULL); ticks = now.tv_sec * 1000l; ticks += now.tv_usec / 1000l; return ticks; } #endif #else DWORD getTicks(void) { return GetTickCount(); } #endif #ifndef HAVE_STRDUP char *strdup(const char *str) { if(!str) return NULL; size_t len = strlen(str) + 1; char *dest = (char *)malloc(len); if(!dest) return NULL; return setString(dest, len, str); } #endif #ifndef HAVE_MEMMOVE void *memmove (char *dest, const char *source, size_t length) { char *save = dest; if (source < dest) { for (source += length, dest += length; length; --length) *--dest = *--source; } else if (source != dest) { for (; length; --length) *dest++ = *source++; } return (void *) save; } #endif #ifndef HAVE_LOCKF int lockf(int fd, int cmd, long len) { struct flock lck; lck.l_start = 0l; lck.l_whence = SEEK_CUR; lck.l_len = len; switch(cmd) { case F_ULOCK: lck.l_type = F_UNLCK; return fcntl(fd, F_SETLK, &lck); case F_LOCK: lck.l_type = F_WRLCK; return fcntl(fd, F_SETLKW, &lck); case F_TLOCK: lck.l_type = F_WRLCK; return fcntl(fd, F_SETLK, &lck); case F_TEST: lck.l_type = F_WRLCK; fcntl(fd, F_GETLK, &lck); if(lck.l_type == F_UNLCK) return 0; return -1; } } #endif #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/engine.cpp0000644000175000017500000004247211463376451013302 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #if !defined(_MSC_VER) || _MSC_VER >= 1300 #include #include #ifndef HAVE_EXCEPTION #include "assert.h" #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif #ifndef NO_COMPRESSION const uint32 MAX_BUFFER = 16384; #endif /** * NullObject is a const uint32 which is the ID streamed to disk * if an attempt to stream a NULL Persistence::BaseObject or * Derivative is made... */ const uint32 NullObject = 0xffffffff; Engine::Engine(std::iostream& stream, EngineMode mode, bool compress) THROWS (PersistException) : myUnderlyingStream(stream), myOperationalMode(mode), use_compression(compress) { // Nothing else to initialise for now #ifndef NO_COMPRESSION if ( use_compression ) { myZStream.zalloc = ( alloc_func ) NULL; myZStream.zfree = ( free_func ) NULL; myZStream.opaque = ( voidpf ) NULL; myCompressedDataBuffer = new uint8[MAX_BUFFER]; myUncompressedDataBuffer = new uint8[MAX_BUFFER]; myLastUncompressedDataRead = myUncompressedDataBuffer; if ( myOperationalMode == modeRead ) { myZStream.next_in = myCompressedDataBuffer; myZStream.next_out = myUncompressedDataBuffer; myZStream.avail_in = 0; myZStream.avail_out = MAX_BUFFER; int err = inflateInit ( &myZStream ); if ( err != Z_OK ) { THROW ( PersistException ( String ( "zLib didn't initialise for inflating." ) ) ); } } else { myZStream.next_in = myUncompressedDataBuffer; myZStream.next_out = myCompressedDataBuffer; myZStream.avail_in = 0; myZStream.avail_out = MAX_BUFFER; int err = deflateInit ( &myZStream, 9 ); // TODO: tweak compression level if ( err != Z_OK ) { THROW ( PersistException ( String ( "zLib didn't initialise for deflating." ) ) ); } } } #endif } bool Engine::more() { #ifndef NO_COMPRESSION if ( use_compression && myOperationalMode == modeRead ) return ( myLastUncompressedDataRead < myZStream.next_out ); #endif return false; } void Engine::sync() { // Flush compression buffers etc here. #ifndef NO_COMPRESSION if ( use_compression ) { if ( myOperationalMode == modeRead ) { inflateEnd ( &myZStream ); } else { int zret = Z_OK; while ( myZStream.avail_in > 0 || zret == Z_OK ) { zret = deflate ( &myZStream, Z_FINISH ); if ( myZStream.avail_out >= 0 ) { myUnderlyingStream.write ( ( char* ) myCompressedDataBuffer, MAX_BUFFER - myZStream.avail_out ); myZStream.next_out = myCompressedDataBuffer; myZStream.avail_out = MAX_BUFFER; } } deflateEnd ( &myZStream ); } } #endif } Engine::~Engine() { if ( myUnderlyingStream.good() ) sync(); #ifndef NO_COMPRESSION if ( use_compression ) { delete [] myCompressedDataBuffer; delete [] myUncompressedDataBuffer; } #endif } void Engine::writeBinary(const uint8* data, const uint32 size) THROWS (PersistException) { if ( myOperationalMode != modeWrite ) THROW (PersistException( "Cannot write to an input Engine" )); #ifdef NO_COMPRESSION myUnderlyingStream.write((const char *)data,size); #else if (use_compression) { // Compress the data here and doit :) uint32 written = 0; while ( written < size ) { // transfer as much information as we can into the input buffer. if ( myZStream.avail_in < MAX_BUFFER ) { uint32 toAdd = size - written; if ( toAdd > ( MAX_BUFFER - myZStream.avail_in ) ) toAdd = ( MAX_BUFFER - myZStream.avail_in ); memcpy ( myZStream.next_in + myZStream.avail_in, data + written, toAdd ); written += toAdd; myZStream.avail_in += toAdd; } if ( myZStream.avail_in < MAX_BUFFER ) return; // We have not filled the buffer, so let's carry on streaming // We have a full input buffer, so we compressit. while ( myZStream.avail_in > 0 ) { deflate ( &myZStream, 0 ); if ( myZStream.avail_out == 0 ) { // We filled the output buffer, let's stream it myUnderlyingStream.write ( ( char* ) myCompressedDataBuffer, MAX_BUFFER ); myZStream.next_out = myCompressedDataBuffer; myZStream.avail_out = MAX_BUFFER; } // Repeat whilst the input buffer isn't flushed } // Now we have flushed the input buffer we can reset it myZStream.avail_in = 0; myZStream.next_in = myUncompressedDataBuffer; } } else { myUnderlyingStream.write ( ( const char * ) data, size ); } #endif } void Engine::readBinary(uint8* data, uint32 size) THROWS (PersistException) { if ( myOperationalMode != modeRead ) THROW (PersistException( "Cannot read from an output Engine" )); #ifdef NO_COMPRESSION myUnderlyingStream.read((char *)data,size); #else if ( use_compression ) { uint32 read = 0; while ( read < size ) { // If we have any data left in the uncompressed buffer - use it if ( myLastUncompressedDataRead < myZStream.next_out ) { uint32 toRead = size - read; if ( toRead > ( uint32 ) ( myZStream.next_out - myLastUncompressedDataRead ) ) toRead = ( myZStream.next_out - myLastUncompressedDataRead ); memcpy ( data + read, myLastUncompressedDataRead, toRead ); myLastUncompressedDataRead += toRead; read += toRead; } if ( read == size ) return; // We have read all we need to // Reset the stream for the next block of data myLastUncompressedDataRead = myUncompressedDataBuffer; myZStream.next_out = myUncompressedDataBuffer; myZStream.avail_out = MAX_BUFFER; // Next we have to deal such that, until we have a full output buffer, // (Or we run out of input) if ( myUnderlyingStream.good() ) { while ( myUnderlyingStream.good() && myZStream.avail_out > 0 ) { // Right then, if we have run out of input, fetch another chunk if ( myZStream.avail_in == 0 ) { myZStream.next_in = myCompressedDataBuffer; myUnderlyingStream.read ( ( char* ) myCompressedDataBuffer, MAX_BUFFER ); myZStream.avail_in = myUnderlyingStream.gcount(); } inflate ( &myZStream, 0 ); } } else { // Oh dear - we ran out of input on the buffer. // Maybe we can still inflate some inflate ( &myZStream, 0 ); if ( myZStream.avail_out == MAX_BUFFER ) THROW ( PersistException ( String ( "Oh dear - ran out of input" ) ) ); } } } else { myUnderlyingStream.read ( ( char * ) data, size ); } #endif } /* * note, does not (yet?) throw an exception, but interface * prepared .. */ void Engine::write(const BaseObject *object) THROWS (PersistException) { // Pre-step, if object is NULL, then don't serialise it - serialise a // marker to say that it is null. // as ID's are uint32's, NullObject will do nicely for the task if (object == NULL) { uint32 id = NullObject; write(id); return; } // First off - has this Object been serialised already? ArchiveMap::const_iterator itor = myArchiveMap.find(object); if (itor == myArchiveMap.end()) { // Unfortunately we need to serialise it - here we go .... uint32 id = (uint32)myArchiveMap.size(); myArchiveMap[object] = id; // bumps id automatically for next one write(id); ClassMap::const_iterator classItor = myClassMap.find(object->getPersistenceID()); if (classItor == myClassMap.end()) { uint32 classId = (uint32)myClassMap.size(); myClassMap[object->getPersistenceID()] = classId; write(classId); write(static_cast(object->getPersistenceID())); } else { write(classItor->second); } String majik; majik = "OBST"; write(majik); object->write(*this); majik = "OBEN"; write(majik); } else { // This object has been serialised, so just pop its ID out write(itor->second); } } /* * reads in a BaseObject into a reference (pre-instantiated object) */ void Engine::read(BaseObject &object) THROWS (PersistException) { uint32 id = 0; read(id); if (id == NullObject) THROW (PersistException("Object Id should not be NULL when unpersisting to a reference")); // Do we already have this object in memory? if (id < myArchiveVector.size()) { object = *(myArchiveVector[id]); return; } // Okay - read the identifier for the class in... // we won't need it later since this object is already allocated readClass(); // Okay then - we can read data straight into this object readObject(&object); } /* * reads in a BaseObject into a pointer allocating if the pointer is NULL */ void Engine::read(BaseObject *&object) THROWS (PersistException) { uint32 id = 0; read(id); // Is the ID a NULL object? if (id == NullObject) { object = NULL; return; } // Do we already have this object in memory? if (id < myArchiveVector.size()) { object = myArchiveVector[id]; return; } // Okay - read the identifier for the class in... String className = readClass(); // is the pointer already initialized? if so then no need to reallocate if (object != NULL) { readObject(object); return; } // Create the object (of the relevant type) object = TypeManager::createInstanceOf(className.c_str()); if (object) { // Okay then - we can make this object readObject(object); } else THROW (PersistException(String("Unable to instantiate object of class ")+className)); } /* * reads the actual object data in */ void Engine::readObject(BaseObject* object) THROWS (PersistException) { // Okay then - we can make this object myArchiveVector.push_back(object); String majik; read(majik); if(majik != String("OBST")) THROW(PersistException("Missing Start-of-Object marker")); object->read(*this); read(majik); if(majik != String("OBEN")) THROW(PersistException("Missing End-of-Object marker")); } /* * reads the class information in */ const String Engine::readClass() THROWS (PersistException) { // Okay - read the identifier for the class in... uint32 classId = 0; read(classId); String className; if (classId < myClassVector.size()) { className = myClassVector[classId]; } else { // Okay the class wasn't known yet - save its name read(className); myClassVector.push_back(className); } return className; } /* * note, does not (yet?) throw an exception, but interface * prepared .. */ void Engine::write(const String& str) THROWS (PersistException) { uint32 len = (uint32)str.length(); write(len); writeBinary((uint8*)str.c_str(),len); } void Engine::read(String& str) THROWS (PersistException) { uint32 len = 0; read(len); uint8 *buffer = new uint8[len+1]; readBinary(buffer,len); buffer[len] = 0; str = (char*)buffer; delete[] buffer; } /* * note, does not (yet?) throw an exception, but interface * prepared .. */ void Engine::write(const std::string& str) THROWS (PersistException) { uint32 len = (uint32)str.length(); write(len); writeBinary((uint8*)str.c_str(),len); } void Engine::read(std::string& str) THROWS (PersistException) { uint32 len = 0; read(len); uint8 *buffer = new uint8[len+1]; readBinary(buffer,len); buffer[len] = 0; str = (char*)buffer; delete[] buffer; } #define CCXX_RE(ar,ob) ar.read(ob); return ar #define CCXX_WE(ar,ob) ar.write(ob); return ar Engine& operator >>( Engine& ar, BaseObject &ob) THROWS (PersistException) {CCXX_RE(ar,ob);} Engine& operator >>( Engine& ar, BaseObject *&ob) THROWS (PersistException) {CCXX_RE(ar,ob);} Engine& operator <<( Engine& ar, BaseObject const &ob) THROWS (PersistException) {CCXX_WE(ar,&ob);} Engine& operator <<( Engine& ar, BaseObject const *ob) THROWS (PersistException) {CCXX_WE(ar,ob);} Engine& operator >>( Engine& ar, int8& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, int8 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, uint8& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, uint8 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, int16& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, int16 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, uint16& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, uint16 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, int32& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, int32 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, uint32& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, uint32 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} #ifdef HAVE_64_BITS Engine& operator >>( Engine& ar, int64& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, int64 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, uint64& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, uint64 ob) THROWS (PersistException) {CCXX_WE (ar,ob);} #endif Engine& operator >>( Engine& ar, float& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, float ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, double& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, double ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, String& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, String ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, std::string& ob) THROWS (PersistException) {CCXX_RE (ar,ob);} Engine& operator <<( Engine& ar, std::string ob) THROWS (PersistException) {CCXX_WE (ar,ob);} Engine& operator >>( Engine& ar, bool& ob) THROWS (PersistException) { uint32 a; ar.read(a); ob=a==1;return ar; } Engine& operator <<( Engine& ar, bool ob) THROWS (PersistException) { uint32 a=ob?1:0; ar.write(a); return ar; } #undef CCXX_RE #undef CCXX_WE #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/nat.cpp0000644000175000017500000002554711463403653012616 00000000000000// Copyright (C) 2004-2010 TintaDigital - STI, LDA. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file nat.c * @short Network Address Translation interface implementation. * @author Ricardo Gameiro **/ #include #include "nat.h" #ifdef CCXX_NAT # ifdef HAVE_SYS_TYPES_H # include # endif # ifdef HAVE_SYS_SOCKET_H # include # endif # ifdef HAVE_NAT_NETFILTER // Linux # ifdef HAVE_LIMITS_H # include # endif # ifdef HAVE_LINUX_NETFILTER_IPV4_H # include # endif # ifdef HAVE_LINUX_NETFILTER_IPV6_H # include # endif # else # ifdef HAVE_NET_IP6_H # include # endif # ifdef HAVE_NETINET_IN_H # include # endif # ifdef HAVE_NET_IF_H # include # endif # ifdef HAVE_SYS_IOCTL_H # include # endif # ifdef HAVE_IOCTL_H # include # endif # ifdef HAVE_UNISTD_H # include # endif # ifdef HAVE_ERRNO_H # include # endif # ifdef HAVE_NAT_IPF // Solaris, *BSD (except OpenBSD), HP-UX # ifdef HAVE_NETINET_IP_COMPAT_H # include # endif # ifdef HAVE_IP_COMPAT_H # include # endif # ifdef HAVE_NETINET_IP_FIL_COMPAT_H # include # endif # ifdef HAVE_IP_FIL_COMPAT_H # include # endif # ifdef HAVE_NETINET_IP_FIL_H # include # endif # ifdef HAVE_IP_FIL_H # include # endif # ifdef HAVE_NETINET_IP_NAT_H # include # endif # ifdef HAVE_IP_NAT_H # include # endif # endif # ifdef HAVE_NAT_PF // OpenBSD # ifdef HAVE_NET_PFVAR_H # include # endif # endif # endif #endif #ifdef CCXX_NAMESPACES namespace ost { #endif #ifdef HAVE_NAT_NETFILTER # define NAT_SYSCALL "getsockopt" # define NAT_DEVICE "" #else # define NAT_SYSCALL "ioctl" # if defined(HAVE_NAT_IPF) && defined(IPL_NAT) # define NAT_DEVICE IPL_NAT # else # ifdef HAVE_NAT_PF # define NAT_DEVICE "/dev/pf" # endif # endif #endif #ifndef NAT_DEVICE #define NAT_DEVICE "" #endif #ifdef CCXX_NAT const char * natmsg[] = { "nat lookup successful", "nat address not in table", "nat not supported/implemented", "unable to open device "NAT_DEVICE, "unable to get socket name", "unable to get peer name", "unable to get socket type", "unable to lookup, nat "NAT_SYSCALL" failed", "unkown nat error code" }; #ifdef HAVE_NAT_NETFILTER // Linux natResult natv4Lookup( SOCKET sfd, struct sockaddr_in * nat ) { struct sockaddr_in local; socklen_t nlen = sizeof( *nat ), llen = sizeof( local ); if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) ) return natSocknameErr; memset( &nat->sin_addr.s_addr, 0, sizeof( nat->sin_addr.s_addr ) ); if( getsockopt( sfd, SOL_IP, SO_ORIGINAL_DST, ( struct sockaddr * ) nat, &nlen) ) return natIFaceErr; if( local.sin_addr.s_addr == nat->sin_addr.s_addr ) return natSearchErr; nat->sin_family = local.sin_family; return natOK; } #ifdef CCXX_IPV6 natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat ) { struct sockaddr_in6 local; socklen_t llen = sizeof( local ), nlen = sizeof( *nat ); if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) ) return natSocknameErr; memset( &nat->sin6_addr.s6_addr, 0, sizeof( nat->sin6_addr.s6_addr ) ); if( getsockopt( sfd, SOL_IP, SO_ORIGINAL_DST, ( struct sockaddr * ) nat, &nlen) ) return natIFaceErr; if( local.sin6_addr.s6_addr == nat->sin6_addr.s6_addr ) return natSearchErr; nat->sin6_family = local.sin6_family; return natOK; } #endif #endif #ifdef HAVE_NAT_IPF // Solaris, *BSD (except OpenBSD), HP-UX, etc. natResult natv4Lookup( int sfd, struct sockaddr_in * nat ) { static int natfd = -1; struct sockaddr_in local, peer; socklen_t nlen = sizeof( *nat ), llen = sizeof( local ), plen = sizeof( peer ); int socktype; socklen_t stlen = sizeof( socktype ); struct natlookup nlu; int nres; if( natfd < 0 ) if( ( natfd = open( NAT_DEVICE, O_RDONLY, 0 ) ) < 0 ) return natDevUnavail; if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) ) return natSocknameErr; if( getpeername( sfd, ( struct sockaddr * ) &peer, &plen ) ) return natPeernameErr; if( getsockopt( sfd, SOL_SOCKET, SO_TYPE, ( int * ) &socktype, &stlen ) ) return natSockTypeErr; memset( &nlu.nl_realip.s_addr, 0, sizeof( nlu.nl_realip.s_addr ) ); nlu.nl_inip = local.sin_addr; nlu.nl_inport = local.sin_port; nlu.nl_outip = peer.sin_addr; nlu.nl_outport = peer.sin_port; nlu.nl_flags = ( socktype == SOCK_STREAM ) ? IPN_TCP : IPN_UDP; if( 63 == ( SIOCGNATL & 0xff ) ) { struct natlookup * nlup = &nlu; nres = ioctl( natfd, SIOCGNATL, &nlup ); } else nres = ioctl( natfd, SIOCGNATL, &nlu ); if( nres ) { if( errno != ESRCH ) { close( natfd ); natfd = -1; return natIFaceErr; } else return natSearchErr; } if( local.sin_addr.s_addr == nlu.nl_realip.s_addr ) return natSearchErr; nat->sin_family = local.sin_family; nat->sin_port = nlu.nl_realport; nat->sin_addr = nlu.nl_realip; return natOK; } #ifdef CCXX_IPV6 // IPV6 is not yet supported by IPFilter natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat ) { return natNotSupported; } #endif #endif #ifdef HAVE_NAT_PF // OpenBSD natResult natv4Lookup( SOCKET sfd, struct sockaddr_in * nat ) { static int natfd = -1; struct sockaddr_in local, peer; socklen_t nlen = sizeof( *nat ), llen = sizeof( local ), plen = sizeof( peer ); int socktype; socklen_t stlen = sizeof( socktype ); struct pfioc_natlook nlu; int nres; if( natfd < 0 ) if( ( natfd = open( NAT_DEVICE, O_RDWR ) ) < 0 ) return natDevUnavail; if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) ) return natSocknameErr; if( getpeername( sfd, ( struct sockaddr * ) &peer, &plen ) ) return natPeernameErr; if( getsockopt( sfd, SOL_SOCKET, SO_TYPE, ( int * ) &socktype, &stlen ) ) return natSockTypeErr; memset( &nlu, 0, sizeof( nlu ) ); nlu.daddr.v4.s_addr = local.sin_addr.s_addr; nlu.dport = local.sin_port; nlu.saddr.v4.s_addr = peer.sin_addr.s_addr; nlu.sport = peer.sin_port; nlu.af = AF_INET; nlu.proto = ( socktype == SOCK_STREAM ) ? IPPROTO_TCP : IPROTO_UDP; nlu.direction = PF_OUT; if( ioctl( natfd, DIOCNATLOOK, &nlu ) ) { if( errno != ESRCH ) { close( natfd ); natfd = -1; return natIFaceErr; } else return natSearchErr; } if( local.sin_addr.s_addr == nlu.raddr.v4.s_addr ) return natSearchErr; nat->sin_family = local.sin_family; nat->sin_port = nlu.rdport; nat->sin_addr = nlu.rdaddr.v4; return natOK; } #ifdef CCXX_IPV6 natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat ) { static int natfd = -1; struct sockaddr_in6 local, peer; socklen_t nlen = sizeof( *nat ), llen = sizeof( local ), plen = sizeof( peer ); int socktype; socklen_t stlen = sizeof( socktype ); struct pfioc_natlook nlu; int nres; if( natfd < 0 ) if( ( natfd = open( NAT_DEVICE, O_RDWR ) ) < 0 ) return natDevUnavail; if( getsockname( sfd, ( struct sockaddr * ) &local, &llen ) ) return natSocknameErr; if( getpeername( sfd, ( struct sockaddr * ) &peer, &plen ) ) return natPeernameErr; if( getsockopt( sfd, SOL_SOCKET, SO_TYPE, ( int * ) &socktype, &stlen ) ) return natSockTypeErr; memset( &nlu, 0, sizeof( nlu ) ); nlu.daddr.v6.s6_addr = local.sin6_addr.s6_addr; nlu.dport = local.sin6_port; nlu.saddr.v6.s6_addr = peer.sin6_addr.s6_addr; nlu.sport = peer.sin6_port; nlu.af = AF_INET6; nlu.proto = ( socktype == SOCK_STREAM ) ? IPPROTO_TCP : IPROTO_UDP; nlu.direction = PF_OUT; if( ioctl( natfd, DIOCNATLOOK, &nlu ) ) { if( errno != ESRCH ) { close( natfd ); natfd = -1; return natIFaceErr; } else return natSearchErr; } if( local.sin6_addr.s6_addr == nlu.raddr.v6.s6_addr ) return natSearchErr; nat->sin6_family = local.sin6_family; nat->sin6_flowinfo = local.sin6_flowinfo; nat->sin6_port = nlu.rdport; nat->sin6_addr = nlu.rdaddr.v6; return natOK; } #endif #endif const char * natErrorString( natResult res ) { return (char *)natmsg[ ( res >= natOK && res <= natIFaceErr ) ? res : natUnkownErr ]; } #else natResult natv4Lookup( SOCKET sfd, struct sockaddr_in * nat ) { return natNotSupported; } #ifdef CCXX_IPV6 natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat ) { return natNotSupported; } #endif const char * natErrorString( natResult res ) { return "nat support not included"; } #endif #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/exception.cpp0000644000175000017500000000650411463376567014037 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #if defined(HAVE_EXCEPTION) #ifdef CCXX_NAMESPACES namespace ost { #endif Exception::Exception(const String& what_arg) throw(): _what(what_arg) { } Exception::~Exception() throw() {} const char *Exception::what() const throw() { return _what.c_str(); } const char *Exception::getString() const { return _what.c_str(); } IOException::IOException(const String &what_arg, long systemError) throw() : Exception(what_arg), _systemError(systemError), _systemErrorString(NULL) { } IOException::~IOException() throw() { delete [] _systemErrorString; } long IOException::getSystemError() const throw() { return _systemError; } const char* IOException::getSystemErrorString() const throw() { const uint32 errStrSize = 2048; if ( !_systemErrorString ) _systemErrorString = new char[errStrSize]; #ifndef WIN32 strerror_r(_systemError, _systemErrorString, errStrSize); return _systemErrorString; #else FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, _systemError, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), _systemErrorString, errStrSize, NULL); return _systemErrorString; #endif } #ifdef CCXX_NAMESPACES } #endif #endif //HAVE_EXCEPTION /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/zstream.cpp0000644000175000017500000002002311463412403013472 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #ifdef HAVE_ZLIB_H #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #include #ifdef WIN32 #include #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif IZStream::IZStream(const char *name, size_t size, bool tf) : streambuf(), #ifdef HAVE_OLD_IOSTREAM istream(), #else istream((streambuf *)this), #endif bufsize(0), gbuf(NULL), fp(0) { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif throwflag = tf; fp = ::gzopen(name, "rb"); if(!fp) { #ifdef COMMON_STD_EXCEPTION if(Thread::getException() == Thread::throwException && throwflag) throw IOZException(String(::gzerror(fp, NULL))); #endif clear(ios::failbit | rdstate()); return; } allocate(size); } IZStream::IZStream(bool tf) : streambuf(), #ifdef HAVE_OLD_IOSTREAM istream(), #else istream((streambuf *)this), #endif bufsize(0), gbuf(NULL), fp(0) { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif throwflag = tf; } IZStream::~IZStream() { close(); } void IZStream::open(const char *name, size_t size) { if(fp) close(); fp = ::gzopen(name, "rb"); if(!fp) { #ifdef COMMON_STD_EXCEPTION if(Thread::getException() == Thread::throwException && throwflag) throw IOZException(String(::gzerror(fp, NULL))); #endif clear(ios::failbit | rdstate()); return; } allocate(size); } void IZStream::close(void) { if(gbuf) delete[] gbuf; ::gzclose(fp); fp = 0; gbuf = NULL; bufsize = 0; clear(); } void IZStream::allocate(size_t size) { if(size < 2) { bufsize = 1; gbuf = 0; return; } gbuf = new char[size]; if(!gbuf) return; bufsize = size; clear(); #if (defined(__GNUC__) && (__GNUC__ < 3)) && !defined(WIN32) && !defined(STLPORT) setb(gbuf, gbuf + size, 0); #endif setg(gbuf, gbuf + size, gbuf + size); } int IZStream::doallocate() { if(bufsize) return 0; allocate(1); return 1; } bool IZStream::isOpen(void) { if(fp) return true; return false; } int IZStream::uflow() { int ret = underflow(); if (ret == EOF) return EOF; if (bufsize != 1) gbump(1); return ret; } int IZStream::underflow() { ssize_t rlen = 1; unsigned char ch; if(bufsize == 1) { rlen = ::gzread(fp, &ch, 1); if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } return ch; } if(!gptr()) return EOF; if(gptr() < egptr()) return (unsigned char)*gptr(); rlen = (ssize_t)((gbuf + bufsize) - eback()); rlen = ::gzread(fp, eback(), rlen); if(rlen < 1) { clear(ios::failbit | rdstate()); return EOF; } setg(eback(), eback(), eback() + rlen); return (unsigned char) *gptr(); } OZStream::OZStream(const char *name, int level, size_t size, bool tf) : streambuf(), #ifdef HAVE_OLD_IOSTREAM ostream(), #else ostream((streambuf *)this), #endif bufsize(0),pbuf(NULL),fp(0) { char mode[4]; #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif strcpy(mode, "wb\0"); if(level != Z_DEFAULT_COMPRESSION) mode[2] = '0' + level; throwflag = tf; fp = ::gzopen(name, mode); if(!fp) { #ifdef COMMON_STD_EXCEPTION if(Thread::getException() == Thread::throwException && throwflag) throw IOZException(String(::gzerror(fp, NULL))); #endif clear(ios::failbit | rdstate()); return; } allocate(size); } OZStream::OZStream(bool tf) : streambuf(), #ifdef HAVE_OLD_IOSTREAM ostream(), #else ostream((streambuf *)this), #endif bufsize(0), pbuf(NULL), fp(0) { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif throwflag = tf; } OZStream::~OZStream() { close(); } void OZStream::open(const char *name, int level, size_t size) { char mode[4]; if(fp) close(); strcpy(mode, "wb\0"); if(level != Z_DEFAULT_COMPRESSION) mode[2] = '0' + level; fp = ::gzopen(name, mode); if(!fp) { #ifdef COMMON_STD_EXCEPTION if(Thread::getException() == Thread::throwException && throwflag) throw IOZException(String(::gzerror(fp, NULL))); #endif clear(ios::failbit | rdstate()); return; } allocate(size); } void OZStream::close(void) { if(pbuf) delete[] pbuf; ::gzclose(fp); fp = 0; pbuf = NULL; bufsize = 0; clear(); } void OZStream::allocate(size_t size) { if(size < 2) { bufsize = 1; pbuf = 0; return; } pbuf = new char[size]; if(!pbuf) return; bufsize = size; clear(); setp(pbuf, pbuf + size); } int OZStream::doallocate() { if(bufsize) return 0; allocate(1); return 1; } bool OZStream::isOpen(void) { if(fp) return true; return false; } int OZStream::overflow(int c) { unsigned char ch; ssize_t rlen, req; if(bufsize == 1) { if(c == EOF) return 0; ch = (unsigned char)(c); rlen = ::gzwrite(fp, &ch, 1); if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } else return c; } if(!pbase()) return EOF; req = (ssize_t)(pptr() - pbase()); if(req) { rlen = ::gzwrite(fp, pbase(), req); if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } req -= rlen; } // if write "partial", rebuffer remainder if(req) memmove(pbuf, pbuf + rlen, req); setp(pbuf, pbuf + bufsize); pbump(req); if(c != EOF) { *pptr() = (unsigned char)c; pbump(1); } return c; } #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/src/timer.cpp0000644000175000017500000001524211463410461013136 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef WIN32 #ifdef HAVE_HIRES_TIMER TimerPort::TimerPort() { struct timespec ts; active = false; #if defined(CLOCK_MONOTONIC) && defined(USE_MONOTONIC_TIMER) ::clock_gettime(CLOCK_MONOTONIC, &ts); #else ::clock_gettime(CLOCK_REALTIME, &ts); #endif timer.tv_sec = ts.tv_sec; timer.tv_usec = ts.tv_nsec / 1000; } #else TimerPort::TimerPort() { active = false; SysTime::getTimeOfDay(&timer); } #endif void TimerPort::setTimer(timeout_t timeout) { #ifdef HAVE_HIRES_TIMER struct timespec ts; #if defined(CLOCK_MONOTONIC) && defined(USE_MONOTONIC_TIMER) ::clock_gettime(CLOCK_MONOTONIC, &ts); #else ::clock_gettime(CLOCK_REALTIME, &ts); #endif timer.tv_sec = ts.tv_sec; timer.tv_usec = ts.tv_nsec / 1000l; #else SysTime::getTimeOfDay(&timer); #endif active = false; if(timeout) incTimer(timeout); } void TimerPort::incTimer(timeout_t timeout) { int secs = timeout / 1000; int usecs = (timeout % 1000) * 1000; timer.tv_usec += usecs; if(timer.tv_usec > 1000000l) { ++timer.tv_sec; timer.tv_usec %= 1000000l; } timer.tv_sec += secs; active = true; } void TimerPort::decTimer(timeout_t timeout) { int secs = timeout / 1000; int usecs = (timeout % 1000) * 1000; if(timer.tv_usec < usecs) { --timer.tv_sec; timer.tv_usec = 1000000l + timer.tv_usec - usecs; } else timer.tv_usec -= usecs; timer.tv_sec -= secs; active = true; } #ifdef HAVE_HIRES_TIMER void TimerPort::sleepTimer(void) { struct timespec ts; ts.tv_sec = timer.tv_sec; ts.tv_nsec = timer.tv_usec * 1000l; #if defined(CLOCK_MONOTONIC) && defined(USE_MONOTONIC_TIMER) ::clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL); #else ::clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &ts, NULL); #endif } #else void TimerPort::sleepTimer(void) { timeout_t remaining = getTimer(); if(remaining && remaining != TIMEOUT_INF) Thread::sleep(remaining); } #endif void TimerPort::endTimer(void) { active = false; } timeout_t TimerPort::getTimer(void) const { #ifdef HAVE_HIRES_TIMER struct timespec now; #else struct timeval now; #endif long diff; if(!active) return TIMEOUT_INF; #ifdef HAVE_HIRES_TIMER #if defined(CLOCK_MONOTONIC) && defined(USE_MONOTONIC_TIMER) ::clock_gettime(CLOCK_MONOTONIC, &now); #else ::clock_gettime(CLOCK_REALTIME, &now); #endif diff = (timer.tv_sec - now.tv_sec) * 1000l; diff += (timer.tv_usec - (now.tv_nsec / 1000)) / 1000l; #else SysTime::getTimeOfDay(&now); diff = (timer.tv_sec - now.tv_sec) * 1000l; diff += (timer.tv_usec - now.tv_usec) / 1000l; #endif if(diff < 0) return 0l; return diff; } timeout_t TimerPort::getElapsed(void) const { #ifdef HAVE_HIRES_TIMER struct timespec now; #else struct timeval now; #endif long diff; if(!active) return TIMEOUT_INF; #ifdef HAVE_HIRES_TIMER #if defined(CLOCK_MONOTONIC) && defined(USE_MONOTONIC_TIMER) ::clock_gettime(CLOCK_MONOTONIC, &now); #else ::clock_gettime(CLOCK_REALTIME, &now); #endif diff = (now.tv_sec - timer.tv_sec) * 1000l; diff += ((now.tv_nsec / 1000l) - timer.tv_usec) / 1000l; #else SysTime::getTimeOfDay(&now); diff = (now.tv_sec -timer.tv_sec) * 1000l; diff += (now.tv_usec - timer.tv_usec) / 1000l; #endif if(diff < 0) return 0; return diff; } #else // WIN32 TimerPort::TimerPort() { active = false; timer = GetTickCount(); } void TimerPort::setTimer(timeout_t timeout) { timer = GetTickCount(); active = false; if(timeout) incTimer(timeout); } void TimerPort::incTimer(timeout_t timeout) { timer += timeout; active = true; } void TimerPort::decTimer(timeout_t timeout) { timer -= timeout; active = true; } void TimerPort::sleepTimer(void) { timeout_t remaining = getTimer(); if(remaining && remaining != TIMEOUT_INF) Thread::sleep(remaining); } void TimerPort::endTimer(void) { active = false; } timeout_t TimerPort::getTimer(void) const { DWORD now; long diff; if(!active) return TIMEOUT_INF; now = GetTickCount(); diff = timer - now; if(diff < 0) return 0l; return diff; } timeout_t TimerPort::getElapsed(void) const { DWORD now; long diff; if(!active) return TIMEOUT_INF; now = GetTickCount(); diff = now - timer; if(diff < 0) return 0l; return diff; } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/tokenizer.cpp0000644000175000017500000001141611463411033014023 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include "private.h" #include #include #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif // sorted by the usual probability of occurence // see also: manpage of isspace() const char * const StringTokenizer::SPACE=" \t\n\r\f\v"; StringTokenizer::StringTokenizer (const char *_str, const char *_delim, bool _skipAll, bool _trim) : str(_str),delim(_delim),skipAll(_skipAll),trim(_trim) { if (str == 0) itEnd = iterator(*this, 0); else itEnd = iterator(*this,strchr(str, '\0')+1); } StringTokenizer::StringTokenizer (const char *s) : str(s), delim(SPACE), skipAll(false),trim(true) { if (str == 0) itEnd = iterator(*this, 0); else itEnd = iterator(*this,strchr(str, '\0')+1); } StringTokenizer::iterator& StringTokenizer::iterator::operator ++ () THROWS (StringTokenizer::NoSuchElementException) { // someone requested to read beyond the end .. tsts if (endp == myTok->itEnd.endp) THROW (NoSuchElementException()); if (token) { // this is to help people find their bugs, if they // still maintain a pointer to this invalidated // area :-) *token = '\0'; delete[] token; token = 0; } start = ++endp; if (endp == myTok->itEnd.endp) return *this; // done // search for next delimiter while (*endp && strchr(myTok->delim, *endp)==NULL) ++endp; tokEnd = endp; if (*endp && myTok->skipAll) { // skip all delimiters while (*(endp+1) && strchr(myTok->delim, *(endp+1))) ++endp; } return *this; } /* * if no one requests the token, no time is spent skipping the whitespaces * or allocating memory. */ const char * StringTokenizer::iterator::operator * () THROWS (StringTokenizer::NoSuchElementException) { // someone requested to read beyond the end .. tsts if (endp == myTok->itEnd.endp) THROW (NoSuchElementException()); if (!token) { /* * someone requests this token; return a copy to provide * a NULL terminated string. */ /* don't clobber tokEnd, it is used in nextDelimiter() */ const char *wsTokEnd = tokEnd; if (myTok->trim) { while (wsTokEnd > start && strchr(SPACE, *start)) ++start; while (wsTokEnd > start && strchr(SPACE,*(wsTokEnd-1))) --wsTokEnd; } size_t tokLen = wsTokEnd - start; if (start > wsTokEnd) { tokLen = 0; } token = newString(start, tokLen + 1); } return token; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/linked.cpp0000644000175000017500000001156111463400022013254 00000000000000// Copyright (C) 2004-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif LinkedSingle::~LinkedSingle() {} LinkedSingle *LinkedSingle::getFirst(void) { return this; } LinkedSingle *LinkedSingle::getLast(void) { LinkedSingle *obj = this; while(obj->nextObject) obj = obj->nextObject; return obj; } void LinkedSingle::insert(LinkedSingle& obj) { obj.nextObject = nextObject; nextObject = &obj; } LinkedSingle &LinkedSingle::operator+=(LinkedSingle &obj) { insert(obj); return *this; } LinkedDouble::~LinkedDouble() { detach(); } void LinkedDouble::enterLock() {} void LinkedDouble::leaveLock() {} LinkedDouble *LinkedDouble::firstObject() { LinkedDouble *node = this; while(node->prevObject) node = node->prevObject; return node; } LinkedDouble *LinkedDouble::lastObject() { LinkedDouble *node = this; while(node->nextObject) node = node->nextObject; return node; } LinkedDouble *LinkedDouble::getFirst(void) { LinkedDouble *node; enterLock(); node = firstObject(); leaveLock(); return node; } LinkedDouble *LinkedDouble::getLast(void) { LinkedDouble *node; enterLock(); node = lastObject(); leaveLock(); return node; } LinkedDouble *LinkedDouble::getInsert(void) { return getLast(); } void LinkedDouble::insert(LinkedDouble& obj, InsertMode position) { LinkedDouble *node; enterLock(); obj.detach(); switch ( position ) { case modeAtFirst: node = firstObject(); obj.nextObject = node; node->prevObject = &obj; break; case modeBefore: obj.nextObject = this; obj.prevObject = this->prevObject; this->prevObject = &obj; if (obj.prevObject) obj.prevObject->nextObject = &obj; break; case modeAfter: obj.nextObject = this->nextObject; obj.prevObject = this; this->nextObject = &obj; if (obj.nextObject) obj.nextObject->prevObject = &obj; break; case modeAtLast: default: node = lastObject(); obj.nextObject = node->nextObject; obj.prevObject = node; node->nextObject = &obj; if(obj.nextObject) obj.nextObject->prevObject = &obj; break; } leaveLock(); } void LinkedDouble::detach(void) { enterLock(); if(prevObject) prevObject->nextObject = nextObject; if(nextObject) nextObject->prevObject = prevObject; prevObject = NULL; nextObject = NULL; leaveLock(); } LinkedDouble &LinkedDouble::operator+=(LinkedDouble &obj) { insert(obj); return *this; } LinkedDouble &LinkedDouble::operator--() { detach(); return *this; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/Makefile.am0000644000175000017500000000574511463374711013364 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = ccgnu2-config.in ccgnu2-config ost_check2.m4 \ getopt.h getopt.c getopt1.c *.pc *.pc.in LT_VERSION = @LT_CCXX_VERSION@ AM_CXXFLAGS = -I../src -DCCXX_EXPORT_LIBRARY $(THREAD_FLAGS) \ $(COMMON_FLAGS) -I$(CCXX_DIR) $(DEBUG_FLAGS) AM_CFLAGS = $(THREAD_FLAGS) INCLUDES = -I$(top_srcdir)/inc RELEASE = $(LT_VERSION) -release $(LT_RELEASE) if EXTRAS pkgconfig_DATA = libccgnu2.pc libccext2.pc lib_LTLIBRARIES = libccgnu2.la libccext2.la else pkgconfig_DATA = libccgnu2.pc lib_LTLIBRARIES = libccgnu2.la endif pkgconfigdir = $(libdir)/pkgconfig aclocaldir = $(datadir)/aclocal aclocal_DATA = ost_check2.m4 scriptdir = $(bindir) script_DATA = ccgnu2-config libccgnu2_la_LIBADD = @THREAD_LIBS@ @DYN_LOADER@ @SSL_LIBS@ libccgnu2_la_LDFLAGS = $(RELEASE) $(SHARED_FLAGS) noinst_DATA = @STAGE2@ libccgnu2_la_SOURCES = thread.cpp mutex.cpp semaphore.cpp threadkey.cpp \ friends.cpp event.cpp slog.cpp dir.cpp file.cpp inaddr.cpp \ peer.cpp timer.cpp socket.cpp strchar.cpp simplesocket.cpp \ mempager.cpp keydata.cpp dso.cpp exception.cpp missing.cpp \ process.cpp string.cpp in6addr.cpp buffer.cpp lockfile.cpp \ nat.cpp runlist.cpp assoc.cpp pointer.cpp linked.cpp map.cpp \ cidr.cpp private.h nat.h if EXTRAS libccext2_la_LIBADD = @THREAD_LIBS@ @BASE_LIB@ @SSL_LIBS@ @ZSTREAM_LIBS@ libccext2_la_LDFLAGS = $(RELEASE) $(SHARED_FLAGS) if GETOPT_LONG optincludedir=$(includedir)/cc++2 optinclude_HEADERS = getopt.h libccext2_la_SOURCES = numbers.cpp zstream.cpp socketport.cpp \ url.cpp xml.cpp persist.cpp engine.cpp digest.cpp cmdoptns.cpp \ date.cpp md5.cpp unix.cpp network.cpp serial.cpp urlstring.cpp \ mime.cpp tokenizer.cpp ssl.cpp getopt.c getopt1.c applog.cpp else libccext2_la_SOURCES = numbers.cpp zstream.cpp socketport.cpp \ url.cpp xml.cpp persist.cpp engine.cpp digest.cpp cmdoptns.cpp \ date.cpp md5.cpp unix.cpp network.cpp serial.cpp urlstring.cpp \ tokenizer.cpp mime.cpp ssl.cpp applog.cpp endif endif # private.h and nat.h are internal headers macosx: libccext2.la libccgnu2.la rm -rf .libs/*.dylib ld -r -o ccgnu2.lo $(libccgnu2_la_OBJECTS) ../libtool --mode=link c++ -dynamic -dynamiclib -o libccgnu2.la \ -rpath $(libdir) ccgnu2.lo $(LDFLAGS) -lpthread ld -r -o ccext2.lo $(libccext2_la_OBJECTS) ../libtool --mode=link c++ -dynamic -dynamiclib -o libccext2.la \ -rpath $(libdir) ccext2.lo $(LDFLAGS) -lpthread touch macosx install-data-hook: chmod +x $(DESTDIR)${scriptdir}/ccgnu2-config commoncpp2-1.8.1/src/threadkey.cpp0000644000175000017500000000614211463410431013772 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif #ifdef WIN32 # define KEY_INVALID 0xffffffff # define pthread_key_delete(key) TlsFree(key) # define pthread_getspecific(key) TlsGetValue(key) # define pthread_setspecific(key, ptr) TlsSetValue(key, ptr) #else # ifndef KEY_INVALID # define KEY_INVALID ((pthread_key_t)(~0)) # endif #endif #ifndef WIN32 ThreadKey::ThreadKey(ThreadKey::TDestruct destruct) { if (pthread_key_create(&key, destruct)) key = KEY_INVALID; } #endif ThreadKey::ThreadKey() { #ifdef WIN32 key = TlsAlloc(); #else if(pthread_key_create(&key, NULL)) key = KEY_INVALID; #endif } ThreadKey::~ThreadKey() { if(key != KEY_INVALID) pthread_key_delete(key); } void *ThreadKey::getKey(void) { if(key != KEY_INVALID) return pthread_getspecific(key); else return NULL; } void ThreadKey::setKey(void *ptr) { if(key != KEY_INVALID) pthread_setspecific(key, ptr); } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/assoc.cpp0000644000175000017500000000603211463373763013140 00000000000000// Copyright (C) 2004-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif static unsigned getIndex(const char *id) { unsigned idx = 0; while(*id) idx = (idx << 1) ^ (*(id++) & 0x1f); return idx % KEYDATA_INDEX_SIZE; } Assoc::Assoc() { clear(); } Assoc::~Assoc() { } void Assoc::clear(void) { memset(&entries, 0, sizeof(entries)); } void Assoc::setPointer(const char *id, void *data) { unsigned idx = getIndex(id); entry *e = (entry *)getMemory(sizeof(entry)); e->id = (const char *)getMemory(strlen(id) + 1); strcpy((char *)e->id, id); e->data = data; e->next = entries[idx]; entries[idx] = e; } void *Assoc::getPointer(const char *id) const { entry *e = entries[getIndex(id)]; while(e) { if(!stricmp(e->id, id)) break; e = e->next; } if(e) return e->data; return NULL; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/strchar.cpp0000644000175000017500000001335011463406674013475 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include #ifdef WIN32 #include //#define alloca(x) _alloca(x) #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif char *find(const char *cs, char *str, size_t len) { unsigned pos = 0; if(!len) len = strlen(str); while(pos < len) { if(strchr(cs, str[pos])) return str + pos; ++pos; } if(!str[pos]) return str + pos; return NULL; } char *rfind(const char *cs, char *str, size_t len) { if(!len) len = strlen(str); while(len--) { if(strchr(cs, str[len])) return str + len; } return str; } char *ifind(const char *cs, char *str, size_t len) { unsigned pos = 0; if(!len) len = strlen(str); while(pos < len) { if(!strchr(cs, str[pos])) return str + pos; ++pos; } if(!str[pos]) return str + pos; return NULL; } char *strip(const char *chars, char *str, size_t len) { len = strtrim(chars, str, len); if(!len) return str; return ifind(chars, str, len); } size_t strtrim(const char *cs, char *str, size_t len) { if(!str) return 0; if(!len) len = strlen(str); if(!len) return 0; while(len--) { if(!strchr(cs, str[len])) return ++len; str[len] = 0; } return 0; } size_t strchop(const char *cs, char *str, size_t len) { unsigned pos = 0; if(!str) return 0; if(!len) len = strlen(str); if(!len) return 0; while(pos < len) { if(!strchr(cs, str[pos])) break; ++pos; } if(pos == len) { *str = 0; return 0; } memmove(str, str + pos, len - pos + 1); return len - pos; } char *rsetField(char *dest, size_t size, const char *src, const char fill) { size_t len = 0; if(src) len = strlen(src); if(len > size) len = size; if(len) memmove(dest + size - len, (void *)src, len); if(len < size && fill) memset(dest, fill, size - len); return dest; } char *lsetField(char *dest, size_t size, const char *src, const char fill) { size_t len = 0; if(src) len = strlen(src); if(len > size) len = size; if(len) memmove(dest, src, len); if(len < size && fill) memset(dest + len, fill, size - len); return dest; } char *setUpper(char *string, size_t size) { char *ret = string; if(!size) size = strlen(string); while(size && *string) { *string = toupper(*string); ++string; --size; } return ret; } char *setLower(char *string, size_t size) { char *ret = string; if(!size) size = strlen(string); while(size && *string) { *string = tolower(*string); ++string; --size; } return ret; } char *setString(char *dest, size_t size, const char *src) { size_t len = strlen(src); if(size == 1) *dest = 0; if(size < 2) return dest; if(len >= size) len = size - 1; if(!len) { dest[0] = 0; return dest; } memcpy(dest, src, len); dest[len] = 0; return dest; } char *addString(char *dest, size_t size, const char *src) { size_t len = strlen(dest); if(len < size) setString(dest + len, size - len, src); return dest; } char *newString(const char *src, size_t size) { char *dest; if(!size) size = strlen(src) + 1; dest = new char[size]; return setString(dest, size, src); } void delString(char *str) { delete[] str; } #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/Makefile.in0000644000175000017500000010213711463364513013365 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = src DIST_COMMON = $(am__optinclude_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/ccgnu2-config.in \ $(srcdir)/libccext2.pc.in $(srcdir)/libccgnu2.pc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = ccgnu2-config libccext2.pc libccgnu2.pc 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)$(aclocaldir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(scriptdir)" \ "$(DESTDIR)$(optincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libccext2_la_DEPENDENCIES = am__libccext2_la_SOURCES_DIST = numbers.cpp zstream.cpp socketport.cpp \ url.cpp xml.cpp persist.cpp engine.cpp digest.cpp cmdoptns.cpp \ date.cpp md5.cpp unix.cpp network.cpp serial.cpp urlstring.cpp \ tokenizer.cpp mime.cpp ssl.cpp applog.cpp getopt.c getopt1.c @EXTRAS_TRUE@@GETOPT_LONG_FALSE@am_libccext2_la_OBJECTS = numbers.lo \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ zstream.lo socketport.lo \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ url.lo xml.lo persist.lo \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ engine.lo digest.lo \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ cmdoptns.lo date.lo md5.lo \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ unix.lo network.lo serial.lo \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ urlstring.lo tokenizer.lo \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ mime.lo ssl.lo applog.lo @EXTRAS_TRUE@@GETOPT_LONG_TRUE@am_libccext2_la_OBJECTS = numbers.lo \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ zstream.lo socketport.lo url.lo \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ xml.lo persist.lo engine.lo \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ digest.lo cmdoptns.lo date.lo \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ md5.lo unix.lo network.lo \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ serial.lo urlstring.lo mime.lo \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ tokenizer.lo ssl.lo getopt.lo \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ getopt1.lo applog.lo libccext2_la_OBJECTS = $(am_libccext2_la_OBJECTS) libccext2_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libccext2_la_LDFLAGS) $(LDFLAGS) -o $@ @EXTRAS_TRUE@am_libccext2_la_rpath = -rpath $(libdir) libccgnu2_la_DEPENDENCIES = am_libccgnu2_la_OBJECTS = thread.lo mutex.lo semaphore.lo threadkey.lo \ friends.lo event.lo slog.lo dir.lo file.lo inaddr.lo peer.lo \ timer.lo socket.lo strchar.lo simplesocket.lo mempager.lo \ keydata.lo dso.lo exception.lo missing.lo process.lo string.lo \ in6addr.lo buffer.lo lockfile.lo nat.lo runlist.lo assoc.lo \ pointer.lo linked.lo map.lo cidr.lo libccgnu2_la_OBJECTS = $(am_libccgnu2_la_OBJECTS) libccgnu2_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libccgnu2_la_LDFLAGS) $(LDFLAGS) -o $@ @EXTRAS_FALSE@am_libccgnu2_la_rpath = -rpath $(libdir) @EXTRAS_TRUE@am_libccgnu2_la_rpath = -rpath $(libdir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/autoconf/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libccext2_la_SOURCES) $(libccgnu2_la_SOURCES) DIST_SOURCES = $(am__libccext2_la_SOURCES_DIST) \ $(libccgnu2_la_SOURCES) DATA = $(aclocal_DATA) $(noinst_DATA) $(pkgconfig_DATA) $(script_DATA) am__optinclude_HEADERS_DIST = getopt.h HEADERS = $(optinclude_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = ccgnu2-config.in ccgnu2-config ost_check2.m4 \ getopt.h getopt.c getopt1.c *.pc *.pc.in LT_VERSION = @LT_CCXX_VERSION@ AM_CXXFLAGS = -I../src -DCCXX_EXPORT_LIBRARY $(THREAD_FLAGS) \ $(COMMON_FLAGS) -I$(CCXX_DIR) $(DEBUG_FLAGS) AM_CFLAGS = $(THREAD_FLAGS) INCLUDES = -I$(top_srcdir)/inc RELEASE = $(LT_VERSION) -release $(LT_RELEASE) @EXTRAS_FALSE@pkgconfig_DATA = libccgnu2.pc @EXTRAS_TRUE@pkgconfig_DATA = libccgnu2.pc libccext2.pc @EXTRAS_FALSE@lib_LTLIBRARIES = libccgnu2.la @EXTRAS_TRUE@lib_LTLIBRARIES = libccgnu2.la libccext2.la pkgconfigdir = $(libdir)/pkgconfig aclocaldir = $(datadir)/aclocal aclocal_DATA = ost_check2.m4 scriptdir = $(bindir) script_DATA = ccgnu2-config libccgnu2_la_LIBADD = @THREAD_LIBS@ @DYN_LOADER@ @SSL_LIBS@ libccgnu2_la_LDFLAGS = $(RELEASE) $(SHARED_FLAGS) noinst_DATA = @STAGE2@ libccgnu2_la_SOURCES = thread.cpp mutex.cpp semaphore.cpp threadkey.cpp \ friends.cpp event.cpp slog.cpp dir.cpp file.cpp inaddr.cpp \ peer.cpp timer.cpp socket.cpp strchar.cpp simplesocket.cpp \ mempager.cpp keydata.cpp dso.cpp exception.cpp missing.cpp \ process.cpp string.cpp in6addr.cpp buffer.cpp lockfile.cpp \ nat.cpp runlist.cpp assoc.cpp pointer.cpp linked.cpp map.cpp \ cidr.cpp private.h nat.h @EXTRAS_TRUE@libccext2_la_LIBADD = @THREAD_LIBS@ @BASE_LIB@ @SSL_LIBS@ @ZSTREAM_LIBS@ @EXTRAS_TRUE@libccext2_la_LDFLAGS = $(RELEASE) $(SHARED_FLAGS) @EXTRAS_TRUE@@GETOPT_LONG_TRUE@optincludedir = $(includedir)/cc++2 @EXTRAS_TRUE@@GETOPT_LONG_TRUE@optinclude_HEADERS = getopt.h @EXTRAS_TRUE@@GETOPT_LONG_FALSE@libccext2_la_SOURCES = numbers.cpp zstream.cpp socketport.cpp \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ url.cpp xml.cpp persist.cpp engine.cpp digest.cpp cmdoptns.cpp \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ date.cpp md5.cpp unix.cpp network.cpp serial.cpp urlstring.cpp \ @EXTRAS_TRUE@@GETOPT_LONG_FALSE@ tokenizer.cpp mime.cpp ssl.cpp applog.cpp @EXTRAS_TRUE@@GETOPT_LONG_TRUE@libccext2_la_SOURCES = numbers.cpp zstream.cpp socketport.cpp \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ url.cpp xml.cpp persist.cpp engine.cpp digest.cpp cmdoptns.cpp \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ date.cpp md5.cpp unix.cpp network.cpp serial.cpp urlstring.cpp \ @EXTRAS_TRUE@@GETOPT_LONG_TRUE@ mime.cpp tokenizer.cpp ssl.cpp getopt.c getopt1.c applog.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ccgnu2-config: $(top_builddir)/config.status $(srcdir)/ccgnu2-config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ libccext2.pc: $(top_builddir)/config.status $(srcdir)/libccext2.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ libccgnu2.pc: $(top_builddir)/config.status $(srcdir)/libccgnu2.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ 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 libccext2.la: $(libccext2_la_OBJECTS) $(libccext2_la_DEPENDENCIES) $(libccext2_la_LINK) $(am_libccext2_la_rpath) $(libccext2_la_OBJECTS) $(libccext2_la_LIBADD) $(LIBS) libccgnu2.la: $(libccgnu2_la_OBJECTS) $(libccgnu2_la_DEPENDENCIES) $(libccgnu2_la_LINK) $(am_libccgnu2_la_rpath) $(libccgnu2_la_OBJECTS) $(libccgnu2_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/applog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assoc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cidr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdoptns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/date.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dso.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/engine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exception.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/friends.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/in6addr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inaddr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keydata.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linked.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lockfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mempager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/missing.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mutex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/numbers.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/persist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pointer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/runlist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/semaphore.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serial.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplesocket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socketport.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ssl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strchar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/threadkey.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tokenizer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/urlstring.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zstream.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-aclocalDATA: $(aclocal_DATA) @$(NORMAL_INSTALL) test -z "$(aclocaldir)" || $(MKDIR_P) "$(DESTDIR)$(aclocaldir)" @list='$(aclocal_DATA)'; test -n "$(aclocaldir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(aclocaldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(aclocaldir)" || exit $$?; \ done uninstall-aclocalDATA: @$(NORMAL_UNINSTALL) @list='$(aclocal_DATA)'; test -n "$(aclocaldir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(aclocaldir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(aclocaldir)" && rm -f $$files install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files install-scriptDATA: $(script_DATA) @$(NORMAL_INSTALL) test -z "$(scriptdir)" || $(MKDIR_P) "$(DESTDIR)$(scriptdir)" @list='$(script_DATA)'; test -n "$(scriptdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(scriptdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(scriptdir)" || exit $$?; \ done uninstall-scriptDATA: @$(NORMAL_UNINSTALL) @list='$(script_DATA)'; test -n "$(scriptdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(scriptdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(scriptdir)" && rm -f $$files install-optincludeHEADERS: $(optinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(optincludedir)" || $(MKDIR_P) "$(DESTDIR)$(optincludedir)" @list='$(optinclude_HEADERS)'; test -n "$(optincludedir)" || 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)$(optincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(optincludedir)" || exit $$?; \ done uninstall-optincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(optinclude_HEADERS)'; test -n "$(optincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(optincludedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(optincludedir)" && 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) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(aclocaldir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(scriptdir)" "$(DESTDIR)$(optincludedir)"; 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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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-aclocalDATA install-optincludeHEADERS \ install-pkgconfigDATA install-scriptDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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-aclocalDATA uninstall-libLTLIBRARIES \ uninstall-optincludeHEADERS uninstall-pkgconfigDATA \ uninstall-scriptDATA .MAKE: install-am install-data-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-aclocalDATA install-am install-data \ install-data-am install-data-hook install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ install-man install-optincludeHEADERS install-pdf \ install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ install-scriptDATA 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-aclocalDATA uninstall-am uninstall-libLTLIBRARIES \ uninstall-optincludeHEADERS uninstall-pkgconfigDATA \ uninstall-scriptDATA # private.h and nat.h are internal headers macosx: libccext2.la libccgnu2.la rm -rf .libs/*.dylib ld -r -o ccgnu2.lo $(libccgnu2_la_OBJECTS) ../libtool --mode=link c++ -dynamic -dynamiclib -o libccgnu2.la \ -rpath $(libdir) ccgnu2.lo $(LDFLAGS) -lpthread ld -r -o ccext2.lo $(libccext2_la_OBJECTS) ../libtool --mode=link c++ -dynamic -dynamiclib -o libccext2.la \ -rpath $(libdir) ccext2.lo $(LDFLAGS) -lpthread touch macosx install-data-hook: chmod +x $(DESTDIR)${scriptdir}/ccgnu2-config # 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: commoncpp2-1.8.1/src/urlstring.cpp0000644000175000017500000002122711463412173014051 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #include #include #include #ifdef WIN32 #include #endif #include #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif static const unsigned char alphabet[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char* b64Encode(const char *source, char *dest, size_t limit) { b64Encode((const unsigned char*)source,strlen(source), dest,limit); return dest; } char* b64Decode(char *source, char *dest) { size_t srcsize = strlen(source); char* dst = dest?dest:source; size_t dstsize = b64Decode(source,(unsigned char*)dst,srcsize+1); dst[dstsize] = 0; return dst; } size_t b64Encode(const unsigned char *src, size_t srcsize, char *dst, size_t dstsize) { if (!dstsize) return 0; char* pdst = dst; unsigned bits; while(srcsize >= 3 && dstsize > 4) { bits = (((unsigned)src[0])<<16) | (((unsigned)src[1])<<8) | ((unsigned)src[2]); src += 3; srcsize -= 3; *(pdst++) = alphabet[bits >> 18]; *(pdst++) = alphabet[(bits >> 12) & 0x3f]; *(pdst++) = alphabet[(bits >> 6) & 0x3f]; *(pdst++) = alphabet[bits & 0x3f]; dstsize -= 4; } if (srcsize && dstsize > 4) { bits = ((unsigned)src[0])<<16; *(pdst++) = alphabet[bits >> 18]; if (srcsize == 1) { *(pdst++) = alphabet[(bits >> 12) & 0x3f]; *(pdst++) = '='; } else { bits |= ((unsigned)src[1])<<8; *(pdst++) = alphabet[(bits >> 12) & 0x3f]; *(pdst++) = alphabet[(bits >> 6) & 0x3f]; } *(pdst++) = '='; } *pdst = 0; return pdst-dst; } size_t b64Decode(const char *src, unsigned char *dst, size_t dstsize) { char decoder[256]; int i, bits, c; unsigned char *pdst = dst; for (i = 0; i < 256; ++i) decoder[i] = 64; for (i = 0; i < 64 ; ++i) decoder[alphabet[i]] = i; bits = 1; while(*src) { c = (unsigned char)(*(src++)); if (c == '=') { if (bits & 0x40000) { if (dstsize < 2) break; *(pdst++) = (bits >> 10); *(pdst++) = (bits >> 2) & 0xff; break; } if (bits & 0x1000 && dstsize) *(pdst++) = (bits >> 4); break; } // skip invalid chars if (decoder[c] == 64) continue; bits = (bits << 6) + decoder[c]; if (bits & 0x1000000) { if (dstsize < 3) break; *(pdst++) = (bits >> 16); *(pdst++) = (bits >> 8) & 0xff; *(pdst++) = (bits & 0xff); bits = 1; dstsize -= 3; } } return pdst-dst; } char* urlDecode(char *source, char *dest) { char *ret; char hex[3]; if(!dest) dest = source; else *dest = 0; ret = dest; if(!source) return dest; while(*source) { switch(*source) { case '+': *(dest++) = ' '; break; case '%': // NOTE: wrong input can finish with "...%" giving // buffer overflow, cut string here if(source[1]) { hex[0] = source[1]; ++source; if(source[1]) { hex[1] = source[1]; ++source; } else hex[1] = 0; } else hex[0] = hex[1] = 0; hex[2] = 0; *(dest++) = (char)strtol(hex, NULL, 16); break; default: *(dest++) = *source; } ++source; } *dest = 0; return ret; } char* urlEncode(const char *source, char *dest, size_t max) { static const char *hex = "0123456789abcdef"; size_t len = 0; unsigned char ch; char *ret = dest; *dest = 0; if(!source) return dest; while(len < max - 4 && *source) { ch = (unsigned char)*source; if(*source == ' ') *(dest++) = '+'; else if(isalnum(*source) || strchr("/.-:;,", *source)) *(dest++) = *source; else { *(dest++) = '%'; // char in C++ can be more than 8bit *(dest++) = hex[(ch >> 4)&0xF]; *(dest++) = hex[ch % 16]; } ++source; } *dest = 0; return ret; } #if defined(DYNAMIC_LOCAL_ARRAYS) /** @relates URLStream * Encode a STL string using base64 coding into a STL string * @return base 64 encoded string * @param src source string */ String b64Encode(const String& src) { size_t limit = (src.length()+2)/3*4+1; // size + null must be included char buffer[limit]; unsigned size = b64Encode((const unsigned char *)src.c_str(), src.length(), buffer, limit); buffer[size] = '\0'; return String(buffer); } /** @relates URLStream * Decode a STL string using base64 coding into an STL String. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return decoded string * @param src source string */ String b64Decode(const String& src) { size_t limit = src.length()/4*3; unsigned char buffer[limit+1]; unsigned size = b64Decode(src.c_str(), buffer, limit); buffer[size] = '\0'; return String((char *)buffer); } /** @relates URLStream * Encode a octet stream using base64 coding into a STL string * @return base 64 encoded string * @param src source buffer * @param srcsize source buffer size */ String b64Encode(const unsigned char *src, size_t srcsize) { size_t limit = (srcsize+2)/3*4+1; char buffer[limit]; unsigned size = b64Encode(src, srcsize, buffer, limit); buffer[size] = '\0'; return String(buffer); } /** @relates URLStream * Decode an STL string encoded using base64. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return number of octets written into destination buffer * @param src source string * @param dst destination octet buffer * @param dstsize destination buffer size */ size_t b64Decode(const String& src, unsigned char *dst, size_t dstsize) { return b64Decode(src.c_str(), dst, dstsize); } #endif #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/event.cpp0000644000175000017500000000743111463376515013153 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include "private.h" #include #ifdef CCXX_NAMESPACES namespace ost { #endif Event::Event() { #ifdef WIN32 cond = ::CreateEvent(NULL, true, false, NULL); if(cond == NULL) THROW(this); #else pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutex_init(&_mutex, &attr); pthread_mutexattr_destroy(&attr); pthread_cond_init(&_cond, NULL); _signaled = false; _count = 0; #endif } Event::~Event() { #ifdef WIN32 ::CloseHandle(cond); #else pthread_cond_destroy(&_cond); pthread_mutex_destroy(&_mutex); #endif } void Event::signal(void) { #ifdef WIN32 ::SetEvent(cond); #else pthread_mutex_lock(&_mutex); _signaled = true; ++_count; pthread_cond_broadcast(&_cond); pthread_mutex_unlock(&_mutex); #endif } void Event::reset(void) { #ifdef WIN32 ::ResetEvent(cond); #else _signaled = false; #endif } bool Event::wait(void) { #ifdef WIN32 return (Thread::waitThread(cond, INFINITE) == WAIT_OBJECT_0); #else return wait(TIMEOUT_INF); #endif } bool Event::wait(timeout_t timer) { #ifdef WIN32 return (Thread::waitThread(cond, timer) == WAIT_OBJECT_0); #else int rc = 0; struct timespec spec; pthread_mutex_lock(&_mutex); long count = _count; while(!_signaled && _count == count) { if(timer != TIMEOUT_INF) rc = pthread_cond_timedwait( &_cond, &_mutex, getTimeout(&spec, timer)); else pthread_cond_wait(&_cond, &_mutex); if(rc == ETIMEDOUT) break; } pthread_mutex_unlock(&_mutex); if(rc == ETIMEDOUT) return false; return true; #endif } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/dir.cpp0000644000175000017500000002106711463375076012612 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #ifdef WIN32 #include #include #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif Dir::Dir(const char *fname) : #ifdef WIN32 hDir(INVALID_HANDLE_VALUE), name(NULL) #else dir(NULL) #endif { #ifdef HAVE_READDIR_R save = reinterpret_cast(save_space); #endif if(fname) open(fname); } bool Dir::create(const char *path, Attr attr) { long xmask = 0; bool rtn = true; #ifdef WIN32 // fixme: make it form a security attributes structure if(!CreateDirectory(path, NULL)) rtn = false; #else switch(attr) { case attrPublic: xmask |= S_IXOTH; case attrGroup: xmask |= S_IXGRP; case attrPrivate: xmask |= S_IXUSR; break; default: return false; } if(mkdir(path, (long)attr | xmask)) rtn = false; #endif return rtn; } bool Dir::remove(const char *path) { bool rtn = true; #ifdef WIN32 if(!RemoveDirectory(path)) rtn = false; #else if(rmdir(path)) rtn = false; #endif return rtn; } bool Dir::setPrefix(const char *prefix) { bool rtn = true; #ifdef WIN32 if(!SetCurrentDirectory(prefix)) rtn = false; #else if(chdir(prefix)) rtn = false; #endif return rtn; } bool Dir::getPrefix(char *prefix, size_t size) { bool rtn = true; #ifdef WIN32 if(!GetCurrentDirectory((DWORD)size, prefix)) rtn = false; #else if(getcwd(prefix, size) == NULL) rtn = false; #endif return rtn; } void Dir::open(const char *fname) { #ifdef WIN32 size_t len = strlen(fname) + 4; char *path; #endif close(); #ifdef WIN32 DWORD attr = GetFileAttributes(fname); if( (attr == (DWORD)~0l) || !(attr & FILE_ATTRIBUTE_DIRECTORY) ) { #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) throw(this); #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) throw(DirException(String(fname) + ": failed")); #endif #endif } path = (char *)alloca(len + 1); if(path) snprintf(path, len + 1, "%s", fname); #ifdef CCXX_EXCEPTIONS if (!path && Thread::getException() == Thread::throwObject) throw(this); #ifdef COMMON_STD_EXCEPTION else if(!path && Thread::getException() == Thread::throwException) throw(DirException(String(fname) + ": failed")); #endif #endif addString(path, len, "\\*"); hDir = FindFirstFile(path, &fdata); if(hDir != INVALID_HANDLE_VALUE) name = fdata.cFileName; memcpy(&data, &fdata, sizeof(fdata)); #else // WIN32 entry = NULL; dir = opendir(fname); #ifdef CCXX_EXCEPTIONS if(!dir && Thread::getException() == Thread::throwObject) throw(this); #ifdef COMMON_STD_EXCEPTION else if(!dir && Thread::getException() == Thread::throwException) throw(DirException(String(fname) + ": failed")); #endif #endif #endif // WIN32 } Dir::~Dir() { close(); } void Dir::close(void) { #ifdef WIN32 if(hDir != INVALID_HANDLE_VALUE) FindClose(hDir); hDir = INVALID_HANDLE_VALUE; #else if(dir) closedir(dir); dir = NULL; entry = NULL; #endif } bool Dir::rewind(void) { bool rtn = true; #ifdef WIN32 memcpy(&data, &fdata, sizeof(data)); name = fdata.cFileName; #else if(!dir) rtn = false; else rewinddir(dir); #endif return rtn; } bool Dir::isValid(void) { #ifdef WIN32 if(hDir == INVALID_HANDLE_VALUE) #else if(!dir) #endif return false; return true; } const char *Dir::operator*() { #ifdef WIN32 return name; #else if(!dir) return NULL; if(!entry) return getName(); return entry->d_name; #endif } const char *Dir::getName(void) { #ifdef WIN32 char *retname = name; if(hDir == INVALID_HANDLE_VALUE) return NULL; if(retname) { name = NULL; if(FindNextFile(hDir, &data)) name = data.cFileName; } return retname; #else if(!dir) return NULL; #ifdef HAVE_READDIR_R readdir_r(dir, save, &entry); #else entry = readdir(dir); #endif if(!entry) return NULL; return entry->d_name; #endif // WIN32 } DirTree::DirTree(const char *prefix, unsigned depth) { max = ++depth; dir = new Dir[depth]; current = 0; open(prefix); } DirTree::DirTree(unsigned depth) { max = ++depth; dir = new Dir[depth]; current = 0; } void DirTree::open(const char *prefix) { char *cp; close(); if(!isDir(prefix)) return; snprintf(path, sizeof(path), "%s/", prefix); prefixpos = (unsigned)strlen(path) - 1; while(NULL != (cp = strchr(path, '\\'))) *cp = '/'; while(prefixpos && path[prefixpos - 1] == '/') path[prefixpos--] = 0; dir[current++].open(prefix); } DirTree::~DirTree() { close(); if(dir) delete[] dir; dir = NULL; } unsigned DirTree::perform(const char *prefix) { unsigned count = 0; open(prefix); while(NULL != (getPath())) ++count; close(); return count; } void DirTree::close(void) { while(current--) dir[current].close(); current = 0; } bool DirTree::filter(const char *path, struct stat *ino) { path = strrchr(path, '/'); if(path) ++path; else return false; if(!strcmp(path, ".")) return false; if(!strcmp(path, "..")) return false; if(!ino) return false; return true; } char *DirTree::getPath(void) { char *cp; const char *name; struct stat ino; bool flag; while(current) { cp = strrchr(path, '/'); name = dir[current - 1].getName(); if(!name) { *cp = 0; dir[--current].close(); continue; } snprintf(cp + 1, sizeof(path) - strlen(path) - 2, "%s", name); if(::stat(path, &ino)) { ino.st_mode = 0; flag = filter(path, NULL); } else flag = filter(path, &ino); if(!flag) continue; if((ino.st_mode & S_IFMT) == S_IFDIR) { if(!canAccess(path)) break; if(current < max) dir[current++].open(path); snprintf(path + strlen(path), sizeof(path) - strlen(path), "/"); } break; } if(!current) return NULL; return path; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/string.cpp0000644000175000017500000004676411463407023013341 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include "private.h" #ifdef __BORLANDC__ #include #include #include #else #include #include #include #endif #ifdef CCXX_NAMESPACES namespace ost { using std::streambuf; using std::ofstream; using std::ostream; using std::endl; using std::ios; #endif static Mutex mutex; MemPager *String::pager = NULL; char **String::idx = NULL; const unsigned String::minsize = ((sizeof(char *) + (sizeof(unsigned) * 2) + 1)); const unsigned String::slotsize = 32; const unsigned String::pagesize = 1024; const unsigned String::slotlimit = 512; const unsigned String::slotcount = ((slotlimit / slotsize) + 1); const size_t String::npos = (size_t)(-1); String::String() { init(); } String::String(std::string str) { init(); set(str.c_str()); } String::String(const String &original) { init(); copy(original); } String::String(size_t chars, const char chr) { init(); resize(chars + 1); memset(getText(), chr, chars); setLength(chars); } #ifdef HAVE_SNPRINTF String::String(size_t chars, const char *format, ...) { va_list args; va_start(args, format); init(); resize(chars); char *ptr = getText(); vsnprintf(ptr, chars, format, args); setLength(strlen(ptr)); va_end(args); } #else String::String(size_t chars, const char *str) { init(); resize(chars); if(!str || !*str) return; set(str); } #endif String::String(const char *str) { init(); set(str); } String::String(const String &str, size_t start, size_t chars) { init(); char *ptr = str.getText(); size_t len = str.getLength(); if(start >= len) return; ptr += start; len -= start; if(chars >= len) chars = len; set(ptr, chars); } char String::at(ssize_t ind) const { if(ind < 0) ind = (ssize_t)(getLength() - ind + 1); if((size_t)ind > getLength() || ind < 0) return 0; return (getText())[ind]; } void String::insert(size_t start, const char *str, size_t chars) { char *ptr = getText(); size_t len = getLength(); size_t sz = getSize(); if(!str) str = ""; if(!chars) chars = strlen(str); if(!chars || start > len) return; if(len + chars >= sz) { resize(len + chars + 1); ptr = getText(); } if(start == len) { memmove(ptr + start, str, chars); len += chars; setLength(len); ptr[len] = 0; return; } memmove(ptr + start + chars, ptr + start, len - start); memmove(ptr + start, str, chars); len += chars; setLength(len); ptr[len] = 0; return; } void String::insert(size_t start, const String &s) { insert(start, s.getText(), s.getLength()); } void String::replace(size_t start, size_t len, const char *cp, size_t chars) { erase(start, len); insert(start, cp, chars); } void String::replace(size_t start, size_t len, const String &s) { erase(start, len); insert(start, s); } void String::erase(size_t start, size_t chars) { size_t len = getLength(); char *ptr = getText(); if(start >= len) return; if(start + chars >= len || chars == npos || !chars) { setLength(start); ptr[start] = 0; return; } memmove(ptr + start, ptr + start + chars, len - start - chars); len -= chars; setLength(len); ptr[len] = 0; } void String::append(const char *str, size_t offset, size_t len) { size_t slen = getLength(); char *ptr = getText(); if(slen < offset) { append(str, len); return; } setLength(offset); ptr[offset] = 0; append(str, len); } void String::append(const char *str, size_t len) { if(!str) return; if(!len) len = strlen(str); if(!len) return; if(getLength() + len >= getSize()) resize(getLength() + len + 1); memmove(getText() + getLength(), str, len); len += getLength(); setLength(len); getText()[len] = 0; return; } void String::add(char c) { size_t len = getLength(); char *ptr; if(len + 1 >= getSize()) resize(len + 2); ptr = getText(); ptr[len++] = c; setLength(len); ptr[len] = 0; } void String::trim(size_t chars) { size_t len = getLength(); char *ptr = getText(); if(chars >= len) chars = len; len -= chars; ptr[len] = 0; setLength(len); } String String::token(const char *delim, size_t offset) { char *ptr = getText(); size_t len = getLength(); size_t chars = 0; String result; bool found = false; if(offset >= len) return result; len -= offset; ptr += offset; while(chars < len) { if(strchr(delim, ptr[chars])) { found = true; break; } ++chars; } if(!chars && found) erase(offset, 1); if(!chars) return result; result.set(ptr, chars); if(found) ++chars; erase(offset, chars); return result; } void String::strip(const char *chars) { size_t len = strtrim(chars, getText(), getLength()); if(!len) { setLength(len); return; } setLength(strchop(chars, getText(), len)); } #ifdef HAVE_SNPRINTF const char *String::set(size_t chars, const char *format, ...) { va_list args; va_start(args, format); if(chars <= minsize) clear(); if(chars > getSize()) resize(chars); char *ptr = getText(); vsnprintf(ptr, chars, format, args); setLength(strlen(ptr)); va_end(args); return ptr; } void String::append(size_t chars, const char *format, ...) { va_list args; va_start(args, format); size_t len = getLength(); if(len + chars <= minsize) clear(); if(len + chars > getSize()) resize(len + chars); char *ptr = getText() + len; vsnprintf(ptr, chars, format, args); setLength(strlen(getText())); va_end(args); } #endif const char *String::set(const char *str, size_t len) { if(!str) { clear(); return str; } if(!len) len = strlen(str); // if we are making a short string, lets clear prior alloc if(len < minsize) clear(); if(len >= getSize()) resize(len + 1); memmove(getText(), str, len); getText()[len] = 0; setLength(len); return str; } void String::set(const String &str) { set(str.getText(), str.getLength()); } void String::append(const String &str) { append(str.getText(), str.getLength()); } void String::copy(const String &original) { clear(); if(original.getLength() < minsize) { content.ministring.length = (unsigned)original.getLength(); memmove(content.ministring.text, original.getText(), original.getLength() + 1); content.ministring.big = false; return; } // ptr = original.getText(); content.bigstring.length = original.getLength(); content.bigstring.size = setSize(original.getLength() + 1); content.bigstring.text = getSpace(original.getLength() + 1); content.ministring.big = true; memmove(content.bigstring.text, original.getText(), original.getLength() + 1); } String::~String() { clear(); } void String::init(void) { content.ministring.big = false; content.ministring.length = 0; content.ministring.text[0] = 0; } size_t String::search(const char *cp, size_t clen, size_t ind) const { size_t len = getLength(); if(!cp) cp = ""; if(!clen) clen = strlen(cp); while(clen + ind <= len) { if(compare(cp, clen, ind) == 0) return ind; ++ind; } return npos; } size_t String::find(const char *cp, size_t ind, size_t len, unsigned instance) const { size_t pos = npos; if(!cp) cp = ""; if(!len) len = strlen(cp); while(instance--) { pos = search(cp, len, ind); if(pos == npos) break; ind = pos + 1; } return pos; } size_t String::rfind(const char *cp, size_t ind, size_t len) const { size_t result = npos; if(!cp) cp = ""; if(!len) len = strlen(cp); for(;;) { ind = search(cp, len, ind); if(ind == npos) break; result = ind++; } return result; } unsigned String::count(const char *cp, size_t ind, size_t len) const { unsigned chars = 0; if(!cp) cp = ""; if(!len) len = strlen(cp); for(;;) { ind = search(cp, len, ind); if(ind == npos) break; ++chars; ++ind; } return chars; } unsigned String::count(const String &str, size_t ind) const { return count(str.getText(), ind, str.getLength()); } size_t String::find(const String &str, size_t ind, unsigned instance) const { return find(str.getText(), ind, str.getLength(), instance); } size_t String::rfind(const String &str, size_t ind) const { return rfind(str.getText(), ind, str.getLength()); } int String::compare(const char *cp, size_t len, size_t ind) const { if(!cp) cp = ""; if(ind > getLength()) return -1; if(!len) return strcmp(getText() + ind, cp); return strncmp(getText() + ind, cp, len); } bool String::isEmpty(void) const { char *ptr = getText(); if(!ptr || !*ptr) return true; return false; } void String::resize(size_t chars) { size_t len = getLength(); char *ptr; if(len >= chars) len = chars - 1; ++len; if(!isBig() && chars <= minsize) return; if(!isBig()) { ptr = getSpace(chars); memmove(ptr, content.ministring.text, len); ptr[--len] = 0; content.ministring.big = true; content.bigstring.text = ptr; content.bigstring.length = len; setSize(chars); return; } if(chars <= minsize && getSize() > slotlimit) { ptr = getText(); memmove(content.ministring.text, ptr, len); content.ministring.text[--len] = 0; content.ministring.big = false; content.ministring.length = (unsigned)len; delete[] ptr; return; } ptr = getSpace(chars); memmove(ptr, getText(), len); ptr[--len] = 0; clear(); setSize(chars); content.bigstring.length = len; content.bigstring.text = ptr; content.ministring.big = true; } void String::clear(void) { char **next; unsigned slot; if(!isBig()) goto end; if(!content.bigstring.text) goto end; if(getSize() > slotlimit) { delete[] content.bigstring.text; goto end; } slot = ((unsigned)getSize() - 1) / slotsize; next = (char **)content.bigstring.text; mutex.enterMutex(); *next = idx[slot]; idx[slot] = content.bigstring.text; setLength(0); content.bigstring.text = NULL; mutex.leaveMutex(); end: init(); return; } char *String::getSpace(size_t chars) { unsigned slot; char *cp, **next; if(chars > slotlimit) return new char[chars]; slot = (unsigned)chars / slotsize; mutex.enterMutex(); if(!pager) { pager = new MemPager(pagesize); idx = (char **)pager->alloc(sizeof(char *) * slotcount); memset(idx, 0, sizeof(char *) * slotcount); } cp = idx[slot]; if(cp) { next = (char **)cp; idx[slot] = *next; } else cp = (char *)pager->alloc(++slot * slotsize); mutex.leaveMutex(); return cp; } const char *String::getIndex(size_t ind) const { const char *dp = getText(); if(ind > getLength()) return NULL; return (const char *)dp + ind; } char *String::getText(void) const { if(isBig()) return (char *)content.bigstring.text; return (char *)content.ministring.text; } long String::getValue(long def) const { unsigned base = 10; char *cp = getText(); char *ep = 0; long val; if(!cp) return def; if(!strnicmp(cp, "0x", 2)) { cp += 2; base = 16; } val = ::strtol(cp, &ep, base); if(!ep || *ep) return def; return val; } bool String::getBool(bool def) const { char *cp = getText(); if(!cp) return def; if(isdigit(*cp)) { if(!getValue(0)) return false; return true; } if(!stricmp(cp, "true") || !stricmp(cp, "yes")) return true; if(!stricmp(cp, "false") || !stricmp(cp, "no")) return false; return def; } const size_t String::getSize(void) const { if(isBig()) return content.bigstring.size; return minsize; } void String::setLength(size_t len) { if(isBig()) content.bigstring.length = len; else content.ministring.length = (unsigned)len; } size_t String::setSize(size_t chars) { if(chars <= minsize && !isBig()) return minsize; if(chars <= slotlimit) { size_t slotcount = chars / slotsize; if((chars % slotsize)!=0) ++slotcount; chars = slotcount*slotsize; } content.bigstring.size = chars; return chars; } const size_t String::getLength(void) const { if(isBig()) return content.bigstring.length; return content.ministring.length; } String operator+(const String &s1, const char c2) { String result(s1); result.add(c2); return result; } String operator+(const String &s1, const String &s2) { String result(s1); result.append(s2); return result; } String operator+(const String &s1, const char *s2) { String result(s1); result += s2; return result; } String operator+(const char *s1, const String &s2) { String result(s1); result += s2; return result; } String operator+(const char c1, const String &s2) { String result(1, c1); result += s2; return result; } bool String::operator<(const String &s1) const { if(compare(s1.getText()) < 0) return true; return false; } bool String::operator<(const char *s1) const { if(compare(s1) < 0) return true; return false; } bool String::operator>(const String &s1) const { if(compare(s1.getText()) > 0) return true; return false; } bool String::operator>(const char *s1) const { if(compare(s1) > 0) return true; return false; } bool String::operator<=(const String &s1) const { if(compare(s1.getText()) <= 0) return true; return false; } bool String::operator<=(const char *s1) const { if(compare(s1) <= 0) return true; return false; } bool String::operator>=(const String &s1) const { if(compare(s1.getText()) >= 0) return true; return false; } bool String::operator>=(const char *s1) const { if(compare(s1) >= 0) return true; return false; } bool String::operator==(const String &s1) const { if(compare(s1.getText()) == 0) return true; return false; } bool String::operator==(const char *s1) const { if(compare(s1) == 0) return true; return false; } bool String::operator!=(const String &s1) const { if(compare(s1.getText()) != 0) return true; return false; } bool String::operator!=(const char *s1) const { if(compare(s1) != 0) return true; return false; } bool String::operator*=(const String &s1) const { return search(s1.getText(), s1.getLength()) != npos; } bool String::operator*=(const char *s) const { return search(s) != npos; } std::ostream &operator<<(std::ostream &os, const String &str) { os << str.getText(); return os; } void *StringObject::operator new(size_t size) NEW_THROWS { char *base; size_t *sp; size += sizeof(size_t); if(size > String::slotlimit) return NULL; base = String::getSpace(size); if(!base) return NULL; sp = (size_t *)base; *sp = size; base += sizeof(size_t); return (void *)base; } void StringObject::operator delete(void *ptr) { char **next; unsigned slot; size_t *size = (size_t *)ptr; --size; ptr = size; slot = (unsigned)(((*size) - 1) / String::slotsize); next = ((char **)(ptr)); mutex.enter(); *next = String::idx[slot]; String::idx[slot] = (char *)ptr; mutex.leave(); } std::istream &getline(std::istream &is, String &str, char delim, size_t len) { if(!len) len = str.getSize() - 1; if(len >= str.getSize()) str.resize(len + 1); char *ptr = str.getText(); is.getline(ptr, (std::streamsize)len, delim); str.setLength(strlen(ptr)); return is; } SString::SString() : String(), streambuf() #ifdef HAVE_OLD_IOSTREAM ,ostream() #else ,ostream((streambuf *)this) #endif { #ifdef HAVE_OLD_IOSTREAM ostream::init((streambuf *)this); #endif } SString::SString(const SString &from) : String(from), streambuf() #ifdef HAVE_OLD_IOSTREAM ,ostream() #else ,ostream((streambuf *)this) #endif { #ifdef HAVE_OLD_IOSTREAM ostream::init((streambuf *)this); #endif } SString::~SString() { if(isBig()) String::clear(); } int SString::overflow(int c) { String::add((char)(c)); return c; } #ifdef HAVE_SNPRINTF int strprintf(String &str, size_t size, const char *format, ...) { va_list args; va_start(args, format); int rtn; if(!size) size = str.getSize(); if(size > str.getSize()) str.resize(size); char *ptr = str.getText(); str.setLength(0); ptr[0] = 0; rtn = vsnprintf(ptr, size, format, args); str.setLength(strlen(ptr)); va_end(args); return rtn; } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/cmdoptns.cpp0000644000175000017500000004160611463403644013655 00000000000000// Copyright (C) 2001-2010 Gianni Mariani // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // // // cmdoptns.cpp // #include #include #include #include #include #include #ifndef HAVE_GETOPT_LONG // fix problem with vc++ library #undef __argc #undef __argv #include "getopt.h" #else #include #endif #ifndef WIN32 #include #endif #include #include #include using std::fstream; #ifdef CCXX_NAMESPACES namespace ost { #endif // // In most cases, users will use this default option list. // CommandOption * defaultCommandOptionList = 0; CommandOption::CommandOption( const char * inOptionName, const char * inOptionLetter, const char * inDescription, OptionType inOptionType, bool inRequired, CommandOption ** ppNext ) : optionName( inOptionName ), optionLetter( inOptionLetter ), description( inDescription ), optionType( inOptionType ), required( inRequired ), next( * ppNext ) { * ppNext = this; } CommandOptionWithArg::CommandOptionWithArg( const char * inOptionName, const char * inOptionLetter, const char * inDescription, OptionType inOptionType, bool inRequired, CommandOption ** ppNext ) : CommandOption( inOptionName, inOptionLetter, inDescription, inOptionType, inRequired, ppNext ), values( 0 ), numValue( 0 ) { } CommandOptionArg::CommandOptionArg( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired, CommandOption ** ppNext ) : CommandOptionWithArg( inOptionName, inOptionLetter, inDescription, hasArg, inRequired, ppNext ) { } CommandOptionRest::CommandOptionRest( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired, CommandOption ** ppNext ) : CommandOptionWithArg( inOptionName, inOptionLetter, inDescription, trailing, inRequired, ppNext ) { } CommandOptionCollect::CommandOptionCollect( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired, CommandOption ** ppNext ) : CommandOptionWithArg( inOptionName, inOptionLetter, inDescription, collect, inRequired, ppNext ) { } CommandOptionNoArg::CommandOptionNoArg( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired, CommandOption ** ppNext ) : CommandOption( inOptionName, inOptionLetter, inDescription, noArg, inRequired, ppNext ), numSet( 0 ) { } // ======== CommandOption ============================================= // PURPOSE: // CommandOption dummy methods .. // void CommandOption::parseDone( CommandOptionParse * cop ) { } void CommandOption::foundOption( CommandOptionParse * cop, const char * value) { } void CommandOption::foundOption( CommandOptionParse * cop, const char ** value, int num ) { } void CommandOption::performTask( CommandOptionParse * cop ) { } bool CommandOption::hasValue() { return true; } CommandOption::~CommandOption() { } CommandOptionWithArg::~CommandOptionWithArg() { if ( values ) { free( values ); values = 0; } } CommandOptionParse::~CommandOptionParse(void) { } // ======== CommandOptionArg ========================================== // PURPOSE: // Methods for CommandOptionArg // bool CommandOptionWithArg::hasValue() { return numValue > 0; } CommandOptionArg::~CommandOptionArg() { } // // static void my_alloc( char *** vals, int num, int incr ) { int num_alloc = 0; if ( * vals ) { num_alloc = num | 3; } if ( ( incr + num ) > num_alloc ) { int newsiz = ( incr + num ) | 3; * vals = ( char ** ) realloc( * vals, sizeof( ** vals ) * newsiz ); } } void CommandOptionWithArg::foundOption( CommandOptionParse * cop, const char * value ) { if ( value ) { my_alloc( ( char *** ) & values, numValue ? numValue + 1 : 0, 1 ); values[ numValue ++ ] = value; values[ numValue ] = 0; } } void CommandOptionWithArg::foundOption( CommandOptionParse * cop, const char ** value, int num ) { my_alloc( ( char *** ) & values, numValue ? numValue + 1 : 0, num + 1 ); int j = 0; for ( int i = numValue; j < num; i ++, j ++ ) { values[ i ] = value[ j ]; } numValue += num; values[ numValue ] = 0; } void CommandOptionNoArg::foundOption( CommandOptionParse * cop, const char * value) { numSet ++; } // ======== CommandOptionParse ======================================== // PURPOSE: // methods for CommandOptionParse // class CommandOptionParse_impl : public CommandOptionParse { public: const char * comment; int num_options; struct option * long_options; CommandOption ** opt_list; CommandOption ** co_list; char * optstring; int argc; char ** argv; bool has_err; char * fail_arg; bool usage_string_set; bool required_errors_set; String error_msgs; CommandOption * fail_option; CommandOption * trailing; String usage_string; virtual ~CommandOptionParse_impl() { delete[] opt_list; delete[] co_list; delete[] optstring; delete[] long_options; } CommandOptionParse_impl( int in_argc, char ** in_argv, const char * in_comment, CommandOption * options ) : comment( in_comment ), argc( in_argc ), argv( in_argv ), has_err( false ), fail_arg( 0 ), usage_string_set( false ), required_errors_set( false ), error_msgs( "" ), fail_option( 0 ), trailing(0) { // First need to count all options. CommandOption * to = options; int ocnt = 0; int ccnt = 0; int flag; while ( to ) { if ( to->optionName ) ocnt ++; ccnt ++; to = to->next; } num_options = ccnt; #ifdef __KCC co_list = new (CommandOption **)[ocnt]; opt_list = new (CommandOption **)[ccnt]; #else // fix compiling bug in vc++ typedef CommandOption* PCommandOption; co_list = new PCommandOption[ocnt]; opt_list = new PCommandOption[ccnt]; #endif long_options = new option[ccnt+1]; optstring = new char[ 2*ccnt+2 ]; // initialize the last option count long_options[ ocnt ].name = 0; long_options[ ocnt ].has_arg = 0; long_options[ ocnt ].flag = 0; long_options[ ocnt ].val = 0; char *tos = optstring; *(tos++) = '+'; to = options; while ( to ) { if ( to->optionType == CommandOption::trailing ) { if ( ! trailing ) { trailing = to; } } else if ( to->optionType == CommandOption::collect ) { trailing = to; } opt_list[ -- ccnt ] = to; if ( to->optionName ) { -- ocnt; co_list[ ocnt ] = to; long_options[ ocnt ].name = to->optionName; long_options[ ocnt ].has_arg = to->optionType == CommandOption::hasArg; long_options[ ocnt ].flag = & flag; long_options[ ocnt ].val = ocnt; } if ( to->optionLetter && to->optionLetter[ 0 ] ) { * tos ++ = to->optionLetter[ 0 ]; if ( to->optionType == CommandOption::hasArg ) { * tos ++ = ':'; } } to = to->next; } * tos = 0; int c; int optionIndex; opterr = 0; // tell getopt_long not to print any errors flag = -1; while ( optind < argc ) { if ( ( c = getopt_long( argc, argv, optstring, long_options, &optionIndex ) ) == -1 ) { if ( ! trailing ) { break; } else if ( trailing->optionType == CommandOption::trailing ) { break; } else { optarg = argv[ optind ]; optind ++; to = trailing; } } else if ( flag != -1 ) { to = co_list[ flag ]; flag = -1; } else if ( c == '?' ) { if ( optind < 2 ) { fail_arg = argv[ optind ]; } else { fail_arg = argv[ optind - 1 ]; } has_err = true; return; } else { // need to search through the options. for ( int i = 0; i < num_options; i ++ ) { to = opt_list[ i ]; if ( ! to->optionLetter ) continue; if ( c == to->optionLetter[ 0 ] ) { break; } } // assert( to ); } // do we terminate here ? if ( to->optionType == CommandOption::trailing ) { break; } if ( c != ':' ) { to->foundOption( this, optarg ); } else { has_err = true; fail_option = to; break; } } if ( optind < argc ) { if ( trailing ) { trailing->foundOption( this, ( const char ** ) ( argv + optind ), argc - optind ); } else { has_err = true; fail_arg = argv[ optind ]; } } // Now check to see that all required args made it ! for ( int i = 0; i < num_options; i ++ ) { CommandOption * toq = opt_list[ i ]; // Tell this parameter that it's done now. toq->parseDone( this ); if ( toq->required && ! toq->hasValue() ) { has_err = true; break; } } } bool argsHaveError(); virtual const char * printUsage(); virtual const char * printErrors(); void makePrintErrors() { if ( required_errors_set ) return; required_errors_set = true; if ( fail_arg ) { error_msgs = error_msgs + "Unknown/malformed option '" + fail_arg + "' \n"; } else if ( fail_option ) { String name; bool name_msg; if ( fail_option->optionName ) { name_msg = true; name = fail_option->optionName; } else if ( fail_option->optionLetter ) { name_msg = true; name = fail_option->optionLetter; } else if ( fail_option == trailing ) { name_msg = false; } else { name = "--option with no name--"; name_msg = true; } if ( name_msg ) { error_msgs = error_msgs + "Option '" + name + "' requires value\n"; } } else if ( has_err ) { // loop thru all required args for ( int i = 0; i < num_options; i ++ ) { CommandOption * to = opt_list[ i ]; if ( to->required && ! to->hasValue() ) { error_msgs = error_msgs + "Value required for option '"; if ( to->optionName ) { error_msgs = error_msgs + "--" + to->optionName; } else if ( to->optionLetter && to->optionLetter[ 0 ] ) { error_msgs = error_msgs + '-' + to->optionLetter[ 0 ]; } else { error_msgs = error_msgs + to->description; } error_msgs = error_msgs + "' is missing\n"; } } } } void makePrintUsage() { if ( usage_string_set ) return; String str( "" ); String str_argv0 = argv[ 0 ]; str = str + (char *)"Usage : "; String::size_type slashpos = str_argv0.rfind('/'); if ( slashpos > str_argv0.length() ) { slashpos = 0; } else { slashpos ++; } str.append( str_argv0, slashpos, str_argv0.length() - slashpos ); str = str + ' ' + comment + '\n'; for ( int i = 0; i < num_options; i ++ ) { CommandOption * to = opt_list[ i ]; char * begin = (char *)"\t"; char * obegin = (char *)"\t"; to = opt_list[ i ]; if ( to->optionLetter && to->optionLetter[ 0 ] ) { str = str + begin + '-' + to->optionLetter[ 0 ]; begin = (char *)", "; obegin = (char *)" - "; } if ( to->optionName ) { str = str + begin + "--" + to->optionName; begin = (char *)", "; obegin = (char *)" - "; } if ( to->optionType == CommandOption::hasArg ) { str = str + begin + " "; } else if ( to->optionType == CommandOption::trailing ) { str = str + begin + " "; } else if ( to->optionType == CommandOption::collect ) { str = str + begin + " <...>"; } str = str + obegin + to->description + "\n"; } usage_string = str; } virtual void registerError( const char * errMsg ) { error_msgs = error_msgs + errMsg + '\n'; has_err = true; } virtual void performTask() { for ( int i = 0; i < num_options; i ++ ) { CommandOption * to = opt_list[ i ]; // Each parameter has this invoked to->performTask( this ); } } }; CommandOptionParse * makeCommandOptionParse( int argc, char ** argv, const char * comment, CommandOption * options ) { return new CommandOptionParse_impl( argc, argv, comment, options ); } bool CommandOptionParse_impl::argsHaveError() { return has_err; } const char * CommandOptionParse_impl::printUsage() { makePrintUsage(); return usage_string.c_str(); } const char * CommandOptionParse_impl::printErrors() { makePrintErrors(); return error_msgs.c_str(); } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/ost_check2.m40000644000175000017500000002042611463314535013605 00000000000000dnl Copyright (C) 2000-2003 Open Source Telecom Corporation. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. dnl OST_CCXX2_VERSION([MINIMUM-VERSION[,ACTION-IF-FOUND[,ACTION-IF-NOT-FOUND]]]) dnl Test for usable version of CommonC++ AC_DEFUN([OST_CCXX2_DYNLOADER],[ ost_cv_dynloader=`$CCGNU2_CONFIG --dso` if test "$ost_cv_dynloader" = "yes" ; then MODULE_FLAGS=`$CCGNU2_CONFIG --module` AC_SUBST(MODULE_FLAGS) fi ]) AC_DEFUN([OST_CCXX2_LD_THREADING],[ LD_THREADING=`$CCGNU2_CONFIG --cclibs` AC_SUBST(LD_THREADING) ]) AC_DEFUN([OST_CCXX2_VERSION], [ if test -d ${exec_prefix}/bin ; then PATH=${exec_prefix}/bin:$PATH elif test -d ${prefix}/bin ; then PATH=${prefix}/bin:$PATH ; fi AC_PATH_PROG(CCGNU2_CONFIG, ccgnu2-config, no) ccgnu2_version=ifelse([$1], ,0.99.0,$1) AC_MSG_CHECKING(for commoncpp2 version >= $ccgnu2_version) if test "$CCGNU2_CONFIG" = "no" ; then AC_MSG_RESULT(not found) echo "*** The ccgnu2-config script installed by commoncpp2 0.99" echo "*** or later could not be found." echo "*** You need to install GNU Common C++ 2, whose later releases are" echo "*** available from http://www.gnu.org/software/commoncpp/ and any" echo "*** GNU mirror." ifelse([$3], , :, [$3]) exit -1 else config_version=`$CCGNU2_CONFIG --version` ccgnu2_config_major_version=`echo $config_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ccgnu2_config_minor_version=`echo $config_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ccgnu2_config_micro_version=`echo $config_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` ccgnu2_check_major_version=`echo "$ccgnu2_version" | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ccgnu2_check_minor_version=`echo "$ccgnu2_version" | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ccgnu2_check_micro_version=`echo "$ccgnu2_version" | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` version_ok=no if test $ccgnu2_config_major_version -gt $ccgnu2_check_major_version ; then version_ok=yes elif test $ccgnu2_config_major_version -eq $ccgnu2_check_major_version \ && test $ccgnu2_config_minor_version -gt $ccgnu2_check_minor_version ; then version_ok=yes elif test $ccgnu2_config_major_version -eq $ccgnu2_check_major_version \ && test $ccgnu2_config_minor_version -eq $ccgnu2_check_minor_version \ && test $ccgnu2_config_micro_version -ge $ccgnu2_check_micro_version; then version_ok=yes fi if test "$version_ok" = "no"; then AC_MSG_RESULT(no) ost_cv_ccxx_config=false echo "*** An old version of CommonC++ of $config_version was found." echo "*** You need a version of commoncpp2 newer than $ccgnu2_version. The latest version of" echo "*** CommonC++ is always available from ftp://ftp.gnu.org/gnu/commonc++/." ifelse([$3], , :, [$3]) else AC_MSG_RESULT(yes) ost_cv_ccxx_config=true SINGLE_FLAGS="$CXXFLAGS" SINGLE_LIBS="$LIBS" AC_SUBST(SINGLE_LIBS) AC_SUBST(SINGLE_FLAGS) CXXFLAGS="$CXXFLAGS "`$CCGNU2_CONFIG --flags` GNULIBS="$LIBS "`$CCGNU2_CONFIG --gnulibs` EXTLIBS=`$CCGNU2_CONFIG --extlibs` LIBS="$LIBS `$CCGNU2_CONFIG --stdlibs`" AC_SUBST(GNULIBS) AC_SUBST(EXTLIBS) fi fi ]) AC_DEFUN([OST_CCXX2_CHECK], [ if test -d ${exec_prefix}/bin ; then PATH=${exec_prefix}/bin:$PATH elif test -d ${prefix}/bin ; then PATH=${prefix}/bin:$PATH ; fi AC_PATH_PROG(CCGNU2_CONFIG, ccgnu2-config, no) ccgnu2_version=ifelse([$1], ,0.99.0,$1) AC_MSG_CHECKING(for commoncpp2 version >= $ccgnu2_version) if test "$CCGNU2_CONFIG" = "no" ; then AC_MSG_RESULT(not found) echo "*** The ccgnu2-config script installed by commoncpp2 0.99" echo "*** or later could not be found." echo "*** You need to install GNU Common C++ 2, whose later releases are" echo "*** available from http://www.gnu.org/software/commoncpp/ and any" echo "*** GNU mirror." ifelse([$3], , :, [$3]) exit -1 else config_version=`$CCGNU2_CONFIG --version` ccgnu2_config_major_version=`echo $config_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ccgnu2_config_minor_version=`echo $config_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ccgnu2_config_micro_version=`echo $config_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` ccgnu2_check_major_version=`echo "$ccgnu2_version" | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ccgnu2_check_minor_version=`echo "$ccgnu2_version" | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ccgnu2_check_micro_version=`echo "$ccgnu2_version" | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` version_ok=no if test $ccgnu2_config_major_version -gt $ccgnu2_check_major_version ; then version_ok=yes elif test $ccgnu2_config_major_version -eq $ccgnu2_check_major_version \ && test $ccgnu2_config_minor_version -gt $ccgnu2_check_minor_version ; then version_ok=yes elif test $ccgnu2_config_major_version -eq $ccgnu2_check_major_version \ && test $ccgnu2_config_minor_version -eq $ccgnu2_check_minor_version \ && test $ccgnu2_config_micro_version -ge $ccgnu2_check_micro_version; then version_ok=yes fi if test "$version_ok" = "no"; then AC_MSG_RESULT(no) ost_cv_ccxx_config=false echo "*** An old version of CommonC++ of $config_version was found." echo "*** You need a version of commoncpp2 newer than $ccgnu2_version. The latest version of" echo "*** CommonC++ is always available from ftp://ftp.gnu.org/gnu/commonc++/." ifelse([$3], , :, [$3]) else AC_MSG_RESULT(yes) ost_cv_ccxx_config=true CCFLAGS2=`$CCGNU2_CONFIG --flags` LDCCGNU2=`$CCGNU2_CONFIG --gnulibs` LDCCEXT2=`$CCGNU2_CONFIG --stdlibs` AC_SUBST(LDCCGNU2) AC_SUBST(LDCCEXT2) AC_SUBST(CCFLAGS2) fi fi ]) AC_DEFUN([OST_CCXX2_FOX],[ AC_LANG_SAVE AC_LANG_CPLUSPLUS ost_cv_lib_fox=false AC_CHECK_HEADERS(fox/fx.h,[ AC_DEFINE(HAVE_FOX_FX_H) ost_cv_lib_fox=true]) AC_LANG_RESTORE ]) dnl OST_CCXX2_XML([ACTION-IF-TRUE[,ACTION-IF-FALSE]]) AC_DEFUN([OST_CCXX2_HOARD],[ AC_ARG_ENABLE(hoard, [--disable-hoard Disable hoard support]) AC_ARG_ENABLE(mpatrol, [--enable-mpatrol Enable mpatrol debugging]) if test "$enable_mpatrol" = "yes" ; then LIBS="$LIBS -lmpatrolmt -lbfd -liberty" elif test "$enable_hoard" != "no" ; then AC_CHECK_LIB(hoard, free, [LIBS="$LIBS -lhoard"]) fi ]) AC_DEFUN([OST_CCXX2_XML], [ AC_MSG_CHECKING(for commoncpp2 xml parsing) AC_LANG_PUSH(C++) AC_REQUIRE_CPP AC_TRY_RUN([ #include #ifndef COMMON_XML_PARSING #error "" #endif int main() { return 0; } ], ost_cv_ccxx_xml=yes, ost_cv_ccxx_xml=no) AC_LANG_POP(C++) if test "x$ost_cv_ccxx_xml" = "xyes" ; then AC_MSG_RESULT(yes) AC_DEFINE(HAVE_OST_CCXX2_XML_PARSING, 1, [Define this if the CommonC++ library was compiled with XML parsing support]) ifelse([$1], , :, [$1]) else AC_MSG_RESULT(no) ifelse([$2], , :, [$2]) fi ]) dnl ACCONFIG TEMPLATE dnl #undef CCXX_CONFIG_H_ dnl #undef HAVE_FOX_FX_H dnl END ACCONFIG commoncpp2-1.8.1/src/network.cpp0000644000175000017500000001357311463403701013513 00000000000000// Copyright (C) 2002-2010 Christian Prochnow // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #ifdef __QNX__ #include #endif #include #include #include #include #include #include #ifndef WIN32 #ifdef HAVE_IOCTL_H #include #else #include #endif # ifdef HAVE_SYS_SOCKIO_H # include # endif #ifdef HAVE_NET_IF_H #include #endif #endif #ifdef CCXX_NAMESPACES namespace ost { #endif #if defined(HAVE_NET_IF_H) || defined(WIN32) #if !defined(_MSC_VER) || _MSC_VER >= 1300 using namespace std; NetworkDeviceInfo::NetworkDeviceInfo(const String& name, const IPV4Host& addr, const IPV4Broadcast& broadcast, const IPV4Mask& netmask, int mtu) : _name(name), _addr(addr), _broadcast(broadcast), _netmask(netmask), _mtu(mtu) {} NetworkDeviceInfo::NetworkDeviceInfo(const NetworkDeviceInfo& ndi) : _name(ndi._name), _addr(ndi._addr), _broadcast(ndi._broadcast), _netmask(ndi._netmask), _mtu(ndi._mtu) {} NetworkDeviceInfo::~NetworkDeviceInfo() {} bool enumNetworkDevices(vector& devs) { devs.clear(); #ifndef WIN32 char buffer[8192]; struct ifconf ifc; int fd = socket(AF_INET, SOCK_DGRAM, 0); if(fd == -1) return false; ifc.ifc_len = sizeof(buffer); ifc.ifc_buf = buffer; if(ioctl(fd, SIOCGIFCONF, &ifc) == -1) return false; IPV4Host addr; IPV4Broadcast brdaddr; IPV4Mask maskaddr("255.255.255.255"); int mtu; int count = ifc.ifc_len / sizeof(ifreq); for(int i = 0; i < count; ++i) { if(ifc.ifc_req[i].ifr_addr.sa_family != AF_INET) continue; addr = ((sockaddr_in&)ifc.ifc_req[i].ifr_addr).sin_addr; struct ifreq devifreq; setString(devifreq.ifr_name, sizeof(devifreq.ifr_name), ifc.ifc_req[i].ifr_name); if(ioctl(fd, SIOCGIFBRDADDR, &devifreq) == -1) (IPV4Address&)brdaddr = htonl(INADDR_ANY); else (IPV4Address&)brdaddr = ((sockaddr_in&)devifreq.ifr_broadaddr).sin_addr; if(ioctl(fd, SIOCGIFNETMASK, &devifreq) == -1) maskaddr = htonl(INADDR_BROADCAST); else (IPV4Address&)maskaddr = ((sockaddr_in&)devifreq.ifr_addr).sin_addr; #if defined(SIOCGLIFMTU) && !defined(__hpux) struct lifreq devlifreq; if(ioctl(fd, SIOCGLIFMTU, &devlifreq) == -1) mtu = 0; else mtu = devlifreq.lifr_mtu; #else if(ioctl(fd, SIOCGIFMTU, &devifreq) == -1) mtu = 0; else #if defined(__hpux) mtu = devifreq.ifr_metric; #else mtu = devifreq.ifr_mtu; #endif #endif devs.push_back(NetworkDeviceInfo(ifc.ifc_req[i].ifr_name, addr, brdaddr, maskaddr, mtu)); } close(fd); #elif defined(SIO_GET_INTERFACE_LIST) // WIN32 SOCKET s = WSASocket(AF_INET, SOCK_DGRAM, 0, 0, 0, 0); if(s == INVALID_SOCKET) { if(WSAGetLastError() == WSANOTINITIALISED) { WSADATA wsadata; WSAStartup(MAKEWORD(2,0),&wsadata); } else return false; } char outbuff[8192]; DWORD outlen; DWORD ret = WSAIoctl(s, SIO_GET_INTERFACE_LIST, 0, 0, outbuff, sizeof(outbuff), &outlen, 0, 0); if(ret == SOCKET_ERROR) return false; INTERFACE_INFO* iflist = (INTERFACE_INFO*)outbuff; int ifcount = outlen / sizeof(INTERFACE_INFO); IPV4Host addr; IPV4Broadcast brdaddr; IPV4Mask maskaddr("0.0.0.0"); for(int i = 0; i < ifcount; ++i) { addr = ((sockaddr_in&)iflist[i].iiAddress).sin_addr; (IPV4Address&)brdaddr = ((sockaddr_in&)iflist[i].iiBroadcastAddress).sin_addr; (IPV4Address&)maskaddr = ((sockaddr_in&)iflist[i].iiNetmask).sin_addr; devs.push_back(NetworkDeviceInfo("", addr, brdaddr, maskaddr, -1)); } closesocket(s); #endif return true; } #endif #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/cidr.cpp0000644000175000017500000001761511463374220012747 00000000000000// Copyright (C) 2006-2010 David Sugar, Tycho Softworks // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include "private.h" #include #include #include #ifdef CCXX_NAMESPACES namespace ost { #endif typedef unsigned char bit_t; static void bitmask(bit_t *bits, bit_t *mask, unsigned len) { while(len--) *(bits++) &= *(mask++); } static void bitimask(bit_t *bits, bit_t *mask, unsigned len) { while(len--) *(bits++) |= ~(*(mask++)); } static void bitset(bit_t *bits, unsigned blen) { bit_t mask; while(blen) { mask = (bit_t)(1 << 7); while(mask && blen) { *bits |= mask; mask >>= 1; --blen; } ++bits; } } static unsigned bitcount(bit_t *bits, unsigned len) { unsigned count = 0; bit_t mask, test; while(len--) { mask = (bit_t)(1<<7); test = *bits++; while(mask) { if(!(mask & test)) return count; ++count; mask >>= 1; } } return count; } IPV4Cidr::IPV4Cidr() { memset(&network, 0, sizeof(network)); memset(&netmask, 0, sizeof(netmask)); } IPV4Cidr::IPV4Cidr(const char *cp) { set(cp); } IPV4Cidr::IPV4Cidr(IPV4Cidr &cidr) { memcpy(&network, &cidr.network, sizeof(network)); memcpy(&netmask, &cidr.netmask, sizeof(netmask)); } bool IPV4Cidr::isMember(const struct in_addr &addr) const { struct in_addr host = addr; bitmask((bit_t *)&host, (bit_t *)&netmask, sizeof(host)); if(!memcmp(&host, &network, sizeof(host))) return true; return false; } bool IPV4Cidr::isMember(const struct sockaddr *saddr) const { struct sockaddr_in *addr = (struct sockaddr_in *)saddr; struct in_addr host; if(saddr->sa_family != AF_INET) return false; memcpy(&host, &addr->sin_addr.s_addr, sizeof(host)); bitmask((bit_t *)&host, (bit_t *)&netmask, sizeof(host)); if(!memcmp(&host, &network, sizeof(host))) return true; return false; } struct in_addr IPV4Cidr::getBroadcast(void) const { struct in_addr bcast; memcpy(&bcast, &network, sizeof(network)); bitimask((bit_t *)&bcast, (bit_t *)&netmask, sizeof(bcast)); return bcast; } unsigned IPV4Cidr::getMask(const char *cp) const { unsigned dcount = 0; const char *gp = cp; const char *mp = strchr(cp, '/'); unsigned char dots[4]; #ifdef WIN32 DWORD mask; #else uint32 mask; #endif if(mp) { if(!strchr(++mp, '.')) return atoi(mp); mask = inet_addr(mp); return bitcount((bit_t *)&mask, sizeof(mask)); } memset(dots, 0, sizeof(dots)); dots[0] = atoi(cp); while(*gp && dcount < 3) { if(*(gp++) == '.') dots[++dcount] = atoi(gp); } if(dots[3]) return 32; if(dots[2]) return 24; if(dots[1]) return 16; return 8; } void IPV4Cidr::set(const char *cp) { char cbuf[INET_IPV4_ADDRESS_SIZE]; char *ep; unsigned dots = 0; #ifdef WIN32 DWORD addr; #endif memset(&netmask, 0, sizeof(netmask)); bitset((bit_t *)&netmask, getMask(cp)); setString(cbuf, sizeof(cbuf), cp); ep = (char *)strchr(cp, '/'); if(ep) *ep = 0; cp = cbuf; while(NULL != (cp = strchr(cp, '.'))) { ++dots; ++cp; } while(dots++ < 3) addString(cbuf, sizeof(cbuf), ".0"); #ifdef WIN32 addr = inet_addr(cbuf); memcpy(&network, &addr, sizeof(network)); #else inet_aton(cbuf, &network); #endif bitmask((bit_t *)&network, (bit_t *)&netmask, sizeof(network)); } #ifdef CCXX_IPV6 IPV6Cidr::IPV6Cidr() { memset(&network, 0, sizeof(network)); memset(&netmask, 0, sizeof(netmask)); } IPV6Cidr::IPV6Cidr(const char *cp) { set(cp); } IPV6Cidr::IPV6Cidr(IPV6Cidr &cidr) { memcpy(&network, &cidr.network, sizeof(network)); memcpy(&netmask, &cidr.netmask, sizeof(netmask)); } bool IPV6Cidr::isMember(const struct in6_addr &addr) const { struct in6_addr host = addr; bitmask((bit_t *)&host, (bit_t *)&netmask, sizeof(host)); if(!memcmp(&host, &network, sizeof(host))) return true; return false; } bool IPV6Cidr::isMember(const struct sockaddr *saddr) const { struct sockaddr_in6 *addr = (struct sockaddr_in6 *)saddr; struct in6_addr host; if(saddr->sa_family != AF_INET6) return false; memcpy(&host, &addr->sin6_addr, sizeof(host)); bitmask((bit_t *)&host, (bit_t *)&netmask, sizeof(host)); if(!memcmp(&host, &network, sizeof(host))) return true; return false; } struct in6_addr IPV6Cidr::getBroadcast(void) const { struct in6_addr bcast; memcpy(&bcast, &network, sizeof(network)); bitimask((bit_t *)&bcast, (bit_t *)&netmask, sizeof(bcast)); return bcast; } unsigned IPV6Cidr::getMask(const char *cp) const { unsigned count = 0, rcount = 0; const char *sp = strchr(cp, '/'); int flag = 0; if(sp) return atoi(++sp); if(!strncmp(cp, "ff00:", 5)) return 8; if(!strncmp(cp, "fe80:", 5)) return 10; if(!strncmp(cp, "2002:", 5)) return 16; sp = strrchr(cp, ':'); while(*(++sp) == '0') ++sp; if(*sp) return 128; while(*cp && count < 128) { if(*(cp++) == ':') { count+= 16; while(*cp == '0') ++cp; if(*cp == ':') { if(!flag) rcount = count; flag = 1; } else flag = 0; } } return rcount; } void IPV6Cidr::set(const char *cp) { char cbuf[INET_IPV6_ADDRESS_SIZE]; char *ep; memset(&netmask, 0, sizeof(netmask)); bitset((bit_t *)&netmask, getMask(cp)); setString(cbuf, sizeof(cbuf), cp); ep = (char *)strchr(cp, '/'); if(ep) *ep = 0; inet_pton(AF_INET6, cbuf, &network); bitmask((bit_t *)&network, (bit_t *)&netmask, sizeof(network)); } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/applog.cpp0000755000175000017500000006576611463373673013340 00000000000000// Copyright (C) 2005-2009 Angelo Naselli, Penta Engineering s.r.l. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include #include #include #include #include // TODO sc: test if has to move up now that it is into commoncpp // NOTE: the order of inclusion is important do not move following include line // redefinition of __EXPORT needed if we're compiling our dll #include // local includes #include #ifdef CCXX_NAMESPACES using namespace std; namespace ost { #endif class logStruct { public: string _ident; int _priority; Slog::Level _level; bool _enable; bool _clogEnable; bool _slogEnable; size_t _msgpos; enum logEnum { BUFF_SIZE = 512, LAST_CHAR = BUFF_SIZE - 1 }; char _msgbuf[BUFF_SIZE]; logStruct() : _ident("") , _priority(Slog::levelDebug), _level(Slog::levelDebug), _enable(false), _clogEnable(false), _slogEnable(false), _msgpos(0) { memset(_msgbuf, 0, BUFF_SIZE); }; ~logStruct() {}; }; struct levelNamePair { const char *name; Slog::Level level; }; #ifdef WIN32 template class std::map; #endif class LevelName : public map { public: LevelName(const levelNamePair initval[], int num) { for (int i = 0; i < num; i++) insert(make_pair(initval[i].name, initval[i].level)); }; }; class logger : public ost::ThreadQueue { private: string _nomeFile; std::fstream _logfs; bool _usePipe; protected: // to dequeue log messages and write them to file if not log_directly virtual void runQueue(void *data); virtual void startQueue(void); virtual void stopQueue(void); virtual void onTimer(void); virtual void final(void); public: logger(const char* logFileName = NULL, bool usePipe = false); virtual ~logger(); // To change log file name void logFileName(const char* FileName, bool usePipe = false); }; // mapping thread ID <-> logStruct (buffer) typedef map LogPrivateData; // map ident <-> levels typedef map IdentLevel; class AppLogPrivate { public: // subscription and unsubsciption must be protected as well ost::Mutex _subMutex; // mapping thread ID <-> logStruct (buffer) LogPrivateData _logs; // map ident <-> levels IdentLevel _identLevel; // log directly into file bool _logDirectly; bool _logPipe; // log spooler logger *_pLogger; string _nomeFile; Mutex _lock; std::fstream _logfs; static const levelNamePair _values[]; static LevelName _assoc; AppLogPrivate() : _pLogger(NULL) {} ~AppLogPrivate() { if (_pLogger) delete _pLogger; } }; const levelNamePair AppLogPrivate::_values[] = { { "emerg", Slog::levelEmergency }, { "alert", Slog::levelAlert }, { "critical", Slog::levelCritical }, { "error", Slog::levelError }, { "warn", Slog::levelWarning }, { "notice", Slog::levelNotice }, { "info", Slog::levelInfo }, { "debug", Slog::levelDebug } }; AppLog alog; LevelName AppLogPrivate::_assoc(_values, sizeof AppLogPrivate::_values / sizeof *AppLogPrivate::_values); map *AppLog::assoc = &AppLogPrivate::_assoc; HEXdump::HEXdump(const unsigned char *buffer, int len, int max_len) : _str() { std::stringstream sstr; if (buffer == NULL || len <= 0) return ; long buf_len = (max_len > 0 && len > max_len) ? max_len : len; long int addr = 0; int cnt2 = 0; int n; int i; sstr.str(""); // get exception from ifstream failures sstr.exceptions(ifstream::failbit | ifstream::badbit); try { sstr << std::endl; sstr << "dump " << len << " byte." << std::endl; for (n = 0; n < buf_len; n++) { if (cnt2 == 0) { // Print address. sstr << std::setw(7) << std::setfill('0') << int (addr) << " - "; addr = addr + 16; } cnt2 = (cnt2 + 1) % 18; if (cnt2 <= 16) { // print hex value sstr << std::hex << std::setw(2) << std::setfill('0') << int (buffer[n]) << " "; } else { sstr << " "; sstr << std::setfill(' '); for (i = n - cnt2 + 1; i < n; i++) { // print ascii value if (buffer[i] < 32 || 126 < buffer[i]) { sstr << '.'; } else { sstr << buffer[i]; } } sstr << std::endl; sstr << std::dec; cnt2 = 0; n--; } } sstr << std::setfill(' '); for (i = cnt2 + 1; i <= 16 ; i++) { sstr << std::setw(2) << "--" << " "; } sstr << " "; for (i = n - cnt2; cnt2 <= 16 && i < n; i++) { if (buffer[i] < 32 || 126 < buffer[i]) { sstr << '.'; } else { sstr << buffer[i]; } } sstr << std::dec; if (max_len > 0 && len > max_len) sstr << std::endl << "dump troncato a " << max_len << " byte." << std::endl; } catch (...) { sstr.str("HEXdump failed!"); } _str = sstr.str(); } // class logger logger::logger(const char* logFileName, bool usePipe) : ThreadQueue(NULL, 0, 0), _usePipe(usePipe) { _nomeFile = ""; if (logFileName) _nomeFile = logFileName; if (!_nomeFile.empty()) { if (!_usePipe) { _logfs.open(_nomeFile.c_str(), std::ofstream::out | std::ofstream::app | std::ofstream::ate); } #ifndef WIN32 else { // create pipe int err = mkfifo(_nomeFile.c_str(), S_IREAD | S_IWRITE); if (err == 0 || errno == EEXIST) { // and open it _logfs.open(_nomeFile.c_str(), std::fstream::in | std::fstream::out); } else THROW(AppLogException("Can't create pipe")); } #endif if (_logfs.fail()) THROW(AppLogException("Can't open log file name")); } } logger::~logger() { Semaphore::post(); Thread::terminate(); _logfs.flush(); _logfs.close(); } // New log file name void logger::logFileName(const char* FileName, bool usePipe) { if (!FileName) return; _usePipe = usePipe; _nomeFile = FileName; if (_logfs.is_open()) _logfs.close(); if (!_nomeFile.empty()) { if (!_usePipe) { _logfs.open(_nomeFile.c_str(), std::ofstream::out | std::ofstream::app | std::ofstream::ate); } #ifndef WIN32 else { // create pipe int err = mkfifo(_nomeFile.c_str(), S_IREAD | S_IWRITE); if (err == 0 || errno == EEXIST) { // and open it _logfs.open(_nomeFile.c_str(), std::fstream::in | std::fstream::out); } else THROW(AppLogException("Can't create pipe")); } #endif if (_logfs.fail()) THROW(AppLogException("Can't open log file name")); } } // writes into filename enqueued messages void logger::runQueue(void * data) { char *str = (char *) data; if (_logfs.is_open()) { Thread::setCancel(cancelDisabled); _logfs << str; _logfs.flush(); Thread::setCancel(cancelImmediate); } } void logger::startQueue() { testCancel(); } void logger::stopQueue() { testCancel(); } void logger::onTimer() { } void logger::final() { if (started) { data_t *pFirst = first; while (pFirst) { runQueue(pFirst->data); pFirst = pFirst->next; } } } #ifndef WIN32 AppLog::AppLog(const char* logFileName, bool logDirectly, bool usePipe) : streambuf(), ostream((streambuf*) this) #else AppLog::AppLog(const char* logFileName, bool logDirectly) : streambuf(), ostream((streambuf*) this) #endif { d= NULL; // pedantic fussy about initing members before base classes... d = new AppLogPrivate(); if (!d) THROW(AppLogException("Memory allocation problem")); d->_nomeFile = ""; d->_logDirectly = logDirectly; #ifndef WIN32 d->_logPipe = usePipe; #else d->_logPipe = false; #endif // level string to level value // assoc["emerg"] = levelEmergency; // assoc["alert"] = levelAlert; // assoc["critical"] = levelCritical; // assoc["error"] = levelError; // assoc["warn"] = levelWarning; // assoc["notice"] = levelNotice; // assoc["info"] = levelInfo; // assoc["debug"] = levelDebug; if (logFileName) d->_nomeFile = logFileName; if (!d->_logDirectly && logFileName) d->_pLogger = new logger(logFileName, d->_logPipe); else d->_pLogger = NULL; // writes to file directly if (!d->_nomeFile.empty() && d->_logDirectly) { if (!d->_logPipe) { d->_logfs.open(d->_nomeFile.c_str(), std::fstream::in | std::fstream::out); if (!d->_logfs.is_open()) { d->_logfs.open(d->_nomeFile.c_str(), std::fstream::out | std::fstream::app); } else d->_logfs.seekg(0, std::fstream::end); } // on Windows pipe are not used as they are not supported on WinNT #ifndef WIN32 else { // create pipe int err = mkfifo(d->_nomeFile.c_str(), S_IREAD | S_IWRITE); if (err == 0 || errno == EEXIST) { // and open it d->_logfs.open(d->_nomeFile.c_str(), std::fstream::in | std::fstream::out); } else THROW(AppLogException("Can't create pipe")); } #endif if (d->_logfs.fail()) THROW(AppLogException("Can't open log file name")); } //from Error level on write to syslog also slog.level(Slog::levelError); slog.clogEnable(false); } AppLog::~AppLog() { // if _logDirectly close(); if (d) delete d; } void AppLog::subscribe() { ost::MutexLock mtx(d->_subMutex); Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) { // subscribes new thread d->_logs[tid]; } } } void AppLog::unsubscribe() { ost::MutexLock mtx(d->_subMutex); Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt != d->_logs.end()) { // unsubscribes thread d->_logs.erase(logIt); } } } #ifndef WIN32 void AppLog::logFileName(const char* FileName, bool logDirectly, bool usePipe) #else void AppLog::logFileName(const char* FileName, bool logDirectly) #endif { if (!FileName) { slog.error("Null file name!"); return; } d->_lock.enterMutex(); d->_nomeFile = FileName; close(); d->_logDirectly = logDirectly; #ifndef WIN32 d->_logPipe = usePipe; #else d->_logPipe = false; #endif if (!d->_logDirectly) { d->_nomeFile = FileName; if (d->_pLogger) d->_pLogger->logFileName(FileName, d->_logPipe); else d->_pLogger = new logger(FileName, d->_logPipe); d->_lock.leaveMutex(); return; } // log directly if (!d->_nomeFile.empty()) { if (!d->_logPipe) { d->_logfs.open(d->_nomeFile.c_str(), std::fstream::out | std::fstream::app); } #ifndef WIN32 else { // create pipe int err = mkfifo(d->_nomeFile.c_str(), S_IREAD | S_IWRITE); if (err == 0 || errno == EEXIST) { // and open it d->_logfs.open(d->_nomeFile.c_str(), std::fstream::in | std::fstream::out); } else THROW(AppLogException("Can't create pipe")); } #endif if (d->_logfs.fail()) THROW(AppLogException("Can't open log file name")); } d->_lock.leaveMutex(); } // writes to log void AppLog::writeLog(bool endOfLine) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; if ((d->_logDirectly && !d->_logfs.is_open() && !logIt->second._clogEnable) || (!d->_logDirectly && !d->_pLogger && !logIt->second._clogEnable)) { logIt->second._msgpos = 0; logIt->second._msgbuf[0] = '\0'; return; } if (logIt->second._enable) { time_t now; struct tm *dt; time(&now); struct timeval detail_time; gettimeofday(&detail_time, NULL); dt = localtime(&now); char buf[50]; const char *p = "unknown"; switch (logIt->second._priority) { case Slog::levelEmergency: p = "emerg"; break; case Slog::levelInfo: p = "info"; break; case Slog::levelError: p = "error"; break; case Slog::levelAlert: p = "alert"; break; case Slog::levelDebug: p = "debug"; break; case Slog::levelNotice: p = "notice"; break; case Slog::levelWarning: p = "warn"; break; case Slog::levelCritical: p = "crit"; break; } snprintf(buf, sizeof(buf) - 1, "%04d-%02d-%02d %02d:%02d:%02d.%03d ", dt->tm_year + 1900, dt->tm_mon + 1, dt->tm_mday, dt->tm_hour, dt->tm_min, dt->tm_sec, (int)(detail_time.tv_usec / 1000)); buf[sizeof(buf)-1] = 0; // per sicurezza if (d->_logDirectly) { d->_lock.enterMutex(); if (d->_logfs.is_open()) { d->_logfs << buf; if (!logIt->second._ident.empty()) d->_logfs << logIt->second._ident.c_str() << ": "; d->_logfs << "[" << p << "] "; d->_logfs << logIt->second._msgbuf; if (endOfLine) d->_logfs << endl; d->_logfs.flush(); } } else if (d->_pLogger) { // ThreadQueue std::stringstream sstr; sstr.str(""); // reset contents sstr << buf; if (!logIt->second._ident.empty()) sstr << logIt->second._ident.c_str() << ": "; sstr << "[" << p << "] "; sstr << logIt->second._msgbuf; if (endOfLine) sstr << endl; sstr.flush(); if (sstr.fail()) cerr << "stringstream failed!!!! " << endl; // enqueues log message d->_pLogger->post((void *) sstr.str().c_str(), sstr.str().length() + 1); d->_lock.enterMutex(); } // slog it if error level is right if (logIt->second._slogEnable && logIt->second._priority <= Slog::levelError) { slog((Slog::Level) logIt->second._priority) << logIt->second._msgbuf; if (endOfLine) slog << endl; } if (logIt->second._clogEnable #ifndef WIN32 && (getppid() > 1) #endif ) { clog << logIt->second._msgbuf; if (endOfLine) clog << endl; } d->_lock.leaveMutex(); } logIt->second._msgpos = 0; logIt->second._msgbuf[0] = '\0'; } } void AppLog::close(void) { if (d->_logDirectly) { d->_lock.enterMutex(); if (d->_logfs.is_open()) { d->_logfs.flush(); d->_logfs.close(); } d->_lock.leaveMutex(); } } void AppLog::open(const char *ident) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; if (d->_nomeFile.empty()) { std::cerr << "Empty file name" << std::endl; slog.emerg("Empty file nane!\n"); } if (d->_logDirectly) { d->_lock.enterMutex(); if (!d->_logfs.is_open()) { d->_logfs.open(d->_nomeFile.c_str(), std::fstream::out | std::fstream::app); } if (!d->_logfs.is_open()) { std::cerr << "Can't open file name!" << std::endl; slog.emerg("Can't open file name!\n"); } d->_lock.leaveMutex(); } if (ident != NULL) logIt->second._ident = ident; } } void AppLog::identLevel(const char *ident, Slog::Level level) { if (!ident) return; string id = ident; IdentLevel::iterator idLevIt = d->_identLevel.find(id); if (idLevIt == d->_identLevel.end()) { d->_identLevel[id] = level; } else idLevIt->second = level; } void AppLog::level(Slog::Level enable) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; logIt->second._level = enable; } } void AppLog::clogEnable(bool f) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; logIt->second._clogEnable = f; } } void AppLog::slogEnable(bool en) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; logIt->second._slogEnable = en; } } int AppLog::sync() { int retVal = (pbase() != pptr()); if (fail()) { slog(Slog::levelNotice) << "fail() is true, calling clear()" << endl; clear(); } Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt != d->_logs.end()) { retVal = (logIt->second._msgpos > 0); if (retVal) { slog(Slog::levelNotice) << "sync called and msgpos > 0" << endl; } } } overflow(EOF); return retVal; } int AppLog::overflow(int c) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return c; if (!logIt->second._enable) return c; if (c == '\n' || !c || c == EOF) { if (!logIt->second._msgpos) { if (c == '\n') writeLog(true); return c; } if (logIt->second._msgpos < (int)(sizeof(logIt->second._msgbuf) - 1)) logIt->second._msgbuf[logIt->second._msgpos] = 0; else logIt->second._msgbuf[logIt->second._msgpos-1] = 0; writeLog(c == '\n'); //reset buffer logIt->second._msgpos = 0; return c; } if (logIt->second._msgpos < (int)(sizeof(logIt->second._msgbuf) - 1)) logIt->second._msgbuf[logIt->second._msgpos++] = c; } return c; } #ifdef HAVE_SNPRINTF void AppLog::error(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; error(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); if (logIt->second._slogEnable) slog.error(logIt->second._msgbuf); va_end(args); } } void AppLog::warn(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; warn(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); if (logIt->second._slogEnable) slog.warn(logIt->second._msgbuf); va_end(args); } } void AppLog::debug(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; debug(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); va_end(args); } } void AppLog::emerg(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; emerg(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); if (logIt->second._slogEnable) slog.emerg(logIt->second._msgbuf); va_end(args); } } void AppLog::alert(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; alert(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); if (logIt->second._slogEnable) slog.alert(logIt->second._msgbuf); va_end(args); } } void AppLog::critical(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; critical(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); if (logIt->second._slogEnable) slog.critical(logIt->second._msgbuf); va_end(args); } } void AppLog::notice(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; notice(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); if (logIt->second._slogEnable) slog.notice(logIt->second._msgbuf); va_end(args); } } void AppLog::info(const char *format, ...) { va_list args; Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return; info(); if (!logIt->second._enable) return; overflow(EOF); va_start(args, format); logIt->second._msgbuf[logStruct::BUFF_SIZE-1] = '\0'; logIt->second._msgpos = vsnprintf(logIt->second._msgbuf, logStruct::BUFF_SIZE, format, args); if (logIt->second._msgpos > logStruct::BUFF_SIZE - 1) logIt->second._msgpos = logStruct::BUFF_SIZE - 1; overflow(EOF); va_end(args); } } #endif //HAVE_SNPRINTF AppLog &AppLog::operator()(Slog::Level lev) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return *this; // needed? overflow(EOF); // enables log Slog::Level th_lev = logIt->second._level; logIt->second._enable = (th_lev >= lev); // is there a log level per module? if (!logIt->second._ident.empty()) { std::string st = logIt->second._ident; IdentLevel::iterator idLevIt = d->_identLevel.find(st); if (idLevIt != d->_identLevel.end()) { th_lev = idLevIt->second; logIt->second._enable = (th_lev >= lev); } } logIt->second._priority = lev; } return *this; } AppLog &AppLog::operator()(const char *ident, Slog::Level lev) { Thread *pThr = getThread(); if (pThr) { cctid_t tid = pThr->getId(); LogPrivateData::iterator logIt = d->_logs.find(tid); if (logIt == d->_logs.end()) return this->operator()(lev); logIt->second._enable = true; open(ident); } return this->operator()(lev); } AppLog& AppLog::operator<< (AppLog& (*pfManipulator)(AppLog&)) { return (*pfManipulator)(*this); } AppLog& AppLog::operator<< (ostream& (*pfManipulator)(ostream&)) { (*pfManipulator)(*(dynamic_cast(this))); return *this ; } #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/keydata.cpp0000644000175000017500000003660611463377550013462 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include "private.h" #include #include #ifndef CAPE_REGISTRY_APPLICATIONS #define CAPE_REGISTRY_APPLICATIONS "SOFTWARE\\CAPE Applications" #define CAPE_REGISTRY_USERSETTINGS "Software\\CAPE Applications" #endif #ifdef WIN32 class Registry { public: const char *configdir; Registry(); }; Registry::Registry() { configdir = getenv("SystemRoot"); if(!configdir || !*configdir) configdir = getenv("windir"); if(!configdir || !*configdir) configdir = "C:\\WINDOWS"; } static Registry registry; #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif int Keydata::count = 0; int Keydata::sequence = 1; ifstream *Keydata::cfgFile = NULL; char Keydata::lastpath[KEYDATA_PATH_SIZE + 1]; void endKeydata(); static unsigned bitsize(void) { if(sizeof(void *) > 4) return 2; return 1; } Keydata::Keydata() : MemPager(KEYDATA_PAGER_SIZE * bitsize()) { link = 0; memset(&keys, 0, sizeof(keys)); } Keydata::Keydata(const char *path) : MemPager(KEYDATA_PAGER_SIZE * bitsize()) { link = 0; memset(&keys, 0, sizeof(keys)); load(path); } Keydata::Keydata(Define *pairs, const char *path) : MemPager(KEYDATA_PAGER_SIZE * bitsize()) { link = 0; memset(&keys, 0, sizeof(keys)); load(pairs); if(path) load(path); } Keydata::~Keydata() { clean(); unlink(); if(count < 1) endKeydata(); } Keydata::Keysym *Keydata::getSymbol(const char *sym, bool create) { unsigned path = getIndex(sym); size_t len = strlen(sym) + 1; Keysym *key = keys[path]; while(key) { if(!stricmp(sym, key->sym)) return key; key = key->next; } if(!create) return NULL; // note: keysym has 1 byte for null character already key = (Keysym *)alloc(sizeof(Keysym) + len - 1); setString(key->sym, len, sym); key->count = 0; key->next = keys[path]; key->data = NULL; key->list = NULL; keys[path] = key; return key; } unsigned Keydata::getIndex(const char *str) { unsigned key = 0; while(*str) key = (key << 1) ^ (*(str++) & 0x1f); return key % KEYDATA_INDEX_SIZE; } int Keydata::getCount(const char *sym) { Keysym *key = getSymbol(sym, false); if(!key) return 0; return key->count; } const char *Keydata::getFirst(const char *sym) { Keysym *key = getSymbol(sym, false); Keyval *val; if(!key) return NULL; val = key->data; if(!val) return NULL; while(val->next) val = val->next; return val->val; } const char *Keydata::getString(const char *sym, const char *def) { const char *cp = getLast(sym); if(!cp) return def; return cp; } long Keydata::getLong(const char *sym, long def) { const char *cp = getLast(sym); if(!cp) return def; return atol(cp); } double Keydata::getDouble(const char *sym, double def) { const char *cp = getLast(sym); if(!cp) return def; return atof(cp); } bool Keydata::getBool(const char *sym) { const char *cp = getLast(sym); if(!cp) return false; switch(*cp) { case 'y': case 'Y': case 't': case 'T': return true; default: return false; } } bool Keydata::isKey(const char *sym) { if(getLast(sym)) return true; return false; } const char *Keydata::getLast(const char *sym) { Keysym *key = getSymbol(sym, false); if(!key) return NULL; if(!key->data) return NULL; return key->data->val; } unsigned Keydata::getCount(void) { unsigned icount = 0; Keysym *key; int idx; for(idx = 0; idx < KEYDATA_INDEX_SIZE; ++idx) { key = keys[idx]; while(key) { ++icount; key = key->next; } } return icount; } unsigned Keydata::getIndex(char **data, unsigned max) { int idx; Keysym *key; unsigned icount = 0; for(idx = 0; idx < KEYDATA_INDEX_SIZE; ++idx) { if(icount >= max) break; key = keys[idx]; while(key && icount < max) { *(data++) = key->sym; ++icount; key = key->next; } } *data = NULL; return icount; } void Keydata::setValue(const char *sym, const char *data) { size_t len = strlen(data) + 1; Keysym *key = getSymbol(sym, true); Keyval *val; if(!data) data = ""; // note keyval has 1 byte for null already val = (Keyval *)alloc(sizeof(Keyval) + len - 1); ++key->count; key->list = NULL; val->next = key->data; key->data = val; setString(val->val, len, data); } const char *const *Keydata::getList(const char *sym) { int icount; Keysym *key = getSymbol(sym, false); Keyval *data; if(!key) return NULL; icount = key->count; if(!icount) return NULL; ++icount; if(!key->list) { key->list =(const char **)first(sizeof(const char**) * icount); key->list[--icount] = NULL; data = key->data; while(icount && data) { key->list[--icount] = data->val; data = data->next; } while(icount) key->list[--icount] = ""; } return key->list; } void Keydata::clrValue(const char *sym) { Keysym *key = getSymbol(sym, false); if(!key) return; key->count = 0; key->list = NULL; key->data = NULL; } void Keydata::load(Define *defs) { Keysym *key; while(defs->keyword) { key = getSymbol(defs->keyword, true); if(!key->data) setValue(defs->keyword, defs->value); ++defs; } } void Keydata::load(const char *keypath) { loadPrefix(NULL, keypath); } void Keydata::loadPrefix(const char *pre, const char *keypath) { // FIXME: use string of dinamic allocation char path[KEYDATA_PATH_SIZE]; char seek[33]; const char *prefix = NULL; const char *ext; #ifdef WIN32 const char *ccp; #endif char *cp; bool etcpath = false, etctest = false; #ifndef WIN32 struct stat ino; #endif path[0] = 0; #ifdef WIN32 HKEY key; LONG value; DWORD keynamelen, keytextlen; TCHAR keyname[256]; TCHAR keytext[256]; DWORD keyindex = 0; char *regprefix = getenv("CONFIG_REGISTRY"); if(!regprefix) regprefix=""; ccp = keypath; if(*ccp == '~') { ++ccp; if(*ccp == '/') ++ccp; snprintf(path, sizeof(path), CAPE_REGISTRY_USERSETTINGS "/%s%s/", regprefix, ccp); } else { if(*ccp == '/') ++ccp; snprintf(path, sizeof(path), CAPE_REGISTRY_APPLICATIONS "/%s%s/", regprefix, ccp); } cp = path; while(NULL != (cp = strchr(cp, '/'))) *cp = '\\'; if(*keypath == '~') value = RegOpenKey(HKEY_CURRENT_USER, path, &key); else value = RegOpenKey(HKEY_LOCAL_MACHINE, path, &key); // if registry key path is found, then we use registry values // and ignore .ini files... if(value == ERROR_SUCCESS) { for(;;) { keynamelen = 256; value = RegEnumKeyEx(key, keyindex, keyname, &keynamelen, NULL, NULL, NULL, NULL); if(value != ERROR_SUCCESS) break; keytextlen = 256; keytext[0] = '\0'; value = RegEnumValue(key, keyindex++, keytext, &keytextlen, NULL, NULL, NULL, NULL); if(value != ERROR_SUCCESS) continue; if(pre) { snprintf(path, sizeof(path), "%s.%s", pre, keyname); setValue(path, keytext); } else setValue(keyname, keytext); } RegCloseKey(key); return; } // windows will not support subdir .ini tree; now if not in // registry, then assume unavailable ccp = strchr(keypath + 3, '/'); if(ccp) ccp = strchr(ccp, '/'); if(ccp) return; if(*keypath == '~') { prefix = getenv("USERPROFILE"); if(!prefix) return; setString(path, sizeof(path) - 8, prefix); addString(path, sizeof(path), "\\"); ++keypath; cp = path; while(NULL != (cp = strchr(cp, '\\'))) *cp = '/'; } #else if(*keypath == '~') { prefix = getenv("HOME"); if(!prefix) return; setString(path, sizeof(path) - 8, prefix); addString(path, sizeof(path), "/."); ++keypath; } #endif if(!prefix) { #ifdef WIN32 if(!prefix || !*prefix) prefix = registry.configdir; #else retry: #ifdef ETC_CONFDIR if(!prefix || !*prefix) { if(etcpath) prefix = ETC_PREFIX; else prefix = ETC_CONFDIR; etctest = true; if(!stricmp(ETC_PREFIX, ETC_CONFDIR)) etcpath = true; } #else if(!prefix || !*prefix) { etctest = true; prefix = ETC_PREFIX; } #endif #endif setString(path, sizeof(path) - 8, prefix); #ifdef WIN32 cp = path; while(NULL != (cp = strchr(cp, '\\'))) *cp = '/'; cp = path + strlen(path) - 1; if(*cp != '/') { *(++cp) = '/'; *(++cp) = 0; } #endif prefix = NULL; } if(*keypath == '/' || *keypath == '\\') ++keypath; addString(path, sizeof(path), keypath); cp = strrchr(path, '/'); setString(seek, sizeof(seek), cp + 1); *cp = 0; ext = strrchr(path, '/'); if(ext) ext = strrchr(ext + 2, '.'); else ext = strrchr(path + 1, '.'); #ifdef WIN32 if(!ext) addString(path, sizeof(path), ".ini"); #else if(!prefix && !ext) addString(path, sizeof(path), ".conf"); else if(prefix && !ext) addString(path, sizeof(path), "rc"); ino.st_uid = (unsigned)-1; if(stat(path, &ino) < 0 && etctest && !etcpath) { etcpath = true; goto retry; } // if root, make sure root owned config... if(!geteuid() && ino.st_uid) return; // if root, make sure from a etc path only... if(!geteuid() && !etctest) return; #endif loadFile(path, seek, pre); } void Keydata::loadFile(const char *path, const char *keys, const char *pre) { char seek[33]; char find[33]; char line[256]; char buffer[256]; char *cp, *ep; int fpos; if(keys) setString(seek, sizeof(seek), keys); else seek[0] = 0; if(strcmp(path, lastpath)) { endKeydata(); if(canAccess(path)) cfgFile->open(path, ios::in); else return; if(!cfgFile->is_open()) return; setString(lastpath, sizeof(lastpath), path); } if(link != sequence) { link = sequence; ++count; } find[0] = 0; cfgFile->seekg(0); while(keys && stricmp(seek, find)) { cfgFile->getline(line, sizeof(line) - 1); if(cfgFile->eof()) { lastpath[0] = 0; cfgFile->close(); cfgFile->clear(); return; } cp = line; while(*cp == ' ' || *cp == '\n' || *cp == '\t') ++cp; if(*cp != '[') continue; ep = strchr(cp, ']'); if(ep) *ep = 0; else continue; setString(find, 32, ++cp); } for(;;) { if(cfgFile->eof()) { lastpath[0] = 0; cfgFile->close(); cfgFile->clear(); return; } cfgFile->getline(line, sizeof(line) - 1); cp = line; while(*cp == ' ' || *cp == '\t' || *cp == '\n') ++cp; if(!*cp || *cp == '#' || *cp == ';' || *cp == '!') continue; if(*cp == '[') return; fpos = 0; while(*cp && *cp != '=') { if(*cp == ' ' || *cp == '\t') { ++cp; continue; } find[fpos] = *(cp++); if(fpos < 32) ++fpos; } find[fpos] = 0; if(*cp != '=') continue; ++cp; while(*cp == ' ' || *cp == '\t' || *cp == '\n') ++cp; ep = cp + strlen(cp); while((--ep) > cp) { if(*ep == ' ' || *ep == '\t' || *ep == '\n') *ep = 0; else break; } if(*cp == *ep && (*cp == '\'' || *cp == '\"')) { ++cp; *ep = 0; } if(pre) { #ifdef HAVE_SNPRINTF snprintf(buffer, 256, "%s.%s", pre, find); #else setString(buffer, 256, pre); addString(buffer, 256, "."); addString(buffer, 256, find); #endif setValue(buffer, cp); } else setValue(find, cp); } } void Keydata::unlink(void) { if(link != sequence) { link = 0; return; } link = 0; --count; } void Keydata::end(void) { Keydata::count = 0; ++Keydata::sequence; if(!Keydata::sequence) ++Keydata::sequence; Keydata::lastpath[0] = 0; if(!Keydata::cfgFile) Keydata::cfgFile = new std::ifstream(); else if(Keydata::cfgFile->is_open()) { Keydata::cfgFile->close(); Keydata::cfgFile->clear(); } } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/lockfile.cpp0000644000175000017500000001357011463400125013604 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include #include #include #ifdef CCXX_NAMESPACES namespace ost { #endif #ifdef WIN32 Lockfile::Lockfile() { _mutex = INVALID_HANDLE_VALUE; _flagged = false; } Lockfile::Lockfile(const char *name) { _mutex = INVALID_HANDLE_VALUE; _flagged = false; lock(name); } bool Lockfile::lock(const char *name) { char mname[65]; char *ext = strrchr((char *)name, '/'); if(ext) name = ++ext; unlock(); snprintf(mname, sizeof(mname) - 4, "_lock_%s", name); ext = strrchr(mname, '.'); if(ext && !stricmp(ext, ".lock")) { *ext = 0; ext = NULL; } if(!ext) addString(mname, sizeof(mname), ".lck"); _mutex = CreateMutex(NULL, FALSE, mname); if(WaitForSingleObject(_mutex, 200) == WAIT_OBJECT_0) _flagged = true; return _flagged; } void Lockfile::unlock(void) { if(_mutex == INVALID_HANDLE_VALUE) return; if(_flagged) ReleaseMutex(_mutex); CloseHandle(_mutex); _flagged = false; _mutex = INVALID_HANDLE_VALUE; } bool Lockfile::isLocked(void) { return _flagged; } #else Lockfile::Lockfile() { _path = NULL; } Lockfile::Lockfile(const char *name) { _path = NULL; lock(name); } bool Lockfile::lock(const char *name) { struct stat ino; int fd, pid, status; const char *ext; char buffer[128]; bool rtn = true; unlock(); ext = strrchr(name, '/'); if(ext) ext = strrchr(ext, '.'); else ext = strrchr(name, '.'); if(strchr(name, '/')) { _path = new char[strlen(name) + 1]; strcpy(_path, name); } else if(ext && !stricmp(ext, ".pid")) { if(stat("/var/run", &ino)) snprintf(buffer, sizeof(buffer), "/tmp/.%s", name); else snprintf(buffer, sizeof(buffer), "/var/run/%s", name); _path = new char[strlen(buffer) + 1]; strcpy(_path, buffer); } else { if(!ext) ext = ".lock"; if(stat("/var/lock", &ino)) snprintf(buffer, sizeof(buffer), "/tmp/.%s%s", name, ext); else snprintf(buffer, sizeof(buffer), "/var/lock/%s%s", name, ext); _path = new char[strlen(buffer) + 1]; strcpy(_path, buffer); } for(;;) { fd = ::open(_path, O_WRONLY | O_CREAT | O_EXCL, 0660); if(fd > 0) { pid = getpid(); snprintf(buffer, sizeof(buffer), "%d\n", pid); if(::write(fd, buffer, strlen(buffer))) rtn = false; ::close(fd); return rtn; } if(fd < 0 && errno != EEXIST) { delete[] _path; return false; } fd = ::open(_path, O_RDONLY); if(fd < 0) { if(errno == ENOENT) continue; delete[] _path; return false; } Thread::sleep(2000); status = ::read(fd, buffer, sizeof(buffer) - 1); if(status < 1) { ::close(fd); continue; } buffer[status] = 0; pid = atoi(buffer); if(pid) { if(pid == getpid()) { status = -1; errno = 0; } else status = kill(pid, 0); if(!status || (errno == EPERM)) { ::close(fd); delete[] _path; return false; } } ::close(fd); ::unlink(_path); } } void Lockfile::unlock(void) { if(_path) { remove(_path); delete[] _path; _path = NULL; } } bool Lockfile::isLocked(void) { if(_path) return true; return false; } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/pointer.cpp0000644000175000017500000000606711463401707013506 00000000000000// Copyright (C) 2004-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif RefObject::~RefObject() {} void RefPointer::enterLock(void) {} void RefPointer::leaveLock(void) {} void RefPointer::detach(void) { if(ref) { enterLock(); --(ref->refCount); if(!ref->refCount) delete ref; leaveLock(); ref = NULL; } } RefPointer::RefPointer(RefObject *obj) { enterLock(); ++obj->refCount; leaveLock(); ref = obj; } RefPointer::RefPointer(const RefPointer &ptr) { detach(); ref = ptr.ref; if(ref) { enterLock(); ++ref->refCount; leaveLock(); } } RefPointer::~RefPointer() { detach(); } void *RefPointer::getObject() const { if(ref) return ref->getObject(); return NULL; } bool RefPointer::operator!() const { if(ref && ref->refCount == 1) return true; return false; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/digest.cpp0000644000175000017500000001330111463374641013300 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include #include #ifdef WIN32 #include #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif Digest::Digest() : streambuf() #ifdef HAVE_OLD_IOSTREAM ,ostream() #else ,ostream((streambuf *)this) #endif { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif } Digest::~Digest() { } ChecksumDigest::ChecksumDigest() : Digest() { csum = 0; } int ChecksumDigest::overflow(int c) { csum += c; return c; } unsigned ChecksumDigest::getDigest(unsigned char *buffer) { *buffer = csum; return 1; } void ChecksumDigest::putDigest(const unsigned char *buffer, unsigned len) { while(len--) csum += *(buffer++); } ostream &ChecksumDigest::strDigest(ostream &os) { char buf[3]; sprintf(buf, "%02x", csum); os << buf; return os; } CRC16Digest::CRC16Digest() : Digest() { crc16 = 0; } CRC16Digest::CRC16Digest (const CRC16Digest &crc ) : Digest() { crc16 = crc.crc16; } CRC16Digest& CRC16Digest::operator= ( const CRC16Digest &right ) { if ( this == &right ) return *this; crc16 = right.crc16; return *this; } int CRC16Digest::overflow ( int c ) { crc16 = ( unsigned char ) ( crc16 >> 8 ) | ( crc16 << 8 ); crc16 ^= ( unsigned char ) ( c ); crc16 ^= ( unsigned char ) ( crc16 & 0xff ) >> 4; crc16 ^= ( crc16 << 8 ) << 4; crc16 ^= ( ( crc16 & 0xff ) << 4 ) << 1; return c; } unsigned CRC16Digest::getDigest ( unsigned char *buffer ) { memcpy ( buffer, &crc16, sizeof(crc16) ); return sizeof(crc16); } void CRC16Digest::putDigest ( const unsigned char *buffer, unsigned len ) { while (len--) overflow (*buffer++); } ostream &CRC16Digest::strDigest ( ostream &os ) { return os << std::setw(4) << std::setfill('0') << std::hex << (unsigned)crc16 << std::dec; } CRC32Digest::CRC32Digest() : Digest() { initDigest(); crc32 = 0; } CRC32Digest::CRC32Digest(const CRC32Digest &crc) : Digest() { crc32 = crc.crc32; crc_reg = crc.crc_reg; register int32 i; for (i = 0; i < 256; i++) { crc_table[i] = crc.crc_table[i]; } } void CRC32Digest::initDigest(void) { // the generator polynomial used here is the same as Ethernet // x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1 const uint32 POLYNOMIAL = 0x04C11DB7; // Initialize the accumulator to all ones crc_reg = 0xFFFFFFFF; // Initialize the lookup table register int32 i,j; register uint32 crc; for (i = 0; i < 256; i++) { crc = ( (uint32) i << 24 ); for (j = 0; j < 8; j++) { if (crc & 0x80000000) crc = (crc << 1) ^ POLYNOMIAL; else crc <<= 1; } crc_table[i] = crc; } } unsigned char CRC32Digest::overflow(unsigned char octet) { crc_reg = crc_table[((crc_reg >> 24) ^ octet) & 0xFF] ^ (crc_reg << 8); crc32 = ~crc_reg; return octet; } unsigned CRC32Digest::getDigest(unsigned char *buffer) { memcpy(buffer, &crc32, sizeof(crc32)); return sizeof(crc32); } void CRC32Digest::putDigest(const unsigned char *buffer, unsigned len) { while(len--) overflow(*buffer++); } ostream& CRC32Digest::strDigest(ostream &os) { return os << std::setw(8) << std::setfill('0') << std::hex << (unsigned)crc32 << std::dec; } CRC32Digest& CRC32Digest::operator= (const CRC32Digest &right) { if ( this == &right ) return *this; crc32 = right.crc32; crc_reg = right.crc_reg; register int32 i; for (i = 0; i < 256; i++) { crc_table[i] = right.crc_table[i]; } return *this; } #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/mempager.cpp0000644000175000017500000001631611463400564013621 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { using std::endl; #endif const static size_t palign = __BYTE_ALIGNMENT; #if defined(HAVE_POSIX_MEMALIGN) && __BYTE_ALIGNMENT < 2 #undef HAVE_POSIX_MEMALIGN #endif #ifdef HAVE_POSIX_MEMALIGN static volatile size_t malign = 0; #endif MemPager::MemPager(size_t pg) { pagesize = ((pg + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *); pages = 1; #ifdef COMMON_MEMORY_AUDIT slog(Slog::levelDebug) << "MemPager: creating pool, id=" << this << endl; slog(Slog::levelDebug) << "MemPager: alloc, id=" << this << " page=" << page << endl; #endif #if defined(HAVE_POSIX_MEMALIGN) unsigned p2 = 2; if(!malign) { while(p2 < sizeof(void *)) p2 *= 2; while(((p2 / sizeof(void *)) * sizeof(void *)) != p2) p2 *= 2; malign = p2; } posix_memalign((void **)&page, malign, pagesize); #else page = (struct _page *)::new void *[pagesize / sizeof(void *)]; #endif page->next = NULL; page->used = sizeof(struct _page); } MemPager::~MemPager() { clean(); } void MemPager::clean(void) { struct _page *root = page; while(root) { page = page->next; #ifdef COMMON_MEMORY_AUDIT slog(Slog::levelDebug) << "MemPager: delete, id=" << this << " page=" << root << endl; #endif #ifdef HAVE_POSIX_MEMALIGN ::free(root); #else delete[] root; #endif root = page; } #ifdef COMMON_MEMORY_AUDIT slog(Slog::levelDebug) << "Mempager: destroy pool, id=" << this << endl; #endif } void MemPager::purge(void) { struct _page *root = page; while(root->next) { page = root->next; #ifdef COMMON_MEMORY_AUDIT slog(Slog::levelDebug) << "Mempager: delete, id=" << this << " page=" << root << endl; #endif #ifdef HAVE_POSIX_MEMALIGN ::free(root); #else delete[] root; #endif --pages; root = page; } page->used = sizeof(struct _page); } void *MemPager::alloc(size_t size) { char *ptr; struct _page *npage; #if __BYTE_ALIGNMENT > 1 size_t align = size % palign; if (align) size += palign - align; #endif if(size > pagesize - sizeof(struct _page)) { slog.critical("mempager overflow"); #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) throw this; #ifdef COMMON_STD_EXCEPTION else if(Thread;:getException() == Thread::throwException) Throw Exception("Mempager::alloc(): Memory Overflow"); #endif #else abort(); #endif } if(page->used + size > pagesize) { #if defined(HAVE_POSIX_MEMALIGN) posix_memalign((void **)&npage, malign, pagesize); #else npage = (struct _page *) ::new void *[pagesize / sizeof(void *)]; #endif #ifdef COMMON_MEMORY_AUDIT slog(Slog::levelDebug) << "MemPager: alloc, id=" << this << " page=" << npage << endl; #endif npage->next = page; npage->used = sizeof(struct _page); page = npage; ++pages; } ptr = (char *)page; ptr += page->used; page->used += size; return (void *)ptr; } void *MemPager::first(size_t size) { struct _page *npage = page; char *ptr; #if __BYTE_ALIGNMENT > 1 size_t align = size % palign; if (align) size += palign - align; #endif while(npage) { if(npage->used + size <= pagesize) break; npage = npage->next; } if(!npage) return alloc(size); ptr = (char *)npage; ptr += npage->used; npage->used += size; return (void *)ptr; } char *MemPager::alloc(const char *str) { size_t len = strlen(str) + 1; char *cp = (char *)alloc(len); return setString(cp, len, str); } char *MemPager::first(char *str) { size_t len = strlen(str) + 1; char *cp = (char *)first(len); return setString(cp, len, str); } StackPager::StackPager(size_t pg) : MemPager(pg) { stack = NULL; } void StackPager::purge(void) { MemPager::purge(); stack = NULL; } void *StackPager::pull(void) { frame_t *object = stack; if(!stack) { purge(); return NULL; } stack = object->next; return object->data; } void *StackPager::push(const void* object, size_t len) { frame_t *frame = (frame_t *)alloc(len + sizeof(frame_t) - 1); if(!frame) return NULL; frame->next = stack; stack = frame; memcpy(frame->data, object, len); return (void *)frame->data; } void *StackPager::push(const char *string) { return push(string, strlen(string) + 1); } SharedMemPager::SharedMemPager(size_t pg, const char *name) : MemPager(pg), Mutex(name) {} void SharedMemPager::purge(void) { enterMutex(); MemPager::purge(); leaveMutex(); } void *SharedMemPager::first(size_t size) { void *mem; enterMutex(); mem = MemPager::first(size); leaveMutex(); return mem; } void *SharedMemPager::alloc(size_t size) { void *mem; enterMutex(); mem = MemPager::alloc(size); leaveMutex(); return mem; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/file.cpp0000644000175000017500000011510311463377147012747 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // // needed for GNU/LINUX glibc otherwise pread/pwrite wont work #ifdef __linux__ #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 500 #endif /* * on old glibc's, this has to be * defined explicitly */ #ifndef _XOPEN_SOURCE_EXTENDED #define _XOPEN_SOURCE_EXTENDED #endif #endif #include #include #include #include #include #include #include "private.h" #ifdef __BORLANDC__ #include #include #else #include #include #endif #include #include #ifndef WIN32 #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_FILE_H #include #endif #ifdef HAVE_SYS_LOCKF_H #include #endif #ifdef COMMON_AIX_FIXES #undef LOCK_EX #undef LOCK_SH #endif #ifdef MACOSX #define MISSING_LOCKF #endif #ifndef F_LOCK #define MISSING_LOCKF enum { F_ULOCK = 1, F_LOCK, F_TLOCK, F_TEST }; #endif #endif // ndef WIN32 #if defined(_OSF_SOURCE) && defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE > 1 #undef LOCK_EX #undef LOCK_SH #endif #if 0 /* * not used anymore ? (hen) */ static const char *clearfile(const char *pathname) { remove(pathname); return pathname; } static const char *clearfifo(const char *pathname, int mode) { remove(pathname); mkfifo(pathname, mode); return pathname; } #endif #ifdef CCXX_NAMESPACES namespace ost { #endif RandomFile::RandomFile(const char *name) : Mutex(name) { #ifdef WIN32 fd = INVALID_HANDLE_VALUE; // immediate is not defined on Win32 #else fd = -1; flags.immediate = false; #endif flags.thrown = flags.initial = flags.temp = false; flags.count = 0; pathname = NULL; } RandomFile::RandomFile(const RandomFile &rf) : Mutex() { // first, `dup'-licate the file descriptor/handle #ifdef WIN32 HANDLE pidHandle = GetCurrentProcess(); HANDLE dupHandle; if(rf.fd != INVALID_HANDLE_VALUE) { if(!DuplicateHandle(pidHandle, rf.fd, pidHandle, &dupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) fd = INVALID_HANDLE_VALUE; else fd = dupHandle; } else fd = INVALID_HANDLE_VALUE; #else if(rf.fd > -1) fd = dup(rf.fd); else fd = -1; #endif flags = rf.flags; flags.count = 0; if(rf.pathname) pathname = newString(rf.pathname); else pathname = NULL; } RandomFile::~RandomFile() { final(); } File::Error RandomFile::restart(void) { return errOpenFailed; } File::Attr RandomFile::initialize(void) { return attrPublic; } void RandomFile::final(void) { #ifdef WIN32 if(fd != INVALID_HANDLE_VALUE) { CloseHandle(fd); if(flags.temp && pathname) DeleteFile(pathname); } #else if(fd > -1) { close(fd); if(flags.temp && pathname) remove(pathname); } #endif if(pathname) { delString(pathname); pathname = NULL; } #ifdef WIN32 fd = INVALID_HANDLE_VALUE; #else fd = -1; #endif flags.count = 0; flags.initial = false; } RandomFile::Error RandomFile::error(Error id, char *str) { errstr = str; errid = id; if(!flags.thrown) { flags.thrown = true; #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) throw(this); #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) { if(!str) str = (char *)""; throw FileException(str); } #endif #endif } return id; } bool RandomFile::initial(void) { bool init; #ifdef WIN32 if(fd == INVALID_HANDLE_VALUE) #else if(fd < 0) #endif return false; enterMutex(); init = flags.initial; flags.initial = false; if(!init) { leaveMutex(); return false; } #ifdef WIN32 Attr access = initialize(); if(access == attrInvalid) { CloseHandle(fd); if(pathname) DeleteFile(pathname); fd = INVALID_HANDLE_VALUE; leaveMutex(); error(errInitFailed); return false; } #else int mode = (int)initialize(); if(!mode) { close(fd); fd = -1; if(pathname) remove(pathname); leaveMutex(); error(errInitFailed); return false; } fchmod(fd, mode); #endif leaveMutex(); return init; } #ifndef WIN32 RandomFile::Error RandomFile::setCompletion(Complete mode) { long flag = fcntl(fd, F_GETFL); if(fd < 0) return errNotOpened; flags.immediate = false; #ifdef O_SYNC flag &= ~(O_SYNC | O_NDELAY); #else flag &= ~O_NDELAY; #endif switch(mode) { case completionImmediate: #ifdef O_SYNC flag |= O_SYNC; #endif flags.immediate = true; break; case completionDelayed: flag |= O_NDELAY; //completionDeferred: ? (hen) case completionDeferred: break; } fcntl(fd, F_SETFL, flag); return errSuccess; } #endif off_t RandomFile::getCapacity(void) { off_t eof, pos = 0; #ifdef WIN32 if(!fd) #else if(fd < 0) #endif return 0; enterMutex(); #ifdef WIN32 pos = SetFilePointer(fd, 0l, NULL, FILE_CURRENT); eof = SetFilePointer(fd, 0l, NULL, FILE_END); SetFilePointer(fd, pos, NULL, FILE_BEGIN); #else lseek(fd, pos, SEEK_SET); pos = lseek(fd, 0l, SEEK_CUR); eof = lseek(fd, 0l, SEEK_END); #endif leaveMutex(); return eof; } bool RandomFile::operator!(void) { #ifdef WIN32 return fd == INVALID_HANDLE_VALUE; #else if(fd < 0) return true; return false; #endif } ThreadFile::ThreadFile(const char *path) : RandomFile(path) { first = NULL; open(path); } ThreadFile::~ThreadFile() { final(); fcb_t *next; while(first) { next = first->next; delete first; first = next; } } ThreadFile::Error ThreadFile::restart(void) { return open(pathname); } ThreadFile::Error ThreadFile::open(const char *path) { #ifdef WIN32 if(fd != INVALID_HANDLE_VALUE) #else if(fd > -1) #endif final(); if(path != pathname) { if(pathname) delString(pathname); pathname = newString(path); } flags.initial = false; #ifdef WIN32 fd = CreateFile(pathname, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if(fd == INVALID_HANDLE_VALUE) { flags.initial = true; fd = CreateFile(pathname, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); } if(fd == INVALID_HANDLE_VALUE) return errOpenFailed; #else fd = ::open(pathname, O_RDWR); if(fd < 0) { flags.initial = true; fd = ::open(pathname, O_CREAT | O_RDWR | O_TRUNC, (int)attrPrivate); } if(fd < 0) return error(errOpenFailed); #ifdef LOCK_EX if(flock(fd, LOCK_EX | LOCK_NB)) { close(fd); fd = -1; return error(errOpenInUse); } #endif #endif // WIN32 return errSuccess; } ThreadFile::fcb_t *ThreadFile::getFCB(void) { fcb_t *fcb = (fcb_t *)state.getKey(); if(!fcb) { fcb = new fcb_t; fcb->next = first; first = fcb; fcb->address = NULL; fcb->len = 0; fcb->pos = 0; state.setKey(fcb); } return fcb; } ThreadFile::Error ThreadFile::fetch(caddr_t address, ccxx_size_t len, off_t pos) { fcb_t *fcb = getFCB(); #ifdef WIN32 Thread::Cancel save; if(fd == INVALID_HANDLE_VALUE) #else if(fd < 0) #endif return errNotOpened; if(address) fcb->address = address; if(len) fcb->len = len; if(pos != -1) fcb->pos = pos; #ifdef WIN32 enterMutex(); save = Thread::enterCancel(); SetFilePointer(fd, fcb->pos, NULL, FILE_BEGIN); DWORD count; if(!ReadFile(fd, fcb->address, fcb->len, &count, NULL)) { Thread::exitCancel(save); leaveMutex(); return errReadFailure; } Thread::exitCancel(save); leaveMutex(); if(count < fcb->len) return errReadIncomplete; return errSuccess; #else #ifdef HAVE_PREAD_PWRITE int io = ::pread(fd, fcb->address, fcb->len, fcb->pos); #else enterMutex(); lseek(fd, fcb->pos, SEEK_SET); int io = ::read(fd, fcb->address, fcb->len); leaveMutex(); #endif if((size_t) io == fcb->len) return errSuccess; if(io > -1) return errReadIncomplete; switch(errno) { case EINTR: return errReadInterrupted; default: return errReadFailure; } #endif // WIN32 } ThreadFile::Error ThreadFile::update(caddr_t address, ccxx_size_t len, off_t pos) { fcb_t *fcb = getFCB(); #ifdef WIN32 if(fd == INVALID_HANDLE_VALUE) #else if(fd < 0) #endif return errNotOpened; if(address) fcb->address = address; if(len) fcb->len = len; if(pos != -1) fcb->pos = pos; #ifdef WIN32 enterMutex(); Thread::Cancel save = Thread::enterCancel(); SetFilePointer(fd, fcb->pos, NULL, FILE_BEGIN); DWORD count; if(!WriteFile(fd, fcb->address, fcb->len, &count, NULL)) { Thread::exitCancel(save); leaveMutex(); return errWriteFailure; } Thread::exitCancel(save); leaveMutex(); if(count < fcb->len) return errWriteIncomplete; return errSuccess; #else #ifdef HAVE_PREAD_PWRITE int io = ::pwrite(fd, fcb->address, fcb->len, fcb->pos); #else enterMutex(); lseek(fd, fcb->pos, SEEK_SET); int io = ::write(fd, fcb->address, fcb->len); leaveMutex(); #endif if((size_t) io == fcb->len) return errSuccess; if(io > -1) return errWriteIncomplete; switch(errno) { case EINTR: return errWriteInterrupted; default: return errWriteFailure; } #endif //WIN32 } ThreadFile::Error ThreadFile::append(caddr_t address, ccxx_size_t len) { fcb_t *fcb = getFCB(); #ifdef WIN32 if(fd == INVALID_HANDLE_VALUE) #else if(fd < 0) #endif return errNotOpened; if(address) fcb->address = address; if(len) fcb->len = len; enterMutex(); #ifdef WIN32 Thread::Cancel save = Thread::enterCancel(); fcb->pos = SetFilePointer(fd, 0l, NULL, FILE_END); DWORD count; if(!WriteFile(fd, fcb->address, fcb->len, &count, NULL)) { Thread::exitCancel(save); leaveMutex(); return errWriteFailure; } Thread::exitCancel(save); leaveMutex(); if(count < fcb->len) return errWriteIncomplete; return errSuccess; #else fcb->pos = lseek(fd, 0l, SEEK_END); int io = ::write(fd, fcb->address, fcb->len); leaveMutex(); if((size_t) io == fcb->len) return errSuccess; if(io > -1) return errWriteIncomplete; switch(errno) { case EINTR: return errWriteInterrupted; default: return errWriteFailure; } #endif // WIN32 } off_t ThreadFile::getPosition(void) { fcb_t *fcb = getFCB(); return fcb->pos; } bool ThreadFile::operator++(void) { off_t eof; fcb_t *fcb = getFCB(); fcb->pos += fcb->len; enterMutex(); #ifdef WIN32 eof = SetFilePointer(fd, 0l, NULL, FILE_END); #else eof = lseek(fd, 0l, SEEK_END); #endif leaveMutex(); if(fcb->pos >= eof) { fcb->pos = eof; return true; } return false; } bool ThreadFile::operator--(void) { fcb_t *fcb = getFCB(); fcb->pos -= fcb->len; if(fcb->pos <= 0) { fcb->pos = 0; return true; } return false; } SharedFile::SharedFile(const char *path) : RandomFile(path) { fcb.address = NULL; fcb.len = 0; fcb.pos = 0; open(path); } SharedFile::SharedFile(const SharedFile &sh) : RandomFile(sh) { } SharedFile::~SharedFile() { final(); } SharedFile::Error SharedFile::open(const char *path) { #ifdef WIN32 if(fd != INVALID_HANDLE_VALUE) #else if(fd > -1) #endif final(); if(path != pathname) { if(pathname) delString(pathname); pathname = newString(path); } flags.initial = false; #ifdef WIN32 fd = CreateFile(pathname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if(fd == INVALID_HANDLE_VALUE) { flags.initial = true; fd = CreateFile(pathname, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); } if(fd == INVALID_HANDLE_VALUE) return errOpenFailed; return errSuccess; #else fd = ::open(pathname, O_RDWR); if(fd < 0) { flags.initial = true; fd = ::open(pathname, O_CREAT | O_RDWR | O_TRUNC, (int)attrPrivate); } if(fd < 0) return error(errOpenFailed); #ifdef LOCK_SH if(flock(fd, LOCK_SH | LOCK_NB)) { close(fd); fd = -1; return error(errOpenInUse); } #endif return errSuccess; #endif // WIN32 } SharedFile::Error SharedFile::fetch(caddr_t address, ccxx_size_t len, off_t pos) { #ifdef WIN32 if(fd == INVALID_HANDLE_VALUE) #else if(fd < 0) #endif return errNotOpened; enterMutex(); if(address) fcb.address = address; if(len) fcb.len = len; if(pos != -1) fcb.pos = pos; #ifdef WIN32 Thread::Cancel save = Thread::enterCancel(); OVERLAPPED over; SetFilePointer(fd, fcb.pos, NULL, FILE_BEGIN); over.hEvent = 0; over.Offset = fcb.pos; over.OffsetHigh = 0; LockFileEx(fd, LOCKFILE_EXCLUSIVE_LOCK, 0, fcb.len, 0, &over); DWORD count; if(!ReadFile(fd, fcb.address, fcb.len, &count, NULL)) { Thread::exitCancel(save); leaveMutex(); return errReadFailure; } Thread::exitCancel(save); leaveMutex(); if(count < fcb.len) return errReadIncomplete; return errSuccess; #else lseek(fd, fcb.pos, SEEK_SET); if(lockf(fd, F_LOCK, fcb.len)) { leaveMutex(); return errLockFailure; } int io = ::read(fd, fcb.address, fcb.len); leaveMutex(); if((size_t) io == fcb.len) return errSuccess; if(io > -1) return errReadIncomplete; switch(errno) { case EINTR: return errReadInterrupted; default: return errReadFailure; } #endif } #ifndef WIN32 SharedFile::Error SharedFile::clear(ccxx_size_t len, off_t pos) { if(fd < 0) return errNotOpened; enterMutex(); if(len) fcb.len = len; if(pos != -1) fcb.pos = pos; lseek(fd, fcb.pos, SEEK_SET); if(lockf(fd, F_ULOCK, fcb.len)) { leaveMutex(); return errLockFailure; } leaveMutex(); return errSuccess; } #endif // ndef WIN32 SharedFile::Error SharedFile::update(caddr_t address, ccxx_size_t len, off_t pos) { #ifdef WIN32 if(fd == INVALID_HANDLE_VALUE) #else if(fd < 0) #endif return errNotOpened; enterMutex(); if(address) fcb.address = address; if(len) fcb.len = len; if(pos != -1) fcb.pos = pos; #ifdef WIN32 Thread::Cancel save = Thread::enterCancel(); OVERLAPPED over; SetFilePointer(fd, fcb.pos, NULL, FILE_BEGIN); over.hEvent = 0; over.Offset = pos; over.OffsetHigh = 0; DWORD count; if(!WriteFile(fd, fcb.address, fcb.len, &count, NULL)) { SetFilePointer(fd, fcb.pos, NULL, FILE_CURRENT); UnlockFileEx(fd, 0, len, 0, &over); Thread::exitCancel(save); leaveMutex(); return errWriteFailure; } SetFilePointer(fd, fcb.pos, NULL, FILE_CURRENT); UnlockFileEx(fd, 0, len, 0, &over); Thread::exitCancel(save); leaveMutex(); if(count < fcb.len) return errWriteIncomplete; return errSuccess; #else lseek(fd, fcb.pos, SEEK_SET); int io = ::write(fd, fcb.address, fcb.len); if(lockf(fd, F_ULOCK, fcb.len)) { leaveMutex(); return errLockFailure; } leaveMutex(); if((size_t) io == fcb.len) return errSuccess; if(io > -1) return errWriteIncomplete; switch(errno) { case EINTR: return errWriteInterrupted; default: return errWriteFailure; } #endif // WIN32 } SharedFile::Error SharedFile::append(caddr_t address, ccxx_size_t len) { #ifdef WIN32 if(fd == INVALID_HANDLE_VALUE) #else if(fd < 0) #endif return errNotOpened; enterMutex(); if(address) fcb.address = address; if(len) fcb.len = len; #ifdef WIN32 Thread::Cancel save = Thread::enterCancel(); fcb.pos = SetFilePointer(fd, 0l, NULL, FILE_END); OVERLAPPED over; over.hEvent = 0; over.Offset = fcb.pos; over.OffsetHigh = 0; LONG eof = fcb.pos; LockFileEx(fd, LOCKFILE_EXCLUSIVE_LOCK, 0, 0x7fffffff, 0, &over); fcb.pos = SetFilePointer(fd, 0l, NULL, FILE_END); DWORD count; if(!WriteFile(fd, fcb.address, fcb.len, &count, NULL)) { SetFilePointer(fd, eof, NULL, FILE_CURRENT); Thread::exitCancel(save); UnlockFileEx(fd, 0, 0x7fffffff, 0, &over); Thread::exitCancel(save); leaveMutex(); return errWriteFailure; } SetFilePointer(fd, eof, NULL, FILE_CURRENT); UnlockFileEx(fd, 0, 0x7fffffff, 0, &over); Thread::exitCancel(save); leaveMutex(); if(count < fcb.len) return errWriteIncomplete; return errSuccess; #else fcb.pos = lseek(fd, 0l, SEEK_END); if(lockf(fd, F_LOCK, -1)) { leaveMutex(); return errLockFailure; } fcb.pos = lseek(fd, 0l, SEEK_END); int io = ::write(fd, fcb.address, fcb.len); lseek(fd, fcb.pos, SEEK_SET); if(lockf(fd, F_ULOCK, -1)) { leaveMutex(); return errLockFailure; } leaveMutex(); if((size_t) io == fcb.len) return errSuccess; if(io > -1) return errWriteIncomplete; switch(errno) { case EINTR: return errWriteInterrupted; default: return errWriteFailure; } #endif // WIN32 } off_t SharedFile::getPosition(void) { return fcb.pos; } bool SharedFile::operator++(void) { off_t eof; enterMutex(); fcb.pos += fcb.len; #ifdef WIN32 eof = SetFilePointer(fd, 0l, NULL, FILE_END); #else eof = lseek(fd, 0l, SEEK_END); #endif if(fcb.pos >= eof) { fcb.pos = eof; leaveMutex(); return true; } leaveMutex(); return false; } bool SharedFile::operator--(void) { enterMutex(); fcb.pos -= fcb.len; if(fcb.pos <= 0) { fcb.pos = 0; leaveMutex(); return true; } leaveMutex(); return false; } size_t MappedFile::pageAligned(size_t size) { size_t pages = size / Process::getPageSize(); if(size % Process::getPageSize()) ++pages; return pages * Process::getPageSize(); } #ifdef WIN32 static void makemapname(const char *source, char *target) { unsigned count = 60; while(*source && count--) { if(*source == '/' || *source == '\\') *(target++) = '_'; else *(target++) = toupper(*source); ++source; } *target = 0; } MappedFile::MappedFile(const char *fname, Access mode, size_t size) : RandomFile(fname) { DWORD share, page; map = INVALID_HANDLE_VALUE; fcb.address = NULL; switch(mode) { case accessReadOnly: share = FILE_SHARE_READ; page = PAGE_READONLY; prot = FILE_MAP_READ; break; case accessWriteOnly: share = FILE_SHARE_WRITE; page = PAGE_WRITECOPY; prot = FILE_MAP_COPY; break; case accessReadWrite: share = FILE_SHARE_READ|FILE_SHARE_WRITE; page = PAGE_READWRITE; prot = FILE_MAP_WRITE; } fd = CreateFile(pathname, mode, share, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if(fd == INVALID_HANDLE_VALUE) { error(errOpenFailed); return; } SetFilePointer(fd, (LONG)size, 0, FILE_BEGIN); SetEndOfFile(fd); makemapname(fname, mapname); map = CreateFileMapping(fd, NULL, page, 0, 0, mapname); if(!map) error(errMapFailed); fcb.address = MapViewOfFile(map, prot, 0, 0, size); fcb.len = (ccxx_size_t)size; fcb.pos = 0; if(!fcb.address) error(errMapFailed); } MappedFile::MappedFile(const char *fname, Access mode) : RandomFile(fname) { DWORD share, page; map = INVALID_HANDLE_VALUE; fcb.address = NULL; switch(mode) { case accessReadOnly: share = FILE_SHARE_READ; page = PAGE_READONLY; prot = FILE_MAP_READ; break; case accessWriteOnly: share = FILE_SHARE_WRITE; page = PAGE_WRITECOPY; prot = FILE_MAP_COPY; break; case accessReadWrite: share = FILE_SHARE_READ|FILE_SHARE_WRITE; page = PAGE_READWRITE; prot = FILE_MAP_WRITE; } fd = CreateFile(pathname, mode, share, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if(fd == INVALID_HANDLE_VALUE) { error(errOpenFailed); return; } makemapname(fname, mapname); map = CreateFileMapping(fd, NULL, page, 0, 0, mapname); if(!map) error(errMapFailed); } MappedFile::MappedFile(const char *fname, pos_t pos, size_t len, Access mode) : RandomFile(fname) { DWORD share, page; map = INVALID_HANDLE_VALUE; fcb.address = NULL; switch(mode) { case accessReadOnly: share = FILE_SHARE_READ; page = PAGE_READONLY; prot = FILE_MAP_READ; break; case accessWriteOnly: share = FILE_SHARE_WRITE; page = PAGE_WRITECOPY; prot = FILE_MAP_COPY; break; case accessReadWrite: share = FILE_SHARE_READ|FILE_SHARE_WRITE; page = PAGE_READWRITE; prot = FILE_MAP_WRITE; } fd = CreateFile(pathname, mode, share, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL); if(fd == INVALID_HANDLE_VALUE) { error(errOpenFailed); return; } makemapname(fname, mapname); map = CreateFileMapping(fd, NULL, page, 0, 0, mapname); if(!map) { error(errMapFailed); return; } fcb.address = MapViewOfFile(map, prot, 0, pos, len); fcb.len = (ccxx_size_t)len; fcb.pos = pos; if(!fcb.address) error(errMapFailed); } MappedFile::~MappedFile() { if(fcb.address) { unlock(); UnmapViewOfFile(fcb.address); } if(map != INVALID_HANDLE_VALUE) CloseHandle(map); final(); } void MappedFile::sync(void) { } void MappedFile::sync(caddr_t address, size_t len) { } void MappedFile::release(caddr_t address, size_t len) { if(fcb.address) { unlock(); UnmapViewOfFile(fcb.address); } fcb.address = NULL; } caddr_t MappedFile::fetch(off_t pos, size_t len) { if(fcb.address) { unlock(); UnmapViewOfFile(fcb.address); } fcb.address = MapViewOfFile(map, prot, 0, pos, len); fcb.len = (ccxx_size_t)len; fcb.pos = pos; if(!fcb.address) error(errMapFailed); return fcb.address; } void MappedFile::update(size_t offset, size_t len) { } void MappedFile::update(caddr_t address, size_t len) { } bool MappedFile::lock(void) { unlock(); if(VirtualLock(fcb.address, fcb.len)) fcb.locked = true; return fcb.locked; } void MappedFile::unlock(void) { if(!fcb.address) fcb.locked = false; if(!fcb.locked) return; VirtualUnlock(fcb.address, fcb.len); fcb.locked = false; } #else #ifdef HAVE_MLOCK MappedFile::MappedFile(const char *fname, Access mode) : RandomFile(fname) { fd = open(fname, (int)mode); if(fd < 0 && mode != accessReadOnly) fd = ::open(pathname, O_CREAT | O_RDWR | O_TRUNC, (int)attrPrivate); if(fd < 0) { error(errOpenFailed); return; } switch(mode) { case O_RDONLY: prot = PROT_READ; break; case O_WRONLY: prot = PROT_WRITE; break; default: prot = PROT_READ | PROT_WRITE; } } MappedFile::MappedFile(const char *fname, Access mode, size_t size) : RandomFile(fname) { fd = open(fname, (int)mode | O_CREAT, 0660); if(fd < 0) { error(errOpenFailed); return; } switch(mode) { case O_RDONLY: prot = PROT_READ; break; case O_WRONLY: prot = PROT_WRITE; break; default: prot = PROT_READ | PROT_WRITE; } enterMutex(); lseek(fd, size, SEEK_SET); fcb.address = (caddr_t)mmap(NULL, size, prot, MAP_SHARED, fd, 0); fcb.len = size; fcb.pos = 0; leaveMutex(); if((caddr_t)(fcb.address) == (caddr_t)(MAP_FAILED)) { close(fd); fd = -1; error(errMapFailed); } } MappedFile::MappedFile(const char *fname, pos_t pos, size_t len, Access mode) : RandomFile(fname) { fd = open(fname, (int)mode); if(fd < 0) { error(errOpenFailed); return; } switch(mode) { case O_RDONLY: prot = PROT_READ; break; case O_WRONLY: prot = PROT_WRITE; break; default: prot = PROT_READ | PROT_WRITE; } enterMutex(); lseek(fd, pos + len, SEEK_SET); fcb.address = (caddr_t)mmap(NULL, len, prot, MAP_SHARED, fd, pos); fcb.len = len; fcb.pos = pos; leaveMutex(); if((caddr_t)(fcb.address) == (caddr_t)(MAP_FAILED)) { close(fd); fd = -1; error(errMapFailed); } } MappedFile::~MappedFile() { unlock(); final(); } void MappedFile::sync(void) { msync(fcb.address, fcb.len, MS_SYNC); } void MappedFile::release(caddr_t address, size_t len) { enterMutex(); if(address) fcb.address = address; if(len) fcb.len = len; if(fcb.locked) unlock(); munmap(fcb.address, fcb.len); leaveMutex(); } caddr_t MappedFile::fetch(off_t pos, size_t len) { enterMutex(); unlock(); fcb.len = len; fcb.pos = pos; lseek(fd, fcb.pos + len, SEEK_SET); fcb.address = (caddr_t)mmap(NULL, len, prot, MAP_SHARED, fd, pos); leaveMutex(); return fcb.address; } bool MappedFile::lock(void) { unlock(); if(!mlock(fcb.address, fcb.len)) fcb.locked = true; return fcb.locked; } void MappedFile::unlock(void) { if(!fcb.address) fcb.locked = false; if(!fcb.locked) return; munlock(fcb.address, fcb.len); fcb.locked = false; } void MappedFile::update(size_t offset, size_t len) { int mode = MS_ASYNC; caddr_t address; if(flags.immediate) mode = MS_SYNC; enterMutex(); address = fcb.address; address += offset; if(!len) len = fcb.len; leaveMutex(); msync(address, len, mode); } void MappedFile::update(caddr_t address, size_t len) { int mode = MS_ASYNC; if(flags.immediate) mode = MS_SYNC; msync(address, len, mode); } #endif #endif // ndef WIN32 #ifdef WIN32 #ifndef SECS_BETWEEN_EPOCHS #define SECS_BETWEEN_EPOCHS 11644473600LL #endif #ifndef SECS_TO_100NS #define SECS_TO_100NS 10000000LL #endif #endif time_t lastAccessed(const char *path) { #ifdef WIN32 __int64 ts; WIN32_FILE_ATTRIBUTE_DATA ino; if(!GetFileAttributesEx(path, GetFileExInfoStandard, &ino)) return 0; ts = ((__int64)ino.ftLastAccessTime.dwHighDateTime << 32) + ino.ftLastAccessTime.dwLowDateTime; ts -= (SECS_BETWEEN_EPOCHS * SECS_TO_100NS); ts /= SECS_TO_100NS; return(time_t)ts; #else struct stat ino; if(stat(path, &ino)) return 0; return ino.st_atime; #endif } time_t lastModified(const char *path) { #ifdef WIN32 __int64 ts; WIN32_FILE_ATTRIBUTE_DATA ino; if(!GetFileAttributesEx(path, GetFileExInfoStandard, &ino)) return 0; ts = ((__int64)ino.ftLastWriteTime.dwHighDateTime << 32) + ino.ftLastWriteTime.dwLowDateTime; ts -= (SECS_BETWEEN_EPOCHS * SECS_TO_100NS); ts /= SECS_TO_100NS; return(time_t)ts; #else struct stat ino; if(stat(path, &ino)) return 0; return ino.st_mtime; #endif } bool isDir(const char *path) { #ifdef WIN32 DWORD attr = GetFileAttributes(path); if(attr == (DWORD)~0l) return false; if(attr & FILE_ATTRIBUTE_DIRECTORY) return true; return false; #else struct stat ino; if(stat(path, &ino)) return false; if(S_ISDIR(ino.st_mode)) return true; return false; #endif // WIN32 } bool isFile(const char *path) { #ifdef WIN32 DWORD attr = GetFileAttributes(path); if(attr == (DWORD)~0l) return false; if(attr & FILE_ATTRIBUTE_DIRECTORY) return false; return true; #else struct stat ino; if(stat(path, &ino)) return false; if(S_ISREG(ino.st_mode)) return true; return false; #endif // WIN32 } #ifndef WIN32 // the Win32 version is given in line in the header bool isDevice(const char *path) { struct stat ino; if(stat(path, &ino)) return false; if(S_ISCHR(ino.st_mode)) return true; return false; } #endif bool canAccess(const char *path) { #ifdef WIN32 DWORD attr = GetFileAttributes(path); if(attr == (DWORD)~0l) return false; if(attr & FILE_ATTRIBUTE_SYSTEM) return false; if(attr & FILE_ATTRIBUTE_HIDDEN) return false; return true; #else if(!access(path, R_OK)) return true; return false; #endif } bool canModify(const char *path) { #ifdef WIN32 DWORD attr = GetFileAttributes(path); if(!canAccess(path)) return false; if(attr & FILE_ATTRIBUTE_READONLY) return false; if(attr & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_NORMAL)) return true; return false; #else if(!access(path, W_OK | R_OK)) return true; return false; #endif } #ifdef WIN32 const char *File::getExtension(const char *path) { const char *cp = strrchr(path, '\\'); if(!cp) cp = strrchr(path, '/'); if(!cp) cp = strrchr(path, ':'); if(cp) ++cp; else cp = path; if(*cp == '.') return ""; cp = strrchr(cp, '.'); if(!cp) cp = ""; return cp; } const char *File::getFilename(const char *path) { const char *cp = strrchr(path, '\\'); if(cp) return ++cp; cp = strrchr(path, '/'); if(cp) return ++cp; cp = strrchr(path, ':'); if(cp) ++cp; return path; } char *File::getFilename(const char *path, char *buffer, size_t size) { const char *cp = strrchr(path, '\\'); if(!cp) cp = strrchr(path, '/'); if(!cp) cp = strrchr(path, ':'); if(cp) snprintf(buffer, size, "%s", ++cp); else snprintf(buffer, size, "%s", path); return buffer; } char *File::getDirname(const char *path, char *buffer, size_t size) { size_t len; const char *cp = strrchr(path, '\\'); snprintf(buffer, size, "%s", path); if(!cp) cp = strrchr(path, '/'); if(!cp) cp = strrchr(path, ':'); if(!cp) return buffer; if(cp) len = cp - path; if(len >= size) len = size - 1; buffer[len] = 0; return buffer; } #else const char *File::getExtension(const char *path) { const char *cp = strrchr(path, '/'); if(cp) ++cp; else cp = path; if(*cp == '.') return ""; cp = strrchr(cp, '.'); if(cp) return cp; return ""; } char *File::getDirname(const char *path, char *buffer, size_t size) { unsigned len; const char *cp = strrchr(path, '/'); snprintf(buffer, size, "%s", path); if(!cp) return buffer; if(cp) len = cp - path; if(len >= size) len = size - 1; buffer[len] = 0; return buffer; } const char *File::getFilename(const char *path) { const char *cp = strrchr(path, '/'); if(cp) return ++cp; return path; } char *File::getFilename(const char *path, char *buffer, size_t size) { const char *cp = strrchr(path, '/'); if(cp) snprintf(buffer, size, "%s", ++cp); else snprintf(buffer, size, "%s", path); return buffer; } #endif #ifdef HAVE_REALPATH char *File::getRealpath(const char *path, char *buffer, size_t size) { char temp[PATH_MAX]; setString(buffer, size, "."); if(!realpath(path, temp)) return NULL; if(strlen(temp) >= size) return NULL; setString(buffer, size, temp); return buffer; } #else #ifdef WIN323 static char *getFile(char *path) { char *cp = strchr(path, '\\'); if(!cp) cp = strchr(path, '/'); if(!cp) cp = strchr(path, ':'); return cp; } #else static char *getFile(char *path) { return strchr(path, '/'); } #endif char *File::getRealpath(const char *path, char *buffer, size_t size) { if(size > PATH_MAX) size = PATH_MAX; unsigned symlinks = 0; #if !defined(DYNAMCIC_LOCAL_ARRAYS) char left[PATH_MAX]; #else char left[size]; #endif size_t left_len, buffer_len; #ifdef WIN32 if(path[1] == ':') #else if(path[0] == '/') #endif { buffer[0] = '/'; buffer[1] = 0; if(!path[1]) return buffer; buffer_len = 1; snprintf(left, size, "%s", path + 1); left_len = strlen(left); } else { if(!Dir::getPrefix(buffer, size)) { snprintf(buffer, size, "%s", "."); return NULL; } buffer_len = strlen(buffer); snprintf(left, size, "%s", path); left_len = strlen(left); } if(left_len >= size || buffer_len >= size) return NULL; while(left_len > 0) { #ifdef HAVE_LSTAT struct stat ino; #endif #if !defined(DYNAMIC_LOCAL_ARRAYS) char next_token[PATH_MAX]; #else char next_token[size]; #endif char *p; const char *s = (p = getFile(left)) ? p : left + left_len; memmove(next_token, left, s - left); left_len -= s - left; if(p != NULL) memmove(left, s + 1, left_len + 1); next_token[s - left] = 0; if(buffer[buffer_len - 1] != '/') { if(buffer_len +1 >= size) return NULL; buffer[buffer_len++] = '/'; buffer[buffer_len] = 0; } if(!next_token[0]) continue; else if(!strcmp(next_token, ".")) continue; else if(!strcmp(next_token, "..")) { if(buffer_len > 1) { char *q; buffer[buffer_len - 1] = 0; #ifdef WIN32 q = strrchr(buffer, '\\'); if(!q) q = strrchr(buffer, '/'); if(!q) q = strchr(buffer, ':'); #else q = strrchr(buffer, '/'); #endif *q = 0; buffer_len = q - buffer; } continue; } snprintf(next_token, size, "%s", buffer); buffer_len = strlen(buffer); if(buffer_len >= size) return NULL; #ifndef HAVE_LSTAT if(!isFile(buffer) && !isDir(buffer)) return buffer; continue; #else if(lstat(buffer, &ino) < 0) { if(errno == ENOENT && !p) return buffer; return NULL; } if((ino.st_mode & S_IFLNK) == S_IFLNK) { char symlink[size]; int slen; if (symlinks++ > MAXSYMLINKS) return NULL; slen = readlink(buffer, symlink, size); if (slen < 0) return NULL; symlink[slen] = 0; if (symlink[0] == '/') { buffer[1] = 0; buffer_len = 1; } else if (buffer_len > 1) { char *q; buffer[buffer_len - 1] = 0; q = strrchr(buffer, '/'); *q = 0; buffer_len = q - buffer; } if (symlink[slen - 1] != '/' && p) { if (slen >= size) return NULL; symlink[slen] = '/'; symlink[slen + 1] = 0; } if(p) { snprintf(symlink, size, "%s", left); left_len = strlen(symlink); } if(left_len >= size) return NULL; snprintf(left, size, "%s", symlink); left_len = strlen(left); } #endif } #ifdef WIN32 if(buffer_len > 1 && buffer[buffer_len - 1] == '\\') buffer[buffer_len - 1] = 0; else if(buffer_len > 1 && buffer[buffer_len - 1] == '/') buffer[buffer_len - 1] = 0; #else if(buffer_len > 1 && buffer[buffer_len - 1] == '/') buffer[buffer_len - 1] = 0; #endif return buffer; } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/inaddr.cpp0000644000175000017500000002721711463377454013302 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include "private.h" #include #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef WIN32 Mutex IPV4Address::mutex; #endif IPV4Host IPV4Host::_host_; const IPV4MulticastValidator IPV4Multicast::validator; void IPV4MulticastValidator::operator()(const in_addr address) const { #ifdef CCXX_EXCEPTIONS // "0.0.0.0" is always accepted, as it is an "empty" address. if ( (address.s_addr != INADDR_ANY) && (address.s_addr & MCAST_VALID_MASK) != MCAST_VALID_VALUE ) { throw "Multicast address not in the valid range: from 224.0.0.1 through 239.255.255.255"; } #endif } IPV4Address::IPV4Address(const IPV4Validator *_validator) : validator(_validator), ipaddr(NULL), addr_count(0), hostname(NULL) { *this = (long unsigned int)INADDR_ANY; } IPV4Address::IPV4Address(const char *address, const IPV4Validator *_validator) : validator(_validator), ipaddr(NULL), addr_count(0), hostname(NULL) { if ( this->validator ) this->validator = validator; if(address == 0 || !strcmp(address, "*")) setAddress(NULL); else setAddress(address); } IPV4Address::IPV4Address(struct in_addr addr, const IPV4Validator *_validator) : validator(_validator), ipaddr(NULL), hostname(NULL) { if ( this->validator ){ this->validator = validator; (*validator)(addr); } addr_count = 1; ipaddr = new struct in_addr[1]; ipaddr[0] = addr; } IPV4Address::IPV4Address(const IPV4Address &rhs) : validator(rhs.validator), addr_count(rhs.addr_count), hostname(NULL) { ipaddr = new struct in_addr[addr_count]; memcpy(ipaddr, rhs.ipaddr, sizeof(struct in_addr) * addr_count); } IPV4Address::~IPV4Address() { if(ipaddr) { delete[] ipaddr; ipaddr = NULL; } if(hostname) { delString(hostname); hostname = NULL; } } struct in_addr IPV4Address::getAddress(void) const { return ipaddr[0]; } struct in_addr IPV4Address::getAddress(size_t i) const { return (i < addr_count ? ipaddr[i] : ipaddr[0]); } bool IPV4Address::isInetAddress(void) const { struct in_addr addr; memset(&addr, 0, sizeof(addr)); if(memcmp(&addr, &ipaddr[0], sizeof(addr))) return true; return false; } IPV4Address &IPV4Address::operator=(const char *str) { if(str == 0 || !strcmp(str, "*")) str = "0.0.0.0"; setAddress(str); return *this; } IPV4Address &IPV4Address::operator=(struct in_addr addr) { if(ipaddr) delete[] ipaddr; if ( validator ) (*validator)(addr); addr_count = 1; ipaddr = new struct in_addr[1]; ipaddr[0] = addr; if(hostname) delString(hostname); hostname = NULL; return *this; } IPV4Address &IPV4Address::operator=(unsigned long addr) { union { uint32 addr; struct in_addr in4; } aptr; aptr.addr = addr; if ( validator ) (*validator)(aptr.in4); if(ipaddr) delete[] ipaddr; addr_count = 1; ipaddr = new struct in_addr[1]; memcpy(ipaddr, &aptr.in4, sizeof(struct in_addr)); if(hostname) delString(hostname); hostname = NULL; return *this; } IPV4Address &IPV4Address::operator=(const IPV4Address &rhs) { if(this == &rhs) return *this; addr_count = rhs.addr_count; if(ipaddr) delete[] ipaddr; ipaddr = new struct in_addr[addr_count]; memcpy(ipaddr, rhs.ipaddr, sizeof(struct in_addr) * addr_count); validator = rhs.validator; if(hostname) delString(hostname); hostname = NULL; return *this; } bool IPV4Address::operator==(const IPV4Address &a) const { const IPV4Address *smaller, *larger; size_t s, l; if(addr_count > a.addr_count) { smaller = &a; larger = this; } else { smaller = this; larger = &a; } // Loop through all addr's in the smaller and make sure // that they are all in the larger for(s = 0; s < smaller->addr_count; s++) { // bool found = false; for(l = 0; l < larger->addr_count && memcmp((char *)&ipaddr[s], (char *)&a.ipaddr[l], sizeof(struct in_addr)); l++); if(l == larger->addr_count) return false; } return true; } bool IPV4Address::operator!=(const IPV4Address &a) const { // Impliment in terms of operator== return (*this == a ? false : true); } IPV4Host &IPV4Host::operator&=(const IPV4Mask &ma) { for(size_t i = 0; i < addr_count; i++) { struct in_addr mask = ma.getAddress(); unsigned char *a = (unsigned char *)&ipaddr[i]; unsigned char *m = (unsigned char *)&mask; for(size_t j = 0; j < sizeof(struct in_addr); ++j) *(a++) &= *(m++); } if(hostname) delString(hostname); hostname = NULL; return *this; } IPV4Host::IPV4Host(struct in_addr addr) : IPV4Address(addr) {} IPV4Host::IPV4Host(const char *host) : IPV4Address(host) { char namebuf[256]; if(!host) { if(this == &_host_) { gethostname(namebuf, 256); setAddress(namebuf); } else *this = _host_; } } bool IPV4Address::setIPAddress(const char *host) { if(!host) return false; #if defined(WIN32) struct sockaddr_in addr; addr.sin_addr.s_addr = inet_addr(host); if ( validator ) (*validator)(addr.sin_addr); if(addr.sin_addr.s_addr == INADDR_NONE) return false; *this = addr.sin_addr.s_addr; #else struct in_addr l_addr; int ok = inet_aton(host, &l_addr); if ( validator ) (*validator)(l_addr); if ( !ok ) return false; *this = l_addr; #endif return true; } void IPV4Address::setAddress(const char *host) { if(hostname) delString(hostname); hostname = NULL; if(!host) // The way this is currently used, this can never happen { *this = (long unsigned int)htonl(INADDR_ANY); return; } #ifdef WIN32 if(!stricmp(host, "localhost")) { *this = (long unsigned int)inet_addr("127.0.0.1"); return; } #endif if(!setIPAddress(host)) { struct hostent *hp; struct in_addr **bptr; #if defined(__GLIBC__) char hbuf[8192]; struct hostent hb; int rtn; if(gethostbyname_r(host, &hb, hbuf, sizeof(hbuf), &hp, &rtn)) hp = NULL; #elif defined(sun) char hbuf[8192]; struct hostent hb; int rtn; hp = gethostbyname_r(host, &hb, hbuf, sizeof(hbuf), &rtn); #elif (defined(__osf__) || defined(WIN32)) hp = gethostbyname(host); #else mutex.enterMutex(); hp = gethostbyname(host); mutex.leaveMutex(); #endif if(!hp) { if(ipaddr) delete[] ipaddr; ipaddr = new struct in_addr[1]; memset((void *)&ipaddr[0], 0, sizeof(ipaddr)); return; } // Count the number of IP addresses returned addr_count = 0; for(bptr = (struct in_addr **)hp->h_addr_list; *bptr != NULL; bptr++) { addr_count++; } // Allocate enough memory if(ipaddr) delete[] ipaddr; // Cause this was allocated in base ipaddr = new struct in_addr[addr_count]; // Now go through the list again assigning to // the member ipaddr; bptr = (struct in_addr **)hp->h_addr_list; for(unsigned int i = 0; i < addr_count; i++) { if ( validator ) (*validator)(*bptr[i]); ipaddr[i] = *bptr[i]; } } } IPV4Broadcast::IPV4Broadcast(const char *net) : IPV4Address(net) { } IPV4Mask::IPV4Mask(const char *mask) { unsigned long x = 0xffffffff; int l = 32 - atoi(mask); if(setIPAddress(mask)) return; if(l < 1 || l > 32) { #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) throw((IPV4Address *)this); #endif return; } *this = htonl(x << l); } const char *IPV4Address::getHostname(void) const { struct hostent *hp = NULL; struct in_addr addr0; memset(&addr0, 0, sizeof(addr0)); if(!memcmp(&addr0, &ipaddr[0], sizeof(addr0))) return NULL; #ifdef WIN32 memset(&addr0, 0xff, sizeof(addr0)); if(!memcmp(&addr0, &ipaddr[0], sizeof(addr0))) return "255.255.255.255"; long a = inet_addr("127.0.0.1"); if(!memcmp(&a, &ipaddr[0], sizeof(a))) return "localhost"; #endif #if defined(__GLIBC__) char hbuf[8192]; struct hostent hb; int rtn; if(gethostbyaddr_r((char *)&ipaddr[0], sizeof(addr0), AF_INET, &hb, hbuf, sizeof(hbuf), &hp, &rtn)) hp = NULL; #elif defined(sun) char hbuf[8192]; struct hostent hb; int rtn; hp = gethostbyaddr_r((char *)&ipaddr[0], (int)sizeof(addr0), (int)AF_INET, &hb, hbuf, (int)sizeof(hbuf), &rtn); #elif defined(__osf__) || defined(WIN32) hp = gethostbyaddr((char *)&ipaddr[0], sizeof(addr0), AF_INET); #else mutex.enterMutex(); hp = gethostbyaddr((char *)&ipaddr[0], sizeof(addr0), AF_INET); mutex.leaveMutex(); #endif if(hp) { if(hostname) delString(hostname); hostname = newString(hp->h_name); return hostname; } else { return inet_ntoa(ipaddr[0]); } } IPV4Host operator&(const IPV4Host &addr, const IPV4Mask &mask) { IPV4Host temp = addr; temp &= mask; return temp; } IPV4Multicast::IPV4Multicast() : IPV4Address(&validator) {} IPV4Multicast::IPV4Multicast(const struct in_addr address) : IPV4Address(address,&validator) {} IPV4Multicast::IPV4Multicast(const char *address) : IPV4Address(address,&validator) {} #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/xml.cpp0000644000175000017500000003546211463412253012625 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include #ifndef WIN32 #include #endif #include // very ugly, but saves a lot of #ifdefs. To understand this, look at // the private members of XMLRPC. #ifndef HAVE_SSTREAM #define strBuf (*oldStrBuf) #endif #ifdef CCXX_NAMESPACES namespace ost { #ifdef HAVE_SSTREAM using std::stringstream; #else using std::strstream; #endif using std::streambuf; using std::ofstream; using std::ostream; using std::clog; using std::endl; using std::ends; using std::ios; #endif static bool isElement(char c) { return isalnum(c) || c == ':' || c == '-' || c == '.' || c == '_'; } void XMLStream::putData(char c) { dbuf[dp++] = c; if(dp >= sizeof(dbuf)) { if(ecount) characters((unsigned char *)dbuf, dp); dp = 0; } } void XMLStream::clrData(void) { if(dp && ecount) characters((unsigned char *)dbuf, dp); dp = 0; } void XMLStream::parseInit(void) { state = NONE; dp = 0; ecount = dcount = 0; } bool XMLStream::parseTag(void) { size_t len = dp; const char *data = dbuf; bool end = false; const unsigned char *attrib[128]; unsigned attr = 0; char *ep; if(*data == '/') { while(--len) { if(!isElement(*(++data))) break; } if(len) return false; dbuf[dp] = 0; endElement((const unsigned char *)(dbuf + 1)); dp = 0; --ecount; if(ecount < 0) return false; if(!ecount) endDocument(); } else if(*data == '!') { dp = 0; return true; // dtd } else if(*data == '?') { if(!strnicmp(data, "?xml version=\"", 14)) { // version info } dp = 0; } else if(!isElement(*data)) return false; else { end = false; if(dbuf[dp - 1] == '/') { --dp; end = true; } len = 0; data = dbuf; while(len < dp) { if(!isElement(*data)) break; ++len; ++data; } if(len == dp) { if(!ecount) startDocument(); ++ecount; attrib[0] = attrib[1] = NULL; dbuf[dp] = 0; startElement((const unsigned char *)dbuf, attrib); if(end) { ending: --ecount; endElement((const unsigned char *)dbuf); if(!ecount) endDocument(); } dp = 0; return true; } if(!ecount) startDocument(); ++ecount; // attributes, name is between data and len for(;;) { while(!isElement(dbuf[len]) && len < dp) { if(!isspace(dbuf[len])) return false; dbuf[len++] = 0; } if(len == dp) break; attrib[attr++] = (const unsigned char *)(dbuf + len); while(len < dp && isElement(dbuf[len])) ++len; if(len == dp) return false; if(dbuf[len] != '=') return false; dbuf[len++] = 0; if(len == dp) { attrib[attr++] = (const unsigned char *)""; break; } if(isspace(dbuf[len])) { attrib[attr++] = (const unsigned char *)""; continue; } if(dbuf[len] == '\'' || dbuf[len] == '\"') { ep = strchr(dbuf + len + 1, dbuf[len]); if(!ep) return false; attrib[attr++] = (const unsigned char *)dbuf + len + 1; *(ep++) = 0; len = ep - dbuf; continue; } if(!isElement(dbuf[len])) return false; attrib[attr++] = (const unsigned char *)dbuf; while(isElement(dbuf[len]) && len < dp) ++len; if(len == dp) { dbuf[len] = 0; break; } } attrib[attr++] = NULL; attrib[attr++] = NULL; startElement((const unsigned char *)dbuf, attrib); if(end) goto ending; dp = 0; return true; } return true; } bool XMLStream::parseChunk(const char *data, size_t len) { unsigned char cp; while(len--) { switch(state) { case AMP: if((!dp && *data == '#') || isElement(*data)) { dbuf[dp++] = *data; break; } if(*data != ';') return false; dbuf[dp] = 0; if(dbuf[0] == '#') cp = atoi(dbuf + 1); else if(!stricmp(dbuf, "amp")) cp = '&'; else if(!stricmp(dbuf, "lt")) cp = '<'; else if(!stricmp(dbuf, "gt")) cp = '>'; else if(!stricmp(dbuf, "apos")) cp = '`'; else if(!stricmp(dbuf, "quot")) cp = '\"'; else return false; characters(&cp, 1); dp = 0; state = NONE; break; case TAG: if(*data == '>') { state = NONE; if(!parseTag()) return false; } else if(*data == '[' && dp == 7 && !strncmp(dbuf, "![CDATA", 7)) { state = CDATA; } else if(*data == '-' && dp == 2 && !strncmp(dbuf, "!-", 2)) { state = COMMENT; dp = 0; } else if(*data == '[' && !strncmp(dbuf, "!DOCTYPE ", 9)) { state = DTD; dp = 0; } else putData(*data); break; case COMMENT: if(*data == '>' && dp >= 2 && !strncmp(&dbuf[dp - 2], "--", 2)) { dp -= 2; if(dp) comment((unsigned char *)dbuf, dp); dp = 0; state = NONE; } else { dbuf[dp++] = *data; if(dp == sizeof(dbuf)) { comment((unsigned char *)dbuf, dp); dp = 0; } } break; case CDATA: putData(*data); if(dp > 2) if(!strcmp(&dbuf[dp - 3], "]]>")) { dp -= 3; state = NONE; clrData(); } break; case DTD: if(*data == '<') ++dcount; else if(*data == '>' && dcount) --dcount; else if(*data == '>') state = NONE; break; case NONE: if(*data == '<') { clrData(); state = TAG; } else if(ecount && *data == '&') { clrData(); state = AMP; } else if(ecount) putData(*data); } ++data; } return true; } bool XMLStream::parse(const char *resource) { bool ret = false; char buffer[1024]; int res; if(resource) if(!open(resource)) return false; parseInit(); while((res = read((unsigned char *)buffer, 1024))) ret = parseChunk(buffer, res); return ret; } XMLRPC::XMLRPC(size_t bufferSize) : XMLStream() { #ifdef HAVE_SSTREAM // nothing #else buffer = new char[bufferSize]; oldStrBuf = NULL; bufSize = bufferSize; #endif } XMLRPC::~XMLRPC() { #ifdef HAVE_SSTREAM // nothing #else if(buffer) delete[] buffer; if(oldStrBuf) delete oldStrBuf; #endif close(); } void XMLRPC::invoke(const char *member) { #ifdef HAVE_SSTREAM strBuf.str() = ""; #else buffer[0] = 0; oldStrBuf = new strstream(buffer,bufSize); #endif structFlag = reply = fault = false; array = 0; strBuf << "" << endl; strBuf << "" << endl; strBuf << "" << member << "" << endl; strBuf << "" << endl; } void XMLRPC::response(bool f) { reply = true; structFlag = false; fault = f; array = 0; #ifdef HAVE_SSTREAM // nothing #else buffer[0] = 0; oldStrBuf = new strstream(buffer,bufSize); #endif strBuf << "" << endl; strBuf << "" << endl; if(fault) strBuf << "" << endl; else strBuf << "" << endl; } void XMLRPC::addMember(const char *name, long value) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif begStruct(); strBuf << "" << name << "" << endl; strBuf << "" << value << "" << endl; } void XMLRPC::addMember(const char *name, const char *value) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif begStruct(); strBuf << "" << name << "" << endl; strBuf << "" << value << "" << endl; } void XMLRPC::addMember(const char *name, bool value) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif begStruct(); strBuf << "" << name << "" << endl; strBuf << ""; if(value) strBuf << "1"; else strBuf << "0"; strBuf << "" << endl; } void XMLRPC::addParam(bool value) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif endStruct(); if(!fault && !array) strBuf << ""; strBuf << ""; if(value) strBuf << "1"; else strBuf << "0"; strBuf << ""; if(!fault && !array) strBuf << ""; strBuf << endl; } void XMLRPC::addParam(long value) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif endStruct(); if(!fault && !array) strBuf << ""; strBuf << "" << value << ""; if(!fault && !array) strBuf << ""; strBuf << endl; } void XMLRPC::addParam(const char *value) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif endStruct(); if(!fault && !array) strBuf << "" << endl; strBuf << "" << value << ""; if(!fault && !array) strBuf << ""; strBuf << endl; } void XMLRPC::begArray(void) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif if(fault) //do not include arrays in fault responses. return; if(!array) strBuf << ""; array++; strBuf << "" << endl; } void XMLRPC::endArray(void) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return; #endif if(!array) return; strBuf << ""; if(!--array) strBuf << ""; strBuf << endl; } void XMLRPC::begStruct(void) { if(structFlag) return; structFlag = true; if(!fault && !array) strBuf << ""; strBuf << "" << endl; } void XMLRPC::endStruct(void) { if(!structFlag) return; strBuf << ""; if(!fault && !array) strBuf << ""; strBuf << endl; structFlag = false; } bool XMLRPC::send(const char *resource) { #ifdef HAVE_SSTREAM // nothing #else if(!oldStrBuf) return false; #endif endStruct(); while(array) { strBuf << "" << endl; --array; } if(!fault) strBuf << "" << endl; else strBuf << "" << endl; if(reply) strBuf << "" << endl << ends; else strBuf << "" << endl << ends; bool result; #ifdef HAVE_SSTREAM result = post(resource, strBuf.str().c_str()); strBuf.str(""); #else delete oldStrBuf; oldStrBuf = NULL; result = post(resource, (const char *)buffer); #endif return result; } bool XMLStream::open(const char *resource) { return true; } void XMLStream::close(void) {} Slog::Level XMLStream::getLogging(void) { return Slog::levelCritical; } void XMLStream::comment(const unsigned char *text, size_t len) {} void XMLStream::startDocument(void) {} void XMLStream::endDocument(void) {} XMLStream::~XMLStream() {} #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/mutex.cpp0000644000175000017500000003761111463401047013164 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #include #include #include #include #ifdef HAVE_GCC_CXX_BITS_ATOMIC using namespace __gnu_cxx; #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif bool Mutex::_debug = false; ThreadLock::ThreadLock() { #ifdef HAVE_PTHREAD_RWLOCK pthread_rwlockattr_t attr; pthread_rwlockattr_init(&attr); if(pthread_rwlock_init(&_lock, &attr)) { pthread_rwlockattr_destroy(&attr); #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) throw(this); #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) throw(SyncException("Mutex constructor failure")); #endif #endif } else pthread_rwlockattr_destroy(&attr); #endif } ThreadLock::~ThreadLock() { #ifdef HAVE_PTHREAD_RWLOCK pthread_rwlock_destroy(&_lock); #endif } void ThreadLock::readLock(void) { #ifdef HAVE_PTHREAD_RWLOCK pthread_rwlock_rdlock(&_lock); #else mutex.enterMutex(); #endif } void ThreadLock::writeLock(void) { #ifdef HAVE_PTHREAD_RWLOCK pthread_rwlock_wrlock(&_lock); #else mutex.enterMutex(); #endif } void ThreadLock::unlock(void) { #ifdef HAVE_PTHREAD_RWLOCK pthread_rwlock_unlock(&_lock); #else mutex.leaveMutex(); #endif } bool ThreadLock::tryReadLock(void) { #ifdef HAVE_PTHREAD_RWLOCK if(pthread_rwlock_tryrdlock(&_lock)) return false; return true; #else return mutex.tryEnterMutex(); #endif } bool ThreadLock::tryWriteLock(void) { #ifdef HAVE_PTHREAD_RWLOCK if(pthread_rwlock_trywrlock(&_lock)) return false; return true; #else return mutex.tryEnterMutex(); #endif } #ifndef WIN32 Conditional::Conditional(const char *id) { pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutex_init(&_mutex, &attr); pthread_mutexattr_destroy(&attr); if(pthread_cond_init(&_cond, NULL) && Thread::getException() == Thread::throwObject) THROW(this); } Conditional::~Conditional() { pthread_cond_destroy(&_cond); pthread_mutex_destroy(&_mutex); } bool Conditional::tryEnterMutex(void) { if(pthread_mutex_trylock(&_mutex) != 0) return false; return true; } void Conditional::enterMutex(void) { pthread_mutex_lock(&_mutex); } void Conditional::leaveMutex(void) { pthread_mutex_unlock(&_mutex); } void Conditional::signal(bool broadcast) { if(broadcast) pthread_cond_broadcast(&_cond); else pthread_cond_signal(&_cond); } bool Conditional::wait(timeout_t timeout, bool locked) { struct timespec ts; int rc; if(!locked) enterMutex(); if(!timeout) { pthread_cond_wait(&_cond, &_mutex); if(!locked) leaveMutex(); return true; } getTimeout(&ts, timeout); rc = pthread_cond_timedwait(&_cond, &_mutex, &ts); if(!locked) leaveMutex(); if(rc == ETIMEDOUT) return false; return true; } #endif #ifndef WIN32 Mutex::Mutex(const char *name) { pthread_mutexattr_t _attr; pthread_mutexattr_init(&_attr); #ifdef PTHREAD_MUTEXTYPE_RECURSIVE pthread_mutexattr_settype(&_attr, PTHREAD_MUTEXTYPE_RECURSIVE); #endif pthread_mutex_init(&_mutex, &_attr); pthread_mutexattr_destroy(&_attr); #ifndef PTHREAD_MUTEXTYPE_RECURSIVE _level = 0; _tid = NULL; #endif _name = name; } Mutex::~Mutex() { pthread_mutex_destroy(&_mutex); } #ifdef PTHREAD_MUTEXTYPE_RECURSIVE bool Mutex::tryEnterMutex(void) { return (pthread_mutex_trylock(&_mutex) == 0) ? true : false; } void Mutex::enterMutex(void) { if(_debug && _name) slog.debug() << Thread::get()->getName() << ": entering " << _name << std::endl; pthread_mutex_lock(&_mutex); } void Mutex::leaveMutex(void) { pthread_mutex_unlock(&_mutex); if(_debug && _name) slog.debug() << Thread::get()->getName() << ": leaving" << _name << std::endl; } #else // !PTHREAD_MUTEXTYPE_RECURSIVE void Mutex::enterMutex(void) { if(_tid == Thread::get()) { ++_level; return; } if(_debug && _name) std::cerr << Thread::get()->getName() << ": entering" << _name << std::endl; pthread_mutex_lock(&_mutex); ++_level; _tid = Thread::get(); } void Mutex::leaveMutex(void) { if(_tid != Thread::get()) return; if(--_level > 0) return; _tid = NULL; _level = 0; pthread_mutex_unlock(&_mutex); if(_debug && _name) std::cerr << Thread::get()->getName() << ": leaving" << _name << std::endl; } bool Mutex::tryEnterMutex(void) { if(_tid == Thread::get()) { ++_level; return true; } if ( pthread_mutex_trylock(&_mutex) != 0 ) return false; _tid = Thread::get(); ++_level; return true; } #endif #else // WIN32 Mutex::Mutex(const char *name) #ifdef MUTEX_UNDERGROUND_WIN32_MUTEX :_mutex(0) #endif // MUTEX_UNDERGROUND_WIN32_MUTEX { #ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION #if _WIN32_WINNT >= 0x0403 if(!InitializeCriticalSectionAndSpinCount(&_criticalSection, 4000)) { THROW(this); } #elif _WIN32_WINNT >= 0x0400 // can rise STATUS_NO_MEMORY exception in low memory situations. InitializeCriticalSection(&_criticalSection); #else #error "Not supported Windows version" #endif #endif // MUTEX_UNDERGROUND_WIN32_CRITICALSECTION #ifdef MUTEX_UNDERGROUND_WIN32_MUTEX _mutex = ::CreateMutex(NULL,FALSE,NULL); if(!_mutex) THROW(this); #endif // MUTEX_UNDERGROUND_WIN32_MUTEX _name = name; } void Mutex::enterMutex(void) { if(_debug && _name) slog.debug() << Thread::get()->getName() << ": entering " << _name << std::endl; #ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION ::EnterCriticalSection(&_criticalSection); #endif // MUTEX_UNDERGROUND_WIN32_CRITICALSECTION #ifdef MUTEX_UNDERGROUND_WIN32_MUTEX Thread::waitThread(_mutex, INFINITE); #endif // MUTEX_UNDERGROUND_WIN32_MUTEX } bool Mutex::tryEnterMutex(void) { #ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION return (::TryEnterCriticalSection(&_criticalSection) == TRUE); #endif // MUTEX_UNDERGROUND_WIN32_CRITICALSECTION #ifdef MUTEX_UNDERGROUND_WIN32_MUTEX return (Thread::waitThread(_mutex, 0) == WAIT_OBJECT_0); #endif // MUTEX_UNDERGROUND_WIN32_MUTEX } Mutex::~Mutex() { #ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION ::DeleteCriticalSection(&_criticalSection); #endif // MUTEX_UNDERGROUND_WIN32_CRITICALSECTION #ifdef MUTEX_UNDERGROUND_WIN32_MUTEX ::CloseHandle(_mutex); #endif // MUTEX_UNDERGROUND_WIN32_MUTEX } void Mutex::leaveMutex(void) { #ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION ::LeaveCriticalSection(&_criticalSection); #endif // MUTEX_UNDERGROUND_WIN32_CRITICALSECTION #ifdef MUTEX_UNDERGROUND_WIN32_MUTEX if (!ReleaseMutex(_mutex)) THROW(this); #endif // MUTEX_UNDERGROUND_WIN32_MUTEX if(_debug && _name) slog.debug() << Thread::get()->getName() << ": leaving" << _name << std::endl; } #endif // WIN32 MUTEX #ifdef WIN32 MutexCounter::MutexCounter(const char *id) : Mutex(id) { counter = 0; }; #endif MutexCounter::MutexCounter(int initial, const char *id) : Mutex(id) { counter = initial; } int operator++(MutexCounter &mc) { int rtn; mc.enterMutex(); rtn = mc.counter++; mc.leaveMutex(); return rtn; } // ??? why cannot be < 0 ??? int operator--(MutexCounter &mc) { int rtn = 0; mc.enterMutex(); if(mc.counter) { rtn = --mc.counter; if(!rtn) { mc.leaveMutex(); THROW(mc); } } mc.leaveMutex(); return rtn; } #ifndef CCXX_USE_WIN32_ATOMIC #ifdef HAVE_ATOMIC AtomicCounter::AtomicCounter() { #if defined(HAVE_ATOMIC_AIX) || defined(HAVE_GCC_BITS_ATOMIC) \ || defined(HAVE_GCC_CXX_BITS_ATOMIC) counter = 0; #else atomic.counter = 0; #endif } AtomicCounter::AtomicCounter(int value) { #if defined(HAVE_ATOMIC_AIX) || defined(HAVE_GCC_BITS_ATOMIC) \ || defined(HAVE_GCC_CXX_BITS_ATOMIC) counter = 0; #else atomic.counter = value; #endif } AtomicCounter::~AtomicCounter() {}; int AtomicCounter::operator++(void) { #ifdef HAVE_ATOMIC_AIX return fetch_and_add((atomic_p)&counter, 1); #elif defined(HAVE_GCC_BITS_ATOMIC) || defined(HAVE_GCC_CXX_BITS_ATOMIC) // Modified by JCE from 2v1.3.8 source, 30/Mar/2005 // BUG FIX: __exchange_and_add() does not seem to return updated __exchange_and_add(&counter, 1); return counter; // end modification by JCE #else atomic_inc(&atomic); return atomic_read(&atomic); #endif } int AtomicCounter::operator--(void) { #ifdef HAVE_ATOMIC_AIX return fetch_and_add((atomic_p)&counter, -1); #elif defined(HAVE_GCC_BITS_ATOMIC) || defined(HAVE_GCC_CXX_BITS_ATOMIC) // Modified by JCE from 2v1.3.8 source, 30/Mar/2005 // BUG FIX: __exchange_and_add() does not seem to return updated __exchange_and_add(&counter, -1); return counter; // end modification by JCE #else int chk = atomic_dec_and_test(&atomic); if(chk) return 0; chk = atomic_read(&atomic); if(!chk) ++chk; return chk; #endif } int AtomicCounter::operator+=(int change) { #ifdef HAVE_ATOMIC_AIX return fetch_and_add((atomic_p)&counter, change); #elif defined(HAVE_GCC_BITS_ATOMIC) || defined(HAVE_GCC_CXX_BITS_ATOMIC) // Modified by JCE from 2v1.3.8 source, 30/Mar/2005 // BUG FIX: __exchange_and_add() does not seem to return updated __exchange_and_add(&counter, change); return counter; // end modification by JCE #else atomic_add(change, &atomic); return atomic_read(&atomic); #endif } int AtomicCounter::operator-=(int change) { #ifdef HAVE_ATOMIC_AIX return fetch_and_add((atomic_p)&counter, -change); #elif defined(HAVE_GCC_BITS_ATOMIC) || defined(HAVE_GCC_CXX_BITS_ATOMIC) // Modified by JCE from 2v1.3.8 source, 30/Mar/2005 // BUG FIX: __exchange_and_add() does not seem to return updated __exchange_and_add(&counter, -change); return counter; // end modification by JCE #else atomic_sub(change, &atomic); return atomic_read(&atomic); #endif } int AtomicCounter::operator+(int change) { #if defined(HAVE_ATOMIC_AIX) || defined(HAVE_GCC_BITS_ATOMIC) \ || defined(HAVE_GCC_CXX_BITS_ATOMIC) return counter + change; #else return atomic_read(&atomic) + change; #endif } int AtomicCounter::operator-(int change) { #if defined(HAVE_ATOMIC_AIX) || defined(HAVE_GCC_BITS_ATOMIC) \ || defined(HAVE_GCC_CXX_BITS_ATOMIC) return counter - change; #else return atomic_read(&atomic) - change; #endif } int AtomicCounter::operator=(int value) { #if defined(HAVE_ATOMIC_AIX) || defined(HAVE_GCC_BITS_ATOMIC) \ || defined(HAVE_GCC_CXX_BITS_ATOMIC) return counter = value; #else atomic_set(&atomic, value); return atomic_read(&atomic); #endif } bool AtomicCounter::operator!(void) { #if defined(HAVE_ATOMIC_AIX) || defined(HAVE_GCC_BITS_ATOMIC) \ || defined(HAVE_GCC_CXX_BITS_ATOMIC) int value = counter; #else int value = atomic_read(&atomic); #endif if(value) return false; return true; } AtomicCounter::operator int() { #if defined(HAVE_ATOMIC_AIX) || defined(HAVE_GCC_BITS_ATOMIC) \ || defined(HAVE_GCC_CXX_BITS_ATOMIC) return counter; #else return atomic_read(&atomic); #endif } #else // !HAVE_ATOMIC AtomicCounter::AtomicCounter() { counter = 0; pthread_mutexattr_t _attr; pthread_mutexattr_init(&_attr); pthread_mutex_init(&_mutex, &_attr); pthread_mutexattr_destroy(&_attr); } AtomicCounter::AtomicCounter(int value) { counter = value; pthread_mutexattr_t _attr; pthread_mutexattr_init(&_attr); pthread_mutex_init(&_mutex, &_attr); pthread_mutexattr_destroy(&_attr); } AtomicCounter::~AtomicCounter() { pthread_mutex_destroy(&_mutex); } int AtomicCounter::operator++(void) { int value; pthread_mutex_lock(&_mutex); value = ++counter; pthread_mutex_unlock(&_mutex); return value; } int AtomicCounter::operator--(void) { int value; pthread_mutex_lock(&_mutex); value = --counter; pthread_mutex_unlock(&_mutex); return value; } int AtomicCounter::operator+=(int change) { int value; pthread_mutex_lock(&_mutex); counter += change; value = counter; pthread_mutex_unlock(&_mutex); return value; } int AtomicCounter::operator-=(int change) { int value; pthread_mutex_lock(&_mutex); counter -= change; value = counter; pthread_mutex_unlock(&_mutex); return value; } int AtomicCounter::operator+(int change) { int value; pthread_mutex_lock(&_mutex); value = counter + change; pthread_mutex_unlock(&_mutex); return value; } int AtomicCounter::operator-(int change) { int value; pthread_mutex_lock(&_mutex); value = counter - change; pthread_mutex_unlock(&_mutex); return value; } AtomicCounter::operator int() { int value; pthread_mutex_lock(&_mutex); value = counter; pthread_mutex_unlock(&_mutex); return value; } int AtomicCounter::operator=(int value) { int ret; pthread_mutex_lock(&_mutex); ret = counter; counter = value; pthread_mutex_unlock(&_mutex); return ret; } bool AtomicCounter::operator!(void) { int value; pthread_mutex_lock(&_mutex); value = counter; pthread_mutex_unlock(&_mutex); if(value) return false; return true; } #endif // HAVE_ATOMIC #else // WIN32 int AtomicCounter::operator+=(int change) { // FIXME: enhance with InterlockExchangeAdd while(--change>=0) InterlockedIncrement(&atomic); return atomic; } int AtomicCounter::operator-=(int change) { // FIXME: enhance with InterlockExchangeAdd while(--change>=0) InterlockedDecrement(&atomic); return atomic; } #endif // !WIN32 #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/dso.cpp0000644000175000017500000001710211463375212012604 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif #ifdef HAVE_MODULES DSO *DSO::first = NULL; DSO *DSO::last = NULL; Mutex DSO::mutex; #if defined(HAVE_DLFCN_H) extern "C" { #include } #ifndef RTLD_GLOBAL #define RTLD_GLOBAL 0 #endif #endif // HAVE_DLFN_H void DSO::dynunload(void) { while(DSO::last) delete DSO::last; } DSO::~DSO() { #if defined(HAVE_MACH_DYLD) NSSymbol sym; void (*fini)(void); #endif MutexLock lock(mutex); #if defined(WIN32) if(hImage) FreeLibrary(hImage); #elif defined(HAVE_MACH_DYLD) if(oModule == NULL) return; sym = NSLookupSymbolInModule(oModule, "__fini"); if(sym != NULL) { fini = (void (*)(void))NSAddressOfSymbol(sym); fini(); } NSUnLinkModule(oModule, NSUNLINKMODULE_OPTION_NONE); #elif defined(HAVE_SHL_LOAD) if(image) shl_unload(image); #else if(image) dlclose(image); #endif if(first == this && last == this) first = last = NULL; if(!next && !prev) return; if(prev) prev->next = next; if(next) next->prev = prev; if(first == this) first = next; if(last == this) last = prev; } void DSO::loader(const char *filename, bool flag) { #if defined(HAVE_MACH_DYLD) NSObjectFileImage oImage; NSSymbol sym = NULL; void (*init)(void); #endif id = strrchr(filename, '/'); if(id) ++id; else id = filename; next = prev = NULL; #if defined(WIN32) hImage = LoadLibrary(filename); err = "none"; #elif defined(HAVE_MACH_DYLD) err = "none"; oModule = NULL; fprintf(stderr, "**** HERE %s\n", filename); switch(NSCreateObjectFileImageFromFile(filename, &oImage)) { case NSObjectFileImageSuccess: break; default: err = "unknown error"; return; } if(flag) oModule = NSLinkModule(oImage, filename, NSLINKMODULE_OPTION_BINDNOW | NSLINKMODULE_OPTION_RETURN_ON_ERROR); else oModule = NSLinkModule(oImage, filename, NSLINKMODULE_OPTION_RETURN_ON_ERROR); NSDestroyObjectFileImage(oImage); if(oModule != NULL) sym = NSLookupSymbolInModule(oModule, "__init"); if(sym) { init = (void (*)(void))NSAddressOfSymbol(sym); init(); } #elif defined(HAVE_SHL_LOAD) err = "none"; if(flag) image = shl_load(filename, BIND_IMMEDIATE, 0L); else image = shl_load(filename, BIND_DEFERRED, 0L); #else if(flag) image = dlopen(filename, RTLD_NOW | RTLD_GLOBAL); else image = dlopen(filename, RTLD_LAZY | RTLD_GLOBAL); #endif #if defined(WIN32) if(!hImage) { err = "load failed"; #elif defined(HAVE_MACH_DYLD) if(oModule == NULL) { err = "load failed"; #elif defined(HAVE_SHL_LOAD) if(!image) { err = "load failed"; #else if(!image) { err = dlerror(); #endif // since generally failure to map or load a plugin is fatel in most // cases, we should generally log the error to syslog as well as notify // the upper level system of the failure through exception. slog.error() << "dso: " << id << ": " << err << std::endl; #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) throw(this); #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) throw(DSOException(String(id) + err)); #endif #endif return; } if(!last) { last = first = this; return; } mutex.enterMutex(); last->next = this; prev = last; last = this; mutex.leaveMutex(); } DSO *DSO::getObject(const char *id) { const char *chk = strrchr(id, '/'); DSO *dso; if(chk) ++chk; else chk = id; mutex.enterMutex(); dso = first; while(dso) { if(!stricmp(dso->id, chk)) break; dso = dso->next; } mutex.leaveMutex(); return dso; } bool DSO::isValid(void) { #if defined(WIN32) if(!hImage) #elif defined(HAVE_MACH_DYLD) if(oModule == NULL) #else if(!image) #endif return false; return true; } void *DSO::operator[](const char *sym) { #if defined(HAVE_SHL_LOAD) int value; shl_t handle = (shl_t)image; if(shl_findsym(&handle, sym, 0, &value) == 0) return (void *)value; else return NULL; #elif defined(HAVE_MACH_DYLD) NSSymbol oSymbol = NSLookupSymbolInModule(oModule, sym); if(oSymbol) return NSAddressOfSymbol(oSymbol); else return NULL; #elif defined(WIN32) void *addr = (void *)GetProcAddress(hImage, sym); if(!addr) err = "symbol missing"; return addr; #else return dlsym(image, (char *)sym); #endif } #endif #ifdef HAVE_MACH_DYLD static void MyLinkError(NSLinkEditErrors c, int errorNumber, const char *filename, const char *errstr) { slog.error() << "dyld: " << filename << ": " << errstr << std::endl; } static void MyUndefined(const char *symname) { slog.error() << "dyld: undefined: " << symname << std::endl; } static NSModule MyMultiple(NSSymbol s, NSModule oMod, NSModule nMod) { slog.error() << "dyld: multiply defined symbols" << std::endl; } void DSO::setDebug(void) { static NSLinkEditErrorHandlers handlers = { &MyUndefined, &MyMultiple, &MyLinkError}; NSInstallLinkEditErrorHandlers(&handlers); } #else void DSO::setDebug(void) { } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/runlist.cpp0000644000175000017500000001020511463402066013512 00000000000000// Copyright (C) 2004-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #ifdef CCXX_NAMESPACES namespace ost { #endif Runlist::Runlist(unsigned count) : Mutex() { first = last = NULL; limit = count; used = 0; } void Runlist::del(Runable *run) { enter(); if(run->list != this) { leave(); return; } if(!run->next && !run->prev) { if(first == run && last == run) first = last = NULL; else --used; run->list = NULL; leave(); check(); return; } if(run->next) run->next->prev = run->prev; else last = run->prev; if(run->prev) run->prev->next = run->next; else first = run->next; run->list = NULL; run->next = run->prev = NULL; leave(); check(); return; } void Runlist::set(unsigned count) { limit = count; check(); } bool Runlist::add(Runable *run) { if(run->list) run->list->del(run); run->list = this; enter(); if(used < limit) { ++used; leave(); return true; } run->next = NULL; if(last) { run->prev = last; last = run; } else { run->prev = NULL; first = last = run; } leave(); return false; } void Runlist::check(void) { Runable *run; for(;;) { enter(); if(used >= limit || !first) { leave(); return; } run = first; first = run->next; if(first) first->prev = NULL; else last = NULL; run->next = run->prev = NULL; if(run->list == this) ++used; else run = NULL; leave(); if(run) run->ready(); } } Runable::Runable() { list = NULL; next = prev = NULL; } bool Runable::starting(Runlist *list) { stoping(); return list->add(this); } void Runable::stoping(void) { if(list) list->del(this); } Runable::~Runable() { stoping(); } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/ccgnu2-config.in0000755000175000017500000000416611463314535014301 00000000000000#!/bin/sh # Copyright (C) 2000-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. ost_cv_dynloader="@ost_cv_dynloader@" modflags="@MODULE_FLAGS@" ccflags="@THREAD_FLAGS@ @COMMON_FLAGS@" cclink="@SOCKET_LIBS@ @GETOPT_LIBS@ @THREAD_LIBS@" ccload="@DYN_LOADER@" ccstd="@SSL_LIBS@ @ZSTREAM_LIBS@" prefix="@prefix@" exec_prefix="@exec_prefix@" libdir="-L@libdir@" includedir="@includedir@" usage() { cat <&2 fi while test $# -gt 0 ; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case "$1" in --prefix=*) prefix=$optarg includedir=$prefix/include libdir=$prefix/lib ;; --sysroot=*) sysroot=$optarg prefix=$sysroot$prefix includedir=$sysroot$includedir libdir="-L$sysroot@libdir@" ;; --prefix) echo @prefix@ ;; --exec-prefix=*) exec_prefix=$optarg libdir=$exec_prefix/lib ;; --exec-prefix) echo $exec_prefix ;; --version) echo @VERSION@ ;; --flags) echo $ccflags ;; --libs | --gnulibs) echo $libdir -lccgnu2 $ccload $cclink ;; --cclibs) echo $cclink ;; --iolibs) echo $libdir -lccgnu2 $ccload $cclink ;; --stdlibs) echo $libdir -lccext2 -lccgnu2 $ccstd $ccload $cclink ;; --extlibs) echo -lccext2 $ccstd ;; --includes) echo -I$includedir ;; --dyn | --dso) echo $ost_cv_dynloader ;; --modflags | --module) echo $modflags ;; --help) usage 0 ;; *) usage 1 1>&2 ;; esac shift done commoncpp2-1.8.1/src/private.h0000644000175000017500000000312111463314535013133 00000000000000#ifndef CCXX_PRIVATE_H_ #define CCXX_PRIVATE_H_ #ifdef CCXX_NAMESPACES namespace ost { #endif class ThreadImpl { friend class Thread; friend class DummyThread; friend class PosixThread; friend class Slog; ThreadImpl(int type): _msgpos(0), _throw(Thread::throwObject), _tid(0), _suspendEnable(true), _type(type), #ifndef WIN32 _jtid(0) #else _detached(false), _active(false), _hThread(NULL), _cancellation(NULL) #endif { ; }; // derived class copy constructor creates new instance, so base // copy constructor of ThreadImpl should do nothing... ThreadImpl(const ThreadImpl& copy) {;}; ThreadImpl &operator=(const ThreadImpl& copy) {return *this;}; #ifdef _THR_MACH mach_port_t _mach; #endif #ifndef WIN32 pthread_attr_t _attr; AtomicCounter _suspendcount; static ThreadKey _self; #else size_t _stack; int _priority; HANDLE _cancellation; #endif // log information size_t _msgpos; char _msgbuf[128]; Thread::Throw _throw; cctid_t _tid; #ifndef WIN32 friend Thread *getThread(void); volatile bool _suspendEnable:1; unsigned int _type:3; cctid_t _jtid; #else bool _detached:1; bool _active:1; bool _suspendEnable:1; unsigned int _type:3; static unsigned __stdcall Execute(Thread *th); HANDLE _hThread; #endif public: // C binding functions static inline void ThreadExecHandler(Thread* th); #ifndef WIN32 static inline RETSIGTYPE ThreadSigSuspend(int); static inline void ThreadCleanup(Thread* arg); static inline void ThreadDestructor(Thread* arg); static inline void PosixThreadSigHandler(int signo); #endif }; #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/src/ssl.cpp0000644000175000017500000002557011463406413012626 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #ifdef CCXX_SSL #include #include #include #include #include #ifdef CCXX_GNUTLS #include #endif #ifdef WIN32 #include #define socket_errno WSAGetLastError() #else #define socket_errno errno #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif #ifdef CCXX_GNUTLS #ifndef WIN32 static int _gcry_mutex_init(Mutex **priv) { Mutex *m = new Mutex(); *priv = m; return 0; } static int _gcry_mutex_destroy(Mutex **priv) { delete *priv; return 0; } static int _gcry_mutex_lock(Mutex **priv) { (*priv)->enter(); return 0; } static int _gcry_mutex_unlock(Mutex **priv) { (*priv)->leave(); return 0; } extern "C" { static int _wrap_mutex_init(void **priv) { return _gcry_mutex_init((Mutex **)(priv)); } static int _wrap_mutex_destroy(void **priv) { return _gcry_mutex_destroy((Mutex **)(priv)); } static int _wrap_mutex_lock(void **priv) { return _gcry_mutex_lock((Mutex **)(priv)); } static int _wrap_mutex_unlock(void **priv) { return _gcry_mutex_unlock((Mutex **)(priv)); } static struct gcry_thread_cbs _gcry_threads = { GCRY_THREAD_OPTION_PTHREAD, NULL, _wrap_mutex_init, _wrap_mutex_destroy, _wrap_mutex_lock, _wrap_mutex_unlock }; }; #endif static class _ssl_global { public: _ssl_global() { #ifndef WIN32 gcry_control(GCRYCTL_SET_THREAD_CBS, &_gcry_threads); #endif gnutls_global_init(); } ~_ssl_global() { gnutls_global_deinit(); } } _ssl_global; #endif #ifdef CCXX_OPENSSL static Mutex *ssl_mutex = NULL; extern "C" { static void ssl_lock(int mode, int n, const char *file, int line) { if(mode && CRYPTO_LOCK) ssl_mutex[n].enter(); else ssl_mutex[n].leave(); } static unsigned long ssl_thread(void) { #ifdef WIN32 return GetCurrentThreadId(); #else return (unsigned long)pthread_self(); #endif } } // extern "C" static class _ssl_global { public: _ssl_global() { if(ssl_mutex) return; if(CRYPTO_get_id_callback() != NULL) return; ssl_mutex = new Mutex[CRYPTO_num_locks()]; CRYPTO_set_id_callback(ssl_thread); CRYPTO_set_locking_callback(ssl_lock); } ~_ssl_global() { if(!ssl_mutex) return; CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); delete[] ssl_mutex; ssl_mutex = NULL; } } _ssl_global; #endif SSLStream::SSLStream(Family f, bool tf, timeout_t to) : TCPStream(f, tf, to) { ssl = NULL; } SSLStream::SSLStream(const IPV4Host &h, tpport_t p, unsigned mss, bool tf, timeout_t to) : TCPStream(h, p, mss, tf, to) { ssl = NULL; } #ifdef CCXX_IPV6 SSLStream::SSLStream(const IPV6Host &h, tpport_t p, unsigned mss, bool tf, timeout_t to) : TCPStream(h, p, mss, tf, to) { ssl = NULL; } #endif SSLStream::SSLStream(const char *name, Family f, unsigned mss, bool tf, timeout_t to) : TCPStream(name, f, mss, tf, to) { ssl = NULL; } ssize_t SSLStream::readLine(char *str, size_t request, timeout_t timeout) { ssize_t nstat; unsigned count = 0; if(!ssl) return Socket::readLine(str, request, timeout); while(count < request) { if(timeout && !isPending(pendingInput, timeout)) { error(errTimeout, "Read timeout", 0); return -1; } #ifdef CCXX_GNUTLS nstat = gnutls_record_recv(ssl->session, str + count, 1); #else nstat = SSL_read(ssl, str + count, 1); #endif if(nstat <= 0) { error(errInput, "Could not read from socket", socket_errno); return -1; } if(str[count] == '\n') { if(count > 0 && str[count - 1] == '\r') --count; break; } ++count; } str[count] = 0; return count; } ssize_t SSLStream::writeData(void *source, size_t size, timeout_t timeout) { ssize_t nstat, count = 0; if(size < 1) return 0; const char *slide = (const char *)source; while(size) { if(timeout && !isPending(pendingOutput, timeout)) { error(errOutput); return -1; } #ifdef CCXX_GNUTLS nstat = gnutls_record_send(ssl->session, slide, size); #else nstat = SSL_write(ssl, slide, size); #endif if(nstat <= 0) { error(errOutput); return -1; } count += nstat; size -= nstat; slide += nstat; } return count; } ssize_t SSLStream::readData(void *target, size_t size, char separator, timeout_t timeout) { char *str = (char *)target; ssize_t nstat; unsigned count = 0; if(!ssl) return Socket::readData(target, size, separator, timeout); if(separator == 0x0d || separator == 0x0a) return readLine((char *)target, size, timeout); if(separator) { while(count < size) { if(timeout && !isPending(pendingInput, timeout)) { error(errTimeout, "Read timeout", 0); return -1; } #ifdef CCXX_GNUTLS nstat = gnutls_record_recv(ssl->session, str + count, 1); #else nstat = SSL_read(ssl, str + count, 1); #endif if(nstat <= 0) { error(errInput, "Could not read from socket", socket_errno); return -1; } if(str[count] == separator) break; ++count; } if(str[count] == separator) str[count] = 0; return count; } if(timeout && !isPending(pendingInput, timeout)) { error(errTimeout); return -1; } #ifdef CCXX_GNUTLS nstat = gnutls_record_recv(ssl->session, target, size); #else nstat = SSL_read(ssl, target, size); #endif if(nstat < 0) { error(errInput); return -1; } return nstat; } #ifdef CCXX_GNUTLS bool SSLStream::getSession(void) { const int cert_priority[3] = {GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0}; if(ssl) return true; if(so == INVALID_SOCKET) return false; ssl = new SSL; if(gnutls_init(&ssl->session, GNUTLS_CLIENT)) { delete ssl; ssl = NULL; return false; } gnutls_set_default_priority(ssl->session); gnutls_certificate_allocate_credentials(&ssl->xcred); gnutls_certificate_type_set_priority(ssl->session, cert_priority); gnutls_credentials_set(ssl->session, GNUTLS_CRD_CERTIFICATE, ssl->xcred); gnutls_transport_set_ptr(ssl->session, (gnutls_transport_ptr)so); if(gnutls_handshake(ssl->session)) { gnutls_deinit(ssl->session); gnutls_certificate_free_credentials(ssl->xcred); delete ssl; ssl = NULL; return false; } return true; } #else bool SSLStream::getSession(void) { SSL_CTX *ctx; int err; if(ssl) return true; if(so == INVALID_SOCKET) return false; ctx = SSL_CTX_new(SSLv3_client_method()); if(!ctx) { SSL_CTX_free(ctx); return false; } ssl = SSL_new(ctx); if(!ssl) { SSL_CTX_free(ctx); return false; } SSL_set_fd(ssl, so); SSL_set_connect_state(ssl); err = SSL_connect(ssl); if(err < 0) SSL_shutdown(ssl); if(err <= 0) { SSL_free(ssl); SSL_CTX_free(ctx); ssl = NULL; return false; } return true; } #endif #ifdef CCXX_GNUTLS void SSLStream::endStream(void) { if(ssl && so != INVALID_SOCKET) gnutls_bye(ssl->session, GNUTLS_SHUT_WR); TCPStream::endStream(); if(ssl) { gnutls_deinit(ssl->session); gnutls_certificate_free_credentials(ssl->xcred); delete ssl; ssl = NULL; } } void SSLStream::disconnect(void) { if(ssl && so != INVALID_SOCKET) gnutls_bye(ssl->session, GNUTLS_SHUT_WR); if(so != INVALID_SOCKET) TCPStream::disconnect(); if(ssl) { gnutls_deinit(ssl->session); gnutls_certificate_free_credentials(ssl->xcred); delete ssl; ssl = NULL; } } #else void SSLStream::disconnect(void) { if(ssl) { if(so != INVALID_SOCKET) SSL_shutdown(ssl); SSL_free(ssl); ssl = NULL; } TCPStream::disconnect(); } void SSLStream::endStream(void) { if(ssl) { if(so != INVALID_SOCKET) SSL_shutdown(ssl); SSL_free(ssl); ssl = NULL; } TCPStream::endStream(); } #endif SSLStream::~SSLStream() { #ifdef CCXX_EXCEPTIONS try { endStream(); } catch( ...) { if ( ! std::uncaught_exception()) throw;}; #else endStream(); #endif } #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/src/nat.h0000644000175000017500000000576611463314535012264 00000000000000// Copyright (C) 2004-2008 TintaDigital - STI, LDA. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other files // to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. /** * @file nat.h * @short Network Address Translation interface functions. * @author Ricardo Gameiro **/ #ifndef CCXX_NAT_H #define CCXX_NAT_H #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef WIN32 typedef int SOCKET; #endif enum natResult { natOK = 0, natSearchErr = 1, natNotSupported = 2, natDevUnavail = 3, natSocknameErr = 4, natPeernameErr = 5, natSockTypeErr = 6, natIFaceErr = 7, natUnkownErr = 8 }; typedef natResult natResult; /** * Perform NAT address table lookup for the current socket. * * @param sfd socket to get nat info from. * @param nat sockaddr structure to hold results. */ natResult natv4Lookup( SOCKET sfd, struct sockaddr_in * nat ); #ifdef CCXX_IPV6 natResult natv6Lookup( SOCKET sfd, struct sockaddr_in6 * nat ); #endif /** * Return descriptive text for the NAT Lookup return error. * * @param res result from NATLookup function. * @return error description. */ const char * natErrorString( natResult res ); #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/src/serial.cpp0000644000175000017500000011455311463402425013303 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include #include "private.h" #include #include #ifdef WIN32 #define B256000 CBR_256000 #define B128000 CBR_128000 #define B115200 CBR_115200 #define B57600 CBR_57600 #define B56000 CBR_56000 #define B38400 CBR_38400 #define B19200 CBR_19200 #define B14400 CBR_14400 #define B9600 CBR_9600 #define B4800 CBR_4800 #define B2400 CBR_2400 #define B1200 CBR_1200 #define B600 CBR_600 #define B300 CBR_300 #define B110 CBR_110 #include #include #else #include #include #endif #include #include #ifdef CCXX_NAMESPACES namespace ost { using std::streambuf; using std::iostream; using std::ios; #endif #ifndef MAX_INPUT #define MAX_INPUT 255 #endif #ifndef MAX_CANON #define MAX_CANON MAX_INPUT #endif #ifdef __FreeBSD__ #undef _PC_MAX_INPUT #undef _PC_MAX_CANON #endif #if defined(__QNX__) #define CRTSCTS (IHFLOW | OHFLOW) #endif #if defined(_THR_UNIXWARE) || defined(__hpux) || defined(_AIX) #include #define CRTSCTS (CTSXON | RTSXOFF) #endif // IRIX #ifndef CRTSCTS #ifdef CNEW_RTSCTS #define CRTSCTS (CNEW_RTSCTS) #endif #endif #if defined(CTSXON) && defined(RTSXOFF) && !defined(CRTSCTS) #define CRTSCTS (CTSXON | RTSXOFF) #endif #ifndef CRTSCTS #define CRTSCTS 0 #endif Serial::Serial(const char *fname) { initSerial(); open(fname); #ifdef WIN32 if(dev == INVALID_HANDLE_VALUE) #else if(dev < 0) #endif { error(errOpenFailed); return; } #ifdef WIN32 COMMTIMEOUTS CommTimeOuts ; GetCommTimeouts(dev, &CommTimeOuts); // CommTimeOuts.ReadIntervalTimeout = MAXDWORD; CommTimeOuts.ReadIntervalTimeout = 0; CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ; CommTimeOuts.WriteTotalTimeoutConstant = 1000; SetCommTimeouts(dev, &CommTimeOuts) ; #else if(!isatty(dev)) { Serial::close(); error(errOpenNoTty); return; } #endif } Serial::~Serial() { endSerial(); } void Serial::initConfig(void) { #ifdef WIN32 #define ASCII_XON 0x11 #define ASCII_XOFF 0x13 DCB * attr = (DCB *)current; DCB * orig = (DCB *)original; attr->DCBlength = sizeof(DCB); orig->DCBlength = sizeof(DCB); GetCommState(dev, orig); GetCommState(dev, attr); attr->DCBlength = sizeof(DCB); attr->BaudRate = 1200; attr->Parity = NOPARITY; attr->ByteSize = 8; attr->XonChar = ASCII_XON; attr->XoffChar = ASCII_XOFF; attr->XonLim = 100; attr->XoffLim = 100; attr->fOutxDsrFlow = 0; attr->fDtrControl = DTR_CONTROL_ENABLE; attr->fOutxCtsFlow = 1; attr->fRtsControl = RTS_CONTROL_ENABLE; attr->fInX = attr->fOutX = 0; attr->fBinary = true; attr->fParity = true; SetCommState(dev, attr); #else struct termios *attr = (struct termios *)current; struct termios *orig = (struct termios *)original; long ioflags = fcntl(dev, F_GETFL); tcgetattr(dev, (struct termios *)original); tcgetattr(dev, (struct termios *)current); attr->c_oflag = attr->c_lflag = 0; attr->c_cflag = CLOCAL | CREAD | HUPCL; attr->c_iflag = IGNBRK; memset(attr->c_cc, 0, sizeof(attr->c_cc)); attr->c_cc[VMIN] = 1; // inherit original settings, maybe we should keep more?? cfsetispeed(attr, cfgetispeed(orig)); cfsetospeed(attr, cfgetospeed(orig)); attr->c_cflag |= orig->c_cflag & (CRTSCTS | CSIZE | PARENB | PARODD | CSTOPB); attr->c_iflag |= orig->c_iflag & (IXON | IXANY | IXOFF); tcsetattr(dev, TCSANOW, attr); fcntl(dev, F_SETFL, ioflags & ~O_NDELAY); #if defined(TIOCM_RTS) && defined(TIOCMODG) int mcs = 0; ioctl(dev, TIOCMODG, &mcs); mcs |= TIOCM_RTS; ioctl(dev, TIOCMODS, &mcs); #endif #ifdef _COHERENT ioctl(dev, TIOCSRTS, 0); #endif #endif // WIN32 } void Serial::restore(void) { #ifdef WIN32 memcpy(current, original, sizeof(DCB)); SetCommState(dev, (DCB *)current); #else memcpy(current, original, sizeof(struct termios)); tcsetattr(dev, TCSANOW, (struct termios *)current); #endif } void Serial::initSerial(void) { flags.thrown = false; flags.linebuf = false; errid = errSuccess; errstr = NULL; dev = INVALID_HANDLE_VALUE; #ifdef WIN32 current = new DCB; original = new DCB; #else current = new struct termios; original = new struct termios; #endif } void Serial::endSerial(void) { #ifdef WIN32 if(dev == INVALID_HANDLE_VALUE && original) SetCommState(dev, (DCB *)original); if(current) delete (DCB *)current; if(original) delete (DCB *)original; #else if(dev < 0 && original) tcsetattr(dev, TCSANOW, (struct termios *)original); if(current) delete (struct termios *)current; if(original) delete (struct termios *)original; #endif Serial::close(); current = NULL; original = NULL; } Serial::Error Serial::error(Error err, char *errs) { errid = err; errstr = errs; if(!err) return err; if(flags.thrown) return err; // prevents recursive throws flags.thrown = true; #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) throw((Serial *)this); #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) { if(!errs) errs = (char *)""; throw SerException(String(errs)); } #endif #endif return err; } int Serial::setPacketInput(int size, unsigned char btimer) { #ifdef WIN32 // Still to be done...... return 0; #else #ifdef _PC_MAX_INPUT int max = fpathconf(dev, _PC_MAX_INPUT); #else int max = MAX_INPUT; #endif struct termios *attr = (struct termios *)current; if(size > max) size = max; attr->c_cc[VEOL] = attr->c_cc[VEOL2] = 0; attr->c_cc[VMIN] = (unsigned char)size; attr->c_cc[VTIME] = btimer; attr->c_lflag &= ~ICANON; tcsetattr(dev, TCSANOW, attr); bufsize = size; return size; #endif } int Serial::setLineInput(char newline, char nl1) { #ifdef WIN32 // Still to be done...... return 0; #else struct termios *attr = (struct termios *)current; attr->c_cc[VMIN] = attr->c_cc[VTIME] = 0; attr->c_cc[VEOL] = newline; attr->c_cc[VEOL2] = nl1; attr->c_lflag |= ICANON; tcsetattr(dev, TCSANOW, attr); #ifdef _PC_MAX_CANON bufsize = fpathconf(dev, _PC_MAX_CANON); #else bufsize = MAX_CANON; #endif return bufsize; #endif } void Serial::flushInput(void) { #ifdef WIN32 PurgeComm(dev, PURGE_RXABORT | PURGE_RXCLEAR); #else tcflush(dev, TCIFLUSH); #endif } void Serial::flushOutput(void) { #ifdef WIN32 PurgeComm(dev, PURGE_TXABORT | PURGE_TXCLEAR); #else tcflush(dev, TCOFLUSH); #endif } void Serial::waitOutput(void) { #ifdef WIN32 #else tcdrain(dev); #endif } Serial &Serial::operator=(const Serial &ser) { Serial::close(); if(ser.dev < 0) return *this; #ifdef WIN32 HANDLE process = GetCurrentProcess(); int result = DuplicateHandle(process, ser.dev, process, &dev, DUPLICATE_SAME_ACCESS, 0, 0); if (0 == result) { memcpy(current, ser.current, sizeof(DCB)); memcpy(original, ser.original, sizeof(DCB)); } #else dev = dup(ser.dev); memcpy(current, ser.current, sizeof(struct termios)); memcpy(original, ser.original, sizeof(struct termios)); #endif return *this; } void Serial::open(const char * fname) { #ifndef WIN32 int cflags = O_RDWR | O_NDELAY; dev = ::open(fname, cflags); if(dev > -1) initConfig(); #else // open COMM device dev = CreateFile(fname, GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // no security attrs OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING, NULL); if(dev != INVALID_HANDLE_VALUE) initConfig(); #endif } #ifdef WIN32 int Serial::aRead(char * Data, const int Length) { unsigned long dwLength = 0, dwError, dwReadLength; COMSTAT cs; OVERLAPPED ol; // Return zero if handle is invalid if(dev == INVALID_HANDLE_VALUE) return 0; // Read max length or only what is available ClearCommError(dev, &dwError, &cs); // If not requiring an exact byte count, get whatever is available if(Length > (int)cs.cbInQue) dwReadLength = cs.cbInQue; else dwReadLength = Length; memset(&ol, 0, sizeof(OVERLAPPED)); ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if(dwReadLength > 0) { if(ReadFile(dev, Data, dwReadLength, &dwLength, &ol) == FALSE) { if(GetLastError() == ERROR_IO_PENDING) { WaitForSingleObject(ol.hEvent, INFINITE); GetOverlappedResult(dev, &ol, &dwLength, TRUE); } else ClearCommError(dev, &dwError, &cs); } } if(ol.hEvent != INVALID_HANDLE_VALUE) CloseHandle(ol.hEvent); return dwLength; } int Serial::aWrite(const char * Data, const int Length) { COMSTAT cs; unsigned long dwError = 0; OVERLAPPED ol; // Clear the com port of any error condition prior to read ClearCommError(dev, &dwError, &cs); unsigned long retSize = 0; memset(&ol, 0, sizeof(OVERLAPPED)); ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if(WriteFile(dev, Data, Length, &retSize, &ol) == FALSE) { if(GetLastError() == ERROR_IO_PENDING) { WaitForSingleObject(ol.hEvent, INFINITE); GetOverlappedResult(dev, &ol, &retSize, TRUE); } else ClearCommError(dev, &dwError, &cs); } if(ol.hEvent != INVALID_HANDLE_VALUE) CloseHandle(ol.hEvent); return retSize; } #else int Serial::aRead(char *Data, const int Length) { return ::read(dev, Data, Length); } int Serial::aWrite(const char *Data, const int Length) { return ::write(dev, Data, Length); } #endif void Serial::close() { #ifdef WIN32 CloseHandle(dev); #else ::close(dev); #endif dev = INVALID_HANDLE_VALUE; } /* const int iAsync::getTimeOuts(unsigned long & readTimeout, unsigned long & writeTimeout) { return GetCommTimeouts(_TheHandle, &CommTimeOuts); } const int iAsync::setTimeOuts(unsigned long readTimeout, unsigned long writeTimeout) { COMMTIMEOUTS CommTimeOuts ; getTimeOuts(CommTimeOuts); CommTimeOuts.ReadIntervalTimeout = readTimeout; CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ; CommTimeOuts.WriteTotalTimeoutConstant = 1000; return GetCommTimeouts(_TheHandle, &CommTimeOuts); } return SetCommTimeouts(_TheHandle, &CommTimeOuts) ; { DCB dcb ; dcb.DCBlength = sizeof(DCB) ; GetCommState(_TheHandle, &dcb) ; // hardcode this stuff for now..... dcb.BaudRate = _TheBaudrate; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fOutxDsrFlow = 0; dcb.fDtrControl = DTR_CONTROL_ENABLE ; dcb.fOutxCtsFlow = 1; dcb.fRtsControl = RTS_CONTROL_HANDSHAKE ; dcb.fInX = dcb.fOutX = 0; dcb.XonChar = ASCII_XON; dcb.XoffChar = ASCII_XOFF; dcb.XonLim = 100; dcb.XoffLim = 100; // other various settings dcb.fBinary = TRUE; dcb.fParity = TRUE; GetCommState(_TheHandle, &dcb) ; dcb.DCBlength = sizeof(DCB) ; dcb.BaudRate = _TheBaudrate; SetCommState(_TheHandle, &dcb) ; } */ Serial::Error Serial::setSpeed(unsigned long speed) { unsigned long rate; switch(speed) { #ifdef B115200 case 115200: rate = B115200; break; #endif #ifdef B57600 case 57600: rate = B57600; break; #endif #ifdef B38400 case 38400: rate = B38400; break; #endif case 19200: rate = B19200; break; case 9600: rate = B9600; break; case 4800: rate = B4800; break; case 2400: rate = B2400; break; case 1200: rate = B1200; break; case 600: rate = B600; break; case 300: rate = B300; break; case 110: rate = B110; break; #ifdef B0 case 0: rate = B0; break; #endif default: return error(errSpeedInvalid); } #ifdef WIN32 DCB * dcb = (DCB *)current; dcb->DCBlength = sizeof(DCB); GetCommState(dev, dcb); dcb->BaudRate = rate; SetCommState(dev, dcb) ; #else struct termios *attr = (struct termios *)current; cfsetispeed(attr, rate); cfsetospeed(attr, rate); tcsetattr(dev, TCSANOW, attr); #endif return errSuccess; } Serial::Error Serial::setFlowControl(Flow flow) { #ifdef WIN32 DCB * attr = (DCB *)current; attr->XonChar = ASCII_XON; attr->XoffChar = ASCII_XOFF; attr->XonLim = 100; attr->XoffLim = 100; switch(flow) { case flowSoft: attr->fInX = attr->fOutX = 1; break; case flowBoth: attr->fInX = attr->fOutX = 1; case flowHard: attr->fOutxCtsFlow = 1; attr->fRtsControl = RTS_CONTROL_HANDSHAKE; break; case flowNone: break; default: return error(errFlowInvalid); } SetCommState(dev, attr); #else struct termios *attr = (struct termios *)current; attr->c_cflag &= ~CRTSCTS; attr->c_iflag &= ~(IXON | IXANY | IXOFF); switch(flow) { case flowSoft: attr->c_iflag |= (IXON | IXANY | IXOFF); break; case flowBoth: attr->c_iflag |= (IXON | IXANY | IXOFF); case flowHard: attr->c_cflag |= CRTSCTS; break; case flowNone: break; default: return error(errFlowInvalid); } tcsetattr(dev, TCSANOW, attr); #endif return errSuccess; } Serial::Error Serial::setStopBits(int bits) { #ifdef WIN32 DCB * attr = (DCB *)current; switch(bits) { case 1: attr->StopBits = ONESTOPBIT; break; case 2: attr->StopBits = TWOSTOPBITS; break; default: return error(errStopbitsInvalid); } SetCommState(dev, attr); #else struct termios *attr = (struct termios *)current; attr->c_cflag &= ~CSTOPB; switch(bits) { case 1: break; case 2: attr->c_cflag |= CSTOPB; break; default: return error(errStopbitsInvalid); } tcsetattr(dev, TCSANOW, attr); #endif return errSuccess; } Serial::Error Serial::setCharBits(int bits) { #ifdef WIN32 DCB * attr = (DCB *)current; switch(bits) { case 5: case 6: case 7: case 8: attr->ByteSize = bits; break; default: return error(errCharsizeInvalid); } SetCommState(dev, attr); #else struct termios *attr = (struct termios *)current; attr->c_cflag &= ~CSIZE; switch(bits) { case 5: attr->c_cflag |= CS5; break; case 6: attr->c_cflag |= CS6; break; case 7: attr->c_cflag |= CS7; break; case 8: attr->c_cflag |= CS8; break; default: return error(errCharsizeInvalid); } tcsetattr(dev, TCSANOW, attr); #endif return errSuccess; } Serial::Error Serial::setParity(Parity parity) { #ifdef WIN32 DCB * attr = (DCB *)current; switch(parity) { case parityEven: attr->Parity = EVENPARITY; break; case parityOdd: attr->Parity = ODDPARITY; break; case parityNone: attr->Parity = NOPARITY; break; default: return error(errParityInvalid); } SetCommState(dev, attr); #else struct termios *attr = (struct termios *)current; attr->c_cflag &= ~(PARENB | PARODD); switch(parity) { case parityEven: attr->c_cflag |= PARENB; break; case parityOdd: attr->c_cflag |= (PARENB | PARODD); break; case parityNone: break; default: return error(errParityInvalid); } tcsetattr(dev, TCSANOW, attr); #endif return errSuccess; } void Serial::sendBreak(void) { #ifdef WIN32 SetCommBreak(dev); Thread::sleep(100L); ClearCommBreak(dev); #else tcsendbreak(dev, 0); #endif } void Serial::toggleDTR(timeout_t millisec) { #ifdef WIN32 EscapeCommFunction(dev, CLRDTR); if(millisec) { Thread::sleep(millisec); EscapeCommFunction(dev, SETDTR); } #else struct termios tty, old; tcgetattr(dev, &tty); tcgetattr(dev, &old); cfsetospeed(&tty, B0); cfsetispeed(&tty, B0); tcsetattr(dev, TCSANOW, &tty); if(millisec) { Thread::sleep(millisec); tcsetattr(dev, TCSANOW, &old); } #endif } bool Serial::isPending(Pending pending, timeout_t timeout) { #ifdef WIN32 unsigned long dwError; COMSTAT cs; ClearCommError(dev, &dwError, &cs); if(timeout == 0 || ((pending == pendingInput) && (0 != cs.cbInQue)) || ((pending == pendingOutput) && (0 != cs.cbOutQue)) || (pending == pendingError)) { switch(pending) { case pendingInput: return (0 != cs.cbInQue); case pendingOutput: return (0 != cs.cbOutQue); case pendingError: return false; } } else { Thread::Cancel save = Thread::enterCancel(); OVERLAPPED ol; DWORD dwMask; DWORD dwEvents = 0; BOOL suc; memset(&ol, 0, sizeof(OVERLAPPED)); ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if(pending == pendingInput) dwMask = EV_RXCHAR; else if(pending == pendingOutput) dwMask = EV_TXEMPTY; else // on error dwMask = EV_ERR; SetCommMask(dev, dwMask); // let's wait for event or timeout if((suc = WaitCommEvent(dev, &dwEvents, &ol)) == FALSE) { if(GetLastError() == ERROR_IO_PENDING) { DWORD transferred; dwError = WaitForSingleObject(ol.hEvent, timeout); if (dwError != WAIT_OBJECT_0) SetCommMask(dev, 0); suc = GetOverlappedResult(dev, &ol, &transferred, TRUE); if (suc) suc = (dwEvents & dwMask) ? TRUE : FALSE; } else ClearCommError(dev, &dwError, &cs); } if(ol.hEvent != INVALID_HANDLE_VALUE) CloseHandle(ol.hEvent); Thread::exitCancel(save); if(suc == FALSE) return false; return true; } #else int status; #ifdef HAVE_POLL struct pollfd pfd; pfd.fd = dev; pfd.revents = 0; switch(pending) { case pendingInput: pfd.events = POLLIN; break; case pendingOutput: pfd.events = POLLOUT; break; case pendingError: pfd.events = POLLERR | POLLHUP; break; } status = 0; while(status < 1) { if(timeout == TIMEOUT_INF) status = poll(&pfd, 1, -1); else status = poll(&pfd, 1, timeout); if(status < 1) { if(status == -1 && errno == EINTR) continue; return false; } } if(pfd.revents & pfd.events) return true; #else struct timeval tv; fd_set grp; struct timeval *tvp = &tv; if(timeout == TIMEOUT_INF) tvp = NULL; else { tv.tv_usec = (timeout % 1000) * 1000; tv.tv_sec = timeout / 1000; } FD_ZERO(&grp); FD_SET(dev, &grp); switch(pending) { case pendingInput: status = select(dev + 1, &grp, NULL, NULL, tvp); break; case pendingOutput: status = select(dev + 1, NULL, &grp, NULL, tvp); break; case pendingError: status = select(dev + 1, NULL, NULL, &grp, tvp); break; } if(status < 1) return false; if(FD_ISSET(dev, &grp)) return true; #endif #endif // WIN32 return false; } TTYStream::TTYStream(const char *filename, timeout_t to) : streambuf(), Serial(filename), #ifdef HAVE_OLD_IOSTREAM iostream() #else iostream((streambuf *)this) #endif { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif gbuf = pbuf = NULL; timeout = to; if(INVALID_HANDLE_VALUE != dev) allocate(); } TTYStream::TTYStream() : streambuf(), Serial(), #ifdef HAVE_OLD_IOSTREAM iostream() #else iostream((streambuf *)this) #endif { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif timeout = 0; gbuf = pbuf = NULL; } TTYStream::~TTYStream() { endStream(); endSerial(); } void TTYStream::endStream(void) { if(bufsize) sync(); if(gbuf) { delete[] gbuf; gbuf = NULL; } if(pbuf) { delete[] pbuf; pbuf = NULL; } bufsize = 0; clear(); } void TTYStream::allocate(void) { if(INVALID_HANDLE_VALUE == dev) return; #ifdef _PC_MAX_INPUT bufsize = fpathconf(dev, _PC_MAX_INPUT); #else bufsize = MAX_INPUT; #endif gbuf = new char[bufsize]; pbuf = new char[bufsize]; if(!pbuf || !gbuf) { error(errResourceFailure); return; } clear(); #if !(defined(STLPORT) || defined(__KCC)) setg(gbuf, gbuf + bufsize, 0); #endif setg(gbuf, gbuf + bufsize, gbuf + bufsize); setp(pbuf, pbuf + bufsize); } int TTYStream::doallocate() { if(bufsize) return 0; allocate(); return 1; } void TTYStream::interactive(bool iflag) { #ifdef WIN32 if(dev == INVALID_HANDLE_VALUE) #else if(dev < 0) #endif return; if(bufsize >= 1) endStream(); if(iflag) { // setting to unbuffered mode bufsize = 1; gbuf = new char[bufsize]; #if !(defined(STLPORT) || defined(__KCC)) #if defined(__GNUC__) && (__GNUC__ < 3) setb(0,0); #endif #endif setg(gbuf, gbuf+bufsize, gbuf+bufsize); setp(pbuf, pbuf); return; } if(bufsize < 2) allocate(); } int TTYStream::uflow(void) { int rlen; unsigned char ch; if(bufsize < 2) { if(timeout) { if(Serial::isPending(pendingInput, timeout)) rlen = aRead((char *)&ch, 1); else rlen = -1; } else rlen = aRead((char *)&ch, 1); if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } return ch; } else { ch = underflow(); gbump(1); return ch; } } int TTYStream::underflow(void) { ssize_t rlen = 1; if(!gptr()) return EOF; if(gptr() < egptr()) return (unsigned char)*gptr(); rlen = (ssize_t)((gbuf + bufsize) - eback()); if(timeout && !Serial::isPending(pendingInput, timeout)) rlen = -1; else rlen = aRead((char *)eback(), rlen); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errInput); } return EOF; } setg(eback(), eback(), eback() + rlen); return (unsigned char) *gptr(); } int TTYStream::sync(void) { if(bufsize > 1 && pbase() && ((pptr() - pbase()) > 0)) { overflow(0); waitOutput(); setp(pbuf, pbuf + bufsize); } setg(gbuf, gbuf + bufsize, gbuf + bufsize); return 0; } int TTYStream::overflow(int c) { unsigned char ch; ssize_t rlen, req; if(bufsize < 2) { if(c == EOF) return 0; ch = (unsigned char)(c); rlen = aWrite((char *)&ch, 1); if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } else return c; } if(!pbase()) return EOF; req = (ssize_t)(pptr() - pbase()); if(req) { rlen = aWrite((char *)pbase(), req); if(rlen < 1) { if(rlen < 0) clear(ios::failbit | rdstate()); return EOF; } req -= rlen; } if(req) // memmove(pptr(), pptr() + rlen, req); memmove(pbuf, pbuf + rlen, req); setp(pbuf + req, pbuf + bufsize); if(c != EOF) { *pptr() = (unsigned char)c; pbump(1); } return c; } bool TTYStream::isPending(Pending pending, timeout_t timer) { // if(pending == pendingInput && in_avail()) // return true; // else if(pending == pendingOutput) // flush(); return Serial::isPending(pending, timer); } ttystream::ttystream() : TTYStream() { setError(false); } ttystream::ttystream(const char *name) : TTYStream() { setError(false); open(name); } void ttystream::close(void) { #ifdef WIN32 if (INVALID_HANDLE_VALUE == dev) #else if(dev < 0) #endif return; endStream(); restore(); TTYStream::close(); } void ttystream::open(const char *name) { const char *cpp; char *cp; char pathname[256]; size_t namelen; long opt; if (INVALID_HANDLE_VALUE != dev) { restore(); close(); } cpp = strrchr(name, ':'); if(cpp) namelen = cpp - name; else namelen = strlen(name); cp = pathname; #ifndef WIN32 if(*name != '/') { strcpy(pathname, "/dev/"); cp += 5; } if((cp - pathname) + namelen > 255) { error(errResourceFailure); return; } #endif setString(cp, pathname - cp + sizeof(pathname), name); cp += namelen; #ifdef WIN32 *cp++ = ':'; #endif *cp = 0; Serial::open(pathname); if(INVALID_HANDLE_VALUE == dev) { error(errOpenFailed); return; } allocate(); setString(pathname, sizeof(pathname), name + namelen); cp = pathname + 1; if(*pathname == ':') cp = strtok(cp, ","); else cp = NULL; while(cp) { switch(*cp) { case 'h': case 'H': setFlowControl(flowHard); break; case 's': case 'S': setFlowControl(flowSoft); break; case 'b': case 'B': setFlowControl(flowBoth); break; case 'n': case 'N': setParity(parityNone); break; case 'O': case 'o': setParity(parityOdd); break; case 'e': case 'E': setParity(parityEven); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': opt = atol(cp); if(opt == 1 || opt == 2) { setStopBits((int)opt); break; } if(opt > 4 && opt < 9) { setCharBits((int)opt); break; } setSpeed(opt); break; default: error(errOptionInvalid); } cp = strtok(NULL, ","); } } TTYSession::TTYSession(const char *filename, int pri, int stack) : Thread(pri, stack), TTYStream(filename) { setError(false); } TTYSession::~TTYSession() { terminate(); endSerial(); } #ifndef WIN32 // Not supporting this right now........ // SerialPort::SerialPort(SerialService *svc, const char *name) : Serial(name), detect_pending(true), detect_output(false), detect_disconnect(true) { next = prev = NULL; service = NULL; #ifdef WIN32 if(INVALID_HANDLE_VALUE != dev) #else if(dev > -1) #endif { setError(false); service = svc; svc->attach(this); } } SerialPort::~SerialPort() { if(service) service->detach(this); endSerial(); } void SerialPort::expired(void) { } void SerialPort::pending(void) { } void SerialPort::disconnect(void) { } void SerialPort::output(void) { } void SerialPort::setTimer(timeout_t ptimer) { TimerPort::setTimer(ptimer); service->update(); } void SerialPort::incTimer(timeout_t ptimer) { TimerPort::incTimer(ptimer); service->update(); } void SerialPort::setDetectPending( bool val ) { if ( detect_pending != val ) { detect_pending = val; #ifdef USE_POLL if ( ufd ) { if ( val ) { ufd->events |= POLLIN; } else { ufd->events &= ~POLLIN; } } #endif service->update(); } } void SerialPort::setDetectOutput( bool val ) { if ( detect_output != val ) { detect_output = val; #ifdef USE_POLL if ( ufd ) { if ( val ) { ufd->events |= POLLOUT; } else { ufd->events &= ~POLLOUT; } } #endif service->update(); } } SerialService::SerialService(int pri, size_t stack, const char *id) : Thread(pri, stack), Mutex(id) { long opt; first = last = NULL; count = 0; FD_ZERO(&connect); if(::pipe(iosync)) { #ifdef CCXX_EXCEPTIONS switch(Thread::getException()) { case throwObject: throw(this); return; #ifdef COMMON_STD_EXCEPTION case throwException: throw(ThrException("no service pipe")); return; #endif default: return; } #else return; #endif } hiwater = iosync[0] + 1; FD_SET(iosync[0], &connect); opt = fcntl(iosync[0], F_GETFL); fcntl(iosync[0], F_SETFL, opt | O_NDELAY); } SerialService::~SerialService() { update(0); terminate(); while(first) delete first; } void SerialService::onUpdate(unsigned char flag) { } void SerialService::onEvent(void) { } void SerialService::onCallback(SerialPort *port) { } void SerialService::attach(SerialPort *port) { enterMutex(); #ifdef USE_POLL port->ufd = 0; #endif if(last) last->next = port; port->prev = last; last = port; FD_SET(port->dev, &connect); if(port->dev >= hiwater) hiwater = port->dev + 1; if(!first) { first = port; leaveMutex(); ++count; start(); } else { leaveMutex(); update(); ++count; } } void SerialService::detach(SerialPort *port) { enterMutex(); #ifndef USE_POLL FD_CLR(port->dev, &connect); #endif if(port->prev) port->prev->next = port->next; else first = port->next; if(port->next) port->next->prev = port->prev; else last = port->prev; --count; leaveMutex(); update(); } void SerialService::update(unsigned char flag) { if(::write(iosync[1], (char *)&flag, 1) < 1) { #ifdef CCXX_EXCEPTIONS switch(Thread::getException()) { case throwObject: throw(this); return; #ifdef COMMON_STD_EXCEPTION case throwException: throw(ThrException("update failed")); return; #endif default: return; } #else return; #endif } } void SerialService::run(void) { timeout_t timer, expires; SerialPort *port; unsigned char buf; #ifdef USE_POLL Poller mfd; pollfd *p_ufd; int lastcount = 0; // initialize ufd in all attached ports : // probably don't need this but it can't hurt. enterMutex(); port = first; while(port) { port->ufd = 0; port = port->next; } leaveMutex(); #else struct timeval timeout, *tvp; fd_set inp, out, err; int dev; FD_ZERO(&inp); FD_ZERO(&out); FD_ZERO(&err); #endif setCancel(cancelDeferred); for(;;) { timer = TIMEOUT_INF; while(1 == ::read(iosync[0], (char *)&buf, 1)) { if(buf) { onUpdate(buf); continue; } setCancel(cancelImmediate); sleep(TIMEOUT_INF); exit(); } #ifdef USE_POLL bool reallocate = false; enterMutex(); onEvent(); port = first; while(port) { onCallback(port); if ( ( p_ufd = port->ufd ) ) { if ( ( POLLHUP | POLLNVAL ) & p_ufd->revents ) { // Avoid infinite loop from disconnected sockets port->detect_disconnect = false; p_ufd->events &= ~POLLHUP; port->disconnect(); } if ( ( POLLIN | POLLPRI ) & p_ufd->revents ) port->pending(); if ( POLLOUT & p_ufd->revents ) port->output(); } else { reallocate = true; } retry: expires = port->getTimer(); if(expires > 0) if(expires < timer) timer = expires; if(!expires) { port->endTimer(); port->expired(); goto retry; } port = port->next; } // // reallocate things if we saw a ServerPort without // ufd set ! if ( reallocate || ( ( count + 1 ) != lastcount ) ) { lastcount = count + 1; p_ufd = mfd.getList( count + 1 ); // Set up iosync polling p_ufd->fd = iosync[0]; p_ufd->events = POLLIN | POLLHUP; p_ufd ++; port = first; while(port) { p_ufd->fd = port->dev; p_ufd->events = ( port->detect_disconnect ? POLLHUP : 0 ) | ( port->detect_output ? POLLOUT : 0 ) | ( port->detect_pending ? POLLIN : 0 ) ; port->ufd = p_ufd; p_ufd ++; port = port->next; } } leaveMutex(); poll( mfd.getList(), count + 1, timer ); #else enterMutex(); onEvent(); port = first; while(port) { onCallback(port); dev = port->dev; if(FD_ISSET(dev, &err)) { port->detect_disconnect = false; port->disconnect(); } if(FD_ISSET(dev, &inp)) port->pending(); if(FD_ISSET(dev, &out)) port->output(); retry: expires = port->getTimer(); if(expires > 0) if(expires < timer) timer = expires; if(!expires) { port->endTimer(); port->expired(); goto retry; } port = port->next; } FD_ZERO(&inp); FD_ZERO(&out); FD_ZERO(&err); int so; port = first; while(port) { so = port->dev; if(port->detect_pending) FD_SET(so, &inp); if(port->detect_output) FD_SET(so, &out); if(port->detect_disconnect) FD_SET(so, &err); port = port->next; } leaveMutex(); if(timer == TIMEOUT_INF) tvp = NULL; else { tvp = &timeout; timeout.tv_sec = timer / 1000; timeout.tv_usec = (timer % 1000) * 1000; } select(hiwater, &inp, &out, &err, tvp); #endif } } #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 8 * End: */ commoncpp2-1.8.1/src/ccgnu2-config0000755000175000017500000000411211463364531013664 00000000000000#!/bin/sh # Copyright (C) 2000-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. ost_cv_dynloader="yes" modflags="-module -shared -avoid-version" ccflags=" -D_GNU_SOURCE" cclink=" -lrt -pthread -lpthread" ccload="-ldl" ccstd=" -lz" prefix="/usr" exec_prefix="${prefix}" libdir="-L${exec_prefix}/lib64" includedir="${prefix}/include" usage() { cat <&2 fi while test $# -gt 0 ; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case "$1" in --prefix=*) prefix=$optarg includedir=$prefix/include libdir=$prefix/lib ;; --sysroot=*) sysroot=$optarg prefix=$sysroot$prefix includedir=$sysroot$includedir libdir="-L$sysroot${exec_prefix}/lib64" ;; --prefix) echo /usr ;; --exec-prefix=*) exec_prefix=$optarg libdir=$exec_prefix/lib ;; --exec-prefix) echo $exec_prefix ;; --version) echo 1.8.1 ;; --flags) echo $ccflags ;; --libs | --gnulibs) echo $libdir -lccgnu2 $ccload $cclink ;; --cclibs) echo $cclink ;; --iolibs) echo $libdir -lccgnu2 $ccload $cclink ;; --stdlibs) echo $libdir -lccext2 -lccgnu2 $ccstd $ccload $cclink ;; --extlibs) echo -lccext2 $ccstd ;; --includes) echo -I$includedir ;; --dyn | --dso) echo $ost_cv_dynloader ;; --modflags | --module) echo $modflags ;; --help) usage 0 ;; *) usage 1 1>&2 ;; esac shift done commoncpp2-1.8.1/src/socket.cpp0000644000175000017500000026045311463405363013321 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2009 Leandro Melo de Sales // Copyright (C) 2006-2010 David Sugar, Tycho Softworks, // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include "private.h" #include "nat.h" #include #include #include #include #include #ifndef WIN32 #include #endif #ifdef WIN32 #include #define socket_errno WSAGetLastError() #endif #ifndef WIN32 #include #ifdef HAVE_NET_IP6_H #include #endif #if defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED) #undef _XOPEN_SOURCE_EXTENDED #endif #ifdef HAVE_NETINET_IN_H #include #endif #if defined(__hpux) #define _XOPEN_SOURCE_EXTENDED #endif #ifdef HAVE_NET_IF_H #include #endif #endif #ifndef WIN32 #define socket_errno errno # ifndef O_NONBLOCK # define O_NONBLOCK O_NDELAY # endif # ifdef IPPROTO_IP # ifndef SOL_IP # define SOL_IP IPPROTO_IP # endif // !SOL_IP # endif // IPPROTO_IP #endif // !WIN32 #ifndef INADDR_LOOPBACK #define INADDR_LOOPBACK (unsigned long)0x7f000001 #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif #if defined(WIN32) && !defined(__MINGW32__) static SOCKET dupSocket(SOCKET so,enum Socket::State state) { if (state == Socket::STREAM) return dup((int)so); HANDLE pidHandle = GetCurrentProcess(); HANDLE dupHandle; if(DuplicateHandle(pidHandle, reinterpret_cast(so), pidHandle, &dupHandle, 0, FALSE, DUPLICATE_SAME_ACCESS)) return reinterpret_cast(dupHandle); return INVALID_SOCKET; } # define DUP_SOCK(s,state) dupSocket(s,state) #else # define DUP_SOCK(s,state) dup(s) #endif Mutex Socket::mutex; bool Socket::check(Family fam) { SOCKET so = INVALID_SOCKET; switch(fam) { case IPV4: so = socket(fam, SOCK_DGRAM, IPPROTO_UDP); break; #ifdef CCXX_IPV6 case IPV6: so = socket(fam, SOCK_DGRAM, IPPROTO_UDP); break; #endif default: return false; } if(so == INVALID_SOCKET) return false; #ifdef WIN32 closesocket(so); #else close(so); #endif return true; } Socket::Socket() { setSocket(); } Socket::Socket(int domain, int type, int protocol) { setSocket(); so = socket(domain, type, protocol); if(so == INVALID_SOCKET) { error(errCreateFailed,(char *)"Could not create socket",socket_errno); return; } #ifdef SO_NOSIGPIPE int opt = 1; setsockopt(so, SOL_SOCKET, SO_NOSIGPIPE, (char *)&opt, sizeof(opt)); #endif state = AVAILABLE; } Socket::Socket(SOCKET fd) { setSocket(); if (fd == INVALID_SOCKET) { error(errCreateFailed,(char *)"Invalid socket handle passed",0); return; } so = fd; state = AVAILABLE; } Socket::Socket(const Socket &orig) { setSocket(); so = DUP_SOCK(orig.so,orig.state); if(so == INVALID_SOCKET) error(errCopyFailed,(char *)"Could not duplicate socket handle",socket_errno); state = orig.state; } Socket::~Socket() { endSocket(); } void Socket::setSocket(void) { flags.thrown = false; flags.broadcast = false; flags.route = true; flags.keepalive = false; flags.loopback = true; flags.multicast = false; flags.linger = false; flags.ttl = 1; errid = errSuccess; errstr = NULL; syserr = 0; state = INITIAL; so = INVALID_SOCKET; } Socket::Error Socket::sendLimit(int limit) { #ifdef SO_SNDLOWAT if(setsockopt(so, SOL_SOCKET, SO_SNDLOWAT, (char *)&limit, sizeof(limit))) return errInvalidValue; return errSuccess; #else return errServiceUnavailable; #endif } Socket::Error Socket::receiveLimit(int limit) { #ifdef SO_RCVLOWAT if(setsockopt(so, SOL_SOCKET, SO_RCVLOWAT, (char *)&limit, sizeof(limit))) return errInvalidValue; return errSuccess; #else return errServiceUnavailable; #endif } Socket::Error Socket::sendTimeout(timeout_t to) { #ifdef SO_SNDTIMEO struct timeval tv; tv.tv_sec = to / 1000; tv.tv_usec = (to % 1000) * 1000; if(setsockopt(so, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv))) return errInvalidValue; return errSuccess; #else return errServiceUnavailable; #endif } Socket::Error Socket::receiveTimeout(timeout_t to) { #ifdef SO_RCVTIMEO struct timeval tv; tv.tv_sec = to / 1000; tv.tv_usec = (to % 1000) * 1000; if(setsockopt(so, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv))) return errInvalidValue; return errSuccess; #else return errServiceUnavailable; #endif } Socket::Error Socket::sendBuffer(unsigned bufsize) { #ifdef SO_SNDBUF if(setsockopt(so, SOL_SOCKET, SO_SNDBUF, (char *)&bufsize, sizeof(bufsize))) return errInvalidValue; return errSuccess; #else return errServiceUnavailable; #endif } Socket::Error Socket::bufferSize(unsigned bufsize) { Error err = receiveBuffer(bufsize); if(err == errSuccess) err = sendBuffer(bufsize); return err; } Socket::Error Socket::receiveBuffer(unsigned bufsize) { #ifdef SO_RCVBUF if(setsockopt(so, SOL_SOCKET, SO_RCVBUF, (char *)&bufsize, sizeof(bufsize))) return errInvalidValue; return errSuccess; #else return errServiceUnavailable; #endif } ssize_t Socket::readLine(char *str, size_t request, timeout_t timeout) { bool crlf = false; bool nl = false; size_t nleft = request - 1; // leave also space for terminator int nstat,c; if(request < 1) return 0; str[0] = 0; while(nleft && !nl) { if(timeout) { if(!isPending(pendingInput, timeout)) { error(errTimeout,(char *)"Read timeout", 0); return -1; } } nstat = ::recv(so, str, _IOLEN64 nleft, MSG_PEEK); if(nstat <= 0) { error(errInput,(char *)"Could not read from socket", socket_errno); return -1; } // FIXME: if unique char in buffer is '\r' return "\r" // if buffer end in \r try to read another char? // and if timeout ?? // remember last \r for(c=0; c < nstat; ++c) { if(str[c] == '\n') { if (c > 0 && str[c-1] == '\r') crlf = true; ++c; nl = true; break; } } nstat = ::recv(so, str, _IOLEN64 c, 0); // TODO: correct ??? if(nstat < 0) break; // adjust ending \r\n in \n if(crlf) { --nstat; str[nstat - 1] = '\n'; } str += nstat; nleft -= nstat; } *str = 0; return (ssize_t)(request - nleft - 1); } ssize_t Socket::readData(void *Target, size_t Size, char Separator, timeout_t timeout) { if ((Separator == 0x0D) || (Separator == 0x0A)) return (readLine ((char *) Target, Size, timeout)); if (Size < 1) return (0); ssize_t nstat; if (Separator == 0) { // Flat-out read for a number of bytes. if (timeout) { if (!isPending (pendingInput, timeout)) { error(errTimeout); return (-1); } } nstat =::recv (so, (char *)Target, _IOLEN64 Size, 0); if (nstat < 0) { error (errInput); return (-1); } return (nstat); } ///////////////////////////////////////////////////////////// // Otherwise, we have a special char separator to use ///////////////////////////////////////////////////////////// bool found = false; size_t nleft = Size; int c; char *str = (char *) Target; memset (str, 0, Size); while (nleft && !found) { if (timeout) { if (!isPending (pendingInput, timeout)) { error(errTimeout); return (-1); } } nstat =::recv (so, str, _IOLEN64 nleft, MSG_PEEK); if (nstat <= 0) { error (errInput); return (-1); } for (c = 0; (c < nstat) && !found; ++c) { if (str[c] == Separator) found = true; } memset (str, 0, nleft); nstat =::recv (so, str, c, 0); if (nstat < 0) break; str += nstat; nleft -= nstat; } return (ssize_t)(Size - (ssize_t) nleft); } ssize_t Socket::writeData(const void *Source, size_t Size, timeout_t timeout) { if (Size < 1) return (0); ssize_t nstat; const char *Slide = (const char *) Source; while (true) { if (timeout) { if (!isPending (pendingOutput, timeout)) { error(errOutput); return (-1); } } nstat =::send (so, Slide, _IOLEN64 Size, MSG_NOSIGNAL); if (nstat <= 0) { error(errOutput); return (-1); } Size -= nstat; Slide += nstat; if (Size <= 0) break; } return (nstat); } bool Socket::isConnected(void) const { return (Socket::state == CONNECTED) ? true : false; } bool Socket::isActive(void) const { return (state != INITIAL) ? true : false; } bool Socket::operator!() const { return (Socket::state == INITIAL) ? true : false; } void Socket::endSocket(void) { if(Socket::state == STREAM) { state = INITIAL; #ifdef WIN32 if(so != (UINT)-1) { SOCKET sosave = so; so = INVALID_SOCKET; closesocket((int)sosave); } #else if(so > -1) { SOCKET sosave = so; so = INVALID_SOCKET; close(sosave); } #endif return; } state = INITIAL; if(so == INVALID_SOCKET) return; #ifdef SO_LINGER struct linger linger; if(flags.linger) { linger.l_onoff = 1; linger.l_linger = 60; } else linger.l_onoff = linger.l_linger = 0; setsockopt(so, SOL_SOCKET, SO_LINGER, (char *)&linger, (socklen_t)sizeof(linger)); #endif // shutdown(so, 2); #ifdef WIN32 closesocket(so); #else close(so); #endif so = INVALID_SOCKET; } #ifdef WIN32 Socket::Error Socket::connectError(void) { char* str = "Could not connect to remote host"; switch(WSAGetLastError()) { case WSAENETDOWN: return error(errResourceFailure,str,socket_errno); case WSAEINPROGRESS: return error(errConnectBusy,str,socket_errno); case WSAEADDRNOTAVAIL: return error(errConnectInvalid,str,socket_errno); case WSAECONNREFUSED: return error(errConnectRefused,str,socket_errno); case WSAENETUNREACH: return error(errConnectNoRoute,str,socket_errno); default: return error(errConnectFailed,str,socket_errno); } } #else Socket::Error Socket::connectError(void) { char* str = (char *)"Could not connect to remote host"; switch(errno) { #ifdef EHOSTUNREACH case EHOSTUNREACH: return error(errConnectNoRoute,str,socket_errno); #endif #ifdef ENETUNREACH case ENETUNREACH: return error(errConnectNoRoute,str,socket_errno); #endif case EINPROGRESS: return error(errConnectBusy,str,socket_errno); #ifdef EADDRNOTAVAIL case EADDRNOTAVAIL: return error(errConnectInvalid,str,socket_errno); #endif case ECONNREFUSED: return error(errConnectRefused,str,socket_errno); case ETIMEDOUT: return error(errConnectTimeout,str,socket_errno); default: return error(errConnectFailed,str,socket_errno); } } #endif Socket::Error Socket::error(Error err, const char *errs, long systemError) const { errid = err; errstr = errs; syserr = systemError; if(!err) return err; if(flags.thrown) return err; // prevents recursive throws flags.thrown = true; #ifdef CCXX_EXCEPTIONS switch(Thread::getException()) { case Thread::throwObject: THROW((Socket *)this); #ifdef COMMON_STD_EXCEPTION case Thread::throwException: { if(!errs) errs = (char *)""; THROW(SockException(String(errs), err, systemError)); } #endif case Thread::throwNothing: break; } #endif return err; } const char *Socket::getSystemErrorString(void) const { #ifdef CCXX_EXCEPTIONS SockException e(errstr, errid, syserr); return e.getSystemErrorString(); #else return NULL; #endif } Socket::Error Socket::setBroadcast(bool enable) { int opt = (enable ? 1 : 0); if(setsockopt(so, SOL_SOCKET, SO_BROADCAST, (char *)&opt, (socklen_t)sizeof(opt))) return error(errBroadcastDenied,(char *)"Could not set socket broadcast option",socket_errno); flags.broadcast = enable; return errSuccess; } Socket::Error Socket::setKeepAlive(bool enable) { int opt = (enable ? ~0: 0); #if (defined(SO_KEEPALIVE) || defined(WIN32)) if(setsockopt(so, SOL_SOCKET, SO_KEEPALIVE, (char *)&opt, (socklen_t)sizeof(opt))) return error(errKeepaliveDenied,(char *)"Could not set socket keep-alive option",socket_errno); #endif flags.keepalive = enable; return errSuccess; } Socket::Error Socket::setLinger(bool linger) { #ifdef SO_LINGER flags.linger = linger; return errSuccess; #else return error(errServiceUnavailable,(char *)"Socket lingering not supported"); #endif } Socket::Error Socket::setRouting(bool enable) { int opt = (enable ? 1 : 0); #ifdef SO_DONTROUTE if(setsockopt(so, SOL_SOCKET, SO_DONTROUTE, (char *)&opt, (socklen_t)sizeof(opt))) return error(errRoutingDenied,(char *)"Could not set dont-route socket option",socket_errno); #endif flags.route = enable; return errSuccess; } Socket::Error Socket::setNoDelay(bool enable) { int opt = (enable ? 1 : 0); if(setsockopt(so, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, (socklen_t)sizeof(opt))) return error(errNoDelay,(char *)"Could not set tcp-nodelay socket option",socket_errno); return errSuccess; } Socket::Error Socket::setTypeOfService(Tos service) { #ifdef SOL_IP unsigned char tos; switch(service) { #ifdef IPTOS_LOWDELAY case tosLowDelay: tos = IPTOS_LOWDELAY; break; #endif #ifdef IPTOS_THROUGHPUT case tosThroughput: tos = IPTOS_THROUGHPUT; break; #endif #ifdef IPTOS_RELIABILITY case tosReliability: tos = IPTOS_RELIABILITY; break; #endif #ifdef IPTOS_MINCOST case tosMinCost: tos = IPTOS_MINCOST; break; #endif default: return error(errServiceUnavailable,(char *)"Unknown type-of-service"); } if(setsockopt(so, SOL_IP, IP_TOS,(char *)&tos, (socklen_t)sizeof(tos))) return error(errServiceDenied,(char *)"Could not set type-of-service",socket_errno); return errSuccess; #else return error(errServiceUnavailable,(char *)"Socket type-of-service not supported",socket_errno); #endif } Socket::Error Socket::setTimeToLiveByFamily(unsigned char ttl, Family fam) { if(!flags.multicast) return error(errMulticastDisabled,(char *)"Multicast not enabled on socket"); switch(fam) { #ifdef CCXX_IPV6 case IPV6: flags.ttl = ttl; setsockopt(so, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl, sizeof(ttl)); return errSuccess; #endif case IPV4: #ifdef IP_MULTICAST_TTL flags.ttl = ttl; setsockopt(so, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)); return errSuccess; #endif default: return error(errServiceUnavailable, (char *)"Multicast not supported"); } } Socket::Error Socket::setLoopbackByFamily(bool enable, Family family) { unsigned char loop; if(!flags.multicast) return error(errMulticastDisabled,(char *)"Multicast not enabled on socket"); if(enable) loop = 1; else loop = 0; flags.loopback = enable; switch(family) { #ifdef CCXX_IPV6 case IPV6: setsockopt(so, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&loop, sizeof(loop)); return errSuccess; #endif case IPV4: #ifdef IP_MULTICAST_LOOP setsockopt(so, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loop, sizeof(loop)); return errSuccess; #endif default: return error(errServiceUnavailable,(char *)"Multicast not supported"); } } bool Socket::isPending(Pending pending, timeout_t timeout) { int status; #ifdef USE_POLL struct pollfd pfd; pfd.fd = so; pfd.revents = 0; if(so == INVALID_SOCKET) return true; switch(pending) { case pendingInput: pfd.events = POLLIN; break; case pendingOutput: pfd.events = POLLOUT; break; case pendingError: pfd.events = POLLERR | POLLHUP; break; } status = 0; while(status < 1) { if(timeout == TIMEOUT_INF) status = poll(&pfd, 1, -1); else status = poll(&pfd, 1, timeout); if(status < 1) { // don't stop polling because of a simple // signal :) if(status == -1 && errno == EINTR) continue; return false; } } if(pfd.revents & pfd.events) return true; return false; #else struct timeval tv; struct timeval *tvp = &tv; fd_set grp; if(timeout == TIMEOUT_INF) tvp = NULL; else { tv.tv_usec = (timeout % 1000) * 1000; tv.tv_sec = timeout / 1000; } FD_ZERO(&grp); SOCKET sosave = so; if(so == INVALID_SOCKET) return true; FD_SET(sosave, &grp); #ifdef WIN32 Thread::Cancel cancel = Thread::enterCancel(); #endif switch(pending) { case pendingInput: status = select((int)so + 1, &grp, NULL, NULL, tvp); break; case pendingOutput: status = select((int)so + 1, NULL, &grp, NULL, tvp); break; case pendingError: status = select((int)so + 1, NULL, NULL, &grp, tvp); break; } #ifdef WIN32 Thread::exitCancel(cancel); #endif if(status < 1) return false; if(FD_ISSET(so, &grp)) return true; return false; #endif } Socket &Socket::operator=(const Socket &from) { if(so == from.so) return *this; if(state != INITIAL) endSocket(); so = DUP_SOCK(from.so,from.state); if(so == INVALID_SOCKET) { error(errCopyFailed,(char *)"Could not duplicate socket handle",socket_errno); state = INITIAL; } else state = from.state; return *this; } void Socket::setCompletion(bool immediate) { flags.completion = immediate; #ifdef WIN32 unsigned long flag; // note that this will not work on some versions of Windows for Workgroups. Tough. -- jfc switch( immediate ) { case false: // this will not work if you are using WSAAsyncSelect or WSAEventSelect. // -- perhaps I should throw an exception flag = 1; // ioctlsocket( so, FIONBIO, (unsigned long *) 1); break; case true: flag = 0; // ioctlsocket( so, FIONBIO, (unsigned long *) 0); break; } ioctlsocket(so, FIONBIO, &flag); #else int fflags = fcntl(so, F_GETFL); switch( immediate ) { case false: fflags |= O_NONBLOCK; fcntl(so, F_SETFL, fflags); break; case true: fflags &=~ O_NONBLOCK; fcntl(so, F_SETFL, fflags); break; } #endif } IPV4Host Socket::getIPV4Sender(tpport_t *port) const { struct sockaddr_in from; char buf; socklen_t len = sizeof(from); int rc = ::recvfrom(so, &buf, 1, MSG_PEEK, (struct sockaddr *)&from, &len); #ifdef WIN32 if(rc < 1 && WSAGetLastError() != WSAEMSGSIZE) { if(port) *port = 0; memset((void*) &from, 0, sizeof(from)); error(errInput,(char *)"Could not read from socket",socket_errno); } #else if(rc < 0) { if(port) *port = 0; memset((void*) &from, 0, sizeof(from)); error(errInput,(char *)"Could not read from socket",socket_errno); } #endif else { if(rc < 1) memset((void*) &from, 0, sizeof(from)); if(port) *port = ntohs(from.sin_port); } return IPV4Host(from.sin_addr); } #ifdef CCXX_IPV6 IPV6Host Socket::getIPV6Sender(tpport_t *port) const { struct sockaddr_in6 from; char buf; socklen_t len = sizeof(from); int rc = ::recvfrom(so, &buf, 1, MSG_PEEK, (struct sockaddr *)&from, &len); #ifdef WIN32 if(rc < 1 && WSAGetLastError() != WSAEMSGSIZE) { if(port) *port = 0; memset((void*) &from, 0, sizeof(from)); error(errInput,(char *)"Could not read from socket",socket_errno); } #else if(rc < 0) { if(port) *port = 0; memset((void*) &from, 0, sizeof(from)); error(errInput,(char *)"Could not read from socket",socket_errno); } #endif else { if(rc < 1) memset((void*) &from, 0, sizeof(from)); if(port) *port = ntohs(from.sin6_port); } return IPV6Host(from.sin6_addr); } #endif IPV4Host Socket::getIPV4Local(tpport_t *port) const { struct sockaddr_in addr; socklen_t len = sizeof(addr); if(getsockname(so, (struct sockaddr *)&addr, &len)) { error(errResourceFailure,(char *)"Could not get socket address",socket_errno); if(port) *port = 0; memset(&addr.sin_addr, 0, sizeof(addr.sin_addr)); } else { if(port) *port = ntohs(addr.sin_port); } return IPV4Host(addr.sin_addr); } #ifdef CCXX_IPV6 IPV6Host Socket::getIPV6Local(tpport_t *port) const { struct sockaddr_in6 addr; socklen_t len = sizeof(addr); if(getsockname(so, (struct sockaddr *)&addr, &len)) { error(errResourceFailure,(char *)"Could not get socket address",socket_errno); if(port) *port = 0; memset(&addr.sin6_addr, 0, sizeof(addr.sin6_addr)); } else { if(port) *port = ntohs(addr.sin6_port); } return IPV6Host(addr.sin6_addr); } #endif IPV4Host Socket::getIPV4NAT(tpport_t *port) const { struct sockaddr_in addr; natResult res; if((res=natv4Lookup((int)so, &addr))!=natOK) { if(res==natNotSupported) error( errServiceUnavailable, natErrorString( res ) ); else if(res==natSearchErr) error( errSearchErr, natErrorString( res ) ); else error( errLookupFail, natErrorString( res ), socket_errno ); if(port) *port = 0; memset(&addr.sin_addr, 0, sizeof(addr.sin_addr)); } else { if(port) *port = ntohs(addr.sin_port); } return IPV4Host(addr.sin_addr); } #ifdef CCXX_IPV6 IPV6Host Socket::getIPV6NAT(tpport_t *port) const { struct sockaddr_in6 addr; natResult res; if((res=natv6Lookup(so, &addr))!=natOK) { if(res==natNotSupported) error( errServiceUnavailable, natErrorString( res ) ); else if(res==natSearchErr) error( errSearchErr, natErrorString( res ) ); else error( errLookupFail, natErrorString( res ), socket_errno ); if(port) *port = 0; memset(&addr.sin6_addr, 0, sizeof(addr.sin6_addr)); } else { if(port) *port = ntohs(addr.sin6_port); } return IPV6Host(addr.sin6_addr); } #endif IPV4Host Socket::getIPV4Peer(tpport_t *port) const { struct sockaddr_in addr; socklen_t len = sizeof(addr); if(getpeername(so, (struct sockaddr *)&addr, &len)) { #ifndef WIN32 if(errno == ENOTCONN) error(errNotConnected,(char *)"Could not get peer address",socket_errno); else #endif error(errResourceFailure,(char *)"Could not get peer address",socket_errno); if(port) *port = 0; memset(&addr.sin_addr, 0, sizeof(addr.sin_addr)); } else { if(port) *port = ntohs(addr.sin_port); } return IPV4Host(addr.sin_addr); } #ifdef CCXX_IPV6 IPV6Host Socket::getIPV6Peer(tpport_t *port) const { struct sockaddr_in6 addr; socklen_t len = sizeof(addr); if(getpeername(so, (struct sockaddr *)&addr, &len)) { #ifndef WIN32 if(errno == ENOTCONN) error(errNotConnected,(char *)"Could not get peer address",socket_errno); else #endif error(errResourceFailure,(char *)"Could not get peer address",socket_errno); if(port) *port = 0; memset(&addr.sin6_addr, 0, sizeof(addr.sin6_addr)); } else { if(port) *port = ntohs(addr.sin6_port); } return IPV6Host(addr.sin6_addr); } #endif Socket::Error Socket::setMulticastByFamily(bool enable, Family family) { socklen_t len; switch(family) { #ifdef CCXX_IPV6 case IPV6: struct sockaddr_in6 addr; len = sizeof(addr); if(enable == flags.multicast) return errSuccess; flags.multicast = enable; if(enable) getsockname(so, (struct sockaddr *)&addr, &len); else memset(&addr.sin6_addr, 0, sizeof(addr.sin6_addr)); setsockopt(so, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&addr.sin6_addr, sizeof(addr.sin6_addr)); return errSuccess; #endif case IPV4: #ifdef IP_MULTICAST_IF struct sockaddr_in addr4; len = sizeof(addr4); if(enable == flags.multicast) return errSuccess; flags.multicast = enable; if(enable) getsockname(so, (struct sockaddr *)&addr4, &len); else memset(&addr4.sin_addr, 0, sizeof(addr4.sin_addr)); setsockopt(so, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addr4.sin_addr, sizeof(addr4.sin_addr)); return errSuccess; #endif default: return error(errServiceUnavailable,(char *)"Multicast not supported"); } } Socket::Error Socket::join(const IPV4Multicast &ia) { #ifdef IP_ADD_MEMBERSHIP struct ip_mreq group; struct sockaddr_in myaddr; socklen_t len = sizeof(myaddr); if(!flags.multicast) return error(errMulticastDisabled,(char *)"Multicast not enabled on socket"); getsockname(so, (struct sockaddr *)&myaddr, &len); group.imr_interface.s_addr = INADDR_ANY; group.imr_multiaddr = getaddress(ia); setsockopt(so, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)); return errSuccess; #else return error(errServiceUnavailable,(char *)"Multicast not supported"); #endif } #ifdef CCXX_IPV6 Socket::Error Socket::join(const IPV6Multicast &ia) { #ifdef IPV6_ADD_MEMBERSHIP struct ipv6_mreq group; struct sockaddr_in6 myaddr; socklen_t len = sizeof(myaddr); if(!flags.multicast) return error(errMulticastDisabled,(char *)"Multicast not enabled on socket"); getsockname(so, (struct sockaddr *)&myaddr, &len); group.ipv6mr_interface = 0; group.ipv6mr_multiaddr = getaddress(ia); setsockopt(so, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&group, sizeof(group)); return errSuccess; #else return error(errServiceUnavailable,(char *)"Multicast not supported"); #endif } #endif Socket::Error Socket::drop(const IPV4Multicast &ia) { #ifdef IP_DROP_MEMBERSHIP struct ip_mreq group; struct sockaddr_in myaddr; socklen_t len = sizeof(myaddr); if(!flags.multicast) return error(errMulticastDisabled,(char *)"Multicast not enabled on socket"); getsockname(so, (struct sockaddr *)&myaddr, &len); group.imr_interface.s_addr = INADDR_ANY; group.imr_multiaddr = getaddress(ia); setsockopt(so, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&group, sizeof(group)); return errSuccess; #else return error(errServiceUnavailable,(char *)"Multicast not supported"); #endif } #ifdef CCXX_IPV6 Socket::Error Socket::drop(const IPV6Multicast &ia) { #ifdef IPV6_DROP_MEMBERSHIP struct ipv6_mreq group; struct sockaddr_in6 myaddr; socklen_t len = sizeof(myaddr); if(!flags.multicast) return error(errMulticastDisabled,(char *)"Multicast not enabled on socket"); getsockname(so, (struct sockaddr *)&myaddr, &len); group.ipv6mr_interface = 0; group.ipv6mr_multiaddr = getaddress(ia); setsockopt(so, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, (char *)&group, sizeof(group)); return errSuccess; #else return error(errServiceUnavailable,(char *)"Multicast not supported"); #endif } #endif #ifdef HAVE_GETADDRINFO UDPSocket::UDPSocket(const char *name, Family fam) : Socket(fam, SOCK_DGRAM, IPPROTO_UDP) { char namebuf[128], *cp; struct addrinfo hint, *list = NULL, *first; family = fam; switch(fam) { #ifdef CCXX_IPV6 case IPV6: peer.ipv6.sin6_family = family; break; #endif case IPV4: peer.ipv4.sin_family = family; } snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp && family == IPV4) cp = strrchr(namebuf, ':'); if(!cp) { cp = namebuf; name = NULL; } else { name = namebuf; *(cp++) = 0; if(!strcmp(name, "*")) name = NULL; } memset(&hint, 0, sizeof(hint)); hint.ai_family = family; hint.ai_socktype = SOCK_DGRAM; hint.ai_protocol = IPPROTO_UDP; hint.ai_flags = AI_PASSIVE; if(getaddrinfo(name, cp, &hint, &list) || !list) { error(errBindingFailed, (char *)"Could not find service", errno); endSocket(); return; } #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif first = list; while(list) { if(!bind(so, list->ai_addr, (socklen_t)list->ai_addrlen)) { state = BOUND; break; } list = list->ai_next; } freeaddrinfo(first); if(state != BOUND) { endSocket(); error(errBindingFailed, (char *)"Count not bind socket", errno); return; } } #else UDPSocket::UDPSocket(const char *name, Family fam) : Socket(fam, SOCK_DGRAM, IPPROTO_UDP) { char namebuf[128], *cp; tpport_t port; struct servent *svc; socklen_t alen; struct sockaddr *addr; family = fam; snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp && family == IPV4) cp = strrchr(namebuf, ':'); if(!cp) { cp = namebuf; name = "*"; } else { name = namebuf; *(cp++) = 0; } if(isdigit(*cp)) port = atoi(cp); else { mutex.enter(); svc = getservbyname(cp, "udp"); if(svc) port = ntohs(svc->s_port); mutex.leave(); if(!svc) { error(errBindingFailed, (char *)"Could not find service", errno); endSocket(); return; } } struct sockaddr_in addr4; IPV4Address ia4(name); #ifdef CCXX_IPV6 struct sockaddr_in6 addr6; IPV6Address ia6(name); #endif switch(family) { #ifdef CCXX_IPV6 case IPV6: peer.ipv6.sin6_family = family; memset(&addr6, 0, sizeof(addr6)); addr6.sin6_family = family; addr6.sin6_addr = getaddress(ia6); addr6.sin6_port = htons(port); alen = sizeof(addr6); addr = (struct sockaddr *)&addr6; break; #endif case IPV4: peer.ipv4.sin_family = family; memset(&addr4, 0, sizeof(addr4)); addr4.sin_family = family; addr4.sin_addr = getaddress(ia4); addr4.sin_port = htons(port); alen = sizeof(&addr4); addr = (struct sockaddr *)&addr4; } #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(!bind(so, addr, alen)) state = BOUND; if(state != BOUND) { endSocket(); error(errBindingFailed, (char *)"Count not bind socket", errno); return; } } #endif UDPSocket::UDPSocket(Family fam) : Socket(fam, SOCK_DGRAM, IPPROTO_UDP) { family = fam; memset(&peer, 0, sizeof(peer)); switch(fam) { #ifdef CCXX_IPV6 case IPV6: peer.ipv6.sin6_family = family; break; #endif case IPV4: peer.ipv4.sin_family = family; } } UDPSocket::UDPSocket(const IPV4Address &ia, tpport_t port) : Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) { family = IPV4; memset(&peer.ipv4, 0, sizeof(peer)); peer.ipv4.sin_family = AF_INET; peer.ipv4.sin_addr = getaddress(ia); peer.ipv4.sin_port = htons(port); #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&peer.ipv4, sizeof(peer.ipv4))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } state = BOUND; } #ifdef CCXX_IPV6 UDPSocket::UDPSocket(const IPV6Address &ia, tpport_t port) : Socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP) { family = IPV6; memset(&peer.ipv6, 0, sizeof(peer)); peer.ipv6.sin6_family = AF_INET6; peer.ipv6.sin6_addr = getaddress(ia); peer.ipv6.sin6_port = htons(port); #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&peer.ipv6, sizeof(peer.ipv6))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } state = BOUND; } #endif UDPSocket::~UDPSocket() { endSocket(); } ssize_t UDPSocket::send(const void *buf, size_t len) { struct sockaddr *addr = NULL; socklen_t alen = 0; switch(family) { #ifdef CCXX_IPV6 case IPV6: addr = (struct sockaddr *)&peer.ipv6; alen = sizeof(struct sockaddr_in6); break; #endif case IPV4: addr = (struct sockaddr *)&peer.ipv4; alen = sizeof(struct sockaddr_in); break; default: return -1; } if(isConnected()) { addr = NULL; alen = 0; } return _IORET64 ::sendto(so, (const char *)buf, _IOLEN64 len, MSG_NOSIGNAL, addr, alen); } ssize_t UDPSocket::receive(void *buf, size_t len, bool reply) { struct sockaddr *addr = NULL; struct sockaddr_in senderAddress; // DMC 2/7/05 ADD for use below. socklen_t alen = 0; switch(family) { #ifdef CCXX_IPV6 case IPV6: addr = (struct sockaddr *)&peer.ipv6; alen = sizeof(struct sockaddr_in6); break; #endif case IPV4: addr = (struct sockaddr *)&peer.ipv4; alen = sizeof(struct sockaddr_in); break; default: return -1; } if(isConnected() || !reply) { // DMC 2/7/05 MOD to use senderAddress instead of NULL, to prevent 10014 error // from recvfrom. //addr = NULL; //alen = 0; addr = (struct sockaddr*)(&senderAddress); alen = sizeof(struct sockaddr_in); } int bytes = ::recvfrom(so, (char *)buf, _IOLEN64 len, 0, addr, &alen); #ifdef WIN32 int code = 0; if (bytes == SOCKET_ERROR) { code = WSAGetLastError(); } #endif return _IORET64 bytes; } Socket::Error UDPSocket::join(const IPV4Multicast &ia,int InterfaceIndex) { #if defined(WIN32) && defined(IP_ADD_MEMBERSHIP) // DMC 2/7/05: Added WIN32 block. Win32 does not define the ip_mreqn structure, // so we must use ip_mreq with INADDR_ANY. struct ip_mreq group; struct sockaddr_in myaddr; socklen_t len = sizeof(myaddr); if(!flags.multicast) return error(errMulticastDisabled); memset(&group, 0, sizeof(group)); getsockname(so, (struct sockaddr *)&myaddr, &len); group.imr_multiaddr.s_addr = ia.getAddress().s_addr; group.imr_interface.s_addr = INADDR_ANY; int retval = setsockopt(so, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)); return errSuccess; #elif defined(IP_ADD_MEMBERSHIP) && defined(SIOCGIFINDEX) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) && !defined(_OSF_SOURCE) && !defined(__hpux) && !defined(__GNU__) struct ip_mreqn group; struct sockaddr_in myaddr; socklen_t len = sizeof(myaddr); if(!flags.multicast) return error(errMulticastDisabled); getsockname(so, (struct sockaddr *)&myaddr, &len); memset(&group, 0, sizeof(group)); memcpy(&group.imr_address, &myaddr.sin_addr, sizeof(&myaddr.sin_addr)); group.imr_multiaddr = getaddress(ia); group.imr_ifindex = InterfaceIndex; setsockopt(so, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)); return errSuccess; #elif defined(IP_ADD_MEMBERSHIP) // if no by index, use INADDR_ANY struct ip_mreq group; struct sockaddr_in myaddr; socklen_t len = sizeof(myaddr); if(!flags.multicast) return error(errMulticastDisabled); getsockname(so, (struct sockaddr *)&myaddr, &len); memset(&group, sizeof(group), 0); group.imr_multiaddr.s_addr = ia.getAddress().s_addr; group.imr_interface.s_addr = INADDR_ANY; setsockopt(so, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)); return errSuccess; #else return error(errServiceUnavailable); #endif } Socket::Error UDPSocket::getInterfaceIndex(const char *DeviceName,int& InterfaceIndex) { #ifndef WIN32 #if defined(IP_ADD_MEMBERSHIP) && defined(SIOCGIFINDEX) && !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) && !defined(_OSF_SOURCE) && !defined(__hpux) && !defined(__GNU__) struct ip_mreqn mreqn; struct ifreq m_ifreq; int i; sockaddr_in* in4 = (sockaddr_in*) &peer.ipv4; InterfaceIndex = -1; memset(&mreqn, 0, sizeof(mreqn)); memcpy(&mreqn.imr_multiaddr.s_addr, &in4->sin_addr, sizeof(mreqn.imr_multiaddr.s_addr)); for (i = 0; i < IFNAMSIZ && DeviceName[i]; ++i) m_ifreq.ifr_name[i] = DeviceName[i]; for (; i < IFNAMSIZ; ++i) m_ifreq.ifr_name[i] = 0; if (ioctl (so, SIOCGIFINDEX, &m_ifreq)) return error(errServiceUnavailable); #if defined(__FreeBSD__) || defined(__GNU__) InterfaceIndex = m_ifreq.ifr_ifru.ifru_index; #else InterfaceIndex = m_ifreq.ifr_ifindex; #endif return errSuccess; #else return error(errServiceUnavailable); #endif #else return error(errServiceUnavailable); #endif // WIN32 } #ifdef AF_UNSPEC Socket::Error UDPSocket::disconnect(void) { struct sockaddr_in addr; int len = sizeof(addr); if(so == INVALID_SOCKET) return errSuccess; Socket::state = BOUND; memset(&addr, 0, len); #ifndef WIN32 addr.sin_family = AF_UNSPEC; #else addr.sin_family = AF_INET; memset(&addr.sin_addr, 0, sizeof(addr.sin_addr)); #endif if(::connect(so, (sockaddr *)&addr, len)) return connectError(); return errSuccess; } #else Socket::Error UDPSocket::disconnect(void) { if(so == INVALID_SOCKET) return errSuccess; Socket::state = BOUND; return connect(getLocal()); } #endif void UDPSocket::setPeer(const IPV4Host &ia, tpport_t port) { memset(&peer.ipv4, 0, sizeof(peer.ipv4)); peer.ipv4.sin_family = AF_INET; peer.ipv4.sin_addr = getaddress(ia); peer.ipv4.sin_port = htons(port); } void UDPSocket::connect(const IPV4Host &ia, tpport_t port) { setPeer(ia, port); if(so == INVALID_SOCKET) return; if(!::connect(so, (struct sockaddr *)&peer.ipv4, sizeof(struct sockaddr_in))) Socket::state = CONNECTED; } #ifdef CCXX_IPV6 void UDPSocket::setPeer(const IPV6Host &ia, tpport_t port) { memset(&peer.ipv6, 0, sizeof(peer.ipv6)); peer.ipv6.sin6_family = AF_INET6; peer.ipv6.sin6_addr = getaddress(ia); peer.ipv6.sin6_port = htons(port); } void UDPSocket::connect(const IPV6Host &ia, tpport_t port) { setPeer(ia, port); if(so == INVALID_SOCKET) return; if(!::connect(so, (struct sockaddr *)&peer.ipv6, sizeof(struct sockaddr_in6))) Socket::state = CONNECTED; } #endif #ifdef HAVE_GETADDRINFO void UDPSocket::setPeer(const char *name) { char namebuf[128], *cp; struct addrinfo hint, *list; snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) return; memset(&hint, 0, sizeof(hint)); hint.ai_family = family; hint.ai_socktype = SOCK_DGRAM; hint.ai_protocol = IPPROTO_UDP; if(getaddrinfo(namebuf, cp, &hint, &list) || !list) return; switch(family) { #ifdef CCXX_IPV6 case IPV6: memcpy(&peer.ipv6, list->ai_addr, sizeof(peer.ipv6)); break; #endif case IPV4: memcpy(&peer.ipv4, list->ai_addr, sizeof(peer.ipv4)); break; } freeaddrinfo(list); } #else void UDPSocket::setPeer(const char *name) { char namebuf[128], *cp; struct servent *svc; tpport_t port; snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) return; if(isdigit(*cp)) port = atoi(cp); else { mutex.enter(); svc = getservbyname(cp, "udp"); if(svc) port = ntohs(svc->s_port); mutex.leave(); if(!svc) return; } memset(&peer, 0, sizeof(peer)); switch(family) { #ifdef CCXX_IPV6 case IPV6: setPeer(IPV6Host(namebuf), port); break; #endif case IPV4: setPeer(IPV4Host(namebuf), port); break; } } #endif void UDPSocket::connect(const char *service) { int rtn = -1; setPeer(service); if(so == INVALID_SOCKET) return; switch(family) { #ifdef CCXX_IPV6 case IPV6: rtn = ::connect(so, (struct sockaddr *)&peer.ipv6, sizeof(struct sockaddr_in6)); break; #endif case IPV4: rtn = ::connect(so, (struct sockaddr *)&peer.ipv4, sizeof(struct sockaddr_in)); break; } if(!rtn) Socket::state = CONNECTED; } IPV4Host UDPSocket::getIPV4Peer(tpport_t *port) const { // FIXME: insufficient buffer // how to retrieve peer ?? char buf; socklen_t len = sizeof(peer.ipv4); int rtn = ::recvfrom(so, &buf, 1, MSG_PEEK, (struct sockaddr *)&peer.ipv4, &len); #ifdef WIN32 if(rtn < 1 && WSAGetLastError() != WSAEMSGSIZE) { if(port) *port = 0; memset((void*) &peer.ipv4, 0, sizeof(peer.ipv4)); } #else if(rtn < 1) { if(port) *port = 0; memset((void*) &peer.ipv4, 0, sizeof(peer.ipv4)); } #endif else { if(port) *port = ntohs(peer.ipv4.sin_port); } return IPV4Host(peer.ipv4.sin_addr); } #ifdef CCXX_IPV6 IPV6Host UDPSocket::getIPV6Peer(tpport_t *port) const { // FIXME: insufficient buffer // how to retrieve peer ?? char buf; socklen_t len = sizeof(peer.ipv6); int rtn = ::recvfrom(so, &buf, 1, MSG_PEEK, (struct sockaddr *)&peer.ipv6, &len); #ifdef WIN32 if(rtn < 1 && WSAGetLastError() != WSAEMSGSIZE) { if(port) *port = 0; memset((void*) &peer.ipv6, 0, sizeof(peer.ipv6)); } #else if(rtn < 1) { if(port) *port = 0; memset((void*) &peer.ipv6, 0, sizeof(peer.ipv6)); } #endif else { if(port) *port = ntohs(peer.ipv6.sin6_port); } return IPV6Host(peer.ipv6.sin6_addr); } #endif UDPBroadcast::UDPBroadcast(const IPV4Address &ia, tpport_t port) : UDPSocket(ia, port) { if(so != INVALID_SOCKET) setBroadcast(true); } void UDPBroadcast::setPeer(const IPV4Broadcast &ia, tpport_t port) { memset(&peer.ipv4, 0, sizeof(peer.ipv4)); peer.ipv4.sin_family = AF_INET; peer.ipv4.sin_addr = getaddress(ia); peer.ipv4.sin_port = htons(port); } void TCPSocket::setSegmentSize(unsigned mss) { #ifdef TCP_MAXSEG if(mss > 1) setsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&mss, sizeof(mss)); #endif segsize = mss; } #ifdef HAVE_GETADDRINFO TCPSocket::TCPSocket(const char *name, unsigned backlog, unsigned mss) : Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) { char namebuf[128], *cp; struct addrinfo hint, *list = NULL, *first; snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { cp = namebuf; name = NULL; } else { name = namebuf; *(cp++) = 0; if(!strcmp(name, "*")) name = NULL; } memset(&hint, 0, sizeof(hint)); hint.ai_family = AF_INET; hint.ai_socktype = SOCK_STREAM; hint.ai_protocol = IPPROTO_TCP; hint.ai_flags = AI_PASSIVE; if(getaddrinfo(name, cp, &hint, &list) || !list) { endSocket(); error(errBindingFailed, (char *)"Could not find service", errno); return; } #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif first = list; while(list) { if(!bind(so, list->ai_addr, (socklen_t)list->ai_addrlen)) { state = BOUND; break; } list = list->ai_next; } freeaddrinfo(first); if(state != BOUND) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } setSegmentSize(mss); if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket",socket_errno); return; } } #else TCPSocket::TCPSocket(const char *name, unsigned backlog, unsigned mss) : Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) { char namebuf[128], *cp; struct sockaddr_in addr; struct servent *svc; memset(&addr, 0, sizeof(addr)); snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { cp = namebuf; name = "*"; } else { name = namebuf; *(cp++) = 0; } addr.sin_family = AF_INET; if(isdigit(*cp)) addr.sin_port = htons(atoi(cp)); else { mutex.enter(); svc = getservbyname(cp, "tcp"); if(svc) addr.sin_port = svc->s_port; mutex.leave(); if(!svc) { endSocket(); error(errBindingFailed, "Could not find service", errno); return; } } IPV4Address ia(name); addr.sin_addr = getaddress(ia); #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&addr, sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } setSegmentSize(mss); if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket", socket_errno); return; } state = BOUND; } #endif TCPSocket::TCPSocket(const IPV4Address &ia, tpport_t port, unsigned backlog, unsigned mss) : Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = getaddress(ia); addr.sin_port = htons(port); #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&addr, sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } setSegmentSize(mss); if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket",socket_errno); return; } state = BOUND; } bool TCPSocket::onAccept(const IPV4Host &ia, tpport_t port) { return true; } TCPSocket::~TCPSocket() { endSocket(); } #ifdef CCXX_IPV6 void TCPV6Socket::setSegmentSize(unsigned mss) { #ifdef TCP_MAXSEG if(mss > 1) setsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&mss, sizeof(mss)); #endif segsize = mss; } #ifdef HAVE_GETADDRINFO TCPV6Socket::TCPV6Socket(const char *name, unsigned backlog, unsigned mss) : Socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) { char namebuf[128], *cp; struct addrinfo hint, *list = NULL, *first; snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) { cp = namebuf; name = NULL; } else { name = namebuf; *(cp++) = 0; if(!strcmp(name, "*")) name = NULL; } memset(&hint, 0, sizeof(hint)); hint.ai_family = AF_INET6; hint.ai_socktype = SOCK_STREAM; hint.ai_protocol = IPPROTO_TCP; hint.ai_flags = AI_PASSIVE; if(getaddrinfo(name, cp, &hint, &list) || !list) { endSocket(); error(errBindingFailed, (char *)"Could not find service", errno); return; } #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif first = list; while(list) { if(!bind(so, list->ai_addr, (socklen_t)list->ai_addrlen)) { state = BOUND; break; } list = list->ai_next; } freeaddrinfo(first); if(state != BOUND) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } setSegmentSize(mss); if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket",socket_errno); return; } } #else TCPV6Socket::TCPV6Socket(const char *name, unsigned backlog, unsigned mss) : Socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) { char namebuf[128], *cp; struct sockaddr_in6 addr; struct servent *svc; memset(&addr, 0, sizeof(addr)); snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) { cp = namebuf; name = "*"; } else { name = namebuf; *(cp++) = 0; } addr.sin6_family = AF_INET6; if(isdigit(*cp)) addr.sin6_port = htons(atoi(cp)); else { mutex.enter(); svc = getservbyname(cp, "tcp"); if(svc) addr.sin6_port = svc->s_port; mutex.leave(); if(!svc) { endSocket(); error(errBindingFailed, "Could not find service", errno); return; } } IPV6Address ia(name); addr.sin6_addr = getaddress(ia); #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&addr, sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } setSegmentSize(mss); if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket", socket_errno); return; } state = BOUND; } #endif TCPV6Socket::TCPV6Socket(const IPV6Address &ia, tpport_t port, unsigned backlog, unsigned mss) : Socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) { struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_addr = getaddress(ia); addr.sin6_port = htons(port); #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&addr, sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } setSegmentSize(mss); if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket",socket_errno); return; } state = BOUND; } bool TCPV6Socket::onAccept(const IPV6Host &ia, tpport_t port) { return true; } TCPV6Socket::~TCPV6Socket() { endSocket(); } #endif void TCPSocket::reject(void) { SOCKET rej = accept(so, NULL, NULL); shutdown(rej, 2); #ifdef WIN32 closesocket(rej); #else close(rej); #endif } #ifdef CCXX_IPV6 void TCPV6Socket::reject(void) { SOCKET rej = accept(so, NULL, NULL); shutdown(rej, 2); #ifdef WIN32 closesocket(rej); #else close(rej); #endif } #endif DCCPSocket::DCCPSocket(Family fam) : Socket(fam, SOCK_DCCP, IPPROTO_DCCP) { family = fam; } DCCPSocket::DCCPSocket(DCCPSocket& server, timeout_t timeout) : Socket(accept(server.so, NULL, NULL)) { family = server.family; Socket::state = CONNECTED; socklen_t alen = sizeof(peer); getpeername(so, (struct sockaddr *)&peer, &alen); switch(family) { #ifdef CCXX_IPV6 case IPV6: if(!server.onAccept(IPV6Host(peer.ipv6.sin6_addr), peer.ipv6.sin6_port)) endSocket(); break; #endif case IPV4: if(!server.onAccept(IPV4Host(peer.ipv4.sin_addr), peer.ipv4.sin_port)) endSocket(); break; } } #ifdef HAVE_GETADDRINFO DCCPSocket::DCCPSocket(const char *name, Family fam, unsigned backlog) : Socket(fam, SOCK_DCCP, IPPROTO_DCCP) { char namebuf[128], *cp; struct addrinfo hint, *list = NULL, *first; snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { cp = namebuf; name = NULL; } else { name = namebuf; *(cp++) = 0; if(!strcmp(name, "*")) name = NULL; } family = fam; memset(&hint, 0, sizeof(hint)); hint.ai_family = family; hint.ai_socktype = SOCK_DCCP; hint.ai_protocol = IPPROTO_DCCP; hint.ai_flags = AI_PASSIVE; if(getaddrinfo(name, cp, &hint, &list) || !list) { endSocket(); error(errBindingFailed, (char *)"Could not find service", errno); return; } #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif first = list; while(list) { if(!bind(so, list->ai_addr, (socklen_t)list->ai_addrlen)) { state = BOUND; break; } list = list->ai_next; } freeaddrinfo(first); if(state != BOUND) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket",socket_errno); return; } } #else DCCPSocket::DCCPSocket(const char *name, Family fam, unsigned backlog) : Socket(fam, SOCK_DCCP, IPPROTO_DCCP) { char namebuf[128], *cp; struct sockaddr_in addr; #ifdef CCXX_IPV6 struct sockaddr_in6 addr6; #endif struct sockaddr_in *ap; socklen_t alen = 0; struct servent *svc; family = fam; memset(&addr, 0, sizeof(addr)); snprintf(namebuf, sizeof(namebuf), "%s", name); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { cp = namebuf; name = "*"; } else { name = namebuf; *(cp++) = 0; } addr.sin_family = family; if(isdigit(*cp)) addr.sin_port = htons(atoi(cp)); else { mutex.enter(); svc = getservbyname(cp, "dccp"); if(svc) addr.sin_port = svc->s_port; mutex.leave(); if(!svc) { endSocket(); error(errBindingFailed, "Could not find service", errno); return; } } #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif switch(family) { #ifdef CCXX_IPV6 case IPV6: IPV6Address ia6(name); addr6.sin6_port = addr.sin_port; addr6.sin6_family = family; ap = &addr6; alen = sizeof(addr6); break; #endif case IPV4: IPV4Address ia(name); addr.sin_addr = getaddress(ia); ap = &addr; alen = sizeof(addr); } if(bind(so, (struct sockaddr *)ap, alen)) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket", socket_errno); return; } state = BOUND; } #endif DCCPSocket::DCCPSocket(const IPV4Address &ia, tpport_t port, unsigned backlog) : Socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = getaddress(ia); addr.sin_port = htons(port); family = IPV4; memset(&peer, 0, sizeof(peer)); peer.ipv4 = addr; #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&addr, sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket",socket_errno); return; } state = BOUND; } #ifdef CCXX_IPV6 DCCPSocket::DCCPSocket(const IPV6Address &ia, tpport_t port, unsigned backlog) : Socket(AF_INET6, SOCK_DCCP, IPPROTO_DCCP) { struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_addr = getaddress(ia); addr.sin6_port = htons(port); family = IPV6; memset(&peer, 0, sizeof(peer)); peer.ipv6 = addr; #if defined(SO_REUSEADDR) int opt = 1; setsockopt(so, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, (socklen_t)sizeof(opt)); #endif if(bind(so, (struct sockaddr *)&addr, sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } if(listen(so, backlog)) { endSocket(); error(errBindingFailed,(char *)"Could not listen on socket",socket_errno); return; } state = BOUND; } bool DCCPSocket::onAccept(const IPV6Host &ia, tpport_t port) { return true; } #endif bool DCCPSocket::onAccept(const IPV4Host &ia, tpport_t port) { return true; } IPV4Host DCCPSocket::getIPV4Sender(tpport_t *port) const { if(port) *port = ntohs(peer.ipv4.sin_port); return IPV4Host(peer.ipv4.sin_addr); } #ifdef CCXX_IPV6 IPV6Host DCCPSocket::getIPV6Sender(tpport_t *port) const { return IPV6Host(peer.ipv6.sin6_addr); } #endif DCCPSocket::~DCCPSocket() { endSocket(); } void DCCPSocket::disconnect(void) { if(Socket::state != CONNECTED) return; endSocket(); so = socket(family, SOCK_DCCP, IPPROTO_DCCP); if(so != INVALID_SOCKET) Socket::state = AVAILABLE; } #ifdef HAVE_GETADDRINFO void DCCPSocket::connect(const char *target) { char namebuf[128]; char *cp; struct addrinfo hint, *list = NULL, *next, *first; bool connected = false; snprintf(namebuf, sizeof(namebuf), "%s", target); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { connectError(); return; } *(cp++) = 0; memset(&hint, 0, sizeof(hint)); hint.ai_family = family; hint.ai_socktype = SOCK_DCCP; hint.ai_protocol = IPPROTO_DCCP; if(getaddrinfo(namebuf, cp, &hint, &list) || !list) { connectError(); return; } first = list; while(list) { if(!::connect(so, list->ai_addr, (socklen_t)list->ai_addrlen)) { connected = true; break; } next = list->ai_next; list = next; } freeaddrinfo(first); if(!connected) { connectError(); return; } Socket::state = CONNECTED; } #else void DCCPSocket::connect(const char *target) { char namebuf[128]; char *cp; bool connected = false; struct servent *svc; tpport_t port; snprintf(namebuf, sizeof(namebuf), "%s", target); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { connectError(); return; } *(cp++) = 0; if(isdigit(*cp)) port = atoi(cp); else { mutex.enter(); svc = getservbyname(cp, "dccp"); if(svc) port = ntohs(svc->s_port); mutex.leave(); if(!svc) { connectError(); return; } } switch(family) { case IPV4: connect(IPV4Host(namebuf), port); break; #ifdef CCXX_IPV6 case IPV6: connect(IPV6Host(namebuf), port); break; #endif default: connectError(); } } #endif void DCCPSocket::connect(const IPV4Host &host, tpport_t port, timeout_t timeout) { size_t i; fd_set fds; struct timeval to; bool connected = false; int rtn; int sockopt; socklen_t len = sizeof(sockopt); for(i = 0 ; i < host.getAddressCount(); i++) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = host.getAddress(i); addr.sin_port = htons(port); if(timeout) setCompletion(false); // Win32 will crash if you try to connect to INADDR_ANY. if ( INADDR_ANY == addr.sin_addr.s_addr ) addr.sin_addr.s_addr = INADDR_LOOPBACK; rtn = ::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)); if(!rtn) { connected = true; break; } #ifndef WIN32 if(errno == EINPROGRESS) #else if(WSAGetLastError() == WSAEINPROGRESS) #endif { FD_ZERO(&fds); FD_SET(so, &fds); to.tv_sec = timeout / 1000; to.tv_usec = timeout % 1000 * 1000; // timeout check for connect completion if(::select((int)so + 1, NULL, &fds, NULL, &to) < 1) continue; getsockopt(so, SOL_SOCKET, SO_ERROR, (char *)&sockopt, &len); if(!sockopt) { connected = true; break; } endSocket(); so = socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP); if(so == INVALID_SOCKET) break; } } setCompletion(true); if(!connected) { rtn = errno; errno = rtn; connectError(); return; } Socket::state = CONNECTED; } #ifdef CCXX_IPV6 void DCCPSocket::connect(const IPV6Host &host, tpport_t port, timeout_t timeout) { size_t i; fd_set fds; struct timeval to; bool connected = false; int rtn; int sockopt; socklen_t len = sizeof(sockopt); for(i = 0 ; i < host.getAddressCount(); i++) { struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_addr = host.getAddress(i); addr.sin6_port = htons(port); if(timeout) setCompletion(false); // Win32 will crash if you try to connect to INADDR_ANY. if ( !memcmp(&addr.sin6_addr, &in6addr_any, sizeof(in6addr_any))) memcpy(&addr.sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback)); rtn = ::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)); if(!rtn) { connected = true; break; } #ifndef WIN32 if(errno == EINPROGRESS) #else if(WSAGetLastError() == WSAEINPROGRESS) #endif { FD_ZERO(&fds); FD_SET(so, &fds); to.tv_sec = timeout / 1000; to.tv_usec = timeout % 1000 * 1000; // timeout check for connect completion if(::select((int)so + 1, NULL, &fds, NULL, &to) < 1) continue; getsockopt(so, SOL_SOCKET, SO_ERROR, (char *)&sockopt, &len); if(!sockopt) { connected = true; break; } endSocket(); so = socket(AF_INET6, SOCK_DCCP, IPPROTO_DCCP); if(so == INVALID_SOCKET) break; } } setCompletion(true); if(!connected) { rtn = errno; errno = rtn; connectError(); return; } Socket::state = CONNECTED; } #endif bool DCCPSocket::setCCID(uint8 ccid) { uint8 ccids[16]; /* for getting the available CCIDs, should be large enough */ socklen_t len = sizeof(ccids); int ret; bool ccid_supported = false; /* * Determine which CCIDs are available on the host */ ret = getsockopt(so, SOL_DCCP, DCCP_SOCKOPT_AVAILABLE_CCIDS, (char *)&ccids, &len); if (ret < 0) { error(errInput,(char *)"Can not determine available CCIDs",socket_errno); return false; } for (unsigned i = 0; i < sizeof(ccids); i++) { if (ccid == ccids[i]) { ccid_supported = true; break; } } if (!ccid_supported) { error(errInput,(char *)"CCID specified is not supported",socket_errno); return false; } if (setsockopt(so, SOL_DCCP, DCCP_SOCKOPT_CCID, (char *)&ccid, sizeof (ccid)) < 0) { error(errInput,(char *)"Can not set CCID",socket_errno); return false; } return true; } int DCCPSocket::getTxCCID() { int ccid, ret; socklen_t ccidlen; ccidlen = sizeof(ccid); ret = getsockopt(so, SOL_DCCP, DCCP_SOCKOPT_TX_CCID, (char *)&ccid, &ccidlen); if (ret < 0) { error(errInput,(char *)"Can not determine get current TX CCID value",socket_errno); return -1; } return ccid; } int DCCPSocket::getRxCCID() { int ccid, ret; socklen_t ccidlen; ccidlen = sizeof(ccid); ret = getsockopt(so, SOL_DCCP, DCCP_SOCKOPT_RX_CCID, (char *)&ccid, &ccidlen); if (ret < 0) { error(errInput,(char *)"Can not determine get current DX CCID value",socket_errno); return -1; } return ccid; } #ifndef WIN32 #include #endif size_t DCCPSocket::available() { size_t readsize; #ifndef WIN32 if (ioctl (so, FIONREAD, &readsize) < 0) { error(errInput,(char *)"Error on retrieve the FIONREAD option.",socket_errno); } #else if (ioctlsocket(so, FIOREAD, &readsize)){ error(errInput,(char *)"Error on retrieve the FIONREAD option.",socket_errno); } #endif return readsize; } TCPStream::TCPStream(TCPSocket &server, bool throwflag, timeout_t to) : streambuf(), Socket(accept(server.getSocket(), NULL, NULL)), #ifdef HAVE_OLD_IOSTREAM iostream() #else iostream((streambuf *)this) #endif ,bufsize(0) ,gbuf(NULL) ,pbuf(NULL) { tpport_t port; family = IPV4; #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif timeout = to; setError(throwflag); IPV4Host host = getPeer(&port); if(!server.onAccept(host, port)) { endSocket(); error(errConnectRejected); clear(ios::failbit | rdstate()); return; } segmentBuffering(server.getSegmentSize()); Socket::state = CONNECTED; } #ifdef CCXX_IPV6 TCPStream::TCPStream(TCPV6Socket &server, bool throwflag, timeout_t to) : streambuf(), Socket(accept(server.getSocket(), NULL, NULL)), #ifdef HAVE_OLD_IOSTREAM iostream() #else iostream((streambuf *)this) #endif ,bufsize(0) ,gbuf(NULL) ,pbuf(NULL) { tpport_t port; family = IPV6; #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif timeout = to; setError(throwflag); IPV6Host host = getIPV6Peer(&port); if(!server.onAccept(host, port)) { endSocket(); error(errConnectRejected); clear(ios::failbit | rdstate()); return; } segmentBuffering(server.getSegmentSize()); Socket::state = CONNECTED; } #endif TCPStream::TCPStream(const IPV4Host &host, tpport_t port, unsigned size, bool throwflag, timeout_t to) : streambuf(), Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP), #ifdef HAVE_OLD_IOSTREAM iostream(), #else iostream((streambuf *)this), #endif bufsize(0),gbuf(NULL),pbuf(NULL) { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif family = IPV4; timeout = to; setError(throwflag); connect(host, port, size); } #ifdef CCXX_IPV6 TCPStream::TCPStream(const IPV6Host &host, tpport_t port, unsigned size, bool throwflag, timeout_t to) : streambuf(), Socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP), #ifdef HAVE_OLD_IOSTREAM iostream(), #else iostream((streambuf *)this), #endif bufsize(0),gbuf(NULL),pbuf(NULL) { family = IPV6; #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif timeout = to; setError(throwflag); connect(host, port, size); } #endif TCPStream::~TCPStream() { #ifdef CCXX_EXCEPTIONS try { endStream(); } catch( ... ) { if ( ! std::uncaught_exception()) throw;}; #else endStream(); #endif } #ifdef HAVE_GETADDRINFO void TCPStream::connect(const char *target, unsigned mss) { char namebuf[128]; char *cp; struct addrinfo hint, *list = NULL, *next, *first; bool connected = false; snprintf(namebuf, sizeof(namebuf), "%s", target); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { endStream(); connectError(); return; } *(cp++) = 0; memset(&hint, 0, sizeof(hint)); hint.ai_family = family; hint.ai_socktype = SOCK_STREAM; hint.ai_protocol = IPPROTO_TCP; if(getaddrinfo(namebuf, cp, &hint, &list) || !list) { endStream(); connectError(); return; } first = list; #ifdef TCP_MAXSEG if(mss) setsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&mss, sizeof(mss)); #endif while(list) { if(!::connect(so, list->ai_addr, (socklen_t)list->ai_addrlen)) { connected = true; break; } next = list->ai_next; list = next; } freeaddrinfo(first); if(!connected) { endStream(); connectError(); return; } segmentBuffering(mss); Socket::state = CONNECTED; } #else void TCPStream::connect(const char *target, unsigned mss) { char namebuf[128]; char *cp; bool connected = false; struct servent *svc; tpport_t port; snprintf(namebuf, sizeof(namebuf), "%s", target); cp = strrchr(namebuf, '/'); if(!cp) cp = strrchr(namebuf, ':'); if(!cp) { endStream(); connectError(); return; } *(cp++) = 0; if(isdigit(*cp)) port = atoi(cp); else { mutex.enter(); svc = getservbyname(cp, "tcp"); if(svc) port = ntohs(svc->s_port); mutex.leave(); if(!svc) { endStream(); connectError(); return; } } switch(family) { case IPV4: connect(IPV4Host(namebuf), port, mss); break; #ifdef CCXX_IPV6 case IPV6: connect(IPV6Host(namebuf), port, mss); break; #endif default: endStream(); connectError(); } } #endif void TCPStream::connect(const IPV4Host &host, tpport_t port, unsigned mss) { size_t i; fd_set fds; struct timeval to; bool connected = false; int rtn; int sockopt; socklen_t len = sizeof(sockopt); #ifdef TCP_MAXSEG if(mss) setsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&mss, sizeof(mss)); #endif for(i = 0 ; i < host.getAddressCount(); i++) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = host.getAddress(i); addr.sin_port = htons(port); if(timeout) setCompletion(false); // Win32 will crash if you try to connect to INADDR_ANY. if ( INADDR_ANY == addr.sin_addr.s_addr ) addr.sin_addr.s_addr = INADDR_LOOPBACK; rtn = ::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)); if(!rtn) { connected = true; break; } #ifndef WIN32 if(errno == EINPROGRESS) #else if(WSAGetLastError() == WSAEINPROGRESS) #endif { FD_ZERO(&fds); FD_SET(so, &fds); to.tv_sec = timeout / 1000; to.tv_usec = timeout % 1000 * 1000; // timeout check for connect completion if(::select((int)so + 1, NULL, &fds, NULL, &to) < 1) continue; getsockopt(so, SOL_SOCKET, SO_ERROR, (char *)&sockopt, &len); if(!sockopt) { connected = true; break; } endSocket(); so = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(so == INVALID_SOCKET) break; } } setCompletion(true); if(!connected) { rtn = errno; endStream(); errno = rtn; connectError(); return; } segmentBuffering(mss); Socket::state = CONNECTED; } #ifdef CCXX_IPV6 void TCPStream::connect(const IPV6Host &host, tpport_t port, unsigned mss) { size_t i; fd_set fds; struct timeval to; bool connected = false; int rtn; int sockopt; socklen_t len = sizeof(sockopt); #ifdef TCP_MAXSEG if(mss) setsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&mss, sizeof(mss)); #endif for(i = 0 ; i < host.getAddressCount(); i++) { struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_addr = host.getAddress(i); addr.sin6_port = htons(port); if(timeout) setCompletion(false); // Win32 will crash if you try to connect to INADDR_ANY. if ( !memcmp(&addr.sin6_addr, &in6addr_any, sizeof(in6addr_any))) memcpy(&addr.sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback)); rtn = ::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)); if(!rtn) { connected = true; break; } #ifndef WIN32 if(errno == EINPROGRESS) #else if(WSAGetLastError() == WSAEINPROGRESS) #endif { FD_ZERO(&fds); FD_SET(so, &fds); to.tv_sec = timeout / 1000; to.tv_usec = timeout % 1000 * 1000; // timeout check for connect completion if(::select((int)so + 1, NULL, &fds, NULL, &to) < 1) continue; getsockopt(so, SOL_SOCKET, SO_ERROR, (char *)&sockopt, &len); if(!sockopt) { connected = true; break; } endSocket(); so = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); if(so == INVALID_SOCKET) break; } } setCompletion(true); if(!connected) { rtn = errno; endStream(); errno = rtn; connectError(); return; } segmentBuffering(mss); Socket::state = CONNECTED; } #endif TCPStream::TCPStream(const char *target, Family fam, unsigned mss, bool throwflag, timeout_t to) : streambuf(), Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP), #ifdef HAVE_OLD_IOSTREAM iostream(), #else iostream((streambuf *)this), #endif timeout(to), bufsize(0),gbuf(NULL),pbuf(NULL) { family = fam; #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif setError(throwflag); connect(target, mss); } TCPStream::TCPStream(Family fam, bool throwflag, timeout_t to) : streambuf(), Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP), #ifdef HAVE_OLD_IOSTREAM iostream(), #else iostream((streambuf *)this), #endif timeout(to), bufsize(0),gbuf(NULL),pbuf(NULL) { family = fam; #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif setError(throwflag); } TCPStream::TCPStream(const TCPStream &source) : streambuf(), Socket(DUP_SOCK(source.so,source.state)), #ifdef HAVE_OLD_IOSTREAM iostream() #else iostream((streambuf *)this) #endif { family = source.family; #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif bufsize = source.bufsize; allocate(bufsize); } void TCPStream::connect(TCPSocket &tcpip) { tpport_t port; endStream(); family = IPV4; so = accept(tcpip.getSocket(), NULL, NULL); if(so == INVALID_SOCKET) return; IPV4Host host = getPeer(&port); if(!tcpip.onAccept(host, port)) { endSocket(); clear(ios::failbit | rdstate()); return; } segmentBuffering(tcpip.getSegmentSize()); Socket::state = CONNECTED; } #ifdef CCXX_IPV6 void TCPStream::connect(TCPV6Socket &tcpip) { tpport_t port; endStream(); family = IPV6; so = accept(tcpip.getSocket(), NULL, NULL); if(so == INVALID_SOCKET) return; IPV6Host host = getIPV6Peer(&port); if(!tcpip.onAccept(host, port)) { endSocket(); clear(ios::failbit | rdstate()); return; } segmentBuffering(tcpip.getSegmentSize()); Socket::state = CONNECTED; } #endif void TCPStream::segmentBuffering(unsigned mss) { unsigned max = 0; socklen_t alen = sizeof(max); if(mss == 1) { // special interactive allocate(1); return; } #ifdef TCP_MAXSEG if(mss) setsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&max, sizeof(max)); getsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&max, &alen); #endif if(max && max < mss) mss = max; if(!mss) { if(max) mss = max; else mss = 536; allocate(mss); return; } #ifdef TCP_MAXSEG setsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&mss, sizeof(mss)); #endif if(mss < 80) mss = 80; if(mss * 7 < 64000) bufferSize(mss * 7); else if(mss * 6 < 64000) bufferSize(mss * 6); else bufferSize(mss * 5); if(mss < 512) sendLimit(mss * 4); allocate(mss); } int TCPStream::getSegmentSize(void) { unsigned mss = 0; #ifdef TCP_MAXSEG socklen_t alen = sizeof(mss); getsockopt(so, IPPROTO_TCP, TCP_MAXSEG, (char *)&mss, &alen); #endif if(!mss) return (int)bufsize; return mss; } void TCPStream::disconnect(void) { if(Socket::state == AVAILABLE) return; endStream(); so = socket(family, SOCK_STREAM, IPPROTO_TCP); if(so != INVALID_SOCKET) Socket::state = AVAILABLE; } void TCPStream::endStream(void) { if(bufsize) sync(); if(gbuf) delete[] gbuf; if(pbuf) delete[] pbuf; gbuf = pbuf = NULL; bufsize = 0; clear(); endSocket(); } void TCPStream::allocate(size_t size) { if(size < 2) { bufsize = 1; gbuf = pbuf = 0; return; } gbuf = new char[size]; pbuf = new char[size]; if(!pbuf || !gbuf) { error(errResourceFailure, (char *)"Could not allocate socket stream buffers"); return; } bufsize = size; clear(); #if (defined(__GNUC__) && (__GNUC__ < 3)) && !defined(WIN32) && !defined(STLPORT) setb(gbuf, gbuf + size, 0); #endif setg(gbuf, gbuf + size, gbuf + size); setp(pbuf, pbuf + size); } int TCPStream::doallocate() { if(bufsize) return 0; allocate(1); return 1; } int TCPStream::uflow() { int ret = underflow(); if (ret == EOF) return EOF; if (bufsize != 1) gbump(1); return ret; } int TCPStream::underflow() { ssize_t rlen = 1; unsigned char ch; if(bufsize == 1) { if(Socket::state == STREAM) rlen = ::read((int)so, (char *)&ch, 1); else if(timeout && !Socket::isPending(pendingInput, timeout)) { clear(ios::failbit | rdstate()); error(errTimeout,(char *)"Socket read timed out",socket_errno); return EOF; } else rlen = readData(&ch, 1); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errInput,(char *)"Could not read from socket",socket_errno); } return EOF; } return ch; } if(!gptr()) return EOF; if(gptr() < egptr()) return (unsigned char)*gptr(); rlen = (ssize_t)((gbuf + bufsize) - eback()); if(Socket::state == STREAM) rlen = ::read((int)so, (char *)eback(), _IOLEN64 rlen); else if(timeout && !Socket::isPending(pendingInput, timeout)) { clear(ios::failbit | rdstate()); error(errTimeout,(char *)"Socket read timed out",socket_errno); return EOF; } else rlen = readData(eback(), rlen); if(rlen < 1) { // clear(ios::failbit | rdstate()); if(rlen < 0) error(errNotConnected,(char *)"Connection error",socket_errno); else { error(errInput,(char *)"Could not read from socket",socket_errno); clear(ios::failbit | rdstate()); } return EOF; } error(errSuccess); setg(eback(), eback(), eback() + rlen); return (unsigned char) *gptr(); } bool TCPStream::isPending(Pending pending, timeout_t timer) { if(pending == pendingInput && in_avail()) return true; else if(pending == pendingOutput) flush(); return Socket::isPending(pending, timer); } int TCPStream::sync(void) { overflow(EOF); setg(gbuf, gbuf + bufsize, gbuf + bufsize); return 0; } #ifdef HAVE_SNPRINTF size_t TCPStream::printf(const char *format, ...) { va_list args; size_t len; char *buf; va_start(args, format); overflow(EOF); len = pptr() - pbase(); buf = pptr(); vsnprintf(buf, len, format, args); va_end(args); len = strlen(buf); if(Socket::state == STREAM) return ::write((int)so, buf, _IOLEN64 len); else return writeData(buf, len); } #endif int TCPStream::overflow(int c) { unsigned char ch; ssize_t rlen, req; if(bufsize == 1) { if(c == EOF) return 0; ch = (unsigned char)(c); if(Socket::state == STREAM) rlen = ::write((int)so, (const char *)&ch, 1); else rlen = writeData(&ch, 1); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errOutput,(char *)"Could not write to socket",socket_errno); } return EOF; } else return c; } if(!pbase()) return EOF; req = (ssize_t)(pptr() - pbase()); if(req) { if(Socket::state == STREAM) rlen = ::write((int)so, (const char *)pbase(), req); else rlen = writeData(pbase(), req); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errOutput,(char *)"Could not write to socket",socket_errno); } return EOF; } req -= rlen; } // if write "partial", rebuffer remainder if(req) // memmove(pbuf, pptr() + rlen, req); memmove(pbuf, pbuf + rlen, req); setp(pbuf, pbuf + bufsize); pbump(req); if(c != EOF) { *pptr() = (unsigned char)c; pbump(1); } return c; } TCPSession::TCPSession(const IPV4Host &ia, tpport_t port, size_t size, int pri, size_t stack) : Thread(pri, stack), TCPStream(IPV4) { setCompletion(false); setError(false); allocate(size); size_t i; for(i = 0 ; i < ia.getAddressCount(); i++) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = ia.getAddress(i); addr.sin_port = htons(port); // Win32 will crash if you try to connect to INADDR_ANY. if ( INADDR_ANY == addr.sin_addr.s_addr ) addr.sin_addr.s_addr = INADDR_LOOPBACK; if(::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)) == 0) break; #ifdef WIN32 if(WSAGetLastError() == WSAEISCONN || WSAGetLastError() == WSAEWOULDBLOCK) #else if(errno == EINPROGRESS) #endif { Socket::state = CONNECTING; return; } } if(i == ia.getAddressCount()) { endSocket(); Socket::state = INITIAL; return; } setCompletion(true); Socket::state = CONNECTED; } #ifdef CCXX_IPV6 TCPSession::TCPSession(const IPV6Host &ia, tpport_t port, size_t size, int pri, size_t stack) : Thread(pri, stack), TCPStream(IPV6) { setCompletion(false); setError(false); allocate(size); size_t i; for(i = 0 ; i < ia.getAddressCount(); i++) { struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_addr = ia.getAddress(i); addr.sin6_port = htons(port); // Win32 will crash if you try to connect to INADDR_ANY. if(!memcmp(&addr.sin6_addr, &in6addr_any, sizeof(in6addr_any))) memcpy(&addr.sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback)); if(::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)) == 0) break; #ifdef WIN32 // if(WSAGetLastError() == WSAEWOULDBLOCK) if(WSAGetLastError() == WSAEISCONN) #else if(errno == EINPROGRESS) #endif { Socket::state = CONNECTING; return; } } if(i == ia.getAddressCount()) { endSocket(); Socket::state = INITIAL; return; } setCompletion(true); Socket::state = CONNECTED; } #endif TCPSession::TCPSession(TCPSocket &s, int pri, size_t stack) : Thread(pri, stack), TCPStream(s) { setCompletion(true); setError(false); } #ifdef CCXX_IPV6 TCPSession::TCPSession(TCPV6Socket &s, int pri, size_t stack) : Thread(pri, stack), TCPStream(s) { setCompletion(true); setError(false); } #endif TCPSession::~TCPSession() { endStream(); } int TCPSession::waitConnection(timeout_t timer) { int sockopt = 0; socklen_t len = sizeof(sockopt); switch(Socket::state) { case INITIAL: return -1; case CONNECTED: break; case CONNECTING: if(!Socket::isPending(pendingOutput, timer)) { endSocket(); Socket::state = INITIAL; return -1; } getsockopt(so, SOL_SOCKET, SO_ERROR, (char *)&sockopt, &len); if(sockopt) { endSocket(); Socket::state = INITIAL; return -1; } default: break; } Socket::state = CONNECTED; return 0; } void TCPSession::initial(void) { if(waitConnection(60000)) exit(); } ostream& operator<<(ostream &os, const IPV4Address &ia) { os << inet_ntoa(getaddress(ia)); return os; } #ifdef WIN32 init_WSA::init_WSA() { //-initialize OS socket resources! WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { abort(); } }; init_WSA::~init_WSA() { WSACleanup(); } init_WSA init_wsa; #endif #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/unix.cpp0000644000175000017500000003041011463412003012765 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include #include #include #include #include #include #ifndef WIN32 #include #include #endif #ifdef WIN32 #include #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif #ifndef WIN32 UnixSocket::UnixSocket(const char* pathname, int backlog) : Socket(AF_UNIX, SOCK_STREAM, 0) { struct sockaddr_un addr; socklen_t len; unsigned slen = strlen(pathname); if(slen > sizeof(addr.sun_path)) slen = sizeof(addr.sun_path); path = NULL; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; memcpy( addr.sun_path, pathname, slen ); #ifdef __SUN_LEN len = sizeof(addr.sun_len) + strlen(addr.sun_path) + sizeof(addr.sun_family) + 1; addr.sun_len = len; #else len = strlen(addr.sun_path) + sizeof(addr.sun_family) + 1; #endif remove(pathname); if(bind(so, (struct sockaddr *)&addr, len)) { endSocket(); error(errBindingFailed); return; } path = new char[slen + 1]; strcpy(path, pathname); if(listen(so, backlog)) { endSocket(); error(errBindingFailed); return; } state = BOUND; } UnixSocket::~UnixSocket() { close(); } void UnixSocket::close(void) { endSocket(); if(path) { remove(path); delete[] path; path = NULL; } } UnixStream::UnixStream(UnixSocket &server, int size, bool throwflag, timeout_t to) : Socket(accept(server.so, NULL, NULL)) ,streambuf() #ifdef HAVE_OLD_IOSTREAM ,iostream() #else ,iostream((streambuf *)this) #endif ,bufsize(0), gbuf(NULL), pbuf(NULL) { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif timeout = to; setError(throwflag); allocate(size); Socket::state = CONNECTED; } UnixStream::UnixStream(const char* pathname, int size, bool throwflag, timeout_t to) : Socket(AF_UNIX, SOCK_STREAM, 0), streambuf(), #ifdef HAVE_OLD_IOSTREAM iostream(), #else iostream((streambuf *)this), #endif bufsize(0), gbuf(NULL), pbuf(NULL) { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif timeout = to; setError(throwflag); connect(pathname, size); } UnixStream::~UnixStream() { endStream(); } void UnixStream::connect(const char* pathname, int size) { struct sockaddr_un addr; socklen_t len; unsigned slen = strlen(pathname); if(slen > sizeof(addr.sun_path)) slen = sizeof(addr.sun_path); memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; memcpy( addr.sun_path, pathname, slen ); #ifdef __SUN_LEN len = sizeof(addr.sun_len) + strlen(addr.sun_path) + sizeof(addr.sun_family) + 1; addr.sun_len = len; #else len = strlen(addr.sun_path) + sizeof(addr.sun_family); #endif if(::connect(so, (struct sockaddr *)&addr, len) != 0) { connectError(); endSocket(); return; } allocate(size); Socket::state = CONNECTED; } UnixStream::UnixStream(bool throwflag) : Socket(PF_UNIX, SOCK_STREAM, 0), streambuf(), #ifdef HAVE_OLD_IOSTREAM iostream(), #else iostream((streambuf *)this), #endif timeout(0), bufsize(0), gbuf(NULL), pbuf(NULL) { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif setError(throwflag); } UnixStream::UnixStream(const UnixStream &source) : Socket(dup(source.so)), streambuf(), #ifdef HAVE_OLD_IOSTREAM iostream() #else iostream((streambuf *)this) #endif { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif bufsize = source.bufsize; allocate(bufsize); } void UnixStream::endStream(void) { if(bufsize) sync(); if(gbuf) delete[] gbuf; if(pbuf) delete[] pbuf; gbuf = pbuf = NULL; bufsize = 0; endSocket(); } void UnixStream::allocate(int size) { if(size < 2) { bufsize = 1; return; } gbuf = new char[size]; pbuf = new char[size]; if(!pbuf || !gbuf) { error(errResourceFailure); return; } bufsize = size; clear(); #if (defined(__GNUC__) && (__GNUC__ < 3)) && !defined(WIN32) && !defined(STLPORT) setb(gbuf, gbuf + size, 0); #endif setg(gbuf, gbuf + size, gbuf + size); setp(pbuf, pbuf + size); } int UnixStream::doallocate() { if(bufsize) return 0; allocate(1); return 1; } int UnixStream::uflow(void) { int ret = underflow(); if (ret == EOF) return EOF; if (bufsize != 1) gbump(1); return ret; } int UnixStream::underflow(void) { int rlen = 1; unsigned char ch; if(bufsize == 1) { if(Socket::state == STREAM) rlen = ::read(so, (char *)&ch, 1); else if(timeout && !Socket::isPending(pendingInput, timeout)) { clear(ios::failbit | rdstate()); error(errTimeout); return EOF; } else rlen = ::recv(so, (char *)&ch, 1, 0); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errInput); } return EOF; } return ch; } if(!gptr()) return EOF; if(gptr() < egptr()) return (unsigned char)*gptr(); rlen = (gbuf + bufsize) - eback(); if(Socket::state == STREAM) rlen = ::read(so, (char *)eback(), rlen); else if(timeout && !Socket::isPending(pendingInput, timeout)) { clear(ios::failbit | rdstate()); error(errTimeout); return EOF; } else rlen = ::recv(so, (char *)eback(), rlen, 0); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errInput); } return EOF; } setg(eback(), eback(), eback() + rlen); return (unsigned char) *gptr(); } bool UnixStream::isPending(Pending pending, timeout_t timeout) { if(pending == pendingInput && in_avail()) return true; else if(pending == pendingOutput) flush(); return Socket::isPending(pending, timeout); } int UnixStream::sync(void) { overflow(EOF); setg(gbuf, gbuf + bufsize, gbuf + bufsize); return 0; } int UnixStream::overflow(int c) { unsigned char ch; int rlen, req; if(bufsize == 1) { if(c == EOF) return 0; ch = (unsigned char)(c); if(Socket::state == STREAM) rlen = ::write(so, (const char *)&ch, 1); else rlen = ::send(so, (const char *)&ch, 1, 0); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errOutput); } return EOF; } else return c; } if(!pbase()) return EOF; req = pptr() - pbase(); if(req) { if(Socket::state == STREAM) rlen = ::write(so, (const char *)pbase(), req); else rlen = ::send(so, (const char *)pbase(), req, 0); if(rlen < 1) { if(rlen < 0) { clear(ios::failbit | rdstate()); error(errOutput); } return EOF; } req -= rlen; } // if write "partial", rebuffer remainder if(req) memcpy(pptr(), pptr() + rlen, req); setp(pbuf + req, pbuf + bufsize); if(c != EOF) { *pptr() = (unsigned char)c; pbump(1); } return c; } unixstream::unixstream() : UnixStream() { setError(false); /* no exceptions */ } unixstream::unixstream(const char *pathname, int buf) : UnixStream() { setError(false); open(pathname, buf); } unixstream::unixstream(UnixSocket &server, int buf) : UnixStream() { setError(false); open(server, buf); } bool unixstream::operator!() const { return (Socket::state != CONNECTED) ? true : false; } void unixstream::open(UnixSocket &unixsock, int buf) { endStream(); so = accept(unixsock.so, NULL, NULL); if(so == INVALID_SOCKET) return; allocate(buf); Socket::state = CONNECTED; } void unixstream::close(void) { if(Socket::state == AVAILABLE) return; endStream(); so = socket(AF_UNIX, SOCK_STREAM, 0); if(so != INVALID_SOCKET) Socket::state = AVAILABLE; } UnixSession::UnixSession(const char* pathname, int size, int pri, int stack) : Thread(pri, stack), UnixStream() { struct sockaddr_un addr; unsigned slen = strlen(pathname); if(slen > sizeof(addr.sun_path)) slen = sizeof(addr.sun_path); socklen_t len; setCompletion(false); setError(false); allocate(size); memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; memcpy( addr.sun_path, pathname, slen ); #ifdef __SUN_LEN len = sizeof(addr.sun_len) + strlen(addr.sun_path) + sizeof(addr.sun_family) + 1; addr.sun_len = len; #else len = strlen(addr.sun_path) + sizeof(addr.sun_family); #endif if(::connect(so, (struct sockaddr *)&addr, len ) != 0) { #ifdef WIN32 if( WSAGetLastError() == WAEISCONN ) #else if( EINPROGRESS == errno ) #endif { Socket::state = CONNECTING; } else { endSocket(); Socket::state = INITIAL; } return; } setCompletion(true); Socket::state = CONNECTED; } UnixSession::UnixSession(UnixSocket &s,int size, int pri, int stack) : Thread(pri, stack), UnixStream(s, size) { setCompletion(true); setError(false); } UnixSession::~UnixSession() { terminate(); endStream(); } int UnixSession::waitConnection(timeout_t timeout) { long sockopt = 0; socklen_t len = sizeof(sockopt); switch(Socket::state) { case INITIAL: return -1; case CONNECTED: break; case CONNECTING: if(!Socket::isPending(pendingOutput, timeout)) { endSocket(); Socket::state = INITIAL; return -1; } getsockopt(so, SOL_SOCKET, SO_ERROR, (char *)&sockopt, &len); if(sockopt) { endSocket(); Socket::state = INITIAL; return -1; } case AVAILABLE: case BOUND: case STREAM: break; } Socket::state = CONNECTED; return 0; } void UnixSession::initial(void) { if(waitConnection(60000)) exit(); } #endif // ndef WIN32 #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/socketport.cpp0000644000175000017500000005314711463406213014221 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include "private.h" #ifndef WIN32 #include #define socket_errno errno #else #define socket_errno WSAGetLastError() #endif #ifndef INADDR_LOOPBACK #define INADDR_LOOPBACK (unsigned long)0x7f000001 #endif #ifdef CCXX_NAMESPACES namespace ost { #endif SocketPort::SocketPort(SocketService *svc, TCPSocket &tcp) : Socket(accept(tcp.getSocket(), NULL, NULL)) { detect_pending = true; detect_output = false; detect_disconnect = true; #ifdef WIN32 // FIXME: error handling event = CreateEvent(NULL,TRUE,FALSE,NULL); #endif next = prev = NULL; service = NULL; // FIXME: use macro here and in other files... #ifndef WIN32 if(so > -1) #else if(so != INVALID_SOCKET) #endif { setError(false); if( svc ) svc->attach(this); } } #ifdef CCXX_IPV6 SocketPort::SocketPort(SocketService *svc, TCPV6Socket &tcp) : Socket(accept(tcp.getSocket(), NULL, NULL)) { detect_pending = true; detect_output = false; detect_disconnect = true; #ifdef WIN32 // FIXME: error handling event = CreateEvent(NULL,TRUE,FALSE,NULL); #endif next = prev = NULL; service = NULL; // FIXME: use macro here and in other files... #ifndef WIN32 if(so > -1) #else if(so != INVALID_SOCKET) #endif { setError(false); if( svc ) svc->attach(this); } } #endif SocketPort::SocketPort(SocketService *svc, const IPV4Address &ia, tpport_t port) : Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) { #ifdef WIN32 // FIXME: error handling event = CreateEvent(NULL,TRUE,FALSE,NULL); #endif struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); next = prev = NULL; service = NULL; addr.sin_family = AF_INET; addr.sin_addr = getaddress(ia); addr.sin_port = htons(port); detect_pending = true; detect_output = false; detect_disconnect = true; if(bind(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } state = BOUND; setError(false); if(svc) svc->attach(this); } #ifdef CCXX_IPV6 SocketPort::SocketPort(SocketService *svc, const IPV6Address &ia, tpport_t port) : Socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP) { #ifdef WIN32 // FIXME: error handling event = CreateEvent(NULL,TRUE,FALSE,NULL); #endif struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); next = prev = NULL; service = NULL; addr.sin6_family = AF_INET6; addr.sin6_addr = getaddress(ia); addr.sin6_port = htons(port); detect_pending = true; detect_output = false; detect_disconnect = true; if(bind(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr))) { endSocket(); error(errBindingFailed,(char *)"Could not bind socket",socket_errno); return; } state = BOUND; setError(false); if(svc) svc->attach(this); } #endif SocketPort::SocketPort(SocketService *svc, const IPV4Host &ih, tpport_t port) : Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) { #ifdef WIN32 // FIXME: error handling event = CreateEvent(NULL,TRUE,FALSE,NULL); #endif struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); next = prev = NULL; service = NULL; addr.sin_family = AF_INET; addr.sin_addr = getaddress(ih); addr.sin_port = htons(port); detect_pending = true; detect_disconnect = true; #ifndef WIN32 long opts = fcntl(so, F_GETFL); fcntl(so, F_SETFL, opts | O_NDELAY); #else u_long opts = 1; ioctlsocket(so,FIONBIO,&opts); #endif int rtn = ::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)); if(!rtn) { state = CONNECTED; } else { #ifndef WIN32 if(errno == EINPROGRESS) #else if(WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() == WSAEWOULDBLOCK) #endif { state = CONNECTING; } else { endSocket(); connectError(); return; } } #ifndef WIN32 fcntl(so, F_SETFL, opts); #else opts = 0; ioctlsocket(so,FIONBIO,&opts); #endif setError(false); detect_output = (state == CONNECTING); if(svc) svc->attach(this); // if(state == CONNECTING) // setDetectOutput(true); } #ifdef CCXX_IPV6 SocketPort::SocketPort(SocketService *svc, const IPV6Host &ih, tpport_t port) : Socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) { #ifdef WIN32 // FIXME: error handling event = CreateEvent(NULL,TRUE,FALSE,NULL); #endif struct sockaddr_in6 addr; memset(&addr, 0, sizeof(addr)); next = prev = NULL; service = NULL; addr.sin6_family = AF_INET6; addr.sin6_addr = getaddress(ih); addr.sin6_port = htons(port); detect_pending = true; detect_disconnect = true; #ifndef WIN32 long opts = fcntl(so, F_GETFL); fcntl(so, F_SETFL, opts | O_NDELAY); #else u_long opts = 1; ioctlsocket(so,FIONBIO,&opts); #endif int rtn = ::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)); if(!rtn) { state = CONNECTED; } else { #ifndef WIN32 if(errno == EINPROGRESS) #else if(WSAGetLastError() == WSAEINPROGRESS || WSAGetLastError() == WSAEWOULDBLOCK) #endif { state = CONNECTING; } else { endSocket(); connectError(); return; } } #ifndef WIN32 fcntl(so, F_SETFL, opts); #else opts = 0; ioctlsocket(so,FIONBIO,&opts); #endif setError(false); detect_output = (state == CONNECTING); if(svc) svc->attach(this); // if(state == CONNECTING) // setDetectOutput(true); } #endif SocketPort::~SocketPort() { #ifdef WIN32 CloseHandle(event); #endif if(service) { service->detach(this); } endSocket(); } void SocketPort::expired(void) {} void SocketPort::pending(void) {} void SocketPort::output(void) {} void SocketPort::disconnect(void) {} void SocketPort::attach( SocketService* svc ) { if(service) service->detach(this); service = svc; if(svc) svc->attach(this); } Socket::Error SocketPort::connect(const IPV4Address &ia, tpport_t port) { struct sockaddr_in addr; Error rtn = errSuccess; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = getaddress(ia); addr.sin_port = htons(port); #ifndef WIN32 long opts = fcntl(so, F_GETFL); fcntl(so, F_SETFL, opts | O_NDELAY); #else u_long opts = 1; ioctlsocket(so,FIONBIO,&opts); #endif // Win32 will crash if you try to connect to INADDR_ANY. if ( INADDR_ANY == addr.sin_addr.s_addr ) addr.sin_addr.s_addr = INADDR_LOOPBACK; if(::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr))) rtn = connectError(); #ifndef WIN32 fcntl(so, F_SETFL, opts); #else opts = 0; ioctlsocket(so,FIONBIO,&opts); #endif return rtn; } #ifdef CCXX_IPV6 Socket::Error SocketPort::connect(const IPV6Address &ia, tpport_t port) { struct sockaddr_in6 addr; Error rtn = errSuccess; memset(&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; addr.sin6_addr = getaddress(ia); addr.sin6_port = htons(port); #ifndef WIN32 long opts = fcntl(so, F_GETFL); fcntl(so, F_SETFL, opts | O_NDELAY); #else u_long opts = 1; ioctlsocket(so,FIONBIO,&opts); #endif // Win32 will crash if you try to connect to INADDR_ANY. if(!memcmp(&addr.sin6_addr, &in6addr_any, sizeof(in6addr_any))) memcpy(&addr.sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback)); if(::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr))) rtn = connectError(); #ifndef WIN32 fcntl(so, F_SETFL, opts); #else opts = 0; ioctlsocket(so,FIONBIO,&opts); #endif return rtn; } #endif void SocketPort::setTimer(timeout_t ptimer) { TimerPort::setTimer(ptimer); if( service ) service->update(); } void SocketPort::incTimer(timeout_t ptimer) { TimerPort::incTimer(ptimer); if( service ) service->update(); } void SocketPort::setDetectPending( bool val ) { if ( detect_pending != val ) { detect_pending = val; #ifdef USE_POLL if ( ufd ) { if ( val ) { ufd->events |= POLLIN; } else { ufd->events &= ~POLLIN; } } #endif if( service ) service->update(); } } void SocketPort::setDetectOutput( bool val ) { if ( detect_output != val ) { detect_output = val; #ifdef USE_POLL if ( ufd ) { if ( val ) { ufd->events |= POLLOUT; } else { ufd->events &= ~POLLOUT; } } #endif if( service ) service->update(); } } #ifdef WIN32 class SocketService::Sync { public: /* FIXME: error handling */ Sync() : sync(CreateEvent(NULL,TRUE,FALSE,NULL)), semWrite(CreateSemaphore(NULL,1,1,NULL)), flag(-1) {} ~Sync() { CloseHandle(sync); CloseHandle(semWrite); } HANDLE GetSync() const { return sync; } void update(unsigned char flag) { // FIXME: cancellation WaitForSingleObject(semWrite,INFINITE); this->flag = flag; SetEvent(sync); } int getFlag() { int res = flag; flag = -1; if (res > 0) { ReleaseSemaphore(semWrite,1,NULL); ResetEvent(sync); } return res; } private: HANDLE sync; HANDLE semWrite; int flag; }; #endif SocketService::SocketService(int pri, size_t stack, const char *id) : Thread(pri, stack), Mutex(id) { first = last = NULL; count = 0; #ifndef WIN32 FD_ZERO(&connect); long opt; if(::pipe(iosync)) { #ifdef CCXX_EXCEPTIONS switch(Thread::getException()) { case throwObject: throw(this); return; #ifdef COMMON_STD_EXCEPTION case throwException: throw(ThrException("no service pipe")); return; #endif default: return; } #else return; #endif } hiwater = iosync[0] + 1; #ifndef USE_POLL FD_SET(iosync[0], &connect); #endif opt = fcntl(iosync[0], F_GETFL); fcntl(iosync[0], F_SETFL, opt | O_NDELAY); #else sync = new Sync(); #endif } SocketService::~SocketService() { update(0); #ifdef WIN32 // FIXME: thread is finished ??? delete sync; #endif terminate(); while(first) delete first; } void SocketService::onUpdate(unsigned char buf) {} void SocketService::onEvent(void) {} void SocketService::onCallback(SocketPort *port) {} void SocketService::attach(SocketPort *port) { enterMutex(); #ifdef USE_POLL port->ufd = 0; #endif if(last) last->next = port; port->prev = last; last = port; #ifndef WIN32 #ifndef USE_POLL FD_SET(port->so, &connect); #endif if(port->so >= hiwater) hiwater = port->so + 1; #endif port->service = this; ++count; if(!first) first = port; // start thread if necessary if (count == 1) { if (!isRunning()) { leaveMutex(); start(); return; } } leaveMutex(); update(); } void SocketService::detach(SocketPort *port) { enterMutex(); #if !defined(USE_POLL) && !defined(WIN32) FD_CLR(port->so, &connect); #endif if(port->prev) { port->prev->next = port->next; } else { first = port->next; } if(port->next) { port->next->prev = port->prev; } else { last = port->prev; } port->service = NULL; --count; leaveMutex(); update(); } void SocketService::update(unsigned char flag) { #ifndef WIN32 if(::write(iosync[1], (char *)&flag, 1) < 1) { #ifdef CCXX_EXCEPTIONS switch(Thread::getException()) { case throwObject: throw(this); return; #ifdef COMMON_STD_EXCEPTION case throwException: throw(ThrException("update failed")); return; #endif default: return; } #else return; #endif } #else sync->update(flag); #endif } #define MUTEX_START { MutexLock _lock_(*this); #define MUTEX_END } void SocketService::run(void) { timeout_t timer, expires; SocketPort *port; unsigned char buf; #ifndef WIN32 #ifdef USE_POLL Poller mfd; pollfd * p_ufd; int lastcount = 0; // initialize ufd in all attached ports : // probably don't need this but it can't hurt. enterMutex(); port = first; while(port) { port->ufd = 0; port = port->next; } leaveMutex(); #else struct timeval timeout, *tvp; fd_set inp, out, err; FD_ZERO(&inp); FD_ZERO(&out); FD_ZERO(&err); int so; #endif #else // WIN32 int numHandle = 0; HANDLE hv[MAXIMUM_WAIT_OBJECTS]; #endif #ifdef WIN32 // FIXME: needed ? ResetEvent(sync->GetSync()); #endif setCancel(cancelDeferred); for(;;) { timer = TIMEOUT_INF; #ifndef WIN32 while(1 == ::read(iosync[0], (char *)&buf, 1)) { #else for(;;) { int f = sync->getFlag(); if (f < 0) break; buf = f; #endif if(buf) { onUpdate(buf); continue; } setCancel(cancelImmediate); sleep(TIMEOUT_INF); exit(); } #ifndef WIN32 #ifdef USE_POLL bool reallocate = false; MUTEX_START onEvent(); port = first; while(port) { onCallback(port); if ( ( p_ufd = port->ufd ) ) { if ( ( POLLHUP | POLLNVAL ) & p_ufd->revents ) { // Avoid infinite loop from disconnected sockets port->detect_disconnect = false; p_ufd->events &= ~POLLHUP; SocketPort* p = port; port = port->next; detach(p); reallocate = true; p->disconnect(); continue; } if ( ( POLLIN | POLLPRI ) & p_ufd->revents ) port->pending(); if ( POLLOUT & p_ufd->revents ) port->output(); } else { reallocate = true; } retry: expires = port->getTimer(); if(expires > 0) if(expires < timer) timer = expires; if(!expires) { port->endTimer(); port->expired(); goto retry; } port = port->next; } // // reallocate things if we saw a ServerPort without // ufd set ! if ( reallocate || ( ( count + 1 ) != lastcount ) ) { lastcount = count + 1; p_ufd = mfd.getList( count + 1 ); // Set up iosync polling p_ufd->fd = iosync[0]; p_ufd->events = POLLIN | POLLHUP; p_ufd ++; port = first; while(port) { p_ufd->fd = port->so; p_ufd->events = ( port->detect_disconnect ? POLLHUP : 0 ) | ( port->detect_output ? POLLOUT : 0 ) | ( port->detect_pending ? POLLIN : 0 ) ; port->ufd = p_ufd; p_ufd ++; port = port->next; } } MUTEX_END poll( mfd.getList(), lastcount, timer ); #else MUTEX_START onEvent(); port = first; while(port) { onCallback(port); so = port->so; if(FD_ISSET(so, &err)) { port->detect_disconnect = false; SocketPort* p = port; port = port->next; p->disconnect(); continue; } if(FD_ISSET(so, &inp)) port->pending(); if(FD_ISSET(so, &out)) port->output(); retry: expires = port->getTimer(); if(expires > 0) if(expires < timer) timer = expires; // if we expire, get new scheduling now if(!expires) { port->endTimer(); port->expired(); goto retry; } port = port->next; } FD_ZERO(&inp); FD_ZERO(&out); FD_ZERO(&err); FD_SET(iosync[0],&inp); port = first; while(port) { so = port->so; if(port->detect_pending) FD_SET(so, &inp); if(port->detect_output) FD_SET(so, &out); if(port->detect_disconnect) FD_SET(so, &err); port = port->next; } MUTEX_END if(timer == TIMEOUT_INF) tvp = NULL; else { tvp = &timeout; timeout.tv_sec = timer / 1000; timeout.tv_usec = (timer % 1000) * 1000; } select(hiwater, &inp, &out, &err, tvp); #endif #else // WIN32 MUTEX_START onEvent(); hv[0] = sync->GetSync(); numHandle = 1; port = first; while(port) { onCallback(port); long events = 0; if(port->detect_pending) events |= FD_READ; if(port->detect_output) events |= FD_WRITE; if(port->detect_disconnect) events |= FD_CLOSE; // !!! ignore some socket on overflow !!! if (events && numHandle < MAXIMUM_WAIT_OBJECTS) { WSAEventSelect(port->so,port->event,events); hv[numHandle++] = port->event; } retry: expires = port->getTimer(); if(expires > 0) if(expires < timer) timer = expires; // if we expire, get new scheduling now if(!expires) { port->endTimer(); port->expired(); goto retry; } port = port->next; } MUTEX_END // FIXME: handle thread cancellation correctly DWORD res = WaitForMultipleObjects(numHandle,hv,FALSE,timer); switch (res) { case WAIT_OBJECT_0: break; case WAIT_TIMEOUT: break; default: // FIXME: handle failures (detach SocketPort) if (res >= WAIT_OBJECT_0+1 && res <= WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS) { int curr = res - (WAIT_OBJECT_0); WSANETWORKEVENTS events; // search port MUTEX_START port = first; while(port) { if (port->event == hv[curr]) break; port = port->next; } MUTEX_END // if port not found ignore if (!port || port->event != hv[curr]) break; WSAEnumNetworkEvents(port->so,port->event,&events); if(events.lNetworkEvents & FD_CLOSE) { port->detect_disconnect = false; port->disconnect(); continue; } if(events.lNetworkEvents & FD_READ) port->pending(); if(events.lNetworkEvents & FD_WRITE) port->output(); } } #endif } } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/getopt1.c0000644000175000017500000001065511463314535013051 00000000000000/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "getopt.h" #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ commoncpp2-1.8.1/src/peer.cpp0000644000175000017500000001600611463401427012752 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include "private.h" #ifdef WIN32 #include #endif #include #ifndef INADDR_LOOPBACK #define INADDR_LOOPBACK (unsigned long)0x7f000001 #endif #ifdef CCXX_NAMESPACES namespace ost { #endif UDPTransmit::UDPTransmit(const IPV4Address &ia, tpport_t port) : UDPSocket(ia, port) { disconnect(); // assure not started live shutdown(so, 0); receiveBuffer(0); } #ifdef CCXX_IPV6 UDPTransmit::UDPTransmit(const IPV6Address &ia, tpport_t port) : UDPSocket(ia, port) { disconnect(); // assure not started live shutdown(so, 0); receiveBuffer(0); } #endif UDPTransmit::UDPTransmit(Family family) : UDPSocket(family) { disconnect(); shutdown(so, 0); receiveBuffer(0); } Socket::Error UDPTransmit::cConnect(const IPV4Address &ia, tpport_t port) { int len = sizeof(peer.ipv4); peer.ipv4.sin_family = AF_INET; peer.ipv4.sin_addr = getaddress(ia); peer.ipv4.sin_port = htons(port); // Win32 will crash if you try to connect to INADDR_ANY. if ( INADDR_ANY == peer.ipv4.sin_addr.s_addr ) peer.ipv4.sin_addr.s_addr = INADDR_LOOPBACK; if(::connect(so, (sockaddr *)&peer.ipv4, len)) return connectError(); return errSuccess; } #ifdef CCXX_IPV6 Socket::Error UDPTransmit::connect(const IPV6Address &ia, tpport_t port) { int len = sizeof(peer.ipv6); peer.ipv6.sin6_family = AF_INET6; peer.ipv6.sin6_addr = getaddress(ia); peer.ipv6.sin6_port = htons(port); // Win32 will crash if you try to connect to INADDR_ANY. if(!memcmp(&peer.ipv6.sin6_addr, &in6addr_any, sizeof(in6addr_any))) memcpy(&peer.ipv6.sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback)); if(::connect(so, (struct sockaddr *)&peer.ipv6, len)) return connectError(); return errSuccess; } #endif Socket::Error UDPTransmit::connect(const IPV4Host &ia, tpport_t port) { if(isBroadcast()) setBroadcast(false); return cConnect((IPV4Address)ia,port); } Socket::Error UDPTransmit::connect(const IPV4Broadcast &subnet, tpport_t port) { if(!isBroadcast()) setBroadcast(true); return cConnect((IPV4Address)subnet,port); } Socket::Error UDPTransmit::connect(const IPV4Multicast &group, tpport_t port) { Error err; if(!( err = UDPSocket::setMulticast(true) )) return err; return cConnect((IPV4Address)group,port); } #ifdef CCXX_IPV6 Socket::Error UDPTransmit::connect(const IPV6Multicast &group, tpport_t port) { Error error; if(!( error = UDPSocket::setMulticast(true) )) return error; return connect((IPV6Address)group,port); } #endif UDPReceive::UDPReceive(const IPV4Address &ia, tpport_t port) : UDPSocket(ia, port) { shutdown(so, 1); sendBuffer(0); } #ifdef CCXX_IPV6 UDPReceive::UDPReceive(const IPV6Address &ia, tpport_t port) : UDPSocket(ia, port) { shutdown(so, 1); sendBuffer(0); } #endif Socket::Error UDPReceive::connect(const IPV4Host &ia, tpport_t port) { int len = sizeof(peer.ipv4); peer.ipv4.sin_family = AF_INET; peer.ipv4.sin_addr = getaddress(ia); peer.ipv4.sin_port = htons(port); // Win32 will crash if you try to connect to INADDR_ANY. if ( INADDR_ANY == peer.ipv4.sin_addr.s_addr ) peer.ipv4.sin_addr.s_addr = INADDR_LOOPBACK; if(::connect(so, (struct sockaddr *)&peer.ipv4, len)) return connectError(); return errSuccess; } #ifdef CCXX_IPV6 Socket::Error UDPReceive::connect(const IPV6Host &ia, tpport_t port) { int len = sizeof(peer.ipv6); peer.ipv6.sin6_family = AF_INET6; peer.ipv6.sin6_addr = getaddress(ia); peer.ipv6.sin6_port = htons(port); // Win32 will crash if you try to connect to INADDR_ANY. if(!memcmp(&peer.ipv6.sin6_addr, &in6addr_any, sizeof(in6addr_any))) memcpy(&peer.ipv6.sin6_addr, &in6addr_loopback, sizeof(in6addr_loopback)); if(::connect(so, (sockaddr *)&peer.ipv6, len)) return connectError(); return errSuccess; } #endif UDPDuplex::UDPDuplex(const IPV4Address &bind, tpport_t port) : UDPTransmit(bind, port + 1), UDPReceive(bind, port) {} #ifdef CCXX_IPV6 UDPDuplex::UDPDuplex(const IPV6Address &bind, tpport_t port) : UDPTransmit(bind, port + 1), UDPReceive(bind, port) {} #endif Socket::Error UDPDuplex::connect(const IPV4Host &host, tpport_t port) { Error rtn = UDPTransmit::connect(host, port); if(rtn) { UDPTransmit::disconnect(); UDPReceive::disconnect(); return rtn; } return UDPReceive::connect(host, port + 1); } #ifdef CCXX_IPV6 Socket::Error UDPDuplex::connect(const IPV6Host &host, tpport_t port) { Error rtn = UDPTransmit::connect(host, port); if(rtn) { UDPTransmit::disconnect(); UDPReceive::disconnect(); return rtn; } return UDPReceive::connect(host, port + 1); } #endif Socket::Error UDPDuplex::disconnect(void) { Error rtn = UDPTransmit::disconnect(); Error rtn2 = UDPReceive::disconnect(); if (rtn) return rtn; return rtn2; } #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/thread.cpp0000644000175000017500000011472211463410237013271 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #ifdef __BORLANDC__ #include #include #else #include #include #endif #include "private.h" #ifdef CCXX_HAVE_NEW_INIT #include #else inline void* operator new(size_t s,void* p) { return p;} #endif #ifdef WIN32 #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif #ifdef _THR_UNIXWARE #undef _POSIX_THREAD_PRIORITY_SCHEDULING #define sigwait(x, y) _thr_sigwait(x, y) #endif #ifdef __linux__ #define CCXX_SIG_THREAD_ALARM // NOTE: Comment this line to test Resume/Signal using one signal method #define CCXX_SIG_THREAD_STOPCONT #endif #ifndef WIN32 extern "C" { typedef void *(*exec_t)(void *); typedef RETSIGTYPE (*signalexec_t)(int); #ifndef CCXX_SIG_THREAD_STOPCONT #ifndef _THR_SUNOS5 #ifndef HAVE_PTHREAD_SUSPEND static RETSIGTYPE ccxx_sigsuspend(int); #endif #endif #endif static void ccxx_exec_handler(Thread *th); static void ccxx_thread_cleanup(void* arg); static void ccxx_thread_destructor(void* arg); static void ccxx_sig_handler(int signo); } #endif // ndef WIN32 #ifdef CCXX_SIG_THREAD_CANCEL extern "C" RETSIGTYPE _th_sigcancel(int sig) { pthread_exit(NULL); } #endif #ifdef WIN32 typedef unsigned (__stdcall *exec_t)(void *); #ifndef CCXX_NO_DLL # if defined(_MSC_VER) && !defined(_DLL) # error This project cannot be compiled as a static library. Some implementation stuff require DLL # endif #endif // CCXX_NO_DLL #endif // WIN32 /* * Start Suspend/Resume stuff */ // method to suspend are // - system suspend/resume recursive // - system suspend/resume not recursive // - one signal only, not recursive #ifndef WIN32 #define CCXX_SUSPEND_MODE_RECURSIVE 1 #define CCXX_SUSPEND_MODE_NOT_RECURSIVE 2 #define CCXX_SUSPEND_MODE_ONE_SIGNAL 3 #define CCXX_SUSPEND_MODE_MACH 4 #if defined(_THR_MACH) && !defined(MACOSX) #define CCXX_SUSPEND_MODE CCXX_SUSPEND_MODE_MACH #elif defined(HAVE_PTHREAD_SUSPEND) #define CCXX_SUSPEND_MODE CCXX_SUSPEND_MODE_NOT_RECURSIVE static inline void ccxx_resume(cctid_t tid) { pthread_continue(tid); } static inline void ccxx_suspend(cctid_t tid) { pthread_suspend(tid); } #else # if defined(_THR_SUNOS5) || defined(CCXX_SIG_THREAD_STOPCONT) # define CCXX_SUSPEND_MODE CCXX_SUSPEND_MODE_NOT_RECURSIVE # ifdef _THR_SUNOS5 static inline void ccxx_resume(cctid_t tid) { thr_continue((thread_t)tid); } static inline void ccxx_suspend(cctid_t tid) { thr_suspend((thread_t)tid); } # else # define CCXX_SIG_THREAD_SUSPEND SIGSTOP # define CCXX_SIG_THREAD_RESUME SIGCONT static inline void ccxx_resume(cctid_t tid) { pthread_kill(tid, CCXX_SIG_THREAD_RESUME); } static inline void ccxx_suspend(cctid_t tid) { pthread_kill(tid, CCXX_SIG_THREAD_SUSPEND); } # endif # else # define CCXX_SUSPEND_MODE CCXX_SUSPEND_MODE_ONE_SIGNAL # ifndef SIGUSR3 # ifdef SIGWINCH # define SIGUSR3 SIGWINCH # else # define SIGUSR3 SIGINT # endif # endif # define CCXX_SIG_THREAD_SUSPEND SIGUSR3 # define CCXX_SIG_THREAD_RESUME SIGUSR3 static inline void ccxx_resume(cctid_t tid) { pthread_kill(tid, CCXX_SIG_THREAD_RESUME); } static inline void ccxx_suspend(cctid_t tid) { pthread_kill(tid, CCXX_SIG_THREAD_SUSPEND); } # endif #endif #endif // ndef WIN32 Thread::Cancel Thread::enterCancel(void) { Thread *th = getThread(); if(!th) return cancelInitial; Cancel old = th->_cancel; if(old != cancelDisabled && old != cancelImmediate) { th->setCancel(cancelImmediate); #ifdef WIN32 Thread::yield(); #else pthread_testcancel(); #endif } return old; } void Thread::exitCancel(Cancel old) { Thread *th = getThread(); if(!th) return; if(old != th->_cancel) { #ifndef WIN32 pthread_testcancel(); #endif th->setCancel(old); } } void Thread::suspend(void) { if(!priv) return; #ifdef WIN32 if (!priv->_active || !priv->_suspendEnable) { #ifdef CCXX_EXCEPTIONS if (Thread::getException() != throwNothing) throw this; #endif return; } SuspendThread(priv->_hThread); #else if (!priv->_suspendEnable) return; #if CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_MACH thread_suspend(priv->_mach); #endif #if CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_RECURSIVE ccxx_suspend(priv->_tid); #endif #if (CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_NOT_RECURSIVE) \ || (CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_ONE_SIGNAL) if (++priv->_suspendcount != 1) return; ccxx_suspend(priv->_tid); #endif #endif // WIN32 } #if defined(__FreeBSD__) #define AUTOSTACK 0x10000 #endif #if defined(MACOSX) #define AUTOSTACK 0 #endif #ifndef AUTOSTACK #define AUTOSTACK 0x100000 #endif size_t Thread::_autostack = AUTOSTACK; void Thread::resume(void) { if(!priv) return; #ifdef WIN32 if (!priv->_active || !priv->_suspendEnable) { #ifdef CCXX_EXCEPTIONS if (Thread::getException() != throwNothing) throw this; #endif return; } ResumeThread(priv->_hThread); #else if (!priv->_suspendEnable) return; #if CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_MACH thread_resume(priv->_mach); #endif #if CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_RECURSIVE ccxx_resume(priv->_tid); #endif #if (CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_NOT_RECURSIVE) \ || (CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_ONE_SIGNAL) int c; if ( (c = --priv->_suspendcount) > 0) return; if ( c < 0 ) { ++priv->_suspendcount; return; } ccxx_resume(priv->_tid); #endif #endif // WIN32 } void Thread::join(void) { bool detached = isDetached(); joinSem.wait(); if(detached) { joinSem.post(); return; } #ifdef WIN32 // wait for real w32 thread to cleanup if(priv->_hThread) { WaitForSingleObject(priv->_hThread, INFINITE); ::CloseHandle(priv->_hThread); priv->_hThread = NULL; } #else // make sure we cleanup exiting thread if(priv->_jtid) { pthread_join(priv->_jtid, NULL); } priv->_jtid = 0; #endif joinSem.post(); // enable next waiting thread after cleanup } #ifndef WIN32 #if CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_ONE_SIGNAL // NOTE: Do not modify _suspendcount here, one program can call // Suspend 2 or more time but this function can be called only once inline RETSIGTYPE ThreadImpl::ThreadSigSuspend(int) { sigset_t sigs; sigemptyset(&sigs); sigaddset(&sigs, SIGUSR3); while ( (getThread()->priv->_suspendcount) > 0) { #ifdef HAVE_SIGWAIT2 int signo; sigwait(&sigs, &signo); #else sigwait(&sigs); #endif } } static RETSIGTYPE ccxx_sigsuspend(int signo) { return ThreadImpl::ThreadSigSuspend(signo); } #endif void Thread::setSuspend(Suspend mode) { if(!priv) return; priv->_suspendEnable = (mode == suspendEnable); #ifndef HAVE_PTHREAD_SUSPEND #ifdef CCXX_SIG_THREAD_SUSPEND sigset_t mask; sigemptyset(&mask); sigaddset(&mask, CCXX_SIG_THREAD_SUSPEND); switch(mode) { case suspendEnable: pthread_sigmask(SIG_UNBLOCK, &mask, NULL); return; case suspendDisable: pthread_sigmask(SIG_BLOCK, &mask, NULL); } #endif #endif } /* * End Suspend/Resume stuff */ static sigset_t *blocked_signals(sigset_t *sig) { sigemptyset(sig); sigaddset(sig, SIGINT); sigaddset(sig, SIGKILL); sigaddset(sig, SIGHUP); sigaddset(sig, SIGABRT); sigaddset(sig, SIGALRM); sigaddset(sig, SIGPIPE); #if CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_ONE_SIGNAL sigaddset(sig, SIGUSR3); #endif return sig; } #endif // ndef WIN32 typedef enum ThreadType { threadTypeNormal=0, threadTypeMain, threadTypePosix, threadTypeDummy } ThreadType; class MainThread : public Thread { protected: void run(void) {return;}; #ifndef WIN32 void onSignal(int signo) { std::exit(signo);}; #endif public: MainThread() : Thread(true) {}; }; // mantain info on thread creation class DummyThread : public Thread { protected: void run() {}; public: DummyThread() : Thread(false) { priv->_type = threadTypeDummy; } #ifdef WIN32 static void CheckDelete(); #endif }; #ifdef WIN32 static ThreadKey _self; #else // NOTE: _self instantiation MUST appear before _mainthread !! ThreadKey ThreadImpl::_self(ccxx_thread_destructor); #endif #ifdef WIN32 void DummyThread::CheckDelete() { Thread *th = (Thread*)_self.getKey(); if (!th) return; // delete if dummy thread if (th->priv->_type == threadTypeDummy) delete th; } #endif static MainThread _mainthread; Thread *Thread::_main = NULL; // invalid pointer to thread used to test deleted thread // point in the middle of mainthread... #define DUMMY_INVALID_THREAD ((Thread*)(((char*)((Thread*)&_mainthread))+1)) #if !defined(WIN32) #ifndef CCXX_SIG_THREAD_ALARM PosixThread *PosixThread::_timer = NULL; Mutex PosixThread::_arm; #endif #endif //void PosixThread::sigInstall(int); Thread::Thread(bool isMain): _cancel(cancelDefault), _start(NULL), priv(new ThreadImpl(threadTypeDummy)) { #ifdef WIN32 priv->_tid = GetCurrentThreadId(); // FIXME: error handling HANDLE process = GetCurrentProcess(); DuplicateHandle(process,GetCurrentThread(),process,&priv->_hThread,0,FALSE,DUPLICATE_SAME_ACCESS); _parent = this; priv->_cancellation = CreateEvent(NULL, TRUE, FALSE, NULL); if(isMain) { setName("main()"); priv->_type = threadTypeMain; _main = this; } else setName("-dummy-"); _self.setKey(this); #else priv->_suspendEnable = false; priv->_tid = pthread_self(); _parent = NULL; struct sigaction act; // NOTE: for race condition (signal handler can use getThread) // you should initialize _main and _self before registering signals ThreadImpl::_self.setKey(this); if(isMain == true) { _main = this; priv->_type = threadTypeMain; #if !defined(__CYGWIN32__) && !defined(__MINGW32__) PosixThread::sigInstall(SIGHUP); PosixThread::sigInstall(SIGALRM); PosixThread::sigInstall(SIGPIPE); PosixThread::sigInstall(SIGABRT); memset(&act, 0, sizeof(act)); act.sa_handler = (signalexec_t)&ccxx_sig_handler; sigemptyset(&act.sa_mask); # ifdef SA_RESTART act.sa_flags = SA_RESTART; # else act.sa_flags = 0; # endif # ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; # endif # ifdef SIGPOLL sigaction(SIGPOLL, &act, NULL); # else sigaction(SIGIO, &act, NULL); # endif # if CCXX_SUSPEND_MODE == CCXX_SUSPEND_MODE_ONE_SIGNAL act.sa_handler = ccxx_sigsuspend; sigemptyset(&act.sa_mask); # ifdef SA_RESTART act.sa_flags = SA_RESTART; # else act.sa_flags = 0; # endif sigaction(SIGUSR3, &act, NULL); # endif # ifdef CCXX_SIG_THREAD_CANCEL memset(&act, sizeof(act), 0); act.sa_flags = 0; act.sa_handler = _th_sigcancel; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGHUP); sigaddset(&act.sa_mask, SIGALRM); sigaddset(&act.sa_mask, SIGPIPE); sigaction(CCXX_SIG_THREAD_CANCEL, &act, NULL); # endif #endif } #endif // WIN32 } Thread::Thread(int pri, size_t stack): _cancel(cancelDefault), _start(NULL), priv(new ThreadImpl(threadTypeNormal)) { #ifdef WIN32 if(!_main) { _self.setKey(NULL); _main = this; setName("main()"); } else #ifdef WIN32 _name[0] = 0; #else snprintf(_name, sizeof(_name), "%d", getId()); #endif _parent = Thread::get(); if(_parent) priv->_throw = _parent->priv->_throw; else _parent = this; priv->_cancellation = CreateEvent(NULL, TRUE, FALSE, NULL); if(!priv->_cancellation) THROW(this); if(stack <= _autostack) priv->_stack = 0; else priv->_stack = stack; if(pri > 2) pri = 2; if(pri < -2) pri = -2; if(Process::isRealtime() && pri < 0) pri = 0; switch(pri) { case 1: priv->_priority = THREAD_PRIORITY_ABOVE_NORMAL; break; case -1: priv->_priority = THREAD_PRIORITY_BELOW_NORMAL; break; case 2: priv->_priority = THREAD_PRIORITY_HIGHEST; break; case -2: priv->_priority = THREAD_PRIORITY_LOWEST; break; default: priv->_priority = THREAD_PRIORITY_NORMAL; } #else pthread_attr_init(&priv->_attr); pthread_attr_setdetachstate(&priv->_attr, PTHREAD_CREATE_JOINABLE); #ifdef PTHREAD_STACK_MIN if(stack && stack <= _autostack) pthread_attr_setstacksize(&priv->_attr, _autostack); else if(stack > _autostack) { if(stack < PTHREAD_STACK_MIN) stack = PTHREAD_STACK_MIN; else { // align to nearest min boundry int salign = stack / PTHREAD_STACK_MIN; if(stack % PTHREAD_STACK_MIN) ++salign; stack = salign * PTHREAD_STACK_MIN; } if(stack && pthread_attr_setstacksize(&priv->_attr, stack)) { #ifdef CCXX_EXCEPTIONS switch(Thread::getException()) { case throwObject: throw(this); return; #ifdef COMMON_STD_EXCEPTION case throwException: throw(ThrException("no stack space")); return; #endif default: return; } #else return; #endif } } #endif #ifndef __FreeBSD__ #ifdef _POSIX_THREAD_PRIORITY_SCHEDULING #ifdef HAVE_SCHED_GETSCHEDULER #define __HAS_PRIORITY_SCHEDULING__ if(pri < 0 && Process::isRealtime()) pri = 0; if(pri) { struct sched_param sched; int policy; policy = sched_getscheduler(0); if(policy < 0) { #ifdef CCXX_EXCEPTIONS switch(Thread::getException()) { case throwObject: throw(this); return; #ifdef COMMON_STD_EXCEPTION case throwException: throw(ThrException("invalid scheduler")); return; #endif default: return; } #else return; #endif } sched_getparam(0, &sched); pri = sched.sched_priority - pri; if(pri > sched_get_priority_max(policy)) pri = sched_get_priority_max(policy); if(pri < sched_get_priority_min(policy)) pri = sched_get_priority_min(policy); sched.sched_priority = pri; pthread_attr_setschedpolicy(&priv->_attr, policy); pthread_attr_setschedparam(&priv->_attr, &sched); } #endif // ifdef HAVE_SCHED_GETSCHEDULER #endif // ifdef _POSIX_THREAD_PRIORITY_SCHEDULING #endif // ifndef __FreeBSD__ #ifdef __HAS_PRIORITY_SCHEDULING__ if(!pri) pthread_attr_setinheritsched(&priv->_attr, PTHREAD_INHERIT_SCHED); #else pthread_attr_setinheritsched(&priv->_attr, PTHREAD_INHERIT_SCHED); #endif _parent = getThread(); priv->_throw = _parent->priv->_throw; _cancel = cancelInitial; #endif // WIN32 } #ifndef WIN32 Thread::Thread(const Thread &th) { priv = new ThreadImpl(threadTypeNormal); _parent = th._parent; priv->_attr = th.priv->_attr; _cancel = cancelInitial; _start = NULL; priv->_throw = th.priv->_throw; priv->_suspendEnable = false; setName(NULL); // sigset_t mask, newmask; // int rc; // // pthread_sigmask(SIG_BLOCK, blocked_signals(&newmask), &mask); // rc = pthread_create(&_tid, &_attr, exec_t(&ccxx_exec_handler), this); // pthread_sigmask(SIG_SETMASK, &mask, NULL); // if(rc && Thread::getException() == throwObject) // throw(this); //#ifdef COMMON_STD_EXCEPTION // else if(rc && Thread::getException() == throwException) // throw(ThrException("cannot start copy")); //#endif } #endif // ndef WIN32 Thread::~Thread() { if(!priv) return; #ifndef WIN32 if(this == &_mainthread) return; #endif if(priv->_type == threadTypeDummy) { delete priv; priv = NULL; return; } terminate(); } void Thread::setName(const char *text) { if(text) snprintf(_name, sizeof(_name), "%s", text); else snprintf(_name, sizeof(_name), "%ld", (long)getId()); } void Thread::initial(void) {} void Thread::final(void) {} void *Thread::getExtended(void) { return NULL; } void Thread::notify(Thread *) {} bool Thread::isThread(void) const { if(!priv) return false; #ifdef WIN32 return ((priv->_tid == GetCurrentThreadId())) ? true : false; #else return (priv->_tid == pthread_self()) ? true : false; #endif } bool Thread::isDetached(void) const { if(!priv) return false; #ifdef WIN32 // win32 doesn't support detached threads directly return priv->_detached; #else int state; pthread_attr_getdetachstate(&priv->_attr, &state); if(state == PTHREAD_CREATE_DETACHED) return true; return false; #endif } cctid_t Thread::getId(void) const { if(!priv) return (cctid_t)-1; return priv->_tid; } bool Thread::isRunning(void) const { if(!priv) return false; #ifdef WIN32 return (priv->_tid != 0 && priv->_active) ? true : false; #else return (priv->_tid != 0) ? true : false; #endif // WIN32 } int Thread::start(Semaphore *st) { if(!priv) return -1; #ifdef WIN32 if(priv->_active) return -1; _start = st; priv->_hThread = (HANDLE)_beginthreadex(NULL, (unsigned)priv->_stack, (exec_t)&Execute, (void *)this, CREATE_SUSPENDED, (unsigned *)&priv->_tid); if(!priv->_hThread) { CloseHandle(priv->_cancellation); priv->_cancellation = NULL; return -1; } setCancel(cancelInitial); SetThreadPriority(priv->_hThread, priv->_priority); ResumeThread(priv->_hThread); priv->_active = true; return 0; #else if(priv->_tid) { if(_start) { _start->post(); return 0; } else return -1; } _start = st; return pthread_create(&priv->_tid, &priv->_attr, exec_t(&ccxx_exec_handler), this); #endif } int Thread::detach(Semaphore *st) { _parent = NULL; #ifdef WIN32 // win32 we emulate detach if(!priv) return -1; priv->_detached = true; if(!priv->_active) return Thread::start(st); else if(_start) _start->post(); return 0; #else if(!priv) return -1; if(priv->_tid) { pthread_detach(priv->_tid); if(_start) { _start->post(); pthread_attr_setdetachstate(&priv->_attr, PTHREAD_CREATE_DETACHED); return 0; } return -1; } pthread_attr_setdetachstate(&priv->_attr, PTHREAD_CREATE_DETACHED); _start = st; if(!pthread_create(&priv->_tid, &priv->_attr, exec_t(&ccxx_exec_handler), this)) return 0; return -1; #endif } void Thread::terminate(void) { #ifdef WIN32 HANDLE hThread; if(!priv) return; hThread = priv->_hThread; if (!priv->_tid || isThread()) { if( priv->_cancellation) ::CloseHandle(priv->_cancellation); if(hThread) ::CloseHandle(hThread); delete priv; priv = NULL; return; } bool terminated = false; if(!priv->_active && hThread != NULL) { // NOTE: add a test in testthread for multiple // suspended Terminate ResumeThread(hThread); TerminateThread(hThread, 0); terminated = true; } else if(hThread != NULL) { switch(_cancel) { case cancelImmediate: TerminateThread(hThread, 0); terminated = true; break; default: SetEvent(priv->_cancellation); } } if(hThread != NULL) { WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); hThread = NULL; } // what if parent already exited? // if(_parent) // _parent->notify(this); if(priv->_cancellation != NULL) CloseHandle(priv->_cancellation); priv->_cancellation = NULL; priv->_tid = 0; if(getThread() == this) _self.setKey(DUMMY_INVALID_THREAD); if (terminated) final(); #else if(!priv) return; cctid_t jtid = priv->_jtid, tid = priv->_tid; if(jtid && (pthread_self() != jtid)) { pthread_join(jtid, NULL); priv->_jtid = 0; } else if((pthread_self() != tid) && tid) { // in suspend thread cannot be cancelled or signaled // ??? rigth // ccxx_resume(priv->_tid); // assure thread has ran before we try to cancel... if(_start) _start->post(); pthread_cancel(tid); if(!isDetached()) { pthread_join(tid,NULL); priv->_tid = 0; } } pthread_attr_destroy(&priv->_attr); #endif delete priv; priv = NULL; } void Thread::sync(void) { #if defined(__MACH__) || defined(__GNU__) Thread::exit(); #else Thread::sleep(TIMEOUT_INF); #endif } void Thread::exit(void) { if (isThread()) { setCancel(cancelDisabled); #ifdef WIN32 close(); ExitThread(0); #else pthread_exit(NULL); #endif // WIN32 } } void Thread::close() { bool detached = isDetached(); #if !defined(CCXX_SIG_THREAD_ALARM) && !defined(__CYGWIN32__) && !defined(__MINGW32__) && !defined(WIN32) if(this == PosixThread::_timer) PosixThread::_arm.leaveMutex(); #endif setCancel(cancelDisabled); // if(_parent) // _parent->notify(this); // final can call destructor (that call Terminate) final(); // test if this class is self-exiting thread #ifdef WIN32 if (_self.getKey() == this) #else if (ThreadImpl::_self.getKey() == this) #endif { if(priv) { #ifndef WIN32 priv->_jtid = priv->_tid; priv->_tid = 0; #else priv->_active = false; #endif } joinSem.post(); } // see if detached, and hence self deleting if(detached) delete this; } #ifndef WIN32 inline void ThreadImpl::ThreadCleanup(Thread* th) { // close thread // (freddy77) Originally I thougth to throw an exception for deferred // for capture it and cleanup using C++ destructor // this doesn't work out!! // Throwing exception here (in cleanup) core dump app th->close(); } extern "C" { static void ccxx_thread_cleanup(void* arg) { ThreadImpl::ThreadCleanup( (Thread*)arg ); } } inline void ThreadImpl::ThreadExecHandler(Thread *th) { ThreadImpl::_self.setKey(th); sigset_t mask; pthread_sigmask(SIG_BLOCK, blocked_signals(&mask), NULL); th->priv->_tid = pthread_self(); #if defined(HAVE_PTHREAD_MACH_THREAD_NP) th->priv->_mach = pthread_mach_thread_np(th->priv->_tid); #elif defined(_THR_MACH) th->priv->_mach = mach_thread_self(); #endif th->setCancel(Thread::cancelInitial); // using SIGUSR3 do not enable suspend by default th->setSuspend(Thread::suspendEnable); th->yield(); if(th->_start) { th->_start->wait(); th->_start = NULL; } pthread_cleanup_push(ccxx_thread_cleanup,th); th->initial(); if(th->getCancel() == Thread::cancelInitial) th->setCancel(Thread::cancelDefault); th->run(); th->setCancel(Thread::cancelDisabled); pthread_cleanup_pop(0); if(th->isDetached()) ThreadImpl::_self.setKey(NULL); th->close(); pthread_exit(NULL); } // delete Thread class created for no CommonC++ thread inline void ThreadImpl::ThreadDestructor(Thread* th) { if (!th || th == DUMMY_INVALID_THREAD || !th->priv) return; if(!th->priv) return; if (th->priv->_type == threadTypeDummy) delete th; } extern "C" { static void ccxx_thread_destructor(void* arg) { ThreadImpl::ThreadDestructor( (Thread*)arg ); } static void ccxx_exec_handler(Thread *th) { ThreadImpl::ThreadExecHandler(th); } } #endif // ndef WIN32 #ifdef CCXX_SIG_THREAD_CANCEL void Thread::setCancel(Cancel mode) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, CCXX_SIG_THREAD_CANCEL); switch(mode) { case cancelImmediate: pthread_sigmask(SIG_UNBLOCK, &mask, NULL); break; case cancelInitial: case cancelDisabled: case cancelDeferred: pthread_sigmask(SIG_BLOCK, &mask, NULL); break; } _cancel = mode; } #else void Thread::setCancel(Cancel mode) { #ifdef WIN32 switch(mode) { case cancelDeferred: case cancelImmediate: _cancel = mode; yield(); break; case cancelDisabled: case cancelInitial: _cancel = mode; } #else int old; switch(mode) { case cancelImmediate: pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old); break; case cancelDeferred: pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old); pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &old); break; case cancelInitial: case cancelDisabled: pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old); break; default: return; } _cancel = mode; #endif // WIN32 } #endif void Thread::yield(void) { #ifdef WIN32 Thread::sleep(1); // note: on Win32, Sleep(0) is "optimized" to NOP. #else #ifdef CCXX_SIG_THREAD_CANCEL Thread* th = getThread(); sigset_t cancel, old; sigemptyset(&cancel); sigaddset(&cancel, CCXX_SIG_THREAD_CANCEL); if(th && th->_cancel != cancelDisabled && th->_cancel != cancelInitial) pthread_sigmask(SIG_UNBLOCK, &cancel, &old); #else pthread_testcancel(); #endif #ifdef HAVE_PTHREAD_YIELD pthread_yield(); #endif #ifdef CCXX_SIG_THREAD_CANCEL if(th && th->_cancel != cancelDisabled && th->_cancel != cancelInitial) pthread_sigmask(SIG_SETMASK, &old, NULL); #endif #endif // WIN32 } void Thread::setException(Thread::Throw mode) { Thread *thread = getThread(); thread->priv->_throw = mode; } Thread::Throw Thread::getException(void) { Thread *thread = getThread(); return thread->priv->_throw; } Cancellation::Cancellation(Thread::Cancel cancel) { Thread *thread = getThread(); if(!thread) return; prior = thread->getCancel(); thread->setCancel(cancel); } Cancellation::~Cancellation() { Thread *thread = getThread(); if(!thread) return; thread->setCancel(prior); } bool Thread::testCancel(void) { #ifdef WIN32 switch(_cancel) { case cancelInitial: case cancelDisabled: break; default: if(WaitForSingleObject(priv->_cancellation, 0) == WAIT_OBJECT_0) { if (_cancel == cancelManual) THROW(InterruptException()); else exit(); } } return false; #else // WIN32 #ifdef CCXX_SIG_THREAD_CANCEL sigset_t cancel, old; sigemptyset(&cancel); sigaddset(&cancel, CCXX_SIG_THREAD_CANCEL); if(_cancel != cancelDisabled && _cancel != cancelInitial) pthread_sigmask(SIG_UNBLOCK, &cancel, &old); #else pthread_testcancel(); #endif #ifdef CCXX_SIG_THREAD_CANCEL if(_cancel != cancelDisabled) pthread_sigmask(SIG_SETMASK, &old, NULL); #endif return false; #endif // WIN32 } #ifdef WIN32 bool Thread::isCancelled() const { return waitThread(priv->_cancellation, 0) == WAIT_OBJECT_0; } DWORD Thread::waitThread(HANDLE hRef, timeout_t timeout) { Thread *th = getThread(); if(th) return th->waitHandle(hRef, timeout); else return WaitForSingleObject(hRef, timeout); } void Thread::sleep(timeout_t timeout) { Thread *th = getThread(); if(!th) { SleepEx(timeout, FALSE); return; } switch(th->_cancel) { case cancelInitial: case cancelDisabled: SleepEx(timeout, FALSE); break; default: if(WaitForSingleObject(th->priv->_cancellation, timeout) == WAIT_OBJECT_0) { if (th->_cancel == cancelManual) THROW(InterruptException()); else th->exit(); } } } DWORD Thread::waitHandle(HANDLE obj, timeout_t timeout) { HANDLE objects[2]; DWORD stat; objects[0] = priv->_cancellation; objects[1] = obj; // FIXME: what should happen if someone enable cancellation on wait?? switch(_cancel) { case cancelInitial: case cancelDisabled: return WaitForSingleObject(obj, timeout); default: switch(stat = WaitForMultipleObjects(2, objects, false, timeout)) { case WAIT_OBJECT_0: if (_cancel == cancelManual) THROW(InterruptException()); else exit(); case WAIT_OBJECT_0 + 1: return WAIT_OBJECT_0; default: return stat; } } } // Entry point linked for default disable thread call, not suitable // for threading library... BOOL WINAPI DllMain( HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved ) { switch(dwReason) { case DLL_THREAD_DETACH: DummyThread::CheckDelete(); break; } return TRUE ; } #endif // WIN32 #ifndef WIN32 Thread *Thread::get(void) { Thread *thread; // fix strange no-init on Solaris if(!Thread::_main) { new (&_mainthread) MainThread(); return &_mainthread; } thread = (Thread *)ThreadImpl::_self.getKey(); // class have been deleted, return NULL if (thread == DUMMY_INVALID_THREAD) return NULL; if(!thread) { // this Thread will be deleted by ccxx_thread_destruct thread = new DummyThread; ThreadImpl::_self.setKey(thread); } return thread; } #else // WIN32 Thread *Thread::get(void) { Thread *th = (Thread *)_self.getKey(); if (th == DUMMY_INVALID_THREAD) return NULL; // for no common c++ thread construct a dummy thread if (!th) th = new DummyThread(); return th; } unsigned __stdcall Thread::Execute(Thread *th) { _self.setKey(th); th->yield(); if(th->_start) { th->_start->wait(); th->_start = NULL; } try { th->priv->_tid = GetCurrentThreadId(); if(!th->_name[0]) snprintf(th->_name, sizeof(th->_name), "%d", GetCurrentThreadId()); th->initial(); if(th->getCancel() == cancelInitial) th->setCancel(cancelDefault); th->run(); } // ignore cancellation exception catch(const InterruptException&) { ; } th->close(); return 0; } #endif //WIN32 #if !defined(WIN32) /* * PosixThread implementation */ inline void ThreadImpl::PosixThreadSigHandler(int signo) { Thread *t = getThread(); PosixThread *th = NULL; #ifdef CCXX_EXCEPTIONS if (t) th = dynamic_cast(t); #else if (t) th = (PosixThread*)(t); #endif if (!th) return; switch(signo) { case SIGHUP: if(th) th->onHangup(); break; case SIGABRT: if(th) th->onException(); break; case SIGPIPE: if(th) th->onDisconnect(); break; case SIGALRM: #ifndef CCXX_SIG_THREAD_ALARM if(PosixThread::_timer) { PosixThread::_timer->_alarm = 0; PosixThread::_timer->onTimer(); } else #endif if(th) th->onTimer(); break; #ifdef SIGPOLL case SIGPOLL: #else case SIGIO: #endif if(th) th->onPolling(); break; default: if(th) th->onSignal(signo); } } extern "C" { static void ccxx_sig_handler(int signo) { ThreadImpl::PosixThreadSigHandler(signo); } } PosixThread::PosixThread(int pri, size_t stack): Thread(pri,stack) { SysTime::getTime(&_alarm); } void PosixThread::onTimer(void) {} void PosixThread::onHangup(void) {} void PosixThread::onException(void) {} void PosixThread::onDisconnect(void) {} void PosixThread::onPolling(void) {} void PosixThread::onSignal(int sig) {} void PosixThread::setTimer(timeout_t timer, bool periodic) { sigset_t sigs; #ifdef HAVE_SETITIMER struct itimerval itimer; memset(&itimer, 0, sizeof(itimer)); itimer.it_value.tv_usec = (timer * 1000) % 1000000; itimer.it_value.tv_sec = timer / 1000; if (periodic) { itimer.it_interval.tv_usec = itimer.it_value.tv_usec; itimer.it_interval.tv_sec = itimer.it_value.tv_sec; } #else timer /= 1000; #endif #ifndef CCXX_SIG_THREAD_ALARM _arm.enterMutex(); _timer = this; #endif SysTime::getTime(&_alarm); sigemptyset(&sigs); sigaddset(&sigs, SIGALRM); pthread_sigmask(SIG_UNBLOCK, &sigs, NULL); #ifdef HAVE_SETITIMER setitimer(ITIMER_REAL, &itimer, NULL); #else alarm(timer); #endif } timeout_t PosixThread::getTimer(void) const { #ifdef HAVE_SETITIMER struct itimerval itimer; #endif if(!_alarm) return 0; #ifdef HAVE_SETITIMER getitimer(ITIMER_REAL, &itimer); return (timeout_t)(itimer.it_value.tv_sec * 1000 + itimer.it_value.tv_usec / 1000); #else time_t now = SysTime::getTime(); return (timeout_t)(((now - _alarm) * 1000) + 500); #endif } void PosixThread::endTimer(void) { #ifdef HAVE_SETITIMER static const struct itimerval itimer = {{0, 0},{0,0}}; #endif sigset_t sigs; #ifndef CCXX_SIG_THREAD_ALARM if(_timer != this) return; #endif #ifdef HAVE_SETITIMER setitimer(ITIMER_REAL, (struct itimerval *)&itimer, NULL); #else alarm(0); #endif sigemptyset(&sigs); sigaddset(&sigs, SIGALRM); pthread_sigmask(SIG_BLOCK, &sigs, NULL); #ifndef CCXX_SIG_THREAD_ALARM _arm.leaveMutex(); _timer = NULL; #endif } #if defined(HAVE_SIGWAIT) || defined(HAVE_SIGWAIT2) void PosixThread::waitSignal(signo_t signo) { sigset_t mask; sigemptyset(&mask); sigaddset(&mask, signo); #ifndef HAVE_SIGWAIT2 signo = sigwait(&mask); #else sigwait(&mask, &signo); #endif } #endif // ifdef HAVE_SIGWAIT void PosixThread::setSignal(int signo, bool mode) { sigset_t sigs; sigemptyset(&sigs); sigaddset(&sigs, signo); if(mode) pthread_sigmask(SIG_UNBLOCK, &sigs, NULL); else pthread_sigmask(SIG_BLOCK, &sigs, NULL); } void PosixThread::signalThread(Thread* th,signo_t signo) { pthread_kill(th->priv->_tid, signo); } pthread_attr_t * PosixThread::getPthreadAttrPtr(void) { return &priv->_attr; } pthread_t PosixThread::getPthreadId(void) { return priv->_tid; } void PosixThread::sigInstall(int signo) { struct sigaction act; act.sa_handler = (signalexec_t)&ccxx_sig_handler; sigemptyset(&act.sa_mask); #ifdef SA_INTERRUPT act.sa_flags = SA_INTERRUPT; #else act.sa_flags = 0; #endif sigaction(signo, &act, NULL); } #endif #ifdef USE_POLL Poller::Poller() { nufds = 0; ufds = NULL; } Poller::~Poller() { if(ufds) { delete[] ufds; ufds = NULL; } } pollfd *Poller::getList(int cnt) { if(nufds < cnt) { if(ufds) delete[] ufds; ufds = new pollfd[cnt]; nufds = cnt; } return ufds; } #endif Mutex SysTime::timeLock; time_t SysTime::getTime(time_t *tloc) { time_t ret; lock(); time_t temp; #ifdef WIN32 ::time(&temp); #else std::time(&temp); #endif memcpy(&ret, &temp, sizeof(time_t)); if (tloc != NULL) memcpy(tloc, &ret, sizeof(time_t)); unlock(); return ret; } int SysTime::getTimeOfDay(struct timeval *tp) { struct timeval temp; int ret(0); lock(); #ifdef WIN32 // We could use _ftime(), but it is not available on WinCE. // (WinCE also lacks time.h) // Note also that the average error of _ftime is around 20 ms :) time_t now; time(&now); temp.tv_sec = (long)now; temp.tv_usec = (GetTickCount() % 1000) * 1000; memcpy(tp, &temp, sizeof(struct timeval)); #else ret = ::gettimeofday(&temp, NULL); if(ret == 0) memcpy(tp, &temp, sizeof(struct timeval)); #endif unlock(); return ret; } struct tm *SysTime::getLocalTime(const time_t *clock, struct tm* result) { lock(); #ifdef WIN32 struct tm *temp = ::localtime(clock); #else struct tm *temp = std::localtime(clock); #endif memcpy(result, temp, sizeof(struct tm)); unlock(); return result; } struct tm *SysTime::getGMTTime(const time_t *clock, struct tm* result) { lock(); #ifdef WIN32 struct tm *temp = ::gmtime(clock); #else struct tm *temp = std::gmtime(clock); #endif memcpy(result, temp, sizeof(struct tm)); unlock(); return result; } // C stuff // this function must declared as extern "C" for some compiler #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * tab-width: 4 * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/semaphore.cpp0000644000175000017500000001064511463402132013777 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include "private.h" #include #include #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef WIN32 extern "C" { #include } #include Semaphore::Semaphore(unsigned resource) { pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutex_init(&_mutex, &attr); pthread_mutexattr_destroy(&attr); if(pthread_cond_init(&_cond, NULL) && Thread::getException() == Thread::throwObject) THROW(this); _count = resource; _waiters = 0; } Semaphore::~Semaphore() { // Unlock is needed to unlock the mutex in the case of a cancel during Semaphore::wait() // see PTHREAD_COND_TIMEDWAIT(3P) pthread_mutex_unlock(&_mutex); pthread_cond_destroy(&_cond); pthread_mutex_destroy(&_mutex); } void Semaphore::force_unlock_after_cancellation() { pthread_mutex_unlock(&_mutex); } bool Semaphore::wait(timeout_t timeout) { struct timespec ts; bool flag = true; int rc; pthread_mutex_lock(&_mutex); ++_waiters; if(_count) goto exiting; if(!timeout) { while(_count == 0) pthread_cond_wait(&_cond, &_mutex); goto exiting; } getTimeout(&ts, timeout); rc = pthread_cond_timedwait(&_cond, &_mutex, &ts); if(rc == ETIMEDOUT || _count == 0) flag = false; exiting: --_waiters; if(_count) --_count; pthread_mutex_unlock(&_mutex); return flag; } void Semaphore::post(void) { pthread_mutex_lock(&_mutex); if(_waiters > 0) pthread_cond_signal(&_cond); ++_count; pthread_mutex_unlock(&_mutex); } #if 0 // stripped since only in posix int Semaphore::getValue(void) { int value; pthread_mutex_lock(&_mutex); value = _count; pthread_mutex_unlock(&_mutex); return value; } #endif #else Semaphore::Semaphore(unsigned resource) { semObject = ::CreateSemaphore((LPSECURITY_ATTRIBUTES)NULL, (LONG)resource, MAX_SEM_VALUE, (LPCTSTR)NULL); } Semaphore::~Semaphore() { ::CloseHandle(semObject); } bool Semaphore::wait(timeout_t timeout) { if(!timeout) timeout = INFINITE; return Thread::waitThread(semObject, timeout) == WAIT_OBJECT_0; } void Semaphore::post(void) { ::ReleaseSemaphore(semObject, 1, (LPLONG)NULL); } #endif //WIN32 #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/date.cpp0000644000175000017500000004411211463374342012740 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #include #include #include #include #include #include #ifdef WIN32 #include "time.h" #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #ifdef __BORLANDC__ using std::time_t; using std::tm; using std::localtime; #endif #endif Date::Date() { time_t now = SysTime::getTime(); struct tm dt; SysTime::getLocalTime(&now, &dt); toJulian(dt.tm_year + 1900, dt.tm_mon + 1, dt.tm_mday); } Date::Date(struct tm *dt) { toJulian(dt->tm_year + 1900, dt->tm_mon + 1, dt->tm_mday); } Date::Date(time_t tm) { struct tm dt; SysTime::getLocalTime(&tm, &dt); toJulian(dt.tm_year + 1900, dt.tm_mon + 1, dt.tm_mday); } Date::Date(char *str, size_t size) { setDate(str, size); } Date::~Date() { } void Date::setDate(const char *str, size_t size) { time_t now = SysTime::getTime(); struct tm dt; SysTime::getLocalTime(&now, &dt); int year = 0; const char *mstr = str; const char *dstr = str; if(!size) size = strlen(str); //0000 if(size == 4) { #ifdef DEBUG cout << "Date::SetDate(): 0000" << endl; #endif year = dt.tm_year + 1900; mstr = str; dstr = str + 2; } //00/00 else if(size == 5) { #ifdef DEBUG cout << "Date::SetDate(): 00/00" << endl; #endif year = dt.tm_year + 1900; mstr = str; dstr = str + 3; } //000000 else if(size == 6) { #ifdef DEBUG cout << "Date::SetDate(): 000000" << endl; #endif ZNumber nyear((char*)str, 2); year = ((dt.tm_year + 1900) / 100) * 100 + nyear(); mstr = str + 2; dstr = str + 4; } //00000000 else if(size == 8 && str[2] >= '0' && str[2] <= '9' && str[5] >= '0' && str[5] <= '9') { #ifdef DEBUG cout << "Date::SetDate(): 00000000" << endl; #endif ZNumber nyear((char*)str, 4); year = nyear(); mstr = str + 4; dstr = str + 6; } //00/00/00 else if(size == 8) { #ifdef DEBUG cout << "Date::SetDate(): 00/00/00" << endl; #endif ZNumber nyear((char*)str, 2); year = ((dt.tm_year + 1900) / 100) * 100 + nyear(); mstr = str + 3; dstr = str + 6; } //0000/00/00 else if(size == 10) { #ifdef DEBUG cout << "Date::SetDate(): 0000-00-00" << endl; #endif ZNumber nyear((char*)str, 4); year = nyear(); mstr = str + 5; dstr = str + 8; } #ifdef CCXX_EXCEPTIONS else if(Thread::getException() == Thread::throwObject) { throw this; } #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) { throw Exception("Date::setDate(): Invalid date."); } #endif #endif else { julian = 0x7fffffffl; return; } ZNumber nmonth((char*)mstr, 2); ZNumber nday((char*)dstr, 2); toJulian(year, nmonth(), nday()); } Date::Date(int year, unsigned month, unsigned day) { toJulian(year, month, day); } void Date::update(void) { } bool Date::isValid(void) const { if(julian == 0x7fffffffl) return false; return true; } char *Date::getDate(char *buf) const { fromJulian(buf); return buf; } time_t Date::getDate(tm* dt) const { char buf[11]; memset(dt, 0, sizeof(tm)); fromJulian(buf); Number nyear(buf, 4); Number nmonth(buf + 5, 2); Number nday(buf + 8, 2); dt->tm_year = nyear() - 1900; dt->tm_mon = nmonth() - 1; dt->tm_mday = nday(); return mktime(dt); // to fill in day of week etc. } time_t Date::getDate(void) const { struct tm dt; return getDate(&dt); } int Date::getYear(void) const { char buf[11]; fromJulian(buf); Number num(buf, 4); return num(); } unsigned Date::getMonth(void) const { char buf[11]; fromJulian(buf); Number num(buf + 5, 2); return num(); } unsigned Date::getDay(void) const { char buf[11]; fromJulian(buf); Number num(buf + 8, 2); return num(); } unsigned Date::getDayOfWeek(void) const { return (unsigned)((julian + 1l) % 7l); } String Date::operator()() const { char buf[11]; fromJulian(buf); String date(buf); return date; } long Date::getValue(void) const { char buf[11]; fromJulian(buf); return atol(buf) * 10000 + atol(buf + 5) * 100 + atol(buf + 8); } Date& Date::operator++() { ++julian; update(); return *this; } Date& Date::operator--() { --julian; update(); return *this; } Date& Date::operator+=(const long val) { julian += val; update(); return *this; } Date& Date::operator-=(long val) { julian -= val; update(); return *this; } int Date::operator==(const Date &d) { return julian == d.julian; } int Date::operator!=(const Date &d) { return julian != d.julian; } int Date::operator<(const Date &d) { return julian < d.julian; } int Date::operator<=(const Date &d) { return julian <= d.julian; } int Date::operator>(const Date &d) { return julian > d.julian; } int Date::operator>=(const Date &d) { return julian >= d.julian; } void Date::toJulian(long year, long month, long day) { julian = 0x7fffffffl; if(month < 1 || month > 12 || day < 1 || day > 31 || year == 0) { #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) { throw this; } #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) { throw Exception("Date::toJulian(): Invalid date."); } #endif #endif return; } if(year < 0) year--; julian = day - 32075l + 1461l * (year + 4800l + ( month - 14l) / 12l) / 4l + 367l * (month - 2l - (month - 14l) / 12l * 12l) / 12l - 3l * ((year + 4900l + (month - 14l) / 12l) / 100l) / 4l; } void Date::fromJulian(char *buffer) const { // The following conversion algorithm is due to // Henry F. Fliegel and Thomas C. Van Flandern: ZNumber nyear(buffer, 4); buffer[4] = '-'; ZNumber nmonth(buffer + 5, 2); buffer[7] = '-'; ZNumber nday(buffer + 8, 2); double i, j, k, l, n; l = julian + 68569.0; n = int( 4 * l / 146097.0); l = l - int( (146097.0 * n + 3)/ 4 ); i = int( 4000.0 * (l+1)/1461001.0); l = l - int(1461.0*i/4.0) + 31.0; j = int( 80 * l/2447.0); k = l - int( 2447.0 * j / 80.0); l = int(j/11); j = j+2-12*l; i = 100*(n - 49) + i + l; nyear = int(i); nmonth = int(j); nday = int(k); buffer[10] = '\0'; } Date operator+(const Date &date, const long val) { Date d = date; d.julian += val; d.update(); return d; } Date operator+(const long val, const Date &date) { Date d = date; d.julian += val; d.update(); return d; } Date operator-(const Date &date, const long val) { Date d = date; d.julian -= val; d.update(); return d; } Date operator-(const long val, const Date &date) { Date d = date; d.julian -= val; d.update(); return d; } Time::Time() { time_t now = SysTime::getTime(); struct tm dt; SysTime::getLocalTime(&now, &dt); toSeconds(dt.tm_hour, dt.tm_min, dt.tm_sec); } Time::Time(struct tm *dt) { toSeconds(dt->tm_hour, dt->tm_min, dt->tm_sec); } Time::Time(time_t tm) { struct tm dt; SysTime::getLocalTime(&tm, &dt); toSeconds(dt.tm_hour, dt.tm_min, dt.tm_sec); } Time::Time(char *str, size_t size) { setTime(str, size); } Time::Time(int hour, int minute, int second) { toSeconds(hour, minute, second); } Time::~Time() { } bool Time::isValid(void) const { if(seconds == -1) return false; return true; } char *Time::getTime(char *buf) const { fromSeconds(buf); return buf; } time_t Time::getTime(void) const { return static_cast(seconds); } int Time::getHour(void) const { char buf[7]; fromSeconds(buf); ZNumber num(buf, 2); return num(); } int Time::getMinute(void) const { char buf[7]; fromSeconds(buf); ZNumber num(buf + 2, 2); return num(); } int Time::getSecond(void) const { char buf[7]; fromSeconds(buf); ZNumber num(buf + 4, 2); return num(); } void Time::update(void) { } void Time::setTime(char *str, size_t size) { int sec = 00; if(!size) size = strlen(str); //00:00 if (size == 5) { sec = 00; } //00:00:00 else if (size == 8) { ZNumber nsecond(str + 6, 2); sec = nsecond(); } #ifdef CCXX_EXCEPTIONS else if(Thread::getException() == Thread::throwObject) { throw this; } #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) { throw Exception("Time::setTime(): Invalid time."); } #endif #endif else { return; } ZNumber nhour(str, 2); ZNumber nminute(str+3, 2); toSeconds(nhour(), nminute(), sec); } String Time::operator()() const { char buf[7]; fromSeconds(buf); String strTime(buf); return strTime; } long Time::getValue(void) const { return seconds; } Time& Time::operator++() { ++seconds; update(); return *this; } Time& Time::operator--() { --seconds; update(); return *this; } Time& Time::operator+=(const int val) { seconds += val; update(); return *this; } Time& Time::operator-=(const int val) { seconds -= val; update(); return *this; } int Time::operator==(const Time &t) { return seconds == t.seconds; } int Time::operator!=(const Time &t) { return seconds != t.seconds; } int Time::operator<(const Time &t) { return seconds < t.seconds; } int Time::operator<=(const Time &t) { return seconds <= t.seconds; } int Time::operator>(const Time &t) { return seconds > t.seconds; } int Time::operator>=(const Time &t) { return seconds >= t.seconds; } void Time::toSeconds(int hour, int minute, int second) { seconds = -1; if (hour > 23 ||minute > 59 ||second > 59) { #ifdef CCXX_EXCEPTIONS if(Thread::getException() == Thread::throwObject) { throw this; } #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) { throw Exception("Time::toSeconds(): Invalid time."); } #endif #endif return; } seconds = 3600 * hour + 60 * minute + second; } void Time::fromSeconds(char *buffer) const { ZNumber hour(buffer, 2); ZNumber minute(buffer + 2, 2); ZNumber second(buffer + 4, 2); hour = seconds / 3600; minute = (seconds - (3600 * hour())) / 60; second = seconds - (3600 * hour()) - (60 * minute()); buffer[6] = '\0'; } Time operator+(const Time &time1, const Time &time2) { Time t; t.seconds = time1.seconds + time2.seconds; t.update(); return t; } Time operator-(const Time &time1, const Time &time2) { Time t; t.seconds = time1.seconds - time2.seconds; t.update(); return t; } Time operator+(const Time &time, const int val) { Time t = time; t.seconds += val; t.update(); return t; } Time operator+(const int val, const Time &time) { Time t = time; t.seconds += val; t.update(); return t; } Time operator-(const Time &time, const int val) { Time t = time; t.seconds -= val; t.update(); return t; } Time operator-(const int val, const Time &time) { Time t = time; t.seconds -= val; t.update(); return t; } Datetime::Datetime(time_t tm) { struct tm dt; SysTime::getLocalTime(&tm, &dt); toJulian(dt.tm_year + 1900, dt.tm_mon + 1, dt.tm_mday); toSeconds(dt.tm_hour, dt.tm_min, dt.tm_sec); } Datetime::Datetime(tm *dt) : Date(dt), Time(dt) {} Datetime::Datetime(const char *a_str, size_t size) { char *timestr; if (!size) size = strlen(a_str); char *str = new char[size+1]; strncpy(str, a_str, size); str[size]=0; // 00/00 00:00 if (size == 11) { timestr = str + 6; setDate(str, 5); setTime(timestr, 5); } // 00/00/00 00:00 else if (size == 14) { timestr = str + 9; setDate(str, 8); setTime(timestr,5); } // 00/00/00 00:00:00 else if (size == 17) { timestr = str + 9; setDate(str, 8); setTime(timestr,8); } // 0000/00/00 00:00:00 else if (size == 19) { timestr = str + 11; setDate(str, 10); setTime(timestr,8); } #ifdef CCXX_EXCEPTIONS else if(Thread::getException() == Thread::throwObject) { delete str; throw this; } #ifdef COMMON_STD_EXCEPTION else if(Thread::getException() == Thread::throwException) { delete str; throw Exception("Datetime::Datetime(): Invalid time."); } #endif #endif delete str; } Datetime::Datetime(int year, unsigned month, unsigned day, int hour, int minute, int second) : Date(year, month, day), Time(hour, minute, second) {} Datetime::Datetime() : Date(), Time() { time_t now = SysTime::getTime(); struct tm dt; SysTime::getLocalTime(&now, &dt); toSeconds(dt.tm_hour, dt.tm_min, dt.tm_sec); toJulian(dt.tm_year + 1900, dt.tm_mon + 1, dt.tm_mday); } Datetime::~Datetime() { } bool Datetime::isValid(void) const { return Date::isValid() && Time::isValid(); } char *Datetime::getDatetime(char *buf) const { fromJulian(buf); buf[10] = ' '; fromSeconds(buf+11); return buf; } time_t Datetime::getDatetime(void) const { char buf[11]; struct tm dt; memset(&dt, 0, sizeof(dt)); fromJulian(buf); ZNumber nyear(buf, 4); ZNumber nmonth(buf + 5, 2); ZNumber nday(buf + 8, 2); dt.tm_year = nyear() - 1900; dt.tm_mon = nmonth() - 1; dt.tm_mday = nday(); fromSeconds(buf); ZNumber nhour(buf, 2); ZNumber nminute(buf + 2, 2); ZNumber nsecond(buf + 4, 2); dt.tm_hour = nhour(); dt.tm_min = nminute(); dt.tm_sec = nsecond(); dt.tm_isdst = -1; return mktime(&dt); } Datetime& Datetime::operator=(const Datetime datetime) { julian = datetime.julian; seconds = datetime.seconds; return *this; } Datetime& Datetime::operator+=(const Datetime &datetime) { seconds += datetime.seconds; julian += datetime.julian; Date::update(); Time::update(); return *this; } Datetime& Datetime::operator-=(const Datetime &datetime) { seconds -= datetime.seconds; julian -= datetime.julian; Date::update(); Time::update(); return *this; } Datetime& Datetime::operator+=(const Time &time) { seconds += time.getValue(); Date::update(); Time::update(); return *this; } Datetime& Datetime::operator-=(const Time &time) { seconds -= time.getValue(); Date::update(); Time::update(); return *this; } int Datetime::operator==(const Datetime &d) { return (julian == d.julian) && (seconds == d.seconds); } int Datetime::operator!=(const Datetime &d) { return (julian != d.julian) || (seconds != d.seconds); } int Datetime::operator<(const Datetime &d) { if (julian != d.julian) { return (julian < d.julian); } else { return (seconds < d.seconds); } } int Datetime::operator<=(const Datetime &d) { if (julian != d.julian) { return (julian < d.julian); } else { return (seconds <= d.seconds); } } int Datetime::operator>(const Datetime &d) { if (julian != d.julian) { return (julian > d.julian); } else { return (seconds > d.seconds); } } int Datetime::operator>=(const Datetime &d) { if (julian != d.julian) { return (julian > d.julian); } else { return (seconds >= d.seconds); } } bool Datetime::operator!() const { return !(Date::isValid() && Time::isValid()); } String Datetime::strftime(const char *format) const { char buffer[64]; size_t last; time_t t; tm tbp; String retval; t = getDatetime(); SysTime::getLocalTime(&t, &tbp); #ifdef WIN32 last = ::strftime(buffer, 64, format, &tbp); #else last = std::strftime(buffer, 64, format, &tbp); #endif buffer[last] = '\0'; retval = buffer; return retval; } DateNumber::DateNumber(char *str) : Number(str, 10), Date(str, 10) {} DateNumber::~DateNumber() {} #ifdef CCXX_NAMESPACES } #endif commoncpp2-1.8.1/src/libccext2.pc.in0000644000175000017500000000036311463314535014125 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libccext2 Description: GNU Common C++ Extension library Version: @VERSION@ Requires: libccgnu2 = @VERSION@ Libs: -lccext2 @GETOPT_LIBS@ @ZSTREAM_LIBS@ commoncpp2-1.8.1/src/slog.cpp0000644000175000017500000002672011463403434012767 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #include #include #include #ifdef __BORLANDC__ #include #include #else #include #include #endif #include "../src/private.h" #ifdef HAVE_SYSLOG_H #include #endif using std::streambuf; using std::ofstream; using std::ostream; using std::clog; using std::endl; using std::ios; #ifdef CCXX_NAMESPACES namespace ost { #endif Slog slog; Slog::Slog(void) : streambuf() #ifdef HAVE_OLD_IOSTREAM ,ostream() #else ,ostream((streambuf *)this) #endif { #ifdef HAVE_OLD_IOSTREAM init((streambuf *)this); #endif _enable = true; _level = levelDebug; _clogEnable = true; #ifndef HAVE_SYSLOG_H syslog = NULL; #endif } Slog::~Slog(void) { #ifdef HAVE_SYSLOG_H closelog(); #else if(syslog) fclose(syslog); #endif } ThreadImpl *Slog::getPriv(void) { Thread *thread = Thread::get(); if(!thread) return NULL; return thread->priv; } void Slog::close(void) { #ifdef HAVE_SYSLOG_H closelog(); #else lock.enterMutex(); if(syslog) fclose(syslog); syslog = NULL; lock.leaveMutex(); #endif } void Slog::open(const char *ident, Class grp) { const char *cp; #ifdef HAVE_SYSLOG_H cp = strrchr(ident, '/'); if(cp) ident = ++cp; int fac; switch(grp) { case classUser: fac = LOG_USER; break; case classDaemon: fac = LOG_DAEMON; break; case classAudit: #ifdef LOG_AUTHPRIV fac = LOG_AUTHPRIV; break; #endif case classSecurity: fac = LOG_AUTH; break; case classLocal0: fac = LOG_LOCAL0; break; case classLocal1: fac = LOG_LOCAL1; break; case classLocal2: fac = LOG_LOCAL2; break; case classLocal3: fac = LOG_LOCAL3; break; case classLocal4: fac = LOG_LOCAL4; break; case classLocal5: fac = LOG_LOCAL5; break; case classLocal6: fac = LOG_LOCAL6; break; case classLocal7: fac = LOG_LOCAL7; break; default: fac = LOG_USER; break; } openlog(ident, 0, fac); #else char *buf; lock.enterMutex(); if(syslog) fclose(syslog); buf = new char[strlen(ident) + 1]; strcpy(buf, ident); cp = (const char *)buf; buf = strrchr(buf, '.'); if(buf) { if(!stricmp(buf, ".exe")) strcpy(buf, ".log"); } syslog = fopen(cp, "a"); delete[] (char *)cp; lock.leaveMutex(); #endif } #ifdef HAVE_SNPRINTF void Slog::error(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; va_start(args, format); overflow(EOF); if(!thread) return; error(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } void Slog::warn(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; if(!thread) return; va_start(args, format); overflow(EOF); warn(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } void Slog::debug(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; if(!thread) return; va_start(args, format); overflow(EOF); debug(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } void Slog::emerg(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; if(!thread) return; va_start(args, format); overflow(EOF); emerg(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } void Slog::alert(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; if(!thread) return; va_start(args, format); overflow(EOF); alert(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } void Slog::critical(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; if(!thread) return; va_start(args, format); overflow(EOF); critical(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } void Slog::notice(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; if(!thread) return; va_start(args, format); overflow(EOF); notice(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } void Slog::info(const char *format, ...) { ThreadImpl *thread = getPriv(); va_list args; if(!thread) return; va_start(args, format); overflow(EOF); info(); vsnprintf(thread->_msgbuf, sizeof(thread->_msgbuf), format, args); thread->_msgpos = strlen(thread->_msgbuf); overflow(EOF); va_end(args); } #endif int Slog::overflow(int c) { ThreadImpl *thread = getPriv(); if(!thread) return c; if(c == '\n' || !c || c == EOF) { if(!thread->_msgpos) return c; thread->_msgbuf[thread->_msgpos] = 0; if (_enable) #ifdef HAVE_SYSLOG_H syslog(priority, "%s", thread->_msgbuf); #else { time_t now; struct tm *dt; time(&now); dt = localtime(&now); char buf[256]; const char *p = "unknown"; switch(priority) { case levelEmergency: p = "emerg"; break; case levelInfo: p = "info"; break; case levelError: p = "error"; break; case levelAlert: p = "alert"; break; case levelDebug: p = "debug"; break; case levelNotice: p = "notice"; break; case levelWarning: p = "warn"; break; case levelCritical: p = "crit"; break; } lock.enterMutex(); snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d [%s] %s\n", dt->tm_year + 1900, dt->tm_mon + 1, dt->tm_mday, dt->tm_hour, dt->tm_min, dt->tm_sec, p, thread->_msgbuf); if(syslog) fputs(buf, syslog); // syslog << "[" << priority << "] " << thread->_msgbuf << endl; lock.leaveMutex(); } #endif thread->_msgpos = 0; if ( _enable && _clogEnable #ifndef WIN32 && (getppid() > 1) #endif ) clog << thread->_msgbuf << endl; _enable = true; return c; } if (thread->_msgpos < (int)(sizeof(thread->_msgbuf) - 1)) thread->_msgbuf[thread->_msgpos++] = c; return c; } Slog &Slog::operator()(const char *ident, Class grp, Level lev) { ThreadImpl *thread = getPriv(); if(!thread) return *this; thread->_msgpos = 0; _enable = true; open(ident, grp); return this->operator()(lev, grp); } Slog &Slog::operator()(Level lev, Class grp) { ThreadImpl *thread = getPriv(); if(!thread) return *this; thread->_msgpos = 0; if(_level >= lev) _enable = true; else _enable = false; #ifdef HAVE_SYSLOG_H switch(lev) { case levelEmergency: priority = LOG_EMERG; break; case levelAlert: priority = LOG_ALERT; break; case levelCritical: priority = LOG_CRIT; break; case levelError: priority = LOG_ERR; break; case levelWarning: priority = LOG_WARNING; break; case levelNotice: priority = LOG_NOTICE; break; case levelInfo: priority = LOG_INFO; break; case levelDebug: priority = LOG_DEBUG; break; } switch(grp) { case classAudit: #ifdef LOG_AUTHPRIV priority |= LOG_AUTHPRIV; break; #endif case classSecurity: priority |= LOG_AUTH; break; case classUser: priority |= LOG_USER; break; case classDaemon: priority |= LOG_DAEMON; break; case classDefault: priority |= LOG_USER; break; case classLocal0: priority |= LOG_LOCAL0; break; case classLocal1: priority |= LOG_LOCAL1; break; case classLocal2: priority |= LOG_LOCAL2; break; case classLocal3: priority |= LOG_LOCAL3; break; case classLocal4: priority |= LOG_LOCAL4; break; case classLocal5: priority |= LOG_LOCAL5; break; case classLocal6: priority |= LOG_LOCAL6; break; case classLocal7: priority |= LOG_LOCAL7; break; } #else priority = lev; #endif return *this; } Slog &Slog::operator()(void) { return *this; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 6 * End: */ commoncpp2-1.8.1/src/simplesocket.cpp0000644000175000017500000001561011463405471014524 00000000000000// Copyright (C) 2002-2010 Wizzer Works. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file simplesocket.cpp * @brief Implementation of SimpleTCPStream methods. * * Implementation of SimpleTCPStream methods. * * @author Mark S. Millard (msm@wizzer.com) * @date 2002-08-15 */ // Include Common C++ Library header files. #include #include #include #ifndef INADDR_LOOPBACK #define INADDR_LOOPBACK (unsigned long)0x7f000001 #endif #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif SimpleTCPStream::SimpleTCPStream(TCPSocket &server, size_t size) : Socket(accept(server.getSocket(), NULL, NULL)) { tpport_t port; IPV4Host host = getPeer(&port); if (! server.onAccept(host, port)) { endSocket(); error(errConnectRejected); return; } Socket::state = CONNECTED; } SimpleTCPStream::SimpleTCPStream(const IPV4Host &host, tpport_t port, size_t size) : Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) { Connect(host, port, size); } SimpleTCPStream::~SimpleTCPStream() { endStream(); } IPV4Host SimpleTCPStream::getSender(tpport_t *port) const { return IPV4Host(); } void SimpleTCPStream::Connect(const IPV4Host &host, tpport_t port, size_t size) { size_t i; for (i = 0 ; i < host.getAddressCount(); i++) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr = host.getAddress(i); addr.sin_port = htons(port); // Win32 will crash if you try to connect to INADDR_ANY. if ( INADDR_ANY == addr.sin_addr.s_addr ) addr.sin_addr.s_addr = INADDR_LOOPBACK; if (::connect(so, (struct sockaddr *)&addr, (socklen_t)sizeof(addr)) == 0) break; } if (i == host.getAddressCount()) { connectError(); endSocket(); return; } Socket::state = CONNECTED; } SimpleTCPStream::SimpleTCPStream() : Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) {} SimpleTCPStream::SimpleTCPStream(const SimpleTCPStream &source) : #ifdef WIN32 Socket(source.so) #else Socket(dup(source.so)) #endif {} void SimpleTCPStream::endStream(void) { endSocket(); } ssize_t SimpleTCPStream::read(char *bytes, size_t length, timeout_t timeout) { // Declare local variables. ssize_t rlen = 0; size_t totalrecv = 0; char *currentpos = bytes; // Check for reasonable requested length. if (length < 1) { return (ssize_t)totalrecv; } while (totalrecv < length) { // Check for timeout condition. if (timeout) { if (! isPending(pendingInput, timeout)) { error(errTimeout); return -1; } } // Attempt to read data. rlen = _IORET64 ::recv(so, (char *) currentpos, _IOLEN64 (length-totalrecv), 0); if (rlen == 0 || rlen == -1) { break; } // cout << "received " << rlen << " bytes, remaining " << length - totalrecv << flush; totalrecv += rlen; currentpos += rlen; } // Set error condition if necessary. if (rlen == -1) { error(errInput); } // Return total number of bytes recieved. return (ssize_t)totalrecv; } ssize_t SimpleTCPStream::write(const char *bytes, size_t length, timeout_t timeout) { // Declare local variables. ssize_t rlen = 0; // Check for reasonable requested length. if (length < 1) { return rlen; } // Check for timeout condition. if (timeout) { if (! isPending(pendingOutput, timeout)) { error(errTimeout); return -1; } } // Attempt to write data. rlen = _IORET64 ::send(so, (const char *)bytes, _IOLEN64 length, MSG_NOSIGNAL); if (rlen == -1) { error(errOutput); } return rlen; } ssize_t SimpleTCPStream::peek(char *bytes, size_t length, timeout_t timeout) { // Declare local variables. ssize_t rlen = 0; size_t totalrecv = 0; char *currentpos = bytes; // Check for reasonable requested length. if (length < 1) { return (ssize_t)totalrecv; } while (totalrecv < length) { // Check for timeout condition. if (timeout) { if (! isPending(pendingInput, timeout)) { error(errTimeout); return -1; } } // Attempt to read data. rlen = _IORET64 ::recv(so, (char *) currentpos, _IOLEN64 (length-totalrecv), MSG_PEEK); if (rlen == 0 || rlen == -1) { break; } // cout << "received " << rlen << " bytes, remaining " << length - totalrecv << flush; totalrecv += rlen; currentpos += rlen; } // Set error condition if necessary. if (rlen == -1) { error(errInput); } // Return total number of bytes recieved. return (ssize_t)totalrecv; } bool SimpleTCPStream::isPending(Pending pending, timeout_t timeout) { return Socket::isPending(pending, timeout); } #ifdef CCXX_NAMESPACES } /* for ost */ #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/src/mime.cpp0000644000175000017500000001003311463400617012740 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // #include #ifdef CCXX_WITHOUT_EXTRAS #include #endif #include #include #include #include #ifndef CCXX_WITHOUT_EXTRAS #include #endif #include #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif MIMEMultipart::MIMEMultipart(const char *mt) { const char *cp = strchr(mt, '/'); if(cp) mt = ++cp; first = last = NULL; header[1] = NULL; header[0] = mtype; setString(boundry, sizeof(boundry), "xyzzy"); snprintf(mtype, sizeof(mtype), "Content-Type: multipart/%s, boundry=%s", mt, boundry); } MIMEMultipart::~MIMEMultipart() {} void MIMEMultipart::head(std::ostream *out) { char **list = header; while(**list) *out << *(list++) << "\r\n"; out->flush(); } void MIMEMultipart::body(std::ostream *out) { MIMEItemPart *item = first; while(item) { *out << "--" << boundry << "\r\n"; item->head(out); *out << "\r\n"; item->body(out); item = item->next; } *out << "--" << boundry << "--\r\n"; out->flush(); } MIMEItemPart::MIMEItemPart(MIMEMultipart *m, const char *ct) { if(m->last) { m->last->next = this; m->last = this; } else m->first = m->last = this; next = NULL; ctype = ct; } MIMEItemPart::~MIMEItemPart() {} MIMEMultipartForm::MIMEMultipartForm() : MIMEMultipart("form-data") {} MIMEMultipartForm::~MIMEMultipartForm() {} void MIMEItemPart::head(std::ostream *out) { *out << "Content-Type: " << ctype << "\r" << endl; } MIMEFormData::MIMEFormData(MIMEMultipartForm *m, const char *n, const char *v) : MIMEItemPart(m, "") { name = n; content = v; } MIMEFormData::~MIMEFormData() {} void MIMEFormData::head(std::ostream *out) { *out << "Content-Disposition: form-data; name=\"" << name << "\"\r\n"; } void MIMEFormData::body(std::ostream *out) { *out << content << "\r\n"; } #ifdef CCXX_NAMESPACES } #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/commoncpp2.lsm.in0000644000175000017500000000146711463314527013734 00000000000000Begin4 Title: commoncpp2 Version: VERSION Entered-date: DATE Description: Formed by the Merger of the APE portable environment and the former Common C++ project is part of the GNU project. Common C++ offers a portable highly portable C++ application development framework. Common C++ provides classes for threads, sockets, daemon management, system logging, object synchronization, realtime network development, persistant object management, and file access. Keywords: pthread c++ classes threads sockets GNU Author: dyfet@gnu.org (David Sugar) Maintained-by: dyfet@gnu.org (David Sugar) Platforms: GNU/Linux, other Unices, W32 Home-page: http://www.gnu.org/software/commonc++ Primary-Site ftp.gnu.org /gnu/commoncpp SIZEk commoncpp2-VERSION.tar.gz Copying-policy: GPL End commoncpp2-1.8.1/COPYING0000644000175000017500000004307611463314527011572 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. commoncpp2-1.8.1/commoncpp2.list.in0000644000175000017500000000362611463314527014113 00000000000000# Directories... $prefix=@prefix@ $exec_prefix=@exec_prefix@ $bindir=@bindir@ $confdir=@sysconfdir@ $docdir=@prefix@/doc $mandir=@mandir@ $datadir=@datadir@ $libdir=@libdir@ $srcdir=@top_srcdir@ $includedir=@includedir@ $infodir=@infodir@ # Product information %product GNU Common C++ %version @VERSION@ -100 %copyright 1999-2003 Open Source Telecom Corporation %vendor Open Source Telecom Corp %license COPYING %readme README %description GNU Common C++ class libraries %requires libxml2 0.0 0 999.99.99p99 2147483647 f 0755 root root ${bindir}/ccgnu2-config src/ccgnu2-config f 0644 root root ${datadir}/aclocal/ost_check2.m4 src/ost_check2.m4 f 0644 root root ${libdir}/pkgconfig/libccgnu2.pc src/libccgnu2.pc f 0644 root root ${libdir}/pkgconfig/libccext2.pc src/libccext2.pc d 0755 root root ${includedir}/cc++2 - d 0755 root root ${includedir}/cc++2/cc++ - f 0644 root root ${includedir}/cc++2/cc++ include/cc++/*.h f 0644 root root ${includedir}/cc++2/cc++ template/*.h f 0644 root root ${libdir} ./src/*.la f 0644 root root ${libdir} ./src/.libs/*.a %system darwin f 0644 root root ${libdir} ./src/.libs/libccgnu2-@VERSION@.dylib f 0644 root root ${libdir} ./src/.libs/libccext2-@VERSION@.dylib l 0644 root root ${libdir}/libccgnu2.dylib libccgnu2-@VERSION@.dylib l 0644 root root ${libdir}/libccext2.dylib libccext2-@VERSION@.dylib l 0644 root root ${libdir}/libccgnu2.dylib-@VERSION@.@LT_SUBVER@.dylib libccgnu2-@VERSION@.dylib l 0644 root root ${libdir}/libccext2.dylib-@VERSION@.@LT_SUBVER@.dylib libccext2-@VERSION@.dylib %system freebsd f 0644 root root ${libdir} ./src/.libs/libccgnu2-@LT_RELEASE@.so.* f 0644 root root ${libdir} ./src/.libs/libccext2-@LT_RELEASE@.so.* %system linux solaris f 0644 root root ${libdir} ./src/.libs/libccgnu2-@LT_RELEASE@.so.*.*.* f 0644 root root ${libdir} ./src/.libs/libccext2-@LT_RELEASE@.so.*.*.* %system linux freebsd %postinstall /sbin/ldconfig %postremove /sbin/ldconfig %system all commoncpp2-1.8.1/configure0000755000175000017500000265353511463364514012460 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= ac_unique_file="src/thread.cpp" # 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 LIB_MAJOR LIB_VERSION GETOPT_LONG_FALSE GETOPT_LONG_TRUE DOXY_FALSE DOXY_TRUE DOXYGEN etc_confdir STAGE2 BASE_LIB MODULE_FLAGS SHARED_FLAGS COMMON_FLAGS ost_cv_dynloader EXTRAS_FALSE EXTRAS_TRUE WIN32_FALSE WIN32_TRUE incprefix CCXX_DIR KDOC_DIR WARN_FLAGS WITH_CPPUNIT_TESTS_FALSE WITH_CPPUNIT_TESTS_TRUE CPPUNIT_LIBS SSL_LIBS ZSTREAM_LIBS SOCKET_LIBS PTHREAD_CC THREAD_LIBS THREAD_FLAGS thrprefix DYN_LOADER LIBGETOPTOBJS GETOPT_LIBS WINVERSION FTPDIR MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE LT_CCXX_VERSION LT_MINOR LT_MAJOR LT_SUBVER LT_RELEASE am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL lt_ECHO RANLIB STRIP AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP SED LIBTOOL OBJDUMP DLLTOOL AS MSWIN32_FALSE MSWIN32_TRUE EGREP GREP CXXCPP ac_ct_CXX CXXFLAGS CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build ccincludedir CXX CC 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 with_lsb with_wininc with_winlib enable_shared enable_static with_pic enable_fast_install with_gnu_ld enable_libtool_lock enable_dependency_tracking enable_maintainer_mode with_pthread with_linuxthreads with_ipv6 with_nat with_monotonic with_extras with_gnutls with_openssl with_compression with_memaudit with_cppunit with_exceptions with_stlport enable_debug enable_profiling ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' 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] --target=TARGET configure for building compilers for TARGET [HOST] _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] --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) --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-debug compile for debugging --enable-profiling compile for profiling Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-lsb=name Build lsb compliant package --with-wininc=DIR define windows include directory --with-winlib=DIR define windows lib directory --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] --with-pthread=lib using specified pthread library --with-linuxthreads use linux kernel mode library --without-ipv6 Disable ipv6 --without-nat Disable NAT class interface (pf, ipf or netfilter), default is enabled. --without-monotonic Disable monotonic clock --without-extras Disables extras lib --with-gnutls Enable gnutls support --with-openssl Enable openssl support --without-compression Disable libz compression --with-memaudit Enable memory auditing --with-cppunit Build cppunit based test suite --without-exceptions Disable exception handling --with-stlport=dir using SGI portable C++ stream library ie: /usr/local, not all include directory Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to 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_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_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_cxx_try_run # ac_fn_cxx_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_cxx_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_cxx_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_cxx_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_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_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_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_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_cxx_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_cxx_check_func 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 VERSION="1.8.1" LT_RELEASE="1.8" LT_VERSION="0:1" 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 # lsb build option ccincludedir="" ost_cv_thread_library="none" COMMON_FLAGS="-D_GNU_SOURCE" # Check whether --with-lsb was given. if test "${with_lsb+set}" = set; then : withval=$with_lsb; if test ! -d "$prefix" ; then prefix="/opt/$withval" ; fi if test ! -d "$sysconfdir" ; then sysconfdir="/etc$prefix" ; fi if test ! -d "$localstatedir" ; then localstatedir="/var$prefix" ; fi CC=/opt/lsbdev-cc/bin/lsbcc CXX=/opt/lsbdev-cc/bin/lsbc++ fi case "$prefix" in /opt/*) if test "$datadir" == '${prefix}/share' ; then if test "$mandir" == '${datadir}/man' ; then mandir='${prefix}/man' ; fi if test "$infodir" == '${datadir}/info' ; then infodir='${prefix}/info' ; fi datadir='${prefix}' fi if test "$sysconfdir" == '${prefix}/etc' ; then sysconfdir=/etc${prefix} ; fi if test "$localstatedir" == '${prefix}/var' ; then localstatedir=/var${prefix} ; fi if test "$includedir" == '${prefix}/include' ; then ccincludedir="$includedir" ; fi ;; esac if test -z "$ccincludedir" ; then case "$includedir" in */lib/*) ccincludedir='${includedir}' ;; *) ccincludedir='${includedir}/cc++2' ;; esac fi ac_aux_dir= for ac_dir in autoconf "$srcdir"/autoconf; 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 autoconf \"$srcdir\"/autoconf" "$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. # 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if test "${ac_cv_target+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #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=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 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=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 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=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 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=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 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;} as_fn_error "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu 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=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 for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_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_cxx_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_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_cxx_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = x""yes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h 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=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 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=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 for library containing strerror" >&5 $as_echo_n "checking for library containing strerror... " >&6; } if test "${ac_cv_search_strerror+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$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 strerror (); int main () { return strerror (); ; return 0; } _ACEOF for ac_lib in '' cposix; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_search_strerror=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_strerror+set}" = set; then : break fi done if test "${ac_cv_search_strerror+set}" = set; then : else ac_cv_search_strerror=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 $as_echo "$ac_cv_search_strerror" >&6; } ac_res=$ac_cv_search_strerror if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Check whether --with-wininc was given. if test "${with_wininc+set}" = set; then : withval=$with_wininc; win32inc="$withval" else win32inc=no fi # Check whether --with-winlib was given. if test "${with_winlib+set}" = set; then : withval=$with_winlib; win32lib="$withval" else win32lib=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MSC environment" >&5 $as_echo_n "checking for MSC environment... " >&6; } if test "${np_cv_prog_msc+set}" = set; then : $as_echo_n "(cached) " >&6 else np_cv_prog_msc=no cat > conftest.c <&1` case "$RET" in conftest.c?) np_cv_prog_msc=yes ;; *) ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $np_cv_prog_msc" >&5 $as_echo "$np_cv_prog_msc" >&6; } if test "x$np_cv_prog_msc" = "xyes" ; then if test "$win32inc" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Win32 include dir" >&5 $as_echo_n "checking for Win32 include dir... " >&6; } save_IFS="$IFS" win32inc=no IFS="," ENVVAR=`echo $INCLUDE | tr ';' ','` for i in $ENVVAR ; do f=`cygpath -u "$i"` if test -r "$f/ras.h" ; then win32inc="$f" break fi done IFS="$save_IFS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$win32inc\"" >&5 $as_echo "\"$win32inc\"" >&6; } fi if test "$win32inc" = "no" ; then as_fn_error "Unable to get Win32 include dir from environment." "$LINENO" 5 as_fn_error "use --with-wininc=DIR to set it manually" "$LINENO" 5 fi if test "$win32lib" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Win32 lib dir" >&5 $as_echo_n "checking for Win32 lib dir... " >&6; } save_IFS="$IFS" win32lib=no IFS="," ENVVAR=`echo $LIB | tr ';' ','` for i in $ENVVAR ; do f=`cygpath -u "$i"` if test -r "$f/wsock32.lib" ; then win32lib="$f" break fi done IFS="$save_IFS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$win32lib\"" >&5 $as_echo "\"$win32lib\"" >&6; } fi if test "$win32lib" = "no" ; then as_fn_error "Unable to get Win32 lib dir from environment." "$LINENO" 5 as_fn_error "use --with-winlib=DIR to set it manually" "$LINENO" 5 fi CC="cl -nologo -GX -D__WIN32__ -D_MT -D_WIN32_WINNT=0x0400 -I$win32inc" CXX="cl -nologo -GX -D__WIN32__ -D_MT -D_WIN32_WINNT=0x0400 -I$win32inc" LD="link /libpath:$win32lib" AS=masm fi if test $np_cv_prog_msc = yes; then MSWIN32_TRUE= MSWIN32_FALSE='#' else MSWIN32_TRUE='#' MSWIN32_FALSE= fi enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; 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_AS+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # 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_AS="${ac_tool_prefix}as" $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 AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; 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_AS+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # 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_AS="as" $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_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="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 AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; 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_DLLTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_DLLTOOL="${ac_tool_prefix}dlltool" $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 DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; 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_DLLTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_DLLTOOL="dlltool" $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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="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 DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi 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 ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.2.6b' macro_revision='1.3017' ltmain="$ac_aux_dir/ltmain.sh" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if test "${ac_cv_path_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if test "${ac_cv_path_FGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &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:6898: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:6901: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:6904: 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 8107 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if test "${lt_cv_apple_cc_single_mod+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done 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=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 -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=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 else _lt_caught_CXX_error=yes fi # Set options enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if test "${lt_cv_objdir+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:9766: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:9770: \$? = $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:10105: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:10109: \$? = $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:10210: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:10214: \$? = $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:10265: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:10269: \$? = $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 12649 "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 12745 "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=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 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:14701: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:14705: \$? = $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:14800: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14804: \$? = $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:14852: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14856: \$? = $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=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 ac_config_commands="$ac_config_commands libtool" # Only expand once: am__api_version='1.11' # 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 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 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=commoncpp2 VERSION=$VERSION 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 -' 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 depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if test "${ac_cv_c_restrict+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_restrict=no # The order here caters to the fact that C++ does not require restrict. for ac_kw in __restrict __restrict__ _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int * int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int main () { int s[1]; int * $ac_kw t = s; t[0] = 0; return foo(t) ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 $as_echo "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) $as_echo "#define restrict /**/" >>confdefs.h ;; *) cat >>confdefs.h <<_ACEOF #define restrict $ac_cv_c_restrict _ACEOF ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5 $as_echo_n "checking for working volatile... " >&6; } if test "${ac_cv_c_volatile+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { volatile int x; int * volatile y = (int *) 0; return !x && !y; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_volatile=yes else ac_cv_c_volatile=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5 $as_echo "$ac_cv_c_volatile" >&6; } if test $ac_cv_c_volatile = no; then $as_echo "#define volatile /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac if test "$prefix" != "/usr" ; then if test -d "$prefix" ; then bprefix="$prefix" else if test "$GCC" = "no" ; then bprefix=/usr/local ; fi fi if test -d $bprefix/include ; then COMMON_FLAGS="$COMMON_FLAGS -I$bprefix/include" fi if test -d $bprefix/lib ; then LIBS="$LIBS -L$bprefix/lib" fi fi LT_MAJOR="`echo $LT_VERSION | sed s/:.*$//`" LT_MINOR="`echo $LT_VERSION | sed s/.*://`" LT_SUBVER="$LT_MAJOR.$LT_MINOR" 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 if test ! -z "$LT_VERSION" ; then LT_CCXX_VERSION="-version-info $LT_VERSION" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for genorated automake files" >&5 $as_echo_n "checking for genorated automake files... " >&6; } if test -z "" ; then ost_AUTOMAKE_TEST=Makefile.in else ost_AUTOMAKE_TEST= fi if test ! -f $ost_AUTOMAKE_TEST ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: missing" >&5 $as_echo "missing" >&6; } automake -a else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE if test -z "$MAINT" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for maintainer ftp distribution directory" >&5 $as_echo_n "checking for maintainer ftp distribution directory... " >&6; } if test -d ~ftp/pub ; then FTPDIR=~ftp/pub { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: missing" >&5 $as_echo "missing" >&6; } fi fi WINVERSION="`echo $VERSION | sed 's/\./,/g'`,0" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Win32 gnu environment" >&5 $as_echo_n "checking for Win32 gnu environment... " >&6; } if test "${ost_cv_gnuwin32+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_CFLAGS="$CFLAGS" CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #ifdef __MINGW32__ #define __RETURN_WIN32__ __MINGW32__ #endif #ifdef __CYGWIN32__ #define __RETURN_WIN32__ __CYGWIN32__ #endif #endif int main () { return __RETURN_WIN32__; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_gnuwin32=yes else ost_cv_gnuwin32=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f conftest* CFLAGS="$ac_save_CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_gnuwin32" >&5 $as_echo "$ost_cv_gnuwin32" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system meets Posix.1" >&5 $as_echo_n "checking whether system meets Posix.1... " >&6; } if test "${ost_cv_sys_posix1+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_VERSION fatal #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_sys_posix1=yes else ost_cv_sys_posix1=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_sys_posix1" >&5 $as_echo "$ost_cv_sys_posix1" >&6; } if test $ost_cv_sys_posix1 = no ; then for ac_header in unistd.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UNISTD_H 1 _ACEOF fi done else $as_echo "#define HAVE_UNISTD_H 1" >>confdefs.h fi for ac_header in features.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "features.h" "ac_cv_header_features_h" "$ac_includes_default" if test "x$ac_cv_header_features_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FEATURES_H 1 _ACEOF fi done for ac_header in fcntl.h sys/fcntl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if test "${ac_cv_header_time+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi for ac_header in sys/time.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" if test "x$ac_cv_header_sys_time_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_TIME_H 1 _ACEOF fi done for ac_header in sys/types.h bits/wordsize.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "u_int8_t" >/dev/null 2>&1; then : $as_echo "#define HAVE_SYS_TYPES_STD 1" >>confdefs.h cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "u_int64_t" >/dev/null 2>&1; then : $as_echo "#define HAVE_SYS_TYPES_64 1" >>confdefs.h fi rm -f conftest* fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "long long" >/dev/null 2>&1; then : $as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h fi rm -f conftest* ac_fn_cxx_check_header_mongrel "$LINENO" "endian.h" "ac_cv_header_endian_h" "$ac_includes_default" if test "x$ac_cv_header_endian_h" = x""yes; then : $as_echo "#define HAVE_ENDIAN_H 1" >>confdefs.h else ac_fn_cxx_check_header_mongrel "$LINENO" "sys/isa_defs.h" "ac_cv_header_sys_isa_defs_h" "$ac_includes_default" if test "x$ac_cv_header_sys_isa_defs_h" = x""yes; then : $as_echo "#define HAVE_SYS_ISA_DEFS_H 1" >>confdefs.h else case "$target_cpu" in alpha* | i?86) $as_echo "#define __BYTE_ORDER 1234" >>confdefs.h ;; hppa* | m68* | mips* | powerpc* | sparc*) $as_echo "#define __BYTE_ORDER 4321" >>confdefs.h ;; esac fi fi for ac_func in sigaction do : ac_fn_cxx_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" if test "x$ac_cv_func_sigaction" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGACTION 1 _ACEOF fi done for ac_func in setitimer do : ac_fn_cxx_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer" if test "x$ac_cv_func_setitimer" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETITIMER 1 _ACEOF fi done for ac_func in sigwait do : ac_fn_cxx_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait" if test "x$ac_cv_func_sigwait" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGWAIT 1 _ACEOF fi done for ac_header in bsd/signal.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "bsd/signal.h" "ac_cv_header_bsd_signal_h" "$ac_includes_default" if test "x$ac_cv_header_bsd_signal_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BSD_SIGNAL_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if test "${ac_cv_type_signal+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sigwait has 2 arguments" >&5 $as_echo_n "checking whether sigwait has 2 arguments... " >&6; } if test "${ac_cv_ost_sigwait2+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _POSIX_PTHREAD_SEMANTICS #define _POSIX_PTHREAD_SEMANTICS #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include int main () { sigset_t sigs; int signo; sigwait(&sigs, &signo); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_ost_sigwait2=yes else ac_cv_ost_sigwait2=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_ost_sigwait2" >&5 $as_echo "$ac_cv_ost_sigwait2" >&6; } if test "$ac_cv_ost_sigwait2" = "yes" ; then $as_echo "#define HAVE_SIGWAIT2 1" >>confdefs.h fi for ac_func in strcasecmp do : ac_fn_cxx_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRCASECMP 1 _ACEOF fi done for ac_header in strings.h alloca.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ost_cv_libgetopt_long=false GETOPT_LIBS="" LIBGETOPTOBJS="" for ac_func in getopt do : ac_fn_cxx_check_func "$LINENO" "getopt" "ac_cv_func_getopt" if test "x$ac_cv_func_getopt" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT 1 _ACEOF $as_echo "#define HAVE_GETOPT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getopt in -lm" >&5 $as_echo_n "checking for getopt in -lm... " >&6; } if test "${ac_cv_lib_m_getopt+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getopt (); int main () { return getopt (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_m_getopt=yes else ac_cv_lib_m_getopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_getopt" >&5 $as_echo "$ac_cv_lib_m_getopt" >&6; } if test "x$ac_cv_lib_m_getopt" = x""yes; then : $as_echo "#define HAVE_GETOPT 1" >>confdefs.h GETOPT_LIBS="-lm" fi fi done for ac_header in getopt.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default" if test "x$ac_cv_header_getopt_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getopt_long in -lgnugetopt" >&5 $as_echo_n "checking for getopt_long in -lgnugetopt... " >&6; } if test "${ac_cv_lib_gnugetopt_getopt_long+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgnugetopt $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 getopt_long (); int main () { return getopt_long (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_gnugetopt_getopt_long=yes else ac_cv_lib_gnugetopt_getopt_long=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_gnugetopt_getopt_long" >&5 $as_echo "$ac_cv_lib_gnugetopt_getopt_long" >&6; } if test "x$ac_cv_lib_gnugetopt_getopt_long" = x""yes; then : $as_echo "#define HAVE_GETOPT_LONG 1" >>confdefs.h GETOPT_LIBS="-lgnugetopt $GETOPT_LIBS" LIBS="$LIBS -lgnugetopt" else for ac_func in getopt_long do : ac_fn_cxx_check_func "$LINENO" "getopt_long" "ac_cv_func_getopt_long" if test "x$ac_cv_func_getopt_long" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETOPT_LONG 1 _ACEOF $as_echo "#define HAVE_GETOPT_LONG 1" >>confdefs.h else LIBGETOPTOBJS="getopt.c getopt1.c" fi done fi DYN_LOADER='' ost_cv_dynloader=no for ac_header in dlfcn.h do : ac_fn_cxx_check_header_mongrel "$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 { $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_cxx_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 : DYN_LOADER=-ldld, $as_echo "#define HAVE_SHL_LOAD 1" >>confdefs.h fi { $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_cxx_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 : DYN_LOADER=-ldl fi if test ! -z "$DYN_LOADER" ; then ost_cv_dynloader=yes $as_echo "#define HAVE_MODULES 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lc" >&5 $as_echo_n "checking for dlopen in -lc... " >&6; } if test "${ac_cv_lib_c_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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_cxx_try_link "$LINENO"; then : ac_cv_lib_c_dlopen=yes else ac_cv_lib_c_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_c_dlopen" >&5 $as_echo "$ac_cv_lib_c_dlopen" >&6; } if test "x$ac_cv_lib_c_dlopen" = x""yes; then : ost_cv_dynloader=yes $as_echo "#define HAVE_MODULES 1" >>confdefs.h else for ac_header in mach-o/dyld.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "mach-o/dyld.h" "ac_cv_header_mach_o_dyld_h" "$ac_includes_default" if test "x$ac_cv_header_mach_o_dyld_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MACH_O_DYLD_H 1 _ACEOF ost_cv_dynloader=yes $as_echo "#define HAVE_MODULES 1" >>confdefs.h $as_echo "#define HAVE_MACH_DYLD 1" >>confdefs.h fi done fi fi THREAD_FLAGS="" THREAD_LIBS="" ost_cv_thread_library="none" ost_cv_rt_library="none" ost_cv_cxx_mode=false # Check whether --with-pthread was given. if test "${with_pthread+set}" = set; then : withval=$with_pthread; if test "$withval" != "" ; then ost_cv_thread_library=$withval ; fi fi # Check whether --with-linuxthreads was given. if test "${with_linuxthreads+set}" = set; then : withval=$with_linuxthreads; ost_cv_thread_library=lthread $as_echo "#define WITH_LINUXTHREADS 1" >>confdefs.h if test "$withval" != "yes" ; then THREAD_FLAGS="-D__USE_GNU -D__USE_UNIX98 -I$withval $THREAD_FLAGS" CFLAGS="-D__USE_GNU -D__USE_UNIX98 -I$withval $CFLAGS" else THREAD_FLAGS="-D__USE_GNU -D__USE_UNIX98 -I/usr/local/include/pthread/linuxthreads $THREAD_FLAGS" CFLAGS="-D__USE_GNU -D__USE_UNIX98 -I/usr/local/include/pthread/linuxthreads $CFLAGS" fi fi for ac_header in pthread.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_H 1 _ACEOF $as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h ost_cv_posix_threads=yes else ost_cv_posix_threads=no fi done if test $ost_cv_posix_threads = no ; then ac_save_CXXFLAGS="$CXXFLAGS" 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 CXXFLAGS="$CXXFLAGS -pthread" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : $as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h ost_cv_cxx_mode=true ost_cv_posix_threads=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" 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 fi ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 ost_cv_posix_atomic=no for ac_header in sys/atomic_op.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/atomic_op.h" "ac_cv_header_sys_atomic_op_h" "$ac_includes_default" if test "x$ac_cv_header_sys_atomic_op_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_ATOMIC_OP_H 1 _ACEOF $as_echo "#define HAVE_ATOMIC_AIX 1" >>confdefs.h fi done for ac_header in sys/atomic.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/atomic.h" "ac_cv_header_sys_atomic_h" "$ac_includes_default" if test "x$ac_cv_header_sys_atomic_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_ATOMIC_H 1 _ACEOF ost_cv_posix_sys_atomic=yes else ost_cv_posix_sys_atomic=no fi done if test $ost_cv_posix_sys_atomic = yes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic_t" >&5 $as_echo_n "checking for atomic_t... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { atomic_t at; at.counter = 1; atomic_dec_and_test(&at); atomic_sub(4, &at); atomic_inc(&at); atomic_add(3, &at); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_posix_atomic=yes $as_echo "#define HAVE_WORKING_SYS_ATOMIC_H 1" >>confdefs.h else ost_cv_posix_atomic=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_posix_atomic" >&5 $as_echo "$ost_cv_posix_atomic" >&6; } fi if test 0 = 1 ; then for ac_header in bits/atomicity.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "bits/atomicity.h" "ac_cv_header_bits_atomicity_h" "$ac_includes_default" if test "x$ac_cv_header_bits_atomicity_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BITS_ATOMICITY_H 1 _ACEOF ost_cv_bits_atomicity=yes else ost_cv_bits_atomicity=no fi done if test $ost_cv_bits_atomicity = yes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _Atomic_word" >&5 $as_echo_n "checking for _Atomic_word... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { _Atomic_word i = 0; __atomic_add(&i, 1); __exchange_and_add(&i, 1); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_gcc_atomic=yes $as_echo "#define HAVE_GCC_BITS_ATOMIC 1" >>confdefs.h else ost_cv_gcc_atomic=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_gcc_atomic" >&5 $as_echo "$ost_cv_gcc_atomic" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gnu_cxx::_Atomic_word" >&5 $as_echo_n "checking for __gnu_cxx::_Atomic_word... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { using namespace __gnu_cxx; _Atomic_word i = 0; __atomic_add(&i, 1); __exchange_and_add(&i, 1); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_gcc_cxx_atomic=yes $as_echo "#define HAVE_GCC_CXX_BITS_ATOMIC 1" >>confdefs.h else ost_cv_gcc_cxx_atomic=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_gcc_cxx_atomic" >&5 $as_echo "$ost_cv_gcc_cxx_atomic" >&6; } fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$ac_save_CXXFLAGS" if test "$target" = NONE ; then targetdir="" else targetdir="$target" fi for ac_header in thread.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "thread.h" "ac_cv_header_thread_h" "$ac_includes_default" if test "x$ac_cv_header_thread_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_THREAD_H 1 _ACEOF fi done if test "$prefix" = NONE ; then thrprefix="/usr/$targetdir/include" if test -d /usr/$targetdir/sys-include ; then thrprefix="$prefix/$targetdir/sys-include" ; fi else thrprefix="$prefix/$targetdir/include" if test -d "$prefix/$targetdir/sys-include" ; then thrprefix="$prefix/$targetdir/sys-include" ; fi fi if test ! -f $thrprefix/thread.h ; then thrprefix=/usr/include fi if test $ost_cv_posix_threads = yes ; then if test "$ost_cv_thread_library" = "none" ; then ost_cv_thread_flags="" for flags in -kthread -pthread -mthreads -pthreads -Kthread --threadsafe -mt ; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC-cc} accepts $flags" >&5 $as_echo_n "checking whether ${CC-cc} accepts $flags... " >&6; } echo 'void f(){}' >conftest.c if test -z "`${CC-cc} $flags -c conftest.c 2>&1`"; then ost_cv_thread_flags=$flags { $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 rm -f conftest* if test ! -z "$ost_cv_thread_flags" ; then break ; fi done # if test "$ost_cv_prog_cc_pthread" = "no" ; then # AC_CACHE_CHECK(whether ${CC-cc} accepts -mthreads, # ost_cv_prog_cc_mthreads, # [echo 'void f(){}' >conftest.c # if test -z "`${CC-cc} -mthreads -c conftest.c 2>&1`"; then # ost_cv_prog_cc_mthreads=yes # else # ost_cv_prog_cc_mthreads=no # fi # rm -f conftest* # ]) # fi ost_cv_thread_library=none { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5 $as_echo_n "checking for pthread_self in -lpthread... " >&6; } if test "${ac_cv_lib_pthread_pthread_self+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $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 pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_self=yes else ac_cv_lib_pthread_pthread_self=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_pthread_pthread_self" >&5 $as_echo "$ac_cv_lib_pthread_pthread_self" >&6; } if test "x$ac_cv_lib_pthread_pthread_self" = x""yes; then : ost_cv_thread_library=pthread else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lc_r" >&5 $as_echo_n "checking for pthread_self in -lc_r... " >&6; } if test "${ac_cv_lib_c_r_pthread_self+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $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 pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_self=yes else ac_cv_lib_c_r_pthread_self=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_c_r_pthread_self" >&5 $as_echo "$ac_cv_lib_c_r_pthread_self" >&6; } if test "x$ac_cv_lib_c_r_pthread_self" = x""yes; then : ost_cv_thread_library=c_r else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5 $as_echo_n "checking for pthread_kill in -lpthread... " >&6; } if test "${ac_cv_lib_pthread_pthread_kill+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $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 pthread_kill (); int main () { return pthread_kill (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_kill=yes else ac_cv_lib_pthread_pthread_kill=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_pthread_pthread_kill" >&5 $as_echo "$ac_cv_lib_pthread_pthread_kill" >&6; } if test "x$ac_cv_lib_pthread_pthread_kill" = x""yes; then : ost_cv_thread_library=pthread else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthreads" >&5 $as_echo_n "checking for pthread_self in -lpthreads... " >&6; } if test "${ac_cv_lib_pthreads_pthread_self+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $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 pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_self=yes else ac_cv_lib_pthreads_pthread_self=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_pthreads_pthread_self" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_self" >&6; } if test "x$ac_cv_lib_pthreads_pthread_self" = x""yes; then : ost_cv_thread_library=pthreads else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lthread" >&5 $as_echo_n "checking for pthread_self in -lthread... " >&6; } if test "${ac_cv_lib_thread_pthread_self+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lthread $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 pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_thread_pthread_self=yes else ac_cv_lib_thread_pthread_self=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_thread_pthread_self" >&5 $as_echo "$ac_cv_lib_thread_pthread_self" >&6; } if test "x$ac_cv_lib_thread_pthread_self" = x""yes; then : ost_cv_thread_library=thread fi fi fi fi fi if test $ost_cv_thread_library = none ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lgthreads" >&5 $as_echo_n "checking for pthread_self in -lgthreads... " >&6; } if test "${ac_cv_lib_gthreads_pthread_self+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgthreads $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 pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_gthreads_pthread_self=yes else ac_cv_lib_gthreads_pthread_self=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_gthreads_pthread_self" >&5 $as_echo "$ac_cv_lib_gthreads_pthread_self" >&6; } if test "x$ac_cv_lib_gthreads_pthread_self" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for malloc in -lmalloc" >&5 $as_echo_n "checking for malloc in -lmalloc... " >&6; } if test "${ac_cv_lib_malloc_malloc+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmalloc $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 malloc (); int main () { return malloc (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_malloc_malloc=yes else ac_cv_lib_malloc_malloc=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_malloc_malloc" >&5 $as_echo "$ac_cv_lib_malloc_malloc" >&6; } if test "x$ac_cv_lib_malloc_malloc" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBMALLOC 1 _ACEOF LIBS="-lmalloc $LIBS" fi ost_cv_thread_library=gthreads fi fi if test $ost_cv_thread_library = none ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lcma" >&5 $as_echo_n "checking for pthread_self in -lcma... " >&6; } if test "${ac_cv_lib_cma_pthread_self+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcma $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 pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_cma_pthread_self=yes else ac_cv_lib_cma_pthread_self=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_cma_pthread_self" >&5 $as_echo "$ac_cv_lib_cma_pthread_self" >&6; } if test "x$ac_cv_lib_cma_pthread_self" = x""yes; then : ost_cv_thread_library=cma fi fi if test $ost_cv_thread_library = none ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lc" >&5 $as_echo_n "checking for pthread_self in -lc... " >&6; } if test "${ac_cv_lib_c_pthread_self+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 pthread_self (); int main () { return pthread_self (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_pthread_self=yes else ac_cv_lib_c_pthread_self=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_c_pthread_self" >&5 $as_echo "$ac_cv_lib_c_pthread_self" >&6; } if test "x$ac_cv_lib_c_pthread_self" = x""yes; then : ost_cv_thread_library=c fi fi if test $ost_cv_thread_library = none ; then as_fn_error "no library for posix threads found!" "$LINENO" 5 fi else # ost_cv_prog_cc_pthread=no # ost_cv_prog_cc_mthreads=no ost_cv_thread_flags="" fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_mach_thread_np" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mach_thread_np in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_mach_thread_np in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_mach_thread_np (); int main () { return pthread_mach_thread_np (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_MACH_THREAD_NP 1" >>confdefs.h fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_nanosleep" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for nanosleep in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 nanosleep (); int main () { return nanosleep (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_NANOSLEEP 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lposix4" >&5 $as_echo_n "checking for nanosleep in -lposix4... " >&6; } if test "${ac_cv_lib_posix4_nanosleep+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix4 $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 nanosleep (); int main () { return nanosleep (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_posix4_nanosleep=yes else ac_cv_lib_posix4_nanosleep=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_posix4_nanosleep" >&5 $as_echo "$ac_cv_lib_posix4_nanosleep" >&6; } if test "x$ac_cv_lib_posix4_nanosleep" = x""yes; then : $as_echo "#define HAVE_PTHREAD_NANOSLEEP 1" >>confdefs.h THREAD_LIBS="$THREAD_LIBS -lposix4" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt" >&5 $as_echo_n "checking for nanosleep in -lrt... " >&6; } if test "${ac_cv_lib_rt_nanosleep+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $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 nanosleep (); int main () { return nanosleep (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_rt_nanosleep=yes else ac_cv_lib_rt_nanosleep=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_rt_nanosleep" >&5 $as_echo "$ac_cv_lib_rt_nanosleep" >&6; } if test "x$ac_cv_lib_rt_nanosleep" = x""yes; then : $as_echo "#define HAVE_PTHREAD_NANOSLEEP 1" >>confdefs.h ost_cv_rt_library="-lrt" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 $as_echo_n "checking for clock_gettime in -lrt... " >&6; } if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $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 clock_gettime (); int main () { return clock_gettime (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_rt_clock_gettime=yes else ac_cv_lib_rt_clock_gettime=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_rt_clock_gettime" >&5 $as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } if test "x$ac_cv_lib_rt_clock_gettime" = x""yes; then : ost_cv_rt_library="-lrt" $as_echo "#define HAVE_HIRES_TIMER 1" >>confdefs.h else for ac_func in clock_gettime do : ac_fn_cxx_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" if test "x$ac_cv_func_clock_gettime" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CLOCK_GETTIME 1 _ACEOF $as_echo "#define HAVE_HIRES_TIMER 1" >>confdefs.h fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mlockall in -lrt" >&5 $as_echo_n "checking for mlockall in -lrt... " >&6; } if test "${ac_cv_lib_rt_mlockall+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $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 mlockall (); int main () { return mlockall (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_rt_mlockall=yes else ac_cv_lib_rt_mlockall=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_rt_mlockall" >&5 $as_echo "$ac_cv_lib_rt_mlockall" >&6; } if test "x$ac_cv_lib_rt_mlockall" = x""yes; then : $as_echo "#define HAVE_MLOCK 1" >>confdefs.h $as_echo "#define HAVE_MLOCKALL 1" >>confdefs.h ost_cv_rt_library="-lrt" else for ac_func in mlock do : ac_fn_cxx_check_func "$LINENO" "mlock" "ac_cv_func_mlock" if test "x$ac_cv_func_mlock" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MLOCK 1 _ACEOF fi done for ac_func in mlockall do : ac_fn_cxx_check_func "$LINENO" "mlockall" "ac_cv_func_mlockall" if test "x$ac_cv_func_mlockall" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MLOCKALL 1 _ACEOF fi done fi if test "$ost_cv_rt_library" != "none" ; then THREAD_LIBS="$THREAD_LIBS $ost_cv_rt_library" ; fi if test ! -z "$ost_cv_thread_flags" ; then THREAD_LIBS="$THREAD_LIBS $ost_cv_thread_flags" ; fi if test "$ost_cv_thread_library" != "none" -a "$ost_cv_thread_library" != "c" ; then THREAD_LIBS="$THREAD_LIBS -l$ost_cv_thread_library" ; fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";; *solaris* | alpha*-osf*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then THREAD_FLAGS="$flag" fi # LIBS="$THREAD_LIBS $LIBS" if test "$ost_cv_thread_library" != "lthread" ; then for ac_header in pthread_np.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_np_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_NP_H 1 _ACEOF fi done fi for ac_header in semaphore.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "semaphore.h" "ac_cv_header_semaphore_h" "$ac_includes_default" if test "x$ac_cv_header_semaphore_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SEMAPHORE_H 1 _ACEOF fi done for ac_header in sched.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default" if test "x$ac_cv_header_sched_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SCHED_H 1 _ACEOF fi done for ac_header in sys/sched.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/sched.h" "ac_cv_header_sys_sched_h" "$ac_includes_default" if test "x$ac_cv_header_sys_sched_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SCHED_H 1 _ACEOF fi done for ac_func in sched_getscheduler do : ac_fn_cxx_check_func "$LINENO" "sched_getscheduler" "ac_cv_func_sched_getscheduler" if test "x$ac_cv_func_sched_getscheduler" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SCHED_GETSCHEDULER 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for recursive mutex type support" >&5 $as_echo_n "checking for recursive mutex type support... " >&6; } if test "${ost_cv_mutex_recursive+set}" = set; then : $as_echo_n "(cached) " >&6 else ost_cv_mutex_recursive="none" if test "$ost_cv_cxx_mode" = true ; 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 ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -pthread" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #ifdef PTHREAD_MUTEX_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE #endif #endif return (int)PTHREAD_MUTEXTYPE_RECURSIVE; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_mutex_recursive="portable" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "PTHREAD_MUTEXTYPE_RECURSIVE_NP" >/dev/null 2>&1; then : ost_cv_mutex_recursive=non-portable fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "PTHREAD_MUTEX_RECURSIVE_INITIALIZER_NP" >/dev/null 2>&1; then : ost_cv_mutex_recursive=lthread fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "PTHREAD_MUTEX_RECURSIVE_NP" >/dev/null 2>&1; then : ost_cv_mutex_recursive=linux fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "MUTEX_TYPE_COUNTING_FAST" >/dev/null 2>&1; then : ost_cv_mutex_recursive=counting fi rm -f conftest* fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ost_cv_mutex_recursive = "none" ; then if test $ost_cv_thread_library = "lthread" ; then ost_cv_mutex_recursive=linux fi fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_mutex_recursive" >&5 $as_echo "$ost_cv_mutex_recursive" >&6; } if test $ost_cv_mutex_recursive = "none" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return MUTEX_TYPE_COUNTING_FAST; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_mutex_recursive=counting fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "$ost_cv_cxx_mode" = true ; then CXXFLAGS="$ac_save_CXXFLAGS" 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 fi case $ost_cv_mutex_recursive in non-portable) $as_echo "#define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEXTYPE_RECURSIVE_NP" >>confdefs.h ;; linux) $as_echo "#define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP" >>confdefs.h ;; counting) $as_echo "#define PTHREAD_MUTEXTYPE_RECURSIVE MUTEX_TYPE_COUNTING_FAST" >>confdefs.h ;; esac as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_mutexattr_settype" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutexattr_settype in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_mutexattr_settype in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_mutexattr_settype (); int main () { return pthread_mutexattr_settype (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_MUTEXATTR_SETTYPE 1" >>confdefs.h else as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_mutexattr_settype_np" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutexattr_settype_np in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_mutexattr_settype_np in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_mutexattr_settype_np (); int main () { return pthread_mutexattr_settype_np (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_MUTEXATTR_SETTYPE_NP 1" >>confdefs.h fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_mutexattr_setkind_np" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutexattr_setkind_np in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_mutexattr_setkind_np in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_mutexattr_setkind_np (); int main () { return pthread_mutexattr_setkind_np (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_MUTEXATTR_SETKIND_NP 1" >>confdefs.h fi fi ost_cv_thread_rwlock=false as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_rwlock_init" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_rwlock_init in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_rwlock_init in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_rwlock_init (); int main () { return pthread_rwlock_init (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : ost_cv_thread_rwlock=true $as_echo "#define HAVE_PTHREAD_RWLOCK 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pread in -lc" >&5 $as_echo_n "checking for pread in -lc... " >&6; } if test "${ac_cv_lib_c_pread+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 pread (); int main () { return pread (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_pread=yes else ac_cv_lib_c_pread=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_c_pread" >&5 $as_echo "$ac_cv_lib_c_pread" >&6; } if test "x$ac_cv_lib_c_pread" = x""yes; then : $as_echo "#define HAVE_PREAD_PWRITE 1" >>confdefs.h else as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pread" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pread in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pread in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pread (); int main () { return pread (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PREAD_PWRITE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pread in -lc_r" >&5 $as_echo_n "checking for pread in -lc_r... " >&6; } if test "${ac_cv_lib_c_r_pread+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $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 pread (); int main () { return pread (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_r_pread=yes else ac_cv_lib_c_r_pread=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_c_r_pread" >&5 $as_echo "$ac_cv_lib_c_r_pread" >&6; } if test "x$ac_cv_lib_c_r_pread" = x""yes; then : $as_echo "#define HAVE_PREAD_PWRITE 1" >>confdefs.h fi fi fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_suspend" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_suspend in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_suspend in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_suspend (); int main () { return pthread_suspend (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_SUSPEND 1" >>confdefs.h fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_attr_setstacksize" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_attr_setstacksize in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_attr_setstacksize in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_attr_setstacksize (); int main () { return pthread_attr_setstacksize (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1" >>confdefs.h fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_yield_np" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_yield_np in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_yield_np in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_yield_np (); int main () { return pthread_yield_np (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_YIELD_NP 1" >>confdefs.h else as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_yield" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_yield in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_yield in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_yield (); int main () { return pthread_yield (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_YIELD 1" >>confdefs.h else as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_sched_yield" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for sched_yield in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_SCHED_YIELD 1" >>confdefs.h fi fi fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_cancel" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_cancel in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_cancel in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_cancel (); int main () { return pthread_cancel (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_CANCEL 1" >>confdefs.h as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_setcanceltype" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_setcanceltype in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_setcanceltype in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_setcanceltype (); int main () { return pthread_setcanceltype (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_SETCANCELTYPE 1" >>confdefs.h else as_ac_Lib=`$as_echo "ac_cv_lib_$ost_cv_thread_library''_pthread_setcanel" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_setcanel in -l$ost_cv_thread_library" >&5 $as_echo_n "checking for pthread_setcanel in -l$ost_cv_thread_library... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$ost_cv_thread_library $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 pthread_setcanel (); int main () { return pthread_setcanel (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_SETCANCEL 1" >>confdefs.h fi fi else as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_setcanceltype" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_setcanceltype in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_setcanceltype in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_setcanceltype (); int main () { return pthread_setcanceltype (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_CANCEL 1" >>confdefs.h $as_echo "#define HAVE_PTHREAD_SETCANCELTYPE 1" >>confdefs.h fi fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_thread_library}''_pthread_delay_np" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_delay_np in -l${ost_cv_thread_library}" >&5 $as_echo_n "checking for pthread_delay_np in -l${ost_cv_thread_library}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_thread_library} $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 pthread_delay_np (); int main () { return pthread_delay_np (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_PTHREAD_DELAY_NP 1" >>confdefs.h fi fi UNAME=`uname` if test "$UNAME" = "AIX" ; then # Extract the first word of "cc_r", so it can be a program name with args. set dummy cc_r; 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_PTHREAD_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_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_PTHREAD_CC="cc_r" $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 test -z "$ac_cv_prog_PTHREAD_CC" && ac_cv_prog_PTHREAD_CC="${CC}" fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi CC=$PTHREAD_CC $as_echo "#define COMMON_AIX_FIXES 1" >>confdefs.h fi reentrant_lib=${ost_cv_thread_library} if test -z "$reentrant_lib" ; then reentrant_lib=c_r fi if test "c" = "$reentrant_lib" ; then reentrant_lib=c_r fi if test "none" = "$reentrant_lib" ; then reentrant_lib=c_r fi for ac_func in setenv do : ac_fn_cxx_check_func "$LINENO" "setenv" "ac_cv_func_setenv" if test "x$ac_cv_func_setenv" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETENV 1 _ACEOF fi done as_ac_Lib=`$as_echo "ac_cv_lib_$reentrant_lib''_localtime_r" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for localtime_r in -l$reentrant_lib" >&5 $as_echo_n "checking for localtime_r in -l$reentrant_lib... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$reentrant_lib $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 localtime_r (); int main () { return localtime_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_STRTOK_R 1" >>confdefs.h $as_echo "#define HAVE_LOCALTIME_R 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtok_r in -lc" >&5 $as_echo_n "checking for strtok_r in -lc... " >&6; } if test "${ac_cv_lib_c_strtok_r+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 strtok_r (); int main () { return strtok_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_strtok_r=yes else ac_cv_lib_c_strtok_r=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_c_strtok_r" >&5 $as_echo "$ac_cv_lib_c_strtok_r" >&6; } if test "x$ac_cv_lib_c_strtok_r" = x""yes; then : $as_echo "#define HAVE_STRTOK_R 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for localtime_r in -lc" >&5 $as_echo_n "checking for localtime_r in -lc... " >&6; } if test "${ac_cv_lib_c_localtime_r+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 localtime_r (); int main () { return localtime_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_localtime_r=yes else ac_cv_lib_c_localtime_r=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_c_localtime_r" >&5 $as_echo "$ac_cv_lib_c_localtime_r" >&6; } if test "x$ac_cv_lib_c_localtime_r" = x""yes; then : $as_echo "#define HAVE_LOCALTIME_R 1" >>confdefs.h fi fi as_ac_Lib=`$as_echo "ac_cv_lib_$reentrant_lib''_readdir_r" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readdir_r in -l$reentrant_lib" >&5 $as_echo_n "checking for readdir_r in -l$reentrant_lib... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$reentrant_lib $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 readdir_r (); int main () { return readdir_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_READDIR_R 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readdir_r in -lc" >&5 $as_echo_n "checking for readdir_r in -lc... " >&6; } if test "${ac_cv_lib_c_readdir_r+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 readdir_r (); int main () { return readdir_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_readdir_r=yes else ac_cv_lib_c_readdir_r=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_c_readdir_r" >&5 $as_echo "$ac_cv_lib_c_readdir_r" >&6; } if test "x$ac_cv_lib_c_readdir_r" = x""yes; then : $as_echo "#define HAVE_READDIR_R 1" >>confdefs.h fi fi as_ac_Lib=`$as_echo "ac_cv_lib_$reentrant_lib''_strerror_r" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror_r in -l$reentrant_lib" >&5 $as_echo_n "checking for strerror_r in -l$reentrant_lib... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$reentrant_lib $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 strerror_r (); int main () { return strerror_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_STRERROR_R 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strerror_r in -lc" >&5 $as_echo_n "checking for strerror_r in -lc... " >&6; } if test "${ac_cv_lib_c_strerror_r+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 strerror_r (); int main () { return strerror_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_strerror_r=yes else ac_cv_lib_c_strerror_r=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_c_strerror_r" >&5 $as_echo "$ac_cv_lib_c_strerror_r" >&6; } if test "x$ac_cv_lib_c_strerror_r" = x""yes; then : $as_echo "#define HAVE_STRERROR_R 1" >>confdefs.h fi fi as_ac_Lib=`$as_echo "ac_cv_lib_$reentrant_lib''_getpwuid_r" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpwuid_r in -l$reentrant_lib" >&5 $as_echo_n "checking for getpwuid_r in -l$reentrant_lib... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$reentrant_lib $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 getpwuid_r (); int main () { return getpwuid_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_GETPWUID_R 1" >>confdefs.h $as_echo "#define HAVE_GETPWNAM_R 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpwuid_r in -lc" >&5 $as_echo_n "checking for getpwuid_r in -lc... " >&6; } if test "${ac_cv_lib_c_getpwuid_r+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 getpwuid_r (); int main () { return getpwuid_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_getpwuid_r=yes else ac_cv_lib_c_getpwuid_r=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_c_getpwuid_r" >&5 $as_echo "$ac_cv_lib_c_getpwuid_r" >&6; } if test "x$ac_cv_lib_c_getpwuid_r" = x""yes; then : $as_echo "#define HAVE_GETPWUID_R 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpwnam_r in -lc" >&5 $as_echo_n "checking for getpwnam_r in -lc... " >&6; } if test "${ac_cv_lib_c_getpwnam_r+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 getpwnam_r (); int main () { return getpwnam_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_getpwnam_r=yes else ac_cv_lib_c_getpwnam_r=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_c_getpwnam_r" >&5 $as_echo "$ac_cv_lib_c_getpwnam_r" >&6; } if test "x$ac_cv_lib_c_getpwnam_r" = x""yes; then : $as_echo "#define HAVE_GETPWNAM_R 1" >>confdefs.h fi fi as_ac_Lib=`$as_echo "ac_cv_lib_$reentrant_lib''_getgrnam_r" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getgrnam_r in -l$reentrant_lib" >&5 $as_echo_n "checking for getgrnam_r in -l$reentrant_lib... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$reentrant_lib $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 getgrnam_r (); int main () { return getgrnam_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_GETGRNAM_R 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getgrnam_r in -lc" >&5 $as_echo_n "checking for getgrnam_r in -lc... " >&6; } if test "${ac_cv_lib_c_getgrnam_r+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $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 getgrnam_r (); int main () { return getgrnam_r (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_c_getgrnam_r=yes else ac_cv_lib_c_getgrnam_r=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_c_getgrnam_r" >&5 $as_echo "$ac_cv_lib_c_getgrnam_r" >&6; } if test "x$ac_cv_lib_c_getgrnam_r" = x""yes; then : $as_echo "#define HAVE_GETGRNAM_R 1" >>confdefs.h fi fi for ac_header in poll.h sys/poll.h sys/stream.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in poll do : ac_fn_cxx_check_func "$LINENO" "poll" "ac_cv_func_poll" if test "x$ac_cv_func_poll" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POLL 1 _ACEOF fi done ost_cv_inet_sockets=no ost_cv_unix_sockets=no ost_cv_lib_socket="c" ost_cv_ipv6=yes ost_cv_nat=yes ost_cv_nat_detected=no SOCKET_LIBS="" for ac_header in net/if.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$ac_includes_default" if test "x$ac_cv_header_net_if_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NET_IF_H 1 _ACEOF fi done for ac_header in sys/socket.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" if test "x$ac_cv_header_sys_socket_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SOCKET_H 1 _ACEOF for ac_header in select.h sys/select.h netinet/in_systm.h netinet/ip.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in netinet/inet.h netinet/in.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default" if test "x$ac_cv_header_arpa_inet_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ARPA_INET_H 1 _ACEOF ost_cv_inet_sockets=yes fi done for ac_header in sys/sockio.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/sockio.h" "ac_cv_header_sys_sockio_h" "$ac_includes_default" if test "x$ac_cv_header_sys_sockio_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SOCKIO_H 1 _ACEOF fi done for ac_header in sys/un.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default" if test "x$ac_cv_header_sys_un_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_UN_H 1 _ACEOF ost_cv_unix_sockets=yes fi done else for ac_header in winsock2.h winsock.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF ost_cv_lib_socket="wsock32" SOCKET_LIBS="-lwsock32 -liberty -lws2_32" ost_cv_inet_sockets=yes fi done fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } if test "${ac_cv_lib_socket_socket+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $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 socket (); int main () { return socket (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_socket_socket=yes else ac_cv_lib_socket_socket=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_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } if test "x$ac_cv_lib_socket_socket" = x""yes; then : ost_cv_lib_socket="socket" SOCKET_LIBS="-lsocket" fi if test $ost_cv_inet_sockets = yes ; then as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_lib_socket}''_getaddrinfo" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -l${ost_cv_lib_socket}" >&5 $as_echo_n "checking for getaddrinfo in -l${ost_cv_lib_socket}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_lib_socket} $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 getaddrinfo (); int main () { return getaddrinfo (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h fi # Check whether --with-ipv6 was given. if test "${with_ipv6+set}" = set; then : withval=$with_ipv6; ost_cv_ipv6=no else for ac_header in netinet6/in6.h linux/in6.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_lib_socket}''_inet_pton" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_pton in -l${ost_cv_lib_socket}" >&5 $as_echo_n "checking for inet_pton in -l${ost_cv_lib_socket}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_lib_socket} $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 inet_pton (); int main () { return inet_pton (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_INET_PTON 1" >>confdefs.h fi as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_lib_socket}''_gethostbyname2" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname2 in -l${ost_cv_lib_socket}" >&5 $as_echo_n "checking for gethostbyname2 in -l${ost_cv_lib_socket}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_lib_socket} $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 gethostbyname2 (); int main () { return gethostbyname2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_GETHOSTBYNAME2 1" >>confdefs.h fi fi for ac_header in sys/libcsys.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "sys/libcsys.h" "ac_cv_header_sys_libcsys_h" "$ac_includes_default" if test "x$ac_cv_header_sys_libcsys_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_LIBCSYS_H 1 _ACEOF fi done $as_echo "#define HAVE_INET_SOCKETS 1" >>confdefs.h as_ac_Lib=`$as_echo "ac_cv_lib_${ost_cv_lib_socket}''_inet_aton" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -l${ost_cv_lib_socket}" >&5 $as_echo_n "checking for inet_aton in -l${ost_cv_lib_socket}... " >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${ost_cv_lib_socket} $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 inet_aton (); int main () { return inet_aton (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Lib if test "x$as_val" = x""yes; then : $as_echo "#define HAVE_INET_ATON 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t defined" >&5 $as_echo_n "checking for socklen_t defined... " >&6; } if test "${ost_cv_socklen_t+set}" = set; then : $as_echo_n "(cached) " >&6 else ost_cv_socklen_t='no' cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "socklen_t" >/dev/null 2>&1; then : ost_cv_socklen_t='yes' else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "socklen_t" >/dev/null 2>&1; then : ost_cv_socklen_t='yes' fi rm -f conftest* fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_socklen_t" >&5 $as_echo "$ost_cv_socklen_t" >&6; } if test $ost_cv_socklen_t = yes ; then $as_echo "#define HAVE_SOCKLEN_T 1" >>confdefs.h fi # Check whether --with-nat was given. if test "${with_nat+set}" = set; then : withval=$with_nat; ost_cv_nat=no fi if test "$ost_cv_nat" = "yes" ; then for ac_header in errno.h limits.h sys/types.h sys/socket.h sys/ioctl.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in net/if.h do : ac_fn_cxx_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "#ifdef HAVE_SYS_SOCKET_H #include #endif " if test "x$ac_cv_header_net_if_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NET_IF_H 1 _ACEOF fi done if test "$ost_cv_nat_detected" = "no" ; then for ac_header in linux/netfilter_ipv4.h linux/netfilter_ipv6.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_LIMITS_H #include #endif " 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 if test "$ac_cv_header_linux_netfilter_ipv4_h" = "yes" && test "$ac_cv_header_linux_netfilter_ipv6_h" = "yes" && test "$ost_cv_ipv6" = "yes" || test "$ost_cv_ipv6" = "no" ; then $as_echo "#define HAVE_NAT_NETFILTER 1" >>confdefs.h ost_cv_nat_detected="yes" fi fi if test "$ost_cv_nat_detected" = "no" ; then ip_filter_compat="no" for ac_header in netinet/ip_compat.h ip_compat.h netinet/ip_fil_compat.h ip_fil_compat.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif " 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 ip_filter_compat=$ac_header break fi done if test "$ip_filter_compat" != "no" ; then ip_filter_fil="no" for ac_header in netinet/ip_fil.h ip_fil.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #include <$ip_filter_compat> " 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 ip_filter_fil=$ac_header break fi done ip_filter_nat="no" for ac_header in netinet/ip_nat.h ip_nat.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #include <$ip_filter_compat> #include <$ip_filter_fil> #ifdef HAVE_NET_IF_H #include #endif " 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 ip_filter_nat=$ac_header break fi done if test "$ip_filter_fil" != "no" && test "$ip_filter_nat" != "no" ; then $as_echo "#define HAVE_NAT_IPF 1" >>confdefs.h ost_cv_nat_detected="yes" fi fi fi if test "$ost_cv_nat_detected" = "no" ; then for ac_header in net/pfvar.h do : ac_fn_cxx_check_header_compile "$LINENO" "net/pfvar.h" "ac_cv_header_net_pfvar_h" "#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NET_IF_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif " if test "x$ac_cv_header_net_pfvar_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NET_PFVAR_H 1 _ACEOF fi done if test "$ac_cv_header_net_pfvar.h" = "yes" ; then $as_echo "#define HAVE_NAT_PF 1" >>confdefs.h ost_cv_nat_detected="yes" fi fi if test "$ost_cv_nat_detected" = "yes"; then $as_echo "#define CCXX_NAT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------------------" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not autodetect NAT engine - pf, ipf or netfilter." >&5 $as_echo "$as_me: WARNING: Could not autodetect NAT engine - pf, ipf or netfilter." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: NAT engine c++ class interface support was disabled. " >&5 $as_echo "$as_me: WARNING: NAT engine c++ class interface support was disabled. " >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This is not necessarilly a problem. If you do not plan " >&5 $as_echo "$as_me: WARNING: This is not necessarilly a problem. If you do not plan " >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: to use or don't know what this is, than it is safe to " >&5 $as_echo "$as_me: WARNING: to use or don't know what this is, than it is safe to " >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: assume that you don't need it. " >&5 $as_echo "$as_me: WARNING: assume that you don't need it. " >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -------------------------------------------------------" >&5 $as_echo "$as_me: WARNING: -------------------------------------------------------" >&2;} ost_cv_nat="no" fi fi fi if test $ost_cv_unix_sockets = yes ; then $as_echo "#define HAVE_UNIX_SOCKETS 1" >>confdefs.h fi THREAD_LIBS="$SOCKET_LIBS $THREAD_LIBS" ost_cv_ssl=no # Check whether --with-monotonic was given. if test "${with_monotonic+set}" = set; then : withval=$with_monotonic; else $as_echo "#define USE_MONOTONIC_TIMER 1" >>confdefs.h fi # Check whether --with-extras was given. if test "${with_extras+set}" = set; then : withval=$with_extras; ZSTREAM_LIBS="" ost_cv_lib_zlib=false OST_LIB_NOXML ost_cv_extras=no else ost_cv_extras=yes $as_echo "#define HAVE_EXTRAS 1" >>confdefs.h # Check whether --with-gnutls was given. if test "${with_gnutls+set}" = set; then : withval=$with_gnutls; ac_fn_cxx_check_header_mongrel "$LINENO" "gnutls/gnutls.h" "ac_cv_header_gnutls_gnutls_h" "$ac_includes_default" if test "x$ac_cv_header_gnutls_gnutls_h" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gnutls_init in -lgnutls" >&5 $as_echo_n "checking for gnutls_init in -lgnutls... " >&6; } if test "${ac_cv_lib_gnutls_gnutls_init+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgnutls $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 gnutls_init (); int main () { return gnutls_init (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_gnutls_gnutls_init=yes else ac_cv_lib_gnutls_gnutls_init=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_gnutls_gnutls_init" >&5 $as_echo "$ac_cv_lib_gnutls_gnutls_init" >&6; } if test "x$ac_cv_lib_gnutls_gnutls_init" = x""yes; then : SSL_LIBS="-lgnutls -lgcrypt" ost_cv_ssl=true $as_echo "#define CCXX_SSL GNUTLS" >>confdefs.h $as_echo "#define CCXX_GNUTLS 1" >>confdefs.h fi fi else # Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; SSL_LIBS="" # # WE CANNOT YET USE GNUTLS BECAUSE GNUTLS OPENSSL EMULATION DOES # NOT SUPPORT THREAD SAFETY, SO ssl.cpp MUST BE REWRITTEN TO USE # NATIVE GNUTLS API. # # AC_CHECK_HEADER(gnutls/gnutls.h,[ # AC_CHECK_LIB(gnutls, gnutls_init, [ # SSL_LIBS="-lgnutls -lgcrypt -ltasn1" # ost_cv_ssl=true # AC_DEFINE(CCXX_SSL, [GNUTLS], [defines ssl]) # AC_DEFINE(CCXX_GNUTLS, [1], [define gnutls]) # ]) # ],[ ac_fn_cxx_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_ssl_h" = x""yes; then : SSL_LIBS="-lssl" ost_cv_ssl=true $as_echo "#define CCXX_OPENSSL 1" >>confdefs.h $as_echo "#define CCXX_SSL OPENSSL" >>confdefs.h fi # ]) else SSL_LIBS="" fi fi # Check whether --with-compression was given. if test "${with_compression+set}" = set; then : withval=$with_compression; ZSTREAM_LIBS="" ost_cv_lib_zlib=false else ZSTREAM_LIBS="" ost_cv_lib_zlib=false for ac_header in zlib.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_ZLIB_H 1 _ACEOF ZSTREAM_LIBS="-lz" $as_echo "#define HAVE_ZLIB_H 1" >>confdefs.h ost_cv_lib_zlib=true fi done fi fi # Check whether --with-memaudit was given. if test "${with_memaudit+set}" = set; then : withval=$with_memaudit; $as_echo "#define COMMON_MEMORY_AUDIT 1" >>confdefs.h fi # Check whether --with-cppunit was given. if test "${with_cppunit+set}" = set; then : withval=$with_cppunit; if test "$withval" != "yes"; then CPPUNIT_LIBS="-l$withval" else CPPUNIT_LIBS="-lcppunit" fi else CPPUNIT_LIBS=" " fi if test "$CPPUNIT_LIBS" != " "; then WITH_CPPUNIT_TESTS_TRUE= WITH_CPPUNIT_TESTS_FALSE='#' else WITH_CPPUNIT_TESTS_TRUE='#' WITH_CPPUNIT_TESTS_FALSE= fi for ac_header in sys/file.h sys/param.h sys/wait.h syslog.h syslog.hposix_evlog.h ss.h ioctl.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in realpath lstat snprintf memmove strdup lockf waitpid wait4 gettimeofday do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in posix_memalign setegid setpgrp getpagesize do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # C++ stuff must done after library and header # (some C++ define require some header) 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=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 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=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 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;} as_fn_error "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 whether ${CXX} has built-in bool type" >&5 $as_echo_n "checking whether ${CXX} has built-in bool type... " >&6; } if test "${ac_cv_cxx_bool_type+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { bool b1=true; bool b2=false; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_cxx_bool_type=yes else ac_cv_cxx_bool_type=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_bool_type" >&5 $as_echo "$ac_cv_cxx_bool_type" >&6; } if test $ac_cv_cxx_bool_type = yes ; then $as_echo "#define HAVE_BOOL_TYPE 1" >>confdefs.h fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$ac_save_CXXFLAGS" # allow build of library without exception handling, for use in # dedicated targets, etc... # Check whether --with-exceptions was given. if test "${with_exceptions+set}" = set; then : withval=$with_exceptions; ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 optflags=$CXXFLAGS if test ! -z "$optflags" ; then CXXFLAGS="" for opt in $optflags ; do case $opt in *rtti*) ;; *exceptions*) ;; *) CXXFLAGS="$CXXFLAGS $opt" ;; esac done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fno-exceptions" >&5 $as_echo_n "checking whether ${CXX} supports -fno-exceptions... " >&6; } if test "${ac_cv_cxx_noexception_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -fno-exceptions -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -fno-exceptions" ac_cv_cxx_noexception_flag=yes else ac_cv_cxx_noexception_flag=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_noexception_flag" >&5 $as_echo "$ac_cv_cxx_noexception_flag" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fno-rtti" >&5 $as_echo_n "checking whether ${CXX} supports -fno-rtti... " >&6; } if test "${ac_cv_cxx_no_rtti_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else echo '#include ' >conftest.cpp echo 'void f(){}' >>conftest.cpp if test -z "`${CXX} -fno-rtti -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -fno-rtti" ac_cv_cxx_no_rtti_flag=yes else ac_cv_cxx_no_rtti_flag=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_no_rtti_flag" >&5 $as_echo "$ac_cv_cxx_no_rtti_flag" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fno-check-new" >&5 $as_echo_n "checking whether ${CXX} supports -fno-check-new... " >&6; } if test "${ac_cv_cxx_no_check_new_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -fno-check-new -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -fno-check-new" ac_cv_cxx_no_check_new_flag=yes else ac_cv_cxx_no_check_new_flag=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_no_check_new_flag" >&5 $as_echo "$ac_cv_cxx_no_check_new_flag" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -finline" >&5 $as_echo_n "checking whether ${CXX} supports -finline... " >&6; } if test "${ac_cv_cxx_inline_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -finline -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -finline" ac_cv_cxx_inline_flag=yes else ac_cv_cxx_inline_flag=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_inline_flag" >&5 $as_echo "$ac_cv_cxx_inline_flag" >&6; } 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 CXXFLAGS="$ac_save_CXXFLAGS" else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 optflags=$CXXFLAGS if test ! -z "$optflags" ; then CXXFLAGS="" for opt in $optflags ; do case $opt in *no-rtti*) ;; *omit-frame-pointer*) ;; *no-exceptions*) ;; *) CXXFLAGS="$CXXFLAGS $opt" ;; esac done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fhandle-exceptions" >&5 $as_echo_n "checking whether ${CXX} supports -fhandle-exceptions... " >&6; } if test "${ac_cv_cxx_exception_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -fhandle-exceptions -c conftest.cpp 2>&1`"; then ac_cv_cxx_exception_flag=yes COMMON_FLAGS="$COMMON_FLAGS -fhandle-exceptions" else ac_cv_cxx_exception_flag=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_exception_flag" >&5 $as_echo "$ac_cv_cxx_exception_flag" >&6; } if test $ac_cv_cxx_exception_flag = "yes" ; then ac_cv_cxx_exception_handling=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports exception handling" >&5 $as_echo_n "checking whether ${CXX} supports exception handling... " >&6; } if test "${ac_cv_cxx_exception_handling+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ void f(void) { throw "abc"; } void g(void) { try { f(); } catch(char*){} } int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_cxx_exception_handling=yes else ac_cv_cxx_exception_handling=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_exception_handling" >&5 $as_echo "$ac_cv_cxx_exception_handling" >&6; } fi if test $ac_cv_cxx_exception_handling = yes ; then $as_echo "#define CCXX_EXCEPTIONS 1" >>confdefs.h for ac_header in exception do : ac_fn_cxx_check_header_mongrel "$LINENO" "exception" "ac_cv_header_exception" "$ac_includes_default" if test "x$ac_cv_header_exception" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_EXCEPTION 1 _ACEOF fi done fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$ac_save_CXXFLAGS" fi ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 whether ${CXX} supports mutable" >&5 $as_echo_n "checking whether ${CXX} supports mutable... " >&6; } if test "${ost_cv_cxx_mutable+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ class t {mutable int i;}; int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_cxx_mutable=yes else ost_cv_cxx_mutable=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_cxx_mutable" >&5 $as_echo "$ost_cv_cxx_mutable" >&6; } if test $ost_cv_cxx_mutable = no ; then COMMON_FLAGS="$COMMON_FLAGS -Dmutable" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$ac_save_CXXFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 whether ${CXX} supports namespace" >&5 $as_echo_n "checking whether ${CXX} supports namespace... " >&6; } if test "${ost_cv_cxx_namespace+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include namespace Test { using namespace std; } int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_cxx_namespace=yes else ost_cv_cxx_namespace=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_cxx_namespace" >&5 $as_echo "$ost_cv_cxx_namespace" >&6; } if test "$ost_cv_cxx_namespace" = yes ; then $as_echo "#define CCXX_NAMESPACES 1" >>confdefs.h fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$ac_save_CXXFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 wheather old style iostreams" >&5 $as_echo_n "checking wheather old style iostreams... " >&6; } if test "${ost_cv_cxx_iostream+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include using namespace std; class mystr : public streambuf, public iostream { mystr(); }; mystr::mystr() : streambuf(), iostream((streambuf *)this) { } int main () { return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ost_cv_cxx_iostream=no else ost_cv_cxx_iostream=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_cxx_iostream" >&5 $as_echo "$ost_cv_cxx_iostream" >&6; } if test $ost_cv_cxx_iostream = yes ; then $as_echo "#define HAVE_OLD_IOSTREAM 1" >>confdefs.h fi for ac_header in sstream do : ac_fn_cxx_check_header_mongrel "$LINENO" "sstream" "ac_cv_header_sstream" "$ac_includes_default" if test "x$ac_cv_header_sstream" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SSTREAM 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 CXXFLAGS="$ac_save_CXXFLAGS" # AC_PROG_CPP # AC_PROG_CXX # AC_PROG_CXXCPP ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 whether ${CXX} has new(size_t,void*)" >&5 $as_echo_n "checking whether ${CXX} has new(size_t,void*)... " >&6; } if test "${ac_cv_cxx_new_init+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include using namespace std; int main () { int* p1 = new int(); int* p2 = new (p1) int(); return 0; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_cxx_new_init=yes else ac_cv_cxx_new_init=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_new_init" >&5 $as_echo "$ac_cv_cxx_new_init" >&6; } if test $ac_cv_cxx_new_init = yes ; then $as_echo "#define CCXX_HAVE_NEW_INIT 1" >>confdefs.h fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$ac_save_CXXFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" 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 # Check whether --with-stlport was given. if test "${with_stlport+set}" = set; then : withval=$with_stlport; if test "$withval" = "" ; then COMMON_FLAGS="-I$(includedir)/stlport $COMMON_FLAGS" else COMMON_FLAGS="-I$withval/include/stlport $COMMON_FLAGS" LIBS="-L$withval/lib $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing __stl_throw_invalid_argument" >&5 $as_echo_n "checking for library containing __stl_throw_invalid_argument... " >&6; } if test "${ost_cv_search___stl_throw_invalid_argument+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS="$LIBS" ost_cv_search___stl_throw_invalid_argument="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ namespace _STL { void __stl_throw_invalid_argument(const char*); } int main () { _STL::__stl_throw_invalid_argument("x") ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ost_cv_search___stl_throw_invalid_argument="none required" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ost_cv_search___stl_throw_invalid_argument" = "no" && for i in stlport_gcc stlport_cygwin stlport_mingw32 stlport_sunpro stlport_watcom; do LIBS="-l$i $ac_func_search_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ namespace _STL { void __stl_throw_invalid_argument(const char*); } int main () { _STL::__stl_throw_invalid_argument("x") ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ost_cv_search___stl_throw_invalid_argument="-l$i" break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done LIBS="$ac_func_search_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ost_cv_search___stl_throw_invalid_argument" >&5 $as_echo "$ost_cv_search___stl_throw_invalid_argument" >&6; } if test "$ost_cv_search___stl_throw_invalid_argument" != "no"; then test "$ost_cv_search___stl_throw_invalid_argument" = "none required" || LIBS="$ost_cv_search___stl_throw_invalid_argument $LIBS" else : fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$ac_save_CXXFLAGS" # Are we using the GNU compiler? if test "$GCC" = yes ; then WARN_FLAGS="-pedantic -Wall" else WARN_FLAGS="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for debugging" >&5 $as_echo_n "checking for debugging... " >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi if test -z "$enable_debug" ; then enable_debug="no" elif test $enable_debug = "yes" ; then CXXFLAGS="${CXXFLAGS} -g -DDEBUG" # CXXFLAGS=`echo $CFLAGS | sed 's/-O.//'` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_debug" >&5 $as_echo "$enable_debug" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for profiling" >&5 $as_echo_n "checking for profiling... " >&6; } # Check whether --enable-profiling was given. if test "${enable_profiling+set}" = set; then : enableval=$enable_profiling; fi if test -z "$enable_profiling" ; then enable_profiling="no" elif test "$enable_profiling" = "yes" ; then CXXFLAGS="${CXXFLAGS} -p" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_profiling" >&5 $as_echo "$enable_profiling" >&6; } if test $ost_cv_gnuwin32 = yes ; then CCXX_DIR="\$(top_srcdir)/w32" else if test $np_cv_prog_msc = yes ; then CCXX_DIR="\$(top_srcdir)/w32" else CCXX_DIR="\$(top_srcdir)/inc" fi fi KDOC_DIR="\$(top_srcdir)/doc" if test $ost_cv_gnuwin32 = yes; then WIN32_TRUE= WIN32_FALSE='#' else WIN32_TRUE='#' WIN32_FALSE= fi if test $ost_cv_extras = yes; then EXTRAS_TRUE= EXTRAS_FALSE='#' else EXTRAS_TRUE='#' EXTRAS_FALSE= fi # some peculiar things needed for cygwin dll builds and the currently broken toolchain... SHARED_FLAGS="" MODULE_FLAGS="-module -shared -avoid-version" STAGE2="" BASE_LIB="" case "$target_os" in osf*) COMMON_FLAGS="$COMMON_FLAGS -D_POSIX_C_SOURCE=1 -D_OSF_SOURCE=1 -D__USE_STD_IOSTREAM" ;; cygwin*|mingw*) BASE_LIB="../src/libccgnu2.la $XML_LIBS $ZSTREAM_LIBS $SSL_LIBS" $as_echo "#define CYGWIN_IMPORTS 1" >>confdefs.h SHARED_FLAGS="-no-undefined" MODULE_FLAGS="-module -shared -avoid-version -no-undefined" ;; darwin6*) MODULE_FLAGS="-dynamic -bundle -undefined suppress -flat_namespace -read_only_relocs suppress" STAGE2="macosx" $as_echo "#define _DARWIN6_ 1" >>confdefs.h ;; darwin*) MODULE_FLAGS="-dynamic -bundle -undefined suppress -flat_namespace -read_only_relocs suppress" ;; linux*) BASE_LIB="../src/libccgnu2.la" ;; esac etc_confdir="$sysconfdir" result="***" prior="A" while test "$prior" != "$result" ; do prior=`(echo "$etc_confdir")` etc_confdir=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""$etc_confdir"\" )` result=`(echo "$etc_confdir")` done if test "$sysconfdir" != '${prefix}/etc' ; then cat >>confdefs.h <<_ACEOF #define ETC_PREFIX "$etc_confdir/" _ACEOF elif test "$sysconfdir" != '/etc' ; then cat >>confdefs.h <<_ACEOF #define ETC_CONFDIR "$etc_confdir/" _ACEOF fi # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; 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_path_DOXYGEN+set}" = set; then : $as_echo_n "(cached) " >&6 else case $DOXYGEN in [\\/]* | ?:[\\/]*) ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" $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 test -z "$ac_cv_path_DOXYGEN" && ac_cv_path_DOXYGEN="no" ;; esac fi DOXYGEN=$ac_cv_path_DOXYGEN if test -n "$DOXYGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 $as_echo "$DOXYGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$DOXYGEN" != "no"; then DOXY_TRUE= DOXY_FALSE='#' else DOXY_TRUE='#' DOXY_FALSE= fi if test ! -z "$LIBGETOPTOBJS"; then GETOPT_LONG_TRUE= GETOPT_LONG_FALSE='#' else GETOPT_LONG_TRUE='#' GETOPT_LONG_FALSE= fi LIB_VERSION=`echo $LT_RELEASE | sed -e 's/\./_/'` LIB_MAJOR=`echo $LT_VERSION | sed -e 's/:.*$//'` ac_config_files="$ac_config_files src/ccgnu2-config src/libccext2.pc src/libccgnu2.pc src/Makefile w32/Makefile w32/vs2008/Makefile w32/vs2008/ccext2.vcproj w32/vs2008/ccgnu2.vcproj w32/vs2008/common.sln m4/Makefile doc/Doxyfile doc/Makefile demo/Makefile inc/Makefile inc/cc++/Makefile Makefile commoncpp2.spec tests/Makefile commoncpp2.list w32/ccgnu2.dsp w32/ccext2.dsp w32/ccgnu2.vcproj w32/ccext2.vcproj" 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 -z "${MSWIN32_TRUE}" && test -z "${MSWIN32_FALSE}"; then as_fn_error "conditional \"MSWIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__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 -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_CPPUNIT_TESTS_TRUE}" && test -z "${WITH_CPPUNIT_TESTS_FALSE}"; then as_fn_error "conditional \"WITH_CPPUNIT_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then as_fn_error "conditional \"WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXTRAS_TRUE}" && test -z "${EXTRAS_FALSE}"; then as_fn_error "conditional \"EXTRAS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DOXY_TRUE}" && test -z "${DOXY_FALSE}"; then as_fn_error "conditional \"DOXY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GETOPT_LONG_TRUE}" && test -z "${GETOPT_LONG_FALSE}"; then as_fn_error "conditional \"GETOPT_LONG\" 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 # # 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' AS='`$ECHO "X$AS" | $Xsed -e "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "X$DLLTOOL" | $Xsed -e "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_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"`' 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 \ 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' AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _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 "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "src/ccgnu2-config") CONFIG_FILES="$CONFIG_FILES src/ccgnu2-config" ;; "src/libccext2.pc") CONFIG_FILES="$CONFIG_FILES src/libccext2.pc" ;; "src/libccgnu2.pc") CONFIG_FILES="$CONFIG_FILES src/libccgnu2.pc" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "w32/Makefile") CONFIG_FILES="$CONFIG_FILES w32/Makefile" ;; "w32/vs2008/Makefile") CONFIG_FILES="$CONFIG_FILES w32/vs2008/Makefile" ;; "w32/vs2008/ccext2.vcproj") CONFIG_FILES="$CONFIG_FILES w32/vs2008/ccext2.vcproj" ;; "w32/vs2008/ccgnu2.vcproj") CONFIG_FILES="$CONFIG_FILES w32/vs2008/ccgnu2.vcproj" ;; "w32/vs2008/common.sln") CONFIG_FILES="$CONFIG_FILES w32/vs2008/common.sln" ;; "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "doc/Doxyfile") CONFIG_FILES="$CONFIG_FILES doc/Doxyfile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "demo/Makefile") CONFIG_FILES="$CONFIG_FILES demo/Makefile" ;; "inc/Makefile") CONFIG_FILES="$CONFIG_FILES inc/Makefile" ;; "inc/cc++/Makefile") CONFIG_FILES="$CONFIG_FILES inc/cc++/Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "commoncpp2.spec") CONFIG_FILES="$CONFIG_FILES commoncpp2.spec" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "commoncpp2.list") CONFIG_FILES="$CONFIG_FILES commoncpp2.list" ;; "w32/ccgnu2.dsp") CONFIG_FILES="$CONFIG_FILES w32/ccgnu2.dsp" ;; "w32/ccext2.dsp") CONFIG_FILES="$CONFIG_FILES w32/ccext2.dsp" ;; "w32/ccgnu2.vcproj") CONFIG_FILES="$CONFIG_FILES w32/ccgnu2.vcproj" ;; "w32/ccext2.vcproj") CONFIG_FILES="$CONFIG_FILES w32/ccext2.vcproj" ;; *) 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 "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 # Assembler program. AS=$AS # DLL creation program. DLLTOOL=$DLLTOOL # Object dumper program. OBJDUMP=$OBJDUMP # 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 # 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 ;; "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 } ;; 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 # if test ! -f inc/cc++/thread.h ; then # cp ${srcdir}/inc/cc++/*.h inc/cc++ ; fi cd inc rm -f config.tmp cp ../config.h config.tmp sed -e s!"@thrprefix@"!"$thrprefix"! -e s!"@USR_PREFIX@"!"$prefix"! \ -e s!PACKAGE!CCXX_PACKAGE! -e s!VERSION!CCXX_VERSION! cc++/config.h cd .. # # Visual Studio # DLLVERSION=`echo "$LT_RELEASE" | sed -e 's/\.//'g` # # Visual Studio 2008 # rm -f w32/vs2008/ccext2.vcproj.tmp w32/vs2008/ccgnu2.vcproj.tmp cp -p w32/vs2008/ccext2.vcproj w32/vs2008/ccext2.vcproj.tmp cp -p w32/vs2008/ccgnu2.vcproj w32/vs2008/ccgnu2.vcproj.tmp sed -e s/VCVERSION/$VERSION/g < w32/vs2008/ccext2.vcproj.tmp > w32/vs2008/ccext2.vcproj sed -e s/VCVERSION/$VERSION/g < w32/vs2008/ccgnu2.vcproj.tmp > w32/vs2008/ccgnu2.vcproj cp -p w32/vs2008/ccext2.vcproj w32/vs2008/ccext2.vcproj.tmp cp -p w32/vs2008/ccgnu2.vcproj w32/vs2008/ccgnu2.vcproj.tmp sed -e s/DLLVERSION/$DLLVERSION/g < w32/vs2008/ccext2.vcproj.tmp > w32/vs2008/ccext2.vcproj sed -e s/DLLVERSION/$DLLVERSION/g < w32/vs2008/ccgnu2.vcproj.tmp > w32/vs2008/ccgnu2.vcproj rm -f w32/vs2008/ccext2.vcproj.tmp w32/vs2008/ccgnu2.vcproj.tmp # # Visual Studio 2005 # rm -f w32/ccext2.vcproj.tmp w32/ccgnu2.vcproj.tmp cp -p w32/ccext2.vcproj w32/ccext2.vcproj.tmp cp -p w32/ccgnu2.vcproj w32/ccgnu2.vcproj.tmp sed -e s/VCVERSION/$VERSION/g < w32/ccext2.vcproj.tmp > w32/ccext2.vcproj sed -e s/VCVERSION/$VERSION/g < w32/ccgnu2.vcproj.tmp > w32/ccgnu2.vcproj cp -p w32/ccext2.vcproj w32/ccext2.vcproj.tmp cp -p w32/ccgnu2.vcproj w32/ccgnu2.vcproj.tmp sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccext2.vcproj.tmp > w32/ccext2.vcproj sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccgnu2.vcproj.tmp > w32/ccgnu2.vcproj rm -f w32/ccext2.vcproj.tmp w32/ccgnu2.vcproj.tmp # # Visual Studio 6 # rm -f w32/ccext2.dsp.tmp w32/ccgnu2.dsp.tmp cp -p w32/ccext2.dsp w32/ccext2.dsp.tmp cp -p w32/ccgnu2.dsp w32/ccgnu2.dsp.tmp sed -e s/VCVERSION/$VERSION/g < w32/ccext2.dsp.tmp > w32/ccext2.dsp sed -e s/VCVERSION/$VERSION/g < w32/ccgnu2.dsp.tmp > w32/ccgnu2.dsp cp -p w32/ccext2.dsp w32/ccext2.dsp.tmp cp -p w32/ccgnu2.dsp w32/ccgnu2.dsp.tmp sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccext2.dsp.tmp > w32/ccext2.dsp sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccgnu2.dsp.tmp > w32/ccgnu2.dsp rm -f w32/ccext2.dsp.tmp w32/ccgnu2.dsp.tmp commoncpp2-1.8.1/w32/0000755000175000017500000000000011463572774011232 500000000000000commoncpp2-1.8.1/w32/demo/0000755000175000017500000000000011463572774012156 500000000000000commoncpp2-1.8.1/w32/demo/urlfetch.vcproj0000755000175000017500000001247711463314535015142 00000000000000 commoncpp2-1.8.1/w32/demo/tcpthread.vcproj0000755000175000017500000001241311463314535015272 00000000000000 commoncpp2-1.8.1/w32/demo/xmlfetch.vcproj0000755000175000017500000001247711463314535015140 00000000000000 commoncpp2-1.8.1/w32/demo/slogTest.vcproj0000755000175000017500000001245111463314535015122 00000000000000 commoncpp2-1.8.1/w32/demo/xmlfetch.dsp0000644000175000017500000000725511463314535014416 00000000000000# Microsoft Developer Studio Project File - Name="xmlfetch" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=xmlfetch - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "xmlfetch.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "xmlfetch.mak" CFG="xmlfetch - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "xmlfetch - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "xmlfetch - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "xmlfetch - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\xmlfetch" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib ccext2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "xmlfetch - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\xmlfetch" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccext2.lib ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "xmlfetch - Win32 Release" # Name "xmlfetch - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\xmlfetch.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/SampleSocketPort.vcproj0000755000175000017500000001256311463314535016561 00000000000000 commoncpp2-1.8.1/w32/demo/urlfetch.dsp0000644000175000017500000000725511463314535014420 00000000000000# Microsoft Developer Studio Project File - Name="urlfetch" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=urlfetch - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "urlfetch.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "urlfetch.mak" CFG="urlfetch - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "urlfetch - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "urlfetch - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "urlfetch - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\urlfetch" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib ccext2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "urlfetch - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\urlfetch" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccext2.lib ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "urlfetch - Win32 Release" # Name "urlfetch - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\urlfetch.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/tcpservice.dsp0000644000175000017500000000733111463314535014746 00000000000000# Microsoft Developer Studio Project File - Name="tcpservice" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=tcpservice - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "tcpservice.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "tcpservice.mak" CFG="tcpservice - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "tcpservice - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "tcpservice - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "tcpservice - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\tcps" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccext2.lib ccgnu2.lib kernel32.lib ws2_32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "tcpservice - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\tcps" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "tcpservice - Win32 Release" # Name "tcpservice - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\tcpservice.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/crc32.dsp0000644000175000017500000000723711463314535013520 00000000000000# Microsoft Developer Studio Project File - Name="crc32" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=crc32 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "crc32.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "crc32.mak" CFG="crc32 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "crc32 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "crc32 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "crc32 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\crc32" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib ccext2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "crc32 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\crc32" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccext2.lib ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "crc32 - Win32 Release" # Name "crc32 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\crc32.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/slogTest.dsp0000644000175000017500000000722711463314535014407 00000000000000# Microsoft Developer Studio Project File - Name="slogTest" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=slogTest - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "slogTest.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "slogTest.mak" CFG="slogTest - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "slogTest - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "slogTest - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "slogTest - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\slogtest" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "slogTest - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\slogtest" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "slogTest - Win32 Release" # Name "slogTest - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\slogTest.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/tcpthread.dsp0000644000175000017500000000723311463314535014556 00000000000000# Microsoft Developer Studio Project File - Name="tcpthread" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=tcpthread - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "tcpthread.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "tcpthread.mak" CFG="tcpthread - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "tcpthread - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "tcpthread - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "tcpthread - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\tcpt" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "tcpthread - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\tcpt" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "tcpthread - Win32 Release" # Name "tcpthread - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\tcpthread.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/netdevices.vcproj0000755000175000017500000001115611463314535015450 00000000000000 commoncpp2-1.8.1/w32/demo/tcpservice.vcproj0000755000175000017500000001245311463314535015467 00000000000000 commoncpp2-1.8.1/w32/demo/netdevices.dsp0000644000175000017500000000726611463314535014737 00000000000000# Microsoft Developer Studio Project File - Name="netdevices" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=netdevices - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "netdevices.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "netdevices.mak" CFG="netdevices - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "netdevices - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "netdevices - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "netdevices - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\netdev" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "netdevices - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\netdev" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccext2.lib ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "netdevices - Win32 Release" # Name "netdevices - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\netdevices.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/tcp.vcproj0000755000175000017500000001230511463314535014102 00000000000000 commoncpp2-1.8.1/w32/demo/SampleSocketPort.dsp0000644000175000017500000000755711463314535016050 00000000000000# Microsoft Developer Studio Project File - Name="SampleSocketPort" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=SampleSocketPort - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "SampleSocketPort.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "SampleSocketPort.mak" CFG="SampleSocketPort - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "SampleSocketPort - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "SampleSocketPort - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "SampleSocketPort - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\ssp" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib ccext2.lib ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "SampleSocketPort - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\ssp" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccext2.lib ws2_32.lib ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "SampleSocketPort - Win32 Release" # Name "SampleSocketPort - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\SampleSocketPort.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/tcp.dsp0000644000175000017500000000712111463314535013362 00000000000000# Microsoft Developer Studio Project File - Name="tcp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=tcp - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "tcp.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "tcp.mak" CFG="tcp - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "tcp - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "tcp - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "tcp - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\tcp" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "tcp - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug\tcp" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "tcp - Win32 Release" # Name "tcp - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\tcp.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/buffer.vcproj0000755000175000017500000001234411463314535014570 00000000000000 commoncpp2-1.8.1/w32/demo/buffer.dsp0000644000175000017500000000717311463314535014054 00000000000000# Microsoft Developer Studio Project File - Name="buffer" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=buffer - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "buffer.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "buffer.mak" CFG="buffer - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "buffer - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "buffer - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "buffer - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release\buffer" # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib ccext2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "buffer - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug/buffer" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "buffer - Win32 Release" # Name "buffer - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\demo\buffer.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/demo/crc32.vcproj0000755000175000017500000001240311463314535014227 00000000000000 commoncpp2-1.8.1/w32/debug.bat0000644000175000017500000000374511463314535012726 00000000000000@echo off rem bootstrap framework when no pre-packaged setup.exe is available rem we use a default configuration and copy the "debug" version of libs echo Bootstrapping Framework from Debugging Libraries if exist "C:\Program Files\GNU Telephony" goto common echo Creating C:\Program Files\GNU Telephony... mkdir "C:\Program Files\GNU Telephony" mkdir "C:\Program Files\GNU Telephony\CAPE Framework" mkdir "C:\Program Files\GNU Telephony\CAPE Framework\Include" mkdir "C:\Program Files\GNU Telephony\CAPE Framework\Include\cc++" mkdir "C:\Program Files\GNU Telephony\CAPE Framework\Compat" mkdir "C:\Program Files\GNU Telephony\CAPE Framework\Import" :common if exist "C:\Program Files\Common Files\CAPE Framework" goto include echo Creating C:\Program Files\Common Files\CAPE Framework... mkdir "C:\Program Files\Common Files\CAPE Framework" mkdir "C:\Program Files\Common Files\CAPE Framework\Common" mkdir "C:\Program Files\Common Files\CAPE Framework\Compat" :include echo Copying include files... copy /y ..\include\cc++\*.h "C:\Program Files\GNU Telephony\CAPE Framework\Include\cc++" >nul copy /y cc++\config.h "C:\Program Files\GNU Telephony\CAPE Framework\Include\cc++" >nul copy /y ..\src\getopt.h "C:\Program Files\GNU Telephony\CAPE Framework\Include" >nul if not exist debug6\ccext2.lib goto import echo Copying compat import libs... copy /y debug6\cc*.lib "C:\Program Files\GNU Telephony\CAPE Framework\Compat" >nul :import if not exist debug\ccext2.lib goto compat echo Copying common import libs... copy /y debug\cc*.lib "C:\Program Files\GNU Telephony\CAPE Framework\Import" >nul :compat if not exist debug6\ccext2.dll goto runtime echo Copying compat runtime files... copy /y debug6\cc*.dll "C:\Program Files\Common Files\CAPE Framework\Compat" >nul :runtime if not exist debug\ccext2.dll goto finish echo Copying common runtime files... copy /y debug\cc*.dll "C:\Program Files\Common Files\CAPE Framework\Common" >nul :finish echo Updating registry... regedit /s common.reg commoncpp2-1.8.1/w32/Makefile.gcc0000644000175000017500000001000211463314535013323 00000000000000# Copyright (C) 2002 Open Source Telecom Corporation. # # This file is free software; as a special exception the author 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. # A makefile to do a mingw32 cross compile build of dll's. HAVE = -I$(prefix)/include/libxml VPATH = ../w32:../src:../demo:../tests OPATH = ../w32 ARCH = i586-mingw32msvc- prefix = /usr/i586-mingw32msvc CXX = $(ARCH)c++ AS = $(ARCH)as DLLTOOL = $(ARCH)dlltool DLLWRAP = $(ARCH)dllwrap WINDRES = $(ARCH)windres STRIP = $(ARCH)strip exeext = .exe dllext = .dll CPPFLAGS = -I. -I../include $(HAVE) -DHAVE_CONFIG_H -D_GNU_SOURCE CXXFLAGS = -include ../w32/cc++/config.h -g -O2 -mthreads LDFLAGS = -L$(prefix)/dll -lccgnu2 -lccext2 -lws2_32 CCGNU2_LDFLAGS = -L$(prefix)/dll -lws2_32 CCEXT2_LDFLAGS = -L. -L$(prefix)/dll -lccgnu2 -lxml2 -liberty -lws2_32 #LDEXEC = -L$(OPATH) -lccgnu2 $(LDFLAGS) CCGNU2_DLL_NAME = ccgnu2.dll CCEXT2_DLL_NAME = ccext2.dll CCGNU2_DLL_LIB = libccgnu2.a CCEXT2_DLL_LIB = libccext2.a CCGNU2_DLL_DEF = ccgnu2.def CCEXT2_DLL_DEF = ccext2.def PROGS = hello.exe test.exe tcp.exe tcpthread.exe tcpservice.exe \ urlfetch.exe xmlfetch.exe SampleSocketPort.exe crc32.exe shadigest.exe # pio.exe requires some iostream related headers missing in MinGW # cmdlineopt will not compile on non-posix systems! #SERIAL_PROG: serial.exe #serial.exe: serialmain.o serialecho.o # $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -L. -lccgnu2 $(LDFLAGS) -o $@ # serial uses "/dev/modem" TESTS = bug1.exe bug2.exe thread1.exe thread2.exe tcpstr1.exe url1.exe all: $(CCGNU2_DLL_NAME) $(CCEXT2_DLL_NAME) $(PROGS) $(SERIAL_PROG) $(TESTS) SHDRS = thread.h socket.h exception.h cmdoptns.h digest.h export.h file.h \ groups.h misc.h numbers.h persist.h slog.h url.h urlstring.h xml.h \ serial.h strchar.h HDRS = cc++/config.h $(addprefix ../include/cc++/, $(SHDRS)) CCGNU2_OBJS = thread.o mutex.o semaphore.o threadkey.o \ friends.o event.o slog.o dir.o file.o inaddr.o \ peer.o port.o socket.o simplesocket.o network.o \ serial.o mempager.o keydata.o dso.o exception.o \ process.o urlstring.o CCEXT2_OBJS = buffer.o fifo.o pipe.o numbers.o \ cmdoptns.o url.o xml.o persist.o engine.o digest.o sha.o \ date.o groups.o md5.o unix.o ftp.o # pios.o pio_globals.o CCGNU2_DLLWRAP_FLAGS = --export-all --output-def $(CCGNU2_DLL_DEF) \ --implib $(CCGNU2_DLL_LIB) --driver-name $(CXX) CCEXT2_DLLWRAP_FLAGS = --export-all --output-def $(CCEXT2_DLL_DEF) \ --implib $(CCEXT2_DLL_LIB) --driver-name $(CXX) $(CCGNU2_DLL_NAME) $(CCGNU2_DLL_DEF) $(CCGNU2_DLL_LIB): $(addprefix $(OPATH)/, $(CCGNU2_OBJS)) $(DLLWRAP) $(CCGNU2_DLLWRAP_FLAGS) -o $(CCGNU2_DLL_NAME) \ $(CCGNU2_OBJS) libgnu2.o $(CCGNU2_LDFLAGS) $(CCEXT2_DLL_NAME) $(CCEXT2_DLL_DEF) $(CCEXT2_DLL_LIB): $(addprefix $(OPATH)/, $(CCEXT2_OBJS)) libgnu2.o $(DLLWRAP) $(CCEXT2_DLLWRAP_FLAGS) -o $(CCEXT2_DLL_NAME) \ $(CCEXT2_OBJS) libgnu2.o $(CCEXT2_LDFLAGS) #libgnu2.o: ccgnu2.rc # $(WINDRES) -o libgnu2.o ccgnu2.rc $(OPATH)/%.o: %.cpp $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $(OPATH)/$(basename $@).o $< %.exe: %.cpp $(CXX) $(CPPFLAGS) $(CXXFLAGS) $< -L. -lccgnu2 $(LDFLAGS) -o $@ clean: -rm -f $(CCGNU2_OBJS) $(CCEXT2_OBJS) \ $(CCGNU2_DLL_NAME) $(CCEXT2_DLL_NAME) \ $(CCGNU2_DLL_LIB) $(CCEXT2_DLL_LIB) \ $(CCGNU2_DLL_DEF) $(CCEXT2_DLL_DEF) \ $(PROGS) install: -mkdir $(prefix)/include/cc++ -mkdir $(prefix)/dll cp -af $(HDRS) $(prefix)/include/cc++ cp -af $(CCGNU2_DLL_LIB) $(CCGNU2_DLL_NAME) $(CCEXT2_DLL_LIB) $(CCEXT2_DLL_NAME) $(prefix)/dll cp -af $(CCGNU2_DLL_LIB) $(prefix)/lib/libccgnu2dll.a cp -af $(CCEXT2_DLL_LIB) $(prefix)/lib/libccext2dll.a $(STRIP) $(prefix)/dll/$(CCGNU2_DLL_NAME) $(prefix)/dll/$(CCEXT2_DLL_NAME) ar -rs $(prefix)/lib/$(CCGNU2_DLL_LIB) $(CCGNU2_OBJS) ar -rs $(prefix)/lib/$(CCEXT2_DLL_LIB) $(CCEXT2_OBJS) commoncpp2-1.8.1/w32/cc++/0000755000175000017500000000000011463572774011745 500000000000000commoncpp2-1.8.1/w32/cc++/config.h0000644000175000017500000001713311463413517013275 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #ifndef CCXX_CONFIG_H_ #define CCXX_CONFIG_H_ #define CCXX_PACKED #define CCXX_PACKING // Config option: uncomment this line if you want to use static linkage! //#define CCXX_STATIC // define automatically WIN32 for windows application compiled with Borland #ifndef WIN32 # if defined(__BORLANDC__) && defined(_Windows) # define WIN32 # elif defined(_MSC_VER) && defined(_WIN32) # define WIN32 # endif #endif #pragma warning(disable: 4996) #pragma warning(disable: 4355) // check multithreading #if defined(__BORLANDC__) && !defined(__MT__) # error Please enable multithreading #endif #if defined(_MSC_VER) && !defined(_MT) # error Please enable multithreading (Project -> Settings -> C/C++ -> Code Generation -> Use Runtime Library) #endif // check DLL compiling #ifdef _MSC_VER #ifndef CCXX_STATIC # ifndef _DLL # error Please enable DLL linking (Project -> Settings -> C/C++ -> Code Generation -> Use Runtime Library) # endif #endif #endif #ifndef CCXX_WIN32 #define CCXX_WIN32 /** * @todo Why may be need using kernel object Mutex as a background for ost::Mutex? */ // Select the way, that the ost::Mutex based on. //#define MUTEX_UNDERGROUND_WIN32_MUTEX #define MUTEX_UNDERGROUND_WIN32_CRITICALSECTION /* http://msdn.microsoft.com/library/en-us/winprog/winprog/using_the_windows_headers.asp Minimum system required Macros to define Windows "Longhorn" _WIN32_WINNT >= 0x0600 WINVER >= 0x0600 Windows Server 2003 _WIN32_WINNT> = 0x0502 WINVER >= 0x0502 Windows XP _WIN32_WINNT >= 0x0501 WINVER >= 0x0501 Windows 2000 _WIN32_WINNT >= 0x0500 WINVER >= 0x0500 Windows NT 4.0 _WIN32_WINNT >= 0x0400 WINVER >= 0x0400 Windows Me _WIN32_WINDOWS >= 0x0500 WINVER >= 0x0500 Windows 98 _WIN32_WINDOWS >= 0x0410 WINVER >= 0x0410 Windows 95 _WIN32_WINDOWS >= 0x0400 WINVER >= 0x0400 Faster Builds with Smaller Header Files WIN32_LEAN_AND_MEAN */ // Require for compiling with critical sections. #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif // Make sure we're consistent with _WIN32_WINNT #ifndef WINVER #define WINVER _WIN32_WINNT #endif #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #define _CCXX_WIN32_LEAN_AND_MEAN_ #endif #include #include #ifdef _CCXX_WIN32_LEAN_AND_MEAN_ #undef WIN32_LEAN_AND_MEAN #undef _CCXX_WIN32_LEAN_AND_MEAN_ #endif #if _WIN32_WINNT >= 0x0501 #define CCXX_IPV6 #endif #endif /* #ifndef CCXX_WIN32 */ #ifdef WIN32 #ifndef ssize_t #define ssize_t int #endif #endif #undef __DLLRTL #undef CCXX_EMPTY #define CCXX_EMPTY #if defined(__MINGW32__) && !defined(__MSVCRT__) #define CCXX_NOMSVCRT #endif #if defined(__MINGW32__) || defined(__CYGWIN32__) #define HAVE_OLD_IOSTREAM #define HAVE_LIBXML #undef __LOCAL #undef __EXPORT #undef __stdcall #define __stdcall #define __EXPORT #define __LOCAL typedef char int8; typedef short int16; typedef long int32; typedef long long int64; typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned long uint32; typedef unsigned long long uint64; #ifdef __MINGW32__ # define HAVE_MODULES 1 # define alloca(x) __builtin_alloca(x) # define THROW(x) throw x # define THROWS(x) throw(x) # define NEW_THROWS throw() # define THROWS_EMPTY throw() typedef unsigned int uint; # define snprintf _snprintf # ifndef ETC_PREFIX # define ETC_PREFIX "c:/" # endif #else /* #ifndef __MINGW32__ */ typedef DWORD size_t; #endif /* #ifndef __MINGW32__ */ #else /* !defined(__MINGW32__) && !defined(__CYGWIN32__) */ #ifdef CCXX_STATIC #define __DLLRTL #define __EXPORT #define __LOCAL #define __EXPORT_TEMPLATE(x) #else #define __DLLRTL __declspec(dllexport) #define __EXPORT __declspec(dllimport) #define __EXPORT_TEMPLATE(x) template class __EXPORT x; #define __LOCAL #endif #if !defined(_MSC_VER) || _MSC_VER >= 1300 #define HAVE_GETADDRINFO #endif #define HAVE_MEMMOVE #define HAVE_SNPRINTF #define snprintf _snprintf #if defined(_MSC_VER) && _MSC_VER < 1500 #define vsnprintf _vsnprintf #endif typedef __int8 int8; typedef __int16 int16; typedef __int32 int32; typedef __int64 int64; typedef unsigned int uint; typedef unsigned __int8 uint8; typedef unsigned __int16 uint16; typedef unsigned __int32 uint32; typedef unsigned __int64 uint64; #define SECS_BETWEEN_EPOCHS ((__int64)(11644473600)) #define SECS_TO_100NS ((__int64)(10000000)) #define THROW(x) throw x #define THROWS(x) throw(x) #define USING(x) #define NEW_THROWS throw() #define THROWS_EMPTY throw() #define HAVE_MODULES 1 #undef HAVE_PTHREAD_RWLOCK #undef PTHREAD_MUTEXTYPE_RECURSIVE // define endian macros #define __BYTE_ORDER __LITTLE_ENDIAN #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 #define __BYTE_ALIGNMENT 1 #pragma warning (disable:4786) #if _MSC_VER >= 1300 #pragma warning (disable:4290) #endif #ifndef ETC_PREFIX #define ETC_PREFIX "c:/" #endif #endif /* !defined(__MINGW32__) && !defined(__CYGWIN32__) */ // have exceptions #ifdef CCXX_NO_EXCEPTIONS #undef CCXX_EXCEPTIONS #else #define CCXX_EXCEPTIONS 1 #endif // use namespace #define CCXX_NAMESPACES 1 #define COMMON_DEADLOCK_DEBUG #define COMMON_TPPORT_TYPE_DEFINED #define CCXX_HAVE_NEW_INIT #define HAVE_SSTREAM #define HAVE_EXCEPTION #ifdef __BORLANDC__ #define HAVE_LOCALTIME_R #endif #endif /* #ifndef CCXX_CONFIG_H_ */ /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/w32/vs2008/0000755000175000017500000000000011463572774012174 500000000000000commoncpp2-1.8.1/w32/vs2008/common.sln.in0000755000175000017500000000275311463314535014526 00000000000000 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual C++ Express 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccext2", "ccext2.vcproj", "{A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}" ProjectSection(ProjectDependencies) = postProject {CF601087-6128-4F19-8A79-FBA3A01D0A29} = {CF601087-6128-4F19-8A79-FBA3A01D0A29} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccgnu2", "ccgnu2.vcproj", "{CF601087-6128-4F19-8A79-FBA3A01D0A29}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Debug|Win32.ActiveCfg = Debug|Win32 {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Debug|Win32.Build.0 = Debug|Win32 {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Release|Win32.ActiveCfg = Release|Win32 {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Release|Win32.Build.0 = Release|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Debug|Win32.ActiveCfg = Debug|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Debug|Win32.Build.0 = Debug|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Release|Win32.ActiveCfg = Release|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal commoncpp2-1.8.1/w32/vs2008/Makefile.am0000644000175000017500000000113311463314535014133 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # # This file is free software; as a special exception the author 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. MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = ccext2.vcproj ccgnu2.vcproj common.sln INCLUDES = -I$(CCXX_DIR) commoncpp2-1.8.1/w32/vs2008/ccext2.vcproj.in0000755000175000017500000006245711463314535015144 00000000000000 commoncpp2-1.8.1/w32/vs2008/ccgnu2.vcproj0000644000175000017500000011347611463364532014525 00000000000000 commoncpp2-1.8.1/w32/vs2008/Makefile.in0000644000175000017500000003032011463364513014145 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = w32/vs2008 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/ccext2.vcproj.in $(srcdir)/ccgnu2.vcproj.in \ $(srcdir)/common.sln.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = ccext2.vcproj ccgnu2.vcproj common.sln CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = ccext2.vcproj ccgnu2.vcproj common.sln INCLUDES = -I$(CCXX_DIR) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu w32/vs2008/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu w32/vs2008/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ccext2.vcproj: $(top_builddir)/config.status $(srcdir)/ccext2.vcproj.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ ccgnu2.vcproj: $(top_builddir)/config.status $(srcdir)/ccgnu2.vcproj.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ common.sln: $(top_builddir)/config.status $(srcdir)/common.sln.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(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 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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool 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-generic \ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: commoncpp2-1.8.1/w32/vs2008/common.sln0000644000175000017500000000275311463364532014120 00000000000000 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual C++ Express 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccext2", "ccext2.vcproj", "{A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}" ProjectSection(ProjectDependencies) = postProject {CF601087-6128-4F19-8A79-FBA3A01D0A29} = {CF601087-6128-4F19-8A79-FBA3A01D0A29} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccgnu2", "ccgnu2.vcproj", "{CF601087-6128-4F19-8A79-FBA3A01D0A29}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Debug|Win32.ActiveCfg = Debug|Win32 {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Debug|Win32.Build.0 = Debug|Win32 {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Release|Win32.ActiveCfg = Release|Win32 {A67E8AE2-1E5A-43B6-8FD8-1C67E937A391}.Release|Win32.Build.0 = Release|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Debug|Win32.ActiveCfg = Debug|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Debug|Win32.Build.0 = Debug|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Release|Win32.ActiveCfg = Release|Win32 {CF601087-6128-4F19-8A79-FBA3A01D0A29}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal commoncpp2-1.8.1/w32/vs2008/ccgnu2.vcproj.in0000755000175000017500000011361611463314535015127 00000000000000 commoncpp2-1.8.1/w32/vs2008/ccext2.vcproj0000644000175000017500000006237711463364532014537 00000000000000 commoncpp2-1.8.1/w32/Makefile.am0000644000175000017500000000223311463314535013173 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. MAINTAINERCLEANFILES = Makefile.in Makefile SUBDIRS=vs2008 EXTRA_DIST = cc++/config.h \ common.dsw ccgnu2.dsp ccext2.dsp common.sln *.vcproj demo/*.vcproj \ tests/*.dsp demo/*.dsp Makefile.gcc Makefile.bcc common.reg *.bat INCLUDES = -I$(CCXX_DIR) # freddy77, now use posix dirs, gnuwin32 not tested #lib_LTLIBRARIES = libccxx.la libccio.la #libccxx_la_SOURCES = inaddr.cpp socket.cpp peer.cpp mutex.cpp event.cpp \ # thread.cpp buffer.cpp threadkey.cpp url.cpp config.cpp #libccio_la_SOURCES = pipe.cpp file.cpp #libccxx_la_LDFLAGS = -lwsock32 #pkginclude_HEADERS = thread.h socket.h common.h file.h url.h #noinst_HEADERS = export.h commoncpp2-1.8.1/w32/ccext2.vcproj.in0000755000175000017500000006220011463314535014164 00000000000000 commoncpp2-1.8.1/w32/ccgnu2.vcproj0000644000175000017500000011302511463364532013551 00000000000000 commoncpp2-1.8.1/w32/Makefile.in0000644000175000017500000004775611463364513013230 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = w32 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/ccext2.dsp.in $(srcdir)/ccext2.vcproj.in \ $(srcdir)/ccgnu2.dsp.in $(srcdir)/ccgnu2.vcproj.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = ccgnu2.dsp ccext2.dsp ccgnu2.vcproj ccext2.vcproj 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 ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in Makefile SUBDIRS = vs2008 EXTRA_DIST = cc++/config.h \ common.dsw ccgnu2.dsp ccext2.dsp common.sln *.vcproj demo/*.vcproj \ tests/*.dsp demo/*.dsp Makefile.gcc Makefile.bcc common.reg *.bat INCLUDES = -I$(CCXX_DIR) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu w32/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu w32/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): ccgnu2.dsp: $(top_builddir)/config.status $(srcdir)/ccgnu2.dsp.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ ccext2.dsp: $(top_builddir)/config.status $(srcdir)/ccext2.dsp.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ ccgnu2.vcproj: $(top_builddir)/config.status $(srcdir)/ccgnu2.vcproj.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ ccext2.vcproj: $(top_builddir)/config.status $(srcdir)/ccext2.vcproj.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile 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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 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) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # freddy77, now use posix dirs, gnuwin32 not tested #lib_LTLIBRARIES = libccxx.la libccio.la #libccxx_la_SOURCES = inaddr.cpp socket.cpp peer.cpp mutex.cpp event.cpp \ # thread.cpp buffer.cpp threadkey.cpp url.cpp config.cpp #libccio_la_SOURCES = pipe.cpp file.cpp #libccxx_la_LDFLAGS = -lwsock32 #pkginclude_HEADERS = thread.h socket.h common.h file.h url.h #noinst_HEADERS = export.h # 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: commoncpp2-1.8.1/w32/ccext2.dsp0000644000175000017500000001432711463364532013050 00000000000000# Microsoft Developer Studio Project File - Name="ccext2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=ccext2 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ccext2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ccext2.mak" CFG="ccext2 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ccext2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "ccext2 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "ccext2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release\ccext2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "..\w32" /I "..\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /machine:I386 # ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /version:1.8.1 /dll /machine:I386 /out:"Release/CapeExtras18.dll" /libpath:"Release" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "ccext2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug/ccext2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\w32" /I "..\inc" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /FR /YX /FD /GZ /out:"debug/ccext2d.dll" /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /version:1.8.1 /dll /debug /machine:I386 /out:"Debug/CapeExtras18d.dll" /pdbtype:sept /libpath:"Debug" # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "ccext2 - Win32 Release" # Name "ccext2 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\src\cmdoptns.cpp # End Source File # Begin Source File SOURCE=..\src\date.cpp # End Source File # Begin Source File SOURCE=..\src\digest.cpp # End Source File # Begin Source File SOURCE=..\src\engine.cpp # End Source File # Begin Source File SOURCE=..\src\getopt.c # End Source File # Begin Source File SOURCE=..\src\getopt1.c # End Source File # Begin Source File SOURCE=..\src\md5.cpp # End Source File # Begin Source File SOURCE=..\src\mime.cpp # End Source File # Begin Source File SOURCE=..\src\network.cpp # End Source File # Begin Source File SOURCE=..\src\numbers.cpp # End Source File # Begin Source File SOURCE=..\src\persist.cpp # End Source File # Begin Source File SOURCE=..\src\serial.cpp # End Source File # Begin Source File SOURCE=..\src\socketport.cpp # End Source File # Begin Source File SOURCE=..\src\tokenizer.cpp # End Source File # Begin Source File SOURCE=..\src\url.cpp # End Source File # Begin Source File SOURCE=..\src\urlstring.cpp # End Source File # Begin Source File SOURCE=..\src\xml.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\inc\cc++\cmdoptns.h" # End Source File # Begin Source File SOURCE=".\cc++\config.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\digest.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\export.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\groups.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\mime.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\network.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\numbers.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\persist.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\port.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\serial.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\socketport.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\tokenizer.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\url.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\xml.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/ccgnu2.dsp0000644000175000017500000001656011463364532013042 00000000000000# Microsoft Developer Studio Project File - Name="ccgnu2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=ccgnu2 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ccgnu2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ccgnu2.mak" CFG="ccgnu2 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ccgnu2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "ccgnu2 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "Desktop" # PROP WCE_FormatVersion "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "ccgnu2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release\ccgnu2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "..\w32" /I "..\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ws2_32.lib /nologo /version:1.8.1 /dll /machine:I386 /out:"Release/CapeCommon18.dll" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "ccgnu2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug/ccgnu2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\w32" /I "..\inc" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /FR /YX /FD /GZ /out:"debug/ccgnu2d.dll" /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /version:1.8.1 /dll /debug /machine:I386 /out:"Debug/CapeCommon18d.dll" /pdbtype:sept # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "ccgnu2 - Win32 Release" # Name "ccgnu2 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\src\assoc.cpp # End Source File # Begin Source File SOURCE=..\src\buffer.cpp # End Source File # Begin Source File SOURCE=..\src\cidr.cpp # End Source File # Begin Source File SOURCE=..\src\dir.cpp # End Source File # Begin Source File SOURCE=..\src\dso.cpp # End Source File # Begin Source File SOURCE=..\src\event.cpp # End Source File # Begin Source File SOURCE=..\src\exception.cpp # End Source File # Begin Source File SOURCE=..\src\file.cpp # End Source File # Begin Source File SOURCE=..\src\friends.cpp # End Source File # Begin Source File SOURCE=..\src\in6addr.cpp # End Source File # Begin Source File SOURCE=..\src\inaddr.cpp # End Source File # Begin Source File SOURCE=..\src\keydata.cpp # End Source File # Begin Source File SOURCE=..\src\linked.cpp # End Source File # Begin Source File SOURCE=..\src\lockfile.cpp # End Source File # Begin Source File SOURCE=..\src\map.cpp # End Source File # Begin Source File SOURCE=..\src\mempager.cpp # End Source File # Begin Source File SOURCE=..\src\missing.cpp # End Source File # Begin Source File SOURCE=..\src\mutex.cpp # End Source File # Begin Source File SOURCE=..\src\nat.cpp # End Source File # Begin Source File SOURCE=..\src\peer.cpp # End Source File # Begin Source File SOURCE=..\src\pointer.cpp # End Source File # Begin Source File SOURCE=..\src\process.cpp # End Source File # Begin Source File SOURCE=..\src\runlist.cpp # End Source File # Begin Source File SOURCE=..\src\semaphore.cpp # End Source File # Begin Source File SOURCE=..\src\simplesocket.cpp # End Source File # Begin Source File SOURCE=..\src\slog.cpp # End Source File # Begin Source File SOURCE=..\src\socket.cpp # End Source File # Begin Source File SOURCE=..\src\strchar.cpp # End Source File # Begin Source File SOURCE=..\src\string.cpp # End Source File # Begin Source File SOURCE=..\src\thread.cpp # End Source File # Begin Source File SOURCE=..\src\threadkey.cpp # End Source File # Begin Source File SOURCE=..\src\timer.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\inc\cc++\address.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\buffer.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\common.h" # End Source File # Begin Source File SOURCE=".\cc++\config.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\exception.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\export.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\file.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\misc.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\missing.h" # End Source File # Begin Source File SOURCE=..\src\nat.h # End Source File # Begin Source File SOURCE=..\src\private.h # End Source File # Begin Source File SOURCE="..\inc\cc++\process.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\slog.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\socket.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\strchar.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\string.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\thread.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/common.sln0000755000175000017500000001617711463314535013164 00000000000000Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SampleSocketPort", "demo\SampleSocketPort.vcproj", "{84618DB0-9D01-4A78-9913-F7505485037F}" ProjectSection(ProjectDependencies) = postProject {E1166905-585F-4154-98AD-B5120F6BB5AA} = {E1166905-585F-4154-98AD-B5120F6BB5AA} {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "buffer", "demo\buffer.vcproj", "{30DF9507-D3D6-43E4-A901-CAD89E2F4521}" ProjectSection(ProjectDependencies) = postProject {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccext2", "ccext2.vcproj", "{E1166905-585F-4154-98AD-B5120F6BB5AA}" ProjectSection(ProjectDependencies) = postProject {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccgnu2", "ccgnu2.vcproj", "{C377A2E6-B32F-41F5-BF3A-E2B7064E9F10}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crc32", "demo\crc32.vcproj", "{7560CA99-3744-4E17-BE82-0C4FCF285873}" ProjectSection(ProjectDependencies) = postProject {E1166905-585F-4154-98AD-B5120F6BB5AA} = {E1166905-585F-4154-98AD-B5120F6BB5AA} {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "slogTest", "demo\slogTest.vcproj", "{B8B4DA1D-D6E4-421D-9580-CDC9B912B0CE}" ProjectSection(ProjectDependencies) = postProject {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcp", "demo\tcp.vcproj", "{13499D69-ED8E-487A-9F58-D9054F2F8933}" ProjectSection(ProjectDependencies) = postProject {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcpservice", "demo\tcpservice.vcproj", "{8D23A860-D44C-4FDD-A986-CCE588552997}" ProjectSection(ProjectDependencies) = postProject {E1166905-585F-4154-98AD-B5120F6BB5AA} = {E1166905-585F-4154-98AD-B5120F6BB5AA} {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tcpthread", "demo\tcpthread.vcproj", "{E717CD47-85AB-4990-8C68-4CB32BD78E90}" ProjectSection(ProjectDependencies) = postProject {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "urlfetch", "demo\urlfetch.vcproj", "{37DFA3DB-51DC-44AF-8AEF-26771FEC0D87}" ProjectSection(ProjectDependencies) = postProject {E1166905-585F-4154-98AD-B5120F6BB5AA} = {E1166905-585F-4154-98AD-B5120F6BB5AA} {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xmlfetch", "demo\xmlfetch.vcproj", "{529EBD86-34AC-4C5A-9C5B-EEDCA6212C9B}" ProjectSection(ProjectDependencies) = postProject {E1166905-585F-4154-98AD-B5120F6BB5AA} = {E1166905-585F-4154-98AD-B5120F6BB5AA} {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} = {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {84618DB0-9D01-4A78-9913-F7505485037F}.Debug|Win32.ActiveCfg = Debug|Win32 {84618DB0-9D01-4A78-9913-F7505485037F}.Debug|Win32.Build.0 = Debug|Win32 {84618DB0-9D01-4A78-9913-F7505485037F}.Release|Win32.ActiveCfg = Release|Win32 {84618DB0-9D01-4A78-9913-F7505485037F}.Release|Win32.Build.0 = Release|Win32 {30DF9507-D3D6-43E4-A901-CAD89E2F4521}.Debug|Win32.ActiveCfg = Debug|Win32 {30DF9507-D3D6-43E4-A901-CAD89E2F4521}.Debug|Win32.Build.0 = Debug|Win32 {30DF9507-D3D6-43E4-A901-CAD89E2F4521}.Release|Win32.ActiveCfg = Release|Win32 {30DF9507-D3D6-43E4-A901-CAD89E2F4521}.Release|Win32.Build.0 = Release|Win32 {E1166905-585F-4154-98AD-B5120F6BB5AA}.Debug|Win32.ActiveCfg = Debug|Win32 {E1166905-585F-4154-98AD-B5120F6BB5AA}.Debug|Win32.Build.0 = Debug|Win32 {E1166905-585F-4154-98AD-B5120F6BB5AA}.Release|Win32.ActiveCfg = Release|Win32 {E1166905-585F-4154-98AD-B5120F6BB5AA}.Release|Win32.Build.0 = Release|Win32 {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10}.Debug|Win32.ActiveCfg = Debug|Win32 {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10}.Debug|Win32.Build.0 = Debug|Win32 {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10}.Release|Win32.ActiveCfg = Release|Win32 {C377A2E6-B32F-41F5-BF3A-E2B7064E9F10}.Release|Win32.Build.0 = Release|Win32 {7560CA99-3744-4E17-BE82-0C4FCF285873}.Debug|Win32.ActiveCfg = Debug|Win32 {7560CA99-3744-4E17-BE82-0C4FCF285873}.Debug|Win32.Build.0 = Debug|Win32 {7560CA99-3744-4E17-BE82-0C4FCF285873}.Release|Win32.ActiveCfg = Release|Win32 {7560CA99-3744-4E17-BE82-0C4FCF285873}.Release|Win32.Build.0 = Release|Win32 {B8B4DA1D-D6E4-421D-9580-CDC9B912B0CE}.Debug|Win32.ActiveCfg = Debug|Win32 {B8B4DA1D-D6E4-421D-9580-CDC9B912B0CE}.Debug|Win32.Build.0 = Debug|Win32 {B8B4DA1D-D6E4-421D-9580-CDC9B912B0CE}.Release|Win32.ActiveCfg = Release|Win32 {B8B4DA1D-D6E4-421D-9580-CDC9B912B0CE}.Release|Win32.Build.0 = Release|Win32 {13499D69-ED8E-487A-9F58-D9054F2F8933}.Debug|Win32.ActiveCfg = Debug|Win32 {13499D69-ED8E-487A-9F58-D9054F2F8933}.Debug|Win32.Build.0 = Debug|Win32 {13499D69-ED8E-487A-9F58-D9054F2F8933}.Release|Win32.ActiveCfg = Release|Win32 {13499D69-ED8E-487A-9F58-D9054F2F8933}.Release|Win32.Build.0 = Release|Win32 {8D23A860-D44C-4FDD-A986-CCE588552997}.Debug|Win32.ActiveCfg = Debug|Win32 {8D23A860-D44C-4FDD-A986-CCE588552997}.Debug|Win32.Build.0 = Debug|Win32 {8D23A860-D44C-4FDD-A986-CCE588552997}.Release|Win32.ActiveCfg = Release|Win32 {8D23A860-D44C-4FDD-A986-CCE588552997}.Release|Win32.Build.0 = Release|Win32 {E717CD47-85AB-4990-8C68-4CB32BD78E90}.Debug|Win32.ActiveCfg = Debug|Win32 {E717CD47-85AB-4990-8C68-4CB32BD78E90}.Debug|Win32.Build.0 = Debug|Win32 {E717CD47-85AB-4990-8C68-4CB32BD78E90}.Release|Win32.ActiveCfg = Release|Win32 {E717CD47-85AB-4990-8C68-4CB32BD78E90}.Release|Win32.Build.0 = Release|Win32 {37DFA3DB-51DC-44AF-8AEF-26771FEC0D87}.Debug|Win32.ActiveCfg = Debug|Win32 {37DFA3DB-51DC-44AF-8AEF-26771FEC0D87}.Debug|Win32.Build.0 = Debug|Win32 {37DFA3DB-51DC-44AF-8AEF-26771FEC0D87}.Release|Win32.ActiveCfg = Release|Win32 {37DFA3DB-51DC-44AF-8AEF-26771FEC0D87}.Release|Win32.Build.0 = Release|Win32 {529EBD86-34AC-4C5A-9C5B-EEDCA6212C9B}.Debug|Win32.ActiveCfg = Debug|Win32 {529EBD86-34AC-4C5A-9C5B-EEDCA6212C9B}.Debug|Win32.Build.0 = Debug|Win32 {529EBD86-34AC-4C5A-9C5B-EEDCA6212C9B}.Release|Win32.ActiveCfg = Release|Win32 {529EBD86-34AC-4C5A-9C5B-EEDCA6212C9B}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal commoncpp2-1.8.1/w32/Makefile.bcc0000644000175000017500000001364411463314535013335 00000000000000####################################################### # MAKEFILE for building ccgnu2.dll and ccext2.dll # # # # (c) 2004 by Darko Miletic # # e-mail: kiklop@fibertel.com.ar # # # # Modified 24-Aug-2005 by Conrad T. Pino # # e-mail: Conrad@Pino.com # # Compile with Borland C++ Builder 6.0 # ####################################################### .autodepend !ifndef CC CC=bcc32 !endif ILINK32=ilink32 !ifndef BMODE BMODE = RELEASE !endif !if $(BMODE) != RELEASE && $(BMODE) != DEBUG ! error Illegal value for BMODE option !endif #C++ compile flags !if $(BMODE) == RELEASE CPPFLAGS=-q -v- -O2 -k- -tWD -tWM -w-inl -w-par -w-aus -w-pia -w-ccc -w-rch -w-csu -w-hid -w-pro -D$(USERDEFINES);$(SYSDEFINES) -I$(INCDIR) LINKFLAGS=-v- -Tpd -aa -Gn -Gi -c -L$(LIBDIR) USERDEFINES=_WINVER=0x0400;_WIN32_WINNT=0x0400;STRICT;_MBCS;NODEBUG;WIN32;_USRDLL;_WINDOWS;CCGNU2_EXPORTS;CCEXT2_EXPORTS OUTDIR=Release DBG= !message Building release version of dll'S !else CPPFLAGS=-q -v -Od -k -tWD -tWM -Q+ -D$(USERDEFINES);$(SYSDEFINES) -I$(INCDIR) LINKFLAGS=-v -Tpd -aa -Gn -Gi -c -L$(LIBDIR) USERDEFINES=_WINVER=0x0400;_WIN32_WINNT=0x0400;STRICT;_MBCS;_DEBUG;WIN32;_USRDLL;_WINDOWS;CCGNU2_EXPORTS;CCEXT2_EXPORTS OUTDIR=Debug DBG=D !message Building debug version of dll'S !endif .cpp.obj: @$(CC) $(CPPFLAGS) -I$(INCDIR) /c -o$@ $< .c.obj: @$(CC) $(CPPFLAGS) -I$(INCDIR) /c -o$@ $< LIBBASE1=ccgnu2$(DBG) LIBBASE2=ccext2$(DBG) LIBNAME1=$(LIBBASE1).dll LIBNAME2=$(LIBBASE2).dll INCDIR=..\w32;..\include LIBDIR=.\$(OUTDIR) SRC=..\src OBJ=.\$(OUTDIR)\obj BIN=.\$(OUTDIR) #RESFILE=CCXX2.res SYSDEFINES= ################################ # Target ################################ PROJECT1=$(BIN)\$(LIBNAME1) PROJECT2=$(BIN)\$(LIBNAME2) OBJFILES1=$(OBJ)\dir.obj \ $(OBJ)\dso.obj \ $(OBJ)\event.obj \ $(OBJ)\exception.obj \ $(OBJ)\file.obj \ $(OBJ)\friends.obj \ $(OBJ)\in6addr.obj \ $(OBJ)\inaddr.obj \ $(OBJ)\keydata.obj \ $(OBJ)\mempager.obj \ $(OBJ)\missing.obj \ $(OBJ)\mutex.obj \ $(OBJ)\nat.obj \ $(OBJ)\peer.obj \ $(OBJ)\process.obj \ $(OBJ)\semaphore.obj \ $(OBJ)\simplesocket.obj \ $(OBJ)\slog.obj \ $(OBJ)\socket.obj \ $(OBJ)\strchar.obj \ $(OBJ)\string.obj \ $(OBJ)\thread.obj \ $(OBJ)\threadkey.obj OBJFILES2=$(OBJ)\buffer.obj \ $(OBJ)\cmdoptns.obj \ $(OBJ)\date.obj \ $(OBJ)\digest.obj \ $(OBJ)\engine.obj \ $(OBJ)\getopt.obj \ $(OBJ)\getopt1.obj \ $(OBJ)\md5.obj \ $(OBJ)\network.obj \ $(OBJ)\numbers.obj \ $(OBJ)\persist.obj \ $(OBJ)\serial.obj \ $(OBJ)\unix.obj \ $(OBJ)\url.obj \ $(OBJ)\urlstring.obj \ $(OBJ)\xml.obj RESFILES= LIBFILES=ws2_32.lib DEFFILE= BCC32STARTUP=c0d32.obj BCC32RTLIB=cw32mt.lib ALLOBJS1=$(BCC32STARTUP) $(OBJFILES1) ALLOBJS2=$(BCC32STARTUP) $(OBJFILES2) ALLLIBS=$(LIBFILES) import32.lib $(BCC32RTLIB) ALLLIBS1=$(ALLLIBS) ALLLIBS2=$(ALLLIBS) $(LIBBASE1).lib all: dirs $(RESFILE) $(PROJECT1) $(PROJECT2) cleansym cleanobj:: -@echo Deleting intermediate files for project -@if exist $(OBJ)\*.obj del $(OBJ)\*.obj cleansym:: !if $(BMODE) == DEBUG -@echo Keeping symbol files for project !elif $(BMODE) == RELEASE -@echo Deleting symbol files for project -@if exist $(BIN)\*.tds del $(BIN)\*.tds -@if exist $(BIN)\*.map del $(BIN)\*.map !endif cleantgt:: -@echo Deleting output files for project -@if exist $(BIN)\$(LIBBASE1).* del $(BIN)\$(LIBBASE1).* -@if exist $(BIN)\$(LIBBASE2).* del $(BIN)\$(LIBBASE2).* clean: cleanobj cleantgt -@echo Deleting output directory -@if exist $(OBJ) rd $(OBJ) -@if exist $(BIN) rd $(BIN) dirs:: -@echo Creating output directory -@if not exist $(BIN) md $(BIN) -@if not exist $(OBJ) md $(OBJ) ################################## # Output ################################## $(PROJECT1):: $(OBJFILES1) $(ILINK32) @&&| $(LINKFLAGS) $(ALLOBJS1) $<,$* $(ALLLIBS1) $(DEFFILE) $(RESFILE) | $(PROJECT2):: $(PROJECT) $(OBJFILES2) $(ILINK32) @&&| $(LINKFLAGS) $(ALLOBJS2) $<,$* $(ALLLIBS2) $(DEFFILE) $(RESFILE) | #Dependencies - explicit rules $(OBJ)\dir.obj: $(SRC)\dir.cpp $(OBJ)\dso.obj: $(SRC)\dso.cpp $(OBJ)\event.obj: $(SRC)\event.cpp $(OBJ)\exception.obj: $(SRC)\exception.cpp $(OBJ)\file.obj: $(SRC)\file.cpp $(OBJ)\friends.obj: $(SRC)\friends.cpp $(OBJ)\in6addr.obj: $(SRC)\in6addr.cpp $(OBJ)\inaddr.obj: $(SRC)\inaddr.cpp $(OBJ)\keydata.obj: $(SRC)\keydata.cpp $(OBJ)\mempager.obj: $(SRC)\mempager.cpp $(OBJ)\missing.obj: $(SRC)\missing.cpp $(OBJ)\mutex.obj: $(SRC)\mutex.cpp $(OBJ)\nat.obj: $(SRC)\nat.cpp $(OBJ)\peer.obj: $(SRC)\peer.cpp $(OBJ)\process.obj: $(SRC)\process.cpp $(OBJ)\semaphore.obj: $(SRC)\semaphore.cpp $(OBJ)\simplesocket.obj: $(SRC)\simplesocket.cpp $(OBJ)\slog.obj: $(SRC)\slog.cpp $(OBJ)\socket.obj: $(SRC)\socket.cpp $(OBJ)\strchar.obj: $(SRC)\strchar.cpp $(OBJ)\string.obj: $(SRC)\string.cpp $(OBJ)\thread.obj: $(SRC)\thread.cpp $(OBJ)\threadkey.obj: $(SRC)\threadkey.cpp $(OBJ)\buffer.obj: $(SRC)\buffer.cpp $(OBJ)\cmdoptns.obj: $(SRC)\cmdoptns.cpp $(OBJ)\date.obj: $(SRC)\date.cpp $(OBJ)\digest.obj: $(SRC)\digest.cpp $(OBJ)\engine.obj: $(SRC)\engine.cpp $(OBJ)\getopt.obj: $(SRC)\getopt.c $(OBJ)\getopt1.obj: $(SRC)\getopt1.c $(OBJ)\md5.obj: $(SRC)\md5.cpp $(OBJ)\network.obj: $(SRC)\network.cpp $(OBJ)\numbers.obj: $(SRC)\numbers.cpp $(OBJ)\persist.obj: $(SRC)\persist.cpp $(OBJ)\serial.obj: $(SRC)\serial.cpp $(OBJ)\unix.obj: $(SRC)\unix.cpp $(OBJ)\url.obj: $(SRC)\url.cpp $(OBJ)\urlstring.obj: $(SRC)\urlstring.cpp $(OBJ)\xml.obj: $(SRC)\xml.cpp #$(RESFILE): # @brcc32 -d__MINGW32__ CCXX2.rc commoncpp2-1.8.1/w32/ccgnu2.dsp.in0000644000175000017500000001661011463314535013441 00000000000000# Microsoft Developer Studio Project File - Name="ccgnu2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=ccgnu2 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ccgnu2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ccgnu2.mak" CFG="ccgnu2 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ccgnu2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "ccgnu2 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "Desktop" # PROP WCE_FormatVersion "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "ccgnu2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release\ccgnu2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "..\w32" /I "..\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ws2_32.lib /nologo /version:VCVERSION /dll /machine:I386 /out:"Release/CapeCommonDLLVERSION.dll" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "ccgnu2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug/ccgnu2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" F90=df.exe # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\w32" /I "..\inc" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCGNU2_EXPORTS" /FR /YX /FD /GZ /out:"debug/ccgnu2d.dll" /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /version:VCVERSION /dll /debug /machine:I386 /out:"Debug/CapeCommonDLLVERSIONd.dll" /pdbtype:sept # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "ccgnu2 - Win32 Release" # Name "ccgnu2 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\src\assoc.cpp # End Source File # Begin Source File SOURCE=..\src\buffer.cpp # End Source File # Begin Source File SOURCE=..\src\cidr.cpp # End Source File # Begin Source File SOURCE=..\src\dir.cpp # End Source File # Begin Source File SOURCE=..\src\dso.cpp # End Source File # Begin Source File SOURCE=..\src\event.cpp # End Source File # Begin Source File SOURCE=..\src\exception.cpp # End Source File # Begin Source File SOURCE=..\src\file.cpp # End Source File # Begin Source File SOURCE=..\src\friends.cpp # End Source File # Begin Source File SOURCE=..\src\in6addr.cpp # End Source File # Begin Source File SOURCE=..\src\inaddr.cpp # End Source File # Begin Source File SOURCE=..\src\keydata.cpp # End Source File # Begin Source File SOURCE=..\src\linked.cpp # End Source File # Begin Source File SOURCE=..\src\lockfile.cpp # End Source File # Begin Source File SOURCE=..\src\map.cpp # End Source File # Begin Source File SOURCE=..\src\mempager.cpp # End Source File # Begin Source File SOURCE=..\src\missing.cpp # End Source File # Begin Source File SOURCE=..\src\mutex.cpp # End Source File # Begin Source File SOURCE=..\src\nat.cpp # End Source File # Begin Source File SOURCE=..\src\peer.cpp # End Source File # Begin Source File SOURCE=..\src\pointer.cpp # End Source File # Begin Source File SOURCE=..\src\process.cpp # End Source File # Begin Source File SOURCE=..\src\runlist.cpp # End Source File # Begin Source File SOURCE=..\src\semaphore.cpp # End Source File # Begin Source File SOURCE=..\src\simplesocket.cpp # End Source File # Begin Source File SOURCE=..\src\slog.cpp # End Source File # Begin Source File SOURCE=..\src\socket.cpp # End Source File # Begin Source File SOURCE=..\src\strchar.cpp # End Source File # Begin Source File SOURCE=..\src\string.cpp # End Source File # Begin Source File SOURCE=..\src\thread.cpp # End Source File # Begin Source File SOURCE=..\src\threadkey.cpp # End Source File # Begin Source File SOURCE=..\src\timer.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\inc\cc++\address.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\buffer.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\common.h" # End Source File # Begin Source File SOURCE=".\cc++\config.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\exception.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\export.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\file.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\misc.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\missing.h" # End Source File # Begin Source File SOURCE=..\src\nat.h # End Source File # Begin Source File SOURCE=..\src\private.h # End Source File # Begin Source File SOURCE="..\inc\cc++\process.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\slog.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\socket.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\strchar.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\string.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\thread.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/ccgnu2.vcproj.in0000755000175000017500000011314511463314535014162 00000000000000 commoncpp2-1.8.1/w32/ccext2.vcproj0000644000175000017500000006212011463364532013557 00000000000000 commoncpp2-1.8.1/w32/ccext2.dsp.in0000644000175000017500000001435711463314535013456 00000000000000# Microsoft Developer Studio Project File - Name="ccext2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=ccext2 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ccext2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ccext2.mak" CFG="ccext2 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ccext2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE "ccext2 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "ccext2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release\ccext2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /I "..\w32" /I "..\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /machine:I386 # ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /version:VCVERSION /dll /machine:I386 /out:"Release/CapeExtrasDLLVERSION.dll" /libpath:"Release" # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "ccext2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug/ccext2" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "..\w32" /I "..\inc" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CCEXT2_EXPORTS" /FR /YX /FD /GZ /out:"debug/ccext2d.dll" /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /version:VCVERSION /dll /debug /machine:I386 /out:"Debug/CapeExtrasDLLVERSIONd.dll" /pdbtype:sept /libpath:"Debug" # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "ccext2 - Win32 Release" # Name "ccext2 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\src\cmdoptns.cpp # End Source File # Begin Source File SOURCE=..\src\date.cpp # End Source File # Begin Source File SOURCE=..\src\digest.cpp # End Source File # Begin Source File SOURCE=..\src\engine.cpp # End Source File # Begin Source File SOURCE=..\src\getopt.c # End Source File # Begin Source File SOURCE=..\src\getopt1.c # End Source File # Begin Source File SOURCE=..\src\md5.cpp # End Source File # Begin Source File SOURCE=..\src\mime.cpp # End Source File # Begin Source File SOURCE=..\src\network.cpp # End Source File # Begin Source File SOURCE=..\src\numbers.cpp # End Source File # Begin Source File SOURCE=..\src\persist.cpp # End Source File # Begin Source File SOURCE=..\src\serial.cpp # End Source File # Begin Source File SOURCE=..\src\socketport.cpp # End Source File # Begin Source File SOURCE=..\src\tokenizer.cpp # End Source File # Begin Source File SOURCE=..\src\url.cpp # End Source File # Begin Source File SOURCE=..\src\urlstring.cpp # End Source File # Begin Source File SOURCE=..\src\xml.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE="..\inc\cc++\cmdoptns.h" # End Source File # Begin Source File SOURCE=".\cc++\config.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\digest.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\export.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\groups.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\mime.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\network.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\numbers.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\persist.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\port.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\serial.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\socketport.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\tokenizer.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\url.h" # End Source File # Begin Source File SOURCE="..\inc\cc++\xml.h" # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/common.dsw0000755000175000017500000000145111463314535013152 00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "ccext2"=.\ccext2.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ Begin Project Dependency Project_Dep_Name ccgnu2 End Project Dependency }}} ############################################################################### Project: "ccgnu2"=.\ccgnu2.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### commoncpp2-1.8.1/w32/common.reg0000644000175000017500000000027311463314535013130 00000000000000REGEDIT4 [HKEY_LOCAL_MACHINE\Software\CAPE Framework\Common Settings] "Common Files"="C:\\Program Files\\Common Files\\CAPE Framework" "Distribution"="C:\\Program Files\\GNU Telephony" commoncpp2-1.8.1/w32/tests/0000755000175000017500000000000011463572774012374 500000000000000commoncpp2-1.8.1/w32/tests/tcpstr1.dsp0000644000175000017500000001004111463314535014405 00000000000000# Microsoft Developer Studio Project File - Name="tcpstr1" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=tcpstr1 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "tcpstr1.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "tcpstr1.mak" CFG="tcpstr1 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "tcpstr1 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "tcpstr1 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "tcpstr1 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "tcpstr1 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "tcpstr1 - Win32 Release" # Name "tcpstr1 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\tcpstr1.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/tests/bug1.dsp0000644000175000017500000000777511463314535013667 00000000000000# Microsoft Developer Studio Project File - Name="bug1" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=bug1 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "bug1.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "bug1.mak" CFG="bug1 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "bug1 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "bug1 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "bug1 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "bug1 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "bug1 - Win32 Release" # Name "bug1 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\bug1.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/tests/url1.dsp0000644000175000017500000001002411463314535013671 00000000000000# Microsoft Developer Studio Project File - Name="url1" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=url1 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "url1.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "url1.mak" CFG="url1 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "url1 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "url1 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "url1 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib ccext2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "url1 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccext2d.lib ccgnu2d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "url1 - Win32 Release" # Name "url1 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\url1.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/tests/digest.dsp0000644000175000017500000001005411463314535014270 00000000000000# Microsoft Developer Studio Project File - Name="digest" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=digest - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "digest.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "digest.mak" CFG="digest - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "digest - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "digest - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "digest - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib ccext2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "digest - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccext2d.lib ccgnu2d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "digest - Win32 Release" # Name "digest - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\digest.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/tests/bug2.dsp0000644000175000017500000000777511463314535013670 00000000000000# Microsoft Developer Studio Project File - Name="bug2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=bug2 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "bug2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "bug2.mak" CFG="bug2 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "bug2 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "bug2 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "bug2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "bug2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "bug2 - Win32 Release" # Name "bug2 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\bug2.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/tests/thread1.dsp0000644000175000017500000001004111463314535014335 00000000000000# Microsoft Developer Studio Project File - Name="thread1" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=thread1 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "thread1.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "thread1.mak" CFG="thread1 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "thread1 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "thread1 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "thread1 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "thread1 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "thread1 - Win32 Release" # Name "thread1 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\thread1.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/tests/thread2.dsp0000644000175000017500000001004111463314535014336 00000000000000# Microsoft Developer Studio Project File - Name="thread2" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=thread2 - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "thread2.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "thread2.mak" CFG="thread2 - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "thread2 - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "thread2 - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "thread2 - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "..\Release" # PROP BASE Intermediate_Dir "..\Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "..\Release" # PROP Intermediate_Dir "..\Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /O2 /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0xc0a /d "NDEBUG" # ADD RSC /l 0xc0a /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 ccgnu2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release" !ELSEIF "$(CFG)" == "thread2 - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "..\Debug" # PROP BASE Intermediate_Dir "..\Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "..\Debug" # PROP Intermediate_Dir "..\Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\w32" /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0xc0a /d "_DEBUG" # ADD RSC /l 0xc0a /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 ccgnu2d.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug" !ENDIF # Begin Target # Name "thread2 - Win32 Release" # Name "thread2 - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\thread2.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project commoncpp2-1.8.1/w32/tests/ccxx_testsuite.dsp0000644000175000017500000001411211463314535016066 00000000000000# Microsoft Developer Studio Project File - Name="ccxx_testsuite" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=ccxx_testsuite - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ccxx_testsuite.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ccxx_testsuite.mak" CFG="ccxx_testsuite - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ccxx_testsuite - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "ccxx_testsuite - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "ccxx_testsuite - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"../Release/ccxx_testsuite.exe" # Begin Special Build Tool TargetPath=\Projects\C\commoncpp2\win32\Release\ccxx_testsuite.exe SOURCE="$(InputPath)" PostBuild_Desc=Running CppUnit Tests PostBuild_Cmds=$(TargetPath) -selftest # End Special Build Tool !ELSEIF "$(CFG)" == "ccxx_testsuite - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib cppunitd_dll.lib /nologo /subsystem:console /debug /machine:I386 /out:"../Debug/ccxx_testsuite.exe" /pdbtype:sept # Begin Special Build Tool TargetPath=\Projects\C\commoncpp2\win32\Debug\ccxx_testsuite.exe SOURCE="$(InputPath)" PostBuild_Desc=Running CppUnit Tests PostBuild_Cmds=$(TargetPath) -selftest # End Special Build Tool !ENDIF # Begin Target # Name "ccxx_testsuite - Win32 Release" # Name "ccxx_testsuite - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\..\tests\ccxx_tests.cpp # End Source File # Begin Source File SOURCE=..\..\tests\SampleObject.cpp # End Source File # Begin Source File SOURCE=..\..\tests\SampleSubObject.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\..\tests\SampleObject.h # End Source File # Begin Source File SOURCE=..\..\tests\SampleSubObject.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Group "Tests" # PROP Default_Filter "" # Begin Source File SOURCE=..\..\tests\Test_Date.cpp # End Source File # Begin Source File SOURCE=..\..\tests\Test_Date.h # End Source File # Begin Source File SOURCE=..\..\tests\Test_Digest.cpp # End Source File # Begin Source File SOURCE=..\..\tests\Test_Digest.h # End Source File # Begin Source File SOURCE=..\..\tests\Test_Engine.cpp # End Source File # Begin Source File SOURCE=..\..\tests\Test_Engine.h # End Source File # Begin Source File SOURCE=..\..\tests\Test_SHATumbler.h # End Source File # Begin Source File SOURCE=..\..\tests\Test_TCPStream.cpp # End Source File # Begin Source File SOURCE=..\..\tests\Test_TCPStream.h # End Source File # Begin Source File SOURCE=..\..\tests\Test_URLString.cpp # End Source File # Begin Source File SOURCE=..\..\tests\Test_URLString.h # End Source File # End Group # End Target # End Project commoncpp2-1.8.1/inc/0000755000175000017500000000000011463572774011370 500000000000000commoncpp2-1.8.1/inc/cc++/0000755000175000017500000000000011463572775012104 500000000000000commoncpp2-1.8.1/inc/cc++/numbers.h0000644000175000017500000002243711463367647013660 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file numbers.h * @short Numbers and dates manipulation. **/ #ifndef CCXX_NUMBERS_H_ #define CCXX_NUMBERS_H_ #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_STRCHAR_H_ #include #endif #ifndef CCXX_STRING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #include #ifdef CCXX_NAMESPACES namespace ost { #ifdef __BORLANDC__ using std::tm; using std::time_t; #endif #endif /** * A number manipulation class. This is used to extract, convert, * and manage simple numbers that are represented in C ascii strings * in a very quick and optimal way. * * @author David Sugar * @short number manipulation. */ class __EXPORT Number { protected: char *buffer; unsigned size; public: /** * Create an instance of a number. * @param buffer or NULL if created internally. * @param size use - values for zero filled. */ Number(char *buffer, unsigned size); void setValue(long value); const char *getBuffer() const {return buffer;}; long getValue() const; long operator()() {return getValue();}; operator long() {return getValue();}; operator char*() {return buffer;}; long operator=(const long value); long operator+=(const long value); long operator-=(const long value); long operator--(); long operator++(); int operator==(const Number &num); int operator!=(const Number &num); int operator<(const Number &num); int operator<=(const Number &num); int operator>(const Number &num); int operator>=(const Number &num); friend long operator+(const Number &num, const long val); friend long operator+(const long val, const Number &num); friend long operator-(const Number &num, long val); friend long operator-(const long val, const Number &num); }; class __EXPORT ZNumber : public Number { public: ZNumber(char *buf, unsigned size); void setValue(long value); long operator=(long value); }; /** * The Date class uses a julian date representation of the current * year, month, and day. This is then manipulated in several forms * and may be exported as needed. * * @author David Sugar * @short julian number based date class. */ class __EXPORT Date { protected: long julian; protected: void toJulian(long year, long month, long day); void fromJulian(char *buf) const; /** * A method to use to "post" any changed values when shadowing * a mixed object class. This is used by DateNumber. */ virtual void update(void); public: Date(time_t tm); Date(tm *dt); Date(char *str, size_t size = 0); Date(int year, unsigned month, unsigned day); Date(); virtual ~Date(); int getYear(void) const; unsigned getMonth(void) const; unsigned getDay(void) const; unsigned getDayOfWeek(void) const; char *getDate(char *buffer) const; time_t getDate(void) const; time_t getDate(tm *buf) const; long getValue(void) const; void setDate(const char *str, size_t size = 0); bool isValid(void) const; friend Date operator+(const Date &date, const long val); friend Date operator-(const Date &date, const long val); friend Date operator+(const long val, const Date &date); friend Date operator-(const long val, const Date &date); operator long() const {return getValue();}; String operator()() const; Date& operator++(); Date& operator--(); Date& operator+=(const long val); Date& operator-=(const long val); int operator==(const Date &date); int operator!=(const Date &date); int operator<(const Date &date); int operator<=(const Date &date); int operator>(const Date &date); int operator>=(const Date &date); bool operator!() const {return !isValid();}; }; /** * The Time class uses a integer representation of the current * time. This is then manipulated in several forms * and may be exported as needed. * * @author Marcelo Dalmas * @short Integer based time class. */ class __EXPORT Time { protected: long seconds; protected: void toSeconds(int hour, int minute, int second); void fromSeconds(char *buf) const; virtual void update(void); public: Time(time_t tm); Time(tm *dt); Time(char *str, size_t size = 0); Time(int hour, int minute, int second); Time(); virtual ~Time(); long getValue(void) const; int getHour(void) const; int getMinute(void) const; int getSecond(void) const; char *getTime(char *buffer) const; time_t getTime(void) const; tm *getTime(tm *buf) const; void setTime(char *str, size_t size = 0); bool isValid(void) const; friend Time operator+(const Time &time1, const Time &time2); friend Time operator-(const Time &time1, const Time &time2); friend Time operator+(const Time &time, const int val); friend Time operator-(const Time &time, const int val); friend Time operator+(const int val, const Time &time); friend Time operator-(const int val, const Time &time); operator long() {return getValue();}; String operator()() const; Time& operator++(); Time& operator--(); Time& operator+=(const int val); Time& operator-=(const int val); int operator==(const Time &time); int operator!=(const Time &time); int operator<(const Time &time); int operator<=(const Time &time); int operator>(const Time &time); int operator>=(const Time &time); bool operator!() const {return !isValid();}; }; /** * The Datetime class uses a julian date representation of the current * year, month, and day and a integer representation of the current * time. This is then manipulated in several forms * and may be exported as needed. * * @author Marcelo Dalmas * @short Integer based time class. */ class __EXPORT Datetime : public Date, public Time { public: Datetime(time_t tm); Datetime(tm *dt); Datetime(const char *str, size_t size = 0); Datetime(int year, unsigned month, unsigned day, int hour, int minute, int second); Datetime(); virtual ~Datetime(); char *getDatetime(char *buffer) const; time_t getDatetime(void) const; bool isValid(void) const; Datetime& operator=(const Datetime datetime); Datetime& operator+=(const Datetime &datetime); Datetime& operator-=(const Datetime &datetime); Datetime& operator+=(const Time &time); Datetime& operator-=(const Time &time); int operator==(const Datetime&); int operator!=(const Datetime&); int operator<(const Datetime&); int operator<=(const Datetime&); int operator>(const Datetime&); int operator>=(const Datetime&); bool operator!() const; String strftime(const char *format) const; }; /** * A number class that manipulates a string buffer that is also a date. * * @author David Sugar * @short a number that is also a date string. */ class __EXPORT DateNumber : public Number, public Date { protected: void update(void) {fromJulian(buffer);}; public: DateNumber(char *buffer); virtual ~DateNumber(); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/tokenizer.h0000644000175000017500000002626211463371272014204 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file tokenizer.h * @short string tokenizer. **/ #ifndef CCXX_TOKENIZER_H_ #define CCXX_TOKENIZER_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * Splits delimited string into tokens. * * The StringTokenizer takes a pointer to a string and a pointer * to a string containing a number of possible delimiters. * The StringTokenizer provides an input forward iterator which allows * to iterate through all tokens. An iterator behaves like a logical * pointer to the tokens, i.e. to shift to the next token, you've * to increment the iterator, you get the token by dereferencing the * iterator. * * Memory consumption: * This class operates on the original string and only allocates memory * for the individual tokens actually requested, so this class * allocates at maximum the space required for the longest token in the * given string. * Since for each iteration, memory is reclaimed for the last token, * you MAY NOT store pointers to them; if you need them afterwards, * copy them. You may not modify the original string while you operate * on it with the StringTokenizer; the behaviour is undefined in that * case. * * The iterator has one special method 'nextDelimiter()' which returns * a character containing the next delimiter following this * tokenization process or '\\0', if there are no following delimiters. In * case of skipAllDelim, it returns the FIRST delimiter. * * With the method 'setDelimiters(const char*)' you may change the * set of delimiters. It affects all running iterators. * * Example: *
 *  StringTokenizer st("mary had a little lamb;its fleece was..", " ;");
 *  StringTokenizer::iterator i;
 *  for (i = st.begin() ; i != st.end() ; ++i) {
 *        cout << "Token: '" << *i << "'\t";
 *        cout << " next Delim: '" << i.nextDelimiter() << "'" << endl;
 *  }
 *  
* * @author Henner Zeller * @license LGPL */ class __EXPORT StringTokenizer { public: /** * a delimiter string containing all usual whitespace delimiters. * These are space, tab, newline, carriage return, * formfeed and vertical tab. (see isspace() manpage). */ static const char * const SPACE; /** * Exception thrown, if someone tried to read beyond the * end of the tokens. * Will not happen if you use it the 'clean' way with comparison * against end(), but if you skip some tokens, because you 'know' * they are there. Simplifies error handling a lot, since you can * just read your tokens the way you expect it, and if there is some * error in the input this Exception will be thrown. */ // maybe move more global ? class NoSuchElementException { }; /** * The input forward iterator for tokens. * @author Henner Zeller */ class __EXPORT iterator { friend class StringTokenizer; // access our private constructors private: const StringTokenizer *myTok; // my StringTokenizer const char *start; // start of current token const char *tokEnd; // end of current token (->nxDelimiter) const char *endp; // one before next token char *token; // allocated token, if requested // for initialization of the itEnd iterator iterator(const StringTokenizer &tok, const char *end) : myTok(&tok),tokEnd(0),endp(end),token(0) {} iterator(const StringTokenizer &tok) : myTok(&tok),tokEnd(0),endp(myTok->str-1),token(0) { ++(*this); // init first token. } public: iterator() : myTok(0),start(0),tokEnd(0),endp(0),token(0) {} // see also: comment in implementation of operator++ virtual ~iterator() { if (token) *token='\0'; delete [] token; } /** * copy constructor. */ // everything, but not responsible for the allocated token. iterator(const iterator& i) : myTok(i.myTok),start(i.start),tokEnd(i.tokEnd), endp(i.endp),token(0) {} /** * assignment operator. */ // everything, but not responsible for the allocated token. iterator &operator = (const iterator &i) { myTok = i.myTok; start = i.start; endp = i.endp; tokEnd = i.tokEnd; if ( token ) delete [] token; token = 0; return *this; } /** * shifts this iterator to the next token in the string. */ iterator &operator ++ () THROWS (NoSuchElementException); /** * returns the immutable string this iterator * points to or '0' if no token is available (i.e. * i == end()). * Do not store pointers to this token, since it is * invalidated for each iteration. If you need the token, * copy it (e.g. with strdup()); */ const char* operator * () THROWS (NoSuchElementException); /** * returns the next delimiter after the current token or * '\\0', if there are no following delimiters. * It returns the very next delimiter (even if * skipAllDelim=true). */ inline char nextDelimiter() const {return (tokEnd) ? *tokEnd : '\0';} /** * compares to other iterator. Usually used to * compare against the end() iterator. */ // only compare the end-position. speed. inline bool operator == (const iterator &other) const {return (endp == other.endp);} /** * compares to other iterator. Usually used to * compare against the end() iterator. */ // only compare the end position. speed. inline bool operator != (const iterator &other) const {return (endp != other.endp);} }; private: friend class StringTokenizer::iterator; const char *str; const char *delim; bool skipAll, trim; iterator itEnd; public: /** * creates a new StringTokenizer for a string * and a given set of delimiters. * * @param str String to be split up. This string will * not be modified by this StringTokenizer, * but you may as well not modfiy this string * while tokenizing is in process, which may * lead to undefined behaviour. * * @param delim String containing the characters * which should be regarded as delimiters. * * @param skipAllDelim OPTIONAL. * true, if subsequent * delimiters should be skipped at once * or false, if empty tokens should * be returned for two delimiters with * no other text inbetween. The first * behaviour may be desirable for whitespace * skipping, the second for input with * delimited entry e.g. /etc/passwd like files * or CSV input. * NOTE, that 'true' here resembles the * ANSI-C strtok(char *s,char *d) behaviour. * DEFAULT = false * * @param trim OPTIONAL. * true, if the tokens returned * should be trimmed, so that they don't have * any whitespaces at the beginning or end. * Whitespaces are any of the characters * defined in StringTokenizer::SPACE. * If delim itself is StringTokenizer::SPACE, * this will result in a behaviour with * skipAllDelim = true. * DEFAULT = false */ StringTokenizer (const char *str, const char *delim, bool skipAllDelim = false, bool trim = false); /** * create a new StringTokenizer which splits the input * string at whitespaces. The tokens are stripped from * whitespaces. This means, if you change the set of * delimiters in either the 'begin(const char *delim)' method * or in 'setDelimiters()', you then get whitespace * trimmed tokens, delimited by the new set. * Behaves like StringTokenizer(s, StringTokenizer::SPACE,false,true); */ StringTokenizer (const char *s); /** * returns the begin iterator */ iterator begin() const {return iterator(*this);} /** * changes the set of delimiters used in subsequent * iterations. */ void setDelimiters (const char *d) {delim = d;} /** * returns a begin iterator with an alternate set of * delimiters. */ iterator begin(const char *d) { delim = d; return iterator(*this); } /** * the iterator marking the end. */ const iterator& end() const {return itEnd;} }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/buffer.h0000644000175000017500000002564211463366350013445 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file buffer.h * @short object passing services between threads. **/ #ifndef CCXX_BUFFER_H_ #define CCXX_BUFFER_H_ #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_STRING_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * The buffer class represents an IPC service that is built upon a buffer * of fixed capacity that can be used to transfer objects between one or * more producer and consumer threads. Producer threads post objects * into the buffer, and consumer threads wait for and receive objects from * the buffer. Semaphores are used to to block the buffer from overflowing * and indicate when there is data available, and mutexes are used to protect * multiple consumers and producer threads from stepping over each other. * * The buffer class is an abstract class in that the actual data being * buffered is not directly specified within the buffer class itself. The * buffer class should be used as a base class for a class that actually * impliments buffering and which may be aware of the data types actually * are being buffered. A template class could be created based on buffer * for this purpose. Another possibility is to create a class derived * from both Thread and Buffer which can be used to implement message passing * threads. * * @author David Sugar * @short Producer/Consumer buffer for use between threads. */ #ifdef WIN32 class __EXPORT Buffer : public Mutex #else class __EXPORT Buffer : public Conditional #endif { private: #ifdef WIN32 HANDLE sem_head, sem_tail; #endif size_t _size; size_t _used; protected: /** * Invoke derived class buffer peeking method. * @return size of object found. * @param buf pointer to copy contents of head of buffer to. */ virtual size_t onPeek(void *buf) = 0; /** * Invoke derived class object request from buffer. * @return size of object returned. * @param buf pointer to hold object returned from the buffer. */ virtual size_t onWait(void *buf) = 0; /** * Invoke derived class posting of object to buffer. * @return size of object posted. * @param buf pointer to object being posted to the buffer. */ virtual size_t onPost(void *buf) = 0; public: /** * value to return when a timed operation returned with a * timeout. */ static const size_t timeout; /** * Create a buffer object of known capacity. * @param capacity is the integer capacity of the buffer. */ Buffer(size_t capacity); /** * In derived functions, may be used to free the actual memory * used to hold buffered data. */ virtual ~Buffer(); /** * Return the capacity of the buffer as specified at creation. * @return size of buffer. */ inline size_t getSize(void) {return _size;}; /** * Return the current capacity in use for the buffer. Free space * is technically getSize() - getUsed(). * @return integer used capacity of the buffer. * @see #getSize */ inline size_t getUsed(void) {return _used;}; /** * Let one or more threads wait for an object to become available * in the buffer. The waiting thread(s) will wait forever if no * object is ever placed into the buffer. * * @return size of object passed by buffer in bytes. * @param buf pointer to store object retrieved from the buffer. * @param timeout time to wait. */ size_t wait(void *buf, timeout_t timeout = 0); /** * Post an object into the buffer and enable a waiting thread to * receive it. * * @return size of object posted in bytes. * @param buf pointer to object to store in the buffer. * @param timeout time to wait. */ size_t post(void *buf, timeout_t timeout = 0); /** * Peek at the current content (first object) in the buffer. * * @return size of object in the buffer. * @param buf pointer to store object found in the buffer. */ size_t peek(void *buf); /** * New virtual to test if buffer is a valid object. * @return true if object is valid. */ virtual bool isValid(void); }; /** * A buffer class that holds a known capacity of fixed sized objects defined * during creation. * * @author David Sugar * @short producer/consumer buffer for fixed size objects. */ class __EXPORT FixedBuffer : public Buffer { private: char *buf, *head, *tail; size_t objsize; protected: /** * Return the first object in the buffer. * @return predefined size of this buffers objects. * @param buf pointer to copy contents of head of buffer to. */ size_t onPeek(void *buf); /** * Wait for and return a fixed object in the buffer. * @return predefined size of this buffers objects. * @param buf pointer to hold object returned from the buffer. */ size_t onWait(void *buf); /** * Post an object of the appropriate size into the buffer. * @return predefined size of this buffers objects. * @param buf pointer to data to copy into the buffer. */ size_t onPost(void *buf); public: /** * Create a buffer of known capacity for objects of a specified * size. * * @param capacity of the buffer. * @param objsize for each object held in the buffer. */ FixedBuffer(size_t capacity, size_t objsize); /** * Create a copy of an existing fixed size buffer and duplicate * it's contents. * * @param fb existing FixedBuffer object. */ FixedBuffer(const FixedBuffer &fb); /** * Destroy the fixed buffer and free the memory used to store objects. */ virtual ~FixedBuffer(); FixedBuffer &operator=(const FixedBuffer &fb); bool isValid(void); }; /** * Somewhat generic queue processing class to establish a producer * consumer queue. This may be used to buffer cdr records, or for * other purposes where an in-memory queue is needed for rapid * posting. This class is derived from Mutex and maintains a linked * list. A thread is used to dequeue data and pass it to a callback * method that is used in place of "run" for each item present on the * queue. The conditional is used to signal the run thread when new * data is posted. * * This class was changed by Angelo Naselli to have a timeout on the queue * * @short in memory data queue interface. * @author David Sugar */ class __EXPORT ThreadQueue : public Mutex, public Thread, public Semaphore { private: void run(void); // private run method protected: typedef struct _data { struct _data *next; unsigned len; char data[1]; } data_t; timeout_t timeout; bool started; data_t *first, *last; // head/tail of list String name; /* * Overloading of final(). It demarks Semaphore to avoid deadlock. */ virtual void final(); /** * Start of dequeing. Maybe we need to connect a database * or something, so we have a virtual... */ virtual void startQueue(void); /** * End of dequeing, we expect the queue is empty for now. Maybe * we need to disconnect a database or something, so we have * another virtual. */ virtual void stopQueue(void); /** * A derivable method to call when the timout is expired. */ virtual void onTimer(void); /** * Virtual callback method to handle processing of a queued * data items. After the item is processed, it is deleted from * memory. We can call multiple instances of runQueue in order * if multiple items are waiting. * * @param data item being dequed. */ virtual void runQueue(void *data) = 0; public: /** * Create instance of our queue and give it a process priority. * * @param id queue ID. * @param pri process priority. * @param stack stack size. */ ThreadQueue(const char *id, int pri, size_t stack = 0); /** * Destroy the queue. */ virtual ~ThreadQueue(); /** * Set the queue timeout. * When the timer expires, the onTimer() method is called * for the thread * * @param timeout timeout in milliseconds. */ void setTimer(timeout_t timeout); /** * Put some unspecified data into this queue. A new qd * structure is created and sized to contain a copy of * the actual content. * * @param data pointer to data. * @param len size of data. */ void post(const void *data, unsigned len); }; /** @relates Buffer */ inline size_t get(Buffer &b, void *o, timeout_t t = 0) {return b.wait(o, t);} /** @relates Buffer */ inline size_t put(Buffer &b, void *o, timeout_t t = 0) {return b.post(o, t);} /** @relates Buffer */ inline size_t peek(Buffer &b, void *o) {return b.peek(o);} #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/network.h0000644000175000017500000000737411463403547013667 00000000000000// Copyright (C) 2002-2010 Christian Prochnow // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file network.h * @short Network subsystem and device interface related classes. **/ #ifndef CCXX_NETWORK_H_ #define CCXX_NETWORK_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifndef CCXX_STRING_H_ #include #endif #include #ifdef CCXX_NAMESPACES namespace ost { #endif //! Network device information class /*! This class is used to hold various informations about a TCP/IP network device. Which can be obtained by a call to enumNetworkDevices() \author Christian Prochnow */ class __EXPORT NetworkDeviceInfo { private: String _name; InetHostAddress _addr; BroadcastAddress _broadcast; InetMaskAddress _netmask; int _mtu; protected: NetworkDeviceInfo(const String& name, const InetHostAddress& addr, const BroadcastAddress& broadcast, const InetMaskAddress& netmask, int mtu); public: NetworkDeviceInfo(const NetworkDeviceInfo& ndi); ~NetworkDeviceInfo(); //! Returns the Name of the network device inline const String& name() const { return _name; } //! Returns the Address of the network device inline const InetHostAddress& address() const { return _addr; } //! Returns the Broadcast address of the network device inline const BroadcastAddress& broadcast() const { return _broadcast; } //! Returns the Netmask of the network device inline const InetMaskAddress& netmask() const { return _netmask; } //! Returns the MTU inline const int mtu() const { return _mtu; } //! Enumerate all available network devices friend __EXPORT bool enumNetworkDevices(std::vector& devs); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/ssl.h0000644000175000017500000000670111463371102012757 00000000000000// Copyright (C) 2006-2010 David Sugar, Tycho Softworks // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file process.h * @short Process services. **/ #ifndef CCXX_SSL_H_ #define CCXX_SSL_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifdef CCXX_GNUTLS #include typedef struct { gnutls_session session; gnutls_certificate_credentials xcred; int result; } SSL; #else #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif class SSLStream : public TCPStream { protected: SSL *ssl; public: SSLStream(Family family = IPV4, bool throwflag = true, timeout_t to = 0); void disconnect(void); SSLStream(const IPV4Host &host, tpport_t port, unsigned mss = 536, bool throwflag = true, timeout_t to = 0); #ifdef CCXX_IPV6 SSLStream(const IPV6Host &host, tpport_t port, unsigned mss = 536, bool throwflag = true, timeout_t to = 0); #endif SSLStream(const char *name, Family family = IPV4, unsigned mss = 536, bool throwflag = false, timeout_t to = 0); SSLStream(const SSLStream &ssl); inline bool isSSL(void) {return (bool)(ssl != NULL);}; bool getSession(void); void endStream(void); virtual ~SSLStream(); ssize_t readLine(char *str, size_t max, timeout_t to = 0); ssize_t readData(void *buf, size_t len, char separator = 0, timeout_t to = 0); ssize_t writeData(void *buf, size_t len, timeout_t to = 0); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/persist.h0000644000175000017500000004572111463370444013664 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file persist.h * @short Persistence library classes. **/ #ifndef CCXX_PERSIST_H_ #define CCXX_PERSIST_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_EXCEPTIONS_H_ #include #endif #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_STRING_H_ #include #endif #ifdef HAVE_ZLIB_H #ifndef NO_COMPRESSION #include #endif #else #define NO_COMPRESSION #endif #include #include #include #include #include #ifdef CCXX_NAMESPACES namespace ost { #define NS_PREFIX ost:: #else #define NS_PREFIX #endif #ifdef CCXX_EXCEPTIONS #ifdef COMMON_STD_EXCEPTION class __EXPORT PersistException : public Exception { public: PersistException(const String &what) : Exception(what) {}; }; #else class __EXPORT PersistException { public: PersistException(const String& reason); inline const String& getString() const {return Exception::getString();}; virtual ~PersistException() {} throw(); protected: String _what; }; #endif #endif // This typedef allows us to declare NewBaseObjectFunction now typedef class BaseObject* (*NewBaseObjectFunction) (void); /** * This class manages the types for generation of the persistent objects. * Its data structures are managed automatically by the system. They are * implicitly filled by the constructors who declare classes to the system. * * @author Daniel Silverstone * @short Type manager for persistence engine. */ class __EXPORT TypeManager { public: /** * This manages a registration to the typemanager - attempting to * remove problems with the optimisers */ class Registration { public: Registration(const char* name, NewBaseObjectFunction func); virtual ~Registration(); private: String myName; }; /** * This adds a new construction function to the type manager */ static void add(const char* name, NewBaseObjectFunction construction); /** * And this one removes a type from the managers lists */ static void remove(const char* name); /** * This function creates a new object of the required type and * returns a pointer to it. NULL is returned if we couldn't find * the type */ static BaseObject* createInstanceOf(const char* name); typedef std::map StringFunctionMap; }; /* * The following defines are used to declare and define the relevant code * to allow a class to use the Persistence::Engine code. */ #define DECLARE_PERSISTENCE(ClassType) \ public: \ friend NS_PREFIX Engine& operator>>( NS_PREFIX Engine& ar, ClassType *&ob); \ friend NS_PREFIX Engine& operator<<( NS_PREFIX Engine& ar, ClassType const &ob); \ friend NS_PREFIX BaseObject *createNew##ClassType(); \ virtual const char* getPersistenceID() const; \ static NS_PREFIX TypeManager::Registration registrationFor##ClassType; #define IMPLEMENT_PERSISTENCE(ClassType, FullyQualifiedName) \ NS_PREFIX BaseObject *createNew##ClassType() { return new ClassType; } \ const char* ClassType::getPersistenceID() const {return FullyQualifiedName;} \ NS_PREFIX Engine& operator>>(NS_PREFIX Engine& ar, ClassType &ob) \ { ar >> (NS_PREFIX BaseObject &) ob; return ar; } \ NS_PREFIX Engine& operator>>(NS_PREFIX Engine& ar, ClassType *&ob) \ { ar >> (NS_PREFIX BaseObject *&) ob; return ar; } \ NS_PREFIX Engine& operator<<(NS_PREFIX Engine& ar, ClassType const &ob) \ { ar << (NS_PREFIX BaseObject const *)&ob; return ar; } \ NS_PREFIX TypeManager::Registration \ ClassType::registrationFor##ClassType(FullyQualifiedName, \ createNew##ClassType); class Engine; /** * BaseObject * * This object is the base for all Persistent data which is not * natively serialised by the Persistence::Engine * * It registers itself with the Persistence::TypeManager * using a global constructor function. A matching deregister call * is made in a global destructor, to allow DLL's to use the * Persistence::Engine in a main executable. * * Persistable objects must never maintain bad pointers. If a pointer * doesn't point to something valid, it must be NULL. This is so * the persistence engine knows whether to allocate memory for an object * or whether the memory has been pre-allocated. * * @author Daniel Silverstone * @short Base class for classes that will be persistent. */ class __EXPORT BaseObject { public: /** * This constructor is used in serialisation processes. * It is called in CreateNewInstance in order to create * an instance of the class to have Read() called on it. */ BaseObject(); /** * Default destructor */ virtual ~BaseObject(); /** * This returns the ID of the persistent object (Its type) */ virtual const char* getPersistenceID() const; /** * This method is used to write to the Persistence::Engine * It is not equivalent to the << operator as it writes only the data * and not the object type etc. */ virtual bool write(Engine& archive) const; /** * This method is used to read from a Persistence::Engine * It is not equivalent to the >> operator as it does no * typesafety or anything. */ virtual bool read(Engine& archive); }; /** * Engine * * This class constructs on a standard C++ STL stream and then * operates in the mode specified. The stream passed into the * constructor must be a binary mode to function properly. * * @author Daniel Silverstone * @short stream serialization of persistent classes. */ class __EXPORT Engine { public: /** * These are the modes the Persistence::Engine can work in */ enum EngineMode { modeRead, modeWrite }; /** * Constructs a Persistence::Engine with the specified stream in * the given mode. The stream must be initialised properly prior * to this call or problems will ensue. If built using zlib compress * can be used to enable compression */ Engine(std::iostream& stream, EngineMode mode, bool compress=true) THROWS (PersistException); /** * This Flushes the buffers and closes the Persistence::Engine * this must happen before the underlying stream is shut down */ void sync(); /** * This says there are more objects to deserialize */ bool more(); virtual ~Engine(); // Write operations /** * writes a BaseObject from a reference. */ void write(const BaseObject &object) THROWS (PersistException) { write(&object); }; /** * writes a BaseObject from a pointer. */ void write(const BaseObject *object) THROWS (PersistException); // writes supported primitive types // shortcut, to make the following more readable #define CCXX_ENGINEWRITE_REF(valref) writeBinary((const uint8*)&valref,sizeof(valref)) void write(int8 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } void write(uint8 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } void write(int16 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } void write(uint16 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } void write(int32 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } void write(uint32 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } #ifdef HAVE_64_BITS void write(int64 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } void write(uint64 i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } #endif void write(float i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } void write(double i) THROWS (PersistException) { CCXX_ENGINEWRITE_REF(i); } #undef CCXX_ENGINEWRITE_REF void write(const String& str) THROWS (PersistException); void write(const std::string& str) THROWS (PersistException); // Every write operation boils down to one or more of these void writeBinary(const uint8* data, const uint32 size) THROWS (PersistException); // Read Operations /** * reads a BaseObject into a reference overwriting the object. */ void read(BaseObject &object) THROWS (PersistException); /** * reads a BaseObject into a pointer allocating memory for the object if necessary. */ void read(BaseObject *&object) THROWS (PersistException); // reads supported primitive types // shortcut, to make the following more readable #define CCXX_ENGINEREAD_REF(valref) readBinary((uint8*)&valref,sizeof(valref)) void read(int8& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } void read(uint8& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } void read(int16& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } void read(uint16& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } void read(int32& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } void read(uint32& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } #ifdef HAVE_64_BITS void read(int64& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } void read(uint64& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } #endif void read(float& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } void read(double& i) THROWS (PersistException) { CCXX_ENGINEREAD_REF(i); } #undef CCXX_ENGINEREAD_REF void read(String& str) THROWS (PersistException); void read(std::string& str) THROWS (PersistException); // Every read operation boild down to one or more of these void readBinary(uint8* data, uint32 size) THROWS (PersistException); private: /** * reads the actual object data into a pre-instantiated object pointer * by calling the read function of the derived class. */ void readObject(BaseObject* object) THROWS (PersistException); /** * reads in a class name, and caches it into the ClassMap. */ const String readClass() THROWS (PersistException); /** * The underlying stream */ std::iostream& myUnderlyingStream; /** * The mode of the engine. read or write */ EngineMode myOperationalMode; /** * Typedefs for the Persistence::BaseObject support */ typedef std::vector ArchiveVector; typedef std::map ArchiveMap; typedef std::vector ClassVector; typedef std::map ClassMap; ArchiveVector myArchiveVector; ArchiveMap myArchiveMap; ClassVector myClassVector; ClassMap myClassMap; // Compression support bool use_compression; // valid onlry if NO_COMPRESSION is false #ifndef NO_COMPRESSION z_stream myZStream; uint8* myCompressedDataBuffer; uint8* myUncompressedDataBuffer; uint8* myLastUncompressedDataRead; #endif }; // Standard >> and << stream operators for BaseObject /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, BaseObject &ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, BaseObject *&ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, BaseObject const &ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, BaseObject const *ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, int8& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, int8 ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, uint8& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, uint8 ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, int16& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, int16 ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, uint16& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, uint16 ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, int32& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, int32 ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, uint32& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, uint32 ob) THROWS (PersistException); #ifdef HAVE_64_BITS /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, int64& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, int64 ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, uint64& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, uint64 ob) THROWS (PersistException); #endif /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, float& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, float ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, double& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, double ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, String& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, String ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, std::string& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, std::string ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator >>( Engine& ar, bool& ob) THROWS (PersistException); /** @relates Engine */ __EXPORT Engine& operator <<( Engine& ar, bool ob) THROWS (PersistException); /** * The following are templated classes */ /** * @relates Engine * serialize a vector of some serializable content to * the engine */ template Engine& operator <<( Engine& ar, typename std::vector const& ob) THROWS (PersistException) { ar << (uint32)ob.size(); for(unsigned int i=0; i < ob.size(); ++i) ar << ob[i]; return ar; } /** * @relates Engine * deserialize a vector of deserializable content from * an engine. */ template Engine& operator >>( Engine& ar, typename std::vector& ob) THROWS (PersistException) { ob.clear(); uint32 siz; ar >> siz; ob.resize(siz); for(uint32 i=0; i < siz; ++i) ar >> ob[i]; return ar; } /** * @relates Engine * serialize a deque of some serializable content to * the engine */ template Engine& operator <<( Engine& ar, typename std::deque const& ob) THROWS (PersistException) { ar << (uint32)ob.size(); for(typename std::deque::const_iterator it=ob.begin(); it != ob.end(); ++it) ar << *it; return ar; } /** * @relates Engine * deserialize a deque of deserializable content from * an engine. */ template Engine& operator >>( Engine& ar, typename std::deque& ob) THROWS (PersistException) { ob.clear(); uint32 siz; ar >> siz; //ob.resize(siz); for(uint32 i=0; i < siz; ++i) { T node; ar >> node; ob.push_back(node); //ar >> ob[i]; } return ar; } /** * @relates Engine * serialize a map with keys/values which both are serializeable * to an engine. */ template Engine& operator <<( Engine& ar, typename std::map const & ob) THROWS (PersistException) { ar << (uint32)ob.size(); for(typename std::map::const_iterator it = ob.begin();it != ob.end();++it) ar << it->first << it->second; return ar; } /** * @relates Engine * deserialize a map with keys/values which both are serializeable * from an engine. */ template Engine& operator >>( Engine& ar, typename std::map& ob) THROWS (PersistException) { ob.clear(); uint32 siz; ar >> siz; for(uint32 i=0; i < siz; ++i) { Key a; ar >> a; ar >> ob[a]; } return ar; } /** * @relates Engine * serialize a pair of some serializable content to the engine. */ template Engine& operator <<( Engine& ar, std::pair &ob) THROWS (PersistException) { ar << ob.first << ob.second; return ar; } /** * @relates Engine * deserialize a pair of some serializable content to the engine. */ template Engine& operator >>(Engine& ar, std::pair &ob) THROWS (PersistException) { ar >> ob.first >> ob.second; return ar; } #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/socket.h0000644000175000017500000020211411463371032013444 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2009 Leandro Melo de Sales // Copyright (C) 2006-2010 David Sugar, Tycho Softworks, // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file socket.h * @short Network addresses and sockets related classes. **/ #ifndef CCXX_SOCKET_H_ #define CCXX_SOCKET_H_ #ifndef CCXX_ADDRESS_H_ #include #endif #if defined(WIN32) && !defined(__CYGWIN32__) #include #define _IOLEN64 (unsigned) #define _IORET64 (int) #define TIMEOUT_INF ~((timeout_t) 0) typedef int socklen_t; #else #define INVALID_SOCKET -1 typedef int SOCKET; #endif #ifndef _IOLEN64 #define _IOLEN64 #endif #ifndef _IORET64 #define _IORET64 #endif #ifndef MSG_DONTWAIT #define MSG_DONTWAIT 0 #endif #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif #ifndef SOCK_DCCP #define SOCK_DCCP 6 #endif #ifndef IPPROTO_DCCP #define IPPROTO_DCCP 33 #endif #ifndef SOL_DCCP #define SOL_DCCP 269 #endif #define DCCP_SOCKOPT_AVAILABLE_CCIDS 12 #define DCCP_SOCKOPT_CCID 13 #define DCCP_SOCKOPT_TX_CCID 14 #define DCCP_SOCKOPT_RX_CCID 15 #ifdef CCXX_NAMESPACES namespace ost { #endif /** * Transport Protocol Ports. */ typedef unsigned short tpport_t; /** * The Socket is used as the base for all Internet protocol services * under Common C++. A socket is a system resource (or winsock descriptor) * that occupies a specific port address (and may be bound to a specific * network interface) on the local machine. The socket may also be * directly connected to a specific socket on a remote internet host. * * This base class is not directly used, but is * provided to offer properties common to other Common C++ socket classes, * including the socket exception model and the ability to set socket * properties such as QoS, "sockopts" properties like Dont-Route * and Keep-Alive, etc. * * * @author David Sugar * @short base class of all sockets. */ class __EXPORT Socket { public: enum Family { #ifdef CCXX_IPV6 IPV6 = AF_INET6, #endif IPV4 = AF_INET }; typedef enum Family Family; enum Error { errSuccess = 0, errCreateFailed, errCopyFailed, errInput, errInputInterrupt, errResourceFailure, errOutput, errOutputInterrupt, errNotConnected, errConnectRefused, errConnectRejected, errConnectTimeout, errConnectFailed, errConnectInvalid, errConnectBusy, errConnectNoRoute, errBindingFailed, errBroadcastDenied, errRoutingDenied, errKeepaliveDenied, errServiceDenied, errServiceUnavailable, errMulticastDisabled, errTimeout, errNoDelay, errExtended, errLookupFail, errSearchErr, errInvalidValue }; typedef enum Error Error; enum Tos { tosLowDelay = 0, tosThroughput, tosReliability, tosMinCost, tosInvalid }; typedef enum Tos Tos; enum Pending { pendingInput, pendingOutput, pendingError }; typedef enum Pending Pending; protected: enum State { INITIAL, AVAILABLE, BOUND, CONNECTED, CONNECTING, STREAM }; typedef enum State State; private: // used by exception handlers.... mutable Error errid; mutable const char *errstr; mutable long syserr; void setSocket(void); friend SOCKET dupSocket(SOCKET s,Socket::State state); protected: static Mutex mutex; mutable struct { bool thrown: 1; bool broadcast: 1; bool route: 1; bool keepalive: 1; bool loopback: 1; bool multicast: 1; bool completion: 1; bool linger: 1; unsigned ttl: 8; } flags; /** * the actual socket descriptor, in Windows, unlike posix it * *cannot* be used as an file descriptor * that way madness lies -- jfc */ SOCKET volatile so; State volatile state; /** * This service is used to throw all socket errors which usually * occur during the socket constructor. * * @param error defined socket error id. * @param err string or message to pass. * @param systemError the system error# that caused the error */ Error error(Error error, const char *err = NULL, long systemError = 0) const; /** * This service is used to throw application defined socket errors * where the application specific error code is a string. * * @param err string or message to pass. */ inline void error(const char *err) const {error(errExtended, err);}; /** * This service is used to turn the error handler on or off for * "throwing" exceptions by manipulating the thrown flag. * * @param enable true to enable handler. */ inline void setError(bool enable) {flags.thrown = !enable;}; /** * Used as the default destructor for ending a socket. This * will cleanly terminate the socket connection. It is provided * for use in derived virtual destructors. */ void endSocket(void); /** * Used as a common handler for connection failure processing. * * @return correct failure code to apply. */ Error connectError(void); /** * Set the send limit. */ Error sendLimit(int limit = 2048); /** * Set thr receive limit. */ Error receiveLimit(int limit = 1); /** * Set the send timeout for sending raw network data. * * @return errSuccess if set. * @param timer value in millisec. */ Error sendTimeout(timeout_t timer); /** * Receive timeout for receiving raw network data. * * @return errSuccess if set. * @param timer value in milliseconds. */ Error receiveTimeout(timeout_t timer); /** * Set the protocol stack network kernel send buffer size * associated with the socket. * * @return errSuccess on success, or error. * @param size of buffer in bytes. */ Error sendBuffer(unsigned size); /** * Set the protocol stack network kernel receive buffer size * associated with the socket. * * @return errSuccess on success, or error. * @param size of buffer in bytes. */ Error receiveBuffer(unsigned size); /** * Set the total protocol stack network kernel buffer size * for both send and receive together. * * @return errSuccess on success * @param size of buffer. */ Error bufferSize(unsigned size); /** * Set the subnet broadcast flag for the socket. This enables * sending to a subnet and may require special image privileges * depending on the operating system. * * @return 0 (errSuccess) on success, else error code. * @param enable when set to true. */ Error setBroadcast(bool enable); /** * Setting multicast binds the multicast interface used for * the socket to the interface the socket itself has been * implicitly bound to. It is also used as a check flag * to make sure multicast is enabled before multicast * operations are used. * * @return 0 (errSuccess) on success, else error code. * @param enable when set to true. * @param family of protocol. */ Error setMulticastByFamily(bool enable, Family family = IPV4); /** * Set the multicast loopback flag for the socket. Loopback * enables a socket to hear what it is sending. * * @return 0 (errSuccess) on success, else error code. * @param enable when set to true. * @param family of protocol. */ Error setLoopbackByFamily(bool enable, Family family = IPV4); /** * Set the multicast time to live for a multicast socket. * * @return 0 (errSuccess) on success, else error code. * @param ttl time to live. * @param fam family of protocol. */ Error setTimeToLiveByFamily(unsigned char ttl, Family fam = IPV4); /** * Join a multicast group. * * @return 0 (errSuccess) on success, else error code. * @param ia address of multicast group to join. */ Error join(const IPV4Multicast &ia); #ifdef CCXX_IPV6 Error join(const IPV6Multicast &ia); #endif /** * Drop membership from a multicast group. * * @return 0 (errSuccess) on success, else error code. * @param ia address of multicast group to drop. */ Error drop(const IPV4Multicast &ia); #ifdef CCXX_IPV6 Error drop(const IPV6Multicast &ia); #endif /** * Set the socket routing to indicate if outgoing messages * should bypass normal routing (set false). * * @return 0 on success. * @param enable normal routing when set to true. */ Error setRouting(bool enable); /** * Enable/disable delaying packets (Nagle algorithm) * * @return 0 on success. * @param enable disable Nagle algorithm when set to true. */ Error setNoDelay(bool enable); /** * An unconnected socket may be created directly on the local * machine. Sockets can occupy both the internet domain (AF_INET) * and UNIX socket domain (AF_UNIX) under unix. The socket type * (SOCK_STREAM, SOCK_DGRAM) and protocol may also be specified. * If the socket cannot be created, an exception is thrown. * * @param domain socket domain to use. * @param type base type and protocol family of the socket. * @param protocol specific protocol to apply. */ Socket(int domain, int type, int protocol = 0); /** * A socket object may be created from a file descriptor when that * descriptor was created either through a socket() or accept() * call. This constructor is mostly for internal use. * * @param fd file descriptor of an already existing socket. */ Socket(SOCKET fd); /** * Create an inactive socket object for base constructors. */ Socket(); /** * A socket can also be constructed from an already existing * Socket object. On POSIX systems, the socket file descriptor * is dup()'d. On Win32, DuplicateHandle() is used. * * @param source of existing socket to clone. */ Socket(const Socket &source); /** * Process a logical input line from a socket descriptor * directly. * * @param buf pointer to string. * @param len maximum length to read. * @param timeout for pending data in milliseconds. * @return number of bytes actually read. */ ssize_t readLine(char *buf, size_t len, timeout_t timeout = 0); /** * Read in a block of len bytes with specific separator. Can * be zero, or any other char. If \\n or \\r, it's treated just * like a readLine(). Otherwise it looks for the separator. * * @param buf pointer to byte allocation. * @param len maximum length to read. * @param separator separator for a particular ASCII character * @param t timeout for pending data in milliseconds. * @return number of bytes actually read. */ virtual ssize_t readData(void * buf,size_t len,char separator=0,timeout_t t=0); /** * Write a block of len bytes to socket. * * @param buf pointer to byte allocation. * @param len maximum length to write. * @param t timeout for pending data in milliseconds. * @return number of bytes actually written. */ virtual ssize_t writeData(const void* buf,size_t len,timeout_t t=0); public: /** * The socket base class may be "thrown" as a result of an * error, and the "catcher" may then choose to destroy the * object. By assuring the socket base class is a virtual * destructor, we can assure the full object is properly * terminated. */ virtual ~Socket(); /** * See if a specific protocol family is available in the * current runtime environment. * * @return true if family available. */ static bool check(Family fam); /** * Sockets may also be duplicated by the assignment operator. */ Socket &operator=(const Socket &from); /** * May be used to examine the origin of data waiting in the * socket receive queue. This can tell a TCP server where pending * "connect" requests are coming from, or a UDP socket where it's * next packet arrived from. * * @param port ptr to port number of sender. * @return host address, test with "isInetAddress()". */ virtual IPV4Host getIPV4Sender(tpport_t *port = NULL) const; inline IPV4Host getSender(tpport_t *port = NULL) const {return getIPV4Sender(port);} #ifdef CCXX_IPV6 virtual IPV6Host getIPV6Sender(tpport_t *port = NULL) const; #endif /** * Get the host address and port of the socket this socket * is connected to. If the socket is currently not in a * connected state, then a host address of 0.0.0.0 is * returned. * * @param port ptr to port number of remote socket. * @return host address of remote socket. */ IPV4Host getIPV4Peer(tpport_t *port = NULL) const; inline IPV4Host getPeer(tpport_t *port = NULL) const {return getIPV4Peer(port);} #ifdef CCXX_IPV6 IPV6Host getIPV6Peer(tpport_t *port = NULL) const; #endif /** * Get the local address and port number this socket is * currently bound to. * * @param port ptr to port number on local host. * @return host address of interface this socket is bound to. */ IPV4Host getIPV4Local(tpport_t *port = NULL) const; inline IPV4Host getLocal(tpport_t *port = NULL) const {return getIPV4Local(port);} #ifdef CCXX_IPV6 IPV6Host getIPV6Local(tpport_t *port = NULL) const; #endif /** * Perform NAT table lookup for this socket. * Used to allow an application to know the original ip:port * pair the the client "thinks" it is connecting to. Used mostly * to transparently impersonate a remote server/service. * * On error, 0.0.0.0:0 is returned and one of the following error codes * is set: errServiceUnavailable - if nat is not supported on the * current platform or if it was not compiled; errLookupFail - if the * nat syscall failed for some reason (extended error code); * errSearchErr - if the socket does not have nat information (i.e. * is not nated). * * NAT lookup is supported on NetFilter for ipv4 and ipv6 (Linux), * IPFilter for ipv4 (Solaris, *BSD except OpenBSD, HP-UX, etc.) and * Packet Filter for ipv4 and ipv6 (OpenBSD). * When using IPFilter or Packet Filter, the first NAT lookup must be * performed as root (the NAT device is read only for root and is opened * once, unless an error occurs). Permissions on the nat device may be * changed to solve this. * * \warning When using IPFilter and Packet Filter, application data model * must be the same as the running kernel (32/64 bits). * * @param port ptr to NATed port number on local host. * @return NATed host address that this socket is related to. */ IPV4Host getIPV4NAT(tpport_t *port = NULL) const; inline IPV4Host getNAT(tpport_t *port) const {return getIPV4NAT(port);} #ifdef CCXX_IPV6 IPV6Host getIPV6NAT(tpport_t *port = NULL) const; #endif /** * Used to specify blocking mode for the socket. A socket * can be made non-blocking by setting setCompletion(false) * or set to block on all access with setCompletion(true). * I do not believe this form of non-blocking socket I/O is supported * in winsock, though it provides an alternate asynchronous set of * socket services. * * @param immediate mode specify socket I/O call blocking mode. */ void setCompletion(bool immediate); /** * Enable lingering sockets on close. * * @param linger specify linger enable. */ Error setLinger(bool linger); /** * Set the keep-alive status of this socket and if keep-alive * messages will be sent. * * @return 0 on success. * @param enable keep alive messages. */ Error setKeepAlive(bool enable); /** * Set packet scheduling on platforms which support ip quality * of service conventions. This effects how packets in the * queue are scheduled through the interface. * * @return 0 on success, error code on failure. * @param service type of service enumerated type. */ Error setTypeOfService(Tos service); /** * Can test to see if this socket is "connected", and hence * whether a "catch" can safely call getPeer(). Of course, * an unconnected socket will return a 0.0.0.0 address from * getPeer() as well. * * @return true when socket is connected to a peer. */ bool isConnected(void) const; /** * Test to see if the socket is at least operating or if it * is mearly initialized. "initialized" sockets may be the * result of failed constructors. * * @return true if not in initial state. */ bool isActive(void) const; /** * Operator based testing to see if a socket is currently * active. */ bool operator!() const; /** * Return if broadcast has been enabled for the specified * socket. * * @return true if broadcast socket. */ inline bool isBroadcast(void) const {return flags.broadcast;}; /** * Return if socket routing is enabled. * * @return true if routing enabled. */ inline bool isRouted(void) const {return flags.route;}; /** * Often used by a "catch" to fetch the last error of a thrown * socket. * * @return error number of Error error. */ inline Error getErrorNumber(void) const {return errid;} /** * Often used by a "catch" to fetch the user set error string * of a thrown socket, but only if EXTENDED error codes are used. * * @return string for error message. */ inline const char *getErrorString(void) const {return errstr;} inline long getSystemError(void) const {return syserr;} const char *getSystemErrorString(void) const; /** * Get the status of pending operations. This can be used to * examine if input or output is waiting, or if an error has * occured on the descriptor. * * @return true if ready, false on timeout. * @param pend ready check to perform. * @param timeout in milliseconds, inf. if not specified. */ virtual bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF); }; /** * DCCP sockets are used for stream based connected sessions between two * sockets. Both error recovery and flow control operate transparently * for a DCCP socket connection. The DCCP socket base class is used both * for client connections and to bind a DCCP "server" for accepting DCCP * streams. * * An implicit and unique DCCPSocket object exists in Common C++ to represent * a bound DCCP socket acting as a "server" for receiving connection requests. * This class is not part of DCCPStream because such objects normally perform * no physical I/O (read or write operations) other than to specify a listen * backlog queue and perform "accept" operations for pending connections. * The Common C++ DCCPSocket offers a Peek method to examine where the next * pending connection is coming from, and a Reject method to flush the next * request from the queue without having to create a session. * * The DCCPSocket also supports a "OnAccept" method which can be called when a * DCCPStream related object is created from a DCCPSocket. By creating a * DCCPStream from a DCCPSocket, an accept operation automatically occurs, and * the DCCPSocket can then still reject the client connection through the * return status of it's OnAccept method. * * @author Leandro Sales * @author Heverton Stuart * @short bound server for DCCP streams and sessions. */ class __EXPORT DCCPSocket : public Socket { union { struct sockaddr_in ipv4; #ifdef CCXX_IPV6 struct sockaddr_in6 ipv6; #endif } peer; Family family; public: /** * A method to call in a derived DCCPSocket class that is acting * as a server when a connection request is being accepted. The * server can implement protocol specific rules to exclude the * remote socket from being accepted by returning false. The * Peek method can also be used for this purpose. * * @return true if client should be accepted. * @param ia internet host address of the client. * @param port number of the client. */ virtual bool onAccept(const IPV4Host &ia, tpport_t port); #ifdef CCXX_IPV6 virtual bool onAccept(const IPV6Host &ia, tpport_t port); #endif virtual IPV4Host getIPV4Sender(tpport_t *port = NULL) const; #ifdef CCXX_IPV6 virtual IPV6Host getIPV6Sender(tpport_t *port = NULL) const; #endif /** * A DCCP "server" is created as a DCCP socket that is bound * to a hardware address and port number on the local machine * and that has a backlog queue to listen for remote connection * requests. If the server cannot be created, an exception is * thrown. * * @param bind local ip address or interface to use. * @param port number to bind socket under. * @param backlog size of connection request queue. */ DCCPSocket(const IPV4Address &bind, tpport_t port, unsigned backlog = 5); #ifdef CCXX_IPV6 DCCPSocket(const IPV6Address &bind, tpport_t port, unsigned backlog = 5); #endif /** * Create a named dccp socket by service and/or interface id. * For IPV4 we use [host:]svc or [host/]svc for the string. * If we have getaddrinfo, we use that to obtain the addr to * bind for. * * @param name of host interface and service port to bind. * @param backlog size of connection request queue. */ DCCPSocket(const char *name, Family family = IPV4, unsigned backlog = 5); /** * Create an unconnected ephemeral DCCP client socket. */ DCCPSocket(Family family = IPV4); /** * Create a server session by accepting a DCCP Socket. */ DCCPSocket(DCCPSocket& server, timeout_t timeout = 0); /** * Used to reject the next incoming connection request. */ void reject(void); /** * Disconnect active dccp connection (client use). */ void disconnect(void); /** * Set CCID DCCP. */ bool setCCID(uint8 ccid); /** * Get TX CCID DCCP. */ int getTxCCID(); /** * Get RX CCID DCCP. */ int getRxCCID(); /** * Return number of bytes to be read */ size_t available(); /** * Create a DCCP client connection to a DCCP socket (on * a remote machine). * * @param host address of remote DCCP server. * @param port number to connect. */ void connect(const IPV4Host &host, tpport_t port, timeout_t timeout = 0); #ifdef CCXX_IPV6 void connect(const IPV6Host &host, tpport_t port, timeout_t timeout = 0); #endif /** * Connect to a named client. */ void connect(const char *name); /** * Used to wait for pending connection requests. * @return true if data packets available. * @param timeout in milliseconds. TIMEOUT_INF if not specified. */ inline bool isPendingConnection(timeout_t timeout = TIMEOUT_INF) /* not const -- jfc */ {return Socket::isPending(Socket::pendingInput, timeout);} /** * Use base socket handler for ending this socket. */ virtual ~DCCPSocket(); }; /** * UDP sockets implement the TCP SOCK_DGRAM UDP protocol. They can be * used to pass unverified messages between hosts, or to broadcast a * specific message to an entire subnet. Please note that Streaming of * realtime data commonly use UDPDuplex related classes rather than * UDPSocket. * * In addition to connected TCP sessions, Common C++ supports UDP sockets and * these also cover a range of functionality. Like a TCPSocket, A UDPSocket * can be created bound to a specific network interface and/or port address, * though this is not required. UDP sockets also are usually either * connected or otherwise "associated" with a specific "peer" UDP socket. * Since UDP sockets operate through discreet packets, there are no streaming * operators used with UDP sockets. * * In addition to the UDP "socket" class, there is a "UDPBroadcast" class. * The UDPBroadcast is a socket that is set to send messages to a subnet as a * whole rather than to an individual peer socket that it may be associated * with. * * UDP sockets are often used for building "realtime" media streaming * protocols and full duplex messaging services. When used in this manner, * typically a pair of UDP sockets are used together; one socket is used to * send and the other to receive data with an associated pair of UDP sockets * on a "peer" host. This concept is represented through the Common C++ * UDPDuplex object, which is a pair of sockets that communicate with another * UDPDuplex pair. * * * @author David Sugar * @short Unreliable Datagram Protocol sockets. */ class __EXPORT UDPSocket : public Socket { private: inline Error setKeepAlive(bool enable) {return Socket::setKeepAlive(enable);}; protected: #ifdef CCXX_IPV6 union { struct sockaddr_in6 ipv6; struct sockaddr_in ipv4; } peer; #else union { struct sockaddr_in ipv4; } peer; #endif Family family; public: /** * Create an unbound UDP socket, mostly for internal use. */ UDPSocket(Family family = IPV4); /** * Create a UDP socket bound by a service name. */ UDPSocket(const char *name, Family family = IPV4); /** * Create a UDP socket and bind it to a specific interface * and port address so that other UDP sockets on remote * machines (or the same host) may find and send UDP messages * to it. On failure to bind, an exception is thrown. * * @param bind address to bind this socket to. * @param port number to bind this socket to. */ UDPSocket(const IPV4Address &bind, tpport_t port); #ifdef CCXX_IPV6 UDPSocket(const IPV6Address &bind, tpport_t port); #endif /** * Destroy a UDP socket as a socket. */ virtual ~UDPSocket(); /** * Set the loopback. */ inline Error setLoopback(bool enable) {return Socket::setLoopbackByFamily(enable, family);} /** * Set the multicast. */ inline Error setMulticast(bool enable) {return Socket::setMulticastByFamily(enable, family);} /** * Set time to live. */ inline Error setTimeToLive(char ttl) {return Socket::setTimeToLiveByFamily(ttl, family);} /** * set the peer address to send message packets to. This can be * set before every send() call if nessisary. * * @param host address to send packets to. * @param port number to deliver packets to. */ void setPeer(const IPV4Host &host, tpport_t port); void connect(const IPV4Host &host, tpport_t port); #ifdef CCXX_IPV6 void setPeer(const IPV6Host &host, tpport_t port); void connect(const IPV6Host &host, tpport_t port); #endif /** * get the interface index for a named network device * * @param ethX is device name, like "eth0" or "eth1" * @param InterfaceIndex is the index value returned by os * @todo Win32 and ipv6 specific implementation. */ Socket::Error getInterfaceIndex(const char *ethX,int& InterfaceIndex); /** * join a multicast group on a particular interface * * @param ia is the multicast address to use * @param InterfaceIndex is the index value returned by * getInterfaceIndex * @todo Win32 and ipv6 specific implementation. */ Socket::Error join(const IPV4Multicast &ia,int InterfaceIndex); /** * Send a message packet to a peer host. * * @param buf pointer to packet buffer to send. * @param len of packet buffer to send. * @return number of bytes sent. */ ssize_t send(const void *buf, size_t len); /** * Receive a message from any host. * * @param buf pointer to packet buffer to receive. * @param len of packet buffer to receive. * @param reply save sender address for reply if true. * @return number of bytes received. */ ssize_t receive(void *buf, size_t len, bool reply = false); /** * Examine address of sender of next waiting packet. This also * sets "peer" address to the sender so that the next "send" * message acts as a "reply". This additional behavior overides * the standard socket getSender behavior. * * @param port pointer to hold port number. */ IPV4Host getIPV4Peer(tpport_t *port = NULL) const; inline IPV4Host getPeer(tpport_t *port = NULL) const {return getIPV4Peer(port);} #ifdef CCXX_IPV6 IPV6Host getIPV6Peer(tpport_t *port = NULL) const; #endif /** * Examine contents of next waiting packet. * * @param buf pointer to packet buffer for contents. * @param len of packet buffer. * @return number of bytes examined. */ inline ssize_t peek(void *buf, size_t len) {return _IORET64 ::recv(so, (char *)buf, _IOLEN64 len, MSG_PEEK);}; /** * Associate socket with a named connection */ void setPeer(const char *service); void connect(const char *service); /** * Disassociate this socket from any host connection. No data * should be read or written until a connection is established. */ Error disconnect(void); }; /** * Representing a UDP socket used for subnet broadcasts, this class * provides an alternate binding and setPeer() capability for UDP * sockets. * * @author David Sugar * @short Unreliable Datagram for subnet broadcasts. */ class __EXPORT UDPBroadcast : public UDPSocket { private: void setPeer(const IPV4Host &ia, tpport_t port); Error setBroadcast(bool enable) {return Socket::setBroadcast(enable);}; public: /** * Create and bind a subnet broadcast socket. * * @param ia address to bind socket under locally. * @param port to bind socket under locally. */ UDPBroadcast(const IPV4Address &ia, tpport_t port); /** * Set peer by subnet rather than specific host. * * @param subnet of peer hosts to send to. * @param port number to use. */ void setPeer(const IPV4Broadcast &subnet, tpport_t port); }; /** * Representing half of a two-way UDP connection, the UDP transmitter * can broadcast data to another selected peer host or to an entire * subnet. * * @author David Sugar * @short Unreliable Datagram Peer Associations. */ class __EXPORT UDPTransmit : protected UDPSocket { private: /** * Common code for diferent flavours of Connect (host, broadcast, * multicast). * * @param ia network address to associate with * @param port port number to associate with */ Error cConnect(const IPV4Address &ia, tpport_t port); protected: /** * Create a UDP transmitter. */ UDPTransmit(Family family = IPV4); /** * Create a UDP transmitter, bind it to a specific interface * and port address so that other UDP sockets on remote * machines (or the same host) may find and send UDP messages * to it, and associate it with a given port on a peer host. * On failure to bind, an exception is thrown. This class is * only used to build the UDP Duplex. * * @param bind address to bind this socket to. * @param port number to bind this socket to. */ UDPTransmit(const IPV4Address &bind, tpport_t port = 5005); #ifdef CCXX_IPV6 UDPTransmit(const IPV6Address &bind, tpport_t port = 5005); #endif /** * Associate this socket with a specified peer host. The port * number from the constructor will be used. All UDP packets * will be sent to and received from the specified host. * * @return 0 on success, -1 on error. * @param host address to connect socket to. * @param port to connect socket to. */ Error connect(const IPV4Host &host, tpport_t port); #ifdef CCXX_IPV6 Error connect(const IPV6Address &host, tpport_t port); #endif /** * Associate this socket with a subnet of peer hosts for * subnet broadcasting. The server must be able to assert * broadcast permission for the socket. * * @return 0 on success, -1 on error. * @param subnet subnet address to broadcast into. * @param port transport port to broadcast into. */ Error connect(const IPV4Broadcast &subnet, tpport_t port); /** * Associate this socket with a multicast group. * * @return 0 on success, -1 on error. * @param mgroup address of the multicast group to send to. * @param port port number */ Error connect(const IPV4Multicast &mgroup, tpport_t port); #ifdef CCXX_IPV6 Error connect(const IPV6Multicast &mgroup, tpport_t port); #endif /** * Transmit "send" to use "connected" send rather than sendto. * * @return number of bytes sent. * @param buf address of buffer to send. * @param len of bytes to send. */ inline ssize_t send(const void *buf, size_t len) {return _IORET64 ::send(so, (const char *)buf, _IOLEN64 len, MSG_NOSIGNAL);} /** * Stop transmitter. */ inline void endTransmitter(void) {Socket::endSocket();} /* * Get transmitter socket. * * @return transmitter. */ inline SOCKET getTransmitter(void) {return so;}; inline Error setMulticast(bool enable) {return Socket::setMulticastByFamily(enable, family);} inline Error setTimeToLive(unsigned char ttl) {return Socket::setTimeToLiveByFamily(ttl, family);}; public: /** * Transmit "send" to use "connected" send rather than sendto. * * @note Windows does not support MSG_DONTWAIT, so it is defined * as 0 on that platform. * @return number of bytes sent. * @param buffer address of buffer to send. * @param len of bytes to send. */ inline ssize_t transmit(const char *buffer, size_t len) {return _IORET64 ::send(so, buffer, _IOLEN64 len, MSG_DONTWAIT|MSG_NOSIGNAL);} /** * See if output queue is empty for sending more packets. * * @return true if output available. * @param timeout in milliseconds to wait. */ inline bool isOutputReady(unsigned long timeout = 0l) {return Socket::isPending(Socket::pendingOutput, timeout);}; inline Error setRouting(bool enable) {return Socket::setRouting(enable);}; inline Error setTypeOfService(Tos tos) {return Socket::setTypeOfService(tos);}; inline Error setBroadcast(bool enable) {return Socket::setBroadcast(enable);}; }; /** * Representing half of a two-way UDP connection, the UDP receiver * can receive data from another peer host or subnet. This class is * used exclusivily to derive the UDPDuplex. * * @author David Sugar * @short Unreliable Datagram Peer Associations. */ class __EXPORT UDPReceive : protected UDPSocket { protected: /** * Create a UDP receiver, bind it to a specific interface * and port address so that other UDP sockets on remote * machines (or the same host) may find and send UDP messages * to it, and associate it with a given port on a peer host. * On failure to bind, an exception is thrown. * * @param bind address to bind this socket to. * @param port number to bind this socket to. */ UDPReceive(const IPV4Address &bind, tpport_t port); #ifdef CCXX_IPV6 UDPReceive(const IPV6Address &bind, tpport_t port); #endif /** * Associate this socket with a specified peer host. The port * number from the constructor will be used. All UDP packets * will be sent received from the specified host. * * @return 0 on success, -1 on error. * @param host host network address to connect socket to. * @param port host transport port to connect socket to. */ Error connect(const IPV4Host &host, tpport_t port); #ifdef CCXX_IPV6 Error connect(const IPV6Host &host, tpport_t port); #endif /** * Check for pending data. * * @return true if data is waiting. * @param timeout in milliseconds. */ bool isPendingReceive(timeout_t timeout) {return Socket::isPending(Socket::pendingInput, timeout);}; /** * End receiver. */ inline void endReceiver(void) {Socket::endSocket();} inline SOCKET getReceiver(void) const {return so;}; inline Error setRouting(bool enable) {return Socket::setRouting(enable);} inline Error setMulticast(bool enable) {return Socket::setMulticastByFamily(enable, family);} inline Error join(const IPV4Multicast &ia) {return Socket::join(ia);} #ifdef CCXX_IPV6 inline Error join(const IPV6Multicast &ia) {return Socket::join(ia);} #endif inline Error drop(const IPV4Multicast &ia) {return Socket::drop(ia);} #ifdef CCXX_IPV6 inline Error drop(const IPV6Multicast &ia) {return Socket::drop(ia);} #endif public: /** * Receive a data packet from the connected peer host. * * @return num of bytes actually received. * @param buf address of data receive buffer. * @param len size of data receive buffer. */ inline ssize_t receive(void *buf, size_t len) {return _IORET64 ::recv(so, (char *)buf, _IOLEN64 len, 0);}; /** * See if input queue has data packets available. * * @return true if data packets available. * @param timeout in milliseconds. */ inline bool isInputReady(timeout_t timeout = TIMEOUT_INF) {return Socket::isPending(Socket::pendingInput, timeout);}; }; /** * UDP duplex connections impliment a bi-directional point-to-point UDP * session between two peer hosts. Two UDP sockets are typically used * on alternating port addresses to assure that sender and receiver * data does not collide or echo back. A UDP Duplex is commonly used * for full duplex real-time streaming of UDP data between hosts. * * @author David Sugar * @short Unreliable Datagram Peer Associations. */ class __EXPORT UDPDuplex : public UDPTransmit, public UDPReceive { public: /** * Create a UDP duplex as a pair of UDP simplex objects * bound to alternating and interconnected port addresses. * * @param bind address to bind this socket to. * @param port number to bind sender. */ UDPDuplex(const IPV4Address &bind, tpport_t port); #ifdef CCXX_IPV6 UDPDuplex(const IPV6Address &bind, tpport_t port); #endif /** * Associate the duplex with a specified peer host. Both * the sender and receiver will be interconnected with * the remote host. * * @return 0 on success, error code on error. * @param host address to connect socket to. * @param port number to connect socket to. */ Error connect(const IPV4Host &host, tpport_t port); #ifdef CCXX_IPV6 Error connect(const IPV6Host &host, tpport_t port); #endif /** * Disassociate this duplex from any host connection. No data * should be read or written until a connection is established. * * @return 0 on success, error code on error. */ Error disconnect(void); }; /** * TCP sockets are used for stream based connected sessions between two * sockets. Both error recovery and flow control operate transparently * for a TCP socket connection. The TCP socket base class is primary used * to bind a TCP "server" for accepting TCP streams. * * An implicit and unique TCPSocket object exists in Common C++ to represent * a bound TCP socket acting as a "server" for receiving connection requests. * This class is not part of TCPStream because such objects normally perform * no physical I/O (read or write operations) other than to specify a listen * backlog queue and perform "accept" operations for pending connections. * The Common C++ TCPSocket offers a Peek method to examine where the next * pending connection is coming from, and a Reject method to flush the next * request from the queue without having to create a session. * * The TCPSocket also supports a "OnAccept" method which can be called when a * TCPStream related object is created from a TCPSocket. By creating a * TCPStream from a TCPSocket, an accept operation automatically occurs, and * the TCPSocket can then still reject the client connection through the * return status of it's OnAccept method. * * @author David Sugar * @short bound server for TCP streams and sessions. */ class __EXPORT TCPSocket : protected Socket { protected: int segsize; void setSegmentSize(unsigned mss); public: /** * A method to call in a derived TCPSocket class that is acting * as a server when a connection request is being accepted. The * server can implement protocol specific rules to exclude the * remote socket from being accepted by returning false. The * Peek method can also be used for this purpose. * * @return true if client should be accepted. * @param ia internet host address of the client. * @param port number of the client. */ virtual bool onAccept(const IPV4Host &ia, tpport_t port); /** * Fetch out the socket. */ inline SOCKET getSocket(void) {return so;}; /** * Get the buffer size for servers. */ inline int getSegmentSize(void) {return segsize;}; /** * A TCP "server" is created as a TCP socket that is bound * to a hardware address and port number on the local machine * and that has a backlog queue to listen for remote connection * requests. If the server cannot be created, an exception is * thrown. * * @param bind local ip address or interface to use. * @param port number to bind socket under. * @param backlog size of connection request queue. * @param mss maximum segment size for accepted streams. */ TCPSocket(const IPV4Address &bind, tpport_t port, unsigned backlog = 5, unsigned mss = 536); /** * Create a named tcp socket by service and/or interface id. * For IPV4 we use [host:]svc or [host/]svc for the string. * If we have getaddrinfo, we use that to obtain the addr to * bind for. * * @param name of host interface and service port to bind. * @param backlog size of connection request queue. * @param mss maximum segment size for streaming buffers. */ TCPSocket(const char *name, unsigned backlog = 5, unsigned mss = 536); /** * Return address and port of next connection request. This * can be used instead of OnAccept() to pre-evaluate connection * requests. * * @return host requesting a connection. * @param port number of requestor. */ inline IPV4Host getRequest(tpport_t *port = NULL) const {return Socket::getIPV4Sender(port);} /** * Used to reject the next incoming connection request. */ void reject(void); /** * Used to get local bound address. */ inline IPV4Host getLocal(tpport_t *port = NULL) const {return Socket::getIPV4Local(port);} /** * Used to wait for pending connection requests. * @return true if data packets available. * @param timeout in milliseconds. TIMEOUT_INF if not specified. */ inline bool isPendingConnection(timeout_t timeout = TIMEOUT_INF) /* not const -- jfc */ {return Socket::isPending(Socket::pendingInput, timeout);} /** * Use base socket handler for ending this socket. */ virtual ~TCPSocket(); }; #ifdef CCXX_IPV6 /** * TCPV6 sockets are used for stream based connected sessions between two * ipv6 sockets. Both error recovery and flow control operate transparently * for a TCP socket connection. The TCP socket base class is primary used * to bind a TCP "server" for accepting TCP streams. * * An implicit and unique TCPV6Socket object exists in Common C++ to represent * a bound ipv6 TCP socket acting as a "server" for receiving connection requests. * This class is not part of TCPStream because such objects normally perform * no physical I/O (read or write operations) other than to specify a listen * backlog queue and perform "accept" operations for pending connections. * The Common C++ TCPV6Socket offers a Peek method to examine where the next * pending connection is coming from, and a Reject method to flush the next * request from the queue without having to create a session. * * The TCPV6Socket also supports a "OnAccept" method which can be called when a * TCPStream related object is created from a TCPSocket. By creating a * TCPStream from a TCPV6Socket, an accept operation automatically occurs, and * the TCPV6Socket can then still reject the client connection through the * return status of it's OnAccept method. * * @author David Sugar * @short bound server for TCP streams and sessions. */ class __EXPORT TCPV6Socket : protected Socket { private: int segsize; void setSegmentSize(unsigned mss); public: /** * A method to call in a derived TCPSocket class that is acting * as a server when a connection request is being accepted. The * server can implement protocol specific rules to exclude the * remote socket from being accepted by returning false. The * Peek method can also be used for this purpose. * * @return true if client should be accepted. * @param ia internet host address of the client. * @param port number of the client. */ virtual bool onAccept(const IPV6Host &ia, tpport_t port); /** * Fetch out the socket. */ inline SOCKET getSocket(void) {return so;}; inline int getSegmentSize(void) {return segsize;}; /** * A TCP "server" is created as a TCP socket that is bound * to a hardware address and port number on the local machine * and that has a backlog queue to listen for remote connection * requests. If the server cannot be created, an exception is * thrown. * * @param bind local ip address or interface to use. * @param port number to bind socket under. * @param backlog size of connection request queue. * @param mss maximum segment size of streaming buffer. */ TCPV6Socket(const IPV6Address &bind, tpport_t port, unsigned backlog = 5, unsigned mss = 536); /** * Create a TCP server for a named host interface and service * port. We use [host/]port for specifying the optional host * name and service port since ':' is a valid char for ipv6 * addresses. * * @param name of host interface and service to use. * @param backlog size of connection request queue. * @param mss maximum segment size of streaming buffers. */ TCPV6Socket(const char *name, unsigned backlog = 5, unsigned mss = 536); /** * Return address and port of next connection request. This * can be used instead of OnAccept() to pre-evaluate connection * requests. * * @return host requesting a connection. * @param port number of requestor. */ inline IPV6Host getRequest(tpport_t *port = NULL) const {return Socket::getIPV6Sender(port);} /** * Used to reject the next incoming connection request. */ void reject(void); /** * Used to get local bound address. */ inline IPV6Host getLocal(tpport_t *port = NULL) const {return Socket::getIPV6Local(port);} /** * Used to wait for pending connection requests. * @return true if data packets available. * @param timeout in milliseconds. TIMEOUT_INF if not specified. */ inline bool isPendingConnection(timeout_t timeout = TIMEOUT_INF) /* not const -- jfc */ {return Socket::isPending(Socket::pendingInput, timeout);} /** * Use base socket handler for ending this socket. */ virtual ~TCPV6Socket(); }; #endif /* :\projects\libraries\cplusplus\commonc++\win32\socket.h(357) : warning C4275: non dll-interface class 'streambuf' used as base for dll-interface class 'TCPStream' c:\program files\microsoft visual studio\vc98\include\streamb.h(69) : see declaration of 'streambuf' c:\projects\libraries\cplusplus\commonc++\win32\socket.h(358) : warning C4275: non dll-interface class 'iostream' used as base for dll-interface class 'TCPStream' c:\program files\microsoft visual studio\vc98\include\iostream.h(66) : see declaration of 'iostream' */ #ifdef _MSC_VER #pragma warning(disable:4275) // disable C4275 warning #endif /** * TCP streams are used to represent TCP client connections to a server * by TCP protocol servers for accepting client connections. The TCP * stream is a C++ "stream" class, and can accept streaming of data to * and from other C++ objects using the << and >> operators. * * TCPStream itself can be formed either by connecting to a bound network * address of a TCP server, or can be created when "accepting" a * network connection from a TCP server. * * @author David Sugar * @short streamable TCP socket connection. */ class __EXPORT TCPStream : protected std::streambuf, public Socket, public std::iostream { private: int doallocate(); void segmentBuffering(unsigned mss); friend TCPStream& crlf(TCPStream&); friend TCPStream& lfcr(TCPStream&); protected: timeout_t timeout; size_t bufsize; Family family; char *gbuf, *pbuf; public: /** * The constructor required for building other classes or to * start an unconnected TCPStream for connect. */ TCPStream(Family family = IPV4, bool throwflag = true, timeout_t to = 0); /** * Disconnect the current session and prepare for a new one. */ void disconnect(void); /** * Get protocol segment size. */ int getSegmentSize(void); protected: /** * Used to allocate the buffer space needed for iostream * operations. This function is called by the constructor. * * @param size of stream buffers from constructor. */ void allocate(size_t size); /** * Used to terminate the buffer space and cleanup the socket * connection. This fucntion is called by the destructor. */ void endStream(void); /** * This streambuf method is used to load the input buffer * through the established tcp socket connection. * * @return char from get buffer, EOF if not connected. */ int underflow(); /** * This streambuf method is used for doing unbuffered reads * through the establish tcp socket connection when in interactive mode. * Also this method will handle proper use of buffers if not in * interative mode. * * @return char from tcp socket connection, EOF if not connected. */ int uflow(); /** * This streambuf method is used to write the output * buffer through the established tcp connection. * * @param ch char to push through. * @return char pushed through. */ int overflow(int ch); /** * Create a TCP stream by connecting to a TCP socket (on * a remote machine). * * @param host address of remote TCP server. * @param port number to connect. * @param mss maximum segment size of streaming buffers. */ void connect(const IPV4Host &host, tpport_t port, unsigned mss = 536); #ifdef CCXX_IPV6 void connect(const IPV6Host &host, tpport_t port, unsigned mss = 536); #endif /** * Connect a TCP stream to a named destination host and port * number, using getaddrinfo interface if available. * * @param name of host and service to connect * @param mss maximum segment size of stream buffer */ void connect(const char *name, unsigned mss = 536); /** * Used in derived classes to refer to the current object via * it's iostream. For example, to send a set of characters * in a derived method, one might use *tcp() << "test". * * @return stream pointer of this object. */ std::iostream *tcp(void) {return ((std::iostream *)this);}; public: /** * Create a TCP stream by accepting a connection from a bound * TCP socket acting as a server. This performs an "accept" * call. * * @param server socket listening * @param throwflag flag to throw errors. * @param timeout for all operations. */ TCPStream(TCPSocket &server, bool throwflag = true, timeout_t timeout = 0); #ifdef CCXX_IPV6 TCPStream(TCPV6Socket &server, bool throwflag = true, timeout_t timeout = 0); #endif /** * Accept a connection from a TCP Server. * * @param server socket listening */ void connect(TCPSocket &server); #ifdef CCXX_IPV6 void connect(TCPV6Socket &server); #endif /** * Create a TCP stream by connecting to a TCP socket (on * a remote machine). * * @param host address of remote TCP server. * @param port number to connect. * @param mss maximum segment size of streaming buffers. * @param throwflag flag to throw errors. * @param timeout for all operations. */ TCPStream(const IPV4Host &host, tpport_t port, unsigned mss = 536, bool throwflag = true, timeout_t timeout = 0); #ifdef CCXX_IPV6 TCPStream(const IPV6Host &host, tpport_t port, unsigned mss = 536, bool throwflag = true, timeout_t timeout = 0); #endif /** * Construct a named TCP Socket connected to a remote machine. * * @param name of remote service. * @param family of protocol. * @param mss maximum segment size of streaming buffers. * @param throwflag flag to throw errors. * @param timer for timeout for all operations. */ TCPStream(const char *name, Family family = IPV4, unsigned mss = 536, bool throwflag = false, timeout_t timer = 0); /** * Set the I/O operation timeout for socket I/O operations. * * @param timer to change timeout. */ inline void setTimeout(timeout_t timer) {timeout = timer;}; /** * A copy constructor creates a new stream buffer. * * @param source reference of stream to copy from. * */ TCPStream(const TCPStream &source); /** * Flush and empty all buffers, and then remove the allocated * buffers. */ virtual ~TCPStream(); /** * Flushes the stream input and output buffers, writes * pending output. * * @return 0 on success. */ int sync(void); #ifdef HAVE_SNPRINTF /** * Print content into a socket. * * @return count of bytes sent. * @param format string */ size_t printf(const char *format, ...); #endif /** * Get the status of pending stream data. This can be used to * examine if input or output is waiting, or if an error or * disconnect has occured on the stream. If a read buffer * contains data then input is ready and if write buffer * contains data it is first flushed and then checked. */ bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF); /** * Examine contents of next waiting packet. * * @param buf pointer to packet buffer for contents. * @param len of packet buffer. * @return number of bytes examined. */ inline ssize_t peek(void *buf, size_t len) {return _IORET64 ::recv(so, (char *)buf, _IOLEN64 len, MSG_PEEK);}; /** * Return the size of the current stream buffering used. * * @return size of stream buffers. */ inline size_t getBufferSize(void) const {return bufsize;}; }; /** * The TCP session is used to primarily to represent a client connection * that can be managed on a seperate thread. The TCP session also supports * a non-blocking connection scheme which prevents blocking during the * constructor and moving the process of completing a connection into the * thread that executes for the session. * * @author David Sugar * @short Threaded streamable socket with non-blocking constructor. */ class __EXPORT TCPSession : public Thread, public TCPStream { private: TCPSession(const TCPSession &rhs); // not defined protected: /** * Normally called during the thread Initial() method by default, * this will wait for the socket connection to complete when * connecting to a remote socket. One might wish to use * setCompletion() to change the socket back to blocking I/O * calls after the connection completes. To implement the * session one must create a derived class which implements * run(). * * @return 0 if successful, -1 if timed out. * @param timeout to wait for completion in milliseconds. */ int waitConnection(timeout_t timeout = TIMEOUT_INF); /** * The initial method is used to esablish a connection when * delayed completion is used. This assures the constructor * terminates without having to wait for a connection request * to complete. */ void initial(void); public: /** * Create a TCP socket that will be connected to a remote TCP * server and that will execute under it's own thread. * * @param host internet address of remote TCP server. * @param port number of remote server. * @param size of streaming buffer. * @param pri execution priority relative to parent. * @param stack allocation needed on some platforms. */ TCPSession(const IPV4Host &host, tpport_t port, size_t size = 536, int pri = 0, size_t stack = 0); #ifdef CCXX_IPV6 TCPSession(const IPV6Host &host, tpport_t port, size_t size = 536, int pri = 0, size_t stack = 0); #endif /** * Create a TCP socket from a bound TCP server by accepting a pending * connection from that server and execute a thread for the accepted * connection. * * @param server tcp socket to accept a connection from. * @param pri execution priority relative to parent. * @param stack allocation needed on some platforms. */ TCPSession(TCPSocket &server, int pri = 0, size_t stack = 0); #ifdef CCXX_IPV6 TCPSession(TCPV6Socket &server, int pri = 0, size_t stack = 0); #endif /** * Make sure destruction happens through a virtual... */ virtual ~TCPSession(); }; #if defined(WIN32) /** * class init_WSA used to initalise windows sockets specfifc stuff : there is * an MS - specific init sequence for Winsock 2 this class attempts to * initalise Winsock 2.2 - needed for non - blocking I/O. It will fall back * on 1.2 or lower if 2.0 or higher is not available, but < 2.0 does not * support non - blocking I/o * TO DO : might be an idea to have a method that reports version of * Winsock in use or a predicate to test if non - blocking is OK -- JFC */ class init_WSA { public: init_WSA(); ~init_WSA(); }; #endif // WIN32 class __EXPORT SimpleTCPStream; /** * @class SimpleTCPStream * @brief Simple TCP Stream, to be used with Common C++ Library * * This source is derived from a proposal made by Ville Vainio * (vvainio@tp.spt.fi). * * @author Mark S. Millard (msm@wizzer.com) * @date 2002-08-15 * Copyright (C) 2002 Wizzer Works. **/ class __EXPORT SimpleTCPStream : public Socket { private: IPV4Host getSender(tpport_t *port) const; protected: /** * The constructor required for "SimpleTCPStream", a more C++ style * version of the SimpleTCPStream class. */ SimpleTCPStream(); /** * Used to terminate the buffer space and cleanup the socket * connection. This fucntion is called by the destructor. */ void endStream(void); /** * Create a TCP stream by connecting to a TCP socket (on * a remote machine). * * @param host address of remote TCP server. * @param port number to connect. * @param size of streaming input and output buffers. */ void Connect(const IPV4Host &host, tpport_t port, size_t size); public: /** * Create a TCP stream by accepting a connection from a bound * TCP socket acting as a server. This performs an "accept" * call. * * @param server bound server tcp socket. * @param size of streaming input and output buffers. */ SimpleTCPStream(TCPSocket &server, size_t size = 512); /** * Create a TCP stream by connecting to a TCP socket (on * a remote machine). * * @param host address of remote TCP server. * @param port number to connect. * @param size of streaming input and output buffers. */ SimpleTCPStream(const IPV4Host &host, tpport_t port, size_t size = 512); /** * A copy constructor creates a new stream buffer. * * @param source A reference to the SimpleTCPStream to copy. */ SimpleTCPStream(const SimpleTCPStream &source); /** * Flush and empty all buffers, and then remove the allocated * buffers. */ virtual ~SimpleTCPStream(); /** * @brief Get the status of pending stream data. * * This method can be used to examine if input or output is waiting, * or if an error or disconnect has occured on the stream. * If a read buffer contains data then input is ready. If write buffer * contains data, it is first flushed and then checked. * * @param pend Flag indicating means to pend. * @param timeout The length of time to wait. */ bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF); void flush() {} /** * @brief Read bytes into a buffer. * * * * @param bytes A pointer to buffer that will contain the bytes read. * @param length The number of bytes to read (exactly). * @param timeout Period to time out, in milleseconds. * * @return The number of bytes actually read, 0 on EOF. */ ssize_t read(char *bytes, size_t length, timeout_t timeout = 0); /** * @brief Write bytes to buffer * * * * @param bytes A pointer to a buffer containing the bytes to write. * @param length The number of bytes to write (exactly). * @param timeout Period to time out, in milleseconds. * * @return The number of bytes actually written. */ ssize_t write(const char *bytes, size_t length, timeout_t timeout = 0); /** * @brief Peek at the incoming data. * * The data is copied into the buffer * but is not removed from the input queue. The function then returns * the number of bytes currently pending to receive. * * @param bytes A pointer to buffer that will contain the bytes read. * @param length The number of bytes to read (exactly). * @param timeout Period to time out, in milleseconds. * * @return The number of bytes pending on the input queue, 0 on EOF. */ ssize_t peek(char *bytes, size_t length, timeout_t timeout = 0); }; #ifdef COMMON_STD_EXCEPTION class __EXPORT SockException : public IOException { private: Socket::Error _socketError; public: SockException(const String &str, Socket::Error socketError, long systemError = 0) : IOException(str, systemError), _socketError(socketError) {}; inline Socket::Error getSocketError() const { return _socketError; } }; #endif #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/applog.h0000755000175000017500000003576111463403577013467 00000000000000// Copyright (C) 2005-2010 Angelo Naselli, Penta Engineering s.r.l. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file applog.h * @short Application logging facilities abstraction. **/ #ifndef ___APPLOG_H___ #define ___APPLOG_H___ #ifndef CCXX_SLOG_H_ #include #endif #include #include #include #include #include #ifdef CCXX_NAMESPACES using namespace std; namespace ost { #endif /** * Produces a dump of a buffer in a hexdump way with its * code Ascii translation and relative buffer address. * * For instance: * 0000000 - 77 98 21 49 0e 00 05 00 40 1c 01 1c 2f 00 00 00 w.!I....@.../... * */ class __EXPORT HEXdump { protected: /** * output string */ std::string _str; public: // max_len: max number of bytes to be printed. 0 prints all. /** * HEXdump constructor. * * @param buffer buffer to be "hexdumped" * @param buff_len buffer length * @param max_len max number of bytes to be "hexdumped". Usefull to * truncate output. mas_len=0 does prints all. */ HEXdump(const unsigned char *buffer, int buff_len, int max_len = 200); /** * HEXdump destructor. */ virtual ~HEXdump() { _str = string();} /** * const char* cast provided for conveneince. */ const char * c_str() const { return _str.c_str(); } /** * string cast provided for conveneince. */ std::string str() { return _str; } /** * operator << * @param hd hexdump. * @return application logger stream */ friend std::ostream& operator<< (std::ostream& out, const HEXdump &hd) { out << hd.c_str(); return out; } }; #ifdef CCXX_EXCEPTIONS /** * Applog exception, used for memory problems at the moment * */ class __EXPORT AppLogException : public ost::Exception { public: /** * Constructor. * @param what_arg exception string */ AppLogException(const std::string &what_arg) : ost::Exception(what_arg) {}; }; #endif class AppLogPrivate; /** * Application logger is a class that implements a logger that can be used * by applications to save log file somewhere on the system. * * It uses ost::slog to write to syslog and std::clog to write to standard * output. * * It provides either a stream oriented logger or a old printf style one. * * It can be used to log directly on a file or in a spooler like way. Latter * uses a ost::ThreadQueue to implement a thread safe access to logger. * * It provides a global stream variable called ost::alog. * * It provides an AppLog::Ident class that represents a module name for * instance that can be used to tag logs. Logging levels are the same * defined into ost::Slog: * Slog::levelEmergency * Slog::levelAlert * Slog::levelCritical * Slog::levelError * Slog::levelWarning * Slog::levelNotice * Slog::levelInfo * Slog::levelDebugfrom. * * Example of usage: alog << mod_name << debug << "Hello world!" << std::endl; */ class __EXPORT AppLog : protected streambuf, public ostream { protected: // d pointer AppLogPrivate *d; void writeLog(bool endOfLine = true); static map *assoc; public: /** * Ident class that represents module name. */ class __EXPORT Ident { private: std::string _ident; public: /** * Constructor. */ Ident() {}; /** * Desctructor. */ ~Ident() {}; /** * Copy constructor. */ Ident(Ident& id) {_ident = id._ident;} /** * const char* constructor, provided for convenience. */ Ident(const char *str) : _ident(str) {}; /** * std::string cast. */ std::string& str() {return _ident;} /** * Assignment operator (string). */ Ident& operator= (std::string &st) {_ident = st; return *this;} /** * Assignment operator (const char[]), provided for convenience. */ Ident& operator= (const char str[]) {_ident = str; return *this;} /** * const char* cast provided for conveneince. */ const char* c_str() {return _ident.c_str();} }; #ifndef WIN32 /** * Constructor for a customized logger. * @param logFileName log file name. * @param logDirectly true to write directly to file, false to use * a spooler like logger. * @param usePipe true to use pipe instead of file, false otherwise */ AppLog(const char* logFileName = NULL, bool logDirectly = false , bool usePipe = false); #else /** * Constructor for a customized logger. * @param logFileName log file name. * @param logDirectly true to write directly to file, false to use * a spooler like logger. */ AppLog(const char* logFileName = NULL, bool logDirectly = false); #endif /** * Destructor */ virtual ~AppLog(); /** * Subscribes the current thread to logger, it reserves thread safe * buffer for it. */ void subscribe(); /** * Unsubscribes the current thread from logger. */ void unsubscribe(); #ifndef WIN32 /** * Allows to set up ost::alog parameters. * @param FileName log file name. * @param logDirectly true to write directly to file, false to use * a spooler like logger. * @param usePipe true to use pipe instead of file, false otherwise */ void logFileName(const char* FileName, bool logDirectly = false, bool usePipe = false); #else /** * Allows to set up ost::alog parameters. * @param FileName log file name. * @param logDirectly true to write directly to file, false to use * a spooler like logger. */ void logFileName(const char* FileName, bool logDirectly = false); #endif /** * if logDirectly is set it closes the file. */ void close(void); /** * Sets the log level. * @param enable log level. */ void level(Slog::Level enable); /** * Enables clog output. * @param en true to enable clog output. */ void clogEnable(bool en = true); /** * Enables slog output for error level messages. * @param en true to enable slog output. */ void slogEnable(bool en = true); /** * Sets the level for that ident. * @param ident ident (module name for instance). * @param level level */ void identLevel(const char *ident, Slog::Level level); /** * Opens the file if not already and sets ident * @param ident module name for instance. */ void open(const char *ident); /** * stream overflow() overload. * @param c character to be managed * @return c */ virtual int overflow(int c); /** * stream sync() overload */ virtual int sync(); #ifdef HAVE_SNPRINTF /** * emerg level printf style method, provided for convenience. * @param format printf format */ void emerg(const char *format, ...); /** * alert level printf style method, provided for convenience. * @param format printf format */ void alert(const char *format, ...); /** * critical level printf style method, provided for convenience. * @param format printf format */ void critical(const char *format, ...); /** * error level printf style method, provided for convenience. * @param format printf format */ void error(const char *format, ...); /** * warn level printf style method, provided for convenience. * @param format printf format */ void warn(const char *format, ...); /** * notice level printf style method, provided for convenience. * @param format printf format */ void notice(const char *format, ...); /** * info level printf style method, provided for convenience. * @param format printf format */ void info(const char *format, ...); /** * debug level printf style method, provided for convenience. * @param format printf format */ void debug(const char *format, ...); #endif /** * operator to change ident and log level * @param ident ident (module name for instance) * @param level new log level * @return application logger stream */ AppLog &operator()(const char *ident, Slog::Level level = Slog::levelError); /** * operator to change ident * @param ident ident (module name for instance) * @return application logger stream */ inline AppLog& operator()(Ident &ident) { open(ident.c_str()); return *this; } /** * operator to change logging level * @param level new log level * @return application logger stream */ AppLog &operator()(Slog::Level level); /** * manipulator operator, to change print levels. * @param (* pfManipulator)(AppLog &) * @return application logger stream */ AppLog& operator<< (AppLog& (*pfManipulator)(AppLog&)); /** * manipulator operator, to use ostream manipulators (i.e. std::endl,...) * @param (* pfManipulator)(AppLog &) * @return application logger stream */ AppLog& operator<< (ostream& (*pfManipulator)(ostream&)); friend ostream& operator << (ostream &out, AppLog & al) { return al; } /** * operator << * @param ident module name for instance. * @return application logger stream */ inline AppLog& operator<< (Ident &ident) { open(ident.c_str()); return *this; } /** * warn level * @return application logger stream */ inline AppLog &warn(void) {return operator()(Slog::levelWarning);} /** * error level * @return application logger stream */ AppLog &error(void) { return operator()(Slog::levelError);} /** * debug level * @return application logger stream */ inline AppLog &debug(void) {return operator()(Slog::levelDebug);} /** * emerg level * @return application logger stream */ inline AppLog &emerg(void) {return operator()(Slog::levelEmergency);} /** * alert level * @return application logger stream */ inline AppLog &alert(void) {return operator()(Slog::levelAlert);} /** * critical level * @return application logger stream */ inline AppLog &critical(void) {return operator()(Slog::levelCritical);} /** * notice level * @return application logger stream */ inline AppLog ¬ice(void) {return operator()(Slog::levelNotice);} /** * info level * @return application logger stream */ inline AppLog &info(void) {return operator()(Slog::levelInfo);} /** * Translates level from string to Slog::Level, useful for * configuration files for instance. * Valid level names are: * "emerg" for Slog::levelEmergency * "alert" for Slog::levelAlert * "critical" for Slog::levelCritical * "error" for Slog::levelError * "warn" for Slog::levelWarning * "notice" for Slog::levelNotice * "info" for Slog::levelInfo * "debug" for Slog::levelDebug * @param name Slog Level name * @return Slog level value */ static Slog::Level levelTranslate(string name) { map::iterator it = assoc->find(name); return (it != assoc->end()) ? it->second : Slog::levelEmergency; } }; /** * Manipulator for debug level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog &debug(AppLog& sl) {return sl.operator()(Slog::levelDebug);} /** * Manipulator for warn level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog &warn(AppLog& sl) {return sl.operator()(Slog::levelWarning);} /** * Manipulator for error level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog &error(AppLog& sl) { return sl.operator()(Slog::levelError);} /** * Manipulator for emerg level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog &emerg(AppLog& sl) {return sl.operator()(Slog::levelEmergency);} /** * Manipulator for alert level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog &alert(AppLog& sl) {return sl.operator()(Slog::levelAlert);} /** * Manipulator for critical level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog &critical(AppLog& sl) {return sl.operator()(Slog::levelCritical);} /** * Manipulator for notice level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog ¬ice(AppLog& sl) {return sl.operator()(Slog::levelNotice);} /** * Manipulator for info level * @param sl application logger stream * @return application logger stream */ __EXPORT inline AppLog &info(AppLog& sl) {return sl.operator()(Slog::levelInfo);} /** * alog global log stream definition */ __EXPORT extern AppLog alog; #ifdef CCXX_NAMESPACES } //namespace #endif #endif //___APPLOG_H___ commoncpp2-1.8.1/inc/cc++/pointer.h0000644000175000017500000000744211463370517013652 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. /** * @file pointer.h * @short Template for creating reference count managed smart pointers. **/ #ifndef CCXX_POINTER_H_ #define CCXX_POINTER_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * Used to create and manage referece counted pointers. * * @author David Sugar * @short reference counted pointer template. */ template class Pointer { protected: unsigned *ptrCount; T *ptrObject; void ptrDetach(void) { if(ptrCount && --(*ptrCount)==0) { delete ptrObject; delete ptrCount; } ptrObject = NULL; ptrCount = NULL; } public: explicit Pointer(T* ptr = NULL) : ptrObject(ptr) { ptrCount = new unsigned; *ptrCount = 1; } Pointer(const Pointer &ref) { ptrObject = ref.ptrObject; ptrCount = ref.ptrCount; ++(*ptrCount); } inline virtual ~Pointer() {ptrDetach();} Pointer& operator=(const Pointer &ref) { if(this != &ref) { ptrDetach(); ptrObject = ref.ptrObject; ptrCount = ref.ptrCount; ++(*ptrCount); } return *this; } inline T& operator*() const {return *ptrObject;}; inline T* getObject() const {return ptrObject;}; inline T* operator->() const {return ptrObject;}; inline bool operator!() const {return (*ptrCount == 1);}; inline int operator++() const {return ++(*ptrCount);}; int operator--() const { if(*ptrCount == 1) { delete this; return 0; } return --(*ptrCount); } }; #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/inc/cc++/counter.h0000644000175000017500000000633611463366756013664 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. /** * @file counter.h * @short Generic automatic counter data type template class. **/ #ifndef CCXX_COUNTER_H_ #define CCXX_COUNTER_H_ #ifdef CCXX_NAMESPACES namespace ost { #endif /** * The counter template is used for generic objects which act as * automatic counters. Each time the object is accessed, the underlying * counted data type is incremented. * * @author David Sugar * @short Automatic counter template class. */ template class Counter { protected: T count; public: /** * Construct and initialize a counter to zero. */ inline Counter() {count = 0;}; /** * Construct a counter with an initial value set for another counter. * * @param counter to copy from. */ inline Counter(const Counter &counter) {count = counter.count;}; /** * Construct a counter with an initial value of the specified * data type. * * @param initial value to set. */ inline Counter(T initial) {count = initial;}; inline T& operator=(T c) {counter = c;}; inline operator T() {return count++;} }; #ifdef CCXX_NAMESPACES } // namespace #endif #endif commoncpp2-1.8.1/inc/cc++/process.h0000644000175000017500000002057611463370550013650 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file process.h * @short Process services. **/ #ifndef CCXX_PROCESS_H_ #define CCXX_PROCESS_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * A class for containing portable process related functions * that help create portable code. These are typically * referenced thru Process::xxx static member functions. * Many of these members are used both for win32 and posix * systems although some may be platform specific. * * @short Peocess wrapper class. * @author David Sugar */ class __EXPORT Process { private: static bool rtflag; public: #ifndef WIN32 typedef RETSIGTYPE (*Trap)(int); /** * Detach current process into a daemon, posix * only. Perhaps a similar method can be used * for creating win32 "services"? */ static void detach(void); /** * Attach the current process to another device * or i/o session. It is deamonified and dissasociated * with the prior parent process and controlling terminal. * * @param devname path to attach to. */ static void attach(const char *devname); /** * Set a posix compliant signal handler. * * @return previous handler. * @param signo signal no. * @param handler trap handler. */ static Trap setPosixSignal(int signo, Trap handler); /** * Set system call interuptable signal handler. * * #return previous handler. * @param signo signal no. * @param handler trap handler. */ static Trap setInterruptSignal(int signo, Trap handler); #endif /** * Lock a process in memory. Ideally you should be deep enough * where additional memallocs for functions will not kill you, * or use false for future. * * @return true if successful. * @param future pages as well... */ bool lock(bool future = true); /** * Unlock process pages. */ void unlock(void); /** * Spawn a process and wait for it's exit code. In win32 * this is done with the spawn system call. In posix, * this is done with a fork, an execvp, and a waitpid. * * @warning The implementation differences between posix and * win32 systems may cause side effects. For instance, if you * use atexit() and this spawn method, on posix systems the * function set up with atexit() will be called when the * parent process of the fork exits, which will not happen on * Win32 systems. * * @return error code from process. * @param exec name of executable. * @param argv list of command arguments. * @param wait for process to exit before return. */ static int spawn(const char *exec, const char **argv, bool wait = true); /** * Get the exit status of another process, waiting for it * to exit. * * @return exit code from process. * @param pid process id. */ static int join(int pid); /** * Cancel a running child process. * * @return 0 on success. * @param pid process id. * @param sig cancel signal to apply. */ static bool cancel(int pid, int sig = 0); /** * Get system environment. * * @return system environ symbol. * @param name of symbol. */ static const char *getEnv(const char *name); /** * Set system environment in a standard manner. * * @param name of environment symbol to set. * @param value of environment symbol. * @param overwrite true if replace existing symbol. */ static void setEnv(const char *name, const char *value, bool overwrite); /** * Get etc prefix path. * * @return etc prefix. */ static const char *getConfigDir(void); /** * Get home directory. * * @return user home directory. */ static const char *getHomeDir(void); /** * Get user name. * * @return user login id. */ static const char *getUser(void); /** * Set user id by name. * * @return true if successful. */ static bool setUser(const char *id, bool grp = true); /** * Set the effective group id by name. * * @return true if successful. */ static bool setGroup(const char *id); /** * Return the effective operating system page size. * * @return system page size. */ static size_t getPageSize(void); /** * Used to set process priority and optionally enable realtime. */ static void setPriority(int pri); /** * Used to set process scheduling policy. */ static void setScheduler(const char *policy); /** * Portable shortcut for setting realtime... */ static void setRealtime(int pri = 0); /** * Return true if scheduler settable. */ static bool isScheduler(void); /** * Return true if realtime scheduling. */ static inline bool isRealtime(void) {return rtflag;}; }; /** * This class is used to create a "named" lock entity that can be used * to control access to a resource between multiple processes. The * posix implimentation uses a pidfile and the win32 version uses a * globally visible mutex. * * @author David Sugar * @short System-wide named lock */ class __EXPORT Lockfile { private: #ifdef WIN32 HANDLE _mutex; bool _flagged; #else char *_path; #endif public: /** * Create a lock under a known name. * * @param name of system-wide lock to create. */ Lockfile(const char *name); /** * Create a new lock object that can be used to make locks. */ Lockfile(); /** * Destroy the current lock and release it. */ ~Lockfile() {unlock();}; /** * Lock a system-wide name for this process. If the lock * is successful, return true. If an existing lock was * already acquired, release it first. * * @return true if lock successful. * @param name system-wide lock to use. */ bool lock(const char *name); /** * Release an acquired lock. */ void unlock(void); /** * Flag if the current process has aqcuired a lock. * * @return true if we have the lock. */ bool isLocked(void); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/unix.h0000644000175000017500000003107511463371331013147 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file unix.h * @short UNIX domain sockets, streams and sessions. **/ #ifndef CCXX_UNIX_H_ #define CCXX_UNIX_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef WIN32 /** * Unix domain sockets are used for stream based connected sessions between * processes on the same machine. * An implicit and unique UnixSocket object exists in Common C++ to represent * a bound Unix domain socket acting as a "server" for receiving connection requests. * This class is not part of UnixStream because such objects normally perform * no physical I/O (read or write operations) other than to specify a listen * backlog queue and perform "accept" operations for pending connections. * * @author Alex Pavloff * @short bound server for Unix domain streams and sessions. */ class UnixSocket : protected Socket { protected: friend class UnixStream; friend class SocketPort; friend class unixstream; void close(void); char *path; public: /** * A Unix domain "server" is created as a Unix domain socket that is bound * to a pathname and that has a backlog queue to listen for connection * requests. If the server cannot be created, an exception is thrown. * * @param pathname pathname to socket file * @param backlog size of connection request queue. */ UnixSocket(const char* pathname, int backlog = 5); /** * Used to wait for pending connection requests. */ inline bool isPendingConnection(timeout_t timeout = TIMEOUT_INF) /** not const -- jfc */ {return Socket::isPending(pendingInput, timeout);} /** * Use base socket handler for ending this socket. */ virtual ~UnixSocket(); }; /** * Unix streams are used to represent Unix domain client connections to a * local server for accepting client connections. The Unix * stream is a C++ "stream" class, and can accept streaming of data to * and from other C++ objects using the << and >> operators. * * Unix Stream itself can be formed either by connecting to a bound network * address of a Unix domain server, or can be created when "accepting" a * network connection from a Unix domain server. * * @author Alex Pavloff * @short streamable Unix domain socket connection. */ class UnixStream : public Socket, public std::streambuf, public std::iostream { private: int doallocate(); protected: timeout_t timeout; int bufsize; char *gbuf, *pbuf; /** * The constructor required for "unixstream", a more C++ style * version of the TCPStream class. */ UnixStream(bool throwflag = true); /** * Used to allocate the buffer space needed for iostream * operations. This function is called by the constructor. * * @param size of stream buffers from constructor. */ void allocate(int size); /** * Used to terminate the buffer space and cleanup the socket * connection. This fucntion is called by the destructor. */ void endStream(void); /** * This streambuf method is used to load the input buffer * through the established unix domain socket connection. * * @return char from get buffer, EOF if not connected. */ virtual int underflow(void); /** * This streambuf method is used for doing unbuffered reads * through the established unix domain socket connection when in interactive mode. * Also this method will handle proper use of buffers if not in * interative mode. * * @return char from unix domain socket connection, EOF if not connected. */ int uflow(void); /** * This streambuf method is used to write the output * buffer through the established unix domain connection. * * @param ch char to push through. * @return char pushed through. */ int overflow(int ch); /** * Create a Unix domain stream by connecting to a Unix domain socket * * @param pathname path to socket * @param size of streaming input and output buffers. */ void connect(const char* pathname, int size); /** * Used in derived classes to refer to the current object via * it's iostream. For example, to send a set of characters * in a derived method, one might use *tcp() << "test". * * @return stream pointer of this object. */ std::iostream *unixstr(void) {return ((std::iostream *)this);}; public: /** * Create a Unix domain stream by accepting a connection from a bound * Unix domain socket acting as a server. This performs an "accept" * call. * * @param server socket listening. * @param size of streaming input and output buffers. * @param throwflag flag to throw errors. * @param timeout for all operations. */ UnixStream(UnixSocket &server, int size = 512, bool throwflag = true, timeout_t timeout = 0); /** * Create a Unix domain stream by connecting to a Unix domain socket * * @param pathname path to socket * @param size of streaming input and output buffers. * @param throwflag flag to throw errors. * @param to timeout for all operations. */ UnixStream(const char* pathname, int size = 512, bool throwflag = true, timeout_t to = 0); /** * Set the I/O operation timeout for socket I/O operations. * * @param to timeout to set. */ inline void setTimeout(timeout_t to) {timeout = to;}; /** * A copy constructor creates a new stream buffer. * * @param source of copy. * */ UnixStream(const UnixStream &source); /** * Flush and empty all buffers, and then remove the allocated * buffers. */ virtual ~UnixStream(); /** * Flushes the stream input and output buffers, writes * pending output. * * @return 0 on success. */ int sync(void); /** * Get the status of pending stream data. This can be used to * examine if input or output is waiting, or if an error or * disconnect has occured on the stream. If a read buffer * contains data then input is ready and if write buffer * contains data it is first flushed and then checked. */ bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF); /** * Return the size of the current stream buffering used. * * @return size of stream buffers. */ int getBufferSize(void) const {return bufsize;}; }; /** * A more natural C++ "unixstream" class for use by non-threaded * applications. This class behaves a lot more like fstream and * similar classes. * * @author Alex Pavloff * @short C++ "fstream" style unixstream class. */ class unixstream : public UnixStream { public: /** * Construct an unopened "tcpstream" object. */ unixstream(); /** * Construct and "open" (connect) the tcp stream to a remote * socket. * * @param pathname pathname to socket file * @param buffer size for streaming (optional). */ unixstream(const char *pathname, int buffer = 512); /** * Construct and "accept" (connect) the tcp stream through * a server. * * @param unixsock socket to accept from. * @param buffer size for streaming (optional). */ unixstream(UnixSocket &unixsock, int buffer = 512); /** * Open a tcp stream connection. This will close the currently * active connection first. * * @param pathname pathname to socket file * @param buffer size for streaming (optional) */ void open(const char *pathname, int buffer = 512) {UnixStream::connect( pathname, buffer );} /** * Open a tcp stream connection by accepting a tcp socket. * * @param unixsock socket to accept from. * @param buffer size for streaming (optional) */ void open(UnixSocket &unixsock, int buffer = 512); /** * Close the active tcp stream connection. */ void close(void); /** * Test to see if stream is open. */ bool operator!() const; }; /** * The Unix domain session is used to primarily to represent a client connection * that can be managed on a seperate thread. The Unix domain session also supports * a non-blocking connection scheme which prevents blocking during the * constructor and moving the process of completing a connection into the * thread that executes for the session. * * @author Alex Pavloff * @short Threaded streamable unix domain socket with non-blocking constructor. */ class __EXPORT UnixSession : public Thread, public UnixStream { protected: /** * Normally called during the thread Initial() method by default, * this will wait for the socket connection to complete when * connecting to a remote socket. One might wish to use * setCompletion() to change the socket back to blocking I/O * calls after the connection completes. To implement the * session one must create a derived class which implements * Run(). * * @return 0 if successful, -1 if timed out. * @param timeout to wait for completion in milliseconds. */ int waitConnection(timeout_t timeout = TIMEOUT_INF); /** * The initial method is used to esablish a connection when * delayed completion is used. This assures the constructor * terminates without having to wait for a connection request * to complete. */ void initial(void); public: /** * Create a Unix domain socket that will be connected to a local server * server and that will execute under it's own thread. * * @param pathname path to socket * @param size of streaming buffer. * @param pri execution priority relative to parent. * @param stack allocation needed on some platforms. */ UnixSession(const char* pathname, int size = 512, int pri = 0, int stack = 0); /** * Create a Unix domain socket from a bound Unix domain server by accepting a pending * connection from that server and execute a thread for the accepted connection. * * @param server unix domain socket to accept a connection from. * @param size of streaming buffer. * @param pri execution priority relative to parent. * @param stack allocation needed on some platforms. */ UnixSession(UnixSocket &server, int size = 512, int pri = 0, int stack = 0); /** * Virtual destructor. */ virtual ~UnixSession(); }; #endif // ndef WIN32 #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/inc/cc++/objcount.h0000644000175000017500000000540611463367742014021 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #ifndef CCXX_OBJCOUNT_H #define CCXX_OBJCOUNT_H #ifdef CCXX_NAMESPACES namespace ost { #endif /** * @file objcount.h * @short Template for object which holds self count of instances. **/ /** * Generic template class for creating classes which maintain an active * count of the number of instances currently in active use. This is a * form of global reference count. * * @author David Sugar * @short Object instance global reference count. */ template class objCounter { protected: static unsigned objCount; inline objCounter() {++objCount;}; inline virtual ~objCounter() {--objCount;}; }; template unsigned objCounter::objCount = 0; #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/inc/cc++/object.h0000644000175000017500000003723711463370403013437 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file object.h * @short Some object manipulation classes for smart pointers, linked lists, * etc. **/ #ifndef CCXX_OBJECT_H_ #define CCXX_OBJECT_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif class __EXPORT MapObject; class __EXPORT MapIndex; /** * A reference countable object. This is used in association with smart * pointers (RefPointer). * * @author David Sugar * @short Object managed by smart pointer reference count. */ class __EXPORT RefObject { protected: friend class RefPointer; unsigned refCount; /** * The constructor simply initializes the count. */ inline RefObject() {refCount = 0;}; /** * The destructor is called when the reference count returns * to zero. This is done through a virtual destructor. */ virtual ~RefObject(); public: /** * The actual object being managed can be returned by this * method as a void and then recast to the actual type. This * removes the need to dynamic cast from RefObject and the * dependence on rtti this implies. * * @return underlying object being referenced. */ virtual void *getObject(void) = 0; }; /** * Pointer to reference counted objects. This is a non-template form * of a reference count smart pointer, and so uses common code. This * can be subclassed to return explicit object types. * * @author David Sugar * @short Pointer to reference count managed objects. */ class __EXPORT RefPointer { protected: RefObject *ref; /** * Detach current object, for example, when changing pointer. */ void detach(void); /** * Patch point for mutex in derived class. This may often * be a single static mutex shared by a managed type. */ virtual void enterLock(void); /** * Patch point for a mutex in derived class. This may often * be a single static mutex shared by a managed type. */ virtual void leaveLock(void); public: /** * Create an unattached pointer. */ inline RefPointer() {ref = NULL;}; /** * Create a pointer attached to a reference counted object. * * Object being referenced. */ RefPointer(RefObject *obj); /** * A copy constructor. * * Pointer being copied. */ RefPointer(const RefPointer &ptr); virtual ~RefPointer(); RefPointer& operator=(const RefObject &ref); inline void *operator*() const {return getObject();}; inline void *operator->() const {return getObject();}; void *getObject(void) const; bool operator!() const; }; /** * Self managed single linked list object chain. This is used for * accumulating lists by using as a base class for a derived subclass. * * @author David Sugar * @short Accumulating single linked list. */ class __EXPORT LinkedSingle { protected: LinkedSingle *nextObject; inline LinkedSingle() {nextObject = NULL;}; virtual ~LinkedSingle(); public: /** * Get first linked object in list. This may be dynamically * recast, and may refer to a master static bookmark pointer * in a derived class. Otherwise it simply returns the current * object. In a "free" list, this may not only return the first * object, but also set the first to next. * * @return pointer to first object in list. */ virtual LinkedSingle *getFirst(void); /** * Gets the last object in the list. This normally follows the * links to the end. This is a virtual because derived class * may include a static member bookmark for the current end. * * @return pointer to last object in list. */ virtual LinkedSingle *getLast(void); /** * Get next object, for convenience. Derived class may use * this with a dynamic cast. * * @return next object in list. */ inline LinkedSingle *getNext(void) {return nextObject;}; /** * Insert object into chain. This is a virtual because * derived class may choose instead to perform an insert * at head or tail, may manage bookmarks, and may add mutex lock. * * @param object being inserted. */ virtual void insert(LinkedSingle& obj); LinkedSingle &operator+=(LinkedSingle &obj); }; /** * Self managed double linked list object chain. This is used for * accumulating lists by using as a base class for a derived subclass. * * @author David Sugar * @short Accumulating double linked list. */ class __EXPORT LinkedDouble { protected: LinkedDouble *nextObject, *prevObject; inline LinkedDouble() {nextObject = prevObject = NULL;}; virtual ~LinkedDouble(); virtual void enterLock(void); virtual void leaveLock(void); virtual LinkedDouble *firstObject(); virtual LinkedDouble *lastObject(); public: /** * Requested in overloaded insert() method to indicate how to insert * data into list */ enum InsertMode { modeAtFirst, /**< insert at first position in list pointed by current object */ modeAtLast, /**< insert at last position in list pointed by current object */ modeBefore, /**< insert in list before current object */ modeAfter /**< insert in list after current object */ }; /** * Get first linked object in list. This may be dynamically * recast, and may refer to a master static bookmark pointer * in a derived class. Otherwise it follows list to front. * * @return pointer to first object in list. */ virtual LinkedDouble *getFirst(void); /** * Gets the last object in the list. This normally follows the * links to the end. This is a virtual because derived class * may include a static member bookmark for the current end. * * @return pointer to last object in list. */ virtual LinkedDouble *getLast(void); /** * Virtual to get the insert point to use when adding new members. This * may be current, or always head or always tail. As a virtual, this allows * derived class to establish "policy". * * @return pointer to insertion point in list. */ virtual LinkedDouble *getInsert(void); /** * Get next object, for convenience. Derived class may use * this with a dynamic cast. * * @return next object in list. */ inline LinkedDouble *getNext(void) {return nextObject;}; /** * Get prev object in the list. * * @return pointer to previous object. */ inline LinkedDouble *getPrev(void) {return prevObject;}; /** * Insert object into chain at given position, as indicated by \ref InsertMode; * If no position is given, it defaults to \ref modeAtLast, inserting element * at list's end. * * @param object being inserted. * @param position where object is inserted. */ virtual void insert(LinkedDouble& obj, InsertMode position = modeAtLast); /** * Remove object from chain. */ virtual void detach(void); LinkedDouble &operator+=(LinkedDouble &obj); LinkedDouble &operator--(); }; /** * A map table allows for entities to be mapped (hash index) onto it. * Unlike with Assoc, This form of map table also allows objects to be * removed from the table. This table also includes a mutex lock for * thread safety. A free list is also optionally maintained for reusable * maps. * * @author David Sugar * @short Table to hold hash indexed objects. */ class __EXPORT MapTable : public Mutex { protected: friend class MapObject; friend class MapIndex; unsigned range; unsigned count; MapObject **map; void cleanup(void); public: /** * Create a map table with a specified number of slots. * * @param number of slots. */ MapTable(unsigned size); /** * Destroy the table, calls cleanup. */ virtual ~MapTable(); /** * Get index value from id string. This function can be changed * as needed to provide better collision avoidence for specific * tables. * * @param id string * @return index slot in table. */ virtual unsigned getIndex(const char *id); /** * Return range of this table. * * @return table range. */ inline unsigned getRange(void) {return range;}; /** * Return the number of object stored in this table. * * @return table size. */ inline unsigned getSize(void) {return count;}; /** * Lookup an object by id key. It is returned as void * for * easy re-cast. * * @param key to find. * @return pointer to found object or NULL. */ void *getObject(const char *id); /** * Map an object to our table. If it is in another table * already, it is removed there first. * * @param object to map. */ void addObject(MapObject &obj); /** * Get the first element into table, it is returned as void * for * easy re-cast. * * @return pointer to found object or NULL. */ void *getFirst(); /** * Get the last element into table, it is returned as void * for * easy re-cast. * * @return pointer to found object or NULL. */ void *getLast(); /** * Get table's end, useful for cycle control; it is returned as void * for * easy re-cast. * * @return pointer to found object or NULL. */ void *getEnd() { return NULL; }; /** * Get next object from managed free list. This returns as a * void so it can be recast into the actual type being used in * derived MapObject's. A derived version of MapTable may well * offer an explicit type version of this. Some derived * MapObject's may override new to use managed list. * * @return next object on free list. */ void *getFree(void); /** * Add an object to the managed free list. Some MapObject's * may override delete operator to detach and do this. * * @param object to add. */ void addFree(MapObject *obj); /** * An operator to map an object to the table. * * @return table being used. * @param object being mapped. */ MapTable &operator+=(MapObject &obj); /** * This operator is virtual in case it must also add the object to a * managed free list. * * @return current table. * @param object entity to remove. */ virtual MapTable &operator-=(MapObject &obj); }; /** * The MapIndex allows linear access into a MapTable, that otherwise could have * its elements being retrieved only by key. * It can be increased, checked and dereferenced like a pointer, by means of * suitable operators. * * @author Sergio Repetto * @short Index object to access MapTable elements */ class __EXPORT MapIndex { MapObject* thisObject; public : /** * Creates an empty map index (pointing to nothing). */ MapIndex() : thisObject(NULL) {}; /** * Creates a map index pointing to a specific map object * * @param the indexed object */ MapIndex(MapObject* theObject) : thisObject(theObject) {}; /** * Creates a copy of a given map index * * @param the source index object */ MapIndex(const MapIndex& theIndex) : thisObject(theIndex.thisObject) {}; /** * Dereference operator: the pointed object it is returned as void * for * easy re-cast. * * @return pointer to indexed object. */ void* operator*() const { return (void*)thisObject; } /** * Assignment operator to avoid implicit cast. * * @return the object itself, as changed. */ MapIndex& operator=(MapObject *theObject); /** * Prefix increment operator, to be used in loops and such. * * @return the object itself, as changed. */ MapIndex& operator++(); // prefix /** * Postfix increment operator, to be used in loops and such. * * @return the object itself, as changed. */ MapIndex operator++(int) // postfix { return this->operator++(); } /** * Comparison operator, between two MapIndex's. * * @return the object itself, as changed. */ bool operator==(const MapIndex& theIndex) const { return thisObject == theIndex.thisObject; }; bool operator!=(const MapIndex& theIndex) const { return !(*this == theIndex); }; /** * Comparison operator, between the MapIndex and a MapObject, useful to avoid * casts for sake of clearness. * * @return the object itself, as changed. */ bool operator==(const MapObject* theObject) const { return thisObject == theObject; }; bool operator!=(const MapObject* theObject) const { return !(*this == theObject); }; }; /** * The MapObject is a base class which can be used to make a derived * class operate on a MapTable. Derived classes may override new and * delete operators to use managed free list from a MapTable. * * @author David Sugar * @short Mappable object. */ class __EXPORT MapObject { protected: friend class MapTable; friend class MapIndex; MapObject *nextObject; const char *idObject; MapTable *table; public: /** * Remove the object from it's current table. */ void detach(void); /** * Save id, mark as not using any table. * * @param id string for this object. */ MapObject(const char *id); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/Makefile.am0000644000175000017500000000361111463365630014047 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. AUTOMAKE_OPTIONS = no-dependencies dist-shar dist-zip EXTRA_DIST = *.h MAINTAINERCLEANFILES = config.h Makefile.in config.tmp TEMPLATE = \ counter.h functions.h objcount.h objlink.h objmap.h objsync.h \ oststring.h template.h pointer.h ccxxincludedir=$(includedir)/cc++ #do not distribuite config.h, autogenerated dist-hook: rm -f $(distdir)/config.h # export.h are used by other library if EXTRAS ccxxinclude_HEADERS = \ common.h config.h digest.h exception.h export.h file.h \ misc.h network.h numbers.h persist.h serial.h slog.h applog.h \ socket.h strchar.h thread.h unix.h url.h xml.h process.h \ missing.h string.h buffer.h cmdoptns.h address.h zstream.h \ socketport.h tokenizer.h mime.h object.h $(TEMPLATE) else ccxxinclude_HEADERS = \ common.h config.h exception.h export.h file.h \ misc.h slog.h applog.h socket.h strchar.h thread.h process.h \ missing.h string.h buffer.h address.h zstream.h \ socketport.h object.h $(TEMPLATE) endif kdoc_headers = \ common.h config.h digest.h exception.h export.h file.h \ misc.h network.h numbers.h persist.h serial.h slog.h applog.h \ socket.h strchar.h thread.h unix.h url.h xml.h process.h \ missing.h string.h buffer.h zstream.h port.h object.h \ $(TEMPLATE) kdoc: kdoc -f html -d $(KDOC_DIR) -L $(KDOC_DIR) -n CommonC++ $(kdoc_headers) --cppcmd ../../doc/kdoc_cpp --cpp -I ../../doc view: lynx ../../doc/index.html commoncpp2-1.8.1/inc/cc++/cmdoptns.h0000644000175000017500000003435111463403537014017 00000000000000// Copyright (C) 2001-2010 Gianni Mariani // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file cmdoptns.h * @short Command line option parsing interface. **/ #ifndef CCXX_CMDOPTNS_H_ #define CCXX_CMDOPTNS_H_ #ifndef CCXX_STRING_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif class CommandOption; class CommandOptionParse; /** * This defines a linked list head pointer for all the command line * options that use the default list. It will most likely * be used in most cases without being explicitly referenced in application * code. It is a default value of various method's parameters. * */ extern __EXPORT CommandOption * defaultCommandOptionList; /** * CommandOption is the base class for all command line options. Command * line options can be defined statically and used when constructing * a command line parser onject using makeCommandOptionParse. This serves * only as a base class to CommandOptionWithArg, CommandOptionRest or * CommandOptionNoArg which can also be used to derive more complex * classes or even entire applications. * * @author Gianni Mariani */ class __EXPORT CommandOption { public: /** * Long option name, these will be preceded with "--" on the command line. * e.g. --file foo.x */ const char * optionName; /** * option letter, these will be preceded with "-" on the command line. * e.g. -f foo.x */ const char * optionLetter; /** * A short description of the option for Usage messages. * e.g. Usage: mycommand : blah * -f, --file \ */ const char * description; /** * OptionType is for denoting what type of option this is, with an * arg, without an arg or the trailing args. * @short Option type */ enum OptionType { /** * This option is associated with a value */ hasArg, /** * This option is a flag only */ noArg, /** * Remaining of the command line arguments */ trailing, /** * Collect values that are not a value to an option */ collect }; /** * This command option's OptionType. */ OptionType optionType; // HasArg, NoArg or Trailing /** * True if this parameter is required. If the parameter is not supplied * and required is true, an error will be flagged in the option processor. */ bool required; // Option is required - fail without it /** * This next CommandOption in this list of options or nil if no more * options exist. */ CommandOption * next; /** * A virtual destructor just in case. */ virtual ~CommandOption(); /** * CommandOption contructor. Note the default values for required and * ppNext. * * @param inOptionName long option name * @param inOptionLetter short letter name * @param inDescription short description of the option * @param inOptionType the type of this option * @param inRequired true if option is required * @param ppNext the linked list header */ CommandOption( const char * inOptionName, const char * inOptionLetter, const char * inDescription, OptionType inOptionType, bool inRequired = false, CommandOption ** ppNext = & defaultCommandOptionList ); /** * foundOption is called by the CommandOptionParse object during the parsing * of the command line options. * * @param cop pointer to the command option parser * @param value the value of this option */ virtual void foundOption( CommandOptionParse * cop, const char * value = 0 ); /** * foundOption is called by the CommandOptionParse object during the parsing * of the command line options. * * @param cop pointer to the command option parser * @param value an array of values of this option * @param num number of values in the array */ virtual void foundOption( CommandOptionParse * cop, const char ** value, int num ); /** * Once parsing of command line options is complete, this method is called. * This can be used to perform last minute checks on the options collected. * * @param cop pointer to the command option parser */ virtual void parseDone( CommandOptionParse * cop ); /** * Once CommandOption objects have completed parsing and there are no * errors they may have some specific tasks to perform. PerformTask * must return. * * @param cop pointer to the command option parser */ virtual void performTask( CommandOptionParse * cop ); /** * For fields with the required flag set, this method is used to determine * if the Option has satisfied it's required status. The default methods * simply returns true if any values have been found. This could be specialized * to return true based on some other criteria. */ virtual bool hasValue(); }; /** * Derived class of CommandOption for options that have a value associated with them. * Classes CommandOptionRest and CommandOptionArg derive from this class. */ class __EXPORT CommandOptionWithArg : public CommandOption { public: /** * Array of list of values collected for this option. */ const char ** values; /** * Number of values in the values array. */ int numValue; /** * CommandOptionWithArg contructor. Note the default values for required and * ppNext. * * @param inOptionName long option name * @param inOptionLetter short letter name * @param inDescription short description of the option * @param inOptionType the type of this option * @param inRequired true if option is required * @param ppNext the linked list header */ CommandOptionWithArg( const char * inOptionName, const char * inOptionLetter, const char * inDescription, OptionType inOptionType, bool inRequired = false, CommandOption ** ppNext = & defaultCommandOptionList ); virtual ~CommandOptionWithArg(); virtual void foundOption( CommandOptionParse * cop, const char * value = 0 ); virtual void foundOption( CommandOptionParse * cop, const char ** value, int num ); virtual bool hasValue(); }; /** * Class for options with an argument e.g. --option value . */ class __EXPORT CommandOptionArg : public CommandOptionWithArg { public: /** * CommandOptionArg contructor. This sets the optionType for this * object to HasArg. * * @param inOptionName long option name * @param inOptionLetter short letter name * @param inDescription short description of the option * @param inRequired true if option is required * @param ppNext the linked list header */ CommandOptionArg( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired = false, CommandOption ** ppNext = & defaultCommandOptionList ); virtual ~CommandOptionArg(); }; /** * It only makes sense to have a single one of these set and it is * exclusive with CommandOptionCollect. It is the option that takes the rest * of the command line options that are not part of any other options. * e.g. "strace -ofile command arg1 arg2". The "command arg1 arg2" part is * placed in objects of this class. * * @short CommandOption to take the rest of the command line */ class __EXPORT CommandOptionRest : public CommandOptionWithArg { public: /** * CommandOptionRest contructor. This sets the optionType for this * object to Trailing. * * @param inOptionName long option name * @param inOptionLetter short letter name * @param inDescription short description of the option * @param inRequired true if option is required * @param ppNext the linked list header */ CommandOptionRest( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired = false, CommandOption ** ppNext = & defaultCommandOptionList ); }; /** * It only makes sense to have a single one of these set and it is also * exclusive with CommandOptionRest. This makes parameter collecting * behave line the Unix "cat" command. * * @short CommandOption to collect parameters that are not options. */ class __EXPORT CommandOptionCollect : public CommandOptionWithArg { public: /** * CommandOptionRest contructor. This sets the optionType for this * object to Collect. * * @param inOptionName long option name * @param inOptionLetter short letter name * @param inDescription short description of the option * @param inRequired true if option is required * @param ppNext the linked list header */ CommandOptionCollect( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired = false, CommandOption ** ppNext = & defaultCommandOptionList ); }; /** * CommandOption type for flags. */ class __EXPORT CommandOptionNoArg : public CommandOption { public: /** * The number of times this value has been set. */ int numSet; // The number of times this argument is set /** * CommandOptionArg contructor. This sets the optionType for this * object to NoArg. * * @param inOptionName long option name * @param inOptionLetter short letter name * @param inDescription short description of the option * @param inRequired true if option is required * @param ppNext the linked list header */ CommandOptionNoArg( const char * inOptionName, const char * inOptionLetter, const char * inDescription, bool inRequired = false, CommandOption ** ppNext = & defaultCommandOptionList ); /** * CommandOptionNoArg::foundOption will evpect a nil "value" passed in. */ virtual void foundOption( CommandOptionParse * cop, const char * value = 0 ); }; /** * This is the CommandOptionParse interface class. To implement this object you can * call makeCommandOptionParse(); This will instantiate a dynamically allocated * version of this class and parse the command line for the list of command options * that are passed in. * * @author Gianni Mariani */ class __EXPORT CommandOptionParse { public: /** * Virtual destructor needed so that the object may be correctly deleted. */ virtual ~CommandOptionParse() = 0; /** * Get the value of the error flag set if the parser encountered errors. */ virtual bool argsHaveError() = 0; /** * Return a string of text describing the list of errors encountered. */ virtual const char * printErrors() = 0; /** * Return a string that contains the usage description of this list of paramaters. */ virtual const char * printUsage() = 0; /** * Register an error with this parser. This string will be appended to the * errors already buffered in this object. */ virtual void registerError( const char * errMsg ) = 0; /** * The method should be invoked by the main code once it has determined that * the application should be started. */ virtual void performTask() = 0; }; /** * makeCommandOptionParse will create an implementation of a CommandOptionParse * object. This particular implementation is a wrapper around getopt_long(3). * That interface unfortunatly does not provide enough information to give * the best error messages with malformed input. If the implementation changes * there is a good chance that the binary interface will remain the same. * */ __EXPORT CommandOptionParse * makeCommandOptionParse( int argc, char ** argv, const char * comment, CommandOption * options = defaultCommandOptionList ); #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/Makefile.in0000644000175000017500000004301511463364513014061 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = inc/cc++ DIST_COMMON = $(am__ccxxinclude_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = depcomp = am__depfiles_maybe = SOURCES = DIST_SOURCES = am__ccxxinclude_HEADERS_DIST = common.h config.h exception.h export.h \ file.h misc.h slog.h applog.h socket.h strchar.h thread.h \ process.h missing.h string.h buffer.h address.h zstream.h \ socketport.h object.h counter.h functions.h objcount.h \ objlink.h objmap.h objsync.h oststring.h template.h pointer.h \ digest.h network.h numbers.h persist.h serial.h unix.h url.h \ xml.h cmdoptns.h tokenizer.h mime.h 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)$(ccxxincludedir)" HEADERS = $(ccxxinclude_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = no-dependencies dist-shar dist-zip EXTRA_DIST = *.h MAINTAINERCLEANFILES = config.h Makefile.in config.tmp TEMPLATE = counter.h functions.h objcount.h objlink.h objmap.h objsync.h \ oststring.h template.h pointer.h ccxxincludedir = $(includedir)/cc++ @EXTRAS_FALSE@ccxxinclude_HEADERS = \ @EXTRAS_FALSE@ common.h config.h exception.h export.h file.h \ @EXTRAS_FALSE@ misc.h slog.h applog.h socket.h strchar.h thread.h process.h \ @EXTRAS_FALSE@ missing.h string.h buffer.h address.h zstream.h \ @EXTRAS_FALSE@ socketport.h object.h $(TEMPLATE) # export.h are used by other library @EXTRAS_TRUE@ccxxinclude_HEADERS = \ @EXTRAS_TRUE@ common.h config.h digest.h exception.h export.h file.h \ @EXTRAS_TRUE@ misc.h network.h numbers.h persist.h serial.h slog.h applog.h \ @EXTRAS_TRUE@ socket.h strchar.h thread.h unix.h url.h xml.h process.h \ @EXTRAS_TRUE@ missing.h string.h buffer.h cmdoptns.h address.h zstream.h \ @EXTRAS_TRUE@ socketport.h tokenizer.h mime.h object.h $(TEMPLATE) kdoc_headers = \ common.h config.h digest.h exception.h export.h file.h \ misc.h network.h numbers.h persist.h serial.h slog.h applog.h \ socket.h strchar.h thread.h unix.h url.h xml.h process.h \ missing.h string.h buffer.h zstream.h port.h object.h \ $(TEMPLATE) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu inc/cc++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu inc/cc++/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-ccxxincludeHEADERS: $(ccxxinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(ccxxincludedir)" || $(MKDIR_P) "$(DESTDIR)$(ccxxincludedir)" @list='$(ccxxinclude_HEADERS)'; test -n "$(ccxxincludedir)" || 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)$(ccxxincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(ccxxincludedir)" || exit $$?; \ done uninstall-ccxxincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(ccxxinclude_HEADERS)'; test -n "$(ccxxincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(ccxxincludedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(ccxxincludedir)" && 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 $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(ccxxincludedir)"; 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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-ccxxincludeHEADERS 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-ccxxincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags dist-hook distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am \ install-ccxxincludeHEADERS 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-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags uninstall uninstall-am \ uninstall-ccxxincludeHEADERS #do not distribuite config.h, autogenerated dist-hook: rm -f $(distdir)/config.h kdoc: kdoc -f html -d $(KDOC_DIR) -L $(KDOC_DIR) -n CommonC++ $(kdoc_headers) --cppcmd ../../doc/kdoc_cpp --cpp -I ../../doc view: lynx ../../doc/index.html # 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: commoncpp2-1.8.1/inc/cc++/template.h0000644000175000017500000000465111463371176014006 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. /** * @file template.h * @short GNU Common C++ template subsystem. **/ #ifndef CCXX_TEMPLATE_H_ #define CCXX_TEMPLATE_H_ #ifndef CCXX_CONFIG_H_ #include #endif #include #include #include #include #include #include #include #include #endif commoncpp2-1.8.1/inc/cc++/objlink.h0000644000175000017500000000616211463370162013614 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. /** * @file objlink.h * @short Template for creating linked list of objects with lookup. **/ #ifndef CCXX_OBJLINK_H #define CCXX_OBJLINK_H #include #ifdef CCXX_NAMESPACES namespace ost { #endif /** * Used to create and manage a single linked list of objects of a common * type. The list of created objects can be examined to find a key by * an identifier. * * @author David Sugar * @short single linked list searchable template chain. */ template class objList { protected: static T* objFirst; T* objNext; const K objKey; objList(const K key) { objKey = key; objNext = objFirst; objFirst = (T *)this; } public: static T* getObject(const K& key); }; template T *objList::objFirst = NULL; template T *objList::getObject(const K& key) { T *obj = objList::objFirst; while(obj) { if(key == obj->objKey) break; obj = obj->objNext; } return obj; } #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/inc/cc++/functions.h0000644000175000017500000000443311463367307014202 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #ifndef CCXX_FUNCTIONS_H #define CCXX_FUNCTIONS_H #ifdef CCXX_NAMESPACES namespace ost { #endif template inline const T& abs(const T& v) { if(v < (T)0) return -v; return v; } #ifdef CCXX_NAMESPACES } // namespace #endif #endif commoncpp2-1.8.1/inc/cc++/serial.h0000644000175000017500000006054011463370622013444 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file serial.h * @short Serial I/O services. **/ #ifndef CCXX_SERIAL_H_ #define CCXX_SERIAL_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_EXCEPTION_H_ #include #endif #ifndef WIN32 typedef int HANDLE; #define INVALID_HANDLE_VALUE (-1) #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * The Serial class is used as the base for all serial I/O services * under APE. A serial is a system serial port that is used either * for line or packet based data input. Serial ports may also be * "streamable" in a derived form. * * Common C++ serial I/O classes are used to manage serial devices and * implement serial device protocols. From the point of view of Common C++, * serial devices are supported by the underlying Posix specified "termios" * call interface. * * The serial I/O base class is used to hold a descriptor to a serial device * and to provide an exception handling interface for all serial I/O classes. * The base class is also used to specify serial I/O properties such as * communication speed, flow control, data size, and parity. The "Serial" * base class is not itself directly used in application development, * however. * * Common C++ Serial I/O is itself divided into two conceptual modes; frame * oriented and line oriented I/O. Both frame and line oriented I/O makes * use of the ability of the underlying tty driver to buffer data and return * "ready" status from when select either a specified number of bytes or * newline record has been reached by manipulating termios c_cc fields * appropriately. This provides some advantage in that a given thread * servicing a serial port can block and wait rather than have to continually * poll or read each and every byte as soon as it appears at the serial port. * * @author David Sugar * @short base class for all serial I/O services. */ class __EXPORT Serial { public: enum Error { errSuccess = 0, errOpenNoTty, errOpenFailed, errSpeedInvalid, errFlowInvalid, errParityInvalid, errCharsizeInvalid, errStopbitsInvalid, errOptionInvalid, errResourceFailure, errOutput, errInput, errTimeout, errExtended }; typedef enum Error Error; enum Flow { flowNone, flowSoft, flowHard, flowBoth }; typedef enum Flow Flow; enum Parity { parityNone, parityOdd, parityEven }; typedef enum Parity Parity; enum Pending { pendingInput, pendingOutput, pendingError }; typedef enum Pending Pending; private: Error errid; char *errstr; struct { bool thrown: 1; bool linebuf: 1; } flags; void * original; void * current; /** * Used to properly initialize serial object. */ void initSerial(void); protected: HANDLE dev; int bufsize; /** * Opens the serial device. * * @param fname Pathname of device to open */ void open(const char *fname); /** * Closes the serial device. * */ void close(void); /** * Reads from serial device. * * @param Data Point to character buffer to receive data. Buffers MUST * be at least Length + 1 bytes in size. * @param Length Number of bytes to read. */ virtual int aRead(char * Data, const int Length); /** * Writes to serial device. * * @param Data Point to character buffer containing data to write. Buffers MUST * @param Length Number of bytes to write. */ virtual int aWrite(const char * Data, const int Length); /** * This service is used to throw all serial errors which usually * occur during the serial constructor. * * @param error defined serial error id. * @param errstr string or message to optionally pass. */ Error error(Error error, char *errstr = NULL); /** * This service is used to thow application defined serial * errors where the application specific error code is a string. * * @param err string or message to pass. */ inline void error(char *err) {error(errExtended, err);}; /** * This method is used to turn the error handler on or off for * "throwing" execptions by manipulating the thrown flag. * * @param enable true to enable handler. */ inline void setError(bool enable) {flags.thrown = !enable;}; /** * Set packet read mode and "size" of packet read buffer. * This sets VMIN to x. VTIM is normally set to "0" so that * "isPending()" can wait for an entire packet rather than just * the first byte. * * @return actual buffer size set. * @param size of packet read request. * @param btimer optional inter-byte data packet timeout. */ int setPacketInput(int size, unsigned char btimer = 0); /** * Set "line buffering" read mode and specifies the newline * character to be used in seperating line records. isPending * can then be used to wait for an entire line of input. * * @param newline newline character. * @param nl1 EOL2 control character. * @return size of conical input buffer. */ int setLineInput(char newline = 13, char nl1 = 0); /** * Restore serial device to the original settings at time of open. */ void restore(void); /** * Used to flush the input waiting queue. */ void flushInput(void); /** * Used to flush any pending output data. */ void flushOutput(void); /** * Used to wait until all output has been sent. */ void waitOutput(void); /** * Used as the default destructor for ending serial I/O * services. It will restore the port to it's original state. */ void endSerial(void); /** * Used to initialize a newly opened serial file handle. You * should set serial properties and DTR manually before first * use. */ void initConfig(void); /** * This allows later ttystream class to open and close a serial * device. */ Serial() {initSerial();}; /** * A serial object may be constructed from a named file on the * file system. This named device must be "isatty()". * * @param name of file. */ Serial(const char *name); public: /** * The serial base class may be "thrown" as a result on an error, * and the "catcher" may then choose to destory the object. By * assuring the socket base class is a virtual destructor, we * can assure the full object is properly terminated. */ virtual ~Serial(); /** * Serial ports may also be duplecated by the assignment * operator. */ Serial &operator=(const Serial &from); /** * Set serial port speed for both input and output. * * @return 0 on success. * @param speed to select. 0 signifies modem "hang up". */ Error setSpeed(unsigned long speed); /** * Set character size. * * @return 0 on success. * @param bits character size to use (usually 7 or 8). */ Error setCharBits(int bits); /** * Set parity mode. * * @return 0 on success. * @param parity mode. */ Error setParity(Parity parity); /** * Set number of stop bits. * * @return 0 on success. * @param bits stop bits. */ Error setStopBits(int bits); /** * Set flow control. * * @return 0 on success. * @param flow control mode. */ Error setFlowControl(Flow flow); /** * Set the DTR mode off momentarily. * * @param millisec number of milliseconds. */ void toggleDTR(timeout_t millisec); /** * Send the "break" signal. */ void sendBreak(void); /** * Often used by a "catch" to fetch the last error of a thrown * serial. * * @return error numbr of last Error. */ inline Error getErrorNumber(void) {return errid;}; /** * Often used by a "catch" to fetch the user set error string * of a thrown serial. * * @return string for error message. */ inline char *getErrorString(void) {return errstr;}; /** * Get the "buffer" size for buffered operations. This can * be used when setting packet or line read modes to determine * how many bytes to wait for in a given read call. * * @return number of bytes used for buffering. */ inline int getBufferSize(void) {return bufsize;}; /** * Get the status of pending operations. This can be used to * examine if input or output is waiting, or if an error has * occured on the serial device. * * @return true if ready, false if timeout. * @param pend ready check to perform. * @param timeout in milliseconds. */ virtual bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF); }; /** * TTY streams are used to represent serial connections that are fully * "streamable" objects using C++ stream classes and friends. * * The first application relevant serial I/O class is the TTYStream class. * TTYStream offers a linearly buffered "streaming" I/O session with the * serial device. Furthermore, traditional C++ "stream" operators (<< and * >>) may be used with the serial device. A more "true" to ANSI C++ library * format "ttystream" is also available, and this supports an "open" method * in which one can pass initial serial device parameters immediately * following the device name in a single string, as in * "/dev/tty3a:9600,7,e,1", as an example. * * The TTYSession aggragates a TTYStream and a Common C++ Thread which is * assumed to be the execution context that will be used to perform actual * I/O operations. This class is very anagolous to TCPSession. * * * @author David Sugar * @short streamable tty serial I/O class. */ class __EXPORT TTYStream : protected std::streambuf, public Serial, public std::iostream { private: int doallocate(); friend TTYStream& crlf(TTYStream&); friend TTYStream& lfcr(TTYStream&); protected: char *gbuf, *pbuf; timeout_t timeout; /** * This constructor is used to derive "ttystream", a more * C++ style version of the TTYStream class. */ TTYStream(); /** * Used to allocate the buffer space needed for iostream * operations. This is based on MAX_INPUT. */ void allocate(void); /** * Used to terminate the buffer space and clean up the tty * connection. This function is called by the destructor. */ void endStream(void); /** * This streambuf method is used to load the input buffer * through the established tty serial port. * * @return char from get buffer, EOF also possible. */ int underflow(void); /** * This streambuf method is used for doing unbuffered reads * through the establish tty serial port when in interactive mode. * Also this method will handle proper use of buffers if not in * interative mode. * * @return char from tty serial port, EOF also possible. */ int uflow(void); /** * This streambuf method is used to write the output * buffer through the established tty port. * * @param ch char to push through. * @return char pushed through. */ int overflow(int ch); public: /** * Create and open a tty serial port. * * @param filename char name of device to open. * @param to default timeout. */ TTYStream(const char *filename, timeout_t to = 0); /** * End the tty stream and cleanup. */ virtual ~TTYStream(); /** * Set the timeout control. * * @param to timeout to use. */ inline void setTimeout(timeout_t to) {timeout = to;}; /** * Set tty mode to buffered or "interactive". When interactive, * all streamed I/O is directly sent to the serial port * immediately. * * @param flag bool set to true to make interactive. */ void interactive(bool flag); /** * Flushes the stream input and out buffers, writes * pending output. * * @return 0 on success. */ int sync(void); /** * Get the status of pending operations. This can be used to * examine if input or output is waiting, or if an error has * occured on the serial device. If read buffer contains data * then input is ready and if write buffer contains data it is * first flushed then checked. * * @return true if ready, false if timeout. * @param pend ready check to perform. * @param timeout in milliseconds. */ bool isPending(Pending pend, timeout_t timeout = TIMEOUT_INF); }; /** * A more natural C++ "ttystream" class for use by non-threaded * applications. This class behaves a lot more like fstream and * similar classes. * * @author David Sugar * @short C++ "fstream" style ttystream class. */ class __EXPORT ttystream : public TTYStream { public: /** * Construct an unopened "ttystream" object. */ ttystream(); /** * Construct and "open" a tty stream object. A filename in * the form "device:options[,options]" may be used to pass * device options as part of the open. * * @param name of file and serial options. */ ttystream(const char *name); /** * Open method for a tty stream. * * @param name filename to open. */ void open(const char *name); /** * Close method for a tty stream. */ void close(void); /** * Test to see if stream is opened. */ inline bool operator!() {return (dev < 0);}; }; /** * * The TTYSession aggragates a TTYStream and a Common C++ Thread which is * assumed to be the execution context that will be used to perform actual * I/O operations. This class is very anagolous to TCPSession. * * @author David Sugar * @short This class is very anagolous to TCPSession. */ class __EXPORT TTYSession : public Thread, public TTYStream { public: /** * Create TTY stream that will be managed by it's own thread. * * @param name of tty device to open. * @param pri execution priority. * @param stack allocation needed on some platforms. */ TTYSession(const char *name, int pri = 0, int stack = 0); virtual ~TTYSession(); }; #ifndef WIN32 // Not support this right now....... // class __EXPORT SerialPort; class __EXPORT SerialService; /** * The serial port is an internal class which is attached to and then * serviced by a specified SerialService thread. Derived versions of * this class offer specific functionality such as serial integration * protocols. * * The TTYPort and TTYService classes are used to form thread-pool serviced * serial I/O protocol sets. These can be used when one has a large number * of serial devices to manage, and a single (or limited number of) thread(s) * can then be used to service the tty port objects present. Each tty port * supports a timer control and several virtual methods that the service * thread can call when events occur. This model provides for "callback" * event management, whereby the service thread performs a "callback" into * the port object when events occur. Specific events supported include the * expiration of a TTYPort timer, pending input data waiting to be read, and * "sighup" connection breaks. * * * @author David Sugar * @short base class for thread pool serviced serial I/O. */ class __EXPORT SerialPort: public Serial, public TimerPort { private: SerialPort *next, *prev; SerialService *service; #ifdef USE_POLL struct pollfd *ufd; #endif bool detect_pending; bool detect_output; bool detect_disconnect; friend class SerialService; protected: /** * Construct a tty serial port for a named serial device. * * @param svc pool thread object. * @param name of tty port. */ SerialPort(SerialService *svc, const char *name); /** * Disconnect the Serial Port from the service pool thread * and shutdown the port. */ virtual ~SerialPort(); /** * Used to indicate if the service thread should monitor pending * data for us. */ void setDetectPending( bool ); /** * Get the current state of the DetectPending flag. */ inline bool getDetectPending( void ) const { return detect_pending; } /** * Used to indicate if output ready monitoring should be performed * by the service thread. */ void setDetectOutput( bool ); /** * Get the current state of the DetectOutput flag. */ inline bool getDetectOutput( void ) const { return detect_output; } /** * Called by the service thread when the objects timer * has expired. */ virtual void expired(void); /** * Called by the service thread when input data is pending * for this tty port. Effected by setPacketInput and by * setLineInput. */ virtual void pending(void); /** * Called by the service thread when an exception has occured * such as a hangup. */ virtual void disconnect(void); /** * Transmit "send" data to the serial port. This is not public * since it's meant to support internal protocols rather than * direct public access to the device. * * @return number of bytes send. * @param buf address of buffer to send. * @param len of bytes to send. */ inline int output(void *buf, int len) {return aWrite((char *)buf, len);}; /** * Perform when output is available for sending data. */ virtual void output(void); /** * Receive "input" for pending data from the serial port. This * is not a public member since it's meant to support internal * protocols rather than direct external access to the device. * * @return number of bytes received. * @param buf address of buffer to input. * @param len of input buffer used. */ inline int input(void *buf, int len) {return aRead((char *)buf, len);}; public: /** * Derived setTimer to notify the service thread pool of changes * in expected timeout. This allows SerialService to * reschedule all timers. * * @param timeout in milliseconds. */ void setTimer(timeout_t timeout = 0); /** * Derived incTimer to notify the service thread pool of a * change in expected timeout. This allows SerialService to * reschedule all timers. */ void incTimer(timeout_t timeout); }; /** * The SerialService is a thead service object that is meant to service * attached serial ports. Multiple pool objects may be created and * multiple serial ports may be attached to the same thread of * of execution. This allows one to balance threads and the serial ports * they service. * * The TTYPort and TTYService classes are used to form thread-pool serviced * serial I/O protocol sets. These can be used when one has a large number * of serial devices to manage, and a single (or limited number of) thread(s) * can then be used to service the tty port objects present. Each tty port * supports a timer control and several virtual methods that the service * thread can call when events occur. This model provides for "callback" * event management, whereby the service thread performs a "callback" into * the port object when events occur. Specific events supported include the * expiration of a TTYPort timer, pending input data waiting to be read, and * "sighup" connection breaks. * * * @author David Sugar * @short Thread pool service for serial ports. */ class __EXPORT SerialService : public Thread, private Mutex { private: fd_set connect; int iosync[2]; int hiwater; int count; SerialPort *first, *last; /** * Attach a new serial port to this service thread. * * @param port of SerialPort derived object to attach. */ void attach(SerialPort *port); /** * Detach a serial port from this service thread. * * @param port of SerialPort derived object to remove. */ void detach(SerialPort *port); /** * The service thread itself. */ void run(void); friend class SerialPort; protected: /** * A virtual handler for processing user defined update * requests (1-254) which have been posted through Update. * * @param flag of update request. */ virtual void onUpdate(unsigned char flag); /** * A virtual handler for event loop calls. This can be * used to extend event loop processing. */ virtual void onEvent(void); /** * A virtual handler for adding support for additional * callback events into SerialPort. * * @param port serial port currently being evaluated. */ virtual void onCallback(SerialPort *port); public: /** * Notify service thread that a port has been added or * removed, or a timer changed, so that a new schedule * can be computed for expiring attached ports. This * can also be used to pass requests to the OnUpdate() * event handler. * * @param flag event for OnUpdate, termination, or reschedule. */ void update(unsigned char flag = 0xff); /** * Create a service thread for attaching serial ports. The * thread begins execution with the first attached port. * * @param pri of this thread to run under. * @param stack stack size. * @param id stack ID. */ SerialService(int pri = 0, size_t stack = 0, const char *id = NULL); /** * Terminate the service thread and update attached objects. */ virtual ~SerialService(); /** * Get current reference count. This can be used when selecting * the lead used service handler from a pool. * * @return count of active ports. */ inline int getCount(void) {return count;}; }; #endif #ifdef COMMON_STD_EXCEPTION class __EXPORT SerException : public IOException { public: SerException(const String &str) : IOException(str) {}; }; #endif #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/mime.h0000644000175000017500000001417711463367350013125 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file mime.h * @short MIME document abstractions. **/ #ifndef CCXX_MIME_H_ #define CCXX_MIME_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif class __EXPORT MIMEMultipart; class __EXPORT MIMEItemPart; /** * A container class for multi-part MIME document objects which can * be streamed to a std::ostream destination. * * @author David Sugar * @short container for streamable multi-part MIME documents. */ class __EXPORT MIMEMultipart { protected: friend class __EXPORT MIMEItemPart; char boundry[8]; char mtype[80]; char *header[16]; MIMEItemPart *first, *last; virtual ~MIMEMultipart(); public: /** * Contruct a multi-part document, and describe it's type. * * @param document (content) type. */ MIMEMultipart(const char *document); /** * Stream the headers of the multi-part document. The headers * of individual entities are streamed as part of the body. * * @param output to stream document header into. */ virtual void head(std::ostream *output); /** * Stream the "body" of the multi-part document. This involves * streaming the headers and body of each document part. * * @param output to stream document body into. */ virtual void body(std::ostream *output); /** * Get a string array of the headers to use. This is used to * assist URLStream::post. * * @return array of headers. */ char **getHeaders(void) {return header;}; }; /** * The Multipart form is a MIME multipart document specific for the * construction and delivery of form data to a web server through a * post method. * * @author David Sugar * @short deliver form results as multipart document. */ class __EXPORT MIMEMultipartForm : public MIMEMultipart { protected: virtual ~MIMEMultipartForm(); public: /** * Construct a form result. This is a MIMEMultipart of type * multipart/form-data. */ MIMEMultipartForm(); }; /** * This is used to attach an item part to a MIME multipart document * that is being streamed. The base item part class is used by all * derived items. * * @author David Sugar * @short item or part of a multi-part object. */ class __EXPORT MIMEItemPart { protected: friend class __EXPORT MIMEMultipart; MIMEMultipart *base; MIMEItemPart *next; const char *ctype; /** * Stream the header(s) for the current document part. * * @param output to stream header into. */ virtual void head(std::ostream *output); /** * Stream the content of this document part. * * @param output to stream document body into. */ virtual void body(std::ostream *output) = 0; /** * Construct and attach a document part to a multipart document. * * @param top multipart document to attach to. * @param ct Content-Type to use. */ MIMEItemPart(MIMEMultipart *top, const char *ct); virtual ~MIMEItemPart(); }; /** * This is a document part type for use in submitting multipart form * data to a web server. * * @author David Sugar * @short multipart document part for web form data field. */ class __EXPORT MIMEFormData : public MIMEItemPart { protected: const char *content; const char *name; virtual ~MIMEFormData(); public: /** * Stream header, Content-Disposition form-data. * * @param output stream to send header to. */ void head(std::ostream *output); /** * Stream content (value) of this form data field. * * @param output stream to send body to. */ void body(std::ostream *output); /** * Construct form data field part of multipart form. * * @param top multipart form this is part of * @param name of form data field * @param content of form data field */ MIMEFormData(MIMEMultipartForm *top, const char *name, const char *content); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/thread.h0000644000175000017500000017313511463371245013443 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file thread.h * @short Synchronization and threading services. **/ #ifndef CCXX_THREAD_H_ #define CCXX_THREAD_H_ #include #ifndef CCXX_STRING_H_ #include #endif #ifndef WIN32 #define CCXX_POSIX #endif // !WIN32 #include #ifndef WIN32 #include #endif // !WIN32 #undef CCXX_USE_WIN32_ATOMIC #ifndef WIN32 #include #include #include #ifdef _THR_UNIXWARE #undef PTHREAD_MUTEXTYPE_RECURSIVE #endif typedef pthread_t cctid_t; typedef unsigned long timeout_t; /* #if defined(__CYGWIN32__) __declspec(dllimport) long __stdcall InterlockedIncrement(long *); __declspec(dllimport) long __stdcall InterlockedDecrement(long *); __declspec(dllimport) long __stdcall InterlockedExchange(long *, long); #define CCXX_USE_WIN32_ATOMIC 1 #endif */ #else // WIN32 typedef DWORD cctid_t; typedef DWORD timeout_t; #define MAX_SEM_VALUE 1000000 #define CCXX_USE_WIN32_ATOMIC 1 #endif // !WIN32 #ifdef HAVE_GCC_CXX_BITS_ATOMIC #include #endif #ifdef CCXX_NAMESPACES namespace ost { #ifdef __BORLANDC__ # if __BORLANDC__ >= 0x0560 using std::time_t; using std::tm; # endif #endif #endif #ifdef HAVE_GCC_CXX_BITS_ATOMIC using namespace __gnu_cxx; #endif class __EXPORT Thread; class __EXPORT ThreadKey; #define TIMEOUT_INF ~((timeout_t) 0) #define ENTER_CRITICAL enterMutex(); #define LEAVE_CRITICAL leaveMutex(); #define ENTER_DEFERRED setCancel(cancelDeferred); #define LEAVE_DEFERRED setCancel(cancelImmediate); #ifndef WIN32 // These macros override common functions with thread-safe versions. In // particular the common "libc" sleep() has problems since it normally // uses SIGARLM (as actually defined by "posix"). The pthread_delay and // usleep found in libpthread are gaurenteed not to use SIGALRM and offer // higher resolution. psleep() is defined to call the old process sleep. #undef sleep #define psleep(x) (sleep)(x) #ifdef signal #undef signal #endif #endif // !WIN32 #undef Yield class __EXPORT Conditional; class __EXPORT Event; /** * The Mutex class is used to protect a section of code so that at any * given time only a single thread can perform the protected operation. * * The Mutex can be used as a base class to protect access in a derived * class. When used in this manner, the ENTER_CRITICAL and LEAVE_CRITICAL * macros can be used to specify when code written for the derived class * needs to be protected by the default Mutex of the derived class, and * hence is presumed to be 'thread safe' from multiple instance execution. * One of the most basic Common C++ synchronization object is the Mutex * class. A Mutex only allows one thread to continue execution at a given * time over a specific section of code. Mutex's have a enter and leave * method; only one thread can continue from the Enter until the Leave is * called. The next thread waiting can then get through. Mutex's are also * known as "CRITICAL SECTIONS" in win32-speak. * * The Mutex is always recursive in that if the same thread invokes * the same mutex lock multiple times, it must release it multiple times. * This allows a function to call another function which also happens to * use the same mutex lock when called directly. This was * deemed essential because a mutex might be used to block individual file * requests in say, a database, but the same mutex might be needed to block a * whole series of database updates that compose a "transaction" for one * thread to complete together without having to write alternate non-locking * member functions to invoke for each part of a transaction. * * Strangely enough, the original pthread draft standard does not directly * support recursive mutexes. In fact this is the most common "NP" extension * for most pthread implementations. Common C++ emulates recursive mutex * behavior when the target platform does not directly support it. * * In addition to the Mutex, Common C++ supports a rwlock class. This * implements the X/Open recommended "rwlock". On systems which do not * support rwlock's, the behavior is emulated with a Mutex; however, the * advantage of a rwlock over a mutex is then entirely lost. There has been * some suggested clever hacks for "emulating" the behavior of a rwlock with * a pair of mutexes and a semaphore, and one of these will be adapted for * Common C++ in the future for platforms that do not support rwlock's * directly. * * @author David Sugar * @short Mutex lock for protected access. */ class __EXPORT Mutex { private: static bool _debug; String _name; #ifndef WIN32 #ifndef PTHREAD_MUTEXTYPE_RECURSIVE int volatile _level; Thread *volatile _tid; #endif /* * Pthread mutex object. This is protected rather than private * because some mixed mode pthread operations require a mutex as * well as their primary pthread object. A good example of this * is the Event class, as waiting on a conditional object must be * associated with an accessable mutex. An alternative would be * to make such classes "friend" classes of the Mutex. */ pthread_mutex_t _mutex; #else // WIN32 # if defined(MUTEX_UNDERGROUND_WIN32_MUTEX) && defined(MUTEX_UNDERGROUND_WIN32_CRITICALSECTION) # error "Can't determine underground for Mutex" # endif #ifdef MUTEX_UNDERGROUND_WIN32_MUTEX HANDLE _mutex; #endif #ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION CRITICAL_SECTION _criticalSection; #endif #endif // WIN32 public: /** * The mutex is always initialized as a recursive entity. * * @param name of mutex for optional deadlock detection */ Mutex(const char *name = NULL); /** * Destroying the mutex removes any system resources associated * with it. If a mutex lock is currently in place, it is presumed * to terminate when the Mutex is destroyed. */ virtual ~Mutex(); /** * Enable or disable deadlock debugging. * * @param mode debug mode. */ static void setDebug(bool mode) {_debug = mode;}; /** * Enable setting of mutex name for deadlock debug. * * @param name for mutex. */ inline void nameMutex(const char *name) {_name = name;}; /** * Entering a Mutex locks the mutex for the current thread. This * also can be done using the ENTER_CRITICAL macro or by using the * ++ operator on a mutex. * * @see #leaveMutex */ void enterMutex(void); /** * Future abi will use enter/leave/test members. */ inline void enter(void) {enterMutex();}; /** * Future abi will use enter/leave/test members. */ inline void leave(void) {leaveMutex();}; /** * Future abi will use enter/leave/test members. * * @return true if entered. */ inline bool test(void) {return tryEnterMutex();}; /** * Tries to lock the mutex for the current thread. Behaves like * #enterMutex , except that it doesn't block the calling thread * if the mutex is already locked by another thread. * * @return true if locking the mutex was succesful otherwise false * * @see enterMutex * @see leaveMutex */ bool tryEnterMutex(void); /** * Leaving a mutex frees that mutex for use by another thread. If * the mutex has been entered (invoked) multiple times (recursivily) * by the same thread, then it will need to be exited the same number * of instances before it is free for re-use. This operation can * also be done using the LEAVE_CRITICAL macro or by the -- operator * on a mutex. * * @see #enterMutex */ void leaveMutex(void); }; /** * The MutexLock class is used to protect a section of code so that at any * given time only a single thread can perform the protected operation. * * It use Mutex to protect operation. Using this class is usefull and * exception safe. The mutex that has been locked is automatically * released when the function call stack falls out of scope, so one doesnt * have to remember to unlock the mutex at each function return. * * A common use is * * void func_to_protect() * { * MutexLock lock(mutex); * ... operation ... * } * * NOTE: do not declare variable as "MutexLock (mutex)", the mutex will be * released at statement end. * * @author Frediano Ziglio * @short Mutex automatic locker for protected access. */ class __EXPORT MutexLock { private: Mutex& mutex; public: /** * Acquire the mutex * * @param _mutex reference to mutex to aquire. */ MutexLock( Mutex& _mutex ) : mutex( _mutex ) { mutex.enterMutex(); } /** * Release the mutex automatically */ // this should be not-virtual ~MutexLock() { mutex.leaveMutex(); } }; /** * The ThreadLock class impliments a thread rwlock for optimal reader performance * on systems which have rwlock support, and reverts to a simple mutex for those * that do not. * * @author David Sugar * @short Posix rwlock extension for protected access. */ class __EXPORT ThreadLock { private: #ifdef HAVE_PTHREAD_RWLOCK pthread_rwlock_t _lock; #else Mutex mutex; #endif public: /** * Create a process shared thread lock object. */ ThreadLock(); /** * Destroy a process shared thread lock object. */ virtual ~ThreadLock(); /** * Aquire a read lock for the current object. */ void readLock(void); /** * Aquire a write lock for the current object. */ void writeLock(void); /** * Attempt read lock for current object. * * @return true on success. */ bool tryReadLock(void); /** * Attempt write lock for current object. * * @return true on success. */ bool tryWriteLock(void); /** * Release any held locks. */ void unlock(void); }; /** * The ReadLock class is used to protect a section of code through * a ThreadLock for "read" access to the member function. The * ThreadLock is automatically released when the object falls out of * scope. * * A common use is * * void func_to_protect() * { * ReadLock lock(threadlock); * ... operation ... * } * * NOTE: do not declare variable as "ReadLock (threadlock)", the * mutex will be released at statement end. * * @author David Sugar * @short Read mode automatic locker for protected access. */ class __EXPORT ReadLock { private: ThreadLock& tl; public: /** * Wait for read access * * @param _tl reference to lock to aquire. */ ReadLock( ThreadLock& _tl ) : tl( _tl ) { tl.readLock(); } /** * Post the semaphore automatically */ // this should be not-virtual ~ReadLock() { tl.unlock(); } }; /** * The WriteLock class is used to protect a section of code through * a ThreadLock for "write" access to the member function. The * ThreadLock is automatically released when the object falls out of * scope. * * A common use is * * void func_to_protect() * { * WriteLock lock(threadlock); * ... operation ... * } * * NOTE: do not declare variable as "WriteLock (threadlock)", the * mutex will be released at statement end. * * @author David Sugar * @short Read mode automatic locker for protected access. */ class __EXPORT WriteLock { private: ThreadLock& tl; public: /** * Wait for write access * * @param _tl reference to threadlock to aquire. */ WriteLock( ThreadLock& _tl ) : tl( _tl ) { tl.writeLock(); } /** * Post the semaphore automatically */ // this should be not-virtual ~WriteLock() { tl.unlock(); } }; /** * The Mutex Counter is a counter variable which can safely be incremented * or decremented by multiple threads. A Mutex is used to protect access * to the counter variable (an integer). An initial value can be specified * for the counter, and it can be manipulated with the ++ and -- operators. * * @author David Sugar * @short Thread protected integer counter. */ class __EXPORT MutexCounter : public Mutex { private: volatile int counter; public: /** * Create and optionally name a mutex protected counter. * * @param id name for mutex counter, optional for deadlock testing. */ MutexCounter(const char *id = NULL); /** * Create and optionally name a mutex protected counter with * an initial value. * * @param initial value of counter. * @param id name of counter, optional for deadlock testing. */ MutexCounter(int initial, const char *id = NULL); friend __EXPORT int operator++(MutexCounter &mc); friend __EXPORT int operator--(MutexCounter &mc); }; /** * The AtomicCounter class offers thread-safe manipulation of an integer * counter. These are commonly used for building thread-safe "reference" * counters for C++ classes. The AtomicCounter depends on the platforms * support for "atomic" integer operations, and can alternately substitute * a "mutex" if no atomic support exists. * * @author Sean Cavanaugh * @short atomic counter operation. */ class __EXPORT AtomicCounter { #ifndef CCXX_USE_WIN32_ATOMIC private: #if defined(HAVE_ATOMIC_AIX) volatile int counter; #elif defined(HAVE_GCC_BITS_ATOMIC) volatile _Atomic_word counter; #elif defined(HAVE_GCC_CXX_BITS_ATOMIC) volatile _Atomic_word counter; // __gnu_cxx::_Atomic_word counter; #elif defined(HAVE_ATOMIC) atomic_t atomic; #else volatile int counter; pthread_mutex_t _mutex; #endif public: /** * Initialize an atomic counter to 0. */ AtomicCounter(); /** * Initialize an atomic counter to a known value. * * @param value initial value. */ AtomicCounter(int value); ~AtomicCounter(); int operator++(void); int operator--(void); int operator+=(int change); int operator-=(int change); int operator+(int change); int operator-(int change); int operator=(int value); bool operator!(void); operator int(); #else private: long atomic; public: inline AtomicCounter() {atomic = 0;}; inline AtomicCounter(int value) {atomic = value;}; inline int operator++(void) {return InterlockedIncrement(&atomic);}; inline int operator--(void) {return InterlockedDecrement(&atomic);}; int operator+=(int change); int operator-=(int change); inline int operator+(int change) {return atomic + change;}; inline int operator-(int change) {return atomic - change;}; inline int operator=(int value) {return InterlockedExchange(&atomic, value);}; inline bool operator!(void) {return (atomic == 0) ? true : false;}; inline operator int() {return atomic;}; #endif }; #ifndef WIN32 /** * A conditional variable synchcronization object for one to one and * one to many signal and control events between processes. * Conditional variables may wait for and receive signals to notify * when to resume or perform operations. Multiple waiting threads may * be woken with a broadcast signal. * * @warning While this class inherits from Mutex, the methods of the * class Conditional just handle the system conditional variable, so * the user is responsible for calling enterMutex and leaveMutex so as * to avoid race conditions. Another thing to note is that if you have * several threads waiting on one condition, not uncommon in thread * pools, each thread must take care to manually unlock the mutex if * cancellation occurs. Otherwise the first thread cancelled will * deadlock the rest of the thread. * * @author David Sugar * @short conditional. * @todo implement in win32 */ class __EXPORT Conditional { private: pthread_cond_t _cond; pthread_mutex_t _mutex; public: /** * Create an instance of a conditional. * * @param id name of conditional, optional for deadlock testing. */ Conditional(const char *id = NULL); /** * Destroy the conditional. */ virtual ~Conditional(); /** * Signal a conditional object and a waiting threads. * * @param broadcast this signal to all waiting threads if true. */ void signal(bool broadcast); /** * Wait to be signaled from another thread. * * @param timer time period to wait. * @param locked flag if already locked the mutex. */ bool wait(timeout_t timer = 0, bool locked = false); /** * Locks the conditional's mutex for this thread. Remember * that Conditional's mutex is NOT a recursive mutex! * * @see #leaveMutex */ void enterMutex(void); /** * In the future we will use lock in place of enterMutex since * the conditional composite is not a recursive mutex, and hence * using enterMutex may cause confusion in expectation with the * behavior of the Mutex class. * * @see #enterMutex */ inline void lock(void) {enterMutex();}; /** * Tries to lock the conditional for the current thread. * Behaves like #enterMutex , except that it doesn't block the * calling thread. * * @return true if locking the mutex was succesful otherwise false * * @see enterMutex * @see leaveMutex */ bool tryEnterMutex(void); inline bool test(void) {return tryEnterMutex();}; /** * Leaving a mutex frees that mutex for use by another thread. * * @see #enterMutex */ void leaveMutex(void); inline void unlock(void) {return leaveMutex();}; }; #endif /** * A semaphore is generally used as a synchronization object between multiple * threads or to protect a limited and finite resource such as a memory or * thread pool. The semaphore has a counter which only permits access by * one or more threads when the value of the semaphore is non-zero. Each * access reduces the current value of the semaphore by 1. One or more * threads can wait on a semaphore until it is no longer 0, and hence the * semaphore can be used as a simple thread synchronization object to enable * one thread to pause others until the thread is ready or has provided data * for them. Semaphores are typically used as a * counter for protecting or limiting concurrent access to a given * resource, such as to permitting at most "x" number of threads to use * resource "y", for example. * * @author David Sugar * @short Semaphore counter for thread synchronization. */ class __EXPORT Semaphore { private: #ifndef WIN32 unsigned _count, _waiters; pthread_mutex_t _mutex; pthread_cond_t _cond; #else HANDLE semObject; #endif // !WIN32 public: /** * The initial value of the semaphore can be specified. An initial * value is often used When used to lock a finite resource or to * specify the maximum number of thread instances that can access a * specified resource. * * @param resource specify initial resource count or 0 default. */ Semaphore(unsigned resource = 0); /** * Destroying a semaphore also removes any system resources * associated with it. If a semaphore has threads currently waiting * on it, those threads will all continue when a semaphore is * destroyed. */ virtual ~Semaphore(); /** * Wait is used to keep a thread held until the semaphore counter * is greater than 0. If the current thread is held, then another * thread must increment the semaphore. Once the thread is accepted, * the semaphore is automatically decremented, and the thread * continues execution. * * The pthread semaphore object does not support a timed "wait", and * hence to maintain consistancy, neither the posix nor win32 source * trees support "timed" semaphore objects. * * @return false if timed out * @param timeout period in milliseconds to wait * @see #post */ bool wait(timeout_t timeout = 0); /** * Posting to a semaphore increments its current value and releases * the first thread waiting for the semaphore if it is currently at * 0. Interestingly, there is no support to increment a semaphore by * any value greater than 1 to release multiple waiting threads in * either pthread or the win32 API. Hence, if one wants to release * a semaphore to enable multiple threads to execute, one must perform * multiple post operations. * * @see #wait */ void post(void); #ifndef WIN32 /** * Call it after a deferred cancellation to avoid deadlocks. * From PTHREAD_COND_TIMEDWAIT(3P): A condition wait (whether timed or not) * is a cancellation point. When the cancelability enable state of a thread * is set to PTHREAD_CANCEL_DEFERRED, a side effect of acting upon a * cancellation request while in a condition wait is that the mutex is * (in effect) re-acquired before calling the first cancellation cleanup handler. */ void force_unlock_after_cancellation(); #endif // WIN32 // FIXME: how implement getValue for posix compatibility ? // not portable... #if 0 /** * Get the current value of a semaphore. * * @return current value. */ int getValue(void); #endif }; /** * The SemaphoreLock class is used to protect a section of code through * a semaphore so that only x instances of the member function may * execute concurrently. * * A common use is * * void func_to_protect() * { * SemaphoreLock lock(semaphore); * ... operation ... * } * * NOTE: do not declare variable as "SemaohoreLock (semaphore)", the * mutex will be released at statement end. * * @author David Sugar * @short Semaphore automatic locker for protected access. */ class __EXPORT SemaphoreLock { private: Semaphore& sem; public: /** * Wait for the semaphore */ SemaphoreLock( Semaphore& _sem ) : sem( _sem ) { sem.wait(); } /** * Post the semaphore automatically */ // this should be not-virtual ~SemaphoreLock() { sem.post(); } }; /** * The Event class implements a feature originally found in the WIN32 API; * event notification. A target thread waits on a resetable Event, and one * or more other threads can then signal the waiting thread to resume * execution. A timeout can be used to specify a wait duration in * milliseconds. The Event class must be reset before it can be used again * as a trigger. These event objects * use a trigger/reset mechanism and are related to low level conditional * variables. * * @author: David Sugar * @short Thread synchornization on event notification. */ class __EXPORT Event { private: #ifndef WIN32 pthread_mutex_t _mutex; pthread_cond_t _cond; bool _signaled; int _count; #else HANDLE cond; #endif public: Event(); virtual ~Event(); /** * Once signaled, the Event class must be "reset" before responding * to a new signal. * * @see #signal */ void reset(void); /** * Signal the event for the waiting thread. */ void signal(void); /** * Wait either for the event to be signaled by another thread or * for the specified timeout duration. * * @see #signal * @return true if signaled, false if timed out. * @param timer timeout in milliseconds to wait for a signal. */ bool wait(timeout_t timer); bool wait(void); }; /** * Every thread of execution in an application is created by * instantiating an object of a class derived from the Thread * class. Classes derived from Thread must implement the run() method, * which specifies the code of the thread. The base Thread class * supports encapsulation of the generic threading methods implemented * on various target operating systems. This includes the ability to * start and stop threads in a synchronized and controllable manner, * the ability to specify thread execution priority, and thread * specific "system call" wrappers, such as for sleep and yield. A * thread exception is thrown if the thread cannot be created. * Threading was the first part of Common C++ I wrote, back when it * was still the APE library. My goal for Common C++ threading has * been to make threading as natural and easy to use in C++ * application development as threading is in Java. With this said, * one does not need to use threading at all to take advantage of * Common C++. However, all Common C++ classes are designed at least * to be thread-aware/thread-safe as appropriate and necessary. * * Common C++ threading is currently built either from the Posix "pthread" * library or using the win32 SDK. In that the Posix "pthread" draft * has gone through many revisions, and many system implementations are * only marginally compliant, and even then usually in different ways, I * wrote a large series of autoconf macros found in ost_pthread.m4 which * handle the task of identifying which pthread features and capabilities * your target platform supports. In the process I learned much about what * autoconf can and cannot do for you.. * * Currently the GNU Portable Thread library (GNU pth) is not directly * supported in Common C++. While GNU "Pth" doesn't offer direct * native threading support or benefit from SMP hardware, many of the design * advantages of threading can be gained from it's use, and the Pth pthread * "emulation" library should be usable with Common C++. In the future, * Common C++ will directly support Pth, as well as OS/2 and BeOS native * threading API's. * * Common C++ itself defines a fairly "neutral" threading model that is * not tied to any specific API such as pthread, win32, etc. This neutral * thread model is contained in a series of classes which handle threading * and synchronization and which may be used together to build reliable * threaded applications. * * Common C++ defines application specific threads as objects which are * derived from the Common C++ "Thread" base class. At minimum the "Run" * method must be implemented, and this method essentially is the "thread", * for it is executed within the execution context of the thread, and when * the Run method terminates the thread is assumed to have terminated. * * Common C++ allows one to specify the running priority of a newly created * thread relative to the "parent" thread which is the thread that is * executing when the constructor is called. Since most newer C++ * implementations do not allow one to call virtual constructors or virtual * methods from constructors, the thread must be "started" after the * constructor returns. This is done either by defining a "starting" * semaphore object that one or more newly created thread objects can wait * upon, or by invoking an explicit "start" member function. * * Threads can be "suspended" and "resumed". As this behavior is not defined * in the Posix "pthread" specification, it is often emulated through * signals. Typically SIGUSR1 will be used for this purpose in Common C++ * applications, depending in the target platform. On Linux, since threads * are indeed processes, SIGSTP and SIGCONT can be used. On solaris, the * Solaris thread library supports suspend and resume directly. * * Threads can be canceled. Not all platforms support the concept of * externally cancelable threads. On those platforms and API * implementations that do not, threads are typically canceled through the * action of a signal handler. * * As noted earlier, threads are considered running until the "Run" method * returns, or until a cancellation request is made. Common C++ threads can * control how they respond to cancellation, using setCancellation(). * Cancellation requests can be ignored, set to occur only when a * cancellation "point" has been reached in the code, or occur immediately. * Threads can also exit by returning from Run() or by invoking the Exit() * method. * * Generally it is a good practice to initialize any resources the thread may * require within the constructor of your derived thread class, and to purge * or restore any allocated resources in the destructor. In most cases, the * destructor will be executed after the thread has terminated, and hence * will execute within the context of the thread that requested a join rather * than in the context of the thread that is being terminated. Most * destructors in derived thread classes should first call Terminate() to * make sure the thread has stopped running before releasing resources. * * A Common C++ thread is normally canceled by deleting the thread object. * The process of deletion invokes the thread's destructor, and the * destructor will then perform a "join" against the thread using the * Terminate() function. This behavior is not always desirable since the * thread may block itself from cancellation and block the current "delete" * operation from completing. One can alternately invoke Terminate() * directly before deleting a thread object. * * When a given Common C++ thread exits on it's own through it's Run() * method, a "Final" method will be called. This Final method will be called * while the thread is "detached". If a thread object is constructed through * a "new" operator, it's final method can be used to "self delete" when * done, and allows an independent thread to construct and remove itself * autonomously. * * A special global function, getThread(), is provided to identify the thread * object that represents the current execution context you are running * under. This is sometimes needed to deliver signals to the correct thread. * Since all thread manipulation should be done through the Common C++ (base) * thread class itself, this provides the same functionality as things like * "pthread_self" for Common C++. * * All Common C++ threads have an exception "mode" which determines * their behavior when an exception is thrown by another Common C++ * class. Extensions to Common C++ should respect the current * exception mode and use getException() to determine what to do when * they are about to throw an object. The default exception mode * (defined in the Thread() constructor) is throwObject, which causes * a pointer to an instance of the class where the error occured to be * thrown. Other exception modes are throwException, which causes a * class-specific exception class to be thrown, and throwNothing, * which causes errors to be ignored. * * As an example, you could try to call the Socket class with an * invalid address that the system could not bind to. This would * cause an object of type Socket * to be thrown by default, as the * default exception mode is throwObject. If you call * setException(throwException) before the bad call to the Socket * constructor, an object of type SockException (the exception class * for class Socket) will be thrown instead. * * To determine what exception class is thrown by a given Common C++ * class when the exception mode is set to throwException, search the * source files for the class you are interested in for a class which * inherits directly or indirectly from class Exception. This is the * exception class which would be thrown when the exception mode is * set to throwException. * * The advantage of using throwException versus throwObject is that * more information is available to the programmer from the thrown * object. All class-specific exceptions inherit from class * Exception, which provides a getString() method which can be called * to get a human-readable error string. * * Common C++ threads are often aggregated into other classes to provide * services that are "managed" from or operate within the context of a * thread, even within the Common C++ framework itself. A good example of * this is the TCPSession class, which essentially is a combination of a TCP * client connection and a separate thread the user can define by deriving a * class with a Run() method to handle the connected service. This * aggregation logically connects the successful allocation of a given * resource with the construction of a thread to manage and perform * operations for said resource. * * Threads are also used in "service pools". In Common C++, a service pool * is one or more threads that are used to manage a set of resources. While * Common C++ does not provide a direct "pool" class, it does provide a model * for their implementation, usually by constructing an array of thread * "service" objects, each of which can then be assigned the next new * instance of a given resource in turn or algorithmically. * * Threads have signal handlers associated with them. Several signal types * are "predefined" and have special meaning. All signal handlers are * defined as virtual member functions of the Thread class which are called * when a specific signal is received for a given thread. The "SIGPIPE" * event is defined as a "Disconnect" event since it's normally associated * with a socket disconnecting or broken fifo. The Hangup() method is * associated with the SIGHUP signal. All other signals are handled through * the more generic Signal(). * * Incidently, unlike Posix, the win32 API has no concept of signals, and * certainly no means to define or deliver signals on a per-thread basis. * For this reason, no signal handling is supported or emulated in the win32 * implementation of Common C++ at this time. * * In addition to TCPStream, there is a TCPSession class which combines a * thread with a TCPStream object. The assumption made by TCPSession is that * one will service each TCP connection with a separate thread, and this * makes sense for systems where extended connections may be maintained and * complex protocols are being used over TCP. * * * @author David Sugar * @short base class used to derive all threads of execution. */ class __EXPORT Thread { public: /** * How to raise error */ typedef enum Throw { throwNothing, /**< continue without throwing error */ throwObject, /**< throw object that cause error (throw this) */ throwException /**< throw an object relative to error */ } Throw; /** * How work cancellation */ typedef enum Cancel { cancelInitial=0, /**< used internally, do not use */ cancelDeferred=1, /**< exit thread on cancellation pointsuch as yield */ cancelImmediate, /**< exit befor cancellation */ cancelDisabled, /**< ignore cancellation */ cancelManual, /**< unimplemented (working in progress) @todo implement */ cancelDefault=cancelDeferred /**< default you should use this for compatibility instead of deferred */ } Cancel; /** * How work suspend */ typedef enum Suspend { suspendEnable, /**< suspend enabled */ suspendDisable /**< suspend disabled, Suspend do nothing */ } Suspend; #ifndef WIN32 /** @internal */ friend class PosixThread; #endif /** @internal */ friend class DummyThread; private: friend class Cancellation; friend class postream_type; friend class Slog; Semaphore joinSem; static Thread* _main; Thread *_parent; Cancel _cancel; Semaphore *_start; // private data friend class ThreadImpl; class ThreadImpl* priv; public: static Thread *get(void); private: #ifdef WIN32 static unsigned __stdcall Execute(Thread *th); #endif // close current thread, free all and call Notify void close(); private: char _name[32]; static size_t _autostack; #ifdef WIN32 DWORD waitHandle(HANDLE obj, timeout_t timeout); #endif protected: /** * Set the name of the current thread. If the name is passed * as NULL, then the default name is set (usually object * pointer). * * @param text name to use. */ void setName(const char *text); /** * All threads execute by deriving the Run method of Thread. * This method is called after Initial to begin normal operation * of the thread. If the method terminates, then the thread will * also terminate after notifying it's parent and calling it's * Final() method. * * @see #Initial */ virtual void run(void) = 0; /** * A thread that is self terminating, either by invoking exit() or * leaving it's run(), will have this method called. It can be used * to self delete the current object assuming the object was created * with new on the heap rather than stack local, hence one may often * see final defined as "delete this" in a derived thread class. A * final method, while running, cannot be terminated or cancelled by * another thread. Final is called for all cancellation type (even * immediate). * * You can safe delete thread ("delete this") class on final, but * you should exit ASAP (or do not try to call CommonC++ methods...) * * @note A thread cannot delete its own context or join * itself. To make a thread that is a self running object * that self-deletes, one has to detach the thread by using * detach() instead of start(). * * @see #exit * @see #run */ virtual void final(void); /** * The initial method is called by a newly created thread when it * starts execution. This method is ran with deferred cancellation * disabled by default. The Initial method is given a separate * handler so that it can create temporary objects on it's own * stack frame, rather than having objects created on run() that * are only needed by startup and yet continue to consume stack space. * * @see #run * @see #final */ virtual void initial(void); /** * Since getParent() and getThread() only refer to an object of the * Thread "base" type, this virtual method can be replaced in a * derived class with something that returns data specific to the * derived class that can still be accessed through the pointer * returned by getParent() and getThread(). * * @return pointer to derived class specific data. */ virtual void* getExtended(void); /** * When a thread terminates, it now sends a notification message * to the parent thread which created it. The actual use of this * notification is left to be defined in a derived class. * * @param - the thread that has terminated. */ virtual void notify(Thread*); /** * Used to properly exit from a Thread derived run() or initial() * method. Terminates execution of the current thread and calls * the derived classes final() method. */ void exit(void); /** * Used to wait for a join or cancel, in place of explicit exit. */ void sync(void); /** * test a cancellation point for deferred thread cancellation. */ bool testCancel(void); /** * Sets thread cancellation mode. Threads can either be set immune to * termination (cancelDisabled), can be set to terminate when * reaching specific "thread cancellation points" * (cancelDeferred) * or immediately when Terminate is requested (cancelImmediate). * * @param mode for cancellation of the current thread. */ void setCancel(Cancel mode); /** * Sets the thread's ability to be suspended from execution. The * thread may either have suspend enabled (suspendEnable) or * disabled (suspendDisable). * * @param mode for suspend. */ void setSuspend(Suspend mode); /** * Used by another thread to terminate the current thread. Termination * actually occurs based on the current setCancel() mode. When the * current thread does terminate, control is returned to the requesting * thread. terminate() should always be called at the start of any * destructor of a class derived from Thread to assure the remaining * part of the destructor is called without the thread still executing. */ void terminate(void); /** * clear parent thread relationship. */ inline void clrParent(void) {_parent = NULL;}; public: /** * This is actually a special constructor that is used to create a * thread "object" for the current execution context when that context * is not created via an instance of a derived Thread object itself. * This constructor does not support First. * * @param isMain bool used if the main "thread" of the application. */ Thread(bool isMain); /** * When a thread object is contructed, a new thread of execution * context is created. This constructor allows basic properties * of that context (thread priority, stack space, etc) to be defined. * The starting condition is also specified for whether the thread * is to wait on a semaphore before begining execution or wait until * it's start method is called. * * @param pri thread base priority relative to it's parent. * @param stack space as needed in some implementations. */ Thread(int pri = 0, size_t stack = 0); #ifndef WIN32 /** * A thread of execution can also be specified by cloning an existing * thread. The existing thread's properties (cancel mode, priority, * etc), are also duplicated. * * @param th currently executing thread object to clone. * @todo implement in win32 */ Thread(const Thread &th); #endif /** * The thread destructor should clear up any resources that have * been allocated by the thread. The desctructor of a derived * thread should begin with Terminate() and is presumed to then * execute within the context of the thread causing terminaton. */ virtual ~Thread(); /** * Set base stack limit before manual stack sizes have effect. * * @param size stack size to set, or use 0 to clear autostack. */ static void setStack(size_t size = 0) {_autostack = size;}; /** * A thread-safe sleep call. On most Posix systems, "sleep()" * is implimented with SIGALRM making it unusable from multipe * threads. Pthread libraries often define an alternate "sleep" * handler such as usleep(), nanosleep(), or nap(), that is thread * safe, and also offers a higher timer resolution. * * @param msec timeout in milliseconds. */ static void sleep(timeout_t msec); /** * Yields the current thread's CPU time slice to allow another thread to * begin immediate execution. */ static void yield(void); /** * When a new thread is created, it does not begin immediate * execution. This is because the derived class virtual tables * are not properly loaded at the time the C++ object is created * within the constructor itself, at least in some compiler/system * combinations. The thread can either be told to wait for an * external semaphore, or it can be started directly after the * constructor completes by calling the start() method. * * @return error code if execution fails. * @param start optional starting semaphore to alternately use. */ int start(Semaphore *start = 0); /** * Start a new thread as "detached". This is an alternative * start() method that resolves some issues with later glibc * implimentations which incorrectly impliment self-detach. * * @return error code if execution fails. * @param start optional starting semaphore to alternately use. */ int detach(Semaphore *start = 0); /** * Gets the pointer to the Thread class which created the current * thread object. * * @return a Thread *, or "(Thread *)this" if no parent. */ inline Thread *getParent(void) {return _parent;}; /** * Suspends execution of the selected thread. Pthreads do not * normally support suspendable threads, so the behavior is * simulated with signals. On systems such as Linux that * define threads as processes, SIGSTOP and SIGCONT may be used. */ void suspend(void); /** * Resumes execution of the selected thread. */ void resume(void); /** * Used to retrieve the cancellation mode in effect for the * selected thread. * * @return cancellation mode constant. */ inline Cancel getCancel(void) {return _cancel;}; /** * Verifies if the thread is still running or has already been * terminated but not yet deleted. * * @return true if the thread is still executing. */ bool isRunning(void) const; /** * Check if this thread is detached. * * @return true if the thread is detached. */ bool isDetached(void) const; /** * Blocking call which unlocks when thread terminates. */ void join(void); /** * Tests to see if the current execution context is the same as * the specified thread object. * * @return true if the current context is this object. */ bool isThread(void) const; /** * Get system thread numeric identifier. * * @return numeric identifier of this thread. */ cctid_t getId(void) const; /** * Get the name string for this thread, to use in * debug messages. * * @return debug name. */ const char *getName(void) const {return _name;}; /** * Get exception mode of the current thread. * * @return exception mode. */ static Throw getException(void); /** * Set exception mode of the current thread. * * @return exception mode. */ static void setException(Throw mode); /** * Signal the semaphore that the specified thread is waiting for * before beginning execution. * * @param th specified thread. */ friend inline void operator++(Thread &th) {if (th._start) th._start->post();}; friend inline void operator--(Thread &th) {if (th._start) th._start->wait();}; #ifdef WIN32 bool isCancelled() const; static DWORD waitThread(HANDLE hRef, timeout_t timeout); #endif /** * This is used to help build wrapper functions in libraries * around system calls that should behave as cancellation * points but don't. * * @return saved cancel type. */ static Cancel enterCancel(void); /** * This is used to restore a cancel block. * * @param cancel type that was saved. */ static void exitCancel(Cancel cancel); }; /** * A class to automatically set the thread cancellation mode of a * member function. When the member function returns and the automatic * variable falls out of scope, the previous thread cancellation mode * is restored. * * @author David Sugar * @short Automatic cancellation mode setting. */ class __EXPORT Cancellation { private: Thread::Cancel prior; public: Cancellation(Thread::Cancel cancel); ~Cancellation(); }; #if !defined(WIN32) && !defined(__MINGW32__) typedef int signo_t; class PosixThread: public Thread { private: #ifndef WIN32 /** @internal */ friend class ThreadImpl; friend class Thread; #endif #ifndef CCXX_SIG_THREAD_ALARM static PosixThread *_timer; static Mutex _arm; #endif time_t _alarm; static void signalThread(Thread* th,signo_t signo); protected: /** * In the Posix version of Common C++, this can be used to send a * signal into the parent thread of the current object. * * @param signo a posix signal id. */ inline void signalParent(signo_t signo) { signalThread(_parent,signo); }; /** * In the Posix version of Common C++, this can be used to send a * signal into the main application thread. * * @param signo a posix signal id. */ inline void signalMain(signo_t signo) { signalThread(_main,signo);}; /** * A derivable method to call when a SIGALRM is being delivered * to a specific thread. */ virtual void onTimer(void); /** * A derived method to handle hangup events being delivered * to a specific thread. */ virtual void onHangup(void); /** * A derived method to call when a SIGABRT is being delivered * to a specific thread. */ virtual void onException(void); /** * A derived method to call when a SIGPIPE is being delivered * to a specific thread. */ virtual void onDisconnect(void); /** * A derived method to handle asynchronous I/O requests delivered * to the specified thread. */ virtual void onPolling(void); /** * A derivable method to call for delivering a signal event to * a specified thread. * * @param - posix signal id. */ virtual void onSignal(int); /** * Used to specify a timeout event that can be delivered to the * current thread via SIGALRM. When the timer expires, the onTimer() * method is called for the thread. At present, only one thread * timer can be active at any given time. On some operating * systems (including Linux) a timer can be active on each thread. * * @param timer timeout in milliseconds. * @param periodic should the timer be periodic. * @note currently, periodic timers are only available on * systems with a working setitimer call. */ void setTimer(timeout_t timer, bool periodic = false); /** * Gets the time remaining for the current threads timer before * it expires. * * @return time remaining before timer expires in milliseconds. */ timeout_t getTimer(void) const; /** * Terminates the timer before the timeout period has expired. * This prevents the timer from sending it's SIGALRM and makes * the timer available to other threads. */ void endTimer(void); #if defined(HAVE_SIGWAIT) || defined(HAVE_SIGWAIT2) /** * Used to wait on a Posix signal from another thread. This can be * used as a crude rondevious/synchronization method between threads. * * @param signo a posix signal id. */ void waitSignal(signo_t signo); #endif /** * Used to enable or disable a signal within the current thread. * * @param signo posix signal id. * @param active set to true to enable. */ void setSignal(int signo, bool active); /** * Access to pthread_attr structure * this allows setting/modifying pthread attributes * not covered in the platform independant Thread constructor, * e.g. contention scope or scheduling policy */ pthread_attr_t *getPthreadAttrPtr(void); /** * Get pthread_t of underlying posix thread (useful for * debugging/logging) */ pthread_t getPthreadId(void); public: PosixThread(int pri = 0, size_t stack = 0); /** * Delivers a Posix signal to the current thread. * * @param signo a posix signal id. */ inline void signalThread(int signo) {signalThread(this, signo);}; /** * Install a signal handler for use by threads and * the OnSignal() event notification handler. * * @param signo posix signal id. */ static void sigInstall(int signo); }; #endif /** * This class allows the creation of a thread context unique "pointer" * that can be set and retrieved and can be used to create thread specific * data areas for implementing "thread safe" library routines. * * Finally, Common C++ supports a * thread-safe "AtomicCounter" class. This can often be used for reference * counting without having to protect the counter with a separate Mutex * counter. This lends to lighter-weight code. * * * @author David Sugar * @short container for thread specific data storage. */ class __EXPORT ThreadKey { private: #ifndef WIN32 pthread_key_t key; typedef void (*TDestruct)(void*); friend class ThreadImpl; ThreadKey(TDestruct destruct); #else DWORD key; #endif public: /** * Create a unique thread specific container. */ ThreadKey(); /** * Destroy a thread specific container and any contents reserved. */ virtual ~ThreadKey(); /** * Get the value of the pointer for the thread specific data * container. A unique pointer can be set for each execution * context. * * @return a unique void * for each execution context. */ void *getKey(void); /** * Set the value of the pointer for the current thread specific * execution context. This can be used to store thread context * specific data. * * @param - ptr to thread context specific data. */ void setKey(void *); }; /** * Timer ports are used to provide synchronized timing events when managed * under a "service thread" such as SocketService. This is made into a * stand-alone base class since other derived libraries (such as the * serial handlers) may also use the pooled "service thread" model * and hence also require this code for managing timing. * * @author David Sugar * @short synchronized millisecond timing for service threads. */ class __EXPORT TimerPort { #ifndef WIN32 struct timeval timer; #else DWORD timer; #endif bool active; public: /** * Create a timer, mark it as inactive, and set the initial * "start" time to the creation time of the timer object. This * allows "incTimer" to initially refer to time delays relative * to the original start time of the object. */ TimerPort(); /** * Set a new start time for the object based on when this call is * made and optionally activate the timer for a specified number * of milliseconds. This can be used to set the starting time * of a realtime session. * * @param timeout delay in milliseconds from "now" */ void setTimer(timeout_t timeout = 0); /** * Set a timeout based on the current time reference value either * from object creation or the last setTimer(). This reference * can be used to time synchronize realtime data over specified * intervals and force expiration when a new frame should be * released in a synchronized manner. * * @param timeout delay in milliseconds from reference. */ void incTimer(timeout_t timeout); /** * Adjust a timeout based on the current time reference value either * from object creation or the last setTimer(). This reference * can be used to time synchronize realtime data over specified * intervals and force expiration when a new frame should be * released in a synchronized manner. * * @param timeout delay in milliseconds from reference. */ void decTimer(timeout_t timeout); /** * Sleep until the current timer expires. This is useful in time * syncing realtime periodic tasks. */ void sleepTimer(void); /** * This is used to "disable" the service thread from expiring * the timer object. It does not effect the reference time from * either creation or a setTimer(). */ void endTimer(void); /** * This is used by service threads to determine how much time * remains before the timer expires based on a timeout specified * in setTimer() or incTimer(). It can also be called after * setting a timeout with incTimer() to see if the current timeout * has already expired and hence that the application is already * delayed and should skip frame(s). * * return time remaining in milliseconds, or TIMEOUT_INF if * inactive. */ timeout_t getTimer(void) const; /** * This is used to determine how much time has elapsed since a * timer port setTimer benchmark time was initially set. This * allows one to use setTimer() to set the timer to the current * time and then measure elapsed time from that point forward. * * return time elapsed in milliseconds, or TIMEOUT_INF if * inactive. */ timeout_t getElapsed(void) const; }; // FIXME: not in win32 implementation #if !defined(WIN32) // FIXME: private declaration ??? struct timespec *getTimeout(struct timespec *spec, timeout_t timeout); #if !defined(__CYGWIN32__) && !defined(__MINGW32__) void wait(signo_t signo); #endif #endif // !WIN32 #ifdef USE_POLL /** * The poller class is used to help manage pollfd structs for use in the * updated serial and socket "port" code. * * @author Gianni Mariani * @short pollfd assistance class for port classes. */ class Poller { private: int nufds; pollfd *ufds; public: Poller(); virtual ~Poller(); /** * reserve a specified number of poll descriptors. If additional * descriptors are needed, they are allocated. * * @return new array of descriptors. * @param cnt number of desctiptors to reserve */ pollfd *getList(int cnt); /** * Retreive the current array of poll descriptors. * * @return array of descriptors. */ inline pollfd *getList(void) {return ufds;}; }; #endif inline Thread *getThread(void) {return Thread::get();} /** * This class is used to access non-reentrant date and time functions in the * standard C library. * * The class has two purposes: * - 1 To be used internaly in CommonCpp's date and time classes to make them * thread safe. * - 2 To be used by clients as thread safe replacements to the standard C * functions, much like Thread::sleep() represents a thread safe version * of the standard sleep() function. * * @note The class provides one function with the same name as its equivalent * standard function and one with another, unique name. For new clients, * the version with the unique name is recommended to make it easy to * grep for accidental usage of the standard functions. The version with * the standard name is provided for existing clients to sed replace their * original version. * * @note Also note that some functions that returned pointers have been redone * to take that pointer as an argument instead, making the caller * responsible for memory allocation/deallocation. This is almost * how POSIX specifies *_r functions (reentrant versions of the * standard time functions), except the POSIX functions also return the * given pointer while we do not. We don't use the *_r functions as they * aren't all generally available on all platforms yet. * * @author Idar Tollefsen * @short Thread safe date and time functions. */ class __EXPORT SysTime { private: static Mutex timeLock; protected: inline static void lock(void) {timeLock.enterMutex();} inline static void unlock(void) {timeLock.leaveMutex();} public: static time_t getTime(time_t *tloc = NULL); static time_t time(time_t *tloc) { return getTime(tloc); }; static int getTimeOfDay(struct timeval *tp); static int gettimeofday(struct timeval *tp, struct timezone *) { return getTimeOfDay(tp); }; static struct tm *getLocalTime(const time_t *clock, struct tm *result); static struct tm *locatime(const time_t *clock, struct tm *result) { return getLocalTime(clock, result); }; static struct tm *getGMTTime(const time_t *clock, struct tm *result); static struct tm *gmtime(const time_t *clock, struct tm *result) { return getGMTTime(clock, result);}; }; #ifndef HAVE_LOCALTIME_R inline struct tm *localtime_r(const time_t *t, struct tm *b) {return SysTime::getLocalTime(t, b);}; inline char *ctime_r(const time_t *t, char *buf) {return ctime(t);}; inline struct tm *gmtime_r(const time_t *t, struct tm *b) \ {return SysTime::getGMTTime(t, b);}; inline char *asctime_r(const struct tm *tm, char *b) \ {return asctime(tm);}; #endif #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/slog.h0000644000175000017500000002162311463370644013134 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file slog.h * @short System logging facilities abstraction. **/ #ifndef CCXX_SLOG_H_ #define CCXX_SLOG_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef HAVE_SYSLOG_H #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * The slog class is used to stream messages to the system's logging facility (syslogd). * A default slog object is used to avoid confusion with the native syslog * facility and to imply a logical relationship to the C++ clog(). * * The key difference is that the slog object sends it's output to the * system logging daemon (typically syslogd) rather than through stderr. * slog can be streamed with the << operator just * like clog; a default slog object is pre-initialized, and you stream * character data to it. * * The slog allows one to specify logging levels and other properties through the () operators. * Hence, once can do: * *
 * slog("mydaemon", SLOG_DAEMON, SLOG_EMERGENCY) << I just died << endl; 
* * or things like: * *
 * slog("mydaemon", SLOG_DAEMON);
 * slog(SLOG_INFO) << "daemon initalized" << endl; 
* * The intent is to be as common-place and as convenient to use as the stderr based clog facility * found in C++, and this is especially useful for C++ daemons. * * The std::flush manipulator doesn't work. Either the * std::endl or std::ends manipulators * must be used to cause the output to be sent to the daemon. * * When this class is used on a system that doesn't have the syslog headers * (i.e. a non-posix win32 box), the output goes to the a file with the same name * as the syslog identifier string with '.log' appended to it. If the identifier string ends in * '.exe', the '.exe' is removed before the '.log' is appened. (e.g. the identifier foo.exe will * generate a log file named foo.log) * * @author David Sugar *
Minor docs & hacks by Jon Little * * @short system logging facility class. */ class __EXPORT Slog : protected std::streambuf, public std::ostream { public: typedef enum Class { classSecurity, classAudit, classDaemon, classUser, classDefault, classLocal0, classLocal1, classLocal2, classLocal3, classLocal4, classLocal5, classLocal6, classLocal7 } Class; typedef enum Level { levelEmergency = 1, levelAlert, levelCritical, levelError, levelWarning, levelNotice, levelInfo, levelDebug } Level; private: #ifndef HAVE_SYSLOG_H Mutex lock; FILE *syslog; #endif int priority; Level _level; bool _enable; bool _clogEnable; ThreadImpl *getPriv(void); protected: /** * This is the streambuf function that actually outputs the data * to the device. Since all output should be done with the standard * ostream operators, this function should never be called directly. */ int overflow(int c); public: /** * Default (and only) constructor. The default log level is set to * SLOG_DEBUG. There is no default log facility set. One should be * set before attempting any output. This is done by the open() or the * operator()(const char*, Class, Level) * functions. */ Slog(void); virtual ~Slog(void); void close(void); /** * (re)opens the output stream. * @param ident The identifier portion of the message sent to the syslog daemon. * @param grp The log facility the message is sent to */ void open(const char *ident, Class grp = classUser); /** * Sets the log identifier, level, and class to use for subsequent output * @param ident The identifier portion of the message * @param grp The log facility the message is sent to * @param level The log level of the message */ Slog &operator()(const char *ident, Class grp = classUser, Level level = levelError); /** * Changes the log level and class to use for subsequent output * @param level The log level of the message * @param grp The log facility the message is sent to */ Slog &operator()(Level level, Class grp = classDefault); /** * Does nothing except return *this. */ Slog &operator()(void); #ifdef HAVE_SNPRINTF /** * Print a formatted syslog string. * * @param format string. */ void error(const char *format, ...); /** * Print a formatted syslog string. * * @param format string. */ void warn(const char *format, ...); /** * Print a formatted syslog string. * * @param format string. */ void debug(const char *format, ...); /** * Print a formatted syslog string. * * @param format string. */ void emerg(const char *format, ...); /** * Print a formatted syslog string. * * @param format string. */ void alert(const char *format, ...); /** * Print a formatted syslog string. * * @param format string. */ void critical(const char *format, ...); /** * Print a formatted syslog string. * * @param format string. */ void notice(const char *format, ...); /** * Print a formatted syslog string. * * @param format string. */ void info(const char *format, ...); #endif /** * Sets the logging level. * @param enable is the logging level to use for further output */ inline void level(Level enable) {_level = enable;}; /** * Enables or disables the echoing of the messages to clog in addition * to the syslog daemon. This is enabled by the default class constructor. * @param f true to enable, false to disable clog output */ inline void clogEnable(bool f=true) {_clogEnable = f;}; inline Slog &warn(void) {return operator()(Slog::levelWarning);}; inline Slog &error(void) {return operator()(Slog::levelError);}; inline Slog &debug(void) {return operator()(Slog::levelDebug);}; inline Slog &emerg(void) {return operator()(Slog::levelEmergency);}; inline Slog &alert(void) {return operator()(Slog::levelAlert);}; inline Slog &critical(void) {return operator()(Slog::levelCritical);}; inline Slog ¬ice(void) {return operator()(Slog::levelNotice);}; inline Slog &info(void) {return operator()(Slog::levelInfo);}; }; //#ifdef CYGWIN_IMPORTS //extern __declspec(dllimport) Slog slog; //#else extern __EXPORT Slog slog; //#endif #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/address.h0000644000175000017500000007734011463366065013626 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file address.h * @short Network addresses and sockets related classes. **/ #ifndef CCXX_ADDRESS_H_ #define CCXX_ADDRESS_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_EXCEPTION_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif // future definition of ipv4 specific classes, now defines #define INET_IPV4_ADDRESS_SIZE 16 #define CIDR_IPV4_ADDRESS_SIZE 32 #define INET_IPV6_ADDRESS_SIZE 40 #define CIDR_IPV6_ADDRESS_SIZE 45 #define CIDR IPV4Cidr #define InetAddress IPV4Address #define InetHostAddress IPV4Host #define InetMaskAddress IPV4Mask #define InetMcastAddress IPV4Multicast #define InetMcastAddressValidator IPV4MulticastValidator #define InetAddrValidator IPV4Validator #define BroadcastAddress IPV4Broadcast /** * Transport Protocol Ports. */ typedef unsigned short tpport_t; class __EXPORT IPV4Host; /** * Classes derived from IPV4Address would require an specific * validator to pass to the IPV4Address constructor. This is a base * class for classes of function objects used by such derived classes. * * @author Federico Montesino * @short Abstract base class for derived inet addresses validators. */ class __EXPORT IPV4Validator { public: /** * Constructor. Does not deal with any state. */ IPV4Validator() { }; /** * keeps compilers happy. */ virtual ~IPV4Validator() {}; /** * Pure virtual application operator. Apply the validation * algorithm specific to derived classes. */ virtual void operator()(const in_addr address) const = 0; }; /** * Class for the function object that validates multicast addresses. * Implements a specific application operator to validate multicast * addresses. * * @author Federico Montesino * @short Validating class specialized for multicast addresses. */ class __EXPORT IPV4MulticastValidator: public IPV4Validator { public: /** * Constructor. Does not deal with any state. */ IPV4MulticastValidator(){}; /** * Keeps compilers happy. */ virtual ~IPV4MulticastValidator(){}; /** * Application operator. Apply the validation algorithm * specific to multicast addresses */ void operator()(const in_addr address) const; private: #if __BYTE_ORDER == __BIG_ENDIAN enum { MCAST_VALID_MASK = 0xF0000000, MCAST_VALID_VALUE = 0xE0000000 }; #else enum { MCAST_VALID_MASK = 0x000000F0, MCAST_VALID_VALUE = 0x000000E0 }; #endif }; /** * The CIDR class is used to support routing tables and validate address * policies. * * @author David Sugar * @short Classless Internet Domain Routing */ class __EXPORT IPV4Cidr { protected: struct in_addr netmask, network; unsigned getMask(const char *cp) const; public: /** * Get network address associated with this cidr. * * @return system binary coded address. */ inline struct in_addr getNetwork(void) const {return network;}; /** * Get network mask associated with this cidr. * * @return system binary coded network mask. */ inline struct in_addr getNetmask(void) const {return netmask;}; /** * Compute the broadcast address associated with this cidr. * * @return system binary coded network address. */ struct in_addr getBroadcast(void) const; /** * Set the cidr from a full or partial hostname, or from an * address/mask, or a host/bits specification. * * @param cidr string to use. */ void set(const char *cidr); /** * Construct a new cidr from a string. * * @param cidr string to use. */ IPV4Cidr(const char *cidr); /** * Construct an empty cidr. */ IPV4Cidr(); /** * Construct a copy of a cidr. * * @param cidr to copy from. */ IPV4Cidr(IPV4Cidr &); /** * See if a socket address is a member of this cidr's network. * * @param saddr pointer to test. * @return true if member of cidr. */ bool isMember(const struct sockaddr *saddr) const; /** * See if a low level address object is a member of this cidr's net. * * @param inaddr object to test. * @return true if member of cidr. */ bool isMember(const struct in_addr &inaddr) const; inline bool operator==(const struct sockaddr *a) const {return isMember(a);}; inline bool operator==(const struct in_addr &a) const {return isMember(a);}; }; #ifdef CCXX_IPV6 /** * The CIDR class is used to support routing tables and validate address * policies. * * @author David Sugar * @short Classless Internet Domain Routing */ class __EXPORT IPV6Cidr { protected: struct in6_addr netmask, network; unsigned getMask(const char *cp) const; public: /** * Get network address associated with this cidr. * * @return system binary coded address. */ inline struct in6_addr getNetwork(void) const {return network;}; /** * Get network mask associated with this cidr. * * @return system binary coded network mask. */ inline struct in6_addr getNetmask(void) const {return netmask;}; /** * Compute the broadcast address associated with this cidr. * * @return system binary coded network address. */ struct in6_addr getBroadcast(void) const; /** * Set the cidr from a full or partial hostname, or from a * host/bits specification. * * @param cidr string to use. */ void set(const char *cidr); /** * Construct a new cidr from a string. * * @param cidr string to use. */ IPV6Cidr(const char *cidr); /** * Construct an empty cidr. */ IPV6Cidr(); /** * Construct a copy of a cidr. * * @param cidr to copy from. */ IPV6Cidr(IPV6Cidr &); /** * See if a socket address is a member of this cidr's network. * * @param saddr pointer to test. * @return true if member of cidr. */ bool isMember(const struct sockaddr *saddr) const; /** * See if a low level address object is a member of this cidr's net. * * @param inaddr object to test. * @return true if member of cidr. */ bool isMember(const struct in6_addr &inaddr) const; inline bool operator==(const struct sockaddr *sa) const {return isMember(sa);}; inline bool operator==(const struct in6_addr &a) const {return isMember(a);}; }; #endif /** * The network name and address objects are all derived from a common * IPV4Address base class. Specific classes, such as IPV4Host, * IPV4Mask, etc, are defined from IPV4Address entirely so that the * manner a network address is being used can easily be documented and * understood from the code and to avoid common errors and accidental misuse * of the wrong address object. For example, a "connection" to something * that is declared as a "IPV4Host" can be kept type-safe from a * "connection" accidently being made to something that was declared a * "IPV4Broadcast". * * @author David Sugar * @short Internet Address binary data type. */ class __EXPORT IPV4Address { private: // The validator given to an IPV4Address object must not be a // transient object, but that must exist at least until the // last address object of its kind is deleted. This is an // artifact to be able to do specific checks for derived // classes inside constructors. const InetAddrValidator *validator; protected: struct in_addr * ipaddr; size_t addr_count; mutable char* hostname; // hostname for ipaddr[0]. Used by getHostname #if defined(WIN32) static MutexCounter counter; #else static Mutex mutex; #endif /** * Sets the IP address from a string representation of the * numeric address, ie "127.0.0.1" * * @param host The string representation of the IP address * @return true if successful */ bool setIPAddress(const char *host); /** * Used to specify a host name or numeric internet address. * * @param host The string representation of the IP address or * a hostname, , if NULL, it will default to INADDR_ANY */ void setAddress(const char *host); public: /** * Create an Internet Address object with an empty (0.0.0.0) * address. * * @param validator optional validator function object, intended for * derived classes. */ IPV4Address(const InetAddrValidator *validator = NULL); /** * Convert the system internet address data type (struct in_addr) * into a Common C++ IPV4Address object. * * @param addr struct of system used binary internet address. * @param validator optional validator function object, intended for * derived classes. */ IPV4Address(struct in_addr addr, const InetAddrValidator *validator = NULL); /** * Convert a null terminated ASCII host address string * (example: "127.0.0.1") or host address name (example: * "www.voxilla.org") directly into a Common C++ IPV4Address * object. * * @param address null terminated C string. * @param validator optional validator function object, intended for * derived classes. */ IPV4Address(const char *address, const InetAddrValidator *validator = NULL); /** * Copy constructor */ IPV4Address(const IPV4Address &rhs); /** * Destructor */ virtual ~IPV4Address(); /** * Provide a string representation of the value (Internet Address) * held in the IPV4Address object. * * @return string representation of IPV4Address. */ const char *getHostname(void) const; /** * May be used to verify if a given IPV4Address returned * by another function contains a "valid" address, or "0.0.0.0" * which is often used to mark "invalid" IPV4Address values. * * @return true if address != 0.0.0.0. */ bool isInetAddress(void) const; /** * Provide a low level system usable struct in_addr object from * the contents of IPV4Address. This is needed for services such * as bind() and connect(). * * @return system binary coded internet address. */ struct in_addr getAddress(void) const; /** * Provide a low level system usable struct in_addr object from * the contents of IPV4Address. This is needed for services such * as bind() and connect(). * * @param i for IPV4Addresses with multiple addresses, returns the * address at this index. User should call getAddressCount() * to determine the number of address the object contains. * @return system binary coded internet address. If parameter i is * out of range, the first address is returned. */ struct in_addr getAddress(size_t i) const; /** * Returns the number of internet addresses that an IPV4Address object * contains. This usually only happens with IPV4Host objects * where multiple IP addresses are returned for a DNS lookup */ size_t getAddressCount() const { return addr_count; } IPV4Address &operator=(const char *str); IPV4Address &operator=(struct in_addr addr); IPV4Address &operator=(const IPV4Address &rhs); /** * Allows assignment from the return of functions like * inet_addr() or htonl() */ IPV4Address &operator=(unsigned long addr); inline IPV4Address &operator=(unsigned int addr) {return *this = (unsigned long) addr; } inline bool operator!() const {return !isInetAddress();}; /** * Compare two internet addresses to see if they are equal * (if they specify the physical address of the same internet host). * * If there is more than one IP address in either IPV4Address object, * this will return true if all of the IP addresses in the smaller * are in the larger in any order. */ bool operator==(const IPV4Address &a) const; /** * Compare two internet addresses to see if they are not * equal (if they each refer to unique and different physical * ip addresses). * * This is implimented in terms of operator== */ bool operator!=(const IPV4Address &a) const; }; /** * Internet addresses used specifically as masking addresses (such as " * 255.255.255.0") are held in the IPV4Mask derived object. The * seperate class is used so that C++ type casting can automatically * determine when an IPV4Address object is really a mask address object * rather than simply using the base class. This also allows manipulative * operators for address masking to operate only when presented with a * Masked address as well as providing cleaner and safer source. * * @author David Sugar * @short Internet Address Mask such as subnet masks. */ class __EXPORT IPV4Mask : public IPV4Address { public: /** * Create the mask from a null terminated ASCII string such as * "255.255.255.128". * * @param mask null terminated ASCII mask string. */ IPV4Mask(const char *mask); /** * Masks are usually used to coerce host addresses into a specific * router or class domain. This can be done by taking the Inet * Host Address object and "and"ing it with an address mask. This * operation can be directly expressed in C++ through the & operator. * * @return a internet host address that has been masked. * @param addr host address to be masked by subnet. * @param mask inetnet mask address object to mask by. */ friend __EXPORT IPV4Host operator&(const IPV4Host &addr, const IPV4Mask &mask); /** * Allows assignment from the return of functions like * inet_addr() or htonl() */ IPV4Address &operator=(unsigned long addr) { return IPV4Address::operator =(addr); } }; /** * This object is used to hold the actual and valid internet address of a * specific host machine that will be accessed through a socket. * * @author David Sugar * @short Address of a specific Internet host machine. */ class __EXPORT IPV4Host : public IPV4Address { private: static IPV4Host _host_; public: /** * Create a new host address for a specific internet host. The * internet host can be specified in a null terminated ASCII * string and include either the physical host address or the * DNS name of a host machine. Hence, an IPV4Host * ("www.voxilla.org") can be directly declaired in this manner. * * Defaults to the IP address that represents the interface matching * "gethostname()". * * @param host dns or physical address of an Internet host. */ IPV4Host(const char *host = NULL); /** * Convert a system socket binary address such as may be * returned through the accept() call or getsockpeer() into * an internet host address object. * * @param addr binary address of internet host. */ IPV4Host(struct in_addr addr); /** * Allows assignment from the return of functions like * inet_addr() or htonl() */ IPV4Address &operator=(unsigned long addr) { return IPV4Address::operator =(addr); } /** * Mask the internet host address object with a network mask address. * This is commonly used to coerce an address by subnet. */ IPV4Host &operator&=(const IPV4Mask &mask); friend class __EXPORT IPV4Mask; friend __EXPORT IPV4Host operator&(const IPV4Host &addr, const IPV4Mask &mask); }; /** * The broadcast address object is used to store the broadcast address for * a specific subnet. This is commonly used for UDP broadcast operations. */ class __EXPORT IPV4Broadcast : public IPV4Address { public: /** * Specify the physical broadcast address to use and create a new * broadcast address object based on a null terminated ASCII * string. * * @param net null terminated ASCII network address. */ IPV4Broadcast(const char *net = "255.255.255.255"); }; /** * A specialization of IPV4Address that provides address validation * for multicast addresses. Whenever its value changes the new value * is checked to be in the range from 224.0.0.1 through * 239.255.255.255. If it is not, an exception is thrown. * * @short A multicast network address. * @author Federico Montesino */ class __EXPORT IPV4Multicast: public IPV4Address { public: /** * Create an Internet Multicast Address object with an empty * (0.0.0.0) address. */ IPV4Multicast(); /** * Convert the system internet address data type (struct in_addr) * into a Common C++ IPV4Multicast object. * * @param address struct of system used binary internet address. */ IPV4Multicast(const struct in_addr address); /** * Convert a null terminated ASCII multicast address string * (example: "224.0.0.1") or multicast name string (example: * "sap.mcast.net") directly into a Common C++ * IPV4Multicast object. Works like IPV4Address(const * char*). * * @param address null terminated C string. */ IPV4Multicast(const char *address); private: /** * Check the address in addr is a valid multicast * address. In case not, throws an exception. * * @param address a system network address * @return true if validation succeeded */ static const IPV4MulticastValidator validator; }; extern __EXPORT std::ostream& operator<<(std::ostream &os, const IPV4Address &ia); inline struct in_addr getaddress(const IPV4Address &ia) {return ia.getAddress();} #ifdef CCXX_IPV6 class __EXPORT IPV6Host; /** * Classes derived from IPV6Address would require an specific * validator to pass to the IPV6Address constructor. This is a base * class for classes of function objects used by such derived classes. * * @author Federico Montesino * @short Abstract base class for derived inet addresses validators. */ class __EXPORT IPV6Validator { public: /** * Constructor. Does not deal with any state. */ IPV6Validator() { }; /** * Keeps compilers happy. */ virtual ~IPV6Validator() {}; /** * Pure virtual application operator. Apply the validation * algorithm specific to derived classes. */ virtual void operator()(const in6_addr address) const = 0; }; /** * Class for the function object that validates multicast addresses. * Implements a specific application operator to validate multicast * addresses. * * @author Federico Montesino * @short Validating class specialized for multicast addresses. */ class __EXPORT IPV6MulticastValidator: public IPV6Validator { public: /** * Constructor. Does not deal with any state. */ IPV6MulticastValidator(){}; /** * Keeps compilers happy... */ virtual ~IPV6MulticastValidator(){}; /** * Application operator. Apply the validation algorithm * specific to multicast addresses */ void operator()(const in6_addr address) const; }; /** * The network name and address objects are all derived from a common * IPV6Address base class. Specific classes, such as IPV4Host, * IPV6Mask, etc, are defined from IPV6Address entirely so that the * manner a network address is being used can easily be documented and * understood from the code and to avoid common errors and accidental misuse * of the wrong address object. For example, a "connection" to something * that is declared as a "IPV6Host" can be kept type-safe from a * "connection" accidently being made to something that was declared a * "IPV6Broadcast". * * @author David Sugar * @short Internet Address binary data type. */ class __EXPORT IPV6Address { private: // The validator given to an IPV4Address object must not be a // transient object, but that must exist at least until the // last address object of its kind is deleted. This is an // artifact to be able to do specific checks for derived // classes inside constructors. const IPV6Validator *validator; protected: struct in6_addr * ipaddr; size_t addr_count; mutable char* hostname; // hostname for ipaddr[0]. Used by getHostname #if defined(WIN32) static MutexCounter counter; #else static Mutex mutex; #endif /** * Sets the IP address from a string representation of the * numeric address, ie "127.0.0.1" * * @param host The string representation of the IP address * @return true if successful */ bool setIPAddress(const char *host); /** * Used to specify a host name or numeric internet address. * * @param host The string representation of the IP address or * a hostname, , if NULL, it will default to INADDR_ANY */ void setAddress(const char *host); public: /** * Create an Internet Address object with an empty (0.0.0.0) * address. * * @param validator optional validator function object, intended for * derived classes. */ IPV6Address(const IPV6Validator *validator = NULL); /** * Convert the system internet address data type (struct in_addr) * into a Common C++ IPV6Address object. * * @param addr struct of system used binary internet address. * @param validator optional validator function object, intended for * derived classes. */ IPV6Address(struct in6_addr addr, const IPV6Validator *validator = NULL); /** * Convert a null terminated ASCII host address string * (example: "127.0.0.1") or host address name (example: * "www.voxilla.org") directly into a Common C++ IPV6Address * object. * * @param address null terminated C string. * @param validator optional validator function object, intended for * derived classes. */ IPV6Address(const char *address, const IPV6Validator *validator = NULL); /** * Copy constructor */ IPV6Address(const IPV6Address &rhs); /** * Destructor */ virtual ~IPV6Address(); /** * Provide a string representation of the value (Internet Address) * held in the IPV6Address object. * * @return string representation of IPV6Address. */ const char *getHostname(void) const; /** * May be used to verify if a given IPV6Address returned * by another function contains a "valid" address, or "0.0.0.0" * which is often used to mark "invalid" IPV6Address values. * * @return true if address != 0.0.0.0. */ bool isInetAddress(void) const; /** * Provide a low level system usable struct in_addr object from * the contents of IPV6Address. This is needed for services such * as bind() and connect(). * * @return system binary coded internet address. */ struct in6_addr getAddress(void) const; /** * Provide a low level system usable struct in_addr object from * the contents of IPV6Address. This is needed for services such * as bind() and connect(). * * @param i for IPV6Addresses with multiple addresses, returns the * address at this index. User should call getAddressCount() * to determine the number of address the object contains. * @return system binary coded internet address. If parameter i is * out of range, the first address is returned. */ struct in6_addr getAddress(size_t i) const; /** * Returns the number of internet addresses that an IPV6Address object * contains. This usually only happens with IPV6Host objects * where multiple IP addresses are returned for a DNS lookup */ size_t getAddressCount() const { return addr_count; } IPV6Address &operator=(const char *str); IPV6Address &operator=(struct in6_addr addr); IPV6Address &operator=(const IPV6Address &rhs); inline bool operator!() const {return !isInetAddress();}; /** * Compare two internet addresses to see if they are equal * (if they specify the physical address of the same internet host). * * If there is more than one IP address in either IPV6Address object, * this will return true if all of the IP addresses in the smaller * are in the larger in any order. */ bool operator==(const IPV6Address &a) const; /** * Compare two internet addresses to see if they are not * equal (if they each refer to unique and different physical * ip addresses). * * This is implimented in terms of operator== */ bool operator!=(const IPV6Address &a) const; }; /** * Internet addresses used specifically as masking addresses (such as " * 255.255.255.0") are held in the IPV6Mask derived object. The * seperate class is used so that C++ type casting can automatically * determine when an IPV6Address object is really a mask address object * rather than simply using the base class. This also allows manipulative * operators for address masking to operate only when presented with a * Masked address as well as providing cleaner and safer source. * * @author David Sugar * @short Internet Address Mask such as subnet masks. */ class __EXPORT IPV6Mask : public IPV6Address { public: /** * Create the mask from a null terminated ASCII string such as * "255.255.255.128". * * @param mask null terminated ASCII mask string. */ IPV6Mask(const char *mask); /** * Masks are usually used to coerce host addresses into a specific * router or class domain. This can be done by taking the Inet * Host Address object and "and"ing it with an address mask. This * operation can be directly expressed in C++ through the & operator. * * @return a internet host address that has been masked. * @param addr host address to be masked by subnet. * @param mask inetnet mask address object to mask by. */ friend __EXPORT IPV6Host operator&(const IPV6Host &addr, const IPV6Mask &mask); }; /** * This object is used to hold the actual and valid internet address of a * specific host machine that will be accessed through a socket. * * @author David Sugar * @short Address of a specific Internet host machine. */ class __EXPORT IPV6Host : public IPV6Address { public: /** * Create a new host address for a specific internet host. The * internet host can be specified in a null terminated ASCII * string and include either the physical host address or the * DNS name of a host machine. Hence, an IPV6Host * ("www.voxilla.org") can be directly declaired in this manner. * * Defaults to the IP address that represents the interface matching * "gethostname()". * * @param host dns or physical address of an Internet host. */ IPV6Host(const char *host = NULL); /** * Convert a system socket binary address such as may be * returned through the accept() call or getsockpeer() into * an internet host address object. * * @param addr binary address of internet host. */ IPV6Host(struct in6_addr addr); /** * Mask the internet host address object with a network mask address. * This is commonly used to coerce an address by subnet. */ IPV6Host &operator&=(const IPV6Mask &mask); friend class __EXPORT IPV6Mask; friend __EXPORT IPV6Host operator&(const IPV6Host &addr, const IPV6Mask &mask); }; /** * The broadcast address object is used to store the broadcast address for * a specific subnet. This is commonly used for UDP broadcast operations. */ class __EXPORT IPV6Broadcast : public IPV6Address { public: /** * Specify the physical broadcast address to use and create a new * broadcast address object based on a null terminated ASCII * string. * * @param net null terminated ASCII network address. */ IPV6Broadcast(const char *net = "255.255.255.255"); }; /** * A specialization of IPV6Address that provides address validation * for multicast addresses. Whenever its value changes the new value * is checked to be in the range from 224.0.0.1 through * 239.255.255.255. If it is not, an exception is thrown. * * @short A multicast network address. * @author Federico Montesino */ class __EXPORT IPV6Multicast: public IPV6Address { public: /** * Create an Internet Multicast Address object with an empty * (0.0.0.0) address. */ IPV6Multicast(); /** * Convert the system internet address data type (struct in_addr) * into a Common C++ IPV4Multicast object. * * @param address struct of system used binary internet address. */ IPV6Multicast(const struct in6_addr address); /** * Convert a null terminated ASCII multicast address string * (example: "224.0.0.1") or multicast name string (example: * "sap.mcast.net") directly into a Common C++ * IPV6Multicast object. Works like IPV6Address(const * char*). * * @param address null terminated C string. */ IPV6Multicast(const char *address); private: /** * Check the address in addr is a valid multicast * address. In case not, throws an exception. * * @param address a system network address * @return true if validation succeeded */ static const IPV6MulticastValidator validator; }; extern __EXPORT std::ostream& operator<<(std::ostream &os, const IPV6Address &ia); inline struct in6_addr getaddress(const IPV6Address &ia) {return ia.getAddress();} #endif #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/exception.h0000644000175000017500000001033611463367044014165 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file exception.h * @short GNU Common C++ exception model base classes. **/ #ifndef CCXX_EXCEPTION_H_ #define CCXX_EXCEPTION_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_STRING_H_ #include #endif // see if we support useful and std exception handling, else we ignore // it for the rest of the system. #if defined(HAVE_EXCEPTION) #define COMMON_STD_EXCEPTION #include #ifdef CCXX_NAMESPACES namespace ost { #endif /** * Mainline exception handler, this is the root for all Common C++ * exceptions and assures the ansi C++ exception class hierarchy is both * followed and imported into the gnu Common C++ class hierarchy. * * @author David Sugar * @short Base exception class for all Common C++ exceptions. */ class __EXPORT Exception : public std::exception { private: String _what; public: Exception(const String& what_arg) throw(); virtual ~Exception() throw(); virtual const char *getString() const; virtual const char *what() const throw(); }; /** * A sub-hierarchy for all Common C++ I/O related classes. * * @author David Sugar * @short I/O operation exception hierarchy. */ class __EXPORT IOException : public Exception { private: long _systemError; mutable char* _systemErrorString; public: IOException(const String &what_arg, long systemError = 0) throw(); virtual ~IOException() throw(); virtual long getSystemError() const throw(); virtual const char* getSystemErrorString() const throw(); }; /** * A sub-hierarchy for thread exceptions. * * @author David Sugar * @short thread exception hierarchy. */ class __EXPORT ThrException : public Exception { public: ThrException(const String &what_arg) : Exception(what_arg) {}; }; /** * A sub-hierarchy for all task synchronizion related exceptions. * * @author David Sugar * @short Synchronization object exception hierarchy. */ class __EXPORT SyncException : public ThrException { public: SyncException(const String &what_arg) : ThrException(what_arg) {}; }; class __EXPORT InterruptException : public ThrException { public: InterruptException() : ThrException("interrupted") {}; }; #ifdef CCXX_NAMESPACES } #endif #endif #endif commoncpp2-1.8.1/inc/cc++/xml.h0000644000175000017500000002122711463371405012764 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file xml.h * @short XML streams abstraction and RPC services. **/ #ifndef CCXX_XML_H_ #define CCXX_XML_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_SLOG_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * This class impliments a basic XML stream parser that can be used to * examine an XML resource thru virtual I/O methods. This class must * be derived into one that can impliment the physical I/O required to * parse actual data. A mixer class using XMLStream and URLStream would * seem a likely combination for this purpose. * * @author David Sugar * @short XML Stream Parser (SAX) */ class __EXPORT XMLStream { private: int ecount, dcount; enum { TAG, CDATA, COMMENT, DTD, AMP, NONE} state; char dbuf[8192]; unsigned dp; bool parseChunk(const char *chunk, size_t len); void parseInit(void); bool parseTag(void); void putData(char c); void clrData(void); protected: virtual ~XMLStream(); public: /** * May perform an open operation on behalf of a parsed resource. * In some cases, the parser may be merged with a class that * already has performed some kind of open, and this method can * then be ignored. * * @return true if open is successful. * @param resource passed to Parse methods. */ virtual bool open(const char *resource); /** * May perform a close operation of an i/o source when the parser * has completed operation. */ virtual void close(void); /** * Get error logging level. * * @return error logging level. */ virtual Slog::Level getLogging(void); /** * Virtual to receive embedded comments in an XML document being * parsed. * * @param text text comment extracted. * @param len length of comment. */ virtual void comment(const unsigned char *text, size_t len); /** * Read method to aquire data for the parser. * * @return number of bytes actually read. * @param buffer to read data into. * @param len number of bytes to read. */ virtual int read(unsigned char *buffer, size_t len) = 0; /** * Virtual to receive character text extracted from the document * in the current element. * * @param text received. * @param len length of text received. */ virtual void characters(const unsigned char *text, size_t len) = 0; /** * Identify start of document event. */ virtual void startDocument(void); /** * Identify end of document event. */ virtual void endDocument(void); /** * Identify start of an element in the document. * * @param name of element found. * @param attr list of attributes extracted. */ virtual void startElement(const unsigned char *name, const unsigned char **attr) = 0; /** * Identify end of an element in the document. * * @param name of element found. */ virtual void endElement(const unsigned char *name) = 0; /** * Parse a resource as a stream thru the virtual read method. * * @return true if well formed document has been fully parsed. * @param resource optional name of resource. */ bool parse(const char *resource = NULL); }; /** * This class impliments a core XMLRPC service without the underlying * transports. It is meant to create and parse XMLRPC messages. To * use for a fit purpose, one might combine it with URLStream, although * this implimentation makes no requirement for http based transport. * * @author David Sugar * @short XML-RPC service building class */ class __EXPORT XMLRPC : public XMLStream { private: #ifdef HAVE_SSTREAM std::stringstream strBuf; #else char *buffer; std::strstream *oldStrBuf; size_t bufSize; #endif bool structFlag; bool reply, fault; unsigned array; protected: /** * Used in a derived transport class to deliver the XMLRPC encoded * request and return true if successful. The Parse method can * then be used to decode the reply. * * @return true if successful. * @param resource to send to (such as url). * @param msg well formed XMLRPC request message. */ virtual bool post(const char *resource, const char *msg) = 0; /** * Start member struct. */ void begStruct(void); public: /** * Construct XMLRPC workspace. * * @param bufferSize size of buffer when using old C++ * strstreams. When the newer stringstream (\) is * available, this parameter is silently ignored. */ XMLRPC(size_t bufferSize = 512); /** * Destroy XMLRPC object. */ virtual ~XMLRPC(); /** * Create an array. */ void begArray(void); /** * end an array. */ void endArray(void); /** * Create XMLRPC "method" call in buffer. * * @param method name of method being called. */ void invoke(const char *method); /** * Create XMLRPC "reply" to a method call. * * @param fault set true for fault message. */ void response(bool fault); /** * Add bool param to XMLRPC request. * * @param value to add. */ void addParam(bool value); /** * Add bool member to a XMLRPC struct. * * @param name of member. * @param value of member. */ void addMember(const char *name, bool value); /** * Add an integer paramater to XMLRPC request. * * @param value to add. */ void addParam(long value); /** * Add an integer member to XMLRPC struct. * * @param name of member. * @param value of member. */ void addMember(const char *name, long value); /** * Add a string paramater to XMLRPC request. * * @param string to add. */ void addParam(const char *string); /** * Add a string member to XMLRPC struct. * * @param name of member. * @param value of member. */ void addMember(const char *name, const char *value); /** * Clear a struct. */ void endStruct(void); /** * Complete buffer and send well formed XMLRPC request thru post. * * @return true if successful. * @param resource to send to. */ bool send(const char *resource); }; //#else //#error "XML support has been selected, but libxml could not be found" //#endif // ifdef HAVE_XML //#else //#error "XML support is not available." //#endif // ifdef COMMON_XML_PARSING #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/file.h0000644000175000017500000006561211463367157013122 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file file.h * @short Files and dynamic loader services. **/ #ifndef CCXX_FILE_H_ #define CCXX_FILE_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_EXCEPTION_H_ #include #endif #ifndef WIN32 # ifdef __BORLANDC__ # include # include # else # include # endif # include # include # include #else # if __BORLANDC__ >= 0x0560 # include # include # else # include # endif #endif #ifdef HAVE_SHL_LOAD #include #endif #ifdef HAVE_MACH_DYLD #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif typedef unsigned long pos_t; #ifndef WIN32 // use a define so that if the sys/types.h header already defines caddr_t // as it may on BSD systems, we do not break it by redefining again. #undef caddr_t #define caddr_t char * typedef size_t ccxx_size_t; #else #if !defined(__BORLANDC__) || __BORLANDC__ >= 0x0560 typedef LONG off_t; #endif typedef void* caddr_t; typedef DWORD ccxx_size_t; #endif #ifndef PATH_MAX #define PATH_MAX 256 #endif #ifndef NAME_MAX #define NAME_MAX 64 #endif class __EXPORT File { public: enum Error { errSuccess = 0, errNotOpened, errMapFailed, errInitFailed, errOpenDenied, errOpenFailed, errOpenInUse, errReadInterrupted, errReadIncomplete, errReadFailure, errWriteInterrupted, errWriteIncomplete, errWriteFailure, errLockFailure, errExtended }; typedef enum Error Error; enum Access { #ifndef WIN32 accessReadOnly = O_RDONLY, accessWriteOnly= O_WRONLY, accessReadWrite = O_RDWR #else accessReadOnly = GENERIC_READ, accessWriteOnly = GENERIC_WRITE, accessReadWrite = GENERIC_READ | GENERIC_WRITE #endif }; typedef enum Access Access; protected: typedef struct _fcb { struct _fcb *next; caddr_t address; ccxx_size_t len; off_t pos; bool locked; } fcb_t; public: #ifdef WIN32 enum Open { openReadOnly, // = FILE_OPEN_READONLY, openWriteOnly, // = FILE_OPEN_WRITEONLY, openReadWrite, // = FILE_OPEN_READWRITE, openAppend, // = FILE_OPEN_APPEND, openTruncate // = FILE_OPEN_TRUNCATE }; #else enum Open { openReadOnly = O_RDONLY, openWriteOnly = O_WRONLY, openReadWrite = O_RDWR, openAppend = O_WRONLY | O_APPEND, #ifdef O_SYNC openSync = O_RDWR | O_SYNC, #else openSync = O_RDWR, #endif openTruncate = O_RDWR | O_TRUNC }; typedef enum Open Open; /* to be used in future */ #ifndef S_IRUSR #define S_IRUSR 0400 #define S_IWUSR 0200 #define S_IRGRP 0040 #define S_IWGRP 0020 #define S_IROTH 0004 #define S_IWOTH 0002 #endif #endif // !WIN32 #ifndef WIN32 enum Attr { attrInvalid = 0, attrPrivate = S_IRUSR | S_IWUSR, attrGroup = attrPrivate | S_IRGRP | S_IWGRP, attrPublic = attrGroup | S_IROTH | S_IWOTH }; #else // defined WIN32 enum Attr { attrInvalid=0, attrPrivate, attrGroup, attrPublic }; #endif // !WIN32 typedef enum Attr Attr; #ifdef WIN32 enum Complete { completionImmediate, // = FILE_COMPLETION_IMMEDIATE, completionDelayed, // = FILE_COMPLETION_DELAYED, completionDeferred // = FILE_COMPLETION_DEFERRED }; enum Mapping { mappedRead, mappedWrite, mappedReadWrite }; #else enum Mapping { mappedRead = accessReadOnly, mappedWrite = accessWriteOnly, mappedReadWrite = accessReadWrite }; enum Complete { completionImmediate, completionDelayed, completionDeferred }; #endif typedef enum Complete Complete; typedef enum Mapping Mapping; public: static const char *getExtension(const char *path); static const char *getFilename(const char *path); static char *getFilename(const char *path, char *buffer, size_t size = NAME_MAX); static char *getDirname(const char *path, char *buffer, size_t size = PATH_MAX); static char *getRealpath(const char *path, char *buffer, size_t size = PATH_MAX); }; /** * A low level portable directory class. Used to support ccstd Directory * container. This provides a basic mechanism for allocating and * accessing file entries. * * @author David Sugar * @short low level directory access class. */ class __EXPORT Dir : public File { private: #ifndef WIN32 DIR *dir; #ifdef HAVE_READDIR_R struct dirent *save; char save_space[sizeof(struct dirent) + PATH_MAX + 1]; #endif struct dirent *entry; #else HANDLE hDir; WIN32_FIND_DATA data, fdata; char *name; #endif public: Dir(const char *name = NULL); static bool create(const char *path, Attr attr = attrGroup); static bool remove(const char *path); static bool setPrefix(const char *path); static bool getPrefix(char *path, size_t size = PATH_MAX); void open(const char *name); void close(void); virtual ~Dir(); const char *getName(void); const char *operator++() {return getName();}; const char *operator++(int) {return getName();}; const char *operator*(); bool rewind(void); bool operator!() #ifndef WIN32 {return !dir;}; #else {return hDir != INVALID_HANDLE_VALUE;}; #endif bool isValid(void); }; /** * A generic class to walk a hierarchical directory structure. * * @author David Sugar * @short Directory tree walking. */ class __EXPORT DirTree { private: char path[PATH_MAX + 1]; Dir *dir; unsigned max, current, prefixpos; protected: /** * Virtual method to filter results. Virtual override methods * should call baseclass method to assure . and .. names are * stripped out. * * @return true if current filename is accepted. * @param file path to examine * @param ino info of type, date, etc. */ virtual bool filter(const char *file, struct stat *ino); public: /** * Construct a directory tree walk starting at the specified * prefix. A maximum subdirectory depth is also specified. * * @param prefix to start walk. * @param maxdepth subdirectory depth to examine. */ DirTree(const char *prefix, unsigned maxdepth); /** * Construct an un-opened directory tree of a known maximum depth * * @param maxdepth subdirectory subdirectory depth. */ DirTree(unsigned maxdepth); virtual ~DirTree(); /** * Open a directory tree path. * * @param prefix directory path to open. */ void open(const char *prefix); /** * Close the directory path. */ void close(void); /** * Extract the next full pathname from the directory walk. * When returning directories, a '/' is appended. The * returned string is a buffer of MAX_PATH size. * * @return path of next subdirectory entry or NULL. */ char *getPath(void); /** * This is used to step through the filter virtual for an * entire subtree, and is used for cases where a derived * DirTree class performs it's primary operations through * filter rather than externally by calling getPath(). * * @return number of files and directories examined. * @param prefix directory path to examine. */ unsigned perform(const char *prefix); }; /** * The purpose of this class is to define a base class for low level * random file access that is portable between Win32 and Posix systems. * This class is a foundation both for optimized thread shared and * traditional locked file access that is commonly used to build * database services, rather than the standard C++ streaming file classes. * * @author David Sugar * @short Portable random disk file access. */ class __EXPORT RandomFile : protected Mutex, public File { private: Error errid; char *errstr; protected: #ifndef WIN32 int fd; // FIXME: WIN32 as no access member Access access; #else HANDLE fd; #endif char *pathname; struct { unsigned count : 16; bool thrown : 1; bool initial : 1; #ifndef WIN32 bool immediate : 1; #endif bool temp : 1; } flags; /** * Create an unopened random access file. */ RandomFile(const char *name = NULL); /** * Default copy constructor. */ RandomFile(const RandomFile &rf); /** * Post an error event. * * @return error code. * @param errid error code. * @param errstr error message string. */ Error error(Error errid, char *errstr = NULL); /** * Post an extended string error message. * * @return errExtended. * @param err error string. */ inline Error error(char *err) {return error(errExtended, err);}; /** * Used to enable or disable throwing of exceptions on * errors. * * @param enable true if errors will be thrown. */ inline void setError(bool enable) {flags.thrown = !enable;}; #ifndef WIN32 /** * Used to set file completion modes. * * @return errSuccess if okay. * @param mode completion mode. * @todo implement in win32 */ Error setCompletion(Complete mode); #endif /** * Used to set the temporary attribute for the file. Temporary * files are automatically deleted when closed. * * @param enable true for marking as temporary. */ inline void setTemporary(bool enable) {flags.temp = enable;}; /** * This method is used to initialize a newly created file as * indicated by the "initial" flag. This method also returns * the file access permissions that should be associated with * the file. This method should never be called directly, but * is instead used to impliment the "Initial" method. Typically * one would use this to build an empty database shell when a * previously empty database file is created. * * @return access, or attrInvalid if should be removed. */ virtual Attr initialize(void); /** * Close the file. */ void final(void); public: /** * Destroy a random access file or it's derived class. */ virtual ~RandomFile(); /** * This method should be called right after a RandomFile derived * object has been created. This method will invoke initialize * if the object is newly created, and set file access permissions * appropriately. * * @return true if file had to be initialized. */ bool initial(void); /** * Get current file capacity. * * @return total file size. */ off_t getCapacity(void); /** * This method is commonly used to close and re-open an existing * database. This may be used when the database has been unlinked * and an external process provides a new one to use. */ virtual Error restart(void); /** * Return current error id. * * @return last error identifier set. */ inline Error getErrorNumber(void) {return errid;}; /** * Return current error string. * * @return last error string set. */ inline char *getErrorString(void) {return errstr;}; bool operator!(void); }; /** * This class defines a database I/O file service that can be shared * by multiple threads. All threads access a global copy of the database * object, and mutex locks can be used to preserve transaction * integrety. pread/pwrite calls can be used for optimized I/O when * supported. * * ThreadFile is meant for use by a threaded database server where multiple * threads may each perform semi-independent operations on a given database * table stored on disk. A special "fcb" structure is used to hold file * "state", and pread/pwrite is used whenever possible for optimized I/O. On * systems that do not offer pwread/pwrite, a Mutex lock is used to protect * concurrent lseek and read/write operations. ThreadFile managed databases * are assumed to be used only by the local server and through a single file * descriptor. * * @author David Sugar * @short This class defines a database I/O file service that can be shared by multiple threads. */ class __EXPORT ThreadFile : public RandomFile { private: ThreadKey state; fcb_t *first; fcb_t *getFCB(void); Error open(const char *path); public: /** * Open or create a new database file. You should also use * Initial. * * @param path pathname of database to open. */ ThreadFile(const char *path); /** * Close and finish a database file. */ virtual ~ThreadFile(); /** * Restart an existing database; close and re-open. * * @return errSuccess if successful. */ Error restart(void); /** * Fetch a portion of the file into physical memory. This can use * state information to fetch the current record multiple times. * * @return errSuccess on success. * @param address address to use, or NULL if same as last I/O. * @param length length to use, or 0 if same as last I/O. * @param position file position to use -1 if same as last I/O. */ Error fetch(caddr_t address = NULL, ccxx_size_t length = 0, off_t position = -1); /** * Update a portion of a file from physical memory. This can use * state information to commit the last read record. * * @return errSuccess on success. * @param address address to use, or NULL if same as last I/O. * @param length length to use, or 0 if same as last I/O. * @param position file position to use or -1 if same as last I/O. */ Error update(caddr_t address = NULL, ccxx_size_t length = 0, off_t position = -1); /** * Add new data to the end of the file. * @param address address to use, or NULL if same as last I/O. * @param length length to use, or 0 if same as last I/O. */ Error append(caddr_t address = NULL, ccxx_size_t length = 0); /** * Fetch the current file position marker for this thread. * * @return file position offset. */ off_t getPosition(void); bool operator++(void); bool operator--(void); }; /** * This class defines a database I/O file service that can be shared * by multiple processes. Each thread should access a dup of the database * object, and mutex locks can be used to preserve transaction * integrety if multiple threads are used. * * SharedFile is used when a database may be shared between multiple * processes. SharedFile automatically applies low level byte-range "file * locks", and provides an interface to fetch and release byte-range locked * portions of a file. * * @author David Sugar * @short This class defines a database I/O file service that can be shared by multiple processes. */ class __EXPORT SharedFile : public RandomFile { private: fcb_t fcb; Error open(const char *path); public: /** * Open or create a new database file. You should also use * Initial. * * @param path pathname of database to open. */ SharedFile(const char *path); /** * Create a shared file as a duplicate of an existing shared * file. * * @param file original file. */ SharedFile(const SharedFile &file); /** * Close and finish a database file. */ virtual ~SharedFile(); /** * Restart an existing database; close and re-open. * * @return errSuccess if successful. */ Error restart(void) {return open(pathname);}; /** * Lock and Fetch a portion of the file into physical memory. * This can use state information to fetch the current record * multiple times. * * @return errSuccess on success. * @param address address to use, or NULL if same as last I/O. * @param length length to use, or 0 if same as last I/O. * @param position file position to use -1 if same as last I/O. */ Error fetch(caddr_t address = NULL, ccxx_size_t length = 0, off_t position = -1); /** * Update a portion of a file from physical memory. This can use * state information to commit the last read record. The current * lock is also cleared. * * @return errSuccess on success. * @param address address to use, or NULL if same as last I/O. * @param length length to use, or 0 if same as last I/O. * @param position file position to use or -1 if same as last I/O. */ Error update(caddr_t address = NULL, ccxx_size_t length = 0, off_t position = -1); /** * Clear a lock held from a previous fetch operation without * updating. * * @return errSuccess on success. * @param length length to use, or 0 if same as last I/O. * @param pos file position to use or -1 if same as last I/O. */ Error clear(ccxx_size_t length = 0, off_t pos = -1); /** * Add new data to the end of the file. Locks file during append. * * @param address address to use, or NULL if same as last I/O. * @param length length to use, or 0 if same as last I/O. */ Error append(caddr_t address = NULL, ccxx_size_t length = 0); /** * Fetch the current file position marker for this thread. * * @return file position offset. */ off_t getPosition(void); bool operator++(void); bool operator--(void); }; /** * Create and map a disk file into memory. This portable class works * under both Posix via mmap and under the win32 API. A mapped file * can be referenced directly by it's memory segment. One can map * and unmap portions of a file on demand, and update * changed memory pages mapped from files immediately through sync(). * * @author David Sugar * @short Map a named disk file into memory. */ class __EXPORT MappedFile : public RandomFile { private: fcb_t fcb; int prot; #ifdef WIN32 HANDLE map; char mapname[64]; #endif public: /** * Open a file for mapping. More than one segment of a file * may be mapped into seperate regions of memory. * * @param fname file name to access for mapping. * @param mode access mode to map file. */ MappedFile(const char *fname, Access mode); /** * Create if not exists, and map a file of specified size * into memory. * * @param fname file name to access for mapping. * @param mode access mode to map file. * @param size of file to map. */ MappedFile(const char *fname, Access mode, size_t size); /** * Map a portion or all of a specified file in the specified * shared memory access mode. Valid mapping modes include * mappedRead, mappedWrite, and mappedReadWrite. * * @param fname pathname of file to map into memory. * @param offset from start of file to begin mapping in bytes. * @param size of mapped area in bytes. * @param mode to map file. */ MappedFile(const char *fname, pos_t offset, size_t size, Access mode); /** * Release a mapped section of memory associated with a file. The * mapped area is updated back to disk. */ virtual ~MappedFile(); // FIXME: not use library function in header ?? /** * Synchronize the contents of the mapped portion of memory with * the disk file and wait for completion. This assures the memory * mapped from the file is written back. */ void sync(void); /** * Synchronize a segment of memory mapped from a segment fetch. * * @param address memory address to update. * @param len size of segment. */ void sync(caddr_t address, size_t len); /** * Map a portion of the memory mapped from the file back to the * file and do not wait for completion. This is useful when mapping * a database file and updating a single record. * * @param offset offset into the mapped region of memory. * @param len length of partial region (example, record length). */ void update(size_t offset = 0, size_t len = 0); /** * Update a mapped region back to disk as specified by address * and length. * * @param address address of segment. * @param len length of segment. */ void update(caddr_t address, size_t len); /** * Release (unmap) a memory segment. * * @param address address of memory segment to release. * @param len length of memory segment to release. */ void release(caddr_t address, size_t len); /** * Fetch a pointer to an offset within the memory mapped portion * of the disk file. This really is used for convience of matching * operations between Update and Fetch, as one could simply have * accessed the base pointer where the file was mapped directly. * * @param offset from start of mapped memory. */ inline caddr_t fetch(size_t offset = 0) {return ((char *)(fcb.address)) + offset;}; /** * Fetch and map a portion of a disk file to a logical memory * block. * * @return pointer to memory segment. * @param pos offset of file segment to map. * @param len size of memory segment to map. */ caddr_t fetch(off_t pos, size_t len); /** * Lock the currently mapped portion of a file. * * @return true if pages are locked. */ bool lock(void); /** * Unlock a locked mapped portion of a file. */ void unlock(void); /** * Compute map size to aligned page boundry. * * @param size request. * @return page aligned size. */ size_t pageAligned(size_t size); }; /** * The DSO dynamic loader class is used to load object files. On * elf based systems this is typically done with dlopen. A dummy * stub class is generated for non-dl capable systems. * * @author David Sugar * @short Dynamic class file loader. */ class __EXPORT DSO { private: const char *err; #ifdef HAVE_MODULES static Mutex mutex; static DSO *first; static DSO *last; DSO *next, *prev; const char *id; #if defined(HAVE_MACH_DYLD) NSModule oModule; #elif defined(HAVE_SHL_LOAD) shl_t image; #elif defined(WIN32) HINSTANCE hImage; #else void *image; #endif void loader(const char *filename, bool resolve); #endif public: /** * Construct and load a DSO object file. * * @param filename pathname of object file to load. */ #ifdef HAVE_MODULES DSO(const char *filename) {loader(filename, true);}; DSO(const char *filename, bool resolve) {loader(filename, resolve);}; #else DSO(const char *filename) {throw this;}; DSO(const char *filename, bool resolve) {throw this;}; #endif /** * Retrieve error indicator associated with DSO failure. This * is often used in catch handlers. */ inline const char *getError(void) {return err;}; /** * Detach a DSO object from running memory. */ #ifdef HAVE_MODULES virtual ~DSO(); #endif /** * Lookup a symbol in the loaded file. */ #ifdef HAVE_MODULES void* operator[](const char *sym); #else void *operator[](const char *) {return NULL;}; #endif #ifdef HAVE_MODULES static void dynunload(void); #else static void dynunload(void) {return;}; #endif /** * Find a specific DSO object by filename. * * @param name of DSO object file (partial). */ static DSO *getObject(const char *name); /** * See if DSO object is valid. * * @return true if valid. */ bool isValid(void); /** * Install debug handler... */ static void setDebug(void); }; /** @relates RandomFile */ bool __EXPORT isDir(const char *path); /** @relates RandomFile */ bool __EXPORT isFile(const char *path); #ifndef WIN32 /** @relates RandomFile */ bool __EXPORT isDevice(const char *path); #else /** @relates RandomFile */ inline bool isDevice(const char *path) { return false; } #endif /** @relates RandomFile */ bool __EXPORT canAccess(const char *path); /** @relates RandomFile */ bool __EXPORT canModify(const char *path); /** @relates RandomFile */ time_t __EXPORT lastModified(const char *path); /** @relates RandomFile */ time_t __EXPORT lastAccessed(const char *path); #ifdef COMMON_STD_EXCEPTION class DirException : public IOException { public: DirException(const String &str) : IOException(str) {}; }; class __EXPORT DSOException : public IOException { public: DSOException(const String &str) : IOException(str) {}; }; class __EXPORT FileException : public IOException { public: FileException(const String &str) : IOException(str) {}; }; #endif #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/export.h0000644000175000017500000000461211463367070013507 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file export.h * @short export/import definitions for DLL's on Win32. * * This is used to swap rtl definitions for export vs import on Win32 * machines when building a dll so that the remaining headers for my * new dll are all "exports", while the headers for the included ccxx * dll are all "imports". **/ #ifdef __DLLRTL #undef __EXPORT #define __EXPORT __DLLRTL #ifdef CYGWIN_IMPORTS #undef CYGWIN_IMPORTS #endif #endif commoncpp2-1.8.1/inc/cc++/url.h0000644000175000017500000003470311463371363012774 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file url.h * @short URL streams abstraction. **/ #ifndef CCXX_URL_H_ #define CCXX_URL_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifndef CCXX_MIME_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * A URL processing version of TCPStream. * * @author David Sugar * @short C++ url processing stream class. */ class __EXPORT URLStream : public TCPStream { public: /** * Return error for url fetch */ typedef enum { errSuccess = 0, errUnreachable, errMissing, errDenied, errInvalid, errForbidden, errUnauthorized, errRelocated, errFailure, errTimeout, errInterface } Error; /** * Type of authentication */ typedef enum { authAnonymous = 0, authBasic } Authentication; /** * Encoding used in transfer */ typedef enum { encodingBinary = 0, encodingChunked } Encoding; /** * Type of fetch */ typedef enum { methodHttpGet, methodHttpPut, methodHttpPost, methodHttpPostMultipart, methodFtpGet, methodFtpPut, methodFileGet, methodFilePut } Method; /** * http protocol version */ typedef enum { protocolHttp1_0, protocolHttp1_1 } Protocol; private: const char *agent, *referer, *cookie, *pragma, *user, *password; const char *proxyUser, *proxyPasswd; const char *localif; IPV4Host proxyHost; #ifdef CCXX_IPV6 IPV6Host v6proxyHost; #endif tpport_t proxyPort; Method urlmethod; Encoding encoding; Protocol protocol; Authentication auth; Authentication proxyAuth; timeout_t timeout; bool persistent; bool follow; unsigned chunk; Error getHTTPHeaders(); URLStream(const URLStream& rhs); protected: ost::String m_host, m_address; /** * Send http header to server. * * @param url base to send header to * @param vars to post or use in get method * @param bufsize of stream buffering to use * @return success or class error */ Error sendHTTPHeader(const char *url, const char **vars, size_t bufsize); /** * Called if stream buffer needs refilling. * * @return number of bytes refilled or error if < 0 */ int underflow(void); /** * Derived method for async or timed I/O function on url stream. * * @return number of bytes read or < 0 for error. * @param buffer to read stream data into. * @param len of bytes to read from stream. * @param timer to wait for data in milliseconds. */ virtual int aRead(char *buffer, size_t len, timeout_t timer); /** * Derived method for async or timed I/O function on url stream. * * @return number of bytes written or < 0 for error. * @param buffer to write stream data from. * @param len of bytes to write to stream. * @param timer to wait for data in milliseconds. */ virtual int aWrite(char *buffer, size_t len, timeout_t timer); /** * Derived method to receive and parse http "headers". * * @param header keyword. * @param value header keyword value. */ virtual void httpHeader(const char *header, const char *value); /** * A virtual to insert additional header info into the request. * * @return array of header attributes to add. */ virtual char **extraHeader(void); public: /** * Construct an instance of URL stream. * * @param family protocol to use. * @param timer for default timeout on I/O operations. */ URLStream(Family family = IPV4, timeout_t timer = 0); /** * Line parsing with conversion. * * @return URLStream object reference. * @param buffer to store. * @param len maximum buffer size. */ URLStream &getline(char *buffer, size_t len); /** * Get URL data from a named stream of a known buffer size. * * @return url error code. * @param url name of resource. * @param buffer size of buffer. */ Error get(const char *url, size_t buffer = 512); /** * Get URL data from a named stream of a known buffer size. * Requesting URL defined in previous calls of setAddress() and * setHost() functions. * * @return url error code. * @param buffer size of buffer. */ Error get(size_t buffer = 512); /** * Submit URL with vars passed as argument array. This submit * assumes "GET" method. Use "post" member to perform post. * * @return url error code. * @param url name of resource. * @param vars to set. * @param buffer size of buffer. */ Error submit(const char *url, const char **vars, size_t buffer = 512); /** * Post URL vars with post method. * * @return success or error code. * @param url name of resource being posted. * @param vars to set in post. * @param buffer size of buffer. */ Error post(const char *url, const char **vars, size_t buffer = 512); /** * Post URL with MIME multipart form. * * @return success or error code. * @param url name of resource being posted. * @param form multi-part resource. * @param buffer size to use. */ Error post(const char *url, MIMEMultipartForm &form, size_t buffer = 512); /** * Used to fetch header information for a resource. * * @return url error code. * @param url name of resource. * @param buffer size of buffer. */ Error head(const char *url, size_t buffer = 512); /** * Close the URL stream for a new connection. */ void close(); /** * Set the referer url. * * @param str referer string. */ void setReferer(const char *str); /** * Set the host for the url * * @param str host address. */ inline void setHost(const char *str) {m_host = str;}; /** * Set the address for the url * * @param str address in the URL. */ inline void setAddress(const char *str) {m_address = str;}; /** * Set the cookie to pass. * * @param str cookie string. */ inline void setCookie(const char *str) {cookie = str;}; /** * Set user id for the url. * * @param str user id. */ inline void setUser(const char *str) {user = str;}; /** * Set password for the url. * * @param str password. */ inline void setPassword(const char *str) {password = str;}; /** * Set authentication type for the url. * * @param a authentication. * @param str string. */ void setAuthentication(Authentication a, const char *str = NULL); /** * Set proxy user id for the url. * * @param str user id. */ inline void setProxyUser(const char *str) {proxyUser = str;}; /** * Set proxy password for the url. * * @param str password. */ inline void setProxyPassword(const char *str) {proxyPasswd = str;}; /** * Set proxy authentication type for the url. * * @param a authentication. * @param str string. */ void setProxyAuthentication(Authentication a, const char *str = NULL); /** * Set the pragmas. * * @param str pragma setting. */ inline void setPragma(const char *str) {pragma = str;}; /** * Set the proxy server used. * * @param host proxy host. * @param port proxy port. */ void setProxy(const char *host, tpport_t port); /** * Set the agent. * * @param str agent value. */ inline void setAgent(const char *str) {agent = str;}; /** * Get url method (and protocol) employed. * * @return url method in effect. */ inline Method getMethod(void) {return urlmethod;}; /** * Set socket timeout characteristics for processing URL * requests. Set to 0 for no default timeouts. * * @param to timeout to set. */ inline void setTimeout(timeout_t to) {timeout = to;}; /** * Specify url following. Set to false to disable following * of relocation requests. * * @param enable true to enable following. */ inline void setFollow(bool enable) {follow = enable;}; /** * Specify http protocol level being used. * * @param pro protocol level. */ inline void setProtocol(Protocol pro) {protocol = pro;}; /** * Specify local interface to use * * @param intf Local interface name */ inline void setLocalInterface(const char *intf) {localif=intf;} }; /** @relates URLStream * Decode an url parameter (ie "\%20" -> " ") * @param source string * @param dest destination buffer. If NULL source is used */ __EXPORT char* urlDecode(char *source, char *dest = NULL); /** @relates URLStream * Encode an url parameter (ie " " -> "+") * @param source string * @param dest destination buffer. Do not overlap with source * @param size destination buffer size. */ __EXPORT char* urlEncode(const char *source, char *dest, size_t size); /** @relates URLStream * Decode a string using base64 coding. * Destination size should be at least strlen(src)+1. * Destination will be a string, so is always terminated . * This function is deprecated, base64 can use binary source, not only string * use overloaded b64Decode. * @return string coded * @param src source buffer * @param dest destination buffer. If NULL src is used */ __EXPORT char* b64Decode(char *src, char *dest = NULL); /** @relates URLStream * Encode a string using base64 coding. * Destination size should be at least strlen(src)/4*3+1. * Destination is string terminated. * This function is deprecated, coded stream can contain terminator character * use overloaded b64Encode instead. * @return destination buffer * @param source source string * @param dest destination octet buffer * @param size destination buffer size */ __EXPORT char* b64Encode(const char *source, char *dest, size_t size); /** @relates URLStream * Encode a octet stream using base64 coding. * Destination size should be at least (srcsize+2)/3*4+1. * Destination will be a string, so is always terminated * (unless you pass dstsize == 0). * @return size of string written not counting terminator * @param src source buffer * @param srcsize source buffer size * @param dst destination buffer * @param dstsize destination buffer size */ __EXPORT size_t b64Encode(const unsigned char *src, size_t srcsize, char *dst, size_t dstsize); /** @relates URLStream * Decode a string using base64 coding. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return number of octets written into destination buffer * @param src source string * @param dst destination octet buffer * @param dstsize destination buffer size */ __EXPORT size_t b64Decode(const char *src, unsigned char *dst, size_t dstsize); /** @relates URLStream * Encode a STL string using base64 coding into a STL string * @return base 64 encoded string * @param src source string */ __EXPORT String b64Encode(const String& src); /** @relates URLStream * Decode a STL string using base64 coding into an STL String. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return decoded string * @param src source string */ __EXPORT String b64Decode(const String& src); /** @relates URLStream * Encode a octet stream using base64 coding into a STL string * @return base 64 encoded string * @param src source buffer * @param srcsize source buffer size */ __EXPORT String b64Encode(const unsigned char *src, size_t srcsize); /** @relates URLStream * Decode a string using base64 coding. * Destination size should be at least strlen(src)/4*3. * Destination are not string terminated (It's just a octet stream). * @return number of octets written into destination buffer * @param src source string * @param dst destination octet buffer * @param dstsize destination buffer size */ __EXPORT size_t b64Decode(const String& src, unsigned char *dst, size_t dstsize); #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/socketport.h0000644000175000017500000003040111463371064014354 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file socketport.h * @short Network service framework and design pattern. **/ #ifndef CCXX_SOCKETPORT_H_ #define CCXX_SOCKETPORT_H_ #ifndef CCXX_ADDRESS_H_ #include #endif #ifndef CCXX_SOCKET_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif class __EXPORT SocketPort; class __EXPORT SocketService; /** * The socket port is an internal class which is attached to and then * serviced by a specific SocketService "object". Derived versions of * this class offer specific functionality for specific protocols. Both * Common C++ supporting frameworks and application objects may be derived * from related protocol specific base classes. * * A special set of classes, "SocketPort" and "SocketService", exist * for building realtime streaming media servers on top of UDP and TCP * protocols. The "SocketPort" is used to hold a connected or associated TCP * or UDP socket which is being "streamed" and which offers callback methods * that are invoked from a "SocketService" thread. SocketService's can be * pooled into logical thread pools that can service a group of SocketPorts. * A millisecond accurate "timer" is associated with each SocketPort and can * be used to time synchronize SocketPort I/O operations. * * @author David Sugar * @short base class for realtime and thread pool serviced protocols. */ class __EXPORT SocketPort : public Socket, public TimerPort { private: SocketPort *next, *prev; SocketService *service; #ifndef WIN32 struct timeval porttimer; #ifdef USE_POLL struct pollfd * ufd; #endif #else HANDLE event; #endif bool detect_pending; bool detect_output; bool detect_disconnect; friend class SocketService; protected: /** * Construct an accepted TCP socket connection from a specific * bound TCP server. This is meant to derive advanced application * specific TCP servers that can be thread pooled. * * @param svc pool thread object. * @param tcp socket object to accept. */ SocketPort(SocketService *svc, TCPSocket &tcp); #ifdef CCXX_IPV6 SocketPort(SocketService *svc, TCPV6Socket &tcp); #endif /** * Construct a bound UDP socket for use in deriving realtime * UDP streaming protocols handled by thread pool objects. * * @param svc pool thread object. * @param ia address of interface to bind. * @param port number to bind to. */ SocketPort(SocketService *svc, const IPV4Address &ia, tpport_t port); #ifdef CCXX_IPV6 SocketPort(SocketService *svc, const IPV6Address &ia, tpport_t port); #endif /** * A non-blocking constructor for outbound tcp connections. * To detect when the connection is established, overload * SocketPort::output(). SocketPort::output() get's called by * the SocketService when the connection is ready, * SocketPort::disconnect() when the connect failed. at the * moment you should set the socket state to "CONNECTED" when * SocketPort::output() get's called for the first time. * * @param svc pool thread object. * @param ih addess to connect to. * @param port number to connect to. **/ SocketPort(SocketService *svc, const IPV4Host &ih, tpport_t port); #ifdef CCXX_IPV6 SocketPort(SocketService *svc, const IPV6Host &ih, tpport_t port); #endif /** * Attach yourself to the service pool thread object. The later version. * * @param svc pool thread object */ void attach( SocketService* svc ); /** * Disconnect the socket from the service thread pool and * the remote connection. */ virtual ~SocketPort(); /** * Used to indicate if the service thread should monitor pending * data for us. */ void setDetectPending( bool ); /** * Get the current state of the DetectPending flag. */ bool getDetectPending( void ) const { return detect_pending; } /** * Used to indicate if output ready monitoring should be performed * by the service thread. */ void setDetectOutput( bool ); /** * Get the current state of the DetectOutput flag. */ bool getDetectOutput( void ) const { return detect_output; } /** * Called by the service thread pool when the objects timer * has expired. Used for timed events. */ virtual void expired(void); /** * Called by the service thread pool when input data is pending * for this socket. */ virtual void pending(void); /** * Called by the service thread pool when output data is pending * for this socket. */ virtual void output(void); /** * Called by the service thread pool when a disconnect has * occured. */ virtual void disconnect(void); /** * Connect a Socket Port to a known peer host. This is normally * used with the UDP constructor. This is also performed as a * non-blocking operation under Posix systems to prevent delays * in a callback handler. * * @return 0 if successful. * @param ia address of remote host or subnet. * @param port number of remote peer(s). */ Error connect(const IPV4Address &ia, tpport_t port); #ifdef CCXX_IPV6 Error connect(const IPV6Address &ia, tpport_t port); #endif /** * Transmit "send" data to a connected peer host. This is not * public by default since an overriding protocol is likely to * be used in a derived class. * * @return number of bytes sent. * @param buf address of buffer to send. * @param len of bytes to send. */ inline ssize_t send(const void *buf, size_t len) {return _IORET64 ::send(so, (const char *)buf, _IOLEN64 len, 0);}; /** * Receive a message from any host. This is used in derived * classes to build protocols. * * @param buf pointer to packet buffer to receive. * @param len of packet buffer to receive. * @return number of bytes received. */ inline ssize_t receive(void *buf, size_t len) {return _IORET64 ::recv(so, (char *)buf, _IOLEN64 len, 0);}; /** * Examine the content of the next packet. This can be used * to build "smart" line buffering for derived TCP classes. * * @param buf pointer to packet buffer to examine. * @param len of packet buffer to examine. * @return number of bytes actually available. */ inline ssize_t peek(void *buf, size_t len) {return _IORET64 ::recv(so, (char *)buf, _IOLEN64 len, MSG_PEEK);}; public: /** * Derived setTimer to notify the service thread pool of change * in expected timeout. This allows SocketService to * reschedule all timers. Otherwise same as TimerPort. * * @param timeout in milliseconds. */ void setTimer(timeout_t timeout = 0); /** * Derived incTimer to notify the service thread pool of a * change in expected timeout. This allows SocketService to * reschedule all timers. Otherwise same as TimerPort. * * @param timeout in milliseconds. */ void incTimer(timeout_t timeout); }; /** * The SocketService is a thread pool object that is meant to service * attached socket ports. Multiple pool objects may be created and * multiple socket ports may be attached to the same thread of execution. * This allows one to balance threads and sockets they service rather than * either using a single thread for all connections or a seperate thread * for each connection. Features can be added through supported virtual * methods. * * @author David Sugar * @short Thread pool service object for socket ports. */ class __EXPORT SocketService : public Thread, private Mutex { private: #ifndef WIN32 fd_set connect; int iosync[2]; int hiwater; #else // private syncronization class class Sync; Sync* sync; #endif int volatile count; SocketPort* volatile first, *last; /** * Attach a new socket port to this service thread. * * @param port of SocketPort derived object to attach. */ void attach(SocketPort *port); /** * Detach a socket port from this service thread. * * @param port of SocketPort derived object to remove. */ void detach(SocketPort *port); /** * The service thread itself. */ void run(void); friend class SocketPort; protected: /** * Handles all requests other than "termination". * * @param buf request id as posted from update(). */ virtual void onUpdate(unsigned char buf); /** * Called once each time the service thread is rescheduled. * This is called after the mutex is locked and can be used to * slip in additional processing. */ virtual void onEvent(void); /** * Called for each port that is being processed in response to * an event. This can be used to add additional notification * options during callback in combination with update(). * * @param port SocketPort who's callback events are being evaluated. */ virtual void onCallback(SocketPort *port); public: /** * Notify service thread that a port has been added or * removed, or a timer changed, so that a new schedule * can be computed for expiring attached ports. A "0" * is used to terminate the service thread, and additional * values can be specified which will be "caught" in the * onUpdate() handler. * * @param flag update flag value. */ void update(unsigned char flag = 0xff); /** * Create a service thread for attaching socket ports. The * thread begins execution with the first attached socket. * * @param pri of this thread to run under. * @param stack stack size. * @param id thread ID. */ SocketService(int pri = 0, size_t stack = 0, const char *id = NULL); /** * Terminate the thread pool and eliminate any attached * socket ports. */ virtual ~SocketService(); /** * Get current reference count. This can be used when selecting * the least used service handler from a pool. * * @return count of active ports. */ inline int getCount(void) const {return count;}; }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/zstream.h0000644000175000017500000000747111463371424013657 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file zstream.h * @short compressed stream operations. **/ #ifndef CCXX_ZSTREAM_H_ #define CCXX_ZSTREAM_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_STRING_H_ #include #endif #ifndef CCXX_EXCEPTION_H_ #include #endif #include #ifdef CCXX_NAMESPACES namespace ost { #endif #ifdef COMMON_STD_EXCEPTION class __EXPORT IOZException : public IOException { public: IOZException(const String &str) : IOException(str) {}; }; #endif class __EXPORT IZStream : protected std::streambuf, public std::istream { private: gzFile fp; int doallocate(); bool throwflag; protected: size_t bufsize; char *gbuf; void allocate(size_t size); int underflow(); int uflow(); public: IZStream(bool throwflag = false); IZStream(const char *name, size_t size = 512, bool tf = false); bool isOpen(void); void close(void); virtual ~IZStream(); void open(const char *name, size_t size = 512); inline size_t getBufferSize(void) {return bufsize;}; }; class __EXPORT OZStream : protected std::streambuf, public std::ostream { private: gzFile fp; int doallocate(); bool throwflag; protected: size_t bufsize; char *pbuf; void allocate(size_t size); int overflow(int ch); public: OZStream(bool throwflag = false); OZStream(const char *name, int level = Z_DEFAULT_COMPRESSION, size_t size = 512, bool tf = false); bool isOpen(void); void close(void); virtual ~OZStream(); void open(const char *name, int level = Z_DEFAULT_COMPRESSION, size_t size = 512); inline size_t getBufferSize(void) {return bufsize;}; }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/digest.h0000644000175000017500000001566511463366557013470 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file digest.h * @short Digest algorithms: checksum, CRC and MD5. **/ #ifndef CCXX_DIGEST_H_ #define CCXX_DIGEST_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #ifndef CCXX_EXCEPTION_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif /** * The digest base class is used for implementing and deriving one way * hashing functions. * * @author David Sugar * @short base class for hashing services. */ class __EXPORT Digest : protected std::streambuf, public std::ostream { protected: Digest(); /** * Get the size of a digest in octets. * * @return number of bytes in digest. */ virtual unsigned getSize(void) = 0; /** * Copy the binary digest buffer to user memory. * * @return number of bytes in digest. * @param buffer to write into. */ virtual unsigned getDigest(unsigned char *buffer) = 0; /** * Put data into the digest bypassing the stream subsystem. * * @param buffer to read from. * @param length of data. */ virtual void putDigest(const unsigned char *buffer, unsigned length) = 0; /** * print a digest string for export. * * @return string representation of digest. */ virtual std::ostream &strDigest(std::ostream &os) = 0; friend std::ostream &operator<<(std::ostream &os, Digest &ia) {return ia.strDigest(os);}; public: /** * Reset the digest table to an initial default value. */ virtual void initDigest(void) = 0; virtual ~Digest(); }; /** * A simple checksum digest function. * * @author David Sugar * @short checksum hash function. */ class __EXPORT ChecksumDigest : public Digest { private: unsigned char csum; protected: int overflow(int c); std::ostream &strDigest(std::ostream &os); public: ChecksumDigest(); void initDigest(void) {csum = 0;}; unsigned getSize(void) {return 1;}; unsigned getDigest(unsigned char *buffer); void putDigest(const unsigned char *buffer, unsigned length); }; /** * A crc16 collection/compution hash accumulator class. * * @author David Sugar * @short crc16 computation hash. */ class __EXPORT CRC16Digest : public Digest { private: uint16 crc16; protected: int overflow(int c); std::ostream &strDigest(std::ostream &os); public: CRC16Digest(); CRC16Digest ( const CRC16Digest &crc ); virtual ~CRC16Digest() {}; inline void initDigest(uint16 crc) {crc16 = crc;}; void initDigest(void) {initDigest(0);}; inline unsigned getSize ( void ) {return sizeof(crc16);}; CRC16Digest& operator= ( const CRC16Digest &right ); operator const uint16() const {return crc16;}; inline uint16 getDigest(void) {return crc16;}; unsigned getDigest ( unsigned char *buffer ); void putDigest ( const unsigned char *buffer, unsigned length ); }; /** * A crc32 collection/computation hash accumulator class. * * @author Kevin Kraatz * @short crc32 computation hash. */ class __EXPORT CRC32Digest : public Digest { private: uint32 crc_table[256]; uint32 crc_reg; uint32 crc32; protected: unsigned char overflow(unsigned char octet); std::ostream &strDigest(std::ostream &os); public: CRC32Digest(); CRC32Digest(const CRC32Digest &crc); void initDigest(void); inline unsigned getSize(void) {return sizeof(crc32);} operator const uint32() const {return crc32;}; inline uint32 getDigest(void) {return crc32;}; unsigned getDigest(unsigned char *buffer); void putDigest(const unsigned char *buffer, unsigned length); CRC32Digest& operator= (const CRC32Digest &right); }; /** * A md5 collection/computation accululator class. * * @author David Sugar * @short md5 hash accumulation. */ class __EXPORT MD5Digest : public Digest { private: unsigned long state[4]; unsigned long count[2]; unsigned char buf[64]; unsigned bpos; unsigned char md5[16]; bool updated; protected: int overflow(int c); void update(void); void commit(void); std::ostream &strDigest(std::ostream &os); public: MD5Digest(); void initDigest(void); inline unsigned getSize(void) {return 16;}; unsigned getDigest(unsigned char *buffer); void putDigest(const unsigned char *buffer, unsigned len); }; #ifdef COMMON_STD_EXCEPTION /** * DigestException * * Exception classes that pertain to errors when making or otherwise * working with digests. * * @author Elizabeth Barham * @short Exceptions involving digests. */ class __EXPORT DigestException : public Exception { public: DigestException(const String &str) : Exception(str) {}; }; #endif #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/missing.h0000644000175000017500000000644011463367513013642 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file missing.h * @short substitute functions which may be missing in target platform libc. **/ #ifndef CCXX_MISSING_H_ #define CCXX_MISSING_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_STRCHAR_H_ #include #endif #include #ifdef MACOSX #undef HAVE_LOCKF #endif #ifdef WIN32 #ifndef HAVE_LOCKF #define HAVE_LOCKF #endif #endif #include #include #include #ifdef HAVE_SSTREAM #include #else #include #endif #if defined(__KCC) #define ostream ostream_withassign #endif #ifdef __BORLANDC__ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif #ifndef HAVE_GETTIMEOFDAY #ifdef WIN32 #define HAVE_GETTIMEOFDAY __EXPORT int gettimeofday(struct timeval *tv_, void *tz_); #endif #endif #ifdef HAVE_GETTIMEOFDAY #ifdef WIN32 __EXPORT DWORD getTicks(void); #else __EXPORT unsigned long getTicks(void); #endif #endif #ifndef HAVE_MEMMOVE __EXPORT void *memmove(char *dest, const char *source, size_t length); #endif #ifndef HAVE_STRDUP __EXPORT char *strdup(const char *str); #endif #ifndef HAVE_LOCKF __EXPORT int lockf(int fd, int mode, long offset); #endif #ifndef HAVE_STRTOK_R inline char *strtok_r(char *s, const char *d, char **x) \ {return strtok(s, d);}; #endif #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/inc/cc++/objsync.h0000644000175000017500000000540511463370253013633 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. /** * @file objsync.h * @short Template for creating objects that share a global mutex. **/ #ifndef CCXX_OBJSYNC_H #define CCXX_OBJSYNC_H #include #ifdef CCXX_NAMESPACES namespace ost { #endif /** * Generic template to create objects of a common base type which share * a static mutex so that all instances of the class have a global lock. * * @author David Sugar * @short global mutex locked class. */ template class objSync { private: static ost::Mutex objMutex; protected: void objLock(void) {++objMutex;}; void objUnlock(void) {--objMutex;}; }; template ost::Mutex objSync::objMutex; #ifdef CCXX_NAMESPACES } // namespace #endif #endif commoncpp2-1.8.1/inc/cc++/misc.h0000644000175000017500000005476211463367463013142 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file misc.h * @short Memory management, configuration keydata objects and string * tokenizer. **/ #ifndef CCXX_MISC_H_ #define CCXX_MISC_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_THREAD_H_ #include #endif #define KEYDATA_INDEX_SIZE 97 #define KEYDATA_PAGER_SIZE 512 #if defined(PATH_MAX) #if PATH_MAX > 512 #define KEYDATA_PATH_SIZE 512 #else #define KEYDATA_PATH_SIZE PATH_MAX #endif #else #define KEYDATA_PATH_SIZE 256 #endif #ifdef CCXX_NAMESPACES namespace ost { #endif class __EXPORT Runlist; class __EXPORT Runable; /** * The memory pager is used to allocate cumulative memory pages for * storing object specific "persistant" data that is presumed to persist * during the life of a given derived object. When the object is * destroyed, all accumulated data is automatically purged. * * There are a number of odd and specialized utility classes found in Common * C++. The most common of these is the "MemPager" class. This is basically * a class to enable page-grouped "cumulative" memory allocation; all * accumulated allocations are dropped during the destructor. This class has * found it's way in a lot of other utility classes in Common C++. * * @author David Sugar * @short Accumulative object memory allocator. */ class __EXPORT MemPager { private: friend class String; friend class MemPagerObject; size_t pagesize; unsigned int pages; struct _page { struct _page *next; size_t used; } *page; protected: /** * Allocate first workspace from paged memory. This method * scans all currently allocated blocks for available space * before adding new pages and hence is both slower and more * efficient. * * @param size size of memory to allocate. * @return pointer to allocated memory. */ virtual void* first(size_t size); /** * Allocate memory from either the currently active page, or * allocate a new page for the object. * * @param size size of memory to allocate. * @return pointer to allocated memory. */ virtual void* alloc(size_t size); /** * Allocate a string from the memory pager pool and copy the * string into it's new memory area. This method allocates * memory by first searching for an available page, and then * allocating a new page if no space is found. * * @param str string to allocate and copy into paged memory pool. * @return copy of string from allocated memory. */ char* first(char *str); /** * Allocate a string from the memory pager pool and copy the * string inti it's new memory area. This checks only the * last active page for available space before allocating a * new page. * * @param str string to allocate and copy into paged memory pool. * @return copy of string from allocated memory. */ char* alloc(const char *str); /** * Create a paged memory pool for cumulative storage. This * pool allocates memory in fixed "pagesize" chunks. Ideal * performance is achived when the pool size matches the * system page size. This pool can only exist in derived * objects. * * @param pagesize page size to allocate chunks. */ MemPager(size_t pagesize = 4096); /** * purge the current memory pool. */ void purge(void); /** * Clean for memory cleanup before exiting. */ void clean(void); /** * Delete the memory pool and all allocated memory. */ virtual ~MemPager(); public: /** * Return the total number of pages that have been allocated * for this memory pool. * * @return number of pages allocated. */ inline int getPages(void) {return pages;}; }; /** * The StackPager provides a repository to stash and retrieve working * data in last-in-first-out order. The use of a mempager to support * it's operation allows storage of arbitrary sized objects with no * fixed limit. * * @author David Sugar * @short last in first out object pager. */ class __EXPORT StackPager : protected MemPager { private: typedef struct frame { struct frame *next; char data[1]; } frame_t; frame_t *stack; public: /** * Create a lifo pager as a mempager. * * @param pagesize for memory allocation */ StackPager(size_t pagesize); /** * Push an arbitrary object onto the stack. * * @return stack memory location. * @param object pointer to data * @param size of data. */ void *push(const void *object, size_t size); /** * Push a string onto the stack. * * @return stack memory location. * @param string pointer. */ void *push(const char *string); /** * Retrieve next object from stack. * * @return object. */ void *pull(void); /** * Purge the stack of all objects and memory allocations. */ void purge(void); }; /** * The shared mempager uses a mutex to protect key access methods. * This class is used when a mempager will be shared by multiple * threads. * * @author David Sugar * @short mutex protected memory pager. */ class __EXPORT SharedMemPager : public MemPager, public Mutex { protected: /** * Create a mempager mutex pool. * * @param pagesize page size for allocation. * @param name a name for the pool. */ SharedMemPager(size_t pagesize = 4096, const char *name = NULL); /** * Purge the memory pool while locked. */ void purge(void); /** * Get the first memory page after locking. * * @return allocated memory space. * @param size of request. */ void* first(size_t size); /** * Get the last memory page after locking. * * @return allocated memory space. * @param size of request. */ void* alloc(size_t size); }; __EXPORT void endKeydata(void); /** * Keydata objects are used to load and hold "configuration" data for * a given application. * * This class is used to load and then hold "keyword = value" pairs parsed from a text * based "config" file that has been divided into "[sections]". The syntax is: * *
 * [section_name]
 * key1=value1
 * key2=value2
* * Essentially, the "path" is a "keypath" into a theoretical namespace of key * pairs, hence one does not use "real" filepaths that may be OS dependent. The "/" path refers * to "/etc" prefixed (on UNIX) directories and this is processed within the constructor. It * could refer to the /config prefix on QNX, or even, gasp, a "C:\WINDOWS". Hence, a keypath of * "/bayonne.d/vmhost/smtp" actually resolves to a "/etc/bayonne.d/vmhost.conf" and loads key * value pairs from the [smtp] section of that .conf file. * * Similarly, something like "~bayonne/smtp" path refers to a "~/.bayonnerc" and loads key pairs * from the [smtp] section. This coercion occurs before the name is passed to the open call. * * I actually use derived keydata based classes as global initialized objects, and they hence * automatically load and parse config file entries even before "main" has started. * * Keydata can hold multiple values for the same key pair. This can * occur either from storing a "list" of data items in a config file, * or when overlaying multiple config sources (such as /etc/....conf and * ~/.confrc segments) into a single object. The keys are stored as * cumulative (read-only/replacable) config values under a hash index * system for quick retrieval. * * Keydata can * also load a table of "initialization" values for keyword pairs that were * not found in the external file. * * One typically derives an application specific keydata class to load a * specific portion of a known config file and initialize it's values. One * can then declare a global instance of these objects and have * configuration data initialized automatically as the executable is loaded. * * Hence, if I have a "[paths]" section in a "/etc/server.conf?" file, I might * define something like: * *
 * class KeyPaths : public Keydata
 * {
 *   public:
 *     KeyPaths() : Keydata("/server/paths")
 *     {
 *       static Keydata::Define *defvalues = {
 *    {"datafiles", "/var/server"},
 *    {NULL, NULL}};
 *
 *       // override with [paths] from "~/.serverrc" if avail.
 *
 *       load("~server/paths");
 *       load(defvalues);
 *     }
 * };
 *
 * KeyPaths keypaths;
 * 
* * @author David Sugar * @short load text configuration files into keyword pairs. */ class __EXPORT Keydata : protected MemPager { public: #ifdef CCXX_PACKED #pragma pack(1) #endif struct Keyval { Keyval *next; char val[1]; }; struct Keysym { Keysym *next; Keyval *data; const char **list; short count; char sym[1]; }; struct Define { const char *keyword; const char *value; }; #ifdef CCXX_PACKED #pragma pack() #endif private: static std::ifstream *cfgFile; static char lastpath[KEYDATA_PATH_SIZE + 1]; static int count; static int sequence; int link; Keysym *keys[KEYDATA_INDEX_SIZE]; /** * Compute a hash key signature id for a symbol name. * * @return key signature index path. * @param sym symbol name. */ unsigned getIndex(const char *sym); protected: Keysym* getSymbol(const char *sym, bool create); public: /** * Load additional key values into the currrent object from * the specfied config source (a config file/section pair). * These values will overlay the current keywords when matches * are found. This can be used typically in a derived config * object class constructor to first load a /etc section, and * then load a matching user specific entry from ~/. to override * default system values with user specific keyword values. * * @param keypath (filepath/section) */ void load(const char *keypath); /** * Load additional key values into the currrent object from * the specfied config source (a config file/section pair). * These values will overlay the current keywords when matches * are found. This can be used typically in a derived config * object class constructor to first load a /etc section, and * then load a matching user specific entry from ~/. to override * default system values with user specific keyword values. * This varient puts a prefix in front of the key name. * * @param prefix * @param keypath (filepath/section) */ void loadPrefix(const char *prefix, const char *keypath); /** * Load additional keys into the current object using a real * filename that is directly passed rather than a computed key * path. This also uses a [keys] section as passed to the object. * * @param filepath to load from * @param keys section to parse from, or NULL to parse from head * @param pre optional key prefix */ void loadFile(const char *filepath, const char *keys = NULL, const char *pre = NULL); /** * Load default keywords into the current object. This only * loads keyword entries which have not already been defined * to reduce memory usage. This form of Load is also commonly * used in the constructor of a derived Keydata class. * * @param pairs list of NULL terminated default keyword/value pairs. */ void load(Define *pairs); /** * Create an empty key data object. */ Keydata(); /** * Create a new key data object and use "Load" method to load an * initial config file section into it. * * @param keypath (filepath/section) * specifies the home path. */ Keydata(const char *keypath); /** * Alternate constructor can take a define list and an optional * pathfile to parse. * * @param pairs of keyword values from a define list * @param keypath of optional file and section to load from */ Keydata(Define *pairs, const char *keypath = NULL); /** * Destroy the keydata object and all allocated memory. This * may also clear the "cache" file stream if no other keydata * objects currently reference it. */ virtual ~Keydata(); /** * Unlink the keydata object from the cache file stream. This * should be used if you plan to keepa Keydata object after it * is loaded once all keydata objects have been loaded, otherwise * the cfgFile stream will remain open. You can also use * endKeydata(). */ void unlink(void); /** * Get a count of the number of data "values" that is associated * with a specific keyword. Each value is from an accumulation of * "load()" requests. * * @param sym keyword symbol name. * @return count of values associated with keyword. */ int getCount(const char *sym); /** * Get the first data value for a given keyword. This will * typically be the /etc set global default. * * @param sym keyword symbol name. * @return first set value for this symbol. */ const char* getFirst(const char *sym); /** * Get the last (most recently set) value for a given keyword. * This is typically the value actually used. * * @param sym keyword symbol name. * @return last set value for this symbol. */ const char* getLast(const char *sym); /** * Find if a given key exists. * * @param sym keyword to find. * @return true if exists. */ bool isKey(const char *sym); /** * Get a string value, with an optional default if missing. * * @param sym keyword name. * @param default if not present. * @return string value of key. */ const char *getString(const char *sym, const char *def = NULL); /** * Get a long value, with an optional default if missing. * * @param sym keyword name. * @param default if not present. * @return long value of key. */ long getLong(const char *sym, long def = 0); /** * Get a bool value. * * @param sym keyword name. * @return true or false. */ bool getBool(const char *key); /** * Get a floating value. * * @param sym keyword name. * @param default if not set. * @return value of key. */ double getDouble(const char *key, double def = 0.); /** * Get an index array of ALL keywords that are stored by the * current keydata object. * * @return number of keywords found. * @param data pointer of array to hold keyword strings. * @param max number of entries the array can hold. */ unsigned getIndex(char **data, unsigned max); /** * Get the count of keyword indexes that are actually available * so one can allocate a table to receive getIndex. * * @return number of keywords found. */ unsigned getCount(void); /** * Set (replace) the value of a given keyword. This new value * will become the value returned from getLast(), while the * prior value will still be stored and found from getList(). * * @param sym keyword name to set. * @param data string to store for the keyword. */ void setValue(const char *sym, const char *data); /** * Return a list of all values set for the given keyword * returned in order. * * @return list pointer of array holding all keyword values. * @param sym keyword name to fetch. */ const char * const* getList(const char *sym); /** * Clear all values associated with a given keyword. This does * not de-allocate the keyword from memory, however. * * @return keyword name to clear. */ void clrValue(const char *sym); /** * A convient notation for accessing the keydata as an associative * array of keyword/value pairs through the [] operator. */ inline const char *operator[](const char *keyword) {return getLast(keyword);}; /** * static member to end keydata i/o allocations. */ static void end(void); /** * Shutdown the file stream cache. This should be used before * detaching a deamon, exec(), fork(), etc. */ friend inline void endKeydata(void) {Keydata::end();}; }; /** * This class is used to create derived classes which are constructed * within a memory pager pool. * * @short create objects in a memory pager. * @author David Sugar */ class __EXPORT MemPagerObject { public: /** * Allocate memory from a memory pager. * * @param size of new passed from operator. * @param pager to allocate from. */ inline void *operator new(size_t size, MemPager &pager) {return pager.alloc(size);}; /** * Allocate array from a memory pager. * * @param size of new passed from operator. * @param pager to allocate from. */ inline void *operator new[](size_t size, MemPager &pager) {return pager.alloc(size);}; /** * Mempager delete does nothing; the pool purges. */ inline void operator delete(void *) {}; /** * Array mempager delete does nothing; the pool purges. */ inline void operator delete[](void *) {}; }; /** * This class is used to associate (object) pointers with named strings. * A virtual is used to allocate memory which can be overriden in the * derived class. * * @author David Sugar * @short associate names with pointers. */ class __EXPORT Assoc { private: struct entry { const char *id; entry *next; void *data; }; entry *entries[KEYDATA_INDEX_SIZE]; protected: Assoc(); virtual ~Assoc(); void clear(void); virtual void *getMemory(size_t size) = 0; public: void *getPointer(const char *id) const; void setPointer(const char *id, void *data); }; /** * A runlist is used to restrict concurrent exection to a limited set * of concurrent sessions, much like a semaphore. However, the runlist * differs in that it notifies objects when they become ready to run, * rather than requiring them to wait and "block" for the semaphore * count to become low enough to continue. * * @author David Sugar * @short list of runable objects. */ class __EXPORT Runlist : public Mutex { private: Runable *first, *last; protected: unsigned limit, used; void check(void); public: /** * Create a new runlist with a specified limit. * * @param count limit before wait queuing. */ Runlist(unsigned count = 1); /** * Add a runable object to this runlist. If the number of * entries running is below the limit, then add returns true * otherwise the entry is added to the list. * * @return true if immediately ready to run * @param run pointer to runable object. */ bool add(Runable *run); /** * Remove a runable object from the wait list or notify when * it is done running so that the used count can be decremented. * * @param run pointer to runable object. */ void del(Runable *run); /** * Set the limit. * * @param limit to use. */ void set(unsigned limit); }; /** * A container for objects that can be queued against a runlist. * * @author David Sugar * @short runable object with notify when ready. */ class __EXPORT Runable { private: friend class Runlist; Runlist *list; Runable *next, *prev; protected: Runable(); virtual ~Runable(); /** * Method handler that is invoked when a wait-listed object * becomes ready to run. */ virtual void ready(void) = 0; public: /** * Start the object against a run list. * * @return true if immediately available to run. * @param list to start under. */ bool starting(Runlist *list); /** * Stop the object, called when stopping or ready completes. * May also be used for a task that has not yet started to * remove it from the wait list. */ void stoping(void); }; #ifdef CCXX_NAMESPACES } #endif #endif /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/cc++/string.h0000644000175000017500000005745311463371156013507 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file string.h * @short Common C++ generic string class **/ #ifndef CCXX_STRING_H_ #define CCXX_STRING_H_ #ifndef CCXX_MISSING_H_ #include #endif #ifndef CCXX_STRCHAR_H_ #include #endif #ifdef CCXX_NAMESPACES namespace ost { #endif class MemPager; /** * This is a generic and portable string class. It uses optimized * memory allocation strategies to efficiently handle smaller string * content by grouping strings into 32 byte aligned slots that can * be re-allocated from a free list directly. * * While meant to cover the basic functionality of the ANSI C++ * string class in form and function, this class offers some important * enhancements, including the ability to derive class type specific * versions of itself. The latter might be used to derive a unicode * string, a string for data and time data types, or to add case * insensitive comparisons, for example. * * @author David Sugar * @short Generic string class. */ class __EXPORT String { protected: static const unsigned minsize; static const unsigned slotsize; static const unsigned pagesize; static const unsigned slotlimit; static const unsigned slotcount; friend class StringObject; private: friend class MemPager; static MemPager *pager; static char **idx; #ifdef CCXX_PACKED #pragma pack(1) #endif union { struct { char *text; size_t size; size_t length; } bigstring; struct { char text[(sizeof(char *) + (sizeof(size_t) * 2) + 1)]; char length : 6; bool big : 1; } ministring; } content; #ifdef CCXX_PACKED #pragma pack() #endif protected: /** * Determine if string is allocated in local variable or an * external reference. * * @return true if external heap is used. */ inline bool isBig(void) const {return content.ministring.big;}; /** * Set the content of the string variable to the specified * string value, and use smart re-allocation strategies if * appropriate to shrink the size of the variable. * * @param str string to set. * @param len length of string if passed. */ const char *set(const char *str, size_t len = 0); /** * Set the content of the string variable to that of another * variable. Uses the string set method. * * @param str string to copy from. */ void set(const String &str); #ifdef HAVE_SNPRINTF /** * Set the content of the string variable to that of a * formatted printf style string. * * @param size of string data to set. * @param format of string to write into object. */ const char *set(size_t size, const char *format, ...); #endif /** * Impliment the copy constructor, used internally. Will always * create a minimum sized string allocation. * * @param str string to copy from. */ void copy(const String &str); /** * Used to initialize a string object. */ void init(void); /** * Used to fetch memory, if needed, based on the size, from the * pager, or the system heap. * * @return string pointer to space. * @param size of space needed. */ static char *getSpace(size_t size); /** * Set the size of allocated space in the string variable * (capacity) to a known value. The value is recomputed and * adjusted based on allocation method. * * @param size in bytes. */ size_t setSize(size_t size); /** * Set the length value of the string content. * * @param len size in bytes. */ void setLength(size_t len); /** * A derivable low level comparison operator. This can be used * to create custom comparison data types in derived string * classes. * * @return 0 if match, or value for ordering. * @param text text to compare. * @param len length of text to compare. * @param index offset from start of string, used in searchs. */ virtual int compare(const char *text, size_t len = 0, size_t index = 0) const; /** * An internal method used to search for a substring starting at * a known offset. Used by find and count methods. * * @return npos if fails, or offset to text found. * @param text text to search for. * @param clen length of search text. * @param offset offset to start from. */ size_t search(const char *text, size_t clen = 0, size_t offset = 0) const; public: static const size_t npos; typedef size_t size_type; /** * Construct an empty string. */ String(); /** * Copy constructor. * * @param original string to copy from. */ String(const String &original); /** * Create a string from a cstring. * * @param str text to set with. */ String(const char *str); /** * Create a String from std::string. * * @param string from std::string to copy from. */ String(std::string string); /** * Create a new string from a subset of another string. * * @param str reference of source string. * @param offset offset to start of data in prior string. * @param len length of our substring. */ String(const String &str, size_t offset, size_t len = npos); #ifdef HAVE_SNPRINTF /** * Create a string from formatted text input. * * @param size to allocate for our new string. * @param format of data to input. */ String(size_t size, const char *format, ...); #else /** * Create a string of a known size, and optionally fill with * content. * * @param count size to allocate for our new string. * @param str content to put into it. */ String(size_t count, const char *str); #endif /** * Fill a new string with character data. * * @param count size of new string. * @param fill char to fill string with. */ String(size_t count, const char fill = ' '); /** * Destroy the string... */ virtual ~String(); /** * Get a string pointer to string content based on an indexed * offset. A NULL is returned if the index is outsize of range. * * @return string content or NULL if invalid index. * @param index */ const char *getIndex(size_t index) const; /** * Get the text of a string. * * @return string content. */ char *getText(void) const; /** * Get the value of a string. * * @return string value as number. */ long getValue(long defvalue = 0l) const; /** * Get the bool flag of a string. * * @return boolean value. */ bool getBool(bool defbool = false) const; /** * Get the assigned length of string. * * @return string length. */ const size_t getLength(void) const; /** * Get the allocation size of the string variable. * * @return allocation size. */ const size_t getSize(void) const; /** * Return true if string is empty. * * @return true if string is empty string. */ bool isEmpty(void) const; /** * Re-allocate buffer space for string. * * @param size new size to use. */ void resize(size_t size); /** * Clear the contents of the entire string. */ void clear(void); /** * Return a character at a known offset. * * @return character at offset. */ char at(ssize_t offset) const; /** * Count the number of occurences of a specific string within * our string. * * @return count of instances. * @param s string to test. * @param offset offset to start from. */ unsigned count(const String &s, size_t offset = 0) const; /** * Count the number of occurrences of a specific text pattern * within our string. * * @return count of instances. * @param s text pattern to find * @param offset offset to start from. * @param len length of text pattern if specified. */ unsigned count(const char *s, size_t offset = 0, size_t len = 0) const; /** * Extract a new string as a token from the current string. * * @return string containing token. * @param delim deliminator characters. * @param offset offset to start from. */ String token(const char *delim = " \t\n\r", size_t offset = 0); /** * Find the index to the nth instance of a substring in our string. * * @return index of found substring. * @param s string to search for. * @param offset offset to start at. * @param instance instance to look for. */ size_t find(const String &s, size_t offset = 0, unsigned instance = 1) const; /** * Find last occurence of a substring in our string. * * @return index of last instance found, * @param s string to search for. * @param offset offset to start from. */ size_t rfind(const String &s, size_t offset = 0) const; /** * Find the index to the nth instance of text in our string. * * @return index of found substring. * @param s string to search for. * @param offset offset to start at. * @param len size of string text. * @param count instance to look for. */ size_t find(const char *s, size_t offset = 0, size_t len = 0, unsigned count = 1) const; /** * Find last occurence of a text in our string. * * @return index of last instance found, * @param s string to search for. * @param offset offset to start from. * @param len size of string to look for. */ size_t rfind(const char *s, size_t offset = 0, size_t len = 0) const; /** * Trim trailing characters from a string. * * @param cs list of chars to trim. */ inline void trim(const char *cs) {setLength(strtrim(cs, getText(), getLength()));}; /** * Chop leading characters from a string. * * @param cs list of chars to chop. */ inline void chop(const char *cs) {setLength(strchop(cs, getText(), getLength()));}; /** * Strip lead and trailing characters from a string. * * @param cs list of chars to strip. */ void strip(const char *cs); /** * Chop n leading characters from a string. * * @param chars count to chop. */ inline void chop(size_t chars) {erase(0, chars);}; /** * Trim n trailing characters from a string. * * @param count number of bytes to trim. */ void trim(size_t count); /** * Erase a portion of string. * * @param start starting index to erase from. * @param len number of characters to erase. */ void erase(size_t start, size_t len = npos); /** * Insert text into a string. * * @param start starting offset to insert at. * @param text text to insert. * @param len size of text to insert. */ void insert(size_t start, const char *text, size_t len = 0); /** * Insert other string into our string. * * @param start string offset to insert at. * @param str string to insert. */ void insert(size_t start, const String &str); /** * Replace text at a specific position in the string with new * text. * * @param start starting offset to replace at. * @param len length of text to remove. * @param text text to replace with. * @param count size of replacement text. */ void replace(size_t start, size_t len, const char *text, size_t count = 0); /** * Replace text at a specific position in the string with new * string, * * @param start starting offset to replace at. * @param len length of text to remove. * @param string reference to replace with. */ void replace(size_t start, size_t len, const String &string); /** * A more convenient version of find for nth occurences, by * putting the instance first. * * @param instance nth instance to look for. * @param text text to look for. * @param offset offset to start at. * @param len length of text. */ inline size_t find(unsigned instance, const char *text, size_t offset = 0, size_t len = 0) const {return find(text, offset, len, instance);}; /** * A more convenient version of find for nth occurences, by * putting the instance first. * * @param instance nth instance to look for. * @param string reference to look for. * @param offset offset to start at. */ inline size_t find(unsigned instance, const String &string, size_t offset = 0) const {return find(string, offset, instance);}; /** * Return a new string that contains a specific substring of the * current string. * * @return new string. * @param start starting offset for extracted substring. * @param len length of substring. */ inline String substr(size_t start, size_t len) const {return String(*this, start, len);}; /** * Return an indexed string based on the index, such as from a * find. If out of range, a NULL string is returned. * * @return pointer to string data from our string, * @param ind index or offset to use. */ inline const char *(index)(size_t ind) const {return getIndex(ind);}; /** * Reduce the size of the string allocation to the minimum * needed based on the current effective length. */ inline void compact(void) {resize(getLength() + 1);}; /** * Old ANSI C++ compatible string pointer extraction. * * @return string data. */ inline char *c_str(void) const {return getText();}; /** * Get our string data through dereference operator. * * @return string data. */ inline operator char *() const {return getText();}; /** * Logical test for string empty. * * @return true if is empty. */ inline bool operator!(void) const {return isEmpty();}; /** * Alternate get text method. * * @return string data. */ inline char *text(void) const {return getText();}; /** * Alternate get text method. * * @return string data. */ inline char *data(void) const {return getText();}; /** * Get length as if null terminated string. * * @return cstring length. */ inline size_t length(void) const {return strlen(getText());}; /** * Get actual length of string data. * * @return actual size of string. */ inline size_t size(void) const {return getLength();}; /** * Get space allocated to hold current string. * * @return space of memory buffer from heap or local. */ inline size_t capacity(void) const {return getSize();}; /** * Return true if string is empty. */ bool empty(void) const {return isEmpty();}; /** * Append text to the end of the current string. * * @param str text to append. * @param count size of text to append. */ void append(const char *str, size_t count = 0); #ifdef HAVE_SNPRINTF /** * Append formatted text to the end of the current string. * * @param size size of text to append. * @param format of data to append. */ void append(size_t size, const char *format, ...); #endif /** * Append text into the current string. * * @param str text to append. * @param offset offset to overlay. * @param count size of text to append. */ void append(const char *str, size_t offset, size_t count); /** * Add a character to the end of a string. * * @param c char to add. */ void add(char c); /** * Append string to the end of the current string. * * @param str string to append. */ void append(const String &str); /** * Extract a character by array indexing. * * @return character code. */ inline const char operator[](unsigned ind) const {return at(ind);}; /** * Assign our string for c string. */ inline const char *operator =(const char *str) {return set(str);}; /** * Add two strings and return a temporary object. */ friend __EXPORT String operator+(const String &s1, const String &s2); friend __EXPORT String operator+(const String &s1, const char *s2); friend __EXPORT String operator+(const char *s1, const String &s2); friend __EXPORT String operator+(const String &s1, const char c2); friend __EXPORT String operator+(const char c1, const String &s2); /** * Append operator. */ inline String &operator+=(const String &str) {append(str); return *this;}; /** * Append operator. */ inline String &operator+=(char c) {add(c); return *this;}; /** * Append operator. */ inline String &operator+=(const char *str) {append(str); return *this;}; /** * Append operator. */ inline String &operator+=(const std::string &str) {append(str.c_str()); return *this;}; /** * Fetch input from a std::istream into the current string * variable until either the string variable is filled (based on * current length) or the deliminator is read. * * @param is stream to read. * @param str string to save into. * @param delim deliminator to use. * @param size optional size limitor. */ friend __EXPORT std::istream &getline(std::istream &is, String &str, char delim = '\n', size_t size = 0); /** * Stream the content of our string variable directly to a C++ * streaming source. */ friend __EXPORT std::ostream &operator<<(std::ostream &os, const String &str); /** * Stream input into our variable. */ inline friend std::istream &operator>>(std::istream &is, String &str) {return getline(is, str);}; #ifdef HAVE_SNPRINTF /** * Print values directly into a string variable. * * @return character count. * @param str object reference to use. * @param size of string required. * @param format of data. */ friend __EXPORT int strprintf(String &str, size_t size, const char *format, ...); #endif bool operator<(const String &str) const; bool operator<(const char *str) const; bool operator>(const String &str) const; bool operator>(const char *str) const; bool operator<=(const String &str) const; bool operator<=(const char *str) const; bool operator>=(const String &str) const; bool operator>=(const char *str) const; bool operator==(const String &str) const; bool operator==(const char *str) const; bool operator!=(const String &str) const; bool operator!=(const char *str) const; #ifdef HAVE_SNPRINTF /** * Append operator */ inline String &operator+=(int i) {append(16, "%d", i); return *this;}; inline String &operator+=(unsigned int i) {append(16, "%u", i); return *this;}; inline String &operator+=(long l) {append(16, "%l", l); return *this;}; inline String &operator+=(unsigned long l) {append(16, "%ul", l); return *this;}; inline String &operator+=(float f) {append(32, "%f", f); return *this;}; inline String &operator+=(double d) {append(32, "%f", d); return *this;}; inline String &operator+=(short s) {append(8, "%hd", s); return *this;}; inline String &operator+=(unsigned short s) {append(8, "%hu", s); return *this;}; /** * Assignment operator. */ inline String &operator=(int i) {set(16, "%d", i); return *this;}; inline String &operator=(unsigned int i) {set(16, "%u", i); return *this;}; inline String &operator=(long l) {set(16, "%l", l); return *this;}; inline String &operator=(unsigned long l) {set(16, "%ul", l); return *this;}; inline String &operator=(float f) {set(32, "%f", f); return *this;}; inline String &operator=(double d) {set(32, "%f", d); return *this;}; inline String &operator=(short s) {set(8, "%hd", s); return *this;}; inline String &operator=(unsigned short s) {set(8, "%hu", s); return *this;}; #endif inline String &operator=(const String &original) {copy(original); return *this;}; /** * Test if string is contained in our string. */ bool operator*=(const String &str) const; /** * Test if text is contained in our string. */ bool operator*=(const char *str) const; }; class __EXPORT SString : public String, protected std::streambuf, public std::ostream { protected: /** * This is the streambuf function that actually outputs the data * to the string. Since all output should be done with the standard * ostream operators, this function should never be called directly. */ int overflow(int c); public: /** * Create an empty streamable string ready for input. */ SString(); /** * Copy constructor */ SString(const SString &from); /** * Cancel out the object. */ ~SString(); }; /** * The StringObject class is used to derive subclasses that use the * String managed memory pool for all space allocations by overriding * new and delete operators. Due to size limits, StringObject should * not hold very large objects. * * @author David Sugar * @short Objects managed in reusable String memory pools */ class __EXPORT StringObject { public: /** * Create a new object in string managed space. */ void *operator new(size_t size) NEW_THROWS; /** * Delete object from string managed space. */ void operator delete(void *obj); }; #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/inc/cc++/objmap.h0000644000175000017500000000752311463370063013436 00000000000000// Copyright (C) 2001-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. /** * @file objmap.h * @short Template for creating hash indexed objects. **/ #ifndef CCXX_OBJMAP_H #define CCXX_OBJMAP_H #include #ifdef CCXX_NAMESPACES namespace ost { #endif /** * Used to create and manage a hash index of objects through a common * type. The objects can be examined and a specific instance located * by a hash key. * * @author David Sugar * @short hash indexed searchable template chain. */ template class objMap { protected: static T *objIndex[S]; T* objNext; const K objKey; virtual unsigned keyIndex(K k) { unsigned idx = 0; unsigned char *p = (unsigned char *)&k; unsigned len = sizeof(K); while(len--) { idx ^= (idx << 1) ^ *p; ++p; } return idx % S; } inline unsigned getSize(void) {return S;} objMap(const K key) { unsigned idx = keyIndex(key); objKey = key; objNext = objIndex[idx]; objIndex[idx] = (T *)this; } public: static T *getObject(keystring key); }; template class keyMap : public objMap { keyMap(keystring key) : objMap(key) {}; unsigned keyIndex(keystring k) { unsigned idx = 0; while(*k) { idx = (idx << 1) ^ (unsigned)*k; ++k; } return idx % S; } }; template T *objMap::objIndex[S](0); template T *objMap::getObject(const keystring key) { T *obj = objIndex[keyIndex(key)]; while(obj) { if(key == obj->objKey) break; obj = obj->objNext; } return obj; } #ifdef CCXX_NAMESPACES } // namespace #endif #endif commoncpp2-1.8.1/inc/cc++/oststring.h0000644000175000017500000000546111463370363014224 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #ifndef CCXX_OSTSTRING_H #define CCXX_OSTSTRING_H #include #ifdef CCXX_NAMESPACES namespace ost { #endif template struct cistring_char_traits : public std::string_char_traits { static bool eq(char c1, char c2) {return toupper(c1) == toupper(c2);}; static bool ne(char c1, char c2) {return toupper(c1) != toupper(c2);}; static bool lt(char c1, char c2) {return toupper(c1) < toupper(c2);}; static int compare(const char *s1, const char *s2, size_t n) {return strnicmp(s1, s2, n);}; }; typedef std::string_char_traits cstring_char_traits; typedef std::basic_string cstring; typedef std::basic_string > cistring; #ifdef CCXX_NAMESPACES } // namespace #endif #endif commoncpp2-1.8.1/inc/cc++/strchar.h0000644000175000017500000001241511463371123013626 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file strchar.h * @short Common and portable character string related functions. **/ #ifndef CCXX_STRCHAR_H_ #define CCXX_STRCHAR_H_ #ifndef CCXX_CONFIG_H_ #include #endif #ifndef CCXX_MISSING_H_ #include #endif #include #include #include #ifdef HAVE_STRINGS_H extern "C" { #include } #endif #ifdef HAVE_STRCASECMP #ifndef stricmp #define stricmp(x, y) strcasecmp(x, y) #endif #ifndef strnicmp #define strnicmp(x, y, n) strncasecmp(x, y, n) #endif #endif #ifdef CCXX_NAMESPACES namespace ost { #endif __EXPORT char *lsetField(char *target, size_t size, const char *src, const char fill = 0); __EXPORT char *rsetField(char *target, size_t size, const char *src, const char fill = 0); __EXPORT char *setString(char *target, size_t size, const char *src); __EXPORT char *addString(char *target, size_t size, const char *src); __EXPORT char *newString(const char *src, size_t size = 0); __EXPORT void delString(char *str); __EXPORT char *setUpper(char *string, size_t size); __EXPORT char *setLower(char *string, size_t size); __EXPORT char *find(const char *cs, char *str, size_t len = 0); __EXPORT char *rfind(const char *cs, char *str, size_t len = 0); __EXPORT char *ifind(const char *cs, char *str, size_t len = 0); __EXPORT char *strip(const char *cs, char *str, size_t len = 0); __EXPORT size_t strchop(const char *cs, char *str, size_t len = 0); __EXPORT size_t strtrim(const char *cs, char *str, size_t len = 0); inline char *dupString(const char *src, size_t size = 0) {return newString(src, size);} /* class keystring { private: const char *c_str; public: inline keystring(const char *s) {c_str = s;} inline keystring() {c_str = NULL;}; virtual int compare(const char *s2) {return stricmp(c_str, s2);}; inline const char *operator =(const char *s) {return c_str = s;}; friend inline int operator==(keystring k1, keystring k2) {return (k1.compare(k2) == 0);}; friend inline int operator==(keystring k1, const char *c) {return (k1.compare(c) == 0);}; friend inline int operator!=(keystring k1, const char *c) {return (k1.compare(c) != 0);}; friend inline int operator==(const char *c, keystring k1) {return (k1.compare(c) == 0);}; friend inline int operator!=(const char *c, keystring k1) {return (k1.compare(c) != 0);}; friend inline int operator!=(keystring k1, keystring k2) {return (k1.compare(k2) != 0);}; friend inline int operator<(keystring k1, keystring k2) {return (k1.compare(k2) < 0);}; friend inline int operator>(keystring k1, keystring k2) {return (k1.compare(k2) > 0);}; friend inline int operator<=(keystring k1, keystring k2) {return (k1.compare(k2) <= 0);}; friend inline int operator>=(keystring k1, keystring k2) {return (k1.compare(k2) >= 0);}; friend inline int operator!(keystring k1) {return k1.c_str == NULL;}; friend inline int length(keystring k1) {return static_cast(strlen(k1.c_str));}; friend inline const char *text(keystring k1) {return k1.c_str;}; inline const char *operator ()() {return c_str;}; inline operator const char *() {return c_str;}; }; */ #ifdef CCXX_NAMESPACES } #endif #endif commoncpp2-1.8.1/inc/cc++/common.h0000644000175000017500000000655511463366465013475 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2010 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception, you may use this file as part of a free software // library without restriction. Specifically, if other files instantiate // templates or use macros or inline functions from this file, or you compile // this file and link it with other files to produce an executable, this // file does not by itself cause the resulting executable to be covered by // the GNU General Public License. This exception does not however // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. // // This exception applies only to the code released under the name GNU // Common C++. If you copy code from other releases into a copy of GNU // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for GNU Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. // /** * @file common.h * @short GNU Common C++ global header. **/ #ifndef CCXX_COMMON_H_ #define CCXX_COMMON_H_ #include #ifdef CCXX_EXPORT_LIBRARY #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif /** * @mainpage GNU Common C++ Reference Manual **/ /** * @example urlfetch.cpp **/ /** * @example xmlfetch.cpp **/ /** * @example slogTest.cpp **/ /** * @example tcp.cpp **/ /** * @example tcpthread.cpp **/ /** * @example tcpservice.cpp **/ /** * @example SampleSocketPort.cpp **/ /** * @example serialmain.cpp **/ /** * @example serialecho.cpp **/ /** * @example cmdlineopt.cpp **/ /** * @example crc32.cpp **/ /** * @example bug1.cpp **/ /** * @example bug2.cpp **/ /** * @example digest.cpp **/ /** * @example thread1.cpp **/ /** * @example thread2.cpp **/ /** * @example tcpstr1.cpp **/ /** * @example url1.cpp **/ /** EMACS ** * Local variables: * mode: c++ * c-basic-offset: 4 * End: */ commoncpp2-1.8.1/inc/Makefile.am0000644000175000017500000000120711463365524013335 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. AUTOMAKE_OPTIONS = no-dependencies dist-shar dist-zip SUBDIRS = cc++ MAINTAINERCLEANFILES = Makefile.in config.h.in commoncpp2-1.8.1/inc/Makefile.in0000644000175000017500000004552511463364513013356 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = inc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = depcomp = am__depfiles_maybe = 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 ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = no-dependencies dist-shar dist-zip SUBDIRS = cc++ MAINTAINERCLEANFILES = Makefile.in config.h.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu inc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu inc/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile 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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 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) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: commoncpp2-1.8.1/aclocal.m40000644000175000017500000011130611463364511012365 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])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 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_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # 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 m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/ost_cxx.m4]) m4_include([m4/ost_debug.m4]) m4_include([m4/ost_dynamic.m4]) m4_include([m4/ost_endian.m4]) m4_include([m4/ost_getopt.m4]) m4_include([m4/ost_maint.m4]) m4_include([m4/ost_misc.m4]) m4_include([m4/ost_poll.m4]) m4_include([m4/ost_posix.m4]) m4_include([m4/ost_prog.m4]) m4_include([m4/ost_pthread.m4]) m4_include([m4/ost_reentrant.m4]) m4_include([m4/ost_signal.m4]) m4_include([m4/ost_socket.m4]) m4_include([m4/ost_ssl.m4]) m4_include([m4/ost_stlport.m4]) m4_include([m4/ost_string.m4]) m4_include([m4/ost_systime.m4]) m4_include([m4/ost_types.m4]) m4_include([m4/ost_win32.m4]) m4_include([m4/win32msc.m4]) commoncpp2-1.8.1/Makefile.am0000644000175000017500000000214711463355346012571 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. AUTOMAKE_OPTIONS = no-dependencies dist-shar dist-zip ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = autogen.sh TODO commoncpp2.spec commoncpp2.spec.in \ commoncpp2.list.in commoncpp2.lsm.in autoconf/* \ commoncpp2.list COPYING.addendum INSTALL.w32 SUPPORT MAINTAINERCLEANFILES = configure aclocal.m4 libtool Makefile.in Makefile \ config/* commoncpp2.list CommonC++.spec INSTALL DIST_SUBDIRS = src w32 m4 doc demo tests inc if WIN32 SUBDIRS = inc src doc else if MSWIN32 SUBDIRS = inc w32 doc else SUBDIRS = inc src doc endif endif macosx: (cd src ; make macosx) darwin: (cd src ; make macosx) commoncpp2-1.8.1/AUTHORS0000644000175000017500000000220411463314527011573 00000000000000Authors of Common C++. See also the files THANKS and ChangeLog. David Sugar originally designed and implemented APE. Daniel Silverstone designed original Common C++ classes (persistence engine, math libs, etc...) Sean Cavanaugh contributed the AtomicCounter class. Gianni Mariani contributed poll support for port and tcpservice.cpp demo app. Henner Zeller contributed many recent enhancements, some new classes, and fixed the win32 build process. John Connors has contributed many recent improvements for the win32 source tree. Eric Schendel recent improvements on the serial I/O classes along with some similar enhancements on the socket classes. Gary Lawrence contributed a serial I/O example. Robert Prouse contributed to the updating of the win32 source tree and production of merged win32/posix sources for sockets. Frediano Ziglio has provided help with the win32 target and with the development and testing for GNU Common C++ "2". Angelo Naselli as contributor and for bug fixing Leandro Melo de Sales as contributor for DCCP socket support commoncpp2-1.8.1/README0000644000175000017500000000513011463314527011404 00000000000000This directory contains the initial testing release of GNU Common C++ "2" 1.1. This release is provided for testing and development and in many ways represents a significient refinement of the prior GNU Common C++ "2" (1.0.x) releases. Few functional class changes in behavior exist in 1.1 vs 1.0. However, many classes have been cleaned up to use const correctly, and this may impact other people's code not written with this consideration. Many bugs were found and fixed between 1.0.13 and 1.1, and this alone represents a worthwhile change for testing. It is believed 1.1 is actually cleaner and more stable than 1.0 at this time. One important change in 1.1 is the new ost "String" class. This is meant to be a smart and thread-aware string class that is capable of re-allocating existing memory where possible rather than always allocating through the heap. The idea here was to improve performance as well as address other threading issues overlooked in std::string. All classes in 1.1 are implimented for both w32 and posix targets and behavior should be more consistent for porting code. In the 1.0 releases there were a number of classes which were never implimented for w32 native builds, such as MappedFiles, etc. Many classes have been expanded. This is especially true of the Dir and File classes, which now have many more member functions and greater usability, as well as the Process class. An overview document formatted in texinfo is provided which provides a good overview and summary of GNU Common C++ usage, features, and functions. Extensive class-by-class functional documentation is also provided in browsable form in the "doc" directory. This documentation will be automatically generated for you during "make" if you have doxygen already installed. GNU Common C++ is normally built and installed as a set of shared object libraries and header files. These libraries and headers are installed using directories selected through a "configure" script that has been prepared with automake and autoconf. As such, they should build and install similarly to and in a manner compatible and consistent with most other GNU software. GNU Common C++ is free software licensed under the terms of the GNU Public License. See the file COPYING.TXT for copying conditions. Please also note that additional priviledges currenly apply to the use of Common C++ as noted in each and every source file. These privileges are similar to the terms Guile is licensed under and constitute priviliges similar to the LGPL. Any comments, questions, patches, and/or bug reports should be sent to "bug-commoncpp@gnu.org". commoncpp2-1.8.1/Makefile.in0000644000175000017500000006272711463364513012610 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/commoncpp2.list.in \ $(srcdir)/commoncpp2.spec.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ THANKS TODO autoconf/config.guess autoconf/config.sub \ autoconf/depcomp autoconf/install-sh autoconf/ltmain.sh \ autoconf/missing autoconf/texinfo.tex ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = commoncpp2.spec commoncpp2.list CONFIG_CLEAN_VPATH_FILES = depcomp = am__depfiles_maybe = 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 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 $(distdir).shar.gz $(distdir).zip GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = no-dependencies dist-shar dist-zip ACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = autogen.sh TODO commoncpp2.spec commoncpp2.spec.in \ commoncpp2.list.in commoncpp2.lsm.in autoconf/* \ commoncpp2.list COPYING.addendum INSTALL.w32 SUPPORT MAINTAINERCLEANFILES = configure aclocal.m4 libtool Makefile.in Makefile \ config/* commoncpp2.list CommonC++.spec INSTALL DIST_SUBDIRS = src w32 m4 doc demo tests inc @MSWIN32_FALSE@@WIN32_FALSE@SUBDIRS = inc src doc @MSWIN32_TRUE@@WIN32_FALSE@SUBDIRS = inc w32 doc @WIN32_TRUE@SUBDIRS = inc src doc all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 commoncpp2.spec: $(top_builddir)/config.status $(srcdir)/commoncpp2.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ commoncpp2.list: $(top_builddir)/config.status $(srcdir)/commoncpp2.list.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # 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 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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 macosx: (cd src ; make macosx) darwin: (cd src ; make macosx) # 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: commoncpp2-1.8.1/autogen.sh0000755000175000017500000000474111463354720012533 00000000000000#!/bin/sh # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. WANT_AUTOCONF_2_5=1 export WANT_AUTOCONF_2_5 rm -rf autoconf auto*.cache libtool if test ! -d autoconf ; then mkdir autoconf ; fi libtoolize="libtoolize" for lt in glibtoolize libtoolize15 libtoolize14 libtoolize13 ; do if test -x /usr/bin/$lt ; then libtoolize=$lt ; break fi if test -x /usr/local/bin/$lt ; then libtoolize=$lt ; break fi done $libtoolize --copy --force AUTOMAKE_FLAGS="" case $libtoolize in *glibtoolize) AUTOMAKE_FLAGS="-i" ;; esac ACLOCALDIRS="" if test -d m4 ; then ACLOCALDIRS="-I m4" ; fi if test ! -z "$ACLOCAL" ; then ACLOCALDIRS="$ACLOCALDIRS -I"${ACLOCAL} elif test ! -z "$ACLOCAL_FLAGS" ; then ACLOCALDIRS="$ACLOCALDIRS $ACLOCAL_FLAGS" ; fi reconf="" if test -f ~/.configure ; then reconf=`grep ^reconfig: ~/.configure | sed -e s/^reconfig://` elif test -f /etc/configure.conf ; then reconf=`grep ^reconfig: /etc/configure.conf | sed -e s/^reconfig://` ; fi if test ! -z "$reconf" ; then ACLOCALDIRS="$ACLOCALDIRS $reconf" ; fi if [ -d ~/share/aclocal ] ; then ACLOCALDIRS="$ACLOCALDIRS -I ~/share/aclocal" elif [ -d /usr/local/share/aclocal ] ; then ACLOCALDIRS="$ACLOCALDIRS -I /usr/local/share/aclocal" fi if test ! -z "$1" -o ! -z "${AUTOCONF_SUFFIX}" ; then ver="$1" else for v in 2.53 2.57 ; do if test -f /usr/bin/autoconf-$v ; then ver=$v fi done fi if test "$ver" = "2.53" -a -z "$AUTOMAKE_SUFFIX" ; then if test -f /usr/bin/automake-1.5 ; then AUTOMAKE_SUFFIX="-1.5" fi fi aclocal${AUTOMAKE_SUFFIX} $ACLOCALDIRS if test -f /usr/bin/autoheader-$ver ; then /usr/bin/autoheader-$ver else autoheader${AUTOCONF_SUFFIX} fi automake${AUTOMAKE_SUFFIX} --add-missing --copy ${AUTOMAKE_FLAGS} if test -f /usr/bin/autoconf-$ver ; then /usr/bin/autoconf-$ver else autoconf${AUTOCONF_SUFFIX} fi rm -f config.cache # fix for some broken... if test -f /usr/bin/automake-1.4 ; then if test -f ltmain.sh ; then cp ltmain.sh autoconf/ltmain.sh fi fi commoncpp2-1.8.1/m4/0000755000175000017500000000000011463572774011137 500000000000000commoncpp2-1.8.1/m4/ost_systime.m40000644000175000017500000000255711463364256013706 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CC_SYSTIME],[ AC_HEADER_TIME AC_CHECK_HEADERS(sys/time.h) AH_TOP([ #undef HAVE_SYS_TIME_H #undef TIME_WITH_SYS_TIME #if TIME_WITH_SYS_TIME #include #else #if HAVE_SYS_TIME_H #include #endif #endif ]) ]) commoncpp2-1.8.1/m4/ost_dynamic.m40000644000175000017500000000364111463357175013632 00000000000000dnl Copyright (C) 1999-2001 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CC_DYNAMIC],[ DYN_LOADER='' ost_cv_dynloader=no AC_REQUIRE([OST_SYS_POSIX]) AC_CHECK_HEADERS(dlfcn.h) AC_CHECK_LIB(dld, shl_load, [DYN_LOADER=-ldld, AC_DEFINE(HAVE_SHL_LOAD, [1], [have shload plugins])]) AC_CHECK_LIB(dl, dlopen, [DYN_LOADER=-ldl]) if test ! -z "$DYN_LOADER" ; then ost_cv_dynloader=yes AC_DEFINE(HAVE_MODULES, [1], [support for plugin modules]) else AC_CHECK_LIB(c, dlopen, [ ost_cv_dynloader=yes AC_DEFINE(HAVE_MODULES, [1]) ],[ AC_CHECK_HEADERS(mach-o/dyld.h,[ ost_cv_dynloader=yes AC_DEFINE(HAVE_MODULES, [1]) AC_DEFINE(HAVE_MACH_DYLD, [1], [mach dybloader]) ]) ]) fi AC_SUBST(DYN_LOADER) ]) commoncpp2-1.8.1/m4/ost_poll.m40000644000175000017500000000270011463360067013141 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_LIB_POLL],[ AC_REQUIRE([OST_CC_SYSTIME]) AC_CHECK_HEADERS(poll.h sys/poll.h sys/stream.h) AC_CHECK_FUNCS(poll) AH_BOTTOM([ #ifdef HAVE_POLL_H #include #else #ifdef HAVE_SYS_POLL_H #include #endif #endif #if defined(HAVE_POLL) && defined(POLLRDNORM) #define USE_POLL #endif ]) ]) commoncpp2-1.8.1/m4/ost_debug.m40000644000175000017500000000344311463357036013270 00000000000000dnl Copyright (C) 1999-2001 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_DEBUG],[ AC_MSG_CHECKING(for debugging) AC_ARG_ENABLE(debug, [ --enable-debug compile for debugging]) if test -z "$enable_debug" ; then enable_debug="no" elif test $enable_debug = "yes" ; then CXXFLAGS="${CXXFLAGS} -g -DDEBUG" # CXXFLAGS=`echo $CFLAGS | sed 's/-O.//'` fi AC_MSG_RESULT([$enable_debug]) AC_MSG_CHECKING(for profiling) AC_ARG_ENABLE(profiling, [ --enable-profiling compile for profiling]) if test -z "$enable_profiling" ; then enable_profiling="no" elif test "$enable_profiling" = "yes" ; then CXXFLAGS="${CXXFLAGS} -p" fi AC_MSG_RESULT([$enable_profiling]) ]) commoncpp2-1.8.1/m4/ost_signal.m40000644000175000017500000000470011463363221013445 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CC_SIGNAL],[ AC_REQUIRE([OST_SYS_POSIX]) AC_CHECK_FUNCS(sigaction) AC_CHECK_FUNCS(setitimer) AC_CHECK_FUNCS(sigwait) AC_CHECK_HEADERS(bsd/signal.h) AC_TYPE_SIGNAL AC_CACHE_CHECK(whether sigwait has 2 arguments, ac_cv_ost_sigwait2, AC_TRY_COMPILE([ #ifndef _POSIX_PTHREAD_SEMANTICS #define _POSIX_PTHREAD_SEMANTICS #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include ],[ sigset_t sigs; int signo; sigwait(&sigs, &signo);], ac_cv_ost_sigwait2=yes, ac_cv_ost_sigwait2=no ) ) if test "$ac_cv_ost_sigwait2" = "yes" ; then AC_DEFINE(HAVE_SIGWAIT2, [1], [2 argument form]) fi AH_BOTTOM([ #ifdef HAVE_SIGACTION #ifdef HAVE_BSD_SIGNAL_H #undef HAVE_BSD_SIGNAL_H #endif #endif /* Cause problem with Solaris... and perhaps Digital Unix? However, the autoconf test in ost_signal defines _POSIX_PTHREAD_SEMANTICS when trying to compile sigwait2. */ #ifdef HAVE_SIGWAIT2 #ifndef _POSIX_PTHREAD_SEMANTICS #define _POSIX_PTHREAD_SEMANTICS #endif #endif #ifdef HAVE_BSD_SIGNAL_H #include #else #include #endif #ifndef SA_ONESHOT #define SA_ONESHOT SA_RESETHAND #endif ]) ]) commoncpp2-1.8.1/m4/ost_stlport.m40000644000175000017500000000612711463364227013713 00000000000000dnl Copyright (C) 2001-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. dnl modification of AC_SEARCH_LIBS for problem with c++ name mangling dnl OST_SEARCH_LIBS(FUNCTION, INCLUDES, MAIN, SEARCH-LIBS [, ACTION-IF-FOUND dnl [, ACTION-IF-NOT-FOUND [, OTHER-LIBRARIES]]]) dnl Search for a library defining FUNC, if it's not already available. AC_DEFUN([OST_SEARCH_LIBS],[ AC_PREREQ([2.13]) AC_CACHE_CHECK([for library containing $1], [ost_cv_search_$1],[ ac_func_search_save_LIBS="$LIBS" ost_cv_search_$1="no" AC_TRY_LINK([$2], [$3], [ost_cv_search_$1="none required"]) test "$ost_cv_search_$1" = "no" && for i in $4; do LIBS="-l$i $7 $ac_func_search_save_LIBS" AC_TRY_LINK([$2], [$3],[ ost_cv_search_$1="-l$i" break ]) done LIBS="$ac_func_search_save_LIBS" ]) if test "$ost_cv_search_$1" != "no"; then test "$ost_cv_search_$1" = "none required" || LIBS="$ost_cv_search_$1 $LIBS" $5 else : $6 fi ]) AC_DEFUN([OST_SGI_STLPORT],[ AC_REQUIRE([OST_CXX_PROGRAMMING]) dnl dnl Check for sgi/stlport portable c++ library dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS AC_ARG_WITH(stlport, [ --with-stlport[=dir] using SGI portable C++ stream library ie: /usr/local, not all include directory],[ if test "$withval" = "" ; then COMMON_FLAGS="-I$(includedir)/stlport $COMMON_FLAGS" else COMMON_FLAGS="-I$withval/include/stlport $COMMON_FLAGS" LIBS="-L$withval/lib $LIBS" fi dnl AC_SEARCH_LIBS do not run (consider name mangling) OST_SEARCH_LIBS(__stl_throw_invalid_argument, [ namespace _STL { void __stl_throw_invalid_argument(const char*); } ], [_STL::__stl_throw_invalid_argument("x")], [stlport_gcc stlport_cygwin stlport_mingw32 stlport_sunpro stlport_watcom]) ]) AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" ]) commoncpp2-1.8.1/m4/ost_posix.m40000644000175000017500000000455511463360172013344 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_SYS_POSIX],[ AC_REQUIRE([OST_PROG_CC_POSIX]) AC_CACHE_CHECK(whether system meets Posix.1, ost_cv_sys_posix1, AC_TRY_COMPILE([ #include #include ],[ #ifndef _POSIX_VERSION fatal #endif ], ost_cv_sys_posix1=yes, ost_cv_sys_posix1=no ) ) if test $ost_cv_sys_posix1 = no ; then AC_CHECK_HEADERS(unistd.h) else AC_DEFINE(HAVE_UNISTD_H, [1], [have unix header]) fi AC_CHECK_HEADERS(features.h) AH_TOP([ /* hack for BROKEN autoheader, since it will not predicitably order macros by any obvious means. */ #undef HAVE_UNISTD_H #undef HAVE_FEATURES_H #undef HAVE_SYS_TYPES_H #ifdef HAVE_UNISTD_H #include #endif #ifndef WIN32 #ifdef HAVE_FEATURES_H #include #endif #endif #ifdef HAVE_SYS_TYPES_H #include #endif ]) ]) AC_DEFUN([OST_CC_FCNTL],[ AC_REQUIRE([OST_SYS_POSIX]) AC_CHECK_HEADERS(fcntl.h sys/fcntl.h) AH_BOTTOM([ #ifndef HAVE_FCNTL_H #ifdef HAVE_SYS_FCNTL_H #include #endif #else #include #ifndef O_NDELAY #ifdef HAVE_SYS_FCNTL_H #include #endif #endif #endif ]) ]) commoncpp2-1.8.1/m4/ost_cxx.m40000644000175000017500000002424411463356742013011 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CXX_PROGRAMMING],[ AC_REQUIRE([OST_PROG_CC_POSIX]) AC_PROG_CPP AC_PROG_CXX AC_PROG_CXXCPP dnl dnl Check for common C++ portability problems dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS dnl Check whether we have bool AC_CACHE_CHECK(whether ${CXX} has built-in bool type, ac_cv_cxx_bool_type, AC_TRY_COMPILE(, [bool b1=true; bool b2=false;], ac_cv_cxx_bool_type=yes, ac_cv_cxx_bool_type=no ) ) if test $ac_cv_cxx_bool_type = yes ; then AC_DEFINE(HAVE_BOOL_TYPE, [1], [have bool type]) fi AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" AH_BOTTOM([ #ifndef HAVE_BOOL_TYPE typedef enum { true=1, false=0 } bool; #endif ]) ]) AC_DEFUN([OST_CXX_NEW_INIT],[ AC_REQUIRE([OST_PROG_CC_POSIX]) # AC_PROG_CPP # AC_PROG_CXX # AC_PROG_CXXCPP dnl dnl Check for common C++ portability problems dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS dnl Check whether we have bool AC_CACHE_CHECK([whether ${CXX} has new(size_t,void*)], ac_cv_cxx_new_init, AC_TRY_COMPILE([#include #include using namespace std;], [int* p1 = new int(); int* p2 = new (p1) int(); return 0;], ac_cv_cxx_new_init=yes, ac_cv_cxx_new_init=no ) ) if test $ac_cv_cxx_new_init = yes ; then AC_DEFINE(CCXX_HAVE_NEW_INIT, [1], [have new with init]) fi AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" AH_BOTTOM([ #ifdef CCXX_NAMESPACES #define USING(x) using namespace x; #else #define USING(x) #endif #ifdef __KCC #define KAI_NONSTD_IOSTREAM 1 #endif ]) ]) AC_DEFUN([OST_CXX_ARRAYS],[ AC_REQUIRE([OST_CXX_PROGRAMMING]) dnl dnl Determine C++ support for dynamic sized arrays in stack frame. dnl AC_LANG_SAVE AC_LANG_CPLUSPLUS ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_CACHE_CHECK(wheather dynamic arrays in stack frame, ost_cv_cxx_array, AC_TRY_COMPILE(,[ int x; int y\[x\]; return 0; ], ost_cv_cxx_array=no, ost_cv_array=yes) ) if test "$ost_cv_cxx_array" = yes ; then AC_DEFINE(HAVE_DYN_ARRAY, [1], [c++ dynamic arrays in stack frame]) fi AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" ]) AC_DEFUN([OST_CXX_IOSTREAM],[ AC_REQUIRE([OST_CXX_PROGRAMMING]) dnl dnl Determine kind of C++ iostream support. dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS AC_CACHE_CHECK(wheather old style iostreams, ost_cv_cxx_iostream, AC_TRY_COMPILE([ #include using namespace std; class mystr : public streambuf, public iostream { mystr(); }; mystr::mystr() : streambuf(), iostream((streambuf *)this) { } ],[return 0;], ost_cv_cxx_iostream=no, ost_cv_cxx_iostream=yes ) ) if test $ost_cv_cxx_iostream = yes ; then AC_DEFINE(HAVE_OLD_IOSTREAM, [1], [old style iostreams]) fi AC_CHECK_HEADERS(sstream) AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" ]) AC_DEFUN([OST_CXX_NAMESPACE],[ AC_REQUIRE([OST_CXX_PROGRAMMING]) dnl dnl Determine if C++ supports namespaces. dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS AC_CACHE_CHECK(whether ${CXX} supports namespace, ost_cv_cxx_namespace, AC_TRY_COMPILE([ #include namespace Test { using namespace std; }],[return 0;], ost_cv_cxx_namespace=yes, ost_cv_cxx_namespace=no ) ) if test "$ost_cv_cxx_namespace" = yes ; then AC_DEFINE(CCXX_NAMESPACES, [1], [has c++ namespaces]) fi AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" ]) AC_DEFUN([OST_CXX_MUTABLE],[ AC_REQUIRE([OST_CXX_PROGRAMMING]) dnl dnl Determine if C++ supports mutable members. dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS AC_CACHE_CHECK(whether ${CXX} supports mutable, ost_cv_cxx_mutable, AC_TRY_COMPILE([ class t {mutable int i;};], [return 0;], ost_cv_cxx_mutable=yes, ost_cv_cxx_mutable=no ) ) if test $ost_cv_cxx_mutable = no ; then COMMON_FLAGS="$COMMON_FLAGS -Dmutable" fi AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" ]) AC_DEFUN([OST_CXX_NOEXCEPTIONS],[ AC_REQUIRE([OST_CXX_PROGRAMMING]) dnl dnl Disable C++ exception handling whenever possible. dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS dnl strip -fexceptions flag if used optflags=$CXXFLAGS if test ! -z "$optflags" ; then CXXFLAGS="" for opt in $optflags ; do case $opt in *rtti*) ;; *exceptions*) ;; *) CXXFLAGS="$CXXFLAGS $opt" ;; esac done fi AC_CACHE_CHECK(whether ${CXX} supports -fno-exceptions, ac_cv_cxx_noexception_flag,[ echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -fno-exceptions -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -fno-exceptions" ac_cv_cxx_noexception_flag=yes else ac_cv_cxx_noexception_flag=no fi rm -f conftest* ]) AC_CACHE_CHECK(whether ${CXX} supports -fno-rtti, ac_cv_cxx_no_rtti_flag,[ echo '#include ' >conftest.cpp echo 'void f(){}' >>conftest.cpp if test -z "`${CXX} -fno-rtti -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -fno-rtti" ac_cv_cxx_no_rtti_flag=yes else ac_cv_cxx_no_rtti_flag=no fi rm -f conftest* ]) AC_CACHE_CHECK(whether ${CXX} supports -fno-check-new, ac_cv_cxx_no_check_new_flag,[ echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -fno-check-new -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -fno-check-new" ac_cv_cxx_no_check_new_flag=yes else ac_cv_cxx_no_check_new_flag=no fi rm -f conftest* ]) AC_CACHE_CHECK(whether ${CXX} supports -finline, ac_cv_cxx_inline_flag,[ echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -finline -c conftest.cpp 2>&1`"; then COMMON_FLAGS="$COMMON_FLAGS -finline" ac_cv_cxx_inline_flag=yes else ac_cv_cxx_inline_flag=no fi rm -f conftest* ]) AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" ]) AC_DEFUN([OST_CXX_EXCEPTIONS],[ AC_REQUIRE([OST_CXX_PROGRAMMING]) dnl dnl Enable C++ exception handling whenever possible. dnl AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS dnl strip -fno-exceptions flag if used optflags=$CXXFLAGS if test ! -z "$optflags" ; then CXXFLAGS="" for opt in $optflags ; do case $opt in *no-rtti*) ;; *omit-frame-pointer*) ;; *no-exceptions*) ;; *) CXXFLAGS="$CXXFLAGS $opt" ;; esac done fi dnl Check for exception handling AC_CACHE_CHECK(whether ${CXX} supports -fhandle-exceptions, ac_cv_cxx_exception_flag,[ echo 'void f(){}' >conftest.cpp if test -z "`${CXX} -fhandle-exceptions -c conftest.cpp 2>&1`"; then ac_cv_cxx_exception_flag=yes COMMON_FLAGS="$COMMON_FLAGS -fhandle-exceptions" else ac_cv_cxx_exception_flag=no fi rm -f conftest* ]) if test $ac_cv_cxx_exception_flag = "yes" ; then ac_cv_cxx_exception_handling=yes else AC_CACHE_CHECK(whether ${CXX} supports exception handling, ac_cv_cxx_exception_handling, AC_TRY_COMPILE( [void f(void) { throw "abc"; } void g(void) { try { f(); } catch(char*){} } ],, ac_cv_cxx_exception_handling=yes, ac_cv_cxx_exception_handling=no ) ) fi if test $ac_cv_cxx_exception_handling = yes ; then AC_DEFINE(CCXX_EXCEPTIONS, [1], [has c++ exception handling]) AC_CHECK_HEADERS(exception) fi AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" AH_BOTTOM([ #ifndef CCXX_EXCEPTIONS /* disable HAVE_EXCEPTION */ #ifdef HAVE_EXCEPTION #undef HAVE_EXCEPTION #endif /* throw - replacement to throw an exception */ #define THROW(x) abort() /* throw - replacement to declare an exception */ #define THROWS(x) /* throw - for empty list */ #define NEW_THROWS #define THROWS_EMPTY /* * work around dangeling if/else combinations: */ #else #define THROW(x) throw x #define THROWS(x) throw(x) #define NEW_THROWS throw() #define THROWS_EMPTY throw() #endif ]) ]) commoncpp2-1.8.1/m4/Makefile.am0000644000175000017500000000175411463357117013112 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = $(M4) MAINTAINERCLEANFILES = Makefile.in M4 = ost_prog.m4 ost_cxx.m4 ost_pthread.m4 ost_posix.m4 ost_systime.m4 \ ost_maint.m4 ost_signal.m4 ost_socket.m4 ost_string.m4 ost_types.m4 \ ost_win32.m4 ost_dynamic.m4 ost_poll.m4 ost_misc.m4 ost_endian.m4 \ ost_debug.m4 ost_getopt.m4 ost_reentrant.m4 win32msc.m4 ost_stlport.m4 SOURCES = $(M4) ../aclocal.m4: $(M4) cd .. ; $(ACLOCAL) -I m4 all-local: ../aclocal.m4 commoncpp2-1.8.1/m4/ost_maint.m40000644000175000017500000000425411463360017013304 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_AUTOMAKE_MODE],[ AC_MSG_CHECKING([for genorated automake files]) if test -z "[$1]" ; then ost_AUTOMAKE_TEST=Makefile.in else ost_AUTOMAKE_TEST=[$1] fi if test ! -f $ost_AUTOMAKE_TEST ; then AC_MSG_RESULT(missing) automake -a else AC_MSG_RESULT(found) fi ]) AC_DEFUN([OST_MAINTAINER_MODE],[ AM_MAINTAINER_MODE if test -z "$MAINT" ; then AC_MSG_CHECKING([for maintainer ftp distribution directory]) if test -d ~ftp/pub ; then FTPDIR=~ftp/pub AC_MSG_RESULT(found) else AC_MSG_RESULT(missing) fi fi AC_SUBST(FTPDIR) ]) AC_DEFUN([AC_SUBST_DIR], [ ifelse($2,,,$1="[$]$2") result="***" prior="A" while test "$prior" != "$result" ; do prior=`(echo "[$]$1")` $1=`( test "x$prefix" = xNONE && prefix="$ac_default_prefix" test "x$exec_prefix" = xNONE && exec_prefix="${prefix}" eval echo \""[$]$1"\" )` result=`(echo "[$]$1")` done AC_SUBST($1) ]) commoncpp2-1.8.1/m4/ost_socket.m40000644000175000017500000002453311463363450013472 00000000000000dnl Copyright (C) 2001-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_SYS_SOCKET],[ AC_REQUIRE([OST_CC_SYSTIME]) AC_REQUIRE([OST_CC_TYPES]) ost_cv_inet_sockets=no ost_cv_unix_sockets=no ost_cv_lib_socket="c" ost_cv_ipv6=yes ost_cv_nat=yes ost_cv_nat_detected=no SOCKET_LIBS="" AC_CHECK_HEADERS(net/if.h) AC_CHECK_HEADERS(sys/socket.h,[ AC_CHECK_HEADERS(select.h sys/select.h netinet/in_systm.h netinet/ip.h) AC_CHECK_HEADERS(netinet/inet.h netinet/in.h) AC_CHECK_HEADERS(arpa/inet.h, ost_cv_inet_sockets=yes) AC_CHECK_HEADERS(sys/sockio.h) AC_CHECK_HEADERS(sys/un.h, ost_cv_unix_sockets=yes) ],[ AC_CHECK_HEADERS(winsock2.h winsock.h,[ ost_cv_lib_socket="wsock32" SOCKET_LIBS="-lwsock32 -liberty -lws2_32" ost_cv_inet_sockets=yes ]) ]) AC_CHECK_LIB(socket, socket, [ ost_cv_lib_socket="socket" SOCKET_LIBS="-lsocket" ]) if test $ost_cv_inet_sockets = yes ; then AC_CHECK_LIB(${ost_cv_lib_socket}, getaddrinfo,[ AC_DEFINE(HAVE_GETADDRINFO, [1], [getaddrinfo interface support]) ]) AC_ARG_WITH(ipv6, [ --without-ipv6 Disable ipv6], ost_cv_ipv6=no,[ AC_CHECK_HEADERS(netinet6/in6.h linux/in6.h) AC_CHECK_LIB(${ost_cv_lib_socket}, inet_pton,[ AC_DEFINE(HAVE_INET_PTON, [1], [ipv6 support])]) AC_CHECK_LIB(${ost_cv_lib_socket}, gethostbyname2,[ AC_DEFINE(HAVE_GETHOSTBYNAME2, [1], [ipv6 host lookup])]) ]) AC_CHECK_HEADERS(sys/libcsys.h) AC_DEFINE(HAVE_INET_SOCKETS, [1], [inet sockets]) AC_CHECK_LIB(${ost_cv_lib_socket}, inet_aton,[ AC_DEFINE(HAVE_INET_ATON, [1], [has inet_aton])]) AC_CACHE_CHECK([for socklen_t defined], ost_cv_socklen_t, [ ost_cv_socklen_t='no' AC_EGREP_HEADER(socklen_t, sys/socket.h, ost_cv_socklen_t='yes',[ AC_EGREP_HEADER(socklen_t, cygwin/socket.h, ost_cv_socklen_t='yes')]) ]) if test $ost_cv_socklen_t = yes ; then AC_DEFINE(HAVE_SOCKLEN_T, [1], [has socklen_t type]) fi AC_ARG_WITH([nat], [AC_HELP_STRING([--without-nat],[ Disable NAT class interface (pf, ipf or netfilter), default is enabled.])], [ost_cv_nat=no] ) if test "$ost_cv_nat" = "yes" ; then AC_CHECK_HEADERS([errno.h limits.h sys/types.h sys/socket.h sys/ioctl.h unistd.h]) AC_CHECK_HEADERS([net/if.h],,, [#ifdef HAVE_SYS_SOCKET_H #include #endif]) if test "$ost_cv_nat_detected" = "no" ; then AC_CHECK_HEADERS([linux/netfilter_ipv4.h linux/netfilter_ipv6.h],,, [#ifdef HAVE_LIMITS_H #include #endif]) if test "$ac_cv_header_linux_netfilter_ipv4_h" = "yes" && [ test "$ac_cv_header_linux_netfilter_ipv6_h" = "yes" && test "$ost_cv_ipv6" = "yes" || test "$ost_cv_ipv6" = "no" ] ; then AC_DEFINE(HAVE_NAT_NETFILTER, [1], [NetFilter NAT support]) ost_cv_nat_detected="yes" fi fi if test "$ost_cv_nat_detected" = "no" ; then ip_filter_compat="no" AC_CHECK_HEADERS([netinet/ip_compat.h ip_compat.h netinet/ip_fil_compat.h ip_fil_compat.h], [ip_filter_compat=$ac_header break],, [#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif]) if test "$ip_filter_compat" != "no" ; then ip_filter_fil="no" AC_CHECK_HEADERS([netinet/ip_fil.h ip_fil.h], [ip_filter_fil=$ac_header break],, [#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #include <$ip_filter_compat>]) ip_filter_nat="no" AC_CHECK_HEADERS([netinet/ip_nat.h ip_nat.h], [ip_filter_nat=$ac_header break],, [#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #include <$ip_filter_compat> #include <$ip_filter_fil> #ifdef HAVE_NET_IF_H #include #endif]) if test "$ip_filter_fil" != "no" && test "$ip_filter_nat" != "no" ; then AC_DEFINE(HAVE_NAT_IPF, [1], [IPF NAT support]) ost_cv_nat_detected="yes" fi fi fi if test "$ost_cv_nat_detected" = "no" ; then AC_CHECK_HEADERS([net/pfvar.h],,, [#ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_NET_IF_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif]) if test "$ac_cv_header_net_pfvar.h" = "yes" ; then AC_DEFINE(HAVE_NAT_PF, [1], [PF NAT support]) ost_cv_nat_detected="yes" fi fi if test "$ost_cv_nat_detected" = "yes"; then AC_DEFINE(CCXX_NAT, [1], [NAT support]) else AC_MSG_WARN([-------------------------------------------------------]) AC_MSG_WARN([Could not autodetect NAT engine - pf, ipf or netfilter.]) AC_MSG_WARN([NAT engine c++ class interface support was disabled. ]) AC_MSG_WARN([This is not necessarilly a problem. If you do not plan ]) AC_MSG_WARN([to use or don't know what this is, than it is safe to ]) AC_MSG_WARN([assume that you don't need it. ]) AC_MSG_WARN([-------------------------------------------------------]) ost_cv_nat="no" fi fi fi if test $ost_cv_unix_sockets = yes ; then AC_DEFINE(HAVE_UNIX_SOCKETS, [1], [has unix domain sockets]) fi THREAD_LIBS="$SOCKET_LIBS $THREAD_LIBS" AC_SUBST(SOCKET_LIBS) AH_BOTTOM([ #ifdef HAVE_SYS_LIBCSYS_H #include #endif #ifdef HAVE_WINSOCK2_H #include #else #ifdef HAVE_WINSOCK_H #include #else #ifdef HAVE_SYS_SOCKET_H #include #ifdef HAVE_SELECT_H #include #else #ifdef HAVE_SYS_SELECT_H #include #endif #endif #ifdef HAVE_NETINET_IN_H #if defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED) #undef _XOPEN_SOURCE_EXTENDED #endif #include #ifdef __hpux #define _XOPEN_SOURCE_EXTENDED #endif #endif #ifdef HAVE_ARPA_INET_H #include #include #endif #ifdef HAVE_NETINET6_IN6_H #include #endif #ifdef HAVE_LINIX_IN6_H #include #endif #ifdef HAVE_NETINET_IN_SYSTM_H #include #endif #ifdef HAVE_NETINET_IP_H #include #endif #ifdef HAVE_SYS_UN_H #include #endif #endif #endif #endif #ifndef HAVE_INET_ATON #define inet_aton(cp, addr) (((*(unsigned long int *)(addr)) = inet_addr(cp)) != -1) #endif #ifndef SUN_LEN #ifdef SCM_RIGHTS #define HAVE_UN_LEN #endif #ifdef __linux__ #define HAVE_UN_LEN #endif #ifdef HAVE_UN_LEN #define SUN_LEN(ptr) sizeof(sockaddr_un.sun_len) + sizeof(sockaddr_un.sun_family) + sizeof(sockaddr_un.sun_path) + 1 #else #define SUN_LEN(ptr) ((size_t)((struct sockaddr_un *)0)->sun_path) + strlen((ptr)->sun_path)) #endif #endif #ifndef _OSF_SOURCE #ifndef HAVE_SOCKLEN_T #if defined(i386) && defined(__svr4__) #define HAVE_SOCKLEN_U #else #if defined(__CYGWIN32__) #define socklen_t int #else typedef int socklen_t; #endif #endif #ifdef HAVE_SOCKLEN_U #if !defined(__CYGWIN32__) && !defined(__MINGW32__) typedef unsigned socklen_t; #else typedef int socklen_t; #endif #endif #endif #endif #ifdef __hpux #ifdef mutable #undef mutable #endif #endif #if defined(AF_INET6) && defined(HAVE_INET_PTON) #define CCXX_IPV6 #endif #define CCXX_MULTIFAMILY_IP ]) ]) commoncpp2-1.8.1/m4/Makefile.in0000644000175000017500000003016311463364513013115 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = m4 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = depcomp = am__depfiles_maybe = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = no-dependencies EXTRA_DIST = $(M4) MAINTAINERCLEANFILES = Makefile.in M4 = ost_prog.m4 ost_cxx.m4 ost_pthread.m4 ost_posix.m4 ost_systime.m4 \ ost_maint.m4 ost_signal.m4 ost_socket.m4 ost_string.m4 ost_types.m4 \ ost_win32.m4 ost_dynamic.m4 ost_poll.m4 ost_misc.m4 ost_endian.m4 \ ost_debug.m4 ost_getopt.m4 ost_reentrant.m4 win32msc.m4 ost_stlport.m4 SOURCES = $(M4) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu m4/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu m4/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(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 all-local 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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic 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 -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool distclean distclean-generic distclean-libtool \ 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-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am ../aclocal.m4: $(M4) cd .. ; $(ACLOCAL) -I m4 all-local: ../aclocal.m4 # 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: commoncpp2-1.8.1/m4/libtool.m40000644000175000017500000077464711463364506013006 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 56 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl _LT_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$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 ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_PROG_CXX # ------------ # Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ # compiler, we have our own version here. m4_defun([_LT_PROG_CXX], [ pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) AC_PROG_CXX if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_CXX dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_CXX], []) # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [AC_REQUIRE([_LT_PROG_CXX])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=echo else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ]) dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_PROG_F77 # ------------ # Since AC_PROG_F77 is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_F77], [ pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) AC_PROG_F77 if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_F77 dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_F77], []) # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_REQUIRE([_LT_PROG_F77])dnl AC_LANG_PUSH(Fortran 77) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC CC=${F77-"f77"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_PROG_FC # ----------- # Since AC_PROG_FC is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_FC], [ pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) AC_PROG_FC if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_FC dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_FC], []) # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_REQUIRE([_LT_PROG_FC])dnl AC_LANG_PUSH(Fortran) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC CC=${FC-"f95"} compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC="$lt_save_CC" ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC GCC= CC=${RC-"windres"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC="$lt_save_CC" ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_XSI_SHELLFNS # --------------------- # Bourne and XSI compatible variants of some useful shell functions. m4_defun([_LT_PROG_XSI_SHELLFNS], [case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $[*] )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } dnl func_dirname_and_basename dnl A portable version of this function is already defined in general.m4sh dnl so there is no need for it here. # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[[^=]]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$[@]"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]+=\$[2]" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]=\$$[1]\$[2]" } _LT_EOF ;; esac ]) commoncpp2-1.8.1/m4/ost_endian.m40000644000175000017500000000472011463357245013441 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2008 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CC_ENDIAN],[ AC_REQUIRE([AC_CANONICAL_SYSTEM]) AC_REQUIRE([OST_SYS_POSIX]) AC_CHECK_HEADER(endian.h,[ AC_DEFINE(HAVE_ENDIAN_H, [1], [have endian header]) ],[ AC_CHECK_HEADER(sys/isa_defs.h,[ AC_DEFINE(HAVE_SYS_ISA_DEFS_H, [1], [solaris endian]) ],[ case "$target_cpu" in alpha* | i?86) AC_DEFINE(__BYTE_ORDER, [1234], [endian byte order]) ;; hppa* | m68* | mips* | powerpc* | sparc*) AC_DEFINE(__BYTE_ORDER, [4321]) ;; esac ]) ]) AH_BOTTOM([ #if defined(HAVE_ENDIAN_H) #include #elif defined(HAVE_SYS_ISA_DEFS_H) #include #ifdef _LITTLE_ENDIAN #define __BYTE_ORDER 1234 #else #define __BYTE_ORDER 4321 #endif #if _ALIGNMENT_REQUIRED > 0 #define __BYTE_ALIGNMENT _MAX_ALIGNMENT #else #define __BYTE_ALIGNMENT 1 #endif #endif #ifndef __LITTLE_ENDIAN #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 #endif #ifndef __BYTE_ORDER #define __BYTE_ORDER 1234 #endif #ifndef __BYTE_ALIGNMENT #if defined(SPARC) || defined(sparc) #if defined(__arch64__) || defined(__sparcv9) #define __BYTE_ALIGNMENT 8 #else #define __BYTE_ALIGNMENT 4 #endif #endif #endif #ifndef __BYTE_ALIGNMENT #define __BYTE_ALIGNMENT 1 #endif ]) ]) commoncpp2-1.8.1/m4/ost_prog.m40000644000175000017500000000414711463360303013142 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_PROG_CC_POSIX],[ AC_PROG_CC AC_PROG_CPP AC_ISC_POSIX AC_MINIX] ) AC_DEFUN([OST_PROG_COMMON],[ AC_REQUIRE([AC_PROG_INSTALL]) AC_REQUIRE([AC_PROG_MAKE_SET]) ]) AC_DEFUN([OST_PROJ_LIBRARY],[ AC_REQUIRE([AM_PROG_LIBTOOL]) AC_REQUIRE([AC_PROG_RANLIB]) if test ! -z "[$2]" ; then if test ! -z "[$3]" ; then LT_[$1]_VERSION="-version-info [$3] -release [$2]" else LT_[$1]_VERSION="-release [$2]" fi AC_SUBST(LT_[$1]_VERSION) fi ]) AC_DEFUN([OST_PROG_LIBVER],[ LT_MAJOR="`echo $LT_VERSION | sed s/:.*$//`" LT_MINOR="`echo $LT_VERSION | sed s/.*://`" LT_SUBVER="$LT_MAJOR.$LT_MINOR" AC_SUBST(LT_RELEASE) AC_SUBST(LT_SUBVER) AC_SUBST(LT_MAJOR) AC_SUBST(LT_MINOR) ]) AC_DEFUN([OST_PROG_LIBRARY],[ AC_REQUIRE([AM_PROG_LIBTOOL]) AC_REQUIRE([AC_PROG_RANLIB]) if test ! -z "[$2]" ; then LT_[$1]_VERSION="-version-info [$2]" AC_SUBST(LT_[$1]_VERSION) fi ]) commoncpp2-1.8.1/m4/ost_win32.m40000644000175000017500000000347611463364447013156 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_WINVER],[ WINVERSION="`echo $VERSION | sed 's/\./,/g'`,0" AC_SUBST(WINVERSION) ]) AC_DEFUN([OST_WIN32],[ AC_REQUIRE([OST_PROG_CC_POSIX]) AC_CACHE_CHECK(for Win32 gnu environment, ost_cv_gnuwin32,[ ac_save_CFLAGS="$CFLAGS" CFLAGS="" AC_TRY_COMPILE([ #ifdef __WIN32__ #ifdef __MINGW32__ #define __RETURN_WIN32__ __MINGW32__ #endif #ifdef __CYGWIN32__ #define __RETURN_WIN32__ __CYGWIN32__ #endif #endif ],[return __RETURN_WIN32__;], [ost_cv_gnuwin32=yes ],[ost_cv_gnuwin32=no]) rm -f conftest* CFLAGS="$ac_save_CFLAGS" ]) ]) commoncpp2-1.8.1/m4/ost_string.m40000644000175000017500000000342411463364244013506 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CC_STRING],[ AC_REQUIRE([OST_SYS_POSIX]) AC_CHECK_FUNCS(strcasecmp) AC_CHECK_HEADERS(strings.h alloca.h) AH_BOTTOM([ #include #ifdef HAVE_STRINGS_H #ifndef _AIX #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif #ifndef HAVE_SNPRINTF #if defined(WIN32) && defined(_MSC_VER) && _MSC_VER < 1400 #define snprintf _snprintf #define vsnprintf _vsnprintf #endif #endif #ifdef HAVE_STRCASECMP #ifndef stricmp #define stricmp(x,y) strcasecmp(x,y) #endif #ifndef strnicmp #define strnicmp(x,y,n) strncasecmp(x,y,n) #endif #ifndef stristr #define stristr(x, y) strcasestr(x,y) #endif #endif ]) ]) commoncpp2-1.8.1/m4/ltoptions.m40000644000175000017500000002724211463364506013353 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [0], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) commoncpp2-1.8.1/m4/ost_types.m40000644000175000017500000000556511463364306013353 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CC_TYPES],[ AC_REQUIRE([OST_SYS_POSIX]) AC_CHECK_HEADERS(sys/types.h bits/wordsize.h) AC_EGREP_HEADER(u_int8_t,sys/types.h,[ AC_DEFINE(HAVE_SYS_TYPES_STD, [1], [have systypes]) AC_EGREP_HEADER(u_int64_t,sys/types.h,[ AC_DEFINE(HAVE_SYS_TYPES_64, [1], [have 64 bit longs]) ]) ]) AC_EGREP_HEADER(long long,sys/types.h,[ AC_DEFINE(HAVE_LONG_LONG, [1], [have long longs]) ]) AH_TOP([ #undef HAVE_SYS_TYPES_STD #undef HAVE_SYS_TYPES_64 #undef HAVE_LONG_LONG #undef HAVE_SYS_TYPES #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_BITS_WORSIZE_H #include #endif #ifdef HAVE_SYS_TYPES_STD typedef int8_t int8; typedef u_int8_t uint8; typedef int16_t int16; typedef u_int16_t uint16; typedef int32_t int32; typedef u_int32_t uint32; #ifdef HAVE_SYS_TYPES_64 #define HAVE_64_BITS typedef int64_t int64; typedef u_int64_t uint64; #endif #else typedef char int8; typedef unsigned char uint8; typedef short int16; typedef unsigned short uint16; typedef int int32; typedef unsigned int uint32; #endif #ifndef HAVE_SYS_TYPES_64 #if defined(__WORDSIZE) || defined(__arch64__) #if __WORDSIZE >= 64 || defined(__arch64__) typedef long int int64; typedef unsigned long int uint64; #define HAVE_SYS_TYPES_64 #define HAVE_64_BITS #endif #endif #endif #ifndef HAVE_SYS_TYPES_64 #ifdef __GNUC__ #if defined(HAVE_LONG_LONG) || defined(_LONGLONG) __extension__ typedef long long int int64; __extension__ typedef unsigned long long int uint64; #define HAVE_SYS_TYPES_64 #define HAVE_64_BITS #endif #endif #endif #ifndef HAVE_SYS_TYPES_64 #if defined(HAVE_LONG_LONG) || defined(_LONGLONG) #define HAVE_64_BITS typedef long long int64; typedef unsigned long long uint64; #endif #endif ]) ]) commoncpp2-1.8.1/m4/ost_getopt.m40000644000175000017500000000357411463357612013511 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_CC_GETOPT],[ ost_cv_libgetopt_long=false GETOPT_LIBS="" LIBGETOPTOBJS="" AC_REQUIRE([OST_SYS_POSIX]) AC_CHECK_FUNCS(getopt,[ AC_DEFINE(HAVE_GETOPT, [1], [have getopt header]) ],[ AC_CHECK_LIB(m, getopt,[ AC_DEFINE(HAVE_GETOPT, [1]) GETOPT_LIBS="-lm" ]) ]) AC_CHECK_HEADERS(getopt.h) AC_CHECK_LIB(gnugetopt, getopt_long,[ AC_DEFINE(HAVE_GETOPT_LONG, [1], [have gnugetopt lib]) GETOPT_LIBS="-lgnugetopt $GETOPT_LIBS" LIBS="$LIBS -lgnugetopt"],[ AC_CHECK_FUNCS(getopt_long,[ AC_DEFINE(HAVE_GETOPT_LONG, [1]) ],[ LIBGETOPTOBJS="getopt.c getopt1.c" ]) ]) AC_SUBST(GETOPT_LIBS) AC_SUBST(LIBGETOPTOBJS) ]) commoncpp2-1.8.1/m4/ost_pthread.m40000644000175000017500000004455511463363034013635 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_LIB_PTHREAD], [ AC_REQUIRE([OST_SYS_POSIX]) AC_REQUIRE([OST_CC_SYSTIME]) THREAD_FLAGS="" THREAD_LIBS="" ost_cv_thread_library="none" ost_cv_rt_library="none" ost_cv_cxx_mode=false AC_ARG_WITH(pthread, [ --with-pthread[=lib] using specified pthread library], [if test "$withval" != "" ; then ost_cv_thread_library=$withval ; fi] ) AC_ARG_WITH(linuxthreads, [ --with-linuxthreads use linux kernel mode library ],[ ost_cv_thread_library=lthread AC_DEFINE(WITH_LINUXTHREADS, [1], [bsd system using linuxthreads]) if test "$withval" != "yes" ; then THREAD_FLAGS="-D__USE_GNU -D__USE_UNIX98 -I$withval $THREAD_FLAGS" CFLAGS="-D__USE_GNU -D__USE_UNIX98 -I$withval $CFLAGS" else THREAD_FLAGS="-D__USE_GNU -D__USE_UNIX98 -I/usr/local/include/pthread/linuxthreads $THREAD_FLAGS" CFLAGS="-D__USE_GNU -D__USE_UNIX98 -I/usr/local/include/pthread/linuxthreads $CFLAGS" fi ]) AC_CHECK_HEADERS(pthread.h, [ AC_DEFINE(HAVE_PTHREAD_H, [1], [posix thread header]) ost_cv_posix_threads=yes], ost_cv_posix_threads=no) if test $ost_cv_posix_threads = no ; then AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" AC_LANG_CPLUSPLUS CXXFLAGS="$CXXFLAGS -pthread" AC_TRY_COMPILE([#include ],[], AC_DEFINE(HAVE_PTHREAD_H, [1]) ost_cv_cxx_mode=true ost_cv_posix_threads=yes) CXXFLAGS="$ac_save_CXXFLAGS" AC_LANG_RESTORE fi AC_LANG_SAVE ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="" AC_LANG_CPLUSPLUS ost_cv_posix_atomic=no AC_CHECK_HEADERS(sys/atomic_op.h,[ AC_DEFINE(HAVE_ATOMIC_AIX, [1], [atomic aix operations]) ]) AC_CHECK_HEADERS([sys/atomic.h], ost_cv_posix_sys_atomic=yes, ost_cv_posix_sys_atomic=no) if test $ost_cv_posix_sys_atomic = yes ; then AC_MSG_CHECKING([for atomic_t]) AC_TRY_COMPILE([#include ],[ atomic_t at; at.counter = 1; atomic_dec_and_test(&at); atomic_sub(4, &at); atomic_inc(&at); atomic_add(3, &at); ],[ ost_cv_posix_atomic=yes AC_DEFINE(HAVE_WORKING_SYS_ATOMIC_H, [1], [has usable atomic functions])], [ost_cv_posix_atomic=no]) AC_MSG_RESULT($ost_cv_posix_atomic) fi if test 0 = 1 ; then dnl check for gcc's bits/atomicity and the atomic functions therein AC_CHECK_HEADERS([bits/atomicity.h], ost_cv_bits_atomicity=yes, ost_cv_bits_atomicity=no) if test $ost_cv_bits_atomicity = yes ; then AC_MSG_CHECKING([for _Atomic_word]) AC_TRY_COMPILE([#include ],[ _Atomic_word i = 0; __atomic_add(&i, 1); __exchange_and_add(&i, 1); ], [ost_cv_gcc_atomic=yes AC_DEFINE(HAVE_GCC_BITS_ATOMIC, [1], [has gcc atomic functions])], [ost_cv_gcc_atomic=no]) AC_MSG_RESULT($ost_cv_gcc_atomic) AC_MSG_CHECKING([for __gnu_cxx::_Atomic_word]) AC_TRY_COMPILE([#include ],[ using namespace __gnu_cxx; _Atomic_word i = 0; __atomic_add(&i, 1); __exchange_and_add(&i, 1); ],[ ost_cv_gcc_cxx_atomic=yes AC_DEFINE(HAVE_GCC_CXX_BITS_ATOMIC, [1], [has __gnu_cxx atomic functions]) ],[ ost_cv_gcc_cxx_atomic=no ]) AC_MSG_RESULT($ost_cv_gcc_cxx_atomic) fi fi AC_LANG_RESTORE CXXFLAGS="$ac_save_CXXFLAGS" if test "$target" = NONE ; then targetdir="" else targetdir="$target" fi AC_CHECK_HEADERS(thread.h) if test "$prefix" = NONE ; then thrprefix="/usr/$targetdir/include" if test -d /usr/$targetdir/sys-include ; then thrprefix="$prefix/$targetdir/sys-include" ; fi else thrprefix="$prefix/$targetdir/include" if test -d "$prefix/$targetdir/sys-include" ; then thrprefix="$prefix/$targetdir/sys-include" ; fi fi if test ! -f $thrprefix/thread.h ; then thrprefix=/usr/include fi AC_SUBST(thrprefix) if test $ost_cv_posix_threads = yes ; then if test "$ost_cv_thread_library" = "none" ; then ost_cv_thread_flags="" for flags in -kthread -pthread -mthreads -pthreads -Kthread --threadsafe -mt ; do AC_MSG_CHECKING(whether ${CC-cc} accepts $flags) echo 'void f(){}' >conftest.c if test -z "`${CC-cc} $flags -c conftest.c 2>&1`"; then ost_cv_thread_flags=$flags AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi rm -f conftest* if test ! -z "$ost_cv_thread_flags" ; then break ; fi done # if test "$ost_cv_prog_cc_pthread" = "no" ; then # AC_CACHE_CHECK(whether ${CC-cc} accepts -mthreads, # ost_cv_prog_cc_mthreads, # [echo 'void f(){}' >conftest.c # if test -z "`${CC-cc} -mthreads -c conftest.c 2>&1`"; then # ost_cv_prog_cc_mthreads=yes # else # ost_cv_prog_cc_mthreads=no # fi # rm -f conftest* # ]) # fi ost_cv_thread_library=none AC_CHECK_LIB(pthread, pthread_self, ost_cv_thread_library=pthread, AC_CHECK_LIB(c_r, pthread_self, ost_cv_thread_library=c_r, AC_CHECK_LIB(pthread, pthread_kill, ost_cv_thread_library=pthread, AC_CHECK_LIB(pthreads, pthread_self, ost_cv_thread_library=pthreads, AC_CHECK_LIB(thread, pthread_self, ost_cv_thread_library=thread))))) if test $ost_cv_thread_library = none ; then AC_CHECK_LIB(gthreads, pthread_self,[ AC_CHECK_LIB(malloc, malloc) ost_cv_thread_library=gthreads]) fi if test $ost_cv_thread_library = none ; then AC_CHECK_LIB(cma, pthread_self, ost_cv_thread_library=cma) fi if test $ost_cv_thread_library = none ; then AC_CHECK_LIB(c, pthread_self, ost_cv_thread_library=c) fi if test $ost_cv_thread_library = none ; then AC_MSG_ERROR(no library for posix threads found!) fi else # ost_cv_prog_cc_pthread=no # ost_cv_prog_cc_mthreads=no ost_cv_thread_flags="" fi AC_CHECK_LIB(${ost_cv_thread_library}, pthread_mach_thread_np, AC_DEFINE(HAVE_PTHREAD_MACH_THREAD_NP, [1], [has mach link]) ) AC_CHECK_LIB(${ost_cv_thread_library}, nanosleep, AC_DEFINE(HAVE_PTHREAD_NANOSLEEP, [1], [has nanosleep]),[ AC_CHECK_LIB(posix4, nanosleep,[ AC_DEFINE(HAVE_PTHREAD_NANOSLEEP, [1]) THREAD_LIBS="$THREAD_LIBS -lposix4" ],[ AC_CHECK_LIB(rt, nanosleep,[ AC_DEFINE(HAVE_PTHREAD_NANOSLEEP, [1]) ost_cv_rt_library="-lrt"]) ]) ]) AC_CHECK_LIB(rt, clock_gettime,[ ost_cv_rt_library="-lrt" AC_DEFINE(HAVE_HIRES_TIMER, [1], [have hires]) ],[ AC_CHECK_FUNCS(clock_gettime,[ AC_DEFINE(HAVE_HIRES_TIMER, [1], [have hires]) ]) ]) AC_CHECK_LIB(rt, mlockall,[ AC_DEFINE(HAVE_MLOCK, [1], [have mlock]) AC_DEFINE(HAVE_MLOCKALL, [1], [have memlockall]) ost_cv_rt_library="-lrt"], [ AC_CHECK_FUNCS(mlock) AC_CHECK_FUNCS(mlockall) ]) if test "$ost_cv_rt_library" != "none" ; then THREAD_LIBS="$THREAD_LIBS $ost_cv_rt_library" ; fi if test ! -z "$ost_cv_thread_flags" ; then THREAD_LIBS="$THREAD_LIBS $ost_cv_thread_flags" ; fi if test "$ost_cv_thread_library" != "none" -a "$ost_cv_thread_library" != "c" ; then THREAD_LIBS="$THREAD_LIBS -l$ost_cv_thread_library" ; fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd*) flag="-D_THREAD_SAFE";; *solaris* | alpha*-osf*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then THREAD_FLAGS="$flag" fi AC_SUBST(THREAD_FLAGS) AC_SUBST(THREAD_LIBS) # LIBS="$THREAD_LIBS $LIBS" if test "$ost_cv_thread_library" != "lthread" ; then AC_CHECK_HEADERS(pthread_np.h) fi AC_CHECK_HEADERS(semaphore.h) AC_CHECK_HEADERS(sched.h) AC_CHECK_HEADERS(sys/sched.h) AC_CHECK_FUNCS(sched_getscheduler) AC_CACHE_CHECK([for recursive mutex type support], ost_cv_mutex_recursive, [ ost_cv_mutex_recursive="none" if test "$ost_cv_cxx_mode" = true ; then AC_LANG_SAVE AC_LANG_CPLUSPLUS ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -pthread" fi AC_TRY_COMPILE( [#include ], [ #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #ifdef PTHREAD_MUTEX_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE #endif #endif return (int)PTHREAD_MUTEXTYPE_RECURSIVE; ], ost_cv_mutex_recursive="portable", [ AC_EGREP_HEADER(PTHREAD_MUTEXTYPE_RECURSIVE_NP,pthread.h, ost_cv_mutex_recursive=non-portable) AC_EGREP_HEADER(PTHREAD_MUTEX_RECURSIVE_INITIALIZER_NP, pthread.h, ost_cv_mutex_recursive=lthread) AC_EGREP_HEADER(PTHREAD_MUTEX_RECURSIVE_NP,pthread.h, ost_cv_mutex_recursive=linux) AC_EGREP_HEADER(MUTEX_TYPE_COUNTING_FAST,pthread.h, ost_cv_mutex_recursive=counting) ]) if test $ost_cv_mutex_recursive = "none" ; then if test $ost_cv_thread_library = "lthread" ; then ost_cv_mutex_recursive=linux fi fi rm -f conftest* ]) if test $ost_cv_mutex_recursive = "none" ; then AC_TRY_COMPILE( [#include ], [return MUTEX_TYPE_COUNTING_FAST;], ost_cv_mutex_recursive=counting) fi if test "$ost_cv_cxx_mode" = true ; then CXXFLAGS="$ac_save_CXXFLAGS" AC_LANG_RESTORE fi case $ost_cv_mutex_recursive in non-portable) AC_DEFINE(PTHREAD_MUTEXTYPE_RECURSIVE, PTHREAD_MUTEXTYPE_RECURSIVE_NP, [mutex type]) ;; linux) AC_DEFINE(PTHREAD_MUTEXTYPE_RECURSIVE, PTHREAD_MUTEX_RECURSIVE_NP) ;; counting) AC_DEFINE(PTHREAD_MUTEXTYPE_RECURSIVE, MUTEX_TYPE_COUNTING_FAST) ;; esac AC_CHECK_LIB(${ost_cv_thread_library}, pthread_mutexattr_settype, AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_SETTYPE, [1], [has setttype]), [ AC_CHECK_LIB(${ost_cv_thread_library}, pthread_mutexattr_settype_np, AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_SETTYPE_NP, [1], [has non portable settype])) AC_CHECK_LIB(${ost_cv_thread_library}, pthread_mutexattr_setkind_np, AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_SETKIND_NP, [1], [has non portable setkind])) ] ) ost_cv_thread_rwlock=false AC_CHECK_LIB(${ost_cv_thread_library}, pthread_rwlock_init,[ ost_cv_thread_rwlock=true AC_DEFINE(HAVE_PTHREAD_RWLOCK, [1], [has rwlock support])]) AC_CHECK_LIB(c, pread,[ AC_DEFINE(HAVE_PREAD_PWRITE, [1], [has pwrite])],[ AC_CHECK_LIB(${ost_cv_thread_library}, pread,[ AC_DEFINE(HAVE_PREAD_PWRITE, [1])],[ AC_CHECK_LIB(c_r, pread,[AC_DEFINE(HAVE_PREAD_PWRITE)]) ]) ]) AC_CHECK_LIB(${ost_cv_thread_library}, pthread_suspend, AC_DEFINE(HAVE_PTHREAD_SUSPEND, [1], [has suspend])) AC_CHECK_LIB(${ost_cv_thread_library}, pthread_attr_setstacksize, AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE, [1], [has stack size])) AC_CHECK_LIB(${ost_cv_thread_library}, pthread_yield_np, AC_DEFINE(HAVE_PTHREAD_YIELD_NP, [1], [has np yield]),[ AC_CHECK_LIB(${ost_cv_thread_library}, pthread_yield, AC_DEFINE(HAVE_PTHREAD_YIELD, [1], [has yield]),[ AC_CHECK_LIB(${ost_cv_thread_library}, sched_yield, AC_DEFINE(HAVE_PTHREAD_SCHED_YIELD, [1], [has sched yield])) ]) ]) AC_CHECK_LIB(${ost_cv_thread_library}, pthread_cancel,[ AC_DEFINE(HAVE_PTHREAD_CANCEL, [1], [has cancel]) AC_CHECK_LIB(${ost_cv_thread_library}, pthread_setcanceltype, AC_DEFINE(HAVE_PTHREAD_SETCANCELTYPE, [1], [has setcanceltype]), AC_CHECK_LIB($ost_cv_thread_library, pthread_setcanel, AC_DEFINE(HAVE_PTHREAD_SETCANCEL, [1], [has setcancel]))) ],[ AC_CHECK_LIB(${ost_cv_thread_library}, pthread_setcanceltype,[ AC_DEFINE(HAVE_PTHREAD_CANCEL) AC_DEFINE(HAVE_PTHREAD_SETCANCELTYPE)]) ]) AC_CHECK_LIB(${ost_cv_thread_library}, pthread_delay_np, AC_DEFINE(HAVE_PTHREAD_DELAY_NP, [1], [has non portable delay])) fi UNAME=`uname` if test "$UNAME" = "AIX" ; then AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) CC=$PTHREAD_CC AC_DEFINE(COMMON_AIX_FIXES, [1], [aix fixes needed]) fi AH_BOTTOM([ #ifdef HAVE_THREAD_H #include "@thrprefix@/thread.h" #if defined(i386) && defined(__svr4__) && !defined(__sun) #define _THR_UNIXWARE #endif #if defined(__SVR4) && defined(__sun) #define _THR_SUNOS5 #else #if defined(__SVR4__) && defined(__SUN__) #define _THR_SUNOS5 #endif #endif #endif #ifdef HAVE_WORKING_SYS_ATOMIC_H #include #define HAVE_ATOMIC #elif defined(HAVE_ATOMIC_AIX) #include #ifndef HAVE_ATOMIC #define HAVE_ATOMIC #endif #endif #if defined(__cplusplus) #if defined(HAVE_GCC_BITS_ATOMIC) || defined(HAVE_GCC_CXX_BITS_ATOMIC) #include #define HAVE_ATOMIC #endif #endif #if defined(HAVE_PTHREAD_H) && ( defined(_THREAD_SAFE) || defined(_REENTRANT) ) #ifdef __QNX__ #define __EXT_QNX #endif #include #ifdef HAVE_PTHREAD_NP_H #include #endif #ifdef HAVE_SEMAPHORE_H #include #endif #ifdef _POSIX_PRIORITY_SCHEDULING #ifdef HAVE_SCHED_H #include #else #ifdef HAVE_SYS_SCHED_H #include #endif #endif #endif #define __PTHREAD_H__ #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #ifdef MUTEX_TYPE_COUNTING_FAST #define PTHREAD_MUTEXTYPE_RECURSIVE MUTEX_TYPE_COUNTING_FAST #endif #endif #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #ifdef PTHREAD_MUTEX_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE #endif #endif #ifndef HAVE_PTHREAD_MUTEXATTR_SETTYPE #if HAVE_PTHREAD_MUTEXATTR_SETKIND_NP #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP #endif #define pthread_mutexattr_gettype(x, y) pthread_mutexattr_getkind_np(x, y) #define pthread_mutexattr_settype(x, y) pthread_mutexattr_setkind_np(x, y) #endif #if HAVE_PTHREAD_MUTEXATTR_SETTYPE_NP #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEXTYPE_RECURSIVE_NP #endif #define pthread_mutexattr_settype(x, y) pthread_mutexattr_settype_np(x, y) #define pthread_mutexattr_gettype(x, y) pthread_mutexattr_gettype_np(x, y) #endif #endif #ifdef HAVE_PTHREAD_MACH_THREAD_NP #define _THR_MACH #endif #ifndef HAVE_PTHREAD_YIELD #ifdef HAVE_PTHREAD_YIELD_NP #define pthread_yield() pthread_yield_np() #define HAVE_PTHREAD_YIELD #endif #endif #ifndef HAVE_PTHREAD_YIELD #ifdef HAVE_PTHREAD_SCHED_YIELD #define pthread_yield() sched_yield() #define HAVE_PTHREAD_YIELD #endif #endif #ifndef HAVE_PTHREAD_DELAY #ifdef HAVE_PTHREAD_DELAY_NP #define HAVE_PTHREAD_DELAY #define pthread_delay(x) pthread_delay_np(x) #endif #if defined(HAVE_PTHREAD_NANOSLEEP) #ifndef HAVE_PTHREAD_DELAY #define HAVE_PTHREAD_DELAY #ifdef __FreeBSD__ #ifdef __cplusplus extern "C" int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); #endif #endif #define pthread_delay(x) nanosleep(x, NULL) #endif #endif #endif #ifdef HAVE_PTHREAD_ATTR_SETSTACK #ifndef PTHREAD_STACK_MIN #define PTHREAD_STACK_MIN 32768 #endif #endif #ifndef HAVE_PTHREAD_CANCEL #ifdef SIGCANCEL #define CCXX_SIG_THREAD_CANCEL SIGCANCEL #else #define CCXX_SIG_THREAD_CANCEL SIGQUIT #endif #define pthread_cancel(x) pthread_kill(x, CCXX_SIG_THREAD_CANCEL) #define pthread_setcanceltype(x, y) #define pthread_setcancelstate(x, y) #endif #ifndef HAVE_PTHREAD_SETCANCELTYPE #ifdef HAVE_PTHREAD_SETCANCEL enum { PTHREAD_CANCEL_ASYNCHRONOUS = CANCEL_ON, PTHREAD_CANCEL_DEFERRED = CANCEL_OFF}; enum { PTHREAD_CANCEL_ENABLE = CANCEL_ON, PTHREAD_CANCEL_DISABLE = CANCEL_OFF}; #define pthread_setcancelstate(x, y) \ (y == NULL) ? pthread_setcancel(x) : *y = pthread_setcancel #define pthread_setcanceltype(x, y) \ (y == NULL) ? pthread_setasynccancel(x) | *y = pthread_setasynccancel(x) #else #define pthread_setcanceltype(x, y) #define pthread_setcancelstate(x, y) #endif #endif #ifdef _AIX #ifdef HAVE_PTHREAD_SUSPEND #undef HAVE_PTHREAD_SUSPEND #endif #endif #endif ]) ]) commoncpp2-1.8.1/m4/ost_misc.m40000644000175000017500000000275611463360041013131 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_LIB_ZLIB],[ AC_REQUIRE([OST_SYS_POSIX]) ZSTREAM_LIBS="" ost_cv_lib_zlib=false AC_CHECK_HEADERS(zlib.h,[ ZSTREAM_LIBS="-lz" AC_DEFINE(HAVE_ZLIB_H, [1], [have zlib header]) ost_cv_lib_zlib=true]) AC_SUBST(ZSTREAM_LIBS) ]) AC_DEFUN([OST_LIB_NOZLIB],[ ZSTREAM_LIBS="" ost_cv_lib_zlib=false AC_SUBST(ZSTREAM_LIBS) ]) commoncpp2-1.8.1/m4/win32msc.m40000644000175000017500000000612211463364470012757 00000000000000dnl Check for M$-Compiler (C) 2000-2008 Fritz Elfert dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([NP_FIND_DOSENV],[ save_IFS="$IFS" $3=no IFS="," ENVVAR=`echo $$2 | tr ';' ','` for i in $ENVVAR ; do f=`cygpath -u "$i"` if test -r "$f/$1" ; then $3="$f" break fi done IFS="$save_IFS" ]) AC_DEFUN([NP_PROG_MSC],[ AC_ARG_WITH(wininc, [ --with-wininc=DIR define windows include directory], [win32inc="$withval"],[win32inc=no] ) AC_ARG_WITH(winlib, [ --with-winlib=DIR define windows lib directory], [win32lib="$withval"],[win32lib=no] ) AC_CACHE_CHECK(for MSC environment, np_cv_prog_msc, [ np_cv_prog_msc=no cat > conftest.c <&1` case "$RET" in conftest.c?) np_cv_prog_msc=yes ;; *) ;; esac ]) if test "x$np_cv_prog_msc" = "xyes" ; then if test "$win32inc" = "no" ; then AC_MSG_CHECKING(for Win32 include dir) NP_FIND_DOSENV(ras.h,INCLUDE,win32inc) AC_MSG_RESULT("$win32inc") fi if test "$win32inc" = "no" ; then AC_MSG_ERROR([Unable to get Win32 include dir from environment.]) AC_MSG_ERROR([use --with-wininc=DIR to set it manually]) fi if test "$win32lib" = "no" ; then AC_MSG_CHECKING(for Win32 lib dir) NP_FIND_DOSENV(wsock32.lib,LIB,win32lib) AC_MSG_RESULT("$win32lib") fi if test "$win32lib" = "no" ; then AC_MSG_ERROR([Unable to get Win32 lib dir from environment.]) AC_MSG_ERROR([use --with-winlib=DIR to set it manually]) fi CC="cl -nologo -GX -D__WIN32__ -D_MT -D_WIN32_WINNT=0x0400 -I$win32inc" CXX="cl -nologo -GX -D__WIN32__ -D_MT -D_WIN32_WINNT=0x0400 -I$win32inc" LD="link /libpath:$win32lib" AS=masm fi AM_CONDITIONAL(MSWIN32, test $np_cv_prog_msc = yes) ]) commoncpp2-1.8.1/m4/lt~obsolete.m40000644000175000017500000001311311463364506013662 00000000000000# 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])]) commoncpp2-1.8.1/m4/ltversion.m40000644000175000017500000000127711463364506013345 00000000000000# 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) ]) commoncpp2-1.8.1/m4/ost_reentrant.m40000644000175000017500000000553311463363141014200 00000000000000dnl Copyright (C) 1999-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_LIB_REENTRANT],[ reentrant_lib=${ost_cv_thread_library} if test -z "$reentrant_lib" ; then reentrant_lib=c_r fi if test "c" = "$reentrant_lib" ; then reentrant_lib=c_r fi if test "none" = "$reentrant_lib" ; then reentrant_lib=c_r fi AC_CHECK_FUNCS(setenv) AC_CHECK_LIB($reentrant_lib, localtime_r,[ AC_DEFINE(HAVE_STRTOK_R, [1], [reentrant strtok]) AC_DEFINE(HAVE_LOCALTIME_R, [1], [reentrant localtime])],[ AC_CHECK_LIB(c, strtok_r, AC_DEFINE(HAVE_STRTOK_R)) AC_CHECK_LIB(c, localtime_r, AC_DEFINE(HAVE_LOCALTIME_R)) ]) AC_CHECK_LIB($reentrant_lib, readdir_r,[ AC_DEFINE(HAVE_READDIR_R, [1], [reentrant readdir])],[ AC_CHECK_LIB(c, readdir_r, AC_DEFINE(HAVE_READDIR_R, [1])) ]) AC_CHECK_LIB($reentrant_lib, strerror_r,[ AC_DEFINE(HAVE_STRERROR_R, [1], [reentrant strerror])],[ AC_CHECK_LIB(c, strerror_r, AC_DEFINE(HAVE_STRERROR_R, [1])) ]) AC_CHECK_LIB($reentrant_lib, getpwuid_r,[ AC_DEFINE(HAVE_GETPWUID_R, [1], [reentrant getuid]) AC_DEFINE(HAVE_GETPWNAM_R, [1], [reentrant getnam])],[ AC_CHECK_LIB(c, getpwuid_r, AC_DEFINE(HAVE_GETPWUID_R)) AC_CHECK_LIB(c, getpwnam_r, AC_DEFINE(HAVE_GETPWNAM_R)) ]) AC_CHECK_LIB($reentrant_lib, getgrnam_r,[ AC_DEFINE(HAVE_GETGRNAM_R, [1], [reentrant getgrnam])],[ AC_CHECK_LIB(c, getgrnam_r, AC_DEFINE(HAVE_GETGRNAM_R)) ]) AH_BOTTOM([ #ifndef HAVE_STRERROR_R #define strerror_r(e, b, l) b = ::strerror(e) #endif #ifndef HAVE_GETPWUID_R #define getpwuid_r(uid, rec, buf, size, ptr) ptr = ::getpwuid(uid) #define getpwnam_r(name, rec, buf, size, ptr) ptr = ::getpwnam(name) #endif ]) ]) commoncpp2-1.8.1/m4/ltsugar.m40000644000175000017500000001042411463364506012773 00000000000000# 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 ]) commoncpp2-1.8.1/m4/ost_ssl.m40000644000175000017500000000364611463363466013014 00000000000000dnl Copyright (C) 2001-2005 Open Source Telecom Corporation. dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks. dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a configuration dnl script generated by Autoconf, you may include it under the same dnl distribution terms that you use for the rest of that program. AC_DEFUN([OST_LIB_NOSSL],[ SSL_LIBS="" AC_SUBST(SSL_LIBS) ]) AC_DEFUN([OST_LIB_SSL],[ SSL_LIBS="" # # WE CANNOT YET USE GNUTLS BECAUSE GNUTLS OPENSSL EMULATION DOES # NOT SUPPORT THREAD SAFETY, SO ssl.cpp MUST BE REWRITTEN TO USE # NATIVE GNUTLS API. # # AC_CHECK_HEADER(gnutls/gnutls.h,[ # AC_CHECK_LIB(gnutls, gnutls_init, [ # SSL_LIBS="-lgnutls -lgcrypt -ltasn1" # ost_cv_ssl=true # AC_DEFINE(CCXX_SSL, [GNUTLS], [defines ssl]) # AC_DEFINE(CCXX_GNUTLS, [1], [define gnutls]) # ]) # ],[ AC_CHECK_HEADER(openssl/ssl.h,[ SSL_LIBS="-lssl" ost_cv_ssl=true AC_DEFINE(CCXX_OPENSSL, [1], [define openssl]) AC_DEFINE(CCXX_SSL, [OPENSSL], [defines ssl]) ]) # ]) AC_SUBST(SSL_LIBS) ]) commoncpp2-1.8.1/THANKS0000644000175000017500000000234411463314527011443 00000000000000Thanks to Caros Vidal for the suggestion of hiding names rather than using namespace, and for things related to other changes made between 0.1.1 and 0.2.0. Thanks to John Conners for a lot of stuff to fix in the win32 tree. Thanks to Albert Hui for some notes on Solaris and changes for file. Thanks to Yurii Rashkovskii and the iCommunity Team for convincing me to add streams to TCP support and getting me to start the APE 2.0 project. Thanks to Olaf Hartig for TryWait and TryEnterMutex member functions. Thanks to Llya Kliot for the 1.2.x fixes for the win32 tree prior to the merger with the Common C++ project. Thanks to Sean Cavanaugh for AtomicCounter class. Thanks to Gianni Marianni for tcpservice chat server demo application, and for the poll patch. Thanks to Michael Furmanczyk for an alternate win32 mutex implimentation that is actually portable to all win32 "systems". Thanks to Henner Zeller for much of the work on the 1.2 release and beyond. Thanks to Rupert Curwen for Borland compile patches and some ansi fixes. Thanks to Mirko Ghersi for having found a problem on String class and provided a patch. Thanks to Stefano Canepa for providing VS2008 support. Thanks to Leandro de Sales for providing DCCP socket support. commoncpp2-1.8.1/TODO0000644000175000017500000000326011463314527011216 00000000000000Changes proposed for Common C++ 2.0: * Use uCommon Object/linking/containers/templates in place of Common C++ ones * Redo/simplify library naming/versioning conventions * Remove separation of ccext2/ccgnu2; uCommon will be used for embedded work * Add cmake build support Shorter term changes: * AppLog: using a better integration with commoncpp (slog?) * Merge 1.0.x and 1.1 beta together * Add debug stuff like threadnames, mutexnames, etc, which can be used when auditing for deadlocks. * Use "itimer" instead of alarm when available for higher resolution timing in setTimer/getTimer. * Determine more pthread targets which may allow SIGALRM to be used beyond Linux for multiple timer instances. * Optional support for Posix timers rather than alarm or setitimer for getTimer/setTimer when available on target platform. * Introduce "stream" support for Pipe. * Manual and overview documentation. * GNU PTH specific source tree. * redo exception handling * why Solaris use select instead of poll for TCPService ??? * cleanup configure.in and config.h (two configure for public and private?) WIN32 * merge Thread implementation (main cancellation) * serial support (Serial, TTYStream, ttystream, TTYSession, SerialPort, SerialService) * CommandOption and related class * fifostream, FIFOSession classes (use NamedPipe ??) or document not win32 support * completion mode in RandomFile * Conditional class TESTS * Detached behaviour - detached thread release all resources on termination - you can't wait termination of detached * Do not restart if already started * Test if Thread::isRunning say the truth (check all combination started suspended detached ended) commoncpp2-1.8.1/configure.ac0000644000175000017500000003021411463364477013024 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2010 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. AC_INIT(src/thread.cpp) AC_CONFIG_MACRO_DIR([m4]) m4_pattern_allow(LT_VERSION) VERSION="1.8.1" LT_RELEASE="1.8" LT_VERSION="0:1" dnl this is a C++ library after all.. AC_LANG(C++) # lsb build option ccincludedir="" ost_cv_thread_library="none" COMMON_FLAGS="-D_GNU_SOURCE" AC_ARG_WITH(lsb, [ --with-lsb=name Build lsb compliant package],[ if test ! -d "$prefix" ; then prefix="/opt/$withval" ; fi if test ! -d "$sysconfdir" ; then sysconfdir="/etc$prefix" ; fi if test ! -d "$localstatedir" ; then localstatedir="/var$prefix" ; fi AC_SUBST(prefix) CC=/opt/lsbdev-cc/bin/lsbcc AC_SUBST(CC) CXX=/opt/lsbdev-cc/bin/lsbc++ AC_SUBST(CXX) AC_SUBST(sysconfdir) AC_SUBST(localstatedir) ]) case "$prefix" in /opt/*) if test "$datadir" == '${prefix}/share' ; then if test "$mandir" == '${datadir}/man' ; then mandir='${prefix}/man' ; fi if test "$infodir" == '${datadir}/info' ; then infodir='${prefix}/info' ; fi datadir='${prefix}' fi if test "$sysconfdir" == '${prefix}/etc' ; then sysconfdir=/etc${prefix} ; fi if test "$localstatedir" == '${prefix}/var' ; then localstatedir=/var${prefix} ; fi if test "$includedir" == '${prefix}/include' ; then ccincludedir="$includedir" ; fi AC_SUBST(mandir) AC_SUBST(infodir) AC_SUBST(sysconfdir) AC_SUBST(localstatedir) AC_SUBST(datadir) AC_SUBST(prefix) ;; esac if test -z "$ccincludedir" ; then case "$includedir" in */lib/*) ccincludedir='${includedir}' ;; *) ccincludedir='${includedir}/cc++2' ;; esac fi AC_SUBST(ccincludedir) AC_CONFIG_AUX_DIR(autoconf) AC_CANONICAL_SYSTEM AC_PROG_CPP AC_PROG_CC AC_PROG_CXXCPP AC_PROG_CXX OST_PROG_CC_POSIX NP_PROG_MSC AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL AM_INIT_AUTOMAKE(commoncpp2, [$VERSION]) AM_CONFIG_HEADER(config.h) AC_C_RESTRICT AC_C_VOLATILE AC_C_INLINE AH_TOP( #ifndef CCXX_CONFIG_H_ #define CCXX_CONFIG_H_ #define __DLL #define __EXPORT_TEMPLATE(x) #undef CCXX_EMPTY #define CCXX_EMPTY #define COMMON_64_CLEAN #define COMMON_ASYNC_OVERRIDE #define COMMON_OST_NAMESPACE #define COMMON_THREAD_SLEEP #define COMMON_NET_DEVICES #define COMMON_THREAD_DEBUG #define COMMON_DEADLOCK_DEBUG #define COMMON_NAMED_MUTEX #define COMMON_PROCESS_ATTACH #define COMMON_XML_PARSING #define COMMON_TIMER_SLEEP #if __GNUC__ > 1 && !defined(__STRICT_ANSI__) && !defined(__PEDANTIC__) #define DYNAMIC_LOCAL_ARRAYS #endif #if defined(__CYGWIN__) #define _POSIX_REALTIME_SIGNALS #define _POSIX_THREADS #endif #if defined(__APPLE__) && defined(__MACH__) #ifndef MACOSX #define MACOSX #define _P1003_1B_VISIBLE #endif #ifndef _PTHREADS #define _PTHREADS 1 #endif #endif #if defined(__FreeBSD__) #ifndef __BSD_VISIBLE #define __BSD_VISIBLE 1 #endif #endif #ifdef _AIX #ifndef _ALL_SOURCE #define _ALL_SOURCE #endif #endif #ifdef __hpux #ifndef _XOPEN_SOURCE_EXTENDED #define _XOPEN_SOURCE_EXTENDED #endif #ifndef _INCLUDE_LONGLONG #define _INCLUDE_LONGLONG #endif #endif #define CCXX_PACKING #if defined(__GNUC__) #define CCXX_PACKED #elif !defined(__hpux) && !defined(_AIX) #define CCXX_PACKED #endif #if defined(__sun) || defined(__SUN__) #define __EXTENSIONS__ 1 #endif #ifndef _REENTRANT #define _REENTRANT 1 #endif #ifndef _THREAD_SAFE #define _THREAD_SAFE 1 #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif #if !defined(_XOPEN_SOURCE) && !defined(__FreeBSD__) &&!defined(__OpenBSD__) && !defined(__MACH__) && !defined(__NetBSD__) #define _XOPEN_SOURCE 600 #endif ) if test "$prefix" != "/usr" ; then if test -d "$prefix" ; then bprefix="$prefix" else if test "$GCC" = "no" ; then bprefix=/usr/local ; fi fi if test -d $bprefix/include ; then COMMON_FLAGS="$COMMON_FLAGS -I$bprefix/include" fi if test -d $bprefix/lib ; then LIBS="$LIBS -L$bprefix/lib" fi fi OST_PROG_COMMON OST_PROG_LIBVER OST_PROG_LIBRARY(CCXX,[$LT_VERSION]) OST_AUTOMAKE_MODE OST_MAINTAINER_MODE OST_WINVER OST_WIN32 OST_CC_FCNTL OST_CC_SYSTIME OST_CC_TYPES OST_CC_ENDIAN OST_CC_SIGNAL OST_CC_STRING OST_CC_GETOPT OST_CC_DYNAMIC OST_LIB_PTHREAD OST_LIB_REENTRANT OST_LIB_POLL OST_SYS_SOCKET ost_cv_ssl=no AC_ARG_WITH(monotonic, [ --without-monotonic Disable monotonic clock], [],[AC_DEFINE(USE_MONOTONIC_TIMER, [1], [use monotonic]) ]) AC_ARG_WITH(extras, [ --without-extras Disables extras lib],[ OST_LIB_NOZLIB OST_LIB_NOXML ost_cv_extras=no ],[ ost_cv_extras=yes AC_DEFINE(HAVE_EXTRAS, [1], [Enable extras]) AC_ARG_WITH(gnutls, [ --with-gnutls Enable gnutls support], [ AC_CHECK_HEADER(gnutls/gnutls.h,[ AC_CHECK_LIB(gnutls, gnutls_init, [ SSL_LIBS="-lgnutls -lgcrypt" ost_cv_ssl=true AC_DEFINE(CCXX_SSL, [GNUTLS], [defines ssl]) AC_DEFINE(CCXX_GNUTLS, [1], [define gnutls]) ]) ],[]) ],[ AC_ARG_WITH(openssl, [ --with-openssl Enable openssl support], [OST_LIB_SSL], [OST_LIB_NOSSL]) ]) AC_ARG_WITH(compression, [ --without-compression Disable libz compression], [OST_LIB_NOZLIB], [OST_LIB_ZLIB]) ]) AC_ARG_WITH(memaudit, [ --with-memaudit Enable memory auditing], [AC_DEFINE(COMMON_MEMORY_AUDIT, [1], [enable auditing])]) AC_ARG_WITH(cppunit, [ --with-cppunit Build cppunit based test suite],[ if test "$withval" != "yes"; then CPPUNIT_LIBS="-l$withval" else CPPUNIT_LIBS="-lcppunit" fi ],[ CPPUNIT_LIBS=" " ]) AC_SUBST(CPPUNIT_LIBS) AM_CONDITIONAL(WITH_CPPUNIT_TESTS, test "$CPPUNIT_LIBS" != " ") AC_CHECK_HEADERS(sys/file.h sys/param.h sys/wait.h syslog.h syslog.hposix_evlog.h ss.h ioctl.h) AC_CHECK_FUNCS(realpath lstat snprintf memmove strdup lockf waitpid wait4 gettimeofday) AC_CHECK_FUNCS(posix_memalign setegid setpgrp getpagesize) # C++ stuff must done after library and header # (some C++ define require some header) OST_CXX_PROGRAMMING # allow build of library without exception handling, for use in # dedicated targets, etc... AC_ARG_WITH(exceptions, [ --without-exceptions Disable exception handling], [OST_CXX_NOEXCEPTIONS], [OST_CXX_EXCEPTIONS] ) OST_CXX_MUTABLE OST_CXX_NAMESPACE OST_CXX_IOSTREAM OST_CXX_NEW_INIT OST_SGI_STLPORT # Are we using the GNU compiler? if test "$GCC" = yes ; then WARN_FLAGS="-pedantic -Wall" else WARN_FLAGS="" fi AC_SUBST(WARN_FLAGS) OST_DEBUG if test $ost_cv_gnuwin32 = yes ; then CCXX_DIR="\$(top_srcdir)/w32" else if test $np_cv_prog_msc = yes ; then CCXX_DIR="\$(top_srcdir)/w32" else CCXX_DIR="\$(top_srcdir)/inc" fi fi KDOC_DIR="\$(top_srcdir)/doc" AC_SUBST(LT_RELEASE) AC_SUBST(KDOC_DIR) AC_SUBST(CCXX_DIR) AC_SUBST(incprefix) AM_CONDITIONAL(WIN32, test $ost_cv_gnuwin32 = yes) AM_CONDITIONAL(EXTRAS, test $ost_cv_extras = yes) AC_SUBST(ost_cv_dynloader) # some peculiar things needed for cygwin dll builds and the currently broken toolchain... SHARED_FLAGS="" MODULE_FLAGS="-module -shared -avoid-version" STAGE2="" BASE_LIB="" case "$target_os" in osf*) COMMON_FLAGS="$COMMON_FLAGS -D_POSIX_C_SOURCE=1 -D_OSF_SOURCE=1 -D__USE_STD_IOSTREAM" ;; cygwin*|mingw*) BASE_LIB="../src/libccgnu2.la $XML_LIBS $ZSTREAM_LIBS $SSL_LIBS" AC_DEFINE(CYGWIN_IMPORTS, [1], [cygwin environment]) SHARED_FLAGS="-no-undefined" MODULE_FLAGS="-module -shared -avoid-version -no-undefined" ;; darwin6*) MODULE_FLAGS="-dynamic -bundle -undefined suppress -flat_namespace -read_only_relocs suppress" STAGE2="macosx" AC_DEFINE(_DARWIN6_, [1], [darwin6 environment]) ;; darwin*) MODULE_FLAGS="-dynamic -bundle -undefined suppress -flat_namespace -read_only_relocs suppress" ;; linux*) BASE_LIB="../src/libccgnu2.la" ;; esac AC_SUBST(COMMON_FLAGS) AC_SUBST(SHARED_FLAGS) AC_SUBST(MODULE_FLAGS) AC_SUBST(BASE_LIB) AC_SUBST(STAGE2) AC_SUBST(sysconfdir) AC_SUBST_DIR(etc_confdir, sysconfdir) if test "$sysconfdir" != '${prefix}/etc' ; then AC_DEFINE_UNQUOTED(ETC_PREFIX, "$etc_confdir/", [system config prefix]) elif test "$sysconfdir" != '/etc' ; then AC_DEFINE_UNQUOTED(ETC_CONFDIR, "$etc_confdir/", [primary config prefix]) fi AH_BOTTOM([ #ifdef HAVE_SS_H #include #define COMMON_SECURE #endif #define COMMON_NAMESPACE ost #define NAMESPACE_COMMON namespace ost { #define END_NAMESPACE } #ifdef HAVE_VISIBILITY #define __EXPORT __attribute__ ((visibility("default"))) #define __DLLRTL __attribute__ ((visibility("default"))) #define __LOCAL __attribute__ ((visibility("hidden"))) #else #define __EXPORT #define __DLLRTL #define __LOCAL #endif #ifndef ETC_PREFIX #ifdef WIN32 #define ETC_PREFIX "C:\\WINDOWS\\" #endif #ifndef ETC_PREFIX #define ETC_PREFIX "/etc/" #endif #endif #endif ]) AC_PATH_PROG(DOXYGEN, doxygen, no) AC_SUBST(DOXYGEN) AM_CONDITIONAL(DOXY, test "$DOXYGEN" != "no") AM_CONDITIONAL(GETOPT_LONG, [test ! -z "$LIBGETOPTOBJS"]) LIB_VERSION=`echo $LT_RELEASE | sed -e 's/[\.]/_/'` LIB_MAJOR=`echo $LT_VERSION | sed -e 's/[:].*$//'` AC_SUBST(LIB_VERSION) AC_SUBST(LIB_MAJOR) AC_OUTPUT([src/ccgnu2-config src/libccext2.pc src/libccgnu2.pc src/Makefile w32/Makefile w32/vs2008/Makefile w32/vs2008/ccext2.vcproj w32/vs2008/ccgnu2.vcproj w32/vs2008/common.sln m4/Makefile doc/Doxyfile doc/Makefile demo/Makefile inc/Makefile inc/cc++/Makefile Makefile commoncpp2.spec tests/Makefile commoncpp2.list w32/ccgnu2.dsp w32/ccext2.dsp w32/ccgnu2.vcproj w32/ccext2.vcproj]) # if test ! -f inc/cc++/thread.h ; then # cp ${srcdir}/inc/cc++/*.h inc/cc++ ; fi cd inc rm -f config.tmp cp ../config.h config.tmp sed -e s!"@thrprefix@"!"$thrprefix"! -e s!"@USR_PREFIX@"!"$prefix"! \ -e s!PACKAGE!CCXX_PACKAGE! -e s!VERSION!CCXX_VERSION! cc++/config.h cd .. # # Visual Studio # DLLVERSION=`echo "$LT_RELEASE" | sed -e 's/\.//'g` # # Visual Studio 2008 # rm -f w32/vs2008/ccext2.vcproj.tmp w32/vs2008/ccgnu2.vcproj.tmp cp -p w32/vs2008/ccext2.vcproj w32/vs2008/ccext2.vcproj.tmp cp -p w32/vs2008/ccgnu2.vcproj w32/vs2008/ccgnu2.vcproj.tmp sed -e s/VCVERSION/$VERSION/g < w32/vs2008/ccext2.vcproj.tmp > w32/vs2008/ccext2.vcproj sed -e s/VCVERSION/$VERSION/g < w32/vs2008/ccgnu2.vcproj.tmp > w32/vs2008/ccgnu2.vcproj cp -p w32/vs2008/ccext2.vcproj w32/vs2008/ccext2.vcproj.tmp cp -p w32/vs2008/ccgnu2.vcproj w32/vs2008/ccgnu2.vcproj.tmp sed -e s/DLLVERSION/$DLLVERSION/g < w32/vs2008/ccext2.vcproj.tmp > w32/vs2008/ccext2.vcproj sed -e s/DLLVERSION/$DLLVERSION/g < w32/vs2008/ccgnu2.vcproj.tmp > w32/vs2008/ccgnu2.vcproj rm -f w32/vs2008/ccext2.vcproj.tmp w32/vs2008/ccgnu2.vcproj.tmp # # Visual Studio 2005 # rm -f w32/ccext2.vcproj.tmp w32/ccgnu2.vcproj.tmp cp -p w32/ccext2.vcproj w32/ccext2.vcproj.tmp cp -p w32/ccgnu2.vcproj w32/ccgnu2.vcproj.tmp sed -e s/VCVERSION/$VERSION/g < w32/ccext2.vcproj.tmp > w32/ccext2.vcproj sed -e s/VCVERSION/$VERSION/g < w32/ccgnu2.vcproj.tmp > w32/ccgnu2.vcproj cp -p w32/ccext2.vcproj w32/ccext2.vcproj.tmp cp -p w32/ccgnu2.vcproj w32/ccgnu2.vcproj.tmp sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccext2.vcproj.tmp > w32/ccext2.vcproj sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccgnu2.vcproj.tmp > w32/ccgnu2.vcproj rm -f w32/ccext2.vcproj.tmp w32/ccgnu2.vcproj.tmp # # Visual Studio 6 # rm -f w32/ccext2.dsp.tmp w32/ccgnu2.dsp.tmp cp -p w32/ccext2.dsp w32/ccext2.dsp.tmp cp -p w32/ccgnu2.dsp w32/ccgnu2.dsp.tmp sed -e s/VCVERSION/$VERSION/g < w32/ccext2.dsp.tmp > w32/ccext2.dsp sed -e s/VCVERSION/$VERSION/g < w32/ccgnu2.dsp.tmp > w32/ccgnu2.dsp cp -p w32/ccext2.dsp w32/ccext2.dsp.tmp cp -p w32/ccgnu2.dsp w32/ccgnu2.dsp.tmp sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccext2.dsp.tmp > w32/ccext2.dsp sed -e s/DLLVERSION/$DLLVERSION/g < w32/ccgnu2.dsp.tmp > w32/ccgnu2.dsp rm -f w32/ccext2.dsp.tmp w32/ccgnu2.dsp.tmp commoncpp2-1.8.1/commoncpp2.list0000644000175000017500000000352611463364532013506 00000000000000# Directories... $prefix=/usr $exec_prefix=${prefix} $bindir=${exec_prefix}/bin $confdir=/etc $docdir=/usr/doc $mandir=${prefix}/share/man $datadir=${prefix}/share $libdir=${exec_prefix}/lib64 $srcdir=. $includedir=${prefix}/include $infodir=${prefix}/share/info # Product information %product GNU Common C++ %version 1.8.1 -100 %copyright 1999-2003 Open Source Telecom Corporation %vendor Open Source Telecom Corp %license COPYING %readme README %description GNU Common C++ class libraries %requires libxml2 0.0 0 999.99.99p99 2147483647 f 0755 root root ${bindir}/ccgnu2-config src/ccgnu2-config f 0644 root root ${datadir}/aclocal/ost_check2.m4 src/ost_check2.m4 f 0644 root root ${libdir}/pkgconfig/libccgnu2.pc src/libccgnu2.pc f 0644 root root ${libdir}/pkgconfig/libccext2.pc src/libccext2.pc d 0755 root root ${includedir}/cc++2 - d 0755 root root ${includedir}/cc++2/cc++ - f 0644 root root ${includedir}/cc++2/cc++ include/cc++/*.h f 0644 root root ${includedir}/cc++2/cc++ template/*.h f 0644 root root ${libdir} ./src/*.la f 0644 root root ${libdir} ./src/.libs/*.a %system darwin f 0644 root root ${libdir} ./src/.libs/libccgnu2-1.8.1.dylib f 0644 root root ${libdir} ./src/.libs/libccext2-1.8.1.dylib l 0644 root root ${libdir}/libccgnu2.dylib libccgnu2-1.8.1.dylib l 0644 root root ${libdir}/libccext2.dylib libccext2-1.8.1.dylib l 0644 root root ${libdir}/libccgnu2.dylib-1.8.1.0.1.dylib libccgnu2-1.8.1.dylib l 0644 root root ${libdir}/libccext2.dylib-1.8.1.0.1.dylib libccext2-1.8.1.dylib %system freebsd f 0644 root root ${libdir} ./src/.libs/libccgnu2-1.8.so.* f 0644 root root ${libdir} ./src/.libs/libccext2-1.8.so.* %system linux solaris f 0644 root root ${libdir} ./src/.libs/libccgnu2-1.8.so.*.*.* f 0644 root root ${libdir} ./src/.libs/libccext2-1.8.so.*.*.* %system linux freebsd %postinstall /sbin/ldconfig %postremove /sbin/ldconfig %system all commoncpp2-1.8.1/INSTALL0000644000175000017500000001722711463314527011567 00000000000000Basic 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, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). 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 at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' 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. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure 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 supports 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' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' 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' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM 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 host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. 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. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--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. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. commoncpp2-1.8.1/commoncpp2.spec.in0000644000175000017500000000522211463314527014064 00000000000000%{!?release: %define release 0} %{!?version: %define version @VERSION@} %define _libname libcommoncpp2-@LIB_VERSION@-@LIB_MAJOR@ %define _devname libcommoncpp2-devel Name: commoncpp2 Summary: "commoncpp2" - A GNU package for creating portable C++ programs Version: %{version} Release: %{release}%{?dist} License: RGPL v2 or later Group: Development/Libraries URL: http://www.gnu.org/software/commoncpp/commoncpp.html Source0: ftp://ftp.gnu.org/gnu/commoncpp/commoncpp2-%{PACKAGE_VERSION}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root Requires: gnutls Requires: zlib Requires: libstdc++ Prereq: /sbin/install-info BuildRequires: gnutls-devel BuildRequires: zlib-devel BuildRequires: libstdc++-devel BuildRequires: doxygen BuildRequires: info %description GNU Common C++ offers portable abstraction of system services such as threads and sockets. GNU Common C++ also provides a threadsafe class framework for strings, config file and XML parsing, and object serialization. %package -n %{_libname} Group: System/Libraries Summary: Runtime libraries for GNU Common C++ threading and sockets Provides: %{name} = %{version}-%{release} %package -n %{_devname} Requires: %{_libname} = %{version}-%{release} Requires: libxml2-devel Requires: zlib-devel Requires: libstdc++-devel Requires(post,postun): info Group: Development/Libraries Summary: Headers and static link library for commoncpp2 Provides: %{name}-devel = %{version}-%{release} %package doc Requires: commoncpp2 = %{version} Summary: Class documentation for GNU Common C++ Group: Documentation %description -n %{_libname} This package contains the runtime library needed by applications that use GNU Common C++. %description -n %{_devname} This package provides the header files, link libraries and documentation for building GNU Common C++ applications. %description doc This includes doxygen generated class references for the GNU Common C++ library. %prep %setup %build %configure %{__make} %{?_smp_mflags} CXXFLAGS="$RPM_OPT_FLAGS" %install %{__mkdir} -p %{buildroot}/%{_mandir}/man3 %makeinstall %{__strip} %{buildroot}/%{_libdir}/lib*.so.*.* %clean %{__rm} -fr %{buildroot} %files -n %{_libname} %defattr(-,root,root,-) %doc AUTHORS COPYING COPYING.addendum NEWS README TODO ChangeLog %{_libdir}/*.so.* %files -n %{_devname} %defattr(-,root,root,-) %doc doc/html/*.html doc/html/*.*g* %{_libdir}/*.a %{_libdir}/*.so %{_libdir}/*.la %dir %{_includedir}/cc++ %{_includedir}/cc++/*.h %{_bindir}/* %{_infodir}/commoncpp2.info* %{_datadir}/aclocal/*.m4 %{_libdir}/pkgconfig/*.pc %files doc %defattr(-,root,root,-) %doc doc/html/* %post -n %{_libname} -p /sbin/ldconfig %postun -n %{_libname} -p /sbin/ldconfig commoncpp2-1.8.1/commoncpp2.spec0000644000175000017500000000517211463364532013464 00000000000000%{!?release: %define release 0} %{!?version: %define version 1.8.1} %define _libname libcommoncpp2-1_8-0 %define _devname libcommoncpp2-devel Name: commoncpp2 Summary: "commoncpp2" - A GNU package for creating portable C++ programs Version: %{version} Release: %{release}%{?dist} License: RGPL v2 or later Group: Development/Libraries URL: http://www.gnu.org/software/commoncpp/commoncpp.html Source0: ftp://ftp.gnu.org/gnu/commoncpp/commoncpp2-%{PACKAGE_VERSION}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root Requires: gnutls Requires: zlib Requires: libstdc++ Prereq: /sbin/install-info BuildRequires: gnutls-devel BuildRequires: zlib-devel BuildRequires: libstdc++-devel BuildRequires: doxygen BuildRequires: info %description GNU Common C++ offers portable abstraction of system services such as threads and sockets. GNU Common C++ also provides a threadsafe class framework for strings, config file and XML parsing, and object serialization. %package -n %{_libname} Group: System/Libraries Summary: Runtime libraries for GNU Common C++ threading and sockets Provides: %{name} = %{version}-%{release} %package -n %{_devname} Requires: %{_libname} = %{version}-%{release} Requires: libxml2-devel Requires: zlib-devel Requires: libstdc++-devel Requires(post,postun): info Group: Development/Libraries Summary: Headers and static link library for commoncpp2 Provides: %{name}-devel = %{version}-%{release} %package doc Requires: commoncpp2 = %{version} Summary: Class documentation for GNU Common C++ Group: Documentation %description -n %{_libname} This package contains the runtime library needed by applications that use GNU Common C++. %description -n %{_devname} This package provides the header files, link libraries and documentation for building GNU Common C++ applications. %description doc This includes doxygen generated class references for the GNU Common C++ library. %prep %setup %build %configure %{__make} %{?_smp_mflags} CXXFLAGS="$RPM_OPT_FLAGS" %install %{__mkdir} -p %{buildroot}/%{_mandir}/man3 %makeinstall %{__strip} %{buildroot}/%{_libdir}/lib*.so.*.* %clean %{__rm} -fr %{buildroot} %files -n %{_libname} %defattr(-,root,root,-) %doc AUTHORS COPYING COPYING.addendum NEWS README TODO ChangeLog %{_libdir}/*.so.* %files -n %{_devname} %defattr(-,root,root,-) %doc doc/html/*.html doc/html/*.*g* %{_libdir}/*.a %{_libdir}/*.so %{_libdir}/*.la %dir %{_includedir}/cc++ %{_includedir}/cc++/*.h %{_bindir}/* %{_infodir}/commoncpp2.info* %{_datadir}/aclocal/*.m4 %{_libdir}/pkgconfig/*.pc %files doc %defattr(-,root,root,-) %doc doc/html/* %post -n %{_libname} -p /sbin/ldconfig %postun -n %{_libname} -p /sbin/ldconfig commoncpp2-1.8.1/doc/0000755000175000017500000000000011463572774011364 500000000000000commoncpp2-1.8.1/doc/commoncpp2.texi0000644000175000017500000015534711463314535014260 00000000000000\input texinfo @c -*-texinfo-*- @c %** start of header @setfilename commoncpp2.info @settitle GNU Common C++ 2 @afourpaper @setchapternewpage odd @documentlanguage en @documentencoding ISO-8859-1 @c %** end of header @set EDITION 1.0pre0 @set VERSION 1.0 @set UPDATED September 2002 @dircategory Development @direntry * GNU Common C++ 2: (commoncpp2). GNU Common C++ 2 Framework Documentation. @end direntry @c ----------------------------------------------------------------------- @c %** start of summary description and copyright @ifnottex GNU Common C++ 2 is the second major release of a C++ framework offering portable support for threading, sockets, file access, daemons, persistence, serial I/O, XML parsing, and system services, initially started by David Sugar and Daniel Silverstone. Copyright @copyright{} 1999, 2000, 2001, 2002 Open Source Telecom Corporation. @include fdlnotice.texi @end ifnottex @c %** end of summary description and copyright @c ----------------------------------------------------------------------- @c %** start of title and copyright page @shorttitlepage @titlefont{GNU Common C++ 2} @titlepage @sp 10 @title GNU Common C++ 2 @subtitle @subtitle @value{EDITION}th Edition, covering GNU Common C++ version @value{VERSION} @subtitle @value{UPDATED} @author David Sugar wrote this document. @author Federico Montesino Pouzols updated and formatted it in @TeX{}Info @page @vskip 0pt plus 1filll @center{Copyright @copyright{} 1999, 2000, 2001, 2002 Open Source Telecom Corporation} @include fdlnotice.texi @page @end titlepage @c %** end of title and copyright page @c ----------------------------------------------------------------------- @c %** start of top node and master menu @ifnottex @node Top @top This document describes GNU Common C++ 2, the second major release of a C++ framework offering portable support for threading, sockets, file access, daemons, persistence, serial I/O, XML parsing, and system services, initially started by David Sugar and Daniel Silverstone. This is the edition @value{EDITION} of this manual and documents GNU Common C++ 2 version @value{VERSION}. @end ifnottex @contents @menu * Introduction:: What GNU Common C++ and this manual are. * Distribution:: How to get GNU Common C++. * Framework Description:: GNU Common C++ classes. * Extras:: GNU Common C++ extras. * Serverlets:: GNU Common C++ serverlets. * Compiler Options:: Compiler options to use with GNU Common C++. * Automake Services:: GNU Common C++ automake services. * Configuring Sources:: Configuring GNU Common C++ sources. * Developer Documentation:: Information of interest for CC++ developers. * Licenses:: Library and documentation licenses. * Class and Data Type Index:: Index of Common C++ classes and data types. * Method and Function Index:: Index of Common C++ methods and functions. * Concept Index:: Index of concepts. @end menu @c %** end of top node and master menu @c ----------------------------------------------------------------------- @c %** start of body @node Introduction @comment node-name, next, previous, up @chapter Introduction @cindex Introduction @quotation @strong{PLEASE NOTE;} This is a preliminary version of this document. Some information may not be complete or even somewhat obsolete; bug reports, suggestions and contributions are welcome. @end quotation @cindex reference manual In writing this document I hope to better explain what the GNU Common C++ library is about and how it may be used in developing your own C++ applications. This document is intended as an overview and unifying document to support the already detailed class-by-class function descriptions found and browsable in the "doc" subdirectory of the Common C++ distribution. GNU Common C++ offers a set of "portable" classes that can be used to build highly portable applications in C++. In particular, Common C++ offers classes that abstract threading, sockets, synchronization, serial I/O, "config" file parsing, class object persistence, shared object module loading, daemon management, and optimized "block" and memory mapped file I/O under a set of consistent classes that your application can then be built from. The goal is to write your application to use the portable abstract services and classes of the GNU Common C++ libraries rather than having to access low level system services directly. There is a large diversity of views in how one should code a C++ framework. Since a large number of older C++ compilers remain in everyday use, I choose to use what I felt was an appropriate set of C++ language features and practices to provide the greatest compiler compatibility and to generate the most optimized code for GNU Common C++. To further reduce the overhead of writing GNU Common C++ applications, I have split the primary library image itself into several different shared libraries. This allowed me to collect the more obscure and less likely to be used features into separate libraries which need never be loaded. Finally, in designing GNU Common C++, I assume that class extension (inheritance) is the primary vehicle for application development. The GNU Common C++ framework, while offering many classes that are usable directly, is designed for one to create applications by extending Common C++ "base" classes into an application specific versions of said classes as needed. @c ----------------------------------------------------------------------- @node Distribution @chapter Distribution @cindex distribution @cindex free software @cindex GNU GPL @cindex linking exception @cindex GNU FDL @cindex philosophy This manual is licensed under the terms of the @acronym{GNU} Free Documentation License, @xref{GNU Free Documentation License}. @acronym{GNU} Common C++ is free software (see @url{http://www.gnu.org/philosophy/philosophy.html}). There are several ways to get @acronym{GNU} Common C++, refer to @url{http://www.gnu.org} and @url{http://www.gnu.org/software/commoncpp/}. The @acronym{GNU} Common C++ framework is licensed under the terms of the @acronym{GNU} General Public License, @xref{GNU General Public License}, plus a linking exception, @xref{GNU Common C++ Linking Exception}, that grants additional privileges. These privileges are similar to the terms Guile is licensed under and constitute privileges similar to the LGPL. David Sugar explains why these licensing terms were chosen for Common C++ as follows: The one problem I recall immediately with the LGPL as it applies to C++ class frameworks is the way it defines and refers to ``linking'' vs ``derived works''. In concept, a C++ header with inline members or template is not ``linked'' in the same sense as one might presume the meaning in traditional C library, and what does one make of a class who's base class is defined in a header in a LGPL protected library? Is creating a derived C++ class purely a linking operation or creating a derived/composite work? At the time it seemed simpler to take the language of the GPL and provide an appropriate privileges to allow Common C++ to be used in ways that achieve the same goals of the LGPL, but without using the same choice of language for this that is found in the LGPL. We actually looked at the Guile license, which also faced many of these questions, and choose to use their methodology for creating a special privilege in this regard. Of course, this was a number of years ago, and the language of the LGPL (and GPL) has evolved over time to better address the needs of object oriented frameworks. If the language of the current LGPL were close enough to resolving these goals, I think we would likely switch to it, as that would resolve some confusion over the exact license status. I have found it simpler to explain it as a LGPL-like license since we were trying for much the same effect within the context of a C++ framework, and most people basically understand what the LGPL is. @c ----------------------------------------------------------------------- @node Framework Description @chapter Framework Description @cindex Framework Description This chapter provides a description of the GNU Common C++ framework main components. @menu * Overall Concepts:: Global GNU Common C++ Practices. * Threading Concepts:: GNU Common C++ Threading Concepts. * Synchronization:: GNU Common C++ Synchronization. * Sockets:: GNU Common C++ Sockets. * Serial I/O:: GNU Common C++ Serial I/O. * Block I/O:: GNU Common C++ Block I/O. * Daemons:: GNU Common C++ Daemon Support. * Persistence:: GNU Common C++ Persistence. * Configuration and Misc.:: GNU Common C++ Configuration and Other Things. * Numbers and Dates:: GNU Common C++ Numbers and Dates Manipulation. * URL Streams:: GNU Common C++ HTTP Support. * XML Streams and RPC:: GNU Common C++ XML Streams and RPC. * Exceptions:: GNU Common C++ Exception Model. * Templates:: GNU Common C++ Template Subsystem @end menu @c ----------------------------------------------------------------------- @node Overall Concepts @section Overall Concepts @cindex Overall Concepts @cindex ost @cindex ost namespace @cindex namespace Unless explicitly stated, all GNU Common C++ symbols are under the @code{ost} namespace@footnote{Provided the C++ compiler used to compile GNU Common C++ suupports namespaces, which is checked at configuration time.}. Thus, when we refer to the Thread class, we actually refer to ost::Thread. The GNU Common C++ framework actually consists of two libraries: @file{ccgnu2} and @file{ccext2}@footnote{@xref{Compiler Options}, for how to specify compiling and linking options for these libraries. On Win32 systems, these libraries are compiled as @file{ccgnu2.dll} and @file{ccext2.dll}}. The first includes core functionality that other things commonly depend on, such as threading and synchronization. That way, if you are building a tight application with a small footprint, you can have it used the ccgnu2 shared image alone. On the contrary, things that require or induce new library link requirements are included in @file{ccext2}. Hence, for example, if you do not wish to use XML parsing in your application, why create an unused library dependency for libxml2? The idea being that one can, if one needs to, use only ``core'' features found in ccgnu2 and then create very compact executables with very few additional library dependencies. @c ----------------------------------------------------------------------- @node Threading Concepts @section Threading Concepts @cindex Threading Concepts @cindex threading @cindex APE @cindex Java threading Threading was the first part of GNU Common C++ I wrote, back when it was still the APE library. My goal for GNU Common C++ threading has been to make threading as natural and easy to use in C++ application development as threading is in Java. With this said, one does not need to use threading at all to take advantage of GNU Common C++. However, all GNU Common C++ classes are designed at least to be thread-aware/thread-safe as appropriate and necessary. @cindex pthread @cindex ost_pthread.m4 @cindex autoconf GNU Common C++ threading is currently built either from the Posix "pthread" library or using the win32 SDK. In that the Posix "pthread" draft has gone through many revisions, and many system implementations are only marginally compliant, and even then usually in different ways, I wrote a large series of autoconf macros found in ost_pthread.m4 which handle the task of identifying which pthread features and capabilities your target platform supports. In the process I learned much about what autoconf can and cannot do for you. @cindex GNU pth @cindex pth Currently the GNU Portable Thread library (GNU pth) is not directly supported in GNU Common C++. While GNU "Pth" doesn't offer direct native threading support or benefit from SMP hardware, many of the design advantages of threading can be gained from it's use, and the Pth pthread "emulation" library should be usable with GNU Common C++. In the future, GNU Common C++ will directly support Pth, as well as OS/2 and BeOS native threading API's. @cindex threading model GNU Common C++ itself defines a fairly "neutral" threading model that is not tied to any specific API such as pthread, win32, etc. This neutral thread model is contained in a series of classes which handle threading and synchronization and which may be used together to build reliable threaded applications. @tindex Thread @findex Thread::run @cindex execution context @cindex termination @cindex thread termination GNU Common C++ defines application specific threads as objects which are derived from the GNU Common C++ "Thread" base class. At minimum the "run" method must be implemented, and this method essentially is the "thread", for it is executed within the execution context of the thread, and when the run method terminates the thread is assumed to have terminated. @cindex priority @cindex thread priority GNU Common C++ allows one to specify the running priority of a newly created thread relative to the "parent" thread which is the thread that is executing when the constructor is called. Since most newer C++ implementations do not allow one to call virtual constructors or virtual methods from constructors, the thread must be "started" after the constructor returns. This is done either by defining a "starting" semaphore object that one or more newly created thread objects can wait upon, or by invoking an explicit "Start" member function. @cindex suspended @cindex resumed @cindex SIGUSR1 @cindex SIGSTOP @cindex SIGCONT @cindex solaris threads @cindex linux threads Threads can be "suspended" and "resumed". As this behavior is not defined in the Posix "pthread" specification, it is often emulated through signals. Typically SIGUSR1 will be used for this purpose in GNU Common C++ applications, depending in the target platform. On Linux, since threads are indeed processes, SIGSTOP and SIGCONT can be used. On solaris, the Solaris thread library supports suspend and resume directly. @cindex cancelable threads Threads can be canceled. Not all platforms support the concept of externally cancelable threads. On those platforms and API implementations that do not, threads are typically canceled through the action of a signal handler. @findex Thread::setCancellation @findex Thread::exit @findex Thread::run @cindex cancellation @cindex cancellation point As noted earlier, threads are considered running until the "run" method returns, or until a cancellation request is made. GNU Common C++ threads can control how they respond to cancellation, using setCancellation(). Cancellation requests can be ignored, set to occur only when a cancellation "point" has been reached in the code, or occur immediately. Threads can also exit by returning from run() or by invoking the exit() method. @findex Thread::terminate @cindex thread initialization @cindex thread destruction Generally it is a good practice to initialize any resources the thread may require within the constructor of your derived thread class, and to purge or restore any allocated resources in the destructor. In most cases, the destructor will be executed after the thread has terminated, and hence will execute within the context of the thread that requested a join rather than in the context of the thread that is being terminated. Most destructors in derived thread classes should first call terminate() to make sure the thread has stopped running before releasing resources. @cindex thread join A GNU Common C++ thread is normally canceled by deleting the thread object. The process of deletion invokes the thread's destructor, and the destructor will then perform a "join" against the thread using the terminate() function. This behavior is not always desirable since the thread may block itself from cancellation and block the current "delete" operation from completing. One can alternately invoke terminate() directly before deleting a thread object. @findex Thread::final @findex operator new @cindex detached thread When a given GNU Common C++ thread exits on it's own through it's run() method, a "final" method will be called. This Final method will be called while the thread is "detached". If a thread object is constructed through a "new" operator, it's final method can be used to "self delete" when done, and allows an independent thread to construct and remove itself autonomously. @findex getThread @cindex pthread_self A special global function, getThread(), is provided to identify the thread object that represents the current execution context you are running under. This is sometimes needed to deliver signals to the correct thread. Since all thread manipulation should be done through the GNU Common C++ (base) thread class itself, this provides the same functionality as things like "pthread_self" for GNU Common C++. GNU Common C++ threads are often aggregated into other classes to provide services that are "managed" from or operate within the context of a thread, even within the GNU Common C++ framework itself. A good example of this is the TCPSession class, which essentially is a combination of a TCP client connection and a separate thread the user can define by deriving a class with a Run() method to handle the connected service. This aggregation logically connects the successful allocation of a given resource with the construction of a thread to manage and perform operations for said resource. Threads are also used in "service pools". In GNU Common C++, a service pool is one or more threads that are used to manage a set of resources. While GNU Common C++ does not provide a direct "pool" class, it does provide a model for their implementation, usually by constructing an array of thread "service" objects, each of which can then be assigned the next new instance of a given resource in turn or algorithmically. @findex Thread::signal @findex Thread::onDisconnect @findex Thread::onHangup @cindex SIGPIPE @cindex SIGHUP Threads have signal handlers associated with them. Several signal types are "predefined" and have special meaning. All signal handlers are defined as virtual member functions of the Thread class which are called when a specific signal is received for a given thread. The "SIGPIPE" event is defined as a "onDisconnect" event since it's normally associated with a socket disconnecting or broken fifo. The onHangup() method is associated with the SIGHUP signal. All other signals are handled through the more generic signal(). Incidently, unlike Posix, the win32 API has no concept of signals, and certainly no means to define or deliver signals on a per-thread basis. For this reason, no signal handling is supported or emulated in the win32 implementation of GNU Common C++ at this time. @tindex TCPStream @tindex TCPSession In addition to TCPStream, there is a TCPSession class which combines a thread with a TCPStream object. The assumption made by TCPSession is that one will service each TCP connection with a separate thread, and this makes sense for systems where extended connections may be maintained and complex protocols are being used over TCP. @c ----------------------------------------------------------------------- @node Synchronization @section Synchronization @cindex Synchronization Synchronization objects are needed when a single object can be potentially manipulated by more than one thread (execution) context concurrently. GNU Common C++ provides a number of specialized classes and objects that can be used to synchronize threads. @tindex Mutex One of the most basic GNU Common C++ synchronization object is the Mutex class. A Mutex only allows one thread to continue execution at a given time over a specific section of code. Mutex's have a enter and leave method; only one thread can continue from the Enter until the Leave is called. The next thread waiting can then get through. Mutex's are also known as "CRITICAL SECTIONS" in win32-speak. The GNU Common C++ mutex is presumed to support recursive locking. This was deemed essential because a mutex might be used to block individual file requests in say, a database, but the same mutex might be needed to block a whole series of database updates that compose a "transaction" for one thread to complete together without having to write alternate non-locking member functions to invoke for each part of a transaction. Strangely enough, the original pthread draft standard does not directly support recursive mutexes. In fact this is the most common "NP" extension for most pthread implementations. GNU Common C++ emulates recursive mutex behavior when the target platform does not directly support it. @tindex ThreadLock In addition to the Mutex, GNU Common C++ supports a rwlock class (ThreadLock). This implements the X/Open recommended "rwlock". On systems which do not support rwlock's, the behavior is emulated with a Mutex; however, the advantage of a rwlock over a mutex is then entirely lost. There has been some suggested clever hacks for "emulating" the behavior of a rwlock with a pair of mutexes and a semaphore, and one of these will be adapted for GNU Common C++ in the future for platforms that do not support rwlock's directly. @tindex Semaphore GNU Common C++ also supports "semaphores". Semaphores are typically used as a counter for protecting or limiting concurrent access to a given resource, such as to permitting at most "x" number of threads to use resource "y", for example. Semaphore's are also convenient to use as synchronization objects to rondevous and signal activity and/or post pending service requests between one thread thread and another. @tindex Event In addition to Semaphore objects, GNU Common C++ supports "Event" objects. Event objects are triggered "events" which are used to notify one thread of some event it is waiting for from another thread. These event objects use a trigger/reset mechanism and are related to low level conditional variables. @tindex ThreadKey @tindex AtomicCounter @cindex reference counting A special class, the ThreadKey, is used to hold state information that must be unique for each thread of context. Finally, GNU Common C++ supports a thread-safe "AtomicCounter" class. This can often be used for reference counting without having to protect the counter with a separate Mutex counter. This lends to lighter-weight code. @c ----------------------------------------------------------------------- @node Sockets @section Sockets @cindex Sockets @cindex Java sockets GNU Common C++ provides a set of classes that wrap and define the operation of network "sockets". Much like with Java, there are also a related set of classes that are used to define and manipulate objects which act as "hostname" and "network addresses" for socket connections. @tindex InetAddress @tindex InetHostAddress @tindex InetMaskAddress @tindex BroadcastAddress The network name and address objects are all derived from a common InetAddress base class. Specific classes, such as InetHostAddress, InetMaskAddress, etc, are defined from InetAddress entirely so that the manner a network address is being used can easily be documented and understood from the code and to avoid common errors and accidental misuse of the wrong address object. For example, a "connection" to something that is declared as a "InetHostAddress" can be kept type-safe from a "connection" accidently being made to something that was declared a "BroadcastAddress". @tindex Socket @cindex QoS @cindex sockopt @cindex Dont-Route @cindex Keep-Alive The socket is itself defined in a single base class named, quite unremarkably, "Socket". This base class is not directly used, but is provided to offer properties common to other GNU Common C++ socket classes, including the socket exception model and the ability to set socket properties such as QoS, "sockopts" properties like Dont-Route and Keep-Alive, etc. @tindex TCPStream @findex TCPStream::operator<< @findex TCPStream::operator>> The first usable socket class is the TCPStream. Since a TCP connection is always a "streamed" virtual circuit with flow control, the standard stream operators ("<<" and ">>") may be used with TCPStream directly. TCPStream itself can be formed either by connecting to a bound network address of a TCP server, or can be created when "accepting" a network connection from a TCP server. @cindex TCPSocket An implicit and unique TCPSocket object exists in GNU Common C++ to represent a bound TCP socket acting as a "server" for receiving connection requests. This class is not part of TCPStream because such objects normally perform no physical I/O (read or write operations) other than to specify a listen backlog queue and perform "accept" operations for pending connections. The GNU Common C++ TCPSocket offers a Peek method to examine where the next pending connection is coming from, and a Reject method to flush the next request from the queue without having to create a session. @findex TCPSocket::onAccept The TCPSocket also supports a "onAccept" method which can be called when a TCPStream related object is created from a TCPSocket. By creating a TCPStream from a TCPSocket, an accept operation automatically occurs, and the TCPSocket can then still reject the client connection through the return status of it's OnAccept method. @tindex UDPSocket In addition to connected TCP sessions, GNU Common C++ supports UDP sockets and these also cover a range of functionality. Like a TCPSocket, A UDPSocket can be created bound to a specific network interface and/or port address, although this is not required. UDP sockets also are usually either connected or otherwise "associated" with a specific "peer" UDP socket. Since UDP sockets operate through discreet packets, there are no streaming operators used with UDP sockets. @tindex UDPBroadcast In addition to the UDP "socket" class, there is a "UDPBroadcast" class. The UDPBroadcast is a socket that is set to send messages to a subnet as a whole rather than to an individual peer socket that it may be associated with. @tindex UDPDuplex UDP sockets are often used for building "realtime" media streaming protocols and full duplex messaging services. When used in this manner, typically a pair of UDP sockets are used together; one socket is used to send and the other to receive data with an associated pair of UDP sockets on a "peer" host. This concept is represented through the GNU Common C++ UDPDuplex object, which is a pair of sockets that communicate with another UDPDuplex pair. @tindex SocketPort @tindex SocketService Finally, a special set of classes, "SocketPort" and "SocketService", exist for building realtime streaming media servers on top of UDP and TCP protocols. The "SocketPort" is used to hold a connected or associated TCP or UDP socket which is being "streamed" and which offers callback methods that are invoked from a "SocketService" thread. SocketService's can be pooled into logical thread pools that can service a group of SocketPorts. A millisecond accurate "timer" is associated with each SocketPort and can be used to time synchronize SocketPort I/O operations. @c ----------------------------------------------------------------------- @node Serial I/O @section Serial I/O @cindex Serial I/O GNU Common C++ serial I/O classes are used to manage serial devices and implement serial device protocols. From the point of view of GNU Common C++, serial devices are supported by the underlying Posix specified "termios" call interface. The serial I/O base class is used to hold a descriptor to a serial device and to provide an exception handling interface for all serial I/O classes. The base class is also used to specify serial I/O properties such as communication speed, flow control, data size, and parity. The "Serial" base class is not itself directly used in application development, however. GNU Common C++ Serial I/O is itself divided into two conceptual modes; frame oriented and line oriented I/O. Both frame and line oriented I/O makes use of the ability of the underlying tty driver to buffer data and return "ready" status from when select either a specified number of bytes or newline record has been reached by manipulating termios c_cc fields appropriately. This provides some advantage in that a given thread servicing a serial port can block and wait rather than have to continually poll or read each and every byte as soon as it appears at the serial port. @tindex TTYStream @findex TTYStream::operator<< @findex TTYStream::operator>> @tindex ttystream The first application relevant serial I/O class is the TTYStream class. TTYStream offers a linearly buffered "streaming" I/O session with the serial device. Furthermore, traditional C++ "stream" operators (<< and >>) may be used with the serial device. A more "true" to ANSI C++ library format "ttystream" is also available, and this supports an "open" method in which one can pass initial serial device parameters immediately following the device name in a single string, as in "/dev/tty3a:9600,7,e,1", as an example. @tindex TTYSession The TTYSession aggragates a TTYStream and a GNU Common C++ Thread which is assumed to be the execution context that will be used to perform actual I/O operations. This class is very anagolous to TCPSession. @tindex TTYPort @tindex TTYService The TTYPort and TTYService classes are used to form thread-pool serviced serial I/O protocol sets. These can be used when one has a large number of serial devices to manage, and a single (or limited number of) thread(s) can then be used to service the tty port objects present. Each tty port supports a timer control and several virtual methods that the service thread can call when events occur. This model provides for "callback" event management, whereby the service thread performs a "callback" into the port object when events occur. Specific events supported include the expiration of a TTYPort timer, pending input data waiting to be read, and "sighup" connection breaks. @c ----------------------------------------------------------------------- @node Block I/O @section Block I/O @cindex Block I/O @tindex RandomFile GNU Common C++ block I/O classes are meant to provide more convenient file control for paged or random access files portably, and to answer many issues that ANSI C++ leaves untouched in this area. A common base class, RandomFile, is provided for setting descriptor attributes and handling exceptions. From this, three kinds of random file access are supported. @tindex ThreadFile @findex pwread @findex pwwrite ThreadFile is meant for use by a threaded database server where multiple threads may each perform semi-independent operations on a given database table stored on disk. A special "fcb" structure is used to hold file "state", and pread/pwrite is used whenever possible for optimized I/O. On systems that do not offer pwread/pwrite, a Mutex lock is used to protect concurrent lseek and read/write operations. ThreadFile managed databases are assumed to be used only by the local server and through a single file descriptor. @tindex SharedFile SharedFile is used when a database may be shared between multiple processes. SharedFile automatically applies low level byte-range "file locks", and provides an interface to fetch and release byte-range locked portions of a file. @tindex MappedFile @findex MappedFile::sync The MappedFile class provides a portable interface to memory mapped file access. One can map and unmap portions of a file on demand, and update changed memory pages mapped from files immediately through sync(). @c ----------------------------------------------------------------------- @node Daemons @section Daemons @cindex Daemons @findex pdetach @cindex slog Daemon support consists of two GNU Common C++ features. The first is the "pdetach" function. This function provides a simple and portable means to fork/detach a process into a daemon. In addition, the "slog" object is provided. @tindex Slog @cindex slog @cindex clog @findex Slog::operator<< "slog" is an object which behaves very similar to the Standard C++ "clog". The key difference is that the "slog" object sends it's output to the system logging daemon (typically syslogd) rather than through stderr. "slog" can be streamed with the << operator just like "clog". "slog" can also accept arguments to specify logging severity level, etc. @c ----------------------------------------------------------------------- @node Persistence @section Persistence @cindex Persistence The GNU Common C++ Persistence library was designed with one thought foremost - namely that large interlinked structures should be easily serializable. The current implementation is @emph{not} endian safe, and so, whilst it should in theory be placed in the "Extras" section, the codebase itself is considered stable enough to be part of the main distribution. @tindex Persistence::BaseObject @findex IMPLEMENT_PERSISTENCE @findex DECLARE_PERSISTENCE The Persistence library classes are designed to provide a quick and easy way to make your data structures serializable. The only way of doing this safely is to inherit your classes from the provided class Persistence::BaseObject. The macros "IMPLEMENT_PERSISTENCE" and "DECLARE_PERSISTENCE" provide all the function prototypes and implementation details you may require to get your code off the ground. @c ----------------------------------------------------------------------- @node Configuration and Misc. @section Configuration and Misc. @cindex Configuration and Misc. @tindex MemPager There are a number of odd and specialized utility classes found in Common C++. The most common of these is the "MemPager" class. This is basically a class to enable page-grouped "cumulative" memory allocation; all accumulated allocations are dropped during the destructor. This class has found it's way in a lot of other utility classes in GNU Common C++. @tindex Keydata The most useful of the misc. classes is the Keydata class. This class is used to load and then hold "keyword = value" pairs parsed from a text based "config" file that has been divided into "[sections]". Keydata can also load a table of "initialization" values for keyword pairs that were not found in the external file. One typically derives an application specific keydata class to load a specific portion of a known config file and initialize it's values. One can then declare a global instance of these objects and have configuration data initialized automatically as the executable is loaded. Hence, if I have a "[paths]" section in a "/etc/server.conf" file, I might define something like: @example @cartouche class KeyPaths : public Keydata @{ public: KeyPaths() : Keydata("/server/paths") @{ static KEYDEF *defvalues = @{ @{"datafiles", "/var/server"@}, @{NULL, NULL@}@}; // @r{override with [paths] from "~/.serverrc" if avail.} Load("~server/paths"); Load(defvalues); @} @}; KeyPaths keypaths; @end cartouche @end example @c ----------------------------------------------------------------------- @node Numbers and Dates @section Numbers and Dates @cindex Numbers and Dates @tindex Number @tindex ZNumber @tindex Date @tindex DateNumber @emph{TODO.} This section will explain the number manipulation classes (@code{Number} and @code{ZNumber}, as well as the data related classes (@code{Date} and @code{DateNumber}). @c ----------------------------------------------------------------------- @node URL Streams @section URL Streams @cindex URL Streams @tindex URLStream @cindex URL related functions @emph{TODO.} This section will explain the URLStream class, as well as the following URL related functions: @ftable @code @item URLStream @item urlDecode @item urlEncode @item b64Decode @item b64Encode @end ftable In the meantime you can have a look at the @file{urlfetch.cpp} demo, which is a good example of use of URLStream to retrieve documents from URLs. @c ----------------------------------------------------------------------- @node XML Streams and RPC @section XML Streams and RPC @cindex XML Streams and RPC @tindex XMLStream @tindex XMLRPC @emph{TODO.} This section will explain the XML streams parsing (@code{XMLStream} class) and XML RPC (@code{XMLRPC} class) facilities of Common C++. In the meantime, you can have a look at the @file{xmlfetch.cpp} demo, which defines a basic XML parser for URL streams. @c ----------------------------------------------------------------------- @node Exceptions @section Exceptions @cindex Exceptions @tindex Exception @tindex std::exception @emph{TODO.} This section will explain the exception model of Common C++, based on the @code{Exception} class, derived from std::exception. @tindex Exception @tindex IOException @tindex SockException @tindex DirException @tindex DSOException @tindex FIFOException @tindex PipeException @tindex FileException @tindex FTPException @tindex SerException @tindex ThrException @tindex PersistException Other exception classes that will be commented are: @code{IOException}, @code{SockException}, @code{DirException}, @code{DSOException}, @code{FIFOException}, @code{PipeException}, @code{FileException}, @code{FTPException}, @code{SerException}, @code{ThrException} and @code{PersistException}. In the meantime you can have a look at the exception class hierarchy on the reference manual. @c ----------------------------------------------------------------------- @node Templates @section Templates @cindex Templates @tindex objCounter @tindex objList @tindex objMap @tindex keyMap] @tindex objSync @tindex cstring @tindex cistring @tindex Pointer @tindex Counter @findex abs @emph{TODO.} This section will explain the template subsistem of Common C++. @c ----------------------------------------------------------------------- @node Extras @chapter Extras @cindex Extras @emph{TODO: this is rather outdated.} At the time of the release of GNU Common C++ 1.0, it was deemed that several class libraries either were incomplete or still experimental, and the 1.0 designation seemed very inappropriate for these libraries. I also wanted to have a mechanism to later add new GNU Common C++ class libraries without having to disrupt or add experimental code into the main GNU Common C++ release. To resolve this issue, a second package has been created, and is named GNU "GNU Common C++ Extras". The extras package simply holds class frameworks that are still not considered "mature" or "recommended". This package can be downloaded, compiled, and installed, after GNU Common C++ itself. Many of the class libraries appearing in the extras package are likely to appear in GNU Common C++ proper at some future date, and should be considered usable in their current form. They are made available both to support continued development of GNU Common C++ proper and because, while not yet mature, they are considered "useful" in some manner. The initial GNU Common C++ "extras" package consisted of two libraries; Common C++ "scripting" and "math". The scripting library (-lccscript) is the GNU Bayonne scripting engine which is used as a near-realtime event driven embedded scripting engine for "callback" driven state-event server applications. The Bayonne scripting engine directly uses C++ inheritance to extend the Bayonne dialect for application specific features and is used as a core technology in the GNU Bayonne, DBS, and Meridian telephony servers and as part of the a free home automation project. There has been some discussion about folding the GNU Bayonne scripting concepts around a more conventional scripting language, and so this package currently remains in "extras" rather than part of GNU Common C++ itself. The other package found in the initial "extras" distribution is the Common C++ math libraries. These are still at a VERY early stage of development, and may well be depreciated if another suitable free C++ math/numerical analysis package comes along. @c ----------------------------------------------------------------------- @node Serverlets @chapter Serverlets @cindex Serverlets Serverlets are a concept popularized with Java and web servers. There is a broad abstract architectural concept of serverlets or plugins that one also finds in my GNU Common C++ projects, though they are not directly defined as part of GNU Common C++ itself. A GNU Common C++ "serverlet" comes about in a Common C++ server project, such as the Bayonne telephony server, where one wishes to define functionality for alternate hardware or API's in alternated shared object files that are selected at runtime, or to add "plugins" to enhance functionality. A serverlet is defined in this sense as a "DSO" loaded "-module" object file which is linked at runtime against a server process that exports it's base classes using "-export-dynamic". The "server" image then acts as a carrier for the runtime module's base functionality. Modules, or "serverlets", defined in this way do not need to be compiled with position independent code. The module is only used with a specific server image and so the runtime address is only resolved once rather than at different load addresses for different arbitrary processes. I recommend that GNU Common C++ based "servers" which publish and export base classes in this manner for plugins should also have a server specific "include" file which can be installed in the cc++ include directory. @c ----------------------------------------------------------------------- @node Compiler Options @chapter Compiler Options @cindex Compiler Options @cindex automake @cindex autoconf @cindex configuration @cindex config.h @cindex ccgnu2-config GNU Common C++ does a few things special with automake and autoconf. When the Common C++ library is built, it saves a number of compiler options that can be retrieved by an application being configured to use GNU Common C++. These options can be retrieved from the standard output of the @command{ccgnu2-config} script, which is installed in the machine binaries path. This is done to assure the same compiler options are used to build your application that were in effect when GNU Common C++ itself was built. Since linkage information is also saved in this manner, this means your application's "configure" script does not have to go through the entire process of testing for libraries or GNU Common C++ related compiler options all over again. Finally, GNU Common C++ saves it's own generated @file{config.h} file in @file{cc++/config.h}@footnote{On Win32 systems, a specific @file{config.h} located under the win32/cc++/ directory is used and installed.}. @command{ccgnu2-config} has the following options (which are shown if you type @command{ccgnu2-config --help}): @example Usage: ccgnu2-config [OPTIONS] Options: [--prefix] [--version] [--flags] [--libs] [--gnulibs] [--iolibs] [--extlibs] [--stdlibs] [--includes] @end example For a basic usage of Common C++, you just need the options given by the following command: @command{ccgnu2-config --flags --stdlibs}, whose output should be something like this: @example foo@@bar:~/$ ccgnu2-config --flags --stdlibs -I/usr/local/include/cc++2 -I/usr/local/include -D_GNU_SOURCE -L/usr/local/lib -lccext2 -lccgnu2 -lxml2 -lz -ldl -pthread @end example Note that this is just an example, the concrete output on your system will probably differ. The first output line (corresponding to @code{--flags}) tells what directories must be added to the compiler include path, as well as global symbol definitions (@code{_GNU_SOURCE}) needed to compile with Common C++. The second output line (corresponding to @code{--stdlibs}) gives the linker options, both additional library path and libraries that must be linked. @code{ccgnu2} and @code{ccext2} are the two libraries Common C++ currently consists of. The other libraries shown in the example are dependencies of Common C++. The list shown below tells what information is given by each of the options that can be specified to @command{ccgnu2-config}. It also specifies what would be the output corresponding to the example given before. @table @code @item --prefix Common C++ Installation path prefix. For example, @code{/usr/local}. @item --version Common C++ version. For example, @code{1.0.0}. @item --flags C++ preprocessor flags. For example, @code{-I/usr/local/include/cc++2 -I/usr/local/include -D_GNU_SOURCE}. @item --libs C++ linker options for the main Common C++ library (@code{ccgnu2}). For example, @code{-L/usr/local/lib -lccgnu2 -ldl -pthread}. @item --gnulibs C++ linker options for the main Common C++ library (@code{ccgnu2}). For example, @code{-L/usr/local/lib -lccgnu2 -ldl -pthread}. @item --iolibs C++ linker options for the input/output Common C++ library (@code{ccgnu2}). For example, @code{-L/usr/local/lib -lccgnu2 -ldl -pthread}. @item --extlibs C++ linker options for the Common C++ ``extension'' library (@code{ccext2}). For exmple, @code{-lccext2 -lxml2 -lz}. @item --stdlibs C++ linker options for the whole Common C++ (@code{ccgnu2} and @code{ccext2}). For example, @code{-L/usr/local/lib -lccext2 -lccgnu2 -lxml2 -lz -ldl -pthread}. @item --includes Common C++ specific include path. For example, @code{/usr/local/include/cc++2}. @end table @c ----------------------------------------------------------------------- @node Automake Services @chapter Automake Services @cindex Automake Services @cindex automake services @cindex automake macros @cindex ost_commoncxx.m4 @cindex configure.in @cindex configure.ac If you are using automake, you can add the @file{ost_check2.m4} macros to your projects autoconf "m4" directory and use several CCXX2_ macros for your convenience. A "minimal" @file{configure.in} or @file{configure.ac} can be constructed as: @example AC_INIT(something...) AC_PROG_CXX AC_PROG_CXXCPP AM_PROG_LIBTOOL AM_INIT_AUTOMAKE(....) AM_CONFIG_HEADER(my-local-config.h) OST_CCXX2_VERSION(1.0.0) @end example Where @samp{1.0.0} means configure will check for GNU Common C++ 2 1.0.0 or later. These are the macros currently provided: @table @code @cindex OST_CCXX2_VERSION @item OST_CCXX2_VERSION([MINIMUM-VERSION[,ACTION-IF-FOUND[,ACTION-IF-NOT-FOUND]]]) Test for usable version of CommonC++. @cindex OST_CCXX2_XML @item OST_CCXX2_XML([ACTION-IF-TRUE[,ACTION-IF-FALSE]]) Test whether the CommonC++ library was compiled with XML parsing support. @cindex OST_CCXX2_HOARD @item OST_CCXX2_HOARD Will test for and, if found, add the SMP optimized Hoard memory allocator to your application link LIBS. @cindex OST_CCXX2_FOX @item OST_CCXX2_FOX Test for the FOX toolkit. @end table @c ----------------------------------------------------------------------- @node Configuring Sources @chapter Configuring Sources @cindex Configuring Sources When building GNU Common C++ on platforms that support the use of configure, the following specific configuration options are provided: @table @code @item --with-pthread[=lib] using specified pthread library @item --with-linuxthreads use linux kernel mode library @item --without-xml Disable xml support @item --with-ftp Enable ftp support @item --with-memaudit Enable memory auditing @item --with-stlport[=dir] using SGI portable C++ stream library,ie: /usr/local, not all include directory @item --enable-debug compile for debugging @item --enable-profiling compile for profiling @end table @c ----------------------------------------------------------------------- @node Developer Documentation @chapter Developer Documentation @cindex Developer Documentation This chapter contains information of interest for developers of components for the GNU Common C++ framework. @menu * Coding Style:: How a CommonC++ 2 source file should be written. * Porting:: Common porting related problems and practices. @end menu @c ----------------------------------------------------------------------- @node Coding Style @section Coding Style @cindex Coding Style How a CommonC++ 2 source file should be written. @menu * Naming Convention:: Overall GNU Common C++ naming conventions. * Class Encapsulation:: Class interface design guidelines. @end menu @c ----------------------------------------------------------------------- @node Naming Convention @subsection Naming Convention @cindex Naming Convention @itemize @item @strong{Classes and structs}. Begin with uppercase with word parts capitalized (ThisIsAClass) @item @strong{Method (function member, also static member)}. Begin with lowercase with word parts capitalized (setSomething, send). If a member variable is set, a @code{setXxxx} style name should be used, and if a member variable is fetched, a @code{getXxxx} style name should be used. Sometimes things might both set and perform an action, like @code{setError} in place of @code{Error} in the older release, in which case, set should still be used as the prefix. Function to handle some event (such as data arrival) should begin with @code{on} (ex: @code{onInput}) @item @strong{Data member}. Begin with lowercase with word parts capitalized (@code{currentThread}) private member can begin with underscore (_). @item @strong{Global function}. Begin with lowercase with word parts capitalized (@code{getThread}). @item @strong{Enumeration type}. Begin with uppercase with word parts capitalized (@code{Error}). @item @strong{Enumeration item}. Begin with lowercase with word parts capitalized (@code{errSuccess}). First word should refer to enumeration type (@code{errFailure}, cancelImmediate). For error enum we use the prefix @code{err} (everyone should understand the meaning). @item @strong{Member data types}. Sometimes a class might use internal member data types or structs. These should be written using @code{class} rather than struct wherever possible and treated as inner @code{classes}. Hence, they would be capitalized in the same conventions of a class. @end itemize @c ----------------------------------------------------------------------- @node Class Encapsulation @subsection Class Encapsulation @cindex Class Encapsulation @itemize @item @strong{Friend functions}. To clean up the namespace we are looking to eliminate @emph{friend functions} that exist in the default or ost namespace and we are suggesting that in many cases static member functions should be used in place of friend functions unless the friend function is actually used in multiple classes. A typical example of this is found in things like @code{getXXX}, which might be a friend function for finding a specific named instance of @code{XXX} thru a self organized link list contained in @code{XXX}. Rather, it is suggested for this to use a static member something like @code{XXX::find}. @item @strong{Scope of view and inheritance}. In many cases we combine and mix classes directly in GNU Common C++ (multiple inheritence). Hence, classes have to be well designed for this possibility. Ideally things that should not be exposed to derived classes should be made private so that clashes mixing similar classes with common named members do not need to occur. @item @strong{Access to member properties}. A well formed GNU Common C++ class need not expose more than is nessisary for it's practical and effective use in derived classes or thru proper public methods. Ideally set and get members should be used to manipulate internal member variables thru public interfaces rather than exposing property values directly thru public declarations. These set and get methods should use appropriate valid range and error checking logic. Member properties can often be made visible protected to optimize the code of derived classes, and care then needs to be taken when creating derived classes to make sure they do have reasonable error checking when needed. @item @strong{Constructors and destructors}. It is very common in GNU Common C++ for the constructor to create or obtain a resource that remains in scope as long as the object does, and is then releas\ed in the destructor when the object falls out of scope. Things like Mutexes, Threads and Semaphores and such very much behave this way. @end itemize @c ----------------------------------------------------------------------- @node Porting @section Porting @cindex Porting Only for no-remake same problem :). @itemize @bullet @cindex FreeBSD @cindex pthread_join @item FreeBSD: assuming having thread A and B. If A call pthread_join on B and B call pthread_detach and then exit thread A hang. @cindex Solaris @item Solaris: On multiple inheriting from streambuf and iostream together streambuf should inherited first (and initialized too). @cindex Win32 @cindex MSVC @cindex DLL @item Win32/MSVC6: if you use CC++ DLL library you MUST use C++ DLL library. @code{iostream} use a pointer to object. This object pointer can be different from library static linked and dinamically linked, so iostream see distinct object, causing strange exception and crashes. @cindex GCC @item @acronym{GCC}: including declaration for polimorphic class cause link to typeinfo, but typeinfos are defined only in module with classes constructors Include only needed header (this problem disappear with optimization). @end itemize @c %** end of body @c ----------------------------------------------------------------------- @node Licenses @appendix Licenses @menu * GNU Free Documentation License:: License for this document. * GNU General Public License:: License for the library. * GNU Common C++ Linking Exception:: Library linking exception. @end menu @include fdl.texi @include gpl.texi @c ----------------------------------------------------------------------- @node GNU Common C++ Linking Exception @appendixsec GNU Common C++ Linking Exception @cindex GNU Common C++ Linking Exception As a special exception to the GNU General Public License, permission is granted for additional uses of the text contained in its release of Common C++. The exception is that, if you link the Common C++ library with other files to produce an executable, this does not by itself cause the resulting executable to be covered by the GNU General Public License. Your use of that executable is in no way restricted on account of linking the Common C++ library code into it. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. This exception applies only to the code released under the name Common C++. If you copy code from other releases into a copy of Common C++, as the General Public License permits, the exception does not apply to the code that you add in this way. To avoid misleading anyone as to the status of such modified files, you must delete this exception notice from them. If you write modifications of your own for Common C++, it is your choice whether to permit this exception to apply to your modifications. If you do not wish that, delete this exception notice. @c ----------------------------------------------------------------------- @c %** start of end @node Class and Data Type Index @unnumbered Class and Data Type Index @printindex tp @node Method and Function Index @unnumbered Method and Function Index @printindex fn @node Concept Index @unnumbered Concept Index @printindex cp @bye @c %** end of end commoncpp2-1.8.1/doc/Makefile.am0000644000175000017500000000142111463314535013323 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # # This file is free software; as a special exception the author 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. MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = Doxyfile Doxyfile.in info_TEXINFOS = commoncpp2.texi commoncpp2_TEXINFOS = gpl.texi fdl.texi fdlnotice.texi if DOXY noinst_DATA = doxy doxy: Doxyfile $(DOXYGEN) Doxyfile touch doxy endif clean-local: -rm -rf html -rm -rf latex -rm -rf man3 commoncpp2-1.8.1/doc/gpl.texi0000644000175000017500000004400711463314535012753 00000000000000@node GNU General Public License @appendixsec GNU GENERAL PUBLIC LICENSE @center Version 2, June 1991 @c This file is intended to be included in another file. @display Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @appendixsubsec Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software---to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. @iftex @appendixsubsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @end iftex @ifinfo @center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION @end ifinfo @enumerate 0 @item This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The ``Program'', below, refers to any such program or work, and a ``work based on the Program'' means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term ``modification''.) Each licensee is addressed as ``you''. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. @item You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. @item You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: @enumerate a @item You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. @item You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. @item If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) @end enumerate These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. @item You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: @enumerate a @item Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, @item Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, @item Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) @end enumerate The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. @item You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @item You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. @item Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. @item If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. @item If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. @item The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. @item If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. @iftex @heading NO WARRANTY @end iftex @ifinfo @center NO WARRANTY @end ifinfo @item BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @end enumerate @iftex @heading END OF TERMS AND CONDITIONS @end iftex @ifinfo @center END OF TERMS AND CONDITIONS @end ifinfo @page @appendixsubsec Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) @var{yyyy} @var{name of author} This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: @smallexample Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than @samp{show w} and @samp{show c}; they could even be mouse-clicks or menu items---whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names: @example Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. @var{signature of Ty Coon}, 1 April 1989 Ty Coon, President of Vice @end example This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. commoncpp2-1.8.1/doc/commoncpp2.info0000644000175000017500000032541511463314535014235 00000000000000This is /home/dyfet/software/commoncpp2/doc/commoncpp2.info, produced by makeinfo version 4.8 from /home/dyfet/software/commoncpp2/doc/commoncpp2.texi. INFO-DIR-SECTION Development START-INFO-DIR-ENTRY * GNU Common C++ 2: (commoncpp2). GNU Common C++ 2 Framework Documentation. END-INFO-DIR-ENTRY GNU Common C++ 2 is the second major release of a C++ framework offering portable support for threading, sockets, file access, daemons, persistence, serial I/O, XML parsing, and system services, initially started by David Sugar and Daniel Silverstone. Copyright (C) 1999, 2000, 2001, 2002 Open Source Telecom Corporation. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".  File: commoncpp2.info, Node: Top, Next: Introduction, Up: (dir) GNU Common C++ 2 **************** This document describes GNU Common C++ 2, the second major release of a C++ framework offering portable support for threading, sockets, file access, daemons, persistence, serial I/O, XML parsing, and system services, initially started by David Sugar and Daniel Silverstone. This is the edition 1.0pre0 of this manual and documents GNU Common C++ 2 version 1.0. * Menu: * Introduction:: What GNU Common C++ and this manual are. * Distribution:: How to get GNU Common C++. * Framework Description:: GNU Common C++ classes. * Extras:: GNU Common C++ extras. * Serverlets:: GNU Common C++ serverlets. * Compiler Options:: Compiler options to use with GNU Common C++. * Automake Services:: GNU Common C++ automake services. * Configuring Sources:: Configuring GNU Common C++ sources. * Developer Documentation:: Information of interest for CC++ developers. * Licenses:: Library and documentation licenses. * Class and Data Type Index:: Index of Common C++ classes and data types. * Method and Function Index:: Index of Common C++ methods and functions. * Concept Index:: Index of concepts.  File: commoncpp2.info, Node: Introduction, Next: Distribution, Prev: Top, Up: Top 1 Introduction ************** *PLEASE NOTE;* This is a preliminary version of this document. Some information may not be complete or even somewhat obsolete; bug reports, suggestions and contributions are welcome. In writing this document I hope to better explain what the GNU Common C++ library is about and how it may be used in developing your own C++ applications. This document is intended as an overview and unifying document to support the already detailed class-by-class function descriptions found and browsable in the "doc" subdirectory of the Common C++ distribution. GNU Common C++ offers a set of "portable" classes that can be used to build highly portable applications in C++. In particular, Common C++ offers classes that abstract threading, sockets, synchronization, serial I/O, "config" file parsing, class object persistence, shared object module loading, daemon management, and optimized "block" and memory mapped file I/O under a set of consistent classes that your application can then be built from. The goal is to write your application to use the portable abstract services and classes of the GNU Common C++ libraries rather than having to access low level system services directly. There is a large diversity of views in how one should code a C++ framework. Since a large number of older C++ compilers remain in everyday use, I choose to use what I felt was an appropriate set of C++ language features and practices to provide the greatest compiler compatibility and to generate the most optimized code for GNU Common C++. To further reduce the overhead of writing GNU Common C++ applications, I have split the primary library image itself into several different shared libraries. This allowed me to collect the more obscure and less likely to be used features into separate libraries which need never be loaded. Finally, in designing GNU Common C++, I assume that class extension (inheritance) is the primary vehicle for application development. The GNU Common C++ framework, while offering many classes that are usable directly, is designed for one to create applications by extending Common C++ "base" classes into an application specific versions of said classes as needed.  File: commoncpp2.info, Node: Distribution, Next: Framework Description, Prev: Introduction, Up: Top 2 Distribution ************** This manual is licensed under the terms of the GNU Free Documentation License, *Note GNU Free Documentation License::. GNU Common C++ is free software (see `http://www.gnu.org/philosophy/philosophy.html'). There are several ways to get GNU Common C++, refer to `http://www.gnu.org' and `http://www.gnu.org/software/commoncpp/'. The GNU Common C++ framework is licensed under the terms of the GNU General Public License, *Note GNU General Public License::, plus a linking exception, *Note GNU Common C++ Linking Exception::, that grants additional privileges. These privileges are similar to the terms Guile is licensed under and constitute privileges similar to the LGPL. David Sugar explains why these licensing terms were chosen for Common C++ as follows: The one problem I recall immediately with the LGPL as it applies to C++ class frameworks is the way it defines and refers to "linking" vs "derived works". In concept, a C++ header with inline members or template is not "linked" in the same sense as one might presume the meaning in traditional C library, and what does one make of a class who's base class is defined in a header in a LGPL protected library? Is creating a derived C++ class purely a linking operation or creating a derived/composite work? At the time it seemed simpler to take the language of the GPL and provide an appropriate privileges to allow Common C++ to be used in ways that achieve the same goals of the LGPL, but without using the same choice of language for this that is found in the LGPL. We actually looked at the Guile license, which also faced many of these questions, and choose to use their methodology for creating a special privilege in this regard. Of course, this was a number of years ago, and the language of the LGPL (and GPL) has evolved over time to better address the needs of object oriented frameworks. If the language of the current LGPL were close enough to resolving these goals, I think we would likely switch to it, as that would resolve some confusion over the exact license status. I have found it simpler to explain it as a LGPL-like license since we were trying for much the same effect within the context of a C++ framework, and most people basically understand what the LGPL is.  File: commoncpp2.info, Node: Framework Description, Next: Extras, Prev: Distribution, Up: Top 3 Framework Description *********************** This chapter provides a description of the GNU Common C++ framework main components. * Menu: * Overall Concepts:: Global GNU Common C++ Practices. * Threading Concepts:: GNU Common C++ Threading Concepts. * Synchronization:: GNU Common C++ Synchronization. * Sockets:: GNU Common C++ Sockets. * Serial I/O:: GNU Common C++ Serial I/O. * Block I/O:: GNU Common C++ Block I/O. * Daemons:: GNU Common C++ Daemon Support. * Persistence:: GNU Common C++ Persistence. * Configuration and Misc.:: GNU Common C++ Configuration and Other Things. * Numbers and Dates:: GNU Common C++ Numbers and Dates Manipulation. * URL Streams:: GNU Common C++ HTTP Support. * XML Streams and RPC:: GNU Common C++ XML Streams and RPC. * Exceptions:: GNU Common C++ Exception Model. * Templates:: GNU Common C++ Template Subsystem  File: commoncpp2.info, Node: Overall Concepts, Next: Threading Concepts, Up: Framework Description 3.1 Overall Concepts ==================== Unless explicitly stated, all GNU Common C++ symbols are under the `ost' namespace(1). Thus, when we refer to the Thread class, we actually refer to ost::Thread. The GNU Common C++ framework actually consists of two libraries: `ccgnu2' and `ccext2'(2). The first includes core functionality that other things commonly depend on, such as threading and synchronization. That way, if you are building a tight application with a small footprint, you can have it used the ccgnu2 shared image alone. On the contrary, things that require or induce new library link requirements are included in `ccext2'. Hence, for example, if you do not wish to use XML parsing in your application, why create an unused library dependency for libxml2? The idea being that one can, if one needs to, use only "core" features found in ccgnu2 and then create very compact executables with very few additional library dependencies. ---------- Footnotes ---------- (1) Provided the C++ compiler used to compile GNU Common C++ suupports namespaces, which is checked at configuration time. (2) *Note Compiler Options::, for how to specify compiling and linking options for these libraries. On Win32 systems, these libraries are compiled as `ccgnu2.dll' and `ccext2.dll'  File: commoncpp2.info, Node: Threading Concepts, Next: Synchronization, Prev: Overall Concepts, Up: Framework Description 3.2 Threading Concepts ====================== Threading was the first part of GNU Common C++ I wrote, back when it was still the APE library. My goal for GNU Common C++ threading has been to make threading as natural and easy to use in C++ application development as threading is in Java. With this said, one does not need to use threading at all to take advantage of GNU Common C++. However, all GNU Common C++ classes are designed at least to be thread-aware/thread-safe as appropriate and necessary. GNU Common C++ threading is currently built either from the Posix "pthread" library or using the win32 SDK. In that the Posix "pthread" draft has gone through many revisions, and many system implementations are only marginally compliant, and even then usually in different ways, I wrote a large series of autoconf macros found in ost_pthread.m4 which handle the task of identifying which pthread features and capabilities your target platform supports. In the process I learned much about what autoconf can and cannot do for you. Currently the GNU Portable Thread library (GNU pth) is not directly supported in GNU Common C++. While GNU "Pth" doesn't offer direct native threading support or benefit from SMP hardware, many of the design advantages of threading can be gained from it's use, and the Pth pthread "emulation" library should be usable with GNU Common C++. In the future, GNU Common C++ will directly support Pth, as well as OS/2 and BeOS native threading API's. GNU Common C++ itself defines a fairly "neutral" threading model that is not tied to any specific API such as pthread, win32, etc. This neutral thread model is contained in a series of classes which handle threading and synchronization and which may be used together to build reliable threaded applications. GNU Common C++ defines application specific threads as objects which are derived from the GNU Common C++ "Thread" base class. At minimum the "run" method must be implemented, and this method essentially is the "thread", for it is executed within the execution context of the thread, and when the run method terminates the thread is assumed to have terminated. GNU Common C++ allows one to specify the running priority of a newly created thread relative to the "parent" thread which is the thread that is executing when the constructor is called. Since most newer C++ implementations do not allow one to call virtual constructors or virtual methods from constructors, the thread must be "started" after the constructor returns. This is done either by defining a "starting" semaphore object that one or more newly created thread objects can wait upon, or by invoking an explicit "Start" member function. Threads can be "suspended" and "resumed". As this behavior is not defined in the Posix "pthread" specification, it is often emulated through signals. Typically SIGUSR1 will be used for this purpose in GNU Common C++ applications, depending in the target platform. On Linux, since threads are indeed processes, SIGSTOP and SIGCONT can be used. On solaris, the Solaris thread library supports suspend and resume directly. Threads can be canceled. Not all platforms support the concept of externally cancelable threads. On those platforms and API implementations that do not, threads are typically canceled through the action of a signal handler. As noted earlier, threads are considered running until the "run" method returns, or until a cancellation request is made. GNU Common C++ threads can control how they respond to cancellation, using setCancellation(). Cancellation requests can be ignored, set to occur only when a cancellation "point" has been reached in the code, or occur immediately. Threads can also exit by returning from run() or by invoking the exit() method. Generally it is a good practice to initialize any resources the thread may require within the constructor of your derived thread class, and to purge or restore any allocated resources in the destructor. In most cases, the destructor will be executed after the thread has terminated, and hence will execute within the context of the thread that requested a join rather than in the context of the thread that is being terminated. Most destructors in derived thread classes should first call terminate() to make sure the thread has stopped running before releasing resources. A GNU Common C++ thread is normally canceled by deleting the thread object. The process of deletion invokes the thread's destructor, and the destructor will then perform a "join" against the thread using the terminate() function. This behavior is not always desirable since the thread may block itself from cancellation and block the current "delete" operation from completing. One can alternately invoke terminate() directly before deleting a thread object. When a given GNU Common C++ thread exits on it's own through it's run() method, a "final" method will be called. This Final method will be called while the thread is "detached". If a thread object is constructed through a "new" operator, it's final method can be used to "self delete" when done, and allows an independent thread to construct and remove itself autonomously. A special global function, getThread(), is provided to identify the thread object that represents the current execution context you are running under. This is sometimes needed to deliver signals to the correct thread. Since all thread manipulation should be done through the GNU Common C++ (base) thread class itself, this provides the same functionality as things like "pthread_self" for GNU Common C++. GNU Common C++ threads are often aggregated into other classes to provide services that are "managed" from or operate within the context of a thread, even within the GNU Common C++ framework itself. A good example of this is the TCPSession class, which essentially is a combination of a TCP client connection and a separate thread the user can define by deriving a class with a Run() method to handle the connected service. This aggregation logically connects the successful allocation of a given resource with the construction of a thread to manage and perform operations for said resource. Threads are also used in "service pools". In GNU Common C++, a service pool is one or more threads that are used to manage a set of resources. While GNU Common C++ does not provide a direct "pool" class, it does provide a model for their implementation, usually by constructing an array of thread "service" objects, each of which can then be assigned the next new instance of a given resource in turn or algorithmically. Threads have signal handlers associated with them. Several signal types are "predefined" and have special meaning. All signal handlers are defined as virtual member functions of the Thread class which are called when a specific signal is received for a given thread. The "SIGPIPE" event is defined as a "onDisconnect" event since it's normally associated with a socket disconnecting or broken fifo. The onHangup() method is associated with the SIGHUP signal. All other signals are handled through the more generic signal(). Incidently, unlike Posix, the win32 API has no concept of signals, and certainly no means to define or deliver signals on a per-thread basis. For this reason, no signal handling is supported or emulated in the win32 implementation of GNU Common C++ at this time. In addition to TCPStream, there is a TCPSession class which combines a thread with a TCPStream object. The assumption made by TCPSession is that one will service each TCP connection with a separate thread, and this makes sense for systems where extended connections may be maintained and complex protocols are being used over TCP.  File: commoncpp2.info, Node: Synchronization, Next: Sockets, Prev: Threading Concepts, Up: Framework Description 3.3 Synchronization =================== Synchronization objects are needed when a single object can be potentially manipulated by more than one thread (execution) context concurrently. GNU Common C++ provides a number of specialized classes and objects that can be used to synchronize threads. One of the most basic GNU Common C++ synchronization object is the Mutex class. A Mutex only allows one thread to continue execution at a given time over a specific section of code. Mutex's have a enter and leave method; only one thread can continue from the Enter until the Leave is called. The next thread waiting can then get through. Mutex's are also known as "CRITICAL SECTIONS" in win32-speak. The GNU Common C++ mutex is presumed to support recursive locking. This was deemed essential because a mutex might be used to block individual file requests in say, a database, but the same mutex might be needed to block a whole series of database updates that compose a "transaction" for one thread to complete together without having to write alternate non-locking member functions to invoke for each part of a transaction. Strangely enough, the original pthread draft standard does not directly support recursive mutexes. In fact this is the most common "NP" extension for most pthread implementations. GNU Common C++ emulates recursive mutex behavior when the target platform does not directly support it. In addition to the Mutex, GNU Common C++ supports a rwlock class (ThreadLock). This implements the X/Open recommended "rwlock". On systems which do not support rwlock's, the behavior is emulated with a Mutex; however, the advantage of a rwlock over a mutex is then entirely lost. There has been some suggested clever hacks for "emulating" the behavior of a rwlock with a pair of mutexes and a semaphore, and one of these will be adapted for GNU Common C++ in the future for platforms that do not support rwlock's directly. GNU Common C++ also supports "semaphores". Semaphores are typically used as a counter for protecting or limiting concurrent access to a given resource, such as to permitting at most "x" number of threads to use resource "y", for example. Semaphore's are also convenient to use as synchronization objects to rondevous and signal activity and/or post pending service requests between one thread thread and another. In addition to Semaphore objects, GNU Common C++ supports "Event" objects. Event objects are triggered "events" which are used to notify one thread of some event it is waiting for from another thread. These event objects use a trigger/reset mechanism and are related to low level conditional variables. A special class, the ThreadKey, is used to hold state information that must be unique for each thread of context. Finally, GNU Common C++ supports a thread-safe "AtomicCounter" class. This can often be used for reference counting without having to protect the counter with a separate Mutex counter. This lends to lighter-weight code.  File: commoncpp2.info, Node: Sockets, Next: Serial I/O, Prev: Synchronization, Up: Framework Description 3.4 Sockets =========== GNU Common C++ provides a set of classes that wrap and define the operation of network "sockets". Much like with Java, there are also a related set of classes that are used to define and manipulate objects which act as "hostname" and "network addresses" for socket connections. The network name and address objects are all derived from a common InetAddress base class. Specific classes, such as InetHostAddress, InetMaskAddress, etc, are defined from InetAddress entirely so that the manner a network address is being used can easily be documented and understood from the code and to avoid common errors and accidental misuse of the wrong address object. For example, a "connection" to something that is declared as a "InetHostAddress" can be kept type-safe from a "connection" accidently being made to something that was declared a "BroadcastAddress". The socket is itself defined in a single base class named, quite unremarkably, "Socket". This base class is not directly used, but is provided to offer properties common to other GNU Common C++ socket classes, including the socket exception model and the ability to set socket properties such as QoS, "sockopts" properties like Dont-Route and Keep-Alive, etc. The first usable socket class is the TCPStream. Since a TCP connection is always a "streamed" virtual circuit with flow control, the standard stream operators ("<<" and ">>") may be used with TCPStream directly. TCPStream itself can be formed either by connecting to a bound network address of a TCP server, or can be created when "accepting" a network connection from a TCP server. An implicit and unique TCPSocket object exists in GNU Common C++ to represent a bound TCP socket acting as a "server" for receiving connection requests. This class is not part of TCPStream because such objects normally perform no physical I/O (read or write operations) other than to specify a listen backlog queue and perform "accept" operations for pending connections. The GNU Common C++ TCPSocket offers a Peek method to examine where the next pending connection is coming from, and a Reject method to flush the next request from the queue without having to create a session. The TCPSocket also supports a "onAccept" method which can be called when a TCPStream related object is created from a TCPSocket. By creating a TCPStream from a TCPSocket, an accept operation automatically occurs, and the TCPSocket can then still reject the client connection through the return status of it's OnAccept method. In addition to connected TCP sessions, GNU Common C++ supports UDP sockets and these also cover a range of functionality. Like a TCPSocket, A UDPSocket can be created bound to a specific network interface and/or port address, although this is not required. UDP sockets also are usually either connected or otherwise "associated" with a specific "peer" UDP socket. Since UDP sockets operate through discreet packets, there are no streaming operators used with UDP sockets. In addition to the UDP "socket" class, there is a "UDPBroadcast" class. The UDPBroadcast is a socket that is set to send messages to a subnet as a whole rather than to an individual peer socket that it may be associated with. UDP sockets are often used for building "realtime" media streaming protocols and full duplex messaging services. When used in this manner, typically a pair of UDP sockets are used together; one socket is used to send and the other to receive data with an associated pair of UDP sockets on a "peer" host. This concept is represented through the GNU Common C++ UDPDuplex object, which is a pair of sockets that communicate with another UDPDuplex pair. Finally, a special set of classes, "SocketPort" and "SocketService", exist for building realtime streaming media servers on top of UDP and TCP protocols. The "SocketPort" is used to hold a connected or associated TCP or UDP socket which is being "streamed" and which offers callback methods that are invoked from a "SocketService" thread. SocketService's can be pooled into logical thread pools that can service a group of SocketPorts. A millisecond accurate "timer" is associated with each SocketPort and can be used to time synchronize SocketPort I/O operations.  File: commoncpp2.info, Node: Serial I/O, Next: Block I/O, Prev: Sockets, Up: Framework Description 3.5 Serial I/O ============== GNU Common C++ serial I/O classes are used to manage serial devices and implement serial device protocols. From the point of view of GNU Common C++, serial devices are supported by the underlying Posix specified "termios" call interface. The serial I/O base class is used to hold a descriptor to a serial device and to provide an exception handling interface for all serial I/O classes. The base class is also used to specify serial I/O properties such as communication speed, flow control, data size, and parity. The "Serial" base class is not itself directly used in application development, however. GNU Common C++ Serial I/O is itself divided into two conceptual modes; frame oriented and line oriented I/O. Both frame and line oriented I/O makes use of the ability of the underlying tty driver to buffer data and return "ready" status from when select either a specified number of bytes or newline record has been reached by manipulating termios c_cc fields appropriately. This provides some advantage in that a given thread servicing a serial port can block and wait rather than have to continually poll or read each and every byte as soon as it appears at the serial port. The first application relevant serial I/O class is the TTYStream class. TTYStream offers a linearly buffered "streaming" I/O session with the serial device. Furthermore, traditional C++ "stream" operators (<< and >>) may be used with the serial device. A more "true" to ANSI C++ library format "ttystream" is also available, and this supports an "open" method in which one can pass initial serial device parameters immediately following the device name in a single string, as in "/dev/tty3a:9600,7,e,1", as an example. The TTYSession aggragates a TTYStream and a GNU Common C++ Thread which is assumed to be the execution context that will be used to perform actual I/O operations. This class is very anagolous to TCPSession. The TTYPort and TTYService classes are used to form thread-pool serviced serial I/O protocol sets. These can be used when one has a large number of serial devices to manage, and a single (or limited number of) thread(s) can then be used to service the tty port objects present. Each tty port supports a timer control and several virtual methods that the service thread can call when events occur. This model provides for "callback" event management, whereby the service thread performs a "callback" into the port object when events occur. Specific events supported include the expiration of a TTYPort timer, pending input data waiting to be read, and "sighup" connection breaks.  File: commoncpp2.info, Node: Block I/O, Next: Daemons, Prev: Serial I/O, Up: Framework Description 3.6 Block I/O ============= GNU Common C++ block I/O classes are meant to provide more convenient file control for paged or random access files portably, and to answer many issues that ANSI C++ leaves untouched in this area. A common base class, RandomFile, is provided for setting descriptor attributes and handling exceptions. From this, three kinds of random file access are supported. ThreadFile is meant for use by a threaded database server where multiple threads may each perform semi-independent operations on a given database table stored on disk. A special "fcb" structure is used to hold file "state", and pread/pwrite is used whenever possible for optimized I/O. On systems that do not offer pwread/pwrite, a Mutex lock is used to protect concurrent lseek and read/write operations. ThreadFile managed databases are assumed to be used only by the local server and through a single file descriptor. SharedFile is used when a database may be shared between multiple processes. SharedFile automatically applies low level byte-range "file locks", and provides an interface to fetch and release byte-range locked portions of a file. The MappedFile class provides a portable interface to memory mapped file access. One can map and unmap portions of a file on demand, and update changed memory pages mapped from files immediately through sync().  File: commoncpp2.info, Node: Daemons, Next: Persistence, Prev: Block I/O, Up: Framework Description 3.7 Daemons =========== Daemon support consists of two GNU Common C++ features. The first is the "pdetach" function. This function provides a simple and portable means to fork/detach a process into a daemon. In addition, the "slog" object is provided. "slog" is an object which behaves very similar to the Standard C++ "clog". The key difference is that the "slog" object sends it's output to the system logging daemon (typically syslogd) rather than through stderr. "slog" can be streamed with the << operator just like "clog". "slog" can also accept arguments to specify logging severity level, etc.  File: commoncpp2.info, Node: Persistence, Next: Configuration and Misc., Prev: Daemons, Up: Framework Description 3.8 Persistence =============== The GNU Common C++ Persistence library was designed with one thought foremost - namely that large interlinked structures should be easily serializable. The current implementation is _not_ endian safe, and so, whilst it should in theory be placed in the "Extras" section, the codebase itself is considered stable enough to be part of the main distribution. The Persistence library classes are designed to provide a quick and easy way to make your data structures serializable. The only way of doing this safely is to inherit your classes from the provided class Persistence::BaseObject. The macros "IMPLEMENT_PERSISTENCE" and "DECLARE_PERSISTENCE" provide all the function prototypes and implementation details you may require to get your code off the ground.  File: commoncpp2.info, Node: Configuration and Misc., Next: Numbers and Dates, Prev: Persistence, Up: Framework Description 3.9 Configuration and Misc. =========================== There are a number of odd and specialized utility classes found in Common C++. The most common of these is the "MemPager" class. This is basically a class to enable page-grouped "cumulative" memory allocation; all accumulated allocations are dropped during the destructor. This class has found it's way in a lot of other utility classes in GNU Common C++. The most useful of the misc. classes is the Keydata class. This class is used to load and then hold "keyword = value" pairs parsed from a text based "config" file that has been divided into "[sections]". Keydata can also load a table of "initialization" values for keyword pairs that were not found in the external file. One typically derives an application specific keydata class to load a specific portion of a known config file and initialize it's values. One can then declare a global instance of these objects and have configuration data initialized automatically as the executable is loaded. Hence, if I have a "[paths]" section in a "/etc/server.conf" file, I might define something like: class KeyPaths : public Keydata { public: KeyPaths() : Keydata("/server/paths") { static KEYDEF *defvalues = { {"datafiles", "/var/server"}, {NULL, NULL}}; // override with [paths] from "~/.serverrc" if avail. Load("~server/paths"); Load(defvalues); } }; KeyPaths keypaths;  File: commoncpp2.info, Node: Numbers and Dates, Next: URL Streams, Prev: Configuration and Misc., Up: Framework Description 3.10 Numbers and Dates ====================== _TODO._ This section will explain the number manipulation classes (`Number' and `ZNumber', as well as the data related classes (`Date' and `DateNumber').  File: commoncpp2.info, Node: URL Streams, Next: XML Streams and RPC, Prev: Numbers and Dates, Up: Framework Description 3.11 URL Streams ================ _TODO._ This section will explain the URLStream class, as well as the following URL related functions: `URLStream' `urlDecode' `urlEncode' `b64Decode' `b64Encode' In the meantime you can have a look at the `urlfetch.cpp' demo, which is a good example of use of URLStream to retrieve documents from URLs.  File: commoncpp2.info, Node: XML Streams and RPC, Next: Exceptions, Prev: URL Streams, Up: Framework Description 3.12 XML Streams and RPC ======================== _TODO._ This section will explain the XML streams parsing (`XMLStream' class) and XML RPC (`XMLRPC' class) facilities of Common C++. In the meantime, you can have a look at the `xmlfetch.cpp' demo, which defines a basic XML parser for URL streams.  File: commoncpp2.info, Node: Exceptions, Next: Templates, Prev: XML Streams and RPC, Up: Framework Description 3.13 Exceptions =============== _TODO._ This section will explain the exception model of Common C++, based on the `Exception' class, derived from std::exception. Other exception classes that will be commented are: `IOException', `SockException', `DirException', `DSOException', `FIFOException', `PipeException', `FileException', `FTPException', `SerException', `ThrException' and `PersistException'. In the meantime you can have a look at the exception class hierarchy on the reference manual.  File: commoncpp2.info, Node: Templates, Prev: Exceptions, Up: Framework Description 3.14 Templates ============== _TODO._ This section will explain the template subsistem of Common C++.  File: commoncpp2.info, Node: Extras, Next: Serverlets, Prev: Framework Description, Up: Top 4 Extras ******** _TODO: this is rather outdated._ At the time of the release of GNU Common C++ 1.0, it was deemed that several class libraries either were incomplete or still experimental, and the 1.0 designation seemed very inappropriate for these libraries. I also wanted to have a mechanism to later add new GNU Common C++ class libraries without having to disrupt or add experimental code into the main GNU Common C++ release. To resolve this issue, a second package has been created, and is named GNU "GNU Common C++ Extras". The extras package simply holds class frameworks that are still not considered "mature" or "recommended". This package can be downloaded, compiled, and installed, after GNU Common C++ itself. Many of the class libraries appearing in the extras package are likely to appear in GNU Common C++ proper at some future date, and should be considered usable in their current form. They are made available both to support continued development of GNU Common C++ proper and because, while not yet mature, they are considered "useful" in some manner. The initial GNU Common C++ "extras" package consisted of two libraries; Common C++ "scripting" and "math". The scripting library (-lccscript) is the GNU Bayonne scripting engine which is used as a near-realtime event driven embedded scripting engine for "callback" driven state-event server applications. The Bayonne scripting engine directly uses C++ inheritance to extend the Bayonne dialect for application specific features and is used as a core technology in the GNU Bayonne, DBS, and Meridian telephony servers and as part of the a free home automation project. There has been some discussion about folding the GNU Bayonne scripting concepts around a more conventional scripting language, and so this package currently remains in "extras" rather than part of GNU Common C++ itself. The other package found in the initial "extras" distribution is the Common C++ math libraries. These are still at a VERY early stage of development, and may well be depreciated if another suitable free C++ math/numerical analysis package comes along.  File: commoncpp2.info, Node: Serverlets, Next: Compiler Options, Prev: Extras, Up: Top 5 Serverlets ************ Serverlets are a concept popularized with Java and web servers. There is a broad abstract architectural concept of serverlets or plugins that one also finds in my GNU Common C++ projects, though they are not directly defined as part of GNU Common C++ itself. A GNU Common C++ "serverlet" comes about in a Common C++ server project, such as the Bayonne telephony server, where one wishes to define functionality for alternate hardware or API's in alternated shared object files that are selected at runtime, or to add "plugins" to enhance functionality. A serverlet is defined in this sense as a "DSO" loaded "-module" object file which is linked at runtime against a server process that exports it's base classes using "-export-dynamic". The "server" image then acts as a carrier for the runtime module's base functionality. Modules, or "serverlets", defined in this way do not need to be compiled with position independent code. The module is only used with a specific server image and so the runtime address is only resolved once rather than at different load addresses for different arbitrary processes. I recommend that GNU Common C++ based "servers" which publish and export base classes in this manner for plugins should also have a server specific "include" file which can be installed in the cc++ include directory.  File: commoncpp2.info, Node: Compiler Options, Next: Automake Services, Prev: Serverlets, Up: Top 6 Compiler Options ****************** GNU Common C++ does a few things special with automake and autoconf. When the Common C++ library is built, it saves a number of compiler options that can be retrieved by an application being configured to use GNU Common C++. These options can be retrieved from the standard output of the `ccgnu2-config' script, which is installed in the machine binaries path. This is done to assure the same compiler options are used to build your application that were in effect when GNU Common C++ itself was built. Since linkage information is also saved in this manner, this means your application's "configure" script does not have to go through the entire process of testing for libraries or GNU Common C++ related compiler options all over again. Finally, GNU Common C++ saves it's own generated `config.h' file in `cc++/config.h'(1). `ccgnu2-config' has the following options (which are shown if you type `ccgnu2-config --help'): Usage: ccgnu2-config [OPTIONS] Options: [--prefix] [--version] [--flags] [--libs] [--gnulibs] [--iolibs] [--extlibs] [--stdlibs] [--includes] For a basic usage of Common C++, you just need the options given by the following command: `ccgnu2-config --flags --stdlibs', whose output should be something like this: foo@bar:~/$ ccgnu2-config --flags --stdlibs -I/usr/local/include/cc++2 -I/usr/local/include -D_GNU_SOURCE -L/usr/local/lib -lccext2 -lccgnu2 -lxml2 -lz -ldl -pthread Note that this is just an example, the concrete output on your system will probably differ. The first output line (corresponding to `--flags') tells what directories must be added to the compiler include path, as well as global symbol definitions (`_GNU_SOURCE') needed to compile with Common C++. The second output line (corresponding to `--stdlibs') gives the linker options, both additional library path and libraries that must be linked. `ccgnu2' and `ccext2' are the two libraries Common C++ currently consists of. The other libraries shown in the example are dependencies of Common C++. The list shown below tells what information is given by each of the options that can be specified to `ccgnu2-config'. It also specifies what would be the output corresponding to the example given before. `--prefix' Common C++ Installation path prefix. For example, `/usr/local'. `--version' Common C++ version. For example, `1.0.0'. `--flags' C++ preprocessor flags. For example, `-I/usr/local/include/cc++2 -I/usr/local/include -D_GNU_SOURCE'. `--libs' C++ linker options for the main Common C++ library (`ccgnu2'). For example, `-L/usr/local/lib -lccgnu2 -ldl -pthread'. `--gnulibs' C++ linker options for the main Common C++ library (`ccgnu2'). For example, `-L/usr/local/lib -lccgnu2 -ldl -pthread'. `--iolibs' C++ linker options for the input/output Common C++ library (`ccgnu2'). For example, `-L/usr/local/lib -lccgnu2 -ldl -pthread'. `--extlibs' C++ linker options for the Common C++ "extension" library (`ccext2'). For exmple, `-lccext2 -lxml2 -lz'. `--stdlibs' C++ linker options for the whole Common C++ (`ccgnu2' and `ccext2'). For example, `-L/usr/local/lib -lccext2 -lccgnu2 -lxml2 -lz -ldl -pthread'. `--includes' Common C++ specific include path. For example, `/usr/local/include/cc++2'. ---------- Footnotes ---------- (1) On Win32 systems, a specific `config.h' located under the win32/cc++/ directory is used and installed.  File: commoncpp2.info, Node: Automake Services, Next: Configuring Sources, Prev: Compiler Options, Up: Top 7 Automake Services ******************* If you are using automake, you can add the `ost_check2.m4' macros to your projects autoconf "m4" directory and use several CCXX2_ macros for your convenience. A "minimal" `configure.in' or `configure.ac' can be constructed as: AC_INIT(something...) AC_PROG_CXX AC_PROG_CXXCPP AM_PROG_LIBTOOL AM_INIT_AUTOMAKE(....) AM_CONFIG_HEADER(my-local-config.h) OST_CCXX2_VERSION(1.0.0) Where `1.0.0' means configure will check for GNU Common C++ 2 1.0.0 or later. These are the macros currently provided: `OST_CCXX2_VERSION([MINIMUM-VERSION[,ACTION-IF-FOUND[,ACTION-IF-NOT-FOUND]]])' Test for usable version of CommonC++. `OST_CCXX2_XML([ACTION-IF-TRUE[,ACTION-IF-FALSE]])' Test whether the CommonC++ library was compiled with XML parsing support. `OST_CCXX2_HOARD' Will test for and, if found, add the SMP optimized Hoard memory allocator to your application link LIBS. `OST_CCXX2_FOX' Test for the FOX toolkit.  File: commoncpp2.info, Node: Configuring Sources, Next: Developer Documentation, Prev: Automake Services, Up: Top 8 Configuring Sources ********************* When building GNU Common C++ on platforms that support the use of configure, the following specific configuration options are provided: `--with-pthread[=lib]' using specified pthread library `--with-linuxthreads' use linux kernel mode library `--without-xml' Disable xml support `--with-ftp' Enable ftp support `--with-memaudit' Enable memory auditing `--with-stlport[=dir]' using SGI portable C++ stream library,ie: /usr/local, not all include directory `--enable-debug' compile for debugging `--enable-profiling' compile for profiling  File: commoncpp2.info, Node: Developer Documentation, Next: Licenses, Prev: Configuring Sources, Up: Top 9 Developer Documentation ************************* This chapter contains information of interest for developers of components for the GNU Common C++ framework. * Menu: * Coding Style:: How a CommonC++ 2 source file should be written. * Porting:: Common porting related problems and practices.  File: commoncpp2.info, Node: Coding Style, Next: Porting, Up: Developer Documentation 9.1 Coding Style ================ How a CommonC++ 2 source file should be written. * Menu: * Naming Convention:: Overall GNU Common C++ naming conventions. * Class Encapsulation:: Class interface design guidelines.  File: commoncpp2.info, Node: Naming Convention, Next: Class Encapsulation, Up: Coding Style 9.1.1 Naming Convention ----------------------- * *Classes and structs*. Begin with uppercase with word parts capitalized (ThisIsAClass) * *Method (function member, also static member)*. Begin with lowercase with word parts capitalized (setSomething, send). If a member variable is set, a `setXxxx' style name should be used, and if a member variable is fetched, a `getXxxx' style name should be used. Sometimes things might both set and perform an action, like `setError' in place of `Error' in the older release, in which case, set should still be used as the prefix. Function to handle some event (such as data arrival) should begin with `on' (ex: `onInput') * *Data member*. Begin with lowercase with word parts capitalized (`currentThread') private member can begin with underscore (_). * *Global function*. Begin with lowercase with word parts capitalized (`getThread'). * *Enumeration type*. Begin with uppercase with word parts capitalized (`Error'). * *Enumeration item*. Begin with lowercase with word parts capitalized (`errSuccess'). First word should refer to enumeration type (`errFailure', cancelImmediate). For error enum we use the prefix `err' (everyone should understand the meaning). * *Member data types*. Sometimes a class might use internal member data types or structs. These should be written using `class' rather than struct wherever possible and treated as inner `classes'. Hence, they would be capitalized in the same conventions of a class.  File: commoncpp2.info, Node: Class Encapsulation, Prev: Naming Convention, Up: Coding Style 9.1.2 Class Encapsulation ------------------------- * *Friend functions*. To clean up the namespace we are looking to eliminate _friend functions_ that exist in the default or ost namespace and we are suggesting that in many cases static member functions should be used in place of friend functions unless the friend function is actually used in multiple classes. A typical example of this is found in things like `getXXX', which might be a friend function for finding a specific named instance of `XXX' thru a self organized link list contained in `XXX'. Rather, it is suggested for this to use a static member something like `XXX::find'. * *Scope of view and inheritance*. In many cases we combine and mix classes directly in GNU Common C++ (multiple inheritence). Hence, classes have to be well designed for this possibility. Ideally things that should not be exposed to derived classes should be made private so that clashes mixing similar classes with common named members do not need to occur. * *Access to member properties*. A well formed GNU Common C++ class need not expose more than is nessisary for it's practical and effective use in derived classes or thru proper public methods. Ideally set and get members should be used to manipulate internal member variables thru public interfaces rather than exposing property values directly thru public declarations. These set and get methods should use appropriate valid range and error checking logic. Member properties can often be made visible protected to optimize the code of derived classes, and care then needs to be taken when creating derived classes to make sure they do have reasonable error checking when needed. * *Constructors and destructors*. It is very common in GNU Common C++ for the constructor to create or obtain a resource that remains in scope as long as the object does, and is then releas\ed in the destructor when the object falls out of scope. Things like Mutexes, Threads and Semaphores and such very much behave this way.  File: commoncpp2.info, Node: Porting, Prev: Coding Style, Up: Developer Documentation 9.2 Porting =========== Only for no-remake same problem :). * FreeBSD: assuming having thread A and B. If A call pthread_join on B and B call pthread_detach and then exit thread A hang. * Solaris: On multiple inheriting from streambuf and iostream together streambuf should inherited first (and initialized too). * Win32/MSVC6: if you use CC++ DLL library you MUST use C++ DLL library. `iostream' use a pointer to object. This object pointer can be different from library static linked and dinamically linked, so iostream see distinct object, causing strange exception and crashes. * GCC: including declaration for polimorphic class cause link to typeinfo, but typeinfos are defined only in module with classes constructors Include only needed header (this problem disappear with optimization).  File: commoncpp2.info, Node: Licenses, Next: Class and Data Type Index, Prev: Developer Documentation, Up: Top Appendix A Licenses ******************* * Menu: * GNU Free Documentation License:: License for this document. * GNU General Public License:: License for the library. * GNU Common C++ Linking Exception:: Library linking exception.  File: commoncpp2.info, Node: GNU Free Documentation License, Next: GNU General Public License, Up: Licenses A.1 GNU Free Documentation License ================================== Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warrany Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See `http://www.gnu.org/copyleft/'. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. A.1.1 ADDENDUM: How to use this License for your documents ---------------------------------------------------------- To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: commoncpp2.info, Node: GNU General Public License, Next: GNU Common C++ Linking Exception, Prev: GNU Free Documentation License, Up: Licenses A.2 GNU GENERAL PUBLIC LICENSE ============================== Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. A.2.1 Preamble -------------- The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b. Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS A.2.2 Appendix: How to Apply These Terms to Your New Programs ------------------------------------------------------------- If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) YYYY NAME OF AUTHOR This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. SIGNATURE OF TY COON, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.  File: commoncpp2.info, Node: GNU Common C++ Linking Exception, Prev: GNU General Public License, Up: Licenses A.3 GNU Common C++ Linking Exception ==================================== As a special exception to the GNU General Public License, permission is granted for additional uses of the text contained in its release of Common C++. The exception is that, if you link the Common C++ library with other files to produce an executable, this does not by itself cause the resulting executable to be covered by the GNU General Public License. Your use of that executable is in no way restricted on account of linking the Common C++ library code into it. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. This exception applies only to the code released under the name Common C++. If you copy code from other releases into a copy of Common C++, as the General Public License permits, the exception does not apply to the code that you add in this way. To avoid misleading anyone as to the status of such modified files, you must delete this exception notice from them. If you write modifications of your own for Common C++, it is your choice whether to permit this exception to apply to your modifications. If you do not wish that, delete this exception notice.  File: commoncpp2.info, Node: Class and Data Type Index, Next: Method and Function Index, Prev: Licenses, Up: Top Class and Data Type Index ************************* [index] * Menu: * AtomicCounter: Synchronization. (line 54) * BroadcastAddress: Sockets. (line 11) * cistring: Templates. (line 6) * Counter: Templates. (line 6) * cstring: Templates. (line 6) * Date: Numbers and Dates. (line 6) * DateNumber: Numbers and Dates. (line 6) * DirException: Exceptions. (line 9) * DSOException: Exceptions. (line 9) * Event: Synchronization. (line 48) * Exception: Exceptions. (line 6) * FIFOException: Exceptions. (line 9) * FileException: Exceptions. (line 9) * FTPException: Exceptions. (line 9) * InetAddress: Sockets. (line 11) * InetHostAddress: Sockets. (line 11) * InetMaskAddress: Sockets. (line 11) * IOException: Exceptions. (line 9) * Keydata: Configuration and Misc.. (line 13) * keyMap]: Templates. (line 6) * MappedFile: Block I/O. (line 27) * MemPager: Configuration and Misc.. (line 6) * Mutex: Synchronization. (line 11) * Number: Numbers and Dates. (line 6) * objCounter: Templates. (line 6) * objList: Templates. (line 6) * objMap: Templates. (line 6) * objSync: Templates. (line 6) * Persistence::BaseObject: Persistence. (line 13) * PersistException: Exceptions. (line 9) * PipeException: Exceptions. (line 9) * Pointer: Templates. (line 6) * RandomFile: Block I/O. (line 6) * Semaphore: Synchronization. (line 41) * SerException: Exceptions. (line 9) * SharedFile: Block I/O. (line 22) * Slog: Daemons. (line 11) * Socket: Sockets. (line 21) * SocketPort: Sockets. (line 73) * SocketService: Sockets. (line 73) * SockException: Exceptions. (line 9) * std::exception: Exceptions. (line 6) * TCPSession: Threading Concepts. (line 138) * TCPStream <1>: Sockets. (line 28) * TCPStream: Threading Concepts. (line 138) * Thread: Threading Concepts. (line 37) * ThreadFile: Block I/O. (line 13) * ThreadKey: Synchronization. (line 54) * ThreadLock: Synchronization. (line 32) * ThrException: Exceptions. (line 9) * TTYPort: Serial I/O. (line 42) * TTYService: Serial I/O. (line 42) * TTYSession: Serial I/O. (line 37) * ttystream: Serial I/O. (line 28) * TTYStream: Serial I/O. (line 28) * UDPBroadcast: Sockets. (line 60) * UDPDuplex: Sockets. (line 65) * UDPSocket: Sockets. (line 51) * URLStream: URL Streams. (line 6) * XMLRPC: XML Streams and RPC. (line 6) * XMLStream: XML Streams and RPC. (line 6) * ZNumber: Numbers and Dates. (line 6)  File: commoncpp2.info, Node: Method and Function Index, Next: Concept Index, Prev: Class and Data Type Index, Up: Top Method and Function Index ************************* [index] * Menu: * abs: Templates. (line 6) * b64Decode: URL Streams. (line 15) * b64Encode: URL Streams. (line 17) * DECLARE_PERSISTENCE: Persistence. (line 13) * getThread: Threading Concepts. (line 99) * IMPLEMENT_PERSISTENCE: Persistence. (line 13) * MappedFile::sync: Block I/O. (line 27) * operator new: Threading Concepts. (line 92) * pdetach: Daemons. (line 6) * pwread: Block I/O. (line 13) * pwwrite: Block I/O. (line 13) * Slog::operator<<: Daemons. (line 11) * TCPSocket::onAccept: Sockets. (line 45) * TCPStream::operator<<: Sockets. (line 28) * TCPStream::operator>>: Sockets. (line 28) * Thread::exit: Threading Concepts. (line 66) * Thread::final: Threading Concepts. (line 92) * Thread::onDisconnect: Threading Concepts. (line 124) * Thread::onHangup: Threading Concepts. (line 124) * Thread::run: Threading Concepts. (line 37) * Thread::setCancellation: Threading Concepts. (line 66) * Thread::signal: Threading Concepts. (line 124) * Thread::terminate: Threading Concepts. (line 74) * TTYStream::operator<<: Serial I/O. (line 28) * TTYStream::operator>>: Serial I/O. (line 28) * urlDecode: URL Streams. (line 11) * urlEncode: URL Streams. (line 13) * URLStream: URL Streams. (line 9)  File: commoncpp2.info, Node: Concept Index, Prev: Method and Function Index, Up: Top Concept Index ************* [index] * Menu: * APE: Threading Concepts. (line 6) * autoconf <1>: Compiler Options. (line 6) * autoconf: Threading Concepts. (line 14) * automake: Compiler Options. (line 6) * automake macros: Automake Services. (line 6) * automake services: Automake Services. (line 6) * Automake Services: Automake Services. (line 6) * Block I/O: Block I/O. (line 6) * cancelable threads: Threading Concepts. (line 61) * cancellation: Threading Concepts. (line 66) * cancellation point: Threading Concepts. (line 66) * ccgnu2-config: Compiler Options. (line 6) * Class Encapsulation: Class Encapsulation. (line 6) * clog: Daemons. (line 11) * Coding Style: Coding Style. (line 6) * Compiler Options: Compiler Options. (line 6) * config.h: Compiler Options. (line 6) * configuration: Compiler Options. (line 6) * Configuration and Misc.: Configuration and Misc.. (line 6) * configure.ac: Automake Services. (line 6) * configure.in: Automake Services. (line 6) * Configuring Sources: Configuring Sources. (line 6) * Daemons: Daemons. (line 6) * detached thread: Threading Concepts. (line 92) * Developer Documentation: Developer Documentation. (line 6) * distribution: Distribution. (line 6) * DLL: Porting. (line 14) * Dont-Route: Sockets. (line 21) * Exceptions: Exceptions. (line 6) * execution context: Threading Concepts. (line 37) * Extras: Extras. (line 6) * FDL, GNU Free Documentation License: GNU Free Documentation License. (line 6) * Framework Description: Framework Description. (line 6) * free software: Distribution. (line 6) * FreeBSD: Porting. (line 8) * GCC: Porting. (line 20) * GNU Common C++ Linking Exception: GNU Common C++ Linking Exception. (line 6) * GNU FDL: Distribution. (line 6) * GNU GPL: Distribution. (line 6) * GNU pth: Threading Concepts. (line 23) * Introduction: Introduction. (line 6) * Java sockets: Sockets. (line 6) * Java threading: Threading Concepts. (line 6) * Keep-Alive: Sockets. (line 21) * linking exception: Distribution. (line 6) * linux threads: Threading Concepts. (line 53) * MSVC: Porting. (line 14) * namespace: Overall Concepts. (line 6) * Naming Convention: Naming Convention. (line 6) * Numbers and Dates: Numbers and Dates. (line 6) * ost: Overall Concepts. (line 6) * ost namespace: Overall Concepts. (line 6) * OST_CCXX2_FOX: Automake Services. (line 33) * OST_CCXX2_HOARD: Automake Services. (line 29) * OST_CCXX2_VERSION: Automake Services. (line 22) * OST_CCXX2_XML: Automake Services. (line 25) * ost_commoncxx.m4: Automake Services. (line 6) * ost_pthread.m4: Threading Concepts. (line 14) * Overall Concepts: Overall Concepts. (line 6) * Persistence: Persistence. (line 6) * philosophy: Distribution. (line 6) * Porting: Porting. (line 6) * priority: Threading Concepts. (line 44) * pth: Threading Concepts. (line 23) * pthread: Threading Concepts. (line 14) * pthread_join: Porting. (line 8) * pthread_self: Threading Concepts. (line 99) * QoS: Sockets. (line 21) * reference counting: Synchronization. (line 54) * reference manual: Introduction. (line 10) * resumed: Threading Concepts. (line 53) * Serial I/O: Serial I/O. (line 6) * Serverlets: Serverlets. (line 6) * SIGCONT: Threading Concepts. (line 53) * SIGHUP: Threading Concepts. (line 124) * SIGPIPE: Threading Concepts. (line 124) * SIGSTOP: Threading Concepts. (line 53) * SIGUSR1: Threading Concepts. (line 53) * slog: Daemons. (line 6) * Sockets: Sockets. (line 6) * sockopt: Sockets. (line 21) * Solaris: Porting. (line 11) * solaris threads: Threading Concepts. (line 53) * suspended: Threading Concepts. (line 53) * Synchronization: Synchronization. (line 6) * TCPSocket: Sockets. (line 35) * Templates: Templates. (line 6) * termination: Threading Concepts. (line 37) * thread destruction: Threading Concepts. (line 74) * thread initialization: Threading Concepts. (line 74) * thread join: Threading Concepts. (line 84) * thread priority: Threading Concepts. (line 44) * thread termination: Threading Concepts. (line 37) * threading: Threading Concepts. (line 6) * Threading Concepts: Threading Concepts. (line 6) * threading model: Threading Concepts. (line 31) * URL related functions: URL Streams. (line 6) * URL Streams: URL Streams. (line 6) * Win32: Porting. (line 14) * XML Streams and RPC: XML Streams and RPC. (line 6)  Tag Table: Node: Top1002 Node: Introduction2369 Node: Distribution4700 Node: Framework Description7103 Node: Overall Concepts8272 Ref: Overall Concepts-Footnote-19367 Ref: Overall Concepts-Footnote-29494 Node: Threading Concepts9678 Node: Synchronization17623 Node: Sockets20766 Node: Serial I/O25171 Node: Block I/O27927 Node: Daemons29404 Node: Persistence30124 Node: Configuration and Misc.31042 Node: Numbers and Dates32767 Node: URL Streams33100 Node: XML Streams and RPC33576 Node: Exceptions33996 Node: Templates34614 Node: Extras34808 Node: Serverlets37045 Node: Compiler Options38506 Ref: Compiler Options-Footnote-142147 Node: Automake Services42258 Node: Configuring Sources43393 Node: Developer Documentation44150 Node: Coding Style44589 Node: Naming Convention44910 Node: Class Encapsulation46616 Node: Porting48896 Node: Licenses49848 Node: GNU Free Documentation License50234 Node: GNU General Public License72666 Node: GNU Common C++ Linking Exception91941 Node: Class and Data Type Index93312 Node: Method and Function Index98165 Node: Concept Index100409  End Tag Table commoncpp2-1.8.1/doc/Makefile.in0000644000175000017500000005476011463364513013353 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ subdir = doc DIST_COMMON = $(commoncpp2_TEXINFOS) $(srcdir)/Doxyfile.in \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = Doxyfile CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = INFO_DEPS = $(srcdir)/commoncpp2.info TEXINFO_TEX = $(top_srcdir)/autoconf/texinfo.tex am__TEXINFO_TEX_DIR = $(top_srcdir)/autoconf DVIS = commoncpp2.dvi PDFS = commoncpp2.pdf PSS = commoncpp2.ps HTMLS = commoncpp2.html TEXINFOS = commoncpp2.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips am__installdirs = "$(DESTDIR)$(infodir)" 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' DATA = $(noinst_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = Doxyfile Doxyfile.in info_TEXINFOS = commoncpp2.texi commoncpp2_TEXINFOS = gpl.texi fdl.texi fdlnotice.texi @DOXY_TRUE@noinst_DATA = doxy all: all-am .SUFFIXES: .SUFFIXES: .dvi .html .info .pdf .ps .texi $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs .texi.info: restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $< .texi.pdf: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $< .texi.html: rm -rf $(@:.html=.htp) if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@; \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ else \ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ exit 1; \ fi $(srcdir)/commoncpp2.info: commoncpp2.texi $(commoncpp2_TEXINFOS) commoncpp2.dvi: commoncpp2.texi $(commoncpp2_TEXINFOS) commoncpp2.pdf: commoncpp2.texi $(commoncpp2_TEXINFOS) commoncpp2.html: commoncpp2.texi $(commoncpp2_TEXINFOS) .dvi.ps: TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && \ (install-info --version && \ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf commoncpp2.aux commoncpp2.cp commoncpp2.cps commoncpp2.fn \ commoncpp2.fns commoncpp2.ky commoncpp2.kys commoncpp2.log \ commoncpp2.pg commoncpp2.pgs commoncpp2.tmp commoncpp2.toc \ commoncpp2.tp commoncpp2.tps commoncpp2.vr commoncpp2.vrs clean-aminfo: -test -z "commoncpp2.dvi commoncpp2.pdf commoncpp2.ps commoncpp2.html" \ || rm -rf commoncpp2.dvi commoncpp2.pdf commoncpp2.ps commoncpp2.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(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 $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info check-am: all-am check: check-am all-am: Makefile $(INFO_DEPS) $(DATA) installdirs: for dir in "$(DESTDIR)$(infodir)"; 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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-aminfo clean-generic clean-libtool clean-local \ mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: $(DVIS) html: html-am html-am: $(HTMLS) info: info-am info-am: $(INFO_DEPS) install-data-am: install-info-am install-dvi: install-dvi-am install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-am install-html-am: $(HTMLS) @$(NORMAL_INSTALL) test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ if test -d "$$d$$p"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d$$p"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-am install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if (install-info --version && \ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-pdf: install-pdf-am install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-am install-ps-am: $(PSS) @$(NORMAL_INSTALL) test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: $(PDFS) ps: ps-am ps-am: $(PSS) uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-pdf-am uninstall-ps-am .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-aminfo clean-generic \ clean-libtool clean-local dist-info distclean \ distclean-generic distclean-libtool 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-aminfo maintainer-clean-generic mostlyclean \ mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-dvi-am \ uninstall-html-am uninstall-info-am uninstall-pdf-am \ uninstall-ps-am @DOXY_TRUE@doxy: Doxyfile @DOXY_TRUE@ $(DOXYGEN) Doxyfile @DOXY_TRUE@ touch doxy clean-local: -rm -rf html -rm -rf latex -rm -rf man3 # 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: commoncpp2-1.8.1/doc/fdlnotice.texi0000644000175000017500000000056211463314535014136 00000000000000Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". commoncpp2-1.8.1/doc/fdl.texi0000644000175000017500000005100211463314535012727 00000000000000 @node GNU Free Documentation License @appendixsec GNU Free Documentation License @cindex FDL, GNU Free Documentation License @center Version 1.2, November 2002 @display Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @enumerate 0 @item PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document @dfn{free} in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. @item APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain @sc{ascii} without markup, Texinfo input format, La@TeX{} input format, @acronym{SGML} or @acronym{XML} using a publicly available @acronym{DTD}, and standard-conforming simple @acronym{HTML}, PostScript or @acronym{PDF} designed for human modification. Examples of transparent image formats include @acronym{PNG}, @acronym{XCF} and @acronym{JPG}. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, @acronym{SGML} or @acronym{XML} for which the @acronym{DTD} and/or processing tools are not generally available, and the machine-generated @acronym{HTML}, PostScript or @acronym{PDF} produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. @item VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. @item COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. @item MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: @enumerate A @item Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. @item List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. @item State on the Title page the name of the publisher of the Modified Version, as the publisher. @item Preserve all the copyright notices of the Document. @item Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. @item Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. @item Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. @item Include an unaltered copy of this License. @item Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @item Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. @item Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version. @item Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section. @item Preserve any Warranty Disclaimers. @end enumerate If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. @item COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.'' @item COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. @item AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. @item TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warrany Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. @item TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @item FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See @uref{http://www.gnu.org/copyleft/}. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. @end enumerate @page @appendixsubsec ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: @smallexample @group Copyright (C) @var{year} @var{your name}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end group @end smallexample If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with...Texts.'' line with this: @smallexample @group with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. @end group @end smallexample If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. @c Local Variables: @c ispell-local-pdict: "ispell-dict" @c End: commoncpp2-1.8.1/doc/Doxyfile.in0000644000175000017500000013205411463314535013411 00000000000000# Doxyfile 1.3.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "GNU CommonC++" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = "license=\par License:\n" # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory # hierarchy in the documentation. SHOW_DIRECTORIES = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = @top_srcdir@/inc/cc++ # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = private.h # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = @top_srcdir@/demo \ @top_srcdir@/tests # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = YES # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = . # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = CCXX_IPV6=1 CCXX_NAMESPACES=1 HAVE_MODULES=1 HAVE_SNPRINTF=1 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO commoncpp2-1.8.1/doc/Doxyfile0000644000175000017500000013201611463364532013004 00000000000000# Doxyfile 1.3.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = "GNU CommonC++" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = . # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is used # as the annotated text. Otherwise, the brief description is used as-is. If left # blank, the following values are used ("$name" is automatically replaced with the # name of the entity): "The $name class" "The $name widget" "The $name file" # "is" "provides" "specifies" "contains" "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = "license=\par License:\n" # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory # hierarchy in the documentation. SHOW_DIRECTORIES = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ../inc/cc++ # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc FILE_PATTERNS = *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = private.h # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = ../demo \ ../tests # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = YES # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = . # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = CCXX_IPV6=1 CCXX_NAMESPACES=1 HAVE_MODULES=1 HAVE_SNPRINTF=1 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superseded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO commoncpp2-1.8.1/NEWS0000644000175000017500000001447611463314527011240 00000000000000Common C++ Library NEWS -- history of visible user changes. 2000-05-22 Release 1.9.0 This is a reorganized release that has been created as an intermediary release to Common C++ 2.0. Includes sources reorganized into a single working directory source directory and merged from the split sources for win32, posix, and common that we used to do. It also includes the new Common C++ template library and namespace support. Release 1.3.0 Some basic changes have been made to start the migration to Common C++ 2.0. Those changes possible within the current 1.x framework have been completed, including using inherited exception control, new UDP socket pairings for supporting RTP directly, and other subtle changes to many Common C++ class hierarchies. The most interesting change is the introduction of doxygen as the standard documentation tool for Common C++, thanks to Samoylov Olieg. This should elminiate difficulties for windows users at the same time. Currently, a Doxyfile set exists for posix documentation, and a win32 specific Doxywin32 may be added later. Release 1.2.0 In some ways this is the first "fully modern" Common C++ release. A lot of work has already been put into making Common C++ updated with the most current C++ coding practices while retaining full backward compatibility. A number of inconsistancies have been found and fixed in the code during this process. Also, much work has gone into making the Win32 source tree functional and more current with the Posix source tree. Release 1.1.0 Perhaps the most visible changes are that a lot of work has gone into making Common C++ code generally more portable, and specifically into adding Unixware support which we are now able to test compile here. Also, polling support has been introduced into the services modules, and this has altered the size of the SocketPort and SerialPort classes. Finally, we are doing most of our target testing with cross compilers now, and some further work has been done in supporting cross compiler builds. Release 1.0.1 Several bugs related to building under Solaris have been fixed. In addition, a major bug in DSO support was found whereby loading more than one DSO would crash. Release 1.0.0 With this release, the Common C++ project has become part of the GNU project. This release saw the introduction of a proper overview document, as well as special handling for the "namespace.h" header improved, and the Common C++ library split between Common C++ proper and Common C++ "extras". Experimental and incomplete Common C++ frameworks are found in the new "extras" package. Release 0.9.7 A large effort was put into cleaning up the Win32 source tree. We are now able to compile all of win32 cleanly using mingw32 under GNU/Linux, as well as most of "common". Currently the Bayonne "script" engine cannot be compiled under win32 successfully since no "slog" has been defined for win32 as of yet. In addition, a number of minor supporting functions were found to be nessisary and were added due to continuing work on the Bayonne IVR engine. This release should sychronize Common C++ and Bayonne IVR development. Release 0.9.6 The most important change in the 0.9.6 release is that the entire "File" class hierarchy has finally been rewritten. This new hierarchy is based on "RandomFile" and is clearly and more clearly designed for physical block and record oriented I/O and hence clearly seperate from "streaming". Another major change is in the MappedFile class which now allows arbitrary remapping of multiple segments of a file and uses mutex locks for concurrent access control. Release 0.9.5 After a long delay, release 0.9.5 is here. It includes support for cleanly cross-compiling solaris targets, and offers "rwlock" based ThreadLock as a new sychronization object. This release also offers a first cut of the new Bayonne state/event scripting engine classes. The Bayonne engine allows one to create an embedded class extensible scripting engine for C++ applications. Release 0.9.4 With release 0.9.4, new support has been created in posix for using the syslog facility and fifo stream I/O in Common C++. A lot of fixups were done related to streaming and the win32 tree. Release 0.9.2 With release 0.9.2 of the newly merged Common C++ APE libraries, support has been added for C++ "stream" driven serial I/O. Serial I/O classes support single threaded streams, thread driven serial streams, and serial ports managed through pooled service threads. This support now exists in the Posix source tree, and will be added to win32 very soon. Declaration With this declaration, the APE project, a Portable C++ Environment, (http://www.voxilla.org/projects/projape.html>, formally and publicly announces it's merger with the Common C++ project as currently hosted on Source Forge. With this declaration, the following is announced: 1. A new, combined GPL licensed project, retaining the name 'Common C++', a portable application framework, has been formed. This new project will be licensed under the same terms and conditions as APE is today. 2. All existing Common C++ source files are now held in copyright of the Open Source Telecomm Corporation (http://www.ostel.com) along with APE. 3. The new Common C++ project will retain and be developed from the existing "1.2.3" release of APE. APE will be expanded to include the Common C++ persistence engine, math, and html libraries. All work related to future releases of APE will be derived from the new Common C++ APE code base and will also retain the Common C++ name in the future. 4. APE, renamed Common C++, will remain a true cross platform C++ class framework and APE portability will be extended to all previous Common C++ classes. 5. The existing Common C++ SourceForge development and cvs areas will be retained for use by the new combined project. Common C++ is an openly developed project and continues to welcome outside contributors. In announcing this merger, we believe we can better serve the open source community at large, and the C++ application development community specifically. In selecting to continue the Common C++ name going forward, we believe we are better able to identify the project as a general purpose C++ framework. All information related to this new project may be found by visiting http://sourceforge.net/project/?group_id=1523. Any questions may be addressed to David Sugar . commoncpp2-1.8.1/ChangeLog0000644000175000017500000012713211463314527012305 00000000000000From Common C++ 1.8.0 to 1.8.1 - zero length udp in sender and peer. - use of long int in sock option. - various exception fixes. - thread subscribe/unsubscribe fix. From Common C++ 1.7.3 to 1.8.0 - sigwait argument detection fixed for pedantic compiles. - pedantic fixups for gcc 4.4 - application logging - patch for persistant stream compression - patch for linked object insert placement - patch for linked double insert method From Common C++ 1.7.2 to 1.7.3 - missing dccp demo apps and socket exceptions added. From Common C++ 1.7.1 to 1.7.2 - missing server accept constructor for DCCP sockets. - fix ThreadQueue win32 compile error - update test - missing get{Tx,Rx}CCID methods for DCCP sockets. - fix wrong type for setCCID method - demo app for dccp sockets From Common C++ 1.7.0 to 1.7.1 - const fix from Marty Jack. - memory leak fixed for ThreadLock. - dccp socket support contributed by Leandro Melo de Sales and David Sugar. From Common C++ 1.6.4 to 1.7.0 - Pedantic code cleanup. - Some fix for multicast. From Common C++ 1.6.3 to 1.6.4 - New library naming policy for RPM packages From Common C++ 1.6.2 to 1.6.3 - Debian patches applied upstream - Some code cleanup From Common C++ 1.6.1 to 1.6.2 - fix pointer.h for recursive/multiple include - dsp files updated. From Common C++ 1.6.0 to 1.6.1 - some fixups for mingw32 based builds From Common C++ 1.5.9 to 1.6.0 - patch for ThreadQueue from Angelo Naselli - patch for LinkedDouble from Sergio Repetto, changed abi. From Common C++ 1.5.7 to 1.5.9 - changes for make-in-place builds - a few gentoo patches, such as for --as-needed build link option and for gnutls/openssl selection From Common C++ 1.5.6 to 1.5.7 - fix for w32 overlapped serial i/o from Thomas Pfaff - downstream gcc 4.3 and isRunning fix from Mark Purcell - sha digest cleanup From Common C++ 1.5.5 to 1.5.6 - visibility for shared library symbols - upstream debian patches From Common C++ 1.5.4 to 1.5.5 - missing lz in ccext2.pc, ssl/zstream links for libccext2 in src/Makefile.am From Common C++ 1.5.3 to 1.5.4 - hi resolution and monotonic timers for TimerPort - TimerPort synchronized sleep - Mingw compile fix for ll consts in epoch calculation - Angelo Naselli's revised timed buffer thread queue - other minor patches and fixes, code cleanup - fixes for mingw32 (cross compile) targets and building dll's - fix for relative build path in configure From Common C++ 1.5.2 to 1.5.3 - some code cleanup of operators and const members - removal of -local-data hook in main Makefile for ease of cross-compiler use From Common C++ 1.5.1 to 1.5.2 - fix for include path passed in .pc files. - small Solaris patch From Common C++ 1.5.0 to 1.5.1 - gnutls support used for SSLStream From Common C++ 1.4.3 to 1.5.0 - added IPV4/V6Cidr objects for use in routing policies. - removed libxml2 wrapper option so we can better focus on Common C++'s built-in sax parser. - addition of "clean" MemPager protected member, used by Keydata to assure dynamic object behavior is correct and non-leaking. From Common C++ 1.4.2 to 1.4.3 - fix for getThread id if priv is NULL. - fix for extern "C" of handlers and types. - fix for keydata loadPrefix for w32. - use readData/writeData for overflow/underflow in TCPStream to allow override in SSLStream - optional introduction of SSLStream class - new SSLStream class cannot be built substituting gnutls yet because openssl emulation is not thread-safe and so class must be rewritten explicitly for gnutls. Hence for now ssl is disabled by default - one small change to w32 serial From Common C++ 1.4.1 to 1.4.2 - fix for possible race condition in detach - fix for url.get with relocated objects without path - use of MSG_NOSIGNAL in ::send( to avoid signals with disconnect - a fix for mingw32 and file.cpp From Common C++ 1.4.0 to 1.4.1 - set etctest correctly for posix targets with forced sysconfdir. From Common C++ 1.3.26 to 1.4.0 - Templates no longer DLL export managed. Explicit DLL interface instanciation is now recommended instead for building native .dll's with templates on broken Microsoft compilers. - export templates cleaned up and __EXPORT_TEMPLATE added - RefPointer and RefObject classes for reference count managed objects - LinkedSingle and LinkedDouble self managing linked list classes - MapTable and mapObject classes for managed hash indexes - Some convenience functions for keydata - conditional build for extras library - isRealtime check for thread priority management - moved templates into main header From Common C++ 1.3.25 to 1.3.26 - page request overflow triggers abort. - small code cleanups. - keydata uses bigger default paging for >32 bit pointers. - new errLockFailure indicator for Thread shared files. - added exception handling for SocketService and SerialService constructors. From Common C++ 1.3.24 to 1.3.25 - fix for XMLRPC - bindings for templates in dll's From Common C++ 1.3.23 to 1.3.24 - persistance engine exceptions unified From Common C++ 1.3.22 to 1.3.23 - fix for std:: in mutex.cpp. From Common C++ 1.3.21 to 1.3.22 - some fixups for casting for w32. - new spec file... - small fix for socket writeData and url parsing. - allow SO_REUSEADDR in w32... - fix w32 socket disconnect. - _POSIX_PTHREAD_SEMANTICS defined before signal.h - freebsd6 nat fix - improvements in generated documentation From Common C++ 1.3.20 to 1.3.21 - use ios header for gcc atomics - spec file fixed - fix for null keys for Keydata loadFile From Common C++ 1.3.19 to 1.3.20 - fix for pthread platforms with expiration.... - always explicity set protocol numbers for tcp & udp - fix for some header inlines and define checks... From Common C++ 1.3.18 to 1.3.19 - fix w32/Makefile.bcc error in clean target when -DBMODE=DEBUG - fix tests/thread1.cpp to compile with Microsoft Visual C++ 6.0 - fix Microsoft build file line end convention from -kb to -ko - fix for w32 TCPSession connect issue From Common C++ 1.3.17 to 1.3.18 - fix for w32 platform sdk/ipv6 dependencies and entanglements from Pino - fix for Borland w32 from Pino From Common C++ 1.3.16 to 1.3.17 - freebsd nanosleep define fix From Common C++ 1.3.15 to 1.3.16 - inline header fix. From Common C++ 1.3.14 to 1.3.15 - dupString added as alias to newString. - parent notify disabled, in case parent already deleted, will be fixed later by using tids... From Common C++ 1.3.13 to 1.3.14 - some fixups for AIX and Visual Age C++. From Common C++ 1.3.12 to 1.3.13 - fix for automake generated install of ccgnu2-config. - important fix for string class from Migel Nick. - setUpper/setLower added. From Common C++ 1.3.11 to 1.3.12 - some stuff for fussy compilers. - fix for w32 setting of active thread id. - better deadlock debugging support - mutex deadlock trace support added for win32. From Common C++ 1.3.10 to 1.3.11 - socket public inheritence for SimpleTCPStream. From Common C++ 1.3.9 to 1.3.10 - fix for macosx 10.4 From Common C++ 1.3.8 to 1.3.9 - fix for socket.cpp from Uwe Buchholz - fix for suspend/resume and exchange atomics.. From Common C++ 1.3.7 to 1.3.8 - fix for missing mime.cpp From Commom C++ 1.3.6 to 1.3.7 - start of MIME multipart support - seperate test for mlock() - better support for w32 vs6 with platform sdk installed; ipv6 now enabled! From Common C++ 1.3.5 to 1.3.6 - fix for w32 gettimeofday implimentation. From Common C++ 1.3.4 to 1.3.5 - fix critical bug in assoc getPointer(). - alternate keydata constructor. From Common C++ 1.3.3 to 1.3.4 - detached thread exiting cleanup (posix). - fix for more general case multicast when no interface binding on posix. - GNU/Hurd target support. From Common C++ 1.3.2 to 1.3.3 - multicast support for w32 platform from dmcamens patch. - kill final delete this in TCPSession and add virtual destructor. - added virtual destructor for TTYSession, UnixSession From Common C++ 1.3.1 to 1.3.2 - fix for keydata exit close on non-opened objects. - string.h pragma pack wrapped. - pkgconfig fix for libccext2.pc. - gcc atomics patch - HAVE_SNPRINTF defined for docs - posix getValue for semaphore removed. From Common C++ 1.3.0 to 1.3.1 - serialization of pairs... - run-list non-blocking callback semaphore-like operation class - fix for demo tcpservice - fix for TTYStream underflow. - fix for missing overlap on strlcpy/strlcat - two level /etc check - security fix; keydata config file paths can no longer be "relocated" through environment manipulation! "CONFIG_KEYDATA" env gone! - security fix; config files must be root owned or match process uid - virtuals no longer have inline defs - update to change exception notice to match GNU libstdc++ runtime exception. - named assoc misc base class. From Common C++ 1.2.4 to 1.3.0 - separation of tested Common C++ compile options from passed CXXFLAGS - Buffer class moved into base library - getopt moved to ext library - Buffer, sockt streaming, and xml 64 bit clean...breaks prior signatures - new compressed stream classes - use of conditional to impliment posix semaphore class! Timed semaphore support in both win32 and posix. - system-wide Lockfile class. - killed old fifo class. - new memory locking options for MappedFile. - more portable process system / resource info functions - portable lastAccessed and lastModified functions - better support for posix realtime extensions - some tru64 configure issues resolved - all uses of signal use Process:: based signal classes build from sigaction rather than default "signal()" function, hence behavior is known and consistent. - hpux loader fix - start of transitional interface to using getaddrinfo and char strings for fast connection lookup. Eventually all classes will use this method by 1.4.0 (as well as retaining current methods by addr object). - odd tcpstream class family gone; TCPStream can now be used same way. - demo apps updated for new interfaces - socketport moved to ccext2 - greater flexibility in use of Keydata objects and new keydump demo app. - StringTokenizer moved to ext library - tcp streaming rewritten to make use of segment sizing and buffering. - local build instance defaults can be in ~/.configure. - MemPagerObject and StringObject added to live in pager memory. - DirTree added to walk recursive directory structures quickly. - StackPager to cache objects. - new OST_CCXX2_CHECK macro for cleaner autoconf/automake interface. - support of IPV6 for w32 target when built native from vs.net. - windows registry support for keydata. - updated for latest FreeBSD, OpenBSD, and NetBSD. From Common C++ 1.2.3 to 1.2.4 - patch for url proxy by Andrey Kulikov - fix for ambigious exception handling - Chad Yates patches for unit tests and persistence engine - Ricardo Gameiro's nat/netfilter support From Common C++ 1.2.2 to 1.2.3 - w32 mutex now possible to base on critical section or w32 mutex using kulikov patch. - save stack value for w32 thread start, which was moved to start(). - only use alignmed pages in MemPager for those systems which require BYTE_ALIGNMENT > 1. - fixes for platforms which emulate recursive mutex behavior based on Conditional's emulation code. - w32 specific thread attributes now hidden in priv data structure. - support for more unix targets... - support for cygwin dll compile... - more 64 bit clean - borlandc makefile updates and compile fixes from Darko - tmpString broken, dangerous, and removed! From Common C++ 1.2.1 to 1.2.2 - fix for datetime constructor. - w32 distributed build issues. - vic fix for some w32 builds on atomics and setAddress. From Common C++ 1.2.0 to 1.2.1 - major fix for deleting dummy thread when shadowing non-commonc++ threads. From Common C++ 1.1.9 to 1.2.0 - initial ipv6 support! - MemPager uses posix_memalign to align allocated pages when available. - now uses pkgconfig system. - more String functions. - ability to use std::string in String constructor. - Conditional & Event now uses ordinary (non-recursive) mutex! - Marcelo patches for EXPORTS and m4 underquoting. - fix for win32 restartable threads. - some fixes tried for signal handled quit when no immediate cancel. - use of enterCancel/exitCancel for building cancellation point wrappers. - w32 file access and isPending operations now cancellation points through enterCancel/exitCancel for more consistent behavior with posix which treats select/poll/read/write as cancellation point. - fix for broken signaling version code to clear act structure. - added Thread::sync() for suspending until cancel/join. - socket close order changed. - faster atomic ops, aix atomic support. - cleanup of endian detection. From Common C++ 1.1.8 to 1.1.9 - second fix in date.cpp and unquoted definition in m4 files, from Marcelo Dalmas - make sure original object exists in TTYStream during closure. - consistent type casting of String for exceptions. - fix String operator=. From Common C++ 1.1.7 to 1.1.8 - use /etc/configure.conf for options as well as ~/.configure. - reconfig supports aclocal path option and ~./configure options. - improved handling of connetError when thrown as exception to make sure stream is correct. - fix for process deamonfy attach. - SysTime patch to support re-entrant time. - fix shadowing of parms and members. From Common C++ 1.1.6 to 1.1.7 - doxygen/docgen cleanup patch from Matthew Burgess. - automake patch for newer automake from Matthew Burgess. - readdir_r patch from Vyacheslav Hryhoryev. - some fix for configure.in and package build for rpm. From Common C++ 1.1.5 to 1.1.6 - some changes in include path versioning. - some changes for /opt vs "lsb compliant" /opt paths. - possible race condition fix in terminate! - extra safety check for slog. From Common C++ 1.1.4 to 1.1.5 - improved /opt prefix and lsb layout handling. - improved PATH stuff to find configure. - fixes for gcc-3.4.0. - patch for Time::getTime. - patch for PosixThread::waitSignal. From Common C++ 1.1.3 to 1.1.4 - fix for ETC_PREFIX setting. - getThread changed for less confusion, member version now ::get. - fix for string assignment overuse. From Common C++ 1.1.2 to 1.1.3 - --with-lsb=name option to build lsb compliant package. - major fix for String class copy, assignment, and space reuse. From Common C++ 1.1.1 to 1.1.2 - fix typo in serial.cpp. - CBuilder patch for borland compilers & w32 targets. - match change in numbers for dealing with const values. - fix in ThreadQueue code. - path fixups in w32 dsp projects. - qnx6 compile fixes for serial.cpp and network.cpp. - more compiler optimizations when not using exceptions. - clarification of w32 build projects and new common workspace. From Common C++ 1.1.0 to 1.1.1 - use CCXX_EXCEPTIONS for old HAVE_EXCEPTION_HANDLING - some compile fixups for use when no exception handling is available - "configure --without-exceptions" can now be used! Also kills rtti and adds omit-frame-pointer optimization back in. This can be used to produce smaller and more efficient code for targetted uses. NOTE: some broken c++ stdlibs have inline dynamic_cast's in common headers and hence can NEVER be compiled -fno-rtti. - support for new ~/.configure mechanism for setting default options. - fix potential memory leak in self exiting threads, and more advanced support for "join" method with immediate stack cleanup on posix. - fix for pathname not properly initialized in main RandomFile constructor. - new --without-libxml2 and --without-compression options to further optimize library. - missing __EXPORT for ThreadQueue. - Jeffry Reed's string patch for stl use. - fix for w32 "syslog" logging. - fix for w32 terminate setting self to NULL when not terminating self. - new automatic stack frame locking objects for member function calls including semaphore and read/write locks. - new automatic cancellation object to do stack frame automatic setting and auto-restore on exit of cancel modes. - Abid Taraben's patch for overlapped serial i/o. - mempager alignment patch - auditing for use of safe string functions. - added new safe string functions "newString" and "tmpString" to get strings from memory and stack frame. From Common C++ 2 1.0.x and 1.1.0 beta to 1.1.0 release - merge of 1.1.0 beta and 1.0.x source trees - configure system updated for autoconf 2.5x or later. - fix of ssl Makefile - new Process methods for managing process user identity - expansion of Dir class to many more dir operations and iterator behavior - patch for persist for namespace situations - portable filename manipulations - realpath() support and emulation for systems without. - Common C++ String class introduced - Date functions now use new string class - Date class now uses iso date formats as standard - Network class updated for new string class - embed memmove code for portability. - make use of win32 version of snprintf. - use const for mempager string alloc. - consolidation of missing libc functions. - fix for Conditional::wait(). - keydata now has win32 specific mode for parsing .ini files and support for other keydata extensions. - xml support now always enabled; if libxml2 is not found, a new built in C++ coded mini-xml parser (non-validating, fairly simple) will be used! The mini-parser will be expanded to support "well formedness" detection and improved over time... - win32 support for mapped files and other features! - Digest::initDigest is now public instead of protected. - TCPStream "printf" method. - varous slog methods (error, info, etc) can do varargs. - setAutostack used as global means to tune posix stack usage. - emulate detached for w32 and detached threads now auto delete on exit From Common C++ 2 1.0.0 to 1.1.0 (beta set) - include/cc++/socket.h: doc. updated to new constants and Win32 implementation - src/xml.cpp: bug fixes from Norber Koch. - doc/Doxyfile and many header files: fixed doxygen warnings and included demos - doc/commoncpp2.texi, doc/fdl.texi, doc/fdlnotice.texi, doc/gpl.texi: OVERVIEW.TXT formatted in texinfo and partially updated. - doc/developer/CodingStyle and doc/developer/PortingProblem incorporated to doc/commoncpp2.texi - win32: appended d to MSVC debug libraries. Fixed warnings from VC7. - include/cc++/url.h: splitted into url.h and urlstring.h so that ccgnu2.dll does not depend on ccext2.dll. - start of experimental GNU Common C++ "ssl" stream class support and new libccssl library. - "common.reg" for win32 registry initialization of CONFIG_KEYDATA stuff planned. - src/url.cpp: small fix from David Genest. - src/date.cpp, include/cc++/numbers.h: patches from Norbert Koch - configure.in, include/cc++/xml.h, src/xml.cpp and url.cpp, win32/cc++/config.h: HAVE_SSTREAM #ifdefs - src/simplesocket.cpp, include/cc++/socket.h, src/Makefile.am, win32/Makefile.gcc, win32/ccgnu2.dsp: added SimpleTCPStream from Mark Millard - commoncpp2.spec.in, Makefile.am: fixes for correctly building rpms from Marcelo Dalmas - piostream from Daniel E Baumann. acconfig.h, configure.in: added --with-piostream configure option. new headers in include/cc++/: piostream, pistream, pistream.tcc, postream, postream.tcc, pios, piosfwd, pios_init.h (Makefile.am also updated) new sources in src/: pios.cpp, pio_globals.cpp (Makefile.am also updated) new demos in demo/: pio.cpp (Makefile.am also updated) win32/Makefile.gcc, win32/CCXX2demo.dsw, win32/demo/pio.dsp src/private.h, include/cc++/thread.h: added Thread::getThreadID(). - fix (constructor parameters) for serialecho demo from Daniel E Baumann. - include/cc++/piomanip, include/cc++/Makefile.am, demo/pio.cpp: added manipulators for piostreams from Daniel E. Baumann. - src/serial.cpp: fixed recursive call in ttystream::close(). - exception construction fix. - src/port.cpp: fixed TimerPort::getElapsed() Win32 implementation. - src/thread.cpp:(Win32) sleep(0) replaced with sleep(1) -from Leonard Thornton - acconfig.h, m4/ost_pthread.m4: removed HAVE_ASM_ATOMIC... checks and defines -From Mark Purcell - thread.cpp: siginstall renamed to sigInstall to match declaration in thread.h - src/socket.cpp, src/peer.cpp, src/port.cpp, simplesocket.cpp, unix.cpp: before ::connect, change INADDR_ANY to INADDR_LOOPBACK so that it does not crash on Win32. - include/cc++/socket.h, src/port.cpp: non-blocking outboud tcp connection constructor for SocketPort from Christian Prochnow - include/cc++/xml.h, src/xml.cpp: rearranged xml related #ifdefs. - include/cc++/file.h: File::Access and File::Error are now public. - include/cc++/network.h, src/network.cpp, include/cc++/common.h: new NetworkDeviceInfo class, from Christian Prochnow. netdevices demo. - acconfig.h, m4/ost_reentrant.m4, include/cc++/exception.h, include/cc++/ftp.h, include/cc++/socket.h, src/exception.cpp, src/ftp.cpp, src/port.cpp, src/socket.cpp, demo/tcp.cpp: better error/exception messages for socket classes, from Christian Prochnow. - include/cc++/numbers.h: CCXX_CLASS_EXPORT Time and DateTime. - include/cc++/digest.h, src/sha.cpp, demo/shadigest.cpp: new SHA1Digest and SHA256Digest classes, from Elizabeth Barham. - src/file.cpp: fixes for open, fetch, update and append methods from Andrew L. Shwaika - src/ost_check2.m4: added OST_CCXX2_XML, from Ari Johnson. - include/cc++/thread.h, src/thread.cpp: added support for periodic itimer based timers, from Jakob Skov-Pedersen. - include/cc++/thread.h, src/thread.cpp: added Thread::join, from Jakob Skov-Pedersen. - configure.in, src/Makefile.am demo/Makefile.am, tests/Makefile.am, and several source files: added '-Wall -ansi -pedantic' compiling options and corrected the warnings that show up, from Albert Strasheim. - src/thread.cpp: detached threads created with detach attribute. - src/thread.cpp, include/cc++/thread.h: isDetached() support. - src/thread.cpp: close fix if deleted, detached threads loose parent. - demo/thread3.cpp: test whether thread cancel unwinds stack frame and calls destructors on auto objects. - src/dir.cpp, include/cc++/file.h: dir object has close member now. - include/cc++/socket.h: added InetAddress assignment operator from unsigned int, from Mark Purcell and Gerhard Tonn. - include/cc++/urlstring.h, src/urlstring.cpp: new b64 encode and decode methods for string. From Chad Yates. - configure.in, src/Makefile.am: added --with-cppunit option and WITH_CPPUNIT_TESTS conditional. - tests/Makefile.am, SampleObject.h, SampleSubObject.h, Test_Date.h, Test_Digest.h, Test_Engine.h, Test_SHATumbler.h, Test_URLString.h, ccxx_tests.cpp SampleObject.cpp SampleSubObject.cpp, Test_Date.cpp, Test_Digest.cpp, Test_Engine.cpp, Test_SHATumbler.cpp, Test_URLString.cpp: new cppunit based test suite, From Chad Yates. - win32/CCXX2tests.dsw, win32/tests/ccxx_testsuite.dsp: added project file for the new test suite, from Chad Yates. - tests/Test_TCPStream.h, tests/Test_TCPStream.cpp: new test, from Chad Yates. - include/cc++/socket.h, src/socket.cpp: new read and write methods for socket, and new getInterfaceIndex and join (with interface specifier) methods, from Donald Wycoff. From Common C++ 2 1.0rc2 to 1.0.0 - Added timeout optional parameter to TTYStream and URLStream constructors. - include/cc++/strchar.h: removed deprecated and unused #include . - rpm specs updated to build optional extras package and devel package. - include/cc++/ftp.h, src/ftp.cpp: fixed namespaces. - src/url.cpp: more improvements from Norbert Koch. removed #include - template/template.h: removed cc++/string.h and cc++/objkeys.h (missing) - Other fixes so that all templates compile. From Common C++ 2 1.0rc1 to Common C++ 2 1.0rc2 - url.cpp split between url.cpp and urlstring.cpp; urlstring.cpp part of libccgnu2. - ccgnu2-config reports version as "1.0.0" to fix problems with config scripts. From Common C++ 2 0.99.7 to Common C++ 2 1.0rc1 - updated mingw32 support from Frederico! - post updates for even better mingw32 builds... - all win32/posix sources merged. - new ccgnu2.dll and ccext2.dll split dll build. - include/cc++/digest.h: CRC32Digest exported for dll's - include/cc++/xml.h, src/xml.cpp: XMLRPC fixed and improved with patches from Norbert Koch. Now uses the newer rather than . - include/cc++/digest.h, include/cc++/slog.h: removed unused -nkoch - src/mempager.cpp: added std namespace to endl -nkoch - include/cc++/misc.h: used the [] version of delete -Mike Suchoff - some persist patches from Pierre Bacquet. - PersistException now derived from Exception. - XML support, demo and tests workspaces for MSVC++. From Common C++ 2 0.99.6 to Common C++ 2 0.99.7 - slight restructure of libs and we make sure -lc_r is inserted for FreeBSD - support --with-pthread= option to specify pthread library directly. - support for new pthread flag and function tests - support for virtual i/o methods in URLStream for possible async i/o override. - win32 serial support from Leonard Thornton. - serial i/o can be overloaded for async i/o methods. - added --with-linuxthreads option for FreeBSD with Linux threads support. From Common C++ 2 0.99.5 to Common C++ 2 0.99.6 - fix for freebsd build and ports - addition of kdevelop project - added getCount to Keydata - added configure --with-ftp option - fix for FreeBSD segfault when destroying main thread! - cygwin dll builds now work automatically with latest cygwin! From Common C++ 2 0.99.4 to Common C++ 2.0 0.99.5 - fixed memory leak in thread creation? - fix small bug in regression test. From Common C++ 2 0.99.2 (2pre2) to Common C++ 2 0.99.3 (2pre3) - fixed compile with STLport (tested on Linux and FreeBSD) - use only needed include (including all cause some problem with gcc 2.95.3) - compile getopt_long if not available - SocketService now work on win32 - Removed global sleep and yield - Make Thread::sleep and Thread::yield static members - fixed bug in StringTokenizer - Added constructor to PosixThread - used private implementation for Thread - removed global ccxx_sleep and ccxx_yield - made Thread::sleep and Thread::yield static member - Fixed bug on cygwin From Common C++ 2 0.99.1 (2pre1) to Common C++ 2 0.99.2 (2pre2) - cleanup of URLStream - fixed buffer overflow in Socket::readLine - fixed buffer overflow in b64Encode - new base64 function - fix timeout hang using URLStream - fixed socket duplication for win32 - fixed handle leak in thread (win32) From GNU Common C++ 1.9.5 to GNU Common C++ 2 0.99.1 (2.0pre-1) - new "common.h" master include file to simplify library use. - contributed unix socket i/o class. - fixed memory leak when calling getThread from non Common C++ thread. - updated some documentation - put some global enum inside class (URLStream and Thread) - implement SocketPort/SocketService in win32 (not stable, test required) (ReadFile on anonymous pipe is blocking... it not work) - getThread in win32 now alloc a new Thread class - correct Thread::isRunning behaviour in win32 - start implementing THREAD_CANCEL_MANUAL on win32 - other minor fix on win32 implementation of Thread - Anad Narwi's url interface binding patch. - fix for some problem with Solaris and some version of g++ - fix for detecting atomic operations on no i386 machine - made some automatic regression tests (tests directory) - fix md5 calculation on 64bit machine (like alpha) - fix some buffer overflow on base64 encoding - fix memory leak and signal registering problem on Thread class - many other small fixes - written a coding style convenction (see doc/developer/CodingStyle) and applied to code (this broken compatibility with old cc++1) - change include method assusing uniqueness ( even for cc++2) - added a common.h header to include all stuff of cc++ with a single include From Common C++ 1.9.4 to 1.9.5 - xml.h header fixes. - some fixes from Vladimir Kokovic. - new "win32/Makefile.gcc" to build mingw32 cross targets. - lots of changes for suspend and such from Freddy. - some AIX cleanups from Bernhard Tummer. From Common C++ 1.9.3 to 1.9.4 - cygwin and pthread_suspend/continue support! - virtual to add to generated http headers. - fix for Solaris and atomic - XMLRPC core support. - base64 character encoding. - patch from Barnaby Gray for SocketPort. From Common C++ 1.9.2 to 1.9.3 - fixup of defines. - fix of UDPSocket::getPeer - can use --without-xml to disable xml support. - LoadPrefix option for keydata parsing. - slog patch for locals from Marcelo - date patch from Marcelo From Common C++ 1.9.1 to 1.9.2 - many small changes for HP/UX and other oddities from Peter Koerber. - support for echo in slog. - fixes in udp for use with new ccrtp release. From Common C++ 1.9.0 to 1.9.1 - small fixes in socket code. - fix for gcc 3.0 problems in new code. - make sure sigwait always shielded by HAVE_SIGWAIT2. - a lot of corrected headers for win32 exports. - some fixes for older gcc compilers. From Common C++ 1.5.1 to 1.9.0 - unsigned long arg for setCompletion for win32. - mutex change for win32. - Federico's patch for atomic counters with old kernels. - Merged source trees for pending 2.0 release. - Frederico's patchs for multicast for use with ccrtp. - fixed FILE_GET_METHOD to close any leftover socket first. - fixed close socket in file open in URLStream. - added syslog test and generic syslog support. - added Slog to win32. - Date and Time classes being added. - number manipulations and random number generation being added. - cvs COMMONV2 defined in automake for splitting release builds. - cvs configure.in has new flag option for --with-v2. - added string.h for 1.6.1 and above so people can get used to using it. - timeout fix for TCPSTream from Tommi Makitalo. - "ost" namespace support added. - new Exception class hierarchy. - dynamic loading info exported thru ccgu-config. - source directories merged and libraries redistributed. - Common C++ template library added. From Common C++ 1.5.0 to 1.5.1 - some further changes and corrections for gcc 3.0. - fix from adam for autoconf 2.50 bug. - namespace tweaks. - added COMMON_XML_PARSING to test for XML support. - new contributed socket port demo. - added Wallace Owens patch to support NoDelay socket option. - added Craig Emery's patch for port numbers in urls. - changed DSO loader by adding alternate constructor to pass lazy option to dlopen linker. - big change in auto-detect for iostream support. Old style iostream constructors with explicit init now used when autoconf detected. This fixes segfaults for many older C++ ansi libraries. - setLinger option added for ending sockets. - some Solaris patches from Radu Greab. From Common C++ 1.4.3 to 1.5.0 - fix for out of data exception handling in persistance engine. - added timeout option to Readline() method. - added timeout to TTYStream and TCPStream object for future timed i/o. - changed slog.open() to support basis for win32 slog and portable use of passing argv[0] to get a daemon name and in win32 a log file path. - timeout control for underflows and url streaming. - added Conditional to posix synchronization objects. - changes for gcc 3.0 - added elapsed time for timer ports. - better support for thread priority scheduling. - SysV semaphore support option. - setCompletion now bool and in socket "flags". - streaming and timeout fixes based on suggestions from Macro Coulombe. From Common C++ 1.4.2 to 1.4.3 - fix for freebsd build checks. - inf. timeout in wait event. - InetAddress count initialization and delete of null lists. - no longer use shutdown when closing sockets in case the object was "dupped" since newer kernels pass shutdown thru all instances. - make friends __EXPORT in win32 as suggested by Hwu - added Wolfgang Schmieder's changes to enable common directory to be used with MSVC project. - fixed execHandler to set _tid to self. - patch from Eric Peters related to polling with timer signal handlers. - added Suspend and Resume to win32 threads. - added Detach() as alternate Start() method. - notification of parent threads more restrictive. - other win32 fixes including items not initialized in constructors. From Common C++ 1.4.1 to 1.4.2 - xmlfetch and test.xml work file in demo directory test xml parsing. - setFollow() option for urlstream. - setProtocol() option for urlstream. - install our autoconf macros locally. From Common C++ 1.4.0 to 1.4.1 - for posix build, -DSTLPORT removed from ccgnu-config --flags. - FreeBSD ports collection package building restored to Common C++. - fix for Serial I/O attribute setting. - fix problem for keydata reaching eof. - improved detection of libxml2. From Common C++ 1.3.3 to 1.4.0 - Meno Abels provided a great little patch for using STLPORT with Common C++ - added "-with-stlport[=dir]" to configure to enable STLPORT usage and specify where STLPORT is. - fix for intel solaris. - added multicast to socket support. - made URLStream work and have added urlfetch demo code. - URLStream extended features added. - new method of handling Common C++ Win32 "dllexport" vs "dllimport"; export.h included during dll build to export remaining symbols, otherwise cc++ headers always act as "import" for target app. - XMLStream parser added to posix tree, uses libxml2 underneath. - Fuller support for HTTP/1.1 including "chunked" transfer encoding. - URLStream seperated from "socket" code for easier editing. From Common C++ 1.3.2 to 1.3.3 - added httpHeader to allow derived object to receive and parse headers. - added -I and -L flags to ccgnu-config. - OST_CCXX_VERSION macro added to check for a minimum version of CommonC++: OST_CCXX_VERSION([MINIMUM-VERSION [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]]) - make sure getThread returns _mainthread if no threads are active. - ost_commoncxx.m4 merged with ost_check.m4. - added testCancel for non-yielding test. - socket address structures pre-initialized to zero. - added cmdoptions from Gianni@mariani.ws - sem_getvalue added to Semaphore class. - millisecond timers with itimer option. - cleanup for inaddr.cpp and Borland C++ compiler. - fixed and improved Borland C++ makefiles. - keydata now 32 chars. From Common C++ 1.3.1 to 1.3.2 - fix for SunOS and other minor target compile issues. - fix for iflag vs lflag for flow control settings. - url client processing classes added. - borland compile fixes from Rupert Curwen. - RTLD_GLOBAL added for DSO loading. - zoner's suggested use of Event class for thread cancellation control. From Common C++ 1.3.0 to 1.3.1 - new multi-host support in socket address classes. - fix for segfault in fifo objects. - serial i/o and multi-address changes suggested by Gary Murphy. From Common C++ 1.2.6 to 1.3.0 - UDPTransmit/UDPReceive/UDPDuplex classes redesigned based on ccrtp work. These now form base RTP stack components rather than duplicated in ccrtp. Matches ccrtp 0.3.0 release. - slog now uses thread-safe buffering to assure consistency. - exception handling mode is now part of thread rather than global, and is inherited from parent to child. - restructure address class slightly to allow symbolic hostnames to be used in base InetAddress object. - select rather than "poll" is the preferred default method of pending and selection timeouts if sys/stream.h is also present. This is to cover systems which do not impliment "poll" for socket descriptors or outside of stream device drivers. - new ccgnu-config mechanism to get attributes and compiler options. - new test for single argument sigwait for older sunos, etc. - test for namespace support. Common C++ will soon use namespaces. - fix for win32 socket.h problems. - updated as protected members buffer manipulation. - doxygen now used for documentation. - added ETC_PREFIX for locating config files. - late addition, hashing function classes. - getThread() must create temp thread objects if unknown threads found... From Common C++ 1.2.5.1 to 1.2.6 - fix inaddr locking in posix for non-threadsafe host address lookup. - updated TCPSocket for isPendingConnection in win32 sources. - added _POSIX_PTHREAD_SEMANTICS to "config.h" - default all sockets to SO_REUSEADDR - fix for duplex interconnect. - fix for socket ports from Petr Ferschmann - new global exception handling control. From Common C++ 1.2.5 to 1.2.5.1 - nessisary fix because fpathconf doesnt link correctly in FreeBSD. From Common C++ 1.2.4 to 1.2.5 - some fix for new resolver for sun. - --enable-profiling and --enable-debug added to "configure" - change setsockopt for broadcast - added serial example from Gary Lawrence. - some fixes suggested for IRIX compatibility. - one fix for FreeBSD pthread usage. - test whether compiler supports "mutable" members. From Common C++ 1.2.3 to 1.2.4 - updated solaris sigwait use. - fixed win32 typo. - new threadsafe resolver support. From Common C++ 1.2.2 to 1.2.3 - updated mempager for auditing correctly. - fixed stream constructor issues. - changed xxxStream base classes so streambuf always first for ?broken? compilers. - changes for memory leak issues. - uflow problem in TCPStream has been fixed. Thanks to Gerald L. Gay. From Common C++ 1.2.1 to 1.2.2 - support for FreeBSD dynamic loader. From Common C++ 1.2.0 to 1.2.1 - now must define __USE_GNU to work with newest GLIBC. - debian packaging addded. - fix include for common subdirectory and multi-target builds. - John Connor's fixes for nonblocking win32 sockets when supported, for a win32 implimentation of setCompletion, and for other win32 improvements. - setSpeed of Serial class accepts 0 parameter which does a modem "hang up". - fixed inaddr issue with "INADDR_ANY" miscast as char. From Common C++ 1.1.0 to 1.2.0 - making a whole stuff const where needed and appropriate, and did many cleanups regarding constness etc. - cleaned up configuration process - fixed typo in win32 mutex. - bind address "*" = 0.0.0.0 - iostream is constructed with streambuf argument in for the TTYStream class similar to TCPStream; now TTYStream and ttystream class works properly. - resolved interesting inline issue with == and bool coercion. - added powerful StringTokenizer - added macros for older source compatibility - recursive mutex fix - added FreeBSD "ports" package build to distribution. - added stream aware isPending for TTYStream and TCPStream, and made isPending base virtual. From Common C++ 1.0.3 to 1.1.0 - pthread.m4 supports cross compiler sys-include directory - support of "thread.h" header other than sunos. - unsigned socklen_t for unixware. - use of XOPEN removed from file.cpp. - use of sys/termiox.h with unixware. - unixware now cross-compiles gcc 2.95.2! May need "-D_THR_UNIXWARE" native. Some of the changes for Unixware may also work for AIX. - thread initiation and signal handling now thru "C" friend functions. - new poll service for SocketService and SerialService; not binary compatible with old library. - new win32 mutex code that supports winnt/win95/win98 from Michael Furmanczyk. - fix getIndex. From Common C++ 1.0.2 to 1.0.3 - more setsockopt problems on different platforms. - support of -lthread check for Unixware. - some additional cross compiler build support. From Common C++ 1.0.1 to 1.0.2 - close _cancellation handle in win32 thread object. - fix mutexcounter usage for host protection. - replaced tid_t with cctid_t to avoid AIX collision. - odd VC quirks. - tcpservice.cpp demo app contributed by Gianni Mariani. - TryEnterMutex added to win32 - fixed a number of socket options - fixed bug in mapped file without initial map From Common C++ 1.0.0 to 1.0.1 - fcntl.h now tested for in autoconf system, as well as sys/fcntl.h. - fixed atomic.h test to include test for atomic_t. - cleaned up delayed connection code in posix tree. - caddr_t (a bsdism) introduced as a general purpose type. - moved __EXPORT from class definition so kdoc can process. - __EXTENSIONS__ added for Solaris - we took in some FreeBSD 4.0 patches. - TCPStream and Serial sync is public. - fixed fatel crash when loading more than one dso! From Common C++ 0.9.7 to GNU package Common C++ 1.0.0 - more liberal use of namespace.h. - split of Common C++ between GNU Common C++ and "Extras" libraries. - overview documentation. - official designation as a GNU package. - changed win32 "remove" to "DeleteFile". - missing int() operator in posix AtomicCounter. - endian testing added. From Common C++ 0.9.6 to 0.9.7 - local config file access bug (~/.xxxrc) in keydata fixed. - cfgfile closure bug in keydata fixed. - isDir, isFile, and isDevice checks added. - canAccess and canModify checks added. - simple DSO support for win32 added. - new level option to control and filter slog() logging. - major work done on win32 support for (cross)compiling under mingw32 & cygwin32. - Fixed InterlockExchangeAdd support in win32 which seems missing. From Common C++ 0.9.5 to 0.9.6 - typo fix in socket.h for evaluating open ttystream's. - added ldconfig to RPM spec. - AtomicCounter class contributed by Sean Cavanaugh. - Rewritten file classes based on new RandomFile base. - old win32 "fileio" routines removed. - zip target in main Makefile for building distribution for windows users. - serial I/O name processing improved in ttystream::open. - certain runtime optimizations crash gcc exception handling and are now stripped as part of the OST_CXX_EXCEPTIONS macro. From Common C++ 0.9.4 to 0.9.5 - intruduce mutex protected mempager. - getLocal() added to TCPSocket. - alloc() and first() now virtual memory allocators. - slog() also invokes clog() if not running as true daemon. - empty slog() used for continuation lines. - DSO getError() added for catch handlers. - start of Bayonne script engine code. - new and much simpler autoconf macros for building user applications. - a simple low level directory scanning class was added. - some stream fixes from Fulko Hew - new handling of Solaris thread.h include for use with cross-compiling. - spec and lsm file automated. - rwlock support for thread synchronization added! From Common C++ 0.9.3 to 0.9.4 - operator!() for tcpstream updated in socket.h - new "slog" syslog facility; similar to "clog" buffered error messages. - isPending() fixed in win32 for infinite timeout support. - Persistence TypeManager suffered with some problems. They should be fixed - typos in socket fixed from contributed changes by Fulko Hew. - ..and a semaphore fix for win32. - added virtual methods for extending serial and socket service threads. - endSocket() cleaned up in win32. - endSocket() cleaned up in posix. - final was missed in win32. - fifo stream support added. - not all compilers considered ~ operator valid for mutexcounter. The host lookups now implicity call base class LeaveMutex directly. - setb fix for stream handlers. - set failbit on stream socket/serial errors. - StringFunctionMap has to be public to compile. - sync stream method handlers no longer clear get buffer. - sync simplified further, and dummy doallocate added. From Common C++ 0.9.2 to 0.9.3 - Woops! serial.cpp was supposed to build in libccio.so, not libccxx.so! - autoconf options loader has been fixed and improved. - html.cpp temporarily pulled; incomplete linkage. - zstream added to config.def. - fix in keydata.cpp for "/etc/". - config.def simplified! From Common C++ 0.9.1 to 0.9.2 - Socket::Terminate changed to Socket::endStream to avoid confusion with Thread::Terminate when using derived TCPSession class. - win32 updated to include new "tcpstream"; tcp.cpp demo should be usable under win32 again. - == operator moved to InetAddress base class. - ! operator added for testing if an InetAddress is valid. - turn of throw error handling on SocketPort once service thread takes over. This is nessisary since throw is not inter-thread. - test for "poll()" now used for isPending support. - thread Final() method was called too early for self deleting objects. - timerport moved from socket.h to thread.h - posix streamable C++ serial port I/O classes added. - fixed 64 bit types for Tru64 Unix. - fixed warnings in persist, engine, and html classes. From Common C++ 0.9.0 to 0.9.1 - implementation of MutexCounter operator ~ matches prototype. - last fileio.h reference squashed. - fixed win32 "install.bat"; still thought it was APE - added dummy macros.h for win32. - fixed posix/trunk.h inclusion of macros.h. - fixed int64 type check. From APE 1.2.3 and Common C++ 0.2 to Common C++ 0.9.0 - Found big bug in Thread::Start(). Replaced ++_start with _start->Post(). - Modified tcpthread.cpp demo app. - Oh, lots of stuff changed for the merged code base... - Added ~ operator for MutexCounter so catch handler can unlock. commoncpp2-1.8.1/COPYING.addendum0000644000175000017500000000213011463314527013334 00000000000000As a special exception, you may use this file as part of a free software library without restriction. Specifically, if other files instantiate templates or use macros or inline functions from this file, or you compile this file and link it with other files to produce an executable, this file does not by itself cause the resulting executable to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. This exception applies only to the code released under the name GNU Common C++. If you copy code from other releases into a copy of GNU Common C++, as the General Public License permits, the exception does not apply to the code that you add in this way. To avoid misleading anyone as to the status of such modified files, you must delete this exception notice from them. If you write modifications of your own for GNU Common C++, it is your choice whether to permit this exception to apply to your modifications. If you do not wish that, delete this exception notice. commoncpp2-1.8.1/config.h.in0000644000175000017500000006466511463364512012570 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ #ifndef CCXX_CONFIG_H_ #define CCXX_CONFIG_H_ #define __DLL #define __EXPORT_TEMPLATE(x) #undef CCXX_EMPTY #define CCXX_EMPTY #define COMMON_64_CLEAN #define COMMON_ASYNC_OVERRIDE #define COMMON_OST_NAMESPACE #define COMMON_THREAD_SLEEP #define COMMON_NET_DEVICES #define COMMON_THREAD_DEBUG #define COMMON_DEADLOCK_DEBUG #define COMMON_NAMED_MUTEX #define COMMON_PROCESS_ATTACH #define COMMON_XML_PARSING #define COMMON_TIMER_SLEEP #if __GNUC__ > 1 && !defined(__STRICT_ANSI__) && !defined(__PEDANTIC__) #define DYNAMIC_LOCAL_ARRAYS #endif #if defined(__CYGWIN__) #define _POSIX_REALTIME_SIGNALS #define _POSIX_THREADS #endif #if defined(__APPLE__) && defined(__MACH__) #ifndef MACOSX #define MACOSX #define _P1003_1B_VISIBLE #endif #ifndef _PTHREADS #define _PTHREADS 1 #endif #endif #if defined(__FreeBSD__) #ifndef __BSD_VISIBLE #define __BSD_VISIBLE 1 #endif #endif #ifdef _AIX #ifndef _ALL_SOURCE #define _ALL_SOURCE #endif #endif #ifdef __hpux #ifndef _XOPEN_SOURCE_EXTENDED #define _XOPEN_SOURCE_EXTENDED #endif #ifndef _INCLUDE_LONGLONG #define _INCLUDE_LONGLONG #endif #endif #define CCXX_PACKING #if defined(__GNUC__) #define CCXX_PACKED #elif !defined(__hpux) && !defined(_AIX) #define CCXX_PACKED #endif #if defined(__sun) || defined(__SUN__) #define __EXTENSIONS__ 1 #endif #ifndef _REENTRANT #define _REENTRANT 1 #endif #ifndef _THREAD_SAFE #define _THREAD_SAFE 1 #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif #if !defined(_XOPEN_SOURCE) && !defined(__FreeBSD__) &&!defined(__OpenBSD__) && !defined(__MACH__) && !defined(__NetBSD__) #define _XOPEN_SOURCE 600 #endif /* hack for BROKEN autoheader, since it will not predicitably order macros by any obvious means. */ #undef HAVE_UNISTD_H #undef HAVE_FEATURES_H #undef HAVE_SYS_TYPES_H #ifdef HAVE_UNISTD_H #include #endif #ifndef WIN32 #ifdef HAVE_FEATURES_H #include #endif #endif #ifdef HAVE_SYS_TYPES_H #include #endif #undef HAVE_SYS_TIME_H #undef TIME_WITH_SYS_TIME #if TIME_WITH_SYS_TIME #include #else #if HAVE_SYS_TIME_H #include #endif #endif #undef HAVE_SYS_TYPES_STD #undef HAVE_SYS_TYPES_64 #undef HAVE_LONG_LONG #undef HAVE_SYS_TYPES #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_BITS_WORSIZE_H #include #endif #ifdef HAVE_SYS_TYPES_STD typedef int8_t int8; typedef u_int8_t uint8; typedef int16_t int16; typedef u_int16_t uint16; typedef int32_t int32; typedef u_int32_t uint32; #ifdef HAVE_SYS_TYPES_64 #define HAVE_64_BITS typedef int64_t int64; typedef u_int64_t uint64; #endif #else typedef char int8; typedef unsigned char uint8; typedef short int16; typedef unsigned short uint16; typedef int int32; typedef unsigned int uint32; #endif #ifndef HAVE_SYS_TYPES_64 #if defined(__WORDSIZE) || defined(__arch64__) #if __WORDSIZE >= 64 || defined(__arch64__) typedef long int int64; typedef unsigned long int uint64; #define HAVE_SYS_TYPES_64 #define HAVE_64_BITS #endif #endif #endif #ifndef HAVE_SYS_TYPES_64 #ifdef __GNUC__ #if defined(HAVE_LONG_LONG) || defined(_LONGLONG) __extension__ typedef long long int int64; __extension__ typedef unsigned long long int uint64; #define HAVE_SYS_TYPES_64 #define HAVE_64_BITS #endif #endif #endif #ifndef HAVE_SYS_TYPES_64 #if defined(HAVE_LONG_LONG) || defined(_LONGLONG) #define HAVE_64_BITS typedef long long int64; typedef unsigned long long uint64; #endif #endif /* has c++ exception handling */ #undef CCXX_EXCEPTIONS /* define gnutls */ #undef CCXX_GNUTLS /* have new with init */ #undef CCXX_HAVE_NEW_INIT /* has c++ namespaces */ #undef CCXX_NAMESPACES /* NAT support */ #undef CCXX_NAT /* define openssl */ #undef CCXX_OPENSSL /* defines ssl */ #undef CCXX_SSL /* aix fixes needed */ #undef COMMON_AIX_FIXES /* enable auditing */ #undef COMMON_MEMORY_AUDIT /* cygwin environment */ #undef CYGWIN_IMPORTS /* primary config prefix */ #undef ETC_CONFDIR /* system config prefix */ #undef ETC_PREFIX /* Define to 1 if you have the header file. */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* atomic aix operations */ #undef HAVE_ATOMIC_AIX /* Define to 1 if you have the header file. */ #undef HAVE_BITS_ATOMICITY_H /* Define to 1 if you have the header file. */ #undef HAVE_BITS_WORDSIZE_H /* have bool type */ #undef HAVE_BOOL_TYPE /* Define to 1 if you have the header file. */ #undef HAVE_BSD_SIGNAL_H /* Define to 1 if you have the `clock_gettime' function. */ #undef HAVE_CLOCK_GETTIME /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* have endian header */ #undef HAVE_ENDIAN_H /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_EXCEPTION /* Enable extras */ #undef HAVE_EXTRAS /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FEATURES_H /* has gcc atomic functions */ #undef HAVE_GCC_BITS_ATOMIC /* has __gnu_cxx atomic functions */ #undef HAVE_GCC_CXX_BITS_ATOMIC /* getaddrinfo interface support */ #undef HAVE_GETADDRINFO /* reentrant getgrnam */ #undef HAVE_GETGRNAM_R /* ipv6 host lookup */ #undef HAVE_GETHOSTBYNAME2 /* have getopt header */ #undef HAVE_GETOPT /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define to 1 if you have the `getopt_long' function. */ #undef HAVE_GETOPT_LONG /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE /* reentrant getnam */ #undef HAVE_GETPWNAM_R /* reentrant getuid */ #undef HAVE_GETPWUID_R /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* have hires */ #undef HAVE_HIRES_TIMER /* has inet_aton */ #undef HAVE_INET_ATON /* ipv6 support */ #undef HAVE_INET_PTON /* inet sockets */ #undef HAVE_INET_SOCKETS /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_IP_COMPAT_H /* Define to 1 if you have the header file. */ #undef HAVE_IP_FIL_COMPAT_H /* Define to 1 if you have the header file. */ #undef HAVE_IP_FIL_H /* Define to 1 if you have the header file. */ #undef HAVE_IP_NAT_H /* Define to 1 if you have the `malloc' library (-lmalloc). */ #undef HAVE_LIBMALLOC /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_IN6_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_NETFILTER_IPV4_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_NETFILTER_IPV6_H /* reentrant localtime */ #undef HAVE_LOCALTIME_R /* Define to 1 if you have the `lockf' function. */ #undef HAVE_LOCKF /* have long longs */ #undef HAVE_LONG_LONG /* Define to 1 if you have the `lstat' function. */ #undef HAVE_LSTAT /* mach dybloader */ #undef HAVE_MACH_DYLD /* Define to 1 if you have the header file. */ #undef HAVE_MACH_O_DYLD_H /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mlock' function. */ #undef HAVE_MLOCK /* Define to 1 if you have the `mlockall' function. */ #undef HAVE_MLOCKALL /* support for plugin modules */ #undef HAVE_MODULES /* IPF NAT support */ #undef HAVE_NAT_IPF /* NetFilter NAT support */ #undef HAVE_NAT_NETFILTER /* PF NAT support */ #undef HAVE_NAT_PF /* Define to 1 if you have the header file. */ #undef HAVE_NETINET6_IN6_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_SYSTM_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IP_COMPAT_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IP_FIL_COMPAT_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IP_FIL_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IP_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IP_NAT_H /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_H /* Define to 1 if you have the header file. */ #undef HAVE_NET_PFVAR_H /* old style iostreams */ #undef HAVE_OLD_IOSTREAM /* Define to 1 if you have the `poll' function. */ #undef HAVE_POLL /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the `posix_memalign' function. */ #undef HAVE_POSIX_MEMALIGN /* has pwrite */ #undef HAVE_PREAD_PWRITE /* has stack size */ #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE /* has cancel */ #undef HAVE_PTHREAD_CANCEL /* has non portable delay */ #undef HAVE_PTHREAD_DELAY_NP /* posix thread header */ #undef HAVE_PTHREAD_H /* has mach link */ #undef HAVE_PTHREAD_MACH_THREAD_NP /* has non portable setkind */ #undef HAVE_PTHREAD_MUTEXATTR_SETKIND_NP /* has setttype */ #undef HAVE_PTHREAD_MUTEXATTR_SETTYPE /* has non portable settype */ #undef HAVE_PTHREAD_MUTEXATTR_SETTYPE_NP /* has nanosleep */ #undef HAVE_PTHREAD_NANOSLEEP /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_NP_H /* has rwlock support */ #undef HAVE_PTHREAD_RWLOCK /* has sched yield */ #undef HAVE_PTHREAD_SCHED_YIELD /* has setcancel */ #undef HAVE_PTHREAD_SETCANCEL /* has setcanceltype */ #undef HAVE_PTHREAD_SETCANCELTYPE /* has suspend */ #undef HAVE_PTHREAD_SUSPEND /* has yield */ #undef HAVE_PTHREAD_YIELD /* has np yield */ #undef HAVE_PTHREAD_YIELD_NP /* reentrant readdir */ #undef HAVE_READDIR_R /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the `sched_getscheduler' function. */ #undef HAVE_SCHED_GETSCHEDULER /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the header file. */ #undef HAVE_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SEMAPHORE_H /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `setitimer' function. */ #undef HAVE_SETITIMER /* Define to 1 if you have the `setpgrp' function. */ #undef HAVE_SETPGRP /* have shload plugins */ #undef HAVE_SHL_LOAD /* Define to 1 if you have the `sigaction' function. */ #undef HAVE_SIGACTION /* Define to 1 if you have the `sigwait' function. */ #undef HAVE_SIGWAIT /* 2 argument form */ #undef HAVE_SIGWAIT2 /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* has socklen_t type */ #undef HAVE_SOCKLEN_T /* Define to 1 if you have the header file. */ #undef HAVE_SSTREAM /* Define to 1 if you have the header file. */ #undef HAVE_SS_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 `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* reentrant strerror */ #undef HAVE_STRERROR_R /* 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 /* reentrant strtok */ #undef HAVE_STRTOK_R /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_HPOSIX_EVLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ATOMIC_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_ATOMIC_OP_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* solaris endian */ #undef HAVE_SYS_ISA_DEFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_LIBCSYS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_POLL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SCHED_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKIO_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_STREAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* have 64 bit longs */ #undef HAVE_SYS_TYPES_64 /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* have systypes */ #undef HAVE_SYS_TYPES_STD /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_THREAD_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* has unix domain sockets */ #undef HAVE_UNIX_SOCKETS /* Define to 1 if you have the `wait4' function. */ #undef HAVE_WAIT4 /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK2_H /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK_H /* has usable atomic functions */ #undef HAVE_WORKING_SYS_ATOMIC_H /* have zlib header */ #undef HAVE_ZLIB_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 /* mutex type */ #undef PTHREAD_MUTEXTYPE_RECURSIVE /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* use monotonic */ #undef USE_MONOTONIC_TIMER /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* bsd system using linuxthreads */ #undef WITH_LINUXTHREADS /* darwin6 environment */ #undef _DARWIN6_ /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* endian byte order */ #undef __BYTE_ORDER /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported directly. */ #undef restrict /* Work around a bug in Sun C++: it does not support _Restrict or __restrict__, even though the corresponding Sun C compiler ends up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. Perhaps some future version of Sun C++ will work with restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ #if defined __SUNPRO_CC && !defined __RESTRICT # define _Restrict # define __restrict__ #endif /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile #ifndef HAVE_STRERROR_R #define strerror_r(e, b, l) b = ::strerror(e) #endif #ifndef HAVE_GETPWUID_R #define getpwuid_r(uid, rec, buf, size, ptr) ptr = ::getpwuid(uid) #define getpwnam_r(name, rec, buf, size, ptr) ptr = ::getpwnam(name) #endif #ifdef HAVE_POLL_H #include #else #ifdef HAVE_SYS_POLL_H #include #endif #endif #if defined(HAVE_POLL) && defined(POLLRDNORM) #define USE_POLL #endif #ifdef HAVE_SYS_LIBCSYS_H #include #endif #ifdef HAVE_WINSOCK2_H #include #else #ifdef HAVE_WINSOCK_H #include #else #ifdef HAVE_SYS_SOCKET_H #include #ifdef HAVE_SELECT_H #include #else #ifdef HAVE_SYS_SELECT_H #include #endif #endif #ifdef HAVE_NETINET_IN_H #if defined(__hpux) && defined(_XOPEN_SOURCE_EXTENDED) #undef _XOPEN_SOURCE_EXTENDED #endif #include #ifdef __hpux #define _XOPEN_SOURCE_EXTENDED #endif #endif #ifdef HAVE_ARPA_INET_H #include #include #endif #ifdef HAVE_NETINET6_IN6_H #include #endif #ifdef HAVE_LINIX_IN6_H #include #endif #ifdef HAVE_NETINET_IN_SYSTM_H #include #endif #ifdef HAVE_NETINET_IP_H #include #endif #ifdef HAVE_SYS_UN_H #include #endif #endif #endif #endif #ifndef HAVE_INET_ATON #define inet_aton(cp, addr) (((*(unsigned long int *)(addr)) = inet_addr(cp)) != -1) #endif #ifndef SUN_LEN #ifdef SCM_RIGHTS #define HAVE_UN_LEN #endif #ifdef __linux__ #define HAVE_UN_LEN #endif #ifdef HAVE_UN_LEN #define SUN_LEN(ptr) sizeof(sockaddr_un.sun_len) + sizeof(sockaddr_un.sun_family) + sizeof(sockaddr_un.sun_path) + 1 #else #define SUN_LEN(ptr) ((size_t)((struct sockaddr_un *)0)->sun_path) + strlen((ptr)->sun_path)) #endif #endif #ifndef _OSF_SOURCE #ifndef HAVE_SOCKLEN_T #if defined(i386) && defined(__svr4__) #define HAVE_SOCKLEN_U #else #if defined(__CYGWIN32__) #define socklen_t int #else typedef int socklen_t; #endif #endif #ifdef HAVE_SOCKLEN_U #if !defined(__CYGWIN32__) && !defined(__MINGW32__) typedef unsigned socklen_t; #else typedef int socklen_t; #endif #endif #endif #endif #ifdef __hpux #ifdef mutable #undef mutable #endif #endif #if defined(AF_INET6) && defined(HAVE_INET_PTON) #define CCXX_IPV6 #endif #define CCXX_MULTIFAMILY_IP #ifndef HAVE_BOOL_TYPE typedef enum { true=1, false=0 } bool; #endif #ifndef CCXX_EXCEPTIONS /* disable HAVE_EXCEPTION */ #ifdef HAVE_EXCEPTION #undef HAVE_EXCEPTION #endif /* throw - replacement to throw an exception */ #define THROW(x) abort() /* throw - replacement to declare an exception */ #define THROWS(x) /* throw - for empty list */ #define NEW_THROWS #define THROWS_EMPTY /* * work around dangeling if/else combinations: */ #else #define THROW(x) throw x #define THROWS(x) throw(x) #define NEW_THROWS throw() #define THROWS_EMPTY throw() #endif #ifdef CCXX_NAMESPACES #define USING(x) using namespace x; #else #define USING(x) #endif #ifdef __KCC #define KAI_NONSTD_IOSTREAM 1 #endif #ifdef HAVE_SS_H #include #define COMMON_SECURE #endif #define COMMON_NAMESPACE ost #define NAMESPACE_COMMON namespace ost { #define END_NAMESPACE } #ifdef HAVE_VISIBILITY #define __EXPORT __attribute__ ((visibility("default"))) #define __DLLRTL __attribute__ ((visibility("default"))) #define __LOCAL __attribute__ ((visibility("hidden"))) #else #define __EXPORT #define __DLLRTL #define __LOCAL #endif #ifndef ETC_PREFIX #ifdef WIN32 #define ETC_PREFIX "C:\\WINDOWS\\" #endif #ifndef ETC_PREFIX #define ETC_PREFIX "/etc/" #endif #endif #endif #ifndef HAVE_FCNTL_H #ifdef HAVE_SYS_FCNTL_H #include #endif #else #include #ifndef O_NDELAY #ifdef HAVE_SYS_FCNTL_H #include #endif #endif #endif #if defined(HAVE_ENDIAN_H) #include #elif defined(HAVE_SYS_ISA_DEFS_H) #include #ifdef _LITTLE_ENDIAN #define __BYTE_ORDER 1234 #else #define __BYTE_ORDER 4321 #endif #if _ALIGNMENT_REQUIRED > 0 #define __BYTE_ALIGNMENT _MAX_ALIGNMENT #else #define __BYTE_ALIGNMENT 1 #endif #endif #ifndef __LITTLE_ENDIAN #define __LITTLE_ENDIAN 1234 #define __BIG_ENDIAN 4321 #endif #ifndef __BYTE_ORDER #define __BYTE_ORDER 1234 #endif #ifndef __BYTE_ALIGNMENT #if defined(SPARC) || defined(sparc) #if defined(__arch64__) || defined(__sparcv9) #define __BYTE_ALIGNMENT 8 #else #define __BYTE_ALIGNMENT 4 #endif #endif #endif #ifndef __BYTE_ALIGNMENT #define __BYTE_ALIGNMENT 1 #endif #ifdef HAVE_SIGACTION #ifdef HAVE_BSD_SIGNAL_H #undef HAVE_BSD_SIGNAL_H #endif #endif /* Cause problem with Solaris... and perhaps Digital Unix? However, the autoconf test in ost_signal defines _POSIX_PTHREAD_SEMANTICS when trying to compile sigwait2. */ #ifdef HAVE_SIGWAIT2 #ifndef _POSIX_PTHREAD_SEMANTICS #define _POSIX_PTHREAD_SEMANTICS #endif #endif #ifdef HAVE_BSD_SIGNAL_H #include #else #include #endif #ifndef SA_ONESHOT #define SA_ONESHOT SA_RESETHAND #endif #include #ifdef HAVE_STRINGS_H #ifndef _AIX #include #endif #endif #ifdef HAVE_ALLOCA_H #include #endif #ifndef HAVE_SNPRINTF #if defined(WIN32) && defined(_MSC_VER) && _MSC_VER < 1400 #define snprintf _snprintf #define vsnprintf _vsnprintf #endif #endif #ifdef HAVE_STRCASECMP #ifndef stricmp #define stricmp(x,y) strcasecmp(x,y) #endif #ifndef strnicmp #define strnicmp(x,y,n) strncasecmp(x,y,n) #endif #ifndef stristr #define stristr(x, y) strcasestr(x,y) #endif #endif #ifdef HAVE_THREAD_H #include "@thrprefix@/thread.h" #if defined(i386) && defined(__svr4__) && !defined(__sun) #define _THR_UNIXWARE #endif #if defined(__SVR4) && defined(__sun) #define _THR_SUNOS5 #else #if defined(__SVR4__) && defined(__SUN__) #define _THR_SUNOS5 #endif #endif #endif #ifdef HAVE_WORKING_SYS_ATOMIC_H #include #define HAVE_ATOMIC #elif defined(HAVE_ATOMIC_AIX) #include #ifndef HAVE_ATOMIC #define HAVE_ATOMIC #endif #endif #if defined(__cplusplus) #if defined(HAVE_GCC_BITS_ATOMIC) || defined(HAVE_GCC_CXX_BITS_ATOMIC) #include #define HAVE_ATOMIC #endif #endif #if defined(HAVE_PTHREAD_H) && ( defined(_THREAD_SAFE) || defined(_REENTRANT) ) #ifdef __QNX__ #define __EXT_QNX #endif #include #ifdef HAVE_PTHREAD_NP_H #include #endif #ifdef HAVE_SEMAPHORE_H #include #endif #ifdef _POSIX_PRIORITY_SCHEDULING #ifdef HAVE_SCHED_H #include #else #ifdef HAVE_SYS_SCHED_H #include #endif #endif #endif #define __PTHREAD_H__ #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #ifdef MUTEX_TYPE_COUNTING_FAST #define PTHREAD_MUTEXTYPE_RECURSIVE MUTEX_TYPE_COUNTING_FAST #endif #endif #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #ifdef PTHREAD_MUTEX_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE #endif #endif #ifndef HAVE_PTHREAD_MUTEXATTR_SETTYPE #if HAVE_PTHREAD_MUTEXATTR_SETKIND_NP #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP #endif #define pthread_mutexattr_gettype(x, y) pthread_mutexattr_getkind_np(x, y) #define pthread_mutexattr_settype(x, y) pthread_mutexattr_setkind_np(x, y) #endif #if HAVE_PTHREAD_MUTEXATTR_SETTYPE_NP #ifndef PTHREAD_MUTEXTYPE_RECURSIVE #define PTHREAD_MUTEXTYPE_RECURSIVE PTHREAD_MUTEXTYPE_RECURSIVE_NP #endif #define pthread_mutexattr_settype(x, y) pthread_mutexattr_settype_np(x, y) #define pthread_mutexattr_gettype(x, y) pthread_mutexattr_gettype_np(x, y) #endif #endif #ifdef HAVE_PTHREAD_MACH_THREAD_NP #define _THR_MACH #endif #ifndef HAVE_PTHREAD_YIELD #ifdef HAVE_PTHREAD_YIELD_NP #define pthread_yield() pthread_yield_np() #define HAVE_PTHREAD_YIELD #endif #endif #ifndef HAVE_PTHREAD_YIELD #ifdef HAVE_PTHREAD_SCHED_YIELD #define pthread_yield() sched_yield() #define HAVE_PTHREAD_YIELD #endif #endif #ifndef HAVE_PTHREAD_DELAY #ifdef HAVE_PTHREAD_DELAY_NP #define HAVE_PTHREAD_DELAY #define pthread_delay(x) pthread_delay_np(x) #endif #if defined(HAVE_PTHREAD_NANOSLEEP) #ifndef HAVE_PTHREAD_DELAY #define HAVE_PTHREAD_DELAY #ifdef __FreeBSD__ #ifdef __cplusplus extern "C" int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); #endif #endif #define pthread_delay(x) nanosleep(x, NULL) #endif #endif #endif #ifdef HAVE_PTHREAD_ATTR_SETSTACK #ifndef PTHREAD_STACK_MIN #define PTHREAD_STACK_MIN 32768 #endif #endif #ifndef HAVE_PTHREAD_CANCEL #ifdef SIGCANCEL #define CCXX_SIG_THREAD_CANCEL SIGCANCEL #else #define CCXX_SIG_THREAD_CANCEL SIGQUIT #endif #define pthread_cancel(x) pthread_kill(x, CCXX_SIG_THREAD_CANCEL) #define pthread_setcanceltype(x, y) #define pthread_setcancelstate(x, y) #endif #ifndef HAVE_PTHREAD_SETCANCELTYPE #ifdef HAVE_PTHREAD_SETCANCEL enum { PTHREAD_CANCEL_ASYNCHRONOUS = CANCEL_ON, PTHREAD_CANCEL_DEFERRED = CANCEL_OFF}; enum { PTHREAD_CANCEL_ENABLE = CANCEL_ON, PTHREAD_CANCEL_DISABLE = CANCEL_OFF}; #define pthread_setcancelstate(x, y) \ (y == NULL) ? pthread_setcancel(x) : *y = pthread_setcancel #define pthread_setcanceltype(x, y) \ (y == NULL) ? pthread_setasynccancel(x) | *y = pthread_setasynccancel(x) #else #define pthread_setcanceltype(x, y) #define pthread_setcancelstate(x, y) #endif #endif #ifdef _AIX #ifdef HAVE_PTHREAD_SUSPEND #undef HAVE_PTHREAD_SUSPEND #endif #endif #endif commoncpp2-1.8.1/INSTALL.w320000644000175000017500000001211411463314527012167 00000000000000Installation on Windows 32 Platform =================================== Starting with Common C++ "2" 1.0rc1, both posix and Win32 libraries are built from the same source directory (src). The only difference between them is that Win32 MSVC++ projects use a specific win32 configuration header located in win32/cc++/config.h. If you use Cygwin or MingW you may use the autotools infrastructure. There is also a specific win32/Makefile.gcc for Mingw. It has been tested to build dll's with Mingw as cross compiler on Debian GNU/Linux. A win32/Makefile.bcc is provided for Borland C++ compiler users. Although a bit outdated it should work. Compiling and testing with MSVC6 ================================ Three workspaces are provided for MSVC++: * CCXX2: includes two projects that build ccgnu2.dll and ccext2.dll (base and extension libraries respectively). * CCXX2demo: projects for demo apps. * CCXX2tests: projects for tests apps. All these projects define the two usual configurations: Debug and Release. When building under "Debug" all executables, libraries and compilation temporary objects will go to win32/Debug. When building under "Release" all executables, libraries and compilation temporary objects will go to win32/Release. As mentioned above, a specific win32/cc++/config.h configuration header is provided for MSVC++. This header defines "configuration constants". In particular, the HAVE_LIBXML "configuration constant" is defined so that XML support is compiled and added to ccext2.dll. In order for this configuration to work, you should have installed libxml2 (the XML C library for GNOME) on your system. You can get sources (with MSVC++ workspace files) and/or binaries of libxml2 from http://xmlsoft.org. If you just do not want XML support, simply remove or comment the line #define COMMON_XML_PARSING in win32/cc++/config.h, but beware the xml demo applications will not compile due to linking errors. Install with MSVC6 ================== From win32 directory execute install.bat script. This copy headers and import libraries in MSVC directory and dll in SDK Path You must define some environments variables before launch install.bat (defined automatically by batch vcvars32.bat in VC bin directory): - MSVCDir the install directory of MSVC ( usually C:\Program Files\Microsoft Visual Studio\VC98) Also you can define: - DLL_PATH to point to a place to install things. If not defined it'll be defined to "%MSVCDir%\Bin" Install with Visual Studio 2008 from SVN ================== If you checked out the project from SVN and you mean building it by using Visual Studio 2008 you nead to create solution and projects. In order to do that you can do the following steps: - using cygwin run from the project root the following commands: ./autogen.sh ./configure then you can find the needed files into w32\vs2008 directory. - without using cygwin 1) open configure.ac file and take note of VERSION and LT_RELEASE values 2) copy w32\vs2008\common.sl.in to w32\vs2008\common.sl 3) copy w32\vs2008\ccext2.vcproj.in to w32\vs2008\ccext2.vcproj 4) copy w32\vs2008\ccgnu2.vcproj.in to w32\vs2008\ccgnu2.vcproj 5) edit w32\vs2008\ccext2.vcproj and w32\vs2008\ccgnu2.vcproj to change every entries of VCVERSION to the value of VERSION read before into configure.ac, and every entries of DLLVERSION to the value of LT_RELEASE. Install with Visual Studio 2005 from SVN ================== If you checked out the project from SVN and you mean building it by using Visual Studio 2005 you nead to create solution and projects. In order to do that you can do the following steps: - using cygwin run from the project root the following commands: ./autogen.sh ./configure then you can find the needed files into w32 directory. - without using cygwin 1) open configure.ac file and take note of VERSION and LT_RELEASE values 2) copy w32\ccext2.vcproj.in to w32\ccext2.vcproj 4) copy w32\ccgnu2.vcproj.in to w32\ccgnu2.vcproj 5) edit w32\ccext2.vcproj and w32\ccgnu2.vcproj to change every entries of VCVERSION to the value of VERSION read before into configure.ac, and every entries of DLLVERSION to the value of LT_RELEASE. Install with Visual Studio 6 from SVN ================== If you checked out the project from SVN and you mean building it by using Visual Studio 6 you nead to create solution and projects. In order to do that you can do the following steps: - using cygwin run from the project root the following commands: ./autogen.sh ./configure then you can find the needed files into w32 directory. - without using cygwin 1) open configure.ac file and take note of VERSION and LT_RELEASE values 2) copy w32\ccext2.dsp.in to w32\ccext2.dsp 3) copy w32\ccgnu2.dsp.in to w32\ccgnu2.dsp 4) edit w32\ccext2.dsp and w32\ccgnu2.dsp to change every entries of VCVERSION to the value of VERSION read before into configure.ac, and every entries of DLLVERSION to the value of LT_RELEASE. commoncpp2-1.8.1/SUPPORT0000644000175000017500000000055411463314527011630 00000000000000GNU Common C++ is part of the GNU Project and used in GNU Telephony. Web resources: http://www.gnu.org/software/commoncpp/ http://www.gnutelephony.org http://savannah.gnu.org/projects/gnucomm Mailing lists and email contacts: mailto:dyfet@gnutelephony.org mailto:cplusplus-devel@lists.sourceforge.net http://lists.gnu.org/mailman/listinfo/bug-commoncpp commoncpp2-1.8.1/autoconf/0000755000175000017500000000000011463572774012435 500000000000000commoncpp2-1.8.1/autoconf/ltmain.sh0000755000175000017500000073341511463364506014205 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 commoncpp2-1.8.1/autoconf/config.guess0000755000175000017500000013105411463364513014667 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: commoncpp2-1.8.1/autoconf/missing0000755000175000017500000002623311463364513013750 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: commoncpp2-1.8.1/autoconf/install-sh0000755000175000017500000003253711463364513014361 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: commoncpp2-1.8.1/autoconf/depcomp0000755000175000017500000004426711463364513013735 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: commoncpp2-1.8.1/autoconf/texinfo.tex0000644000175000017500000110035111463364513014542 00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2009-08-14.15} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009 Free Software Foundation, Inc. % % This texinfo.tex 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 3 of the % License, or (at your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. (This has been our intent since Texinfo was invented.) % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://www.gnu.org/software/texinfo/ (the Texinfo home page), or % ftp://tug.org/tex/texinfo.tex % (and all CTAN mirrors, see http://www.ctan.org). % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% Math-mode def from plain.tex. \let\ptexraggedright=\raggedright % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt} % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\undefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % For @cropmarks command. % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 \noexpand\or \the\toks4 \the\toks6 \noexpand\else \the\toks8 }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty out of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} %% Simple single-character @ commands % @@ prints an @ % Kludge this until the fonts are right (grr). \def\@{{\tt\char64}} % This is turned off because it was never documented % and you can use @w{...} around a quote to suppress ligatures. %% Define @` and @' to be the same as ` and ' %% but suppressing ligatures. %\def\`{{`}} %\def\'{{'}} % Used to generate quoted braces. \def\mylbrace {{\tt\char123}} \def\myrbrace {{\tt\char125}} \let\{=\mylbrace \let\}=\myrbrace \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \c \let\dotaccent = \. \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \t \let\ubaraccent = \b \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% \kern-.15em \TeX } % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in % Old definition--didn't work. %\parseargdef\need{\par % %% This method tries to make TeX break the page naturally %% if the depth of the box does not fit. %{\baselineskip=0pt% %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak %\prevdepth=-1000pt %}} \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\next\centerH \else \let\next\centerV \fi \next{\hfil \ignorespaces#1\unskip \hfil}% } \def\centerH#1{% {% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }% } \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} % @sp n outputs n lines of vertical space \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a \ character. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but % this is not advertised and we don't care. Texinfo does not % otherwise define @\. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @comma{} is so commas can be inserted into text without messing up % Texinfo's parsing. % \let\comma = , % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as \undefined, % borrowed from ifpdf.sty. \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html % (and related messages, the final outcome is that it is up to the TeX % user to double the backslashes and otherwise make the string valid, so % that's what we do). % double active backslashes. % {\catcode`\@=0 \catcode`\\=\active @gdef@activebackslashdouble{% @catcode`@\=@active @let\=@doublebackslash} } % To handle parens, we must adopt a different approach, since parens are % not active characters. hyperref.dtx (which has the same problem as % us) handles it with this amazing macro to replace tokens, with minor % changes for Texinfo. It is included here under the GPL by permission % from the author, Heiko Oberdiek. % % #1 is the tokens to replace. % #2 is the replacement. % #3 is the control sequence with the string. % \def\HyPsdSubst#1#2#3{% \def\HyPsdReplace##1#1##2\END{% ##1% \ifx\\##2\\% \else #2% \HyReturnAfterFi{% \HyPsdReplace##2\END }% \fi }% \xdef#3{\expandafter\HyPsdReplace#3#1\END}% } \long\def\HyReturnAfterFi#1\fi{\fi#1} % #1 is a control sequence in which to do the replacements. \def\backslashparens#1{% \xdef#1{#1}% redefine it as its expansion; the definition is simply % \lastnode when called from \setref -> \pdfmkdest. \HyPsdSubst{(}{\realbackslash(}{#1}% \HyPsdSubst{)}{\realbackslash)}{#1}% } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .png, .jpg, .pdf (among % others). Let's try in that order. \let\pdfimgext=\empty \begingroup \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \imagewidth \fi \ifdim \wd2 >0pt height \imageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \activebackslashdouble \makevalueexpandable \def\pdfdestname{#1}% \backslashparens\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \def\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else % Doubled backslashes in the name. {\activebackslashdouble \xdef\pdfoutlinedest{#3}% \backslashparens\pdfoutlinedest}% \fi % % Also double the backslashes in the display string. {\activebackslashdouble \xdef\pdfoutlinetext{#1}% \backslashparens\pdfoutlinetext}% % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Thanh's hack / proper braces in bookmarks \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace % % Read toc silently, to get counts of subentries for \pdfoutline. \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % xx to do this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Right % now, I guess we'll just let the pdf reader have its way. \indexnofonts \setupdatafile \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \ifx\p\space\else\addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \fi \nextsp} \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Default leading. \newdimen\textleading \textleading = 13.2pt % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\undefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named #2, adding on the % specified font prefix (normally `cm'). % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass % empty to omit). \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % emacs-page end of cmaps % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\undefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} %where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. This is the default in % Texinfo. % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} % reset the current fonts \textfonts \rm } % end of 11pt text font size definitions % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} % reduce space between paragraphs \divide\parskip by 2 % reset the current fonts \textfonts \rm } % end of 10pt text font size definitions % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xword{10} \def\xiword{11} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% \wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{25pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} \gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright \let\markupsetuplqsamp \markupsetnoligaturesquoteleft \let\markupsetuplqkbd \markupsetnoligaturesquoteleft % Allow an option to not replace quotes with a regular directed right % quote/apostrophe (char 0x27), but instead use the undirected quote % from cmtt (char 0x0d). The undirected quote is ugly, so don't make it % the default, but it works for pasting with more pdf viewers (at least % evince), the lilypond developers report. xpdf does work with the % regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic % \smartitalic{ARG} outputs arg in italics, followed by an italic correction % unless the following character is such as not to need one. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else \ptexslash\fi\fi\fi} \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} % like \smartslanted except unconditionally uses \ttsl. % @var is set to this for defun arguments. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitalicx} \let\i=\smartitalic \let\slanted=\smartslanted \def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}} \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % ctrl is no longer a Texinfo command. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @file, @option are the same as @samp. \let\file=\samp \let\option=\samp % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null } % We *must* turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. % -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\realdash \let_\realunder \fi \codex } } \def\realdash{-} \def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } \def\codex #1{\tclose{#1}\endgroup} % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is undesirable in % some manuals, especially if they don't have long identifiers in % general. @allowcodebreaks provides a way to control this. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg'}% \fi\fi } % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle option `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} % For @indicateurl, @env, @command quotes seem unnecessary, so use \code. \let\indicateurl=\code \let\env=\code \let\command=\code % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. Perhaps eventually put in % a hypertex \special here. % \def\uref#1{\douref #1,,,\finish} \def\douref#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi } \message{glyphs,} % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\undefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } %%% Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \leftline{\titlefonts\rmisbold #1} % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } %%% Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\HEADINGSoff{% \global\evenheadline={\hfil} \global\evenfootline={\hfil} \global\oddheadline={\hfil} \global\oddfootline={\hfil}} \HEADINGSoff % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\undefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi %% Test to see if parskip is larger than space between lines of %% table. If not, do nothing. %% If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller %% than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\realdash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get special treatment of `@end ifset,' call \makeond and the redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these in case \tex is in effect and \{ is a \delimiter again. % But can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. \let\{ = \mylbrace \let\} = \myrbrace % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control% words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\expansion \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sc \definedummyword\t % % Commands that take arguments. \definedummyword\acronym \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % Hopefully, all control words can become @asis. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% % how to handle braces? \def\_{\normalunderscore}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{% \ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi } % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % \unnumberedno is an oxymoron, of course. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achive this, remember the "biggest" unnum. sec. we are currently in: \chardef\unmlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unmlevel \chardef\unmlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unmlevel \def\headtype{U}% \else \chardef\unmlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading % NOTE on use of \vbox for chapter headings, section headings, and such: % 1) We use \vbox rather than the earlier \line to permit % overlong headings to fold. % 2) \hyphenpenalty is set to 10000 because hyphenation in a % heading is obnoxious; this forbids it. % 3) Likewise, headings look best if no \parindent is used, and % if justification is not attempted. Hence \raggedright. \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}% \bigskip \par\penalty 200\relax \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. %%% Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% \hbox to 0pt{}% \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt\ptexraggedright \rmisbold #1\hfill}}\bigskip \par\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 \parindent=0pt \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) \vskip-\parskip % % This is purely so the last item on the list is a known \penalty > % 10000. This is so \startdefun can avoid allowing breakpoints after % section headings. Otherwise, it would insert a valid breakpoint between: % % @section sec-whatever % @deffn def-whatever \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw Tex temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain tex @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode`\`=\other \catcode`\'=\other \escapechar=`\\ % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of \def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \hfuzz = 12pt % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it by one command: \def\makedispenv #1#2{ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two synonyms: \def\maketwodispenvs #1#2#3{ \makedispenv{#1}{#3} \makedispenv{#2}{#3} } % @lisp: indented, narrowed, typewriter font; @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvs {lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenv {display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenv{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \def\quotationstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi \parsearg\quotationlabel } \envdef\quotation{% \setnormaldispenv \quotationstart } \envdef\smallquotation{% \setsmalldispenv \quotationstart } \let\Esmallquotation = \Equotation % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\undefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % \def\starttabbox{\setbox0=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen0=\wd0 % the width so far, or since the previous tab \divide\dimen0 by\tabw \multiply\dimen0 by\tabw % compute previous multiple of \tabw \advance\dimen0 by\tabw % advance to next multiple of \tabw \wd0=\dimen0 \box0 \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart % Easiest (and conventionally used) font for verbatim \tt \def\par{\leavevmode\egroup\box0\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a minor refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } %%% Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } %%% Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } %%% Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } %%% Type: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % How we'll format the type name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % (plain.tex says that \dimen1 should be used only as global.) \parshape 2 0in \dimen0 \defargsindent \dimen2 % % Put the type name to the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% return value type \ifx\temp\empty\else \tclose{\temp} \fi #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. Let's try @var for that. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\undefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{% \begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % ... and \example \spaceisspace % % Append \endinput to make sure that TeX does not see the ending newline. % I've verified that it is necessary both for e-TeX and for ordinary TeX % --kasal, 29nov03 \scantokens{#1\endinput}% \endgroup } \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \. % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. \def\scanctxt{% \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% \scanctxt \catcode`\\=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0% \else \expandafter\parsemargdef \argl;% \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname #1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.blah for each blah % in the params list, to be ##N where N is the position in that list. % That gets used by \mbodybackslash (above). % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. \def\parsemargdef#1;{\paramno=0\def\paramlist{}% \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1% \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% % This defines the macro itself. There are six cases: recursive and % nonrecursive macros of zero, one, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % many \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \fi \fi} \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg) \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Just make them active and then expand them all to nothing. \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout }% \fi } % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces \def\printedmanual{\ignorespaces #5}% \def\printedrefname{\ignorespaces #3}% \setbox1=\hbox{\printedmanual\unskip}% \setbox0=\hbox{\printedrefname\unskip}% \ifdim \wd0 = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax % Use the node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Use the actual chapter/section title appear inside % the square brackets. Use the real section title if we have it. \ifdim \wd1 > 0pt % It is in another manual, so we don't have it. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. \getfilename{#4}% % % See comments at \activebackslashdouble. {\activebackslashdouble \xdef\pdfxrefdest{#1}% \backslashparens\pdfxrefdest}% % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd0 = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % if the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd1 > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not % insert empty discretionaries after hyphens, which means that it will % not find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, this % is a loss. Therefore, we give the text of the node name again, so it % is as if TeX is seeing it for the first time. \ifdim \wd1 > 0pt \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% \else % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via a macro so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi \fi \endlink \endgroup} % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs \message{\linenumber Undefined cross reference `#1'.}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\undefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing this stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. On the other hand, if % it's at the top level, we don't want the normal paragraph indentation. \noindent % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip \fi % space after the standalone image \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{~} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guilletright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{~} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'\i} \gdef^^ee{\^\i} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be so finicky about underfull hboxes, either. \hbadness = 2000 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \catcode`\~=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\+=\other \catcode`\$=\other \def\normaldoublequote{"} \def\normaltilde{~} \def\normalcaret{^} \def\normalunderscore{_} \def\normalverticalbar{|} \def\normalless{<} \def\normalgreater{>} \def\normalplus{+} \def\normaldollar{$}%$ font-lock fix % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def~{{\tt\char126}} \chardef\hat=`\^ \catcode`\^=\active \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def<{{\tt \less}} \chardef \gtr=`\> \catcode`\>=\active \def>{{\tt \gtr}} \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active @def@normalbackslash{{@tt@backslashcurfont}} % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % @def@normalturnoffactive{% @let\=@normalbackslash @let"=@normaldoublequote @let~=@normaltilde @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let<=@normalless @let>=@normalgreater @let+=@normalplus @let$=@normaldollar %$ font-lock fix @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. @catcode`@& = @other @catcode`@# = @other @catcode`@% = @other @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore commoncpp2-1.8.1/autoconf/config.sub0000755000175000017500000010242511463364513014332 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: commoncpp2-1.8.1/tests/0000755000175000017500000000000011463572774011761 500000000000000commoncpp2-1.8.1/tests/SampleObject.h0000644000175000017500000000613011463314535014407 00000000000000#ifndef TESTOBJECT_H #define TESTOBJECT_H // Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include "SampleSubObject.h" using std::cout; using std::endl; using std::string; // an object used to test object graph persistence class Test : public BaseObject { DECLARE_PERSISTENCE(Test) public: int32 iInteger; // basic type test string strString; string strString2; std::vector numbers; std::vector strings; std::deque moreStrings; TestSub* nullPtr; // NULL initialized pointer test TestSub* uninitializedNullPtr; // NULL that is uninitialized in constructor TestSub* subObjectPtr; // pointer to an object initially null, but later initialized TestSub* subObjectPtr2; // second pointer to the same instance of an object TestSub subObjectRef; std::deque subObjects; Test(); ~Test() { delete subObjectPtr; }; Test(Test &ob); bool operator==(const Test &ob) const; bool operator!=(const Test &ob) const { return !(*this == ob); }; void print(const string& name); virtual bool write(Engine& archive) const; virtual bool read(Engine& archive); }; #endif commoncpp2-1.8.1/tests/bug2.cpp0000644000175000017500000000464011463314535013235 00000000000000// Copyright (C) 1999-2001 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of APE. // // The exception is that, if you link the APE library with other files // to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the APE library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name APE. If you copy code from other releases into a copy of // APE, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for APE, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include // This was a test case for a bug report related to the final self- // deleting the thread. #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class ThreadTest : public Thread { public: void Test() { exit(); } private: void run() { cout << "Run()..." << endl;}; }; int main() { ThreadTest *thread = new ThreadTest; // core dump ? thread->Test(); return 0; } commoncpp2-1.8.1/tests/url1.cpp0000644000175000017500000000400211463314535013251 00000000000000#include // This was a test base64 stuff #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif #define BUFLEN 512 char buf1[BUFLEN]; char buf2[BUFLEN]; bool errorOccurred = false; char status[256] = ""; void printBug(const char*msg) { errorOccurred = true; printf("status = %s\n%s!\n",status,msg); } const char fillChar='&'; void initBuf(char* buf) { memset(buf,fillChar,BUFLEN); } void checkBuf(char* buf,int prev,int size) { int i; for(i=0;i= (len+2)/3*4+1); for(unsigned int l2=0;l2<32;++l2) check1((unsigned char*)s,len,l1,l2, (l1 >= (len+2)/3*4+1) && (l2 >= len) ); } } int main() { checkStringOverflow((char *)"",0); checkStringOverflow((char *)"aaa",3); if (!errorOccurred) printf("All seem ok\n"); return 0; } commoncpp2-1.8.1/tests/ccxx_tests.cpp0000644000175000017500000000616711463314535014573 00000000000000#include #include #include #include #include //#include "SHATumblerTest.h" //CPPUNIT_TEST_SUITE_REGISTRATION(SHATumblerTest); using namespace std; #define ULONG unsigned long ULONG crc32_table[256]; // Lookup table array // Reflection is a requirement for the official CRC-32 standard. // You can create CRCs without it, but they won't conform to the standard. ULONG Reflect(ULONG ref, char ch) {// Used only by Init_CRC32_Table() ULONG value(0); // Swap bit 0 for bit 7 // bit 1 for bit 6, etc. for(int i = 1; i < (ch + 1); i++) { if(ref & 1) value |= 1 << (ch - i); ref >>= 1; } return value; } // Call this function only once to initialize the CRC table. void Init_CRC32_Table() {// Called by OnInitDialog() // This is the official polynomial used by CRC-32 // in PKZip, WinZip and Ethernet. ULONG ulPolynomial = 0x04c11db7; // 256 values representing ASCII character codes. for(int i = 0; i <= 0xFF; i++) { crc32_table[i]=Reflect(i, 8) << 24; for (int j = 0; j < 8; j++) crc32_table[i] = (crc32_table[i] << 1) ^ (crc32_table[i] & (1 << 31) ? ulPolynomial : 0); crc32_table[i] = Reflect(crc32_table[i], 32); //cout << i << ":" << crc32_table[i] << endl; } } // Once the lookup table has been filled in by the two functions above, // this function creates all CRCs using only the lookup table. int Get_CRC(string &text) {// Called by OnChangeText() // Be sure to use unsigned variables, // because negative values introduce high bits // where zero bits are required. // Start out with all bits set high. ULONG ulCRC(0xffffffff); int len; unsigned char* buffer; // Get the length. // Note that if the text contains NULL characters // processing ends at the first NULL and the CRC value is invalid. // See the 32 Bit File Demonstration source code // for a method of dealing with NULL characters in files. len = text.length(); // Save the text in the buffer. buffer = (unsigned char*)text.c_str(); // Perform the algorithm on each character // in the string, using the lookup table values. while(len--) ulCRC = (ulCRC >> 8) ^ crc32_table[(ulCRC & 0xFF) ^ *buffer++]; // Exclusive OR the result with the beginning value. return ulCRC ^ 0xffffffff; } int main(int argc, char * argv[]) { // if command line contains "-selftest" then this is the post build check // => the output must be in the compiler error format. bool selfTest = (argc > 1) && (std::string("-selftest") == argv[1]); // new CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry(); CppUnit::TextUi::TestRunner runner; runner.addTest(registry.makeTest()); if(selfTest) { // Change the default outputter to a compiler error format outputter // The test runner owns the new outputter. runner.setOutputter( CppUnit::CompilerOutputter::defaultOutputter(&runner.result(), std::cerr) ); } bool wasSucessful = runner.run("", false); //Init_CRC32_Table(); //cout << hex << setw(8) << Get_CRC(string("pippo")); return !wasSucessful; // inverted as 0 is success 1 is failure } commoncpp2-1.8.1/tests/thread1.cpp0000644000175000017500000000500111463314535013716 00000000000000#include #include #ifdef CCXX_NAMESPACES using namespace ost; #endif // This is a little regression test // class ThreadTest: public Thread { public: ThreadTest(); void run(); }; volatile int n = 0; bool WaitNValue(int value) { for(int i=0;; ++i) { if (n == value) break; if (i >= 100) return false; Thread::sleep(10); } return true; } bool WaitChangeNValue(int value) { for(int i=0;; ++i) { if (n != value) break; if (i >= 100) return false; Thread::sleep(10); } return true; } ThreadTest::ThreadTest() { } void ThreadTest::run() { setCancel(Thread::cancelDeferred); n = 1; // wait for main thread if (!WaitNValue(2)) return; // increment infinitely for(;;) { yield(); n = n+1; } } bool TestChange(bool shouldChange) { if (shouldChange) printf("- thread should change n..."); else printf("- thread should not change n..."); if (WaitChangeNValue(n) == shouldChange) { printf("ok\n"); return true; } printf("ko\n"); return false; } #undef ERROR #undef OK #define ERROR {printf("ko\n"); return 1; } #define OK {printf("ok\n"); } #define TEST_CHANGE(b) if (!TestChange(b)) return 1; int main(int argc, char* argv[]) { ThreadTest test; // test only thread, without sincronization printf("***********************************************\n"); printf("* Testing class Thread without syncronization *\n"); printf("***********************************************\n"); printf("Testing thread creation\n\n"); n = 0; test.start(); // wait for n == 1 printf("- thread should set n to 1..."); if (WaitNValue(1)) OK else ERROR; // increment number in thread printf("\nTesting thread is working\n\n"); n = 2; TEST_CHANGE(true); TEST_CHANGE(true); // suspend thread, variable should not change printf("\nTesting suspend & resume\n\n"); test.suspend(); TEST_CHANGE(false); TEST_CHANGE(false); // resume, variable should change test.resume(); TEST_CHANGE(true); TEST_CHANGE(true); printf("\nTesting recursive suspend & resume\n\n"); test.suspend(); test.suspend(); TEST_CHANGE(false); TEST_CHANGE(false); test.resume(); TEST_CHANGE(false); TEST_CHANGE(false); test.resume(); TEST_CHANGE(true); TEST_CHANGE(true); printf("\nTesting no suspend on resume\n\n"); test.resume(); TEST_CHANGE(true); TEST_CHANGE(true); // suspend thread, variable should not change printf("\nTesting resuspend\n\n"); test.suspend(); TEST_CHANGE(false); TEST_CHANGE(false); printf("\nNow program should finish... :)\n"); test.resume(); return 0; } commoncpp2-1.8.1/tests/Test_Engine.cpp0000644000175000017500000003144011463314535014600 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include "Test_Engine.h" #include CPPUNIT_TEST_SUITE_REGISTRATION(EngineTest); void EngineTest::setUp() { // Create an example object with some sub objects and various data elements complexObject.iInteger = 5; complexObject.strString = "String 1"; complexObject.strString2 = "String 2"; complexObject.uninitializedNullPtr = NULL; // initialized here instead of constructor to see if it will be unpersisted as a null (vs defaulting to null from the constructor) for(int i = 0; i < 10; i++) complexObject.numbers.push_back(i); complexObject.strings.push_back("a"); complexObject.strings.push_back("b"); complexObject.strings.push_back("c"); complexObject.strings.push_back("d"); complexObject.strings.push_back("e"); complexObject.moreStrings.push_back("z"); complexObject.moreStrings.push_back("y"); complexObject.moreStrings.push_back("x"); complexObject.moreStrings.push_back("w"); complexObject.moreStrings.push_back("v"); complexObject.subObjectPtr = new TestSub; complexObject.subObjectPtr2 = complexObject.subObjectPtr; // set to point to the same thing as subObjectPtr to test unpersisting of shared instances complexObject.subObjectPtr->iInteger = 5; complexObject.subObjectPtr->strString = "SubStringPtr 1"; complexObject.subObjectPtr->strString2 = "SubStringPtr 2"; for(int j = 10; j < 20; j++) complexObject.subObjectPtr->numbers.push_back(j); complexObject.subObjectRef.iInteger = 5; complexObject.subObjectRef.strString = "SubString2 1"; complexObject.subObjectRef.strString2 = "SubString2 2"; for(int k = 30; k < 35; k++) complexObject.subObjectRef.numbers.push_back(k); // make a std::deque of TestSub objects for(int l = 0; l < 2; l++) { TestSub newSubObject; newSubObject.iInteger = l; char tmp[50]; sprintf(tmp, "test %d", l+1); newSubObject.strString = tmp; for(int k = 30; k < 35; k++) newSubObject.numbers.push_back(k); complexObject.subObjects.push_back(newSubObject); } } void EngineTest::tearDown() {} void EngineTest::testPrimitives() { // write primitive types std::fstream outputArchive("EnginePrimitiveTest.dat", std::ios::out|std::ios::binary); Engine outputEngine(outputArchive, ost::Engine::modeWrite); TEST_PRIMITIVE_OUTPUT(int8, 0x01); TEST_PRIMITIVE_OUTPUT(uint8, 0x01); TEST_PRIMITIVE_OUTPUT(int16, 0x0123); TEST_PRIMITIVE_OUTPUT(uint16, 0x0123); TEST_PRIMITIVE_OUTPUT(int32, 0x01234567); TEST_PRIMITIVE_OUTPUT(uint32, 0x01234567); //TEST_PRIMITIVE_OUTPUT(int64, 0x0123456789ABCDEF); // warning: integer constant larger than the maximum value of an unsigned long int //TEST_PRIMITIVE_OUTPUT(uint64, 0x0123456789ABCDEF); // warning: integer constant larger than the maximum value of an unsigned long int TEST_PRIMITIVE_OUTPUT(float, 3.141592653589793238462643f); TEST_PRIMITIVE_OUTPUT(double, 3.141592653589793238462643); TEST_PRIMITIVE_OUTPUT(string, "abcdefghijklmnopqrstuvwxyz0123456789"); outputEngine.sync(); // flush Engine buffers before closing file outputArchive.close(); // read primitive types back in and check std::fstream inputArchive("EnginePrimitiveTest.dat", std::ios::in|std::ios::binary); Engine inputEngine(inputArchive, ost::Engine::modeRead); TEST_PRIMITIVE_INPUT(int8); TEST_PRIMITIVE_INPUT(uint8); TEST_PRIMITIVE_INPUT(int16); TEST_PRIMITIVE_INPUT(uint16); TEST_PRIMITIVE_INPUT(int32); TEST_PRIMITIVE_INPUT(uint32); //TEST_PRIMITIVE_INPUT(int64); //TEST_PRIMITIVE_INPUT(uint64); TEST_PRIMITIVE_INPUT(float); TEST_PRIMITIVE_INPUT(double); TEST_PRIMITIVE_INPUT(string); inputArchive.close(); } void EngineTest::testRawBinary() { int i; // write raw binary data std::fstream outputArchive("EngineRawBinaryTest.dat", std::ios::out|std::ios::binary); Engine outputEngine(outputArchive, ost::Engine::modeWrite); unsigned int binaryBuffer[BINARY_BUFFER_SIZE]; for(i = 0; i < BINARY_BUFFER_SIZE; i++) binaryBuffer[i] = i; outputEngine.writeBinary((const uint8*) binaryBuffer, sizeof(binaryBuffer)); outputEngine.sync(); // flush Engine buffers before closing file outputArchive.close(); // read binary data back in and check std::fstream inputArchive("EngineRawBinaryTest.dat", std::ios::in|std::ios::binary); Engine inputEngine(inputArchive, ost::Engine::modeRead); unsigned int binaryBuffer2[BINARY_BUFFER_SIZE]; inputEngine.readBinary((uint8*) binaryBuffer2, sizeof(binaryBuffer2)); inputArchive.close(); for(i = 0; i < BINARY_BUFFER_SIZE; i++) CPPUNIT_ASSERT(binaryBuffer[i] == binaryBuffer2[i]); } void EngineTest::testSTLVector() { int i; // write STL data std::fstream outputArchive("EngineSTLVectorTest.dat", std::ios::out|std::ios::binary); Engine outputEngine(outputArchive, ost::Engine::modeWrite); std::vector intVector; std::vector* pIntVector = new std::vector; for(i = 0; i < STL_CONTAINER_SIZE; i++) { intVector.push_back(i); pIntVector->push_back(i); } outputEngine << intVector; outputEngine << *pIntVector; outputEngine.sync(); // flush Engine buffers before closing file outputArchive.close(); // read STL std::vector back in and check std::fstream inputArchive("EngineSTLVectorTest.dat", std::ios::in|std::ios::binary); Engine inputEngine(inputArchive, ost::Engine::modeRead); std::vector intVector2; inputEngine >> intVector2; CPPUNIT_ASSERT(intVector == intVector2); std::vector* pIntVector2 = new std::vector; inputEngine >> *pIntVector2; CPPUNIT_ASSERT(*pIntVector == *pIntVector2); delete pIntVector2; inputArchive.close(); delete pIntVector; } void EngineTest::testSTLDeque() { int i; // write STL std::deque data std::fstream outputArchive("EngineSTLDequeTest.dat", std::ios::out|std::ios::binary); Engine outputEngine(outputArchive, ost::Engine::modeWrite); std::deque intDeque; std::deque* pIntDeque = new std::deque; for(i = 0; i < STL_CONTAINER_SIZE; i++) { intDeque.push_back(i); pIntDeque->push_back(i); } outputEngine << intDeque; outputEngine << *pIntDeque; outputEngine.sync(); // flush Engine buffers before closing file outputArchive.close(); // read STL std::deque back in and check std::fstream inputArchive("EngineSTLDequeTest.dat", std::ios::in|std::ios::binary); Engine inputEngine(inputArchive, ost::Engine::modeRead); std::deque intDeque2; inputEngine >> intDeque2; CPPUNIT_ASSERT(intDeque == intDeque2); std::deque* pIntDeque2 = new std::deque; inputEngine >> *pIntDeque2; CPPUNIT_ASSERT(*pIntDeque == *pIntDeque2); delete pIntDeque2; inputArchive.close(); delete pIntDeque; } void EngineTest::testSTLMap() { int i; // write STL std::map data std::fstream outputArchive("EngineSTLMapTest.dat", std::ios::out|std::ios::binary); Engine outputEngine(outputArchive, ost::Engine::modeWrite); std::map intMap; std::map* pIntMap = new std::map; for(i = 0; i < STL_CONTAINER_SIZE; i++) { intMap.insert(std::pair(i, i+10)); pIntMap->insert(std::pair(i, i+11)); } outputEngine << intMap; outputEngine << *pIntMap; outputEngine.sync(); // flush Engine buffers before closing file outputArchive.close(); // read STL std::map back in and check std::fstream inputArchive("EngineSTLMapTest.dat", std::ios::in|std::ios::binary); Engine inputEngine(inputArchive, ost::Engine::modeRead); std::map intMap2; inputEngine >> intMap2; CPPUNIT_ASSERT(intMap == intMap2); std::map* pIntMap2 = new std::map; inputEngine >> *pIntMap2; CPPUNIT_ASSERT(*pIntMap == *pIntMap2); delete pIntMap2; inputArchive.close(); delete pIntMap; } void EngineTest::testComplexObject() { // write BaseObject hierarchy std::fstream outputArchive("EngineComplexObjectTest.dat", std::ios::out|std::ios::binary); Engine outputEngine(outputArchive, ost::Engine::modeWrite); outputEngine << complexObject; outputEngine.sync(); // flush Engine buffers before closing file outputArchive.close(); // Unpersist a new object structure into an uninitialized object { Test* myObjPtr = NULL; // must initialize pointer or new persistence engine will think it is already allocated std::fstream inputArchive("EngineComplexObjectTest.dat", std::ios::in); Engine inputEngine(inputArchive, ost::Engine::modeRead); inputEngine >> myObjPtr; inputArchive.close(); CPPUNIT_ASSERT_MESSAGE("Unpersisted into unallocated pointer == Original", *myObjPtr == complexObject); CPPUNIT_ASSERT_MESSAGE("nullPtr is NULL", myObjPtr->nullPtr == NULL); CPPUNIT_ASSERT_MESSAGE("uninitializedNullPtr is NULL", myObjPtr->uninitializedNullPtr == NULL); myObjPtr->subObjectPtr->strString2 = "Changed SubStringPtr 1"; CPPUNIT_ASSERT_MESSAGE("subObjectPtr.strString2 should always equal subObjectPtr2.strString2", myObjPtr->subObjectPtr->strString2 == myObjPtr->subObjectPtr2->strString2); CPPUNIT_ASSERT_MESSAGE("subObjectPtr.strString2 should now equal 'Changed SubStringPtr 1'", myObjPtr->subObjectPtr->strString2 == "Changed SubStringPtr 1"); CPPUNIT_ASSERT_MESSAGE("subObjectPtr.strString2 should still equal subObjectPtr2.strString2", myObjPtr->subObjectPtr->strString2 == myObjPtr->subObjectPtr2->strString2); } // Unpersist a new object structure into an instantiated class variable { Test myObjInstance; std::fstream inputArchive("EngineComplexObjectTest.dat", std::ios::in); Engine inputEngine(inputArchive, ost::Engine::modeRead); inputEngine >> myObjInstance; inputArchive.close(); CPPUNIT_ASSERT_MESSAGE("Unpersisted into default constructed instance == Original", myObjInstance == complexObject); CPPUNIT_ASSERT_MESSAGE("nullPtr is NULL", myObjInstance.nullPtr == NULL); CPPUNIT_ASSERT_MESSAGE("UninitializedNullPtr is NULL", myObjInstance.uninitializedNullPtr == NULL); } // Unpersist a new object structure into a pre-initialized pointer to an object { Test* myObjAllocatedPtr = new Test; std::fstream inputArchive("EngineComplexObjectTest.dat", std::ios::in); Engine inputEngine(inputArchive, ost::Engine::modeRead); inputEngine >> myObjAllocatedPtr; outputEngine.sync(); // flush Engine buffers before closing file inputArchive.close(); CPPUNIT_ASSERT_MESSAGE("Unpersisted into pre-allocated pointer", *myObjAllocatedPtr == complexObject); CPPUNIT_ASSERT_MESSAGE("nullPtr is NULL", myObjAllocatedPtr->nullPtr == NULL); CPPUNIT_ASSERT_MESSAGE("uninitializedNullPtr is NULL", myObjAllocatedPtr->uninitializedNullPtr == NULL); } } void EngineTest::testModeExceptions() { // write primitive types std::fstream outputArchive("EnginePrimitiveTest.dat", std::ios::in|std::ios::binary); Engine outputEngine(outputArchive, ost::Engine::modeWrite); int32 test_Int32 = 0x01234567; try { outputEngine << test_Int32; //CPPUNIT_FAIL("Call to persist to an input stream should throw an exception"); } catch(PersistException &ex) { CPPUNIT_ASSERT_MESSAGE(ex.getString(), true); } outputArchive.close(); } commoncpp2-1.8.1/tests/Test_Date.h0000644000175000017500000001371411463314535013721 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include // includes Date #include #include using namespace ost; using std::string; /** * Test Fixture to excercise the Common C++ urlstring functions * * @author Chad C. Yates */ class DateTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DateTest); CPPUNIT_TEST(testSimpleGets); CPPUNIT_TEST(testSimpleSets); CPPUNIT_TEST(testIsValid); CPPUNIT_TEST(testGetDate_String); CPPUNIT_TEST(testGetDate_time_t); CPPUNIT_TEST(testGeteDate_struct_tm); CPPUNIT_TEST(testOperations); //CPPUNIT_TEST_SUB_SUITE(CppUnit::TestCaller >, DateTest); CPPUNIT_TEST_SUITE_END(); protected: Date date; int exp_year; long exp_value; unsigned exp_month; unsigned exp_day; unsigned exp_dayofweek; string exp_stringdate; tm exp_dt; time_t exp_ctime; public: void setUp() { Thread::setException(Thread::throwNothing); date = Date(2003, 1, 6); exp_year = 2003; exp_month = 1; exp_day = 6; exp_dayofweek = 1; std::stringstream tmp; tmp << exp_year << "-" << std::setfill('0') << std::setw(2) << exp_month << "-" << std::setw(2) << exp_day; exp_stringdate = tmp.str(); std::stringstream tmp2; tmp2 << exp_year << std::setfill('0') << std::setw(2) << exp_month << std::setw(2) << exp_day; exp_value = atoi(tmp2.str().c_str()); // make a ctime style datetime stamp memset(&exp_dt, 0, sizeof(exp_dt)); exp_dt.tm_year = exp_year - 1900; // years since 1900 exp_dt.tm_mon = exp_month - 1; // months since january (0-11) exp_dt.tm_mday = exp_day; exp_ctime = mktime(&exp_dt); } void testSimpleGets() { CPPUNIT_ASSERT_EQUAL(exp_year, date.getYear()); CPPUNIT_ASSERT_EQUAL(exp_month, date.getMonth()); CPPUNIT_ASSERT_EQUAL(exp_day, date.getDay()); CPPUNIT_ASSERT_EQUAL(exp_dayofweek, date.getDayOfWeek()); // 0 = sunday (what about locales?) CPPUNIT_ASSERT_EQUAL(exp_value, date.getValue()); } void testSimpleSets() { //Date date; //const char aDate[] = "20030106"; //date.setDate(aDate, sizeof(aDate)); //CPPUNIT_ASSERT_EQUAL(long(atoi(aDate)), date.getValue()); // also checks that aDate was not changed (constness) } void testIsValid() { char aDate[9]; strcpy(aDate, "20031306"); // 13th month date.setDate(aDate, sizeof(aDate)); CPPUNIT_ASSERT_EQUAL(bool(false), date.isValid()); } void testGetDate_String() { char dateBuffer[1000]; CPPUNIT_ASSERT_EQUAL(exp_stringdate, string(date.getDate(dateBuffer))); } void testGetDate_time_t() { CPPUNIT_ASSERT_EQUAL_MESSAGE("time_t Date::getDate()", exp_ctime, date.getDate()); } void testGeteDate_struct_tm() { //tm dtBuffer; //CPPUNIT_ASSERT_EQUAL_MESSAGE("time_t does not match", exp_ctime, date.getDate(&dtBuffer)); //CPPUNIT_ASSERT_MESSAGE("tm structs do not match", memcmp(&exp_dt, &dtBuffer, sizeof(exp_dt)) == 0); } void testOperations() { Date aDate = date; Date theNextDay(2003, 1, 7); //Date badDate(2003, 2, 30); CPPUNIT_ASSERT_MESSAGE("Operator ==", aDate == date); ++aDate; CPPUNIT_ASSERT_MESSAGE("Operator ++ (prefix)", aDate == theNextDay); CPPUNIT_ASSERT_MESSAGE("Operator !=", aDate != date); CPPUNIT_ASSERT_MESSAGE("Operator <", date < aDate); CPPUNIT_ASSERT_MESSAGE("Operator <=", date <= aDate); CPPUNIT_ASSERT_MESSAGE("Operator <=", date <= date); CPPUNIT_ASSERT_MESSAGE("Operator >", aDate > date); CPPUNIT_ASSERT_MESSAGE("Operator >=", aDate >= date); CPPUNIT_ASSERT_MESSAGE("Operator >=", date >= date); --aDate; CPPUNIT_ASSERT_MESSAGE("Operator -- (prefix)", aDate == date); aDate += 1; CPPUNIT_ASSERT_MESSAGE("Operator +=", aDate == theNextDay); aDate -= 1; CPPUNIT_ASSERT_MESSAGE("Operator -= ", aDate == date); CPPUNIT_ASSERT_MESSAGE("Operator !", !aDate == false); // FIXME can't get these to work??? //std::cout << theNextDay - long(1) << std::endl; //CPPUNIT_ASSERT_MESSAGE("", theNextDay - date == 1); //CPPUNIT_ASSERT_MESSAGE("", date + 1 == theNextDay); //CPPUNIT_ASSERT_MESSAGE("", theNextDay - 1 == date); //FIXME add leap year checks } }; commoncpp2-1.8.1/tests/dotests.sh0000755000175000017500000000032611463314535013713 00000000000000#!/bin/sh # execute all test to make a single output for t in bug1 bug2 thread1 digest tcpstr1 url1; do echo $t test... echo $t test... 1>&2 ./$t if [ $? != 0 ]; then echo Exit with error from $t fi done commoncpp2-1.8.1/tests/Test_TCPStream.h0000644000175000017500000000564111463314535014646 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include //#include //#include // includes Date #include #include #include using namespace ost; using std::string; /** * Test Fixture to excercise the Common C++ urlstring functions * * @author Chad C. Yates */ class TCPStreamTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TCPStreamTest); CPPUNIT_TEST(testIsPending); CPPUNIT_TEST_SUITE_END(); protected: public: void setUp() { } void testIsPending() { /* FIXME hanging after recent changes to isPending? try { // Just connect to a port that won't send data -- doesn't matter what ost::TCPStream foo(ost::IPV4Host("10.0.0.5"),5800,512,true,100); for(unsigned int i = 0; i < 5 ; i++) { while( foo.isPending(ost::Socket::pendingInput,100)); } CPPUNIT_ASSERT(true); } catch( ost::Socket* s ) { CPPUNIT_ASSERT_MESSAGE("Socket error", true); } */ } }; commoncpp2-1.8.1/tests/Test_TCPStream.cpp0000644000175000017500000000405111463314535015173 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include "Test_TCPStream.h" CPPUNIT_TEST_SUITE_REGISTRATION(TCPStreamTest); commoncpp2-1.8.1/tests/Test_Digest.h0000644000175000017500000002620311463314535014260 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include using namespace ost; /** * Template class that provides common tests and data to excercise * the digest classes. Provides common messages to run through the digests. * Sub-classes of this Fixture provide what tests to run and what the expected * digest strings are, as well as any other tests that are specific to that digest * type. see the pre-defined subclasses for examples * * @author Chad C. Yates */ template class GenericDigestTests : public CppUnit::TestFixture { private: enum {BINARY_DATA1_SIZE = 256}; // constant trick unsigned char binaryData1[BINARY_DATA1_SIZE]; protected: DigestTypeClass digest; std::stringstream digestOutput; GenericDigestTests() { // generate some binary data for(unsigned int i = 0; i< BINARY_DATA1_SIZE; ++i) binaryData1[i] = i % 256; // repeating pattern of ascending bytes // output it to a file in case it needs to be checked against an external program std::ofstream file("BinaryData1.dat", std::ios::out|std::ios::binary); file.write((char *) binaryData1, sizeof(binaryData1)); file.close(); } virtual ~GenericDigestTests() {} std::string getEmptyMsg() { return ""; } std::string getMsg1() { return "pippo"; } std::string getLongMsg1() { return "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah " "blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah"; } unsigned char* getBinaryData1() { return binaryData1; } // These define the textual digests that should be the result of processing // the corresponding message/data and exporting to a stream virtual std::string getEmptyMsg_Digest() { return ""; } virtual std::string getMsg1_Digest() { return ""; } virtual std::string getLongMsg1_Digest() { return ""; } virtual std::string getBinaryData1_Digest() { return ""; } public: /** * Test case for Digest * * @author Chad C. Yates */ void testTypicalUsage(); /** * Test case for Digest * * @author Chad C. Yates */ void testConstruction(); /** * Test case for Digest * * @author Chad C. Yates */ void testEmptyData(); /** * Test case for Digest * * @author Chad C. Yates */ void testSmallMessage(); /** * Test case for Digest * * @author Chad C. Yates */ void testLargeMessage(); /** * Test case for Digest * * @author Chad C. Yates */ void testBinaryData(); /** * Test case for Digest * * @author Chad C. Yates */ void testReInitialization(); /** * Test case for Digest * attempts to excercise the putDigest method by giving it a long string a piece at a time. * * @author Chad C. Yates */ void testPiecewise(); }; /** * Subclass of the generic digest tests that specifies the expected digest * strings and tests to run for the Checksum digest class. */ class ChecksumDigestTest : public GenericDigestTests { CPPUNIT_TEST_SUITE(ChecksumDigestTest); CPPUNIT_TEST(testTypicalUsage); CPPUNIT_TEST(testConstruction); CPPUNIT_TEST(testEmptyData); CPPUNIT_TEST(testSmallMessage); CPPUNIT_TEST(testLargeMessage); CPPUNIT_TEST(testBinaryData); CPPUNIT_TEST(testReInitialization); CPPUNIT_TEST(testPiecewise); CPPUNIT_TEST_SUITE_END(); public: std::string getEmptyMsg_Digest() { return "00"; } std::string getMsg1_Digest() { return "28"; } std::string getLongMsg1_Digest() { return "29"; } std::string getBinaryData1_Digest() { return "80"; } }; /** * Subclass of the generic digest tests that specifies the expected digest * strings and tests to run for the CRC16 digest class. */ class CRC16DigestTest : public GenericDigestTests { CPPUNIT_TEST_SUITE(CRC16DigestTest); CPPUNIT_TEST(testTypicalUsage); CPPUNIT_TEST(testConstruction); CPPUNIT_TEST(testEmptyData); CPPUNIT_TEST(testSmallMessage); CPPUNIT_TEST(testLargeMessage); CPPUNIT_TEST(testBinaryData); CPPUNIT_TEST(testReInitialization); CPPUNIT_TEST(testPiecewise); CPPUNIT_TEST_SUITE_END(); public: std::string getEmptyMsg_Digest() { return "0000"; } std::string getMsg1_Digest() { return "fa3b"; } std::string getLongMsg1_Digest() { return "54cf"; } std::string getBinaryData1_Digest() { return "7e55"; } }; /** * Subclass of the generic digest tests that specifies the expected digest * strings and tests to run for the CRC32 digest class. */ class CRC32DigestTest : public GenericDigestTests { CPPUNIT_TEST_SUITE(CRC32DigestTest); CPPUNIT_TEST(testTypicalUsage); CPPUNIT_TEST(testConstruction); CPPUNIT_TEST(testEmptyData); CPPUNIT_TEST(testSmallMessage); CPPUNIT_TEST(testLargeMessage); CPPUNIT_TEST(testBinaryData); CPPUNIT_TEST(testReInitialization); CPPUNIT_TEST(testPiecewise); CPPUNIT_TEST_SUITE_END(); public: virtual std::string getEmptyMsg_Digest() { return "00000000"; } virtual std::string getMsg1_Digest() { return "df1dc234"; } virtual std::string getLongMsg1_Digest() { return "2d69085d"; } virtual std::string getBinaryData1_Digest() { return "29058c73"; } }; /** * Subclass of the generic digest tests that specifies the expected digest * strings and tests to run for the MD5 digest class. */ class MD5DigestTest : public GenericDigestTests { CPPUNIT_TEST_SUITE(MD5DigestTest); CPPUNIT_TEST(testTypicalUsage); CPPUNIT_TEST(testConstruction); CPPUNIT_TEST(testEmptyData); CPPUNIT_TEST(testSmallMessage); CPPUNIT_TEST(testLargeMessage); CPPUNIT_TEST(testBinaryData); CPPUNIT_TEST(testReInitialization); CPPUNIT_TEST(testPiecewise); CPPUNIT_TEST_SUITE_END(); public: virtual std::string getEmptyMsg_Digest() { return "d41d8cd9" "8f00b204" "e9800998" "ecf8427e"; } virtual std::string getMsg1_Digest() { return "0c88028b" "f3aa6a6a" "143ed846" "f2be1ea4"; } virtual std::string getLongMsg1_Digest() { return "7588d0eb" "c99997f3" "a4284b11" "6ac117b5"; } virtual std::string getBinaryData1_Digest() { return "e2c865db" "4162bed9" "63bfaa9e" "f6ac18f0"; } }; /** * Subclass of the generic digest tests that specifies the expected digest * strings and tests to run for the SHA1 digest class. */ class SHA1DigestTest : public GenericDigestTests { CPPUNIT_TEST_SUITE(SHA1DigestTest); //CPPUNIT_TEST(testTypicalUsage); //CPPUNIT_TEST(testConstruction); //CPPUNIT_TEST(testEmptyData); //CPPUNIT_TEST(testSmallMessage); //CPPUNIT_TEST(testLargeMessage); //CPPUNIT_TEST(testBinaryData); //CPPUNIT_TEST(testReInitialization); //CPPUNIT_TEST(testPiecewise); CPPUNIT_TEST_SUITE_END(); public: virtual std::string getEmptyMsg_Digest() { return ""; } virtual std::string getMsg1_Digest() { return "d012f681" "44ed0f12" "1d3cc330" "a17eec52" "8c2e7d59"; } virtual std::string getLongMsg1_Digest() { return "c2cce34c" "96d1ab91" "ce5cb15d" "7542a37a" "a7c57fae"; } virtual std::string getBinaryData1_Digest() { return "4916d6bd" "b7f78e68" "03698cab" "32d1586e" "a457dfc8"; } }; /** * Subclass of the generic digest tests that specifies the expected digest * strings and tests to run for the SHA256 digest class. */ class SHA256DigestTest : public GenericDigestTests { CPPUNIT_TEST_SUITE(SHA256DigestTest); //CPPUNIT_TEST(testTypicalUsage); //CPPUNIT_TEST(testConstruction); //CPPUNIT_TEST(testEmptyData); //CPPUNIT_TEST(testSmallMessage); //CPPUNIT_TEST(testLargeMessage); //CPPUNIT_TEST(testBinaryData); //CPPUNIT_TEST(testReInitialization); //CPPUNIT_TEST(testPiecewise); CPPUNIT_TEST_SUITE_END(); public: virtual std::string getEmptyMsg_Digest() { return ""; } virtual std::string getMsg1_Digest() { return "a2242ead" "55c94c3d" "eb7cf234" "0bfef9d5" "bcaca22d" "fe66e646" "745ee437" "1c633fc8"; } virtual std::string getLongMsg1_Digest() { return "24703531" "a4557f53" "d6da5faa" "c96566e4" "d8b1b8ec" "9655757f" "53778d62" "63257943"; } virtual std::string getBinaryData1_Digest() { return "40aff2e9" "d2d8922e" "47afd464" "8e696749" "7158785f" "bd1da870" "e7110266" "bf944880"; } }; commoncpp2-1.8.1/tests/test.sh0000755000175000017500000000040011463314535013176 00000000000000#!/bin/sh echo Executing all tests... please wait... sh dotests.sh > testout.txt if cmp testout.txt output.txt; then echo Test successfully else echo 'Test failed :(' echo 'Compare testout.txt (wrong) and output.txt (correct) for more information' fi commoncpp2-1.8.1/tests/Test_SHATumbler.h0000644000175000017500000000066011463314535015006 00000000000000// can't get this to work because the SHATumbler is not accessable from the dll #include #include #include #include using namespace ost; class SHATumblerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(SHATumblerTest); CPPUNIT_TEST(test); CPPUNIT_TEST_SUITE_END(); protected: public: void test() { SHATumbler tumbler(1); } }; commoncpp2-1.8.1/tests/Test_URLString.h0000644000175000017500000002270111463314535014671 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include using namespace ost; using std::string; /** * Test Fixture to excercise the Common C++ urlstring functions * * @author Chad C. Yates */ class URLStringTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(URLStringTest); CPPUNIT_TEST(testBinaryBase64EncodeDecode); CPPUNIT_TEST(testStringVersion); CPPUNIT_TEST(testTypicalUrlEncodeDecode); CPPUNIT_TEST(testTypicalTextBase64EncodeDecode); CPPUNIT_TEST(testSimpleTextBase64EncodeDecode); CPPUNIT_TEST(testComplexTextBase64EncodeDecode); CPPUNIT_TEST(testPaddingPerfect); CPPUNIT_TEST(testPadding1Short); CPPUNIT_TEST(testPadding2Short); CPPUNIT_TEST_SUITE_END(); private: /* static const char inputChars1[] = "`1234567890-=\\QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./~!@#$%^&*()_+|qwertyuiop{}asdfghjkl:\"zxcvbnm<>?"; static const expectedOutputChars1[1000] = "YDEyMzQ1Njc4OTAtPVxRV0VSVFlVSU9QW11BU0RGR0hKS0w7J1pYQ1ZCTk0sLi9+IUAjJCVeJiooKV8rfHF3ZXJ0eXVpb3B7fWFzZGZnaGprbDoienhjdmJubTw+Pw=="; static const char inputChars2[] = "This is a test."; static const char expectedOutputChars2[1000] = "VGhpcyBpcyBhIHRlc3Qu"; */ char actualEncodedChars[1000]; // should be enough for the tests char actualDecodedChars[1000]; // should be enough for the tests public: void testTypicalUrlEncodeDecode() { char inputChars[] = "`1234567890-=\\QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./~!@#$%^&*()_+|qwertyuiop{}asdfghjkl:\"zxcvbnm<>?"; char expectedOutputChars[] = "%601234567890-%3d%5cQWERTYUIOP%5b%5dASDFGHJKL;%27ZXCVBNM,./%7e%21%40%23%24%25%5e%26%2a%28%29%5f%2b%7cqwertyuiop%7b%7dasdfghjkl:%22zxcvbnm%3c%3e%3f"; urlEncode(inputChars, actualEncodedChars, sizeof(actualEncodedChars)); CPPUNIT_ASSERT_EQUAL_MESSAGE("String to url encode was: '" + string(inputChars) + string("'"), string(expectedOutputChars), string(actualEncodedChars)); urlDecode(actualEncodedChars, actualDecodedChars); CPPUNIT_ASSERT_EQUAL_MESSAGE("String to url decode was: '" + string(actualEncodedChars) + string("'"), string(inputChars), string(actualDecodedChars)); } void testBinaryBase64EncodeDecode() { unsigned char binaryData[256]; char encodedBinaryData[sizeof(binaryData)*4]; unsigned char decodedBinaryData[sizeof(binaryData)]; unsigned int i; for(i = 0; i < sizeof(binaryData); ++i) binaryData[i] = i; b64Encode(binaryData, sizeof(binaryData), encodedBinaryData, sizeof(encodedBinaryData)); b64Decode(encodedBinaryData, decodedBinaryData, sizeof(decodedBinaryData)); for(i = 0; i < sizeof(binaryData); ++i) if(binaryData[i] != decodedBinaryData[i]) { CPPUNIT_ASSERT_EQUAL(binaryData[i], decodedBinaryData[i]); break; } CPPUNIT_ASSERT(true); } void testStringVersion() { CPPUNIT_ASSERT_EQUAL(String("VGhpcyBpcyBhIHRlc3Qu"), b64Encode(String("This is a test."))); CPPUNIT_ASSERT_EQUAL(String("This is a test."), b64Decode(String("VGhpcyBpcyBhIHRlc3Qu"))); } void testTypicalTextBase64EncodeDecode() { char inputChars[] = "`1234567890-=\\QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./~!@#$%^&*()_+|qwertyuiop{}asdfghjkl:\"zxcvbnm<>?"; char expectedOutputChars[1000] = "YDEyMzQ1Njc4OTAtPVxRV0VSVFlVSU9QW11BU0RGR0hKS0w7J1pYQ1ZCTk0sLi9+IUAjJCVeJiooKV8rfHF3ZXJ0eXVpb3B7fWFzZGZnaGprbDoienhjdmJubTw+Pw=="; b64Encode(inputChars, actualEncodedChars, sizeof(actualEncodedChars)); CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 encode was: '" + string(inputChars) + string("'"), string(expectedOutputChars), string(actualEncodedChars)); b64Decode(actualEncodedChars, actualDecodedChars); CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 decode was: '" + string(actualEncodedChars) + string("'"), string(inputChars), string(actualDecodedChars)); } void testSimpleTextBase64EncodeDecode() { const char inputChars[] = "This is a test."; const char expectedOutputChars[1000] = "VGhpcyBpcyBhIHRlc3Qu"; b64Encode((const unsigned char *)inputChars, strlen(inputChars), actualEncodedChars, sizeof(actualEncodedChars)); CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 encode was: '" + string(inputChars) + string("'"), string(expectedOutputChars), string(actualEncodedChars)); int size = b64Decode(actualEncodedChars, (unsigned char *)actualDecodedChars, sizeof(actualDecodedChars)); actualDecodedChars[size] = '\0'; CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 decode was: '" + string(actualEncodedChars) + string("'"), string(inputChars), string(actualDecodedChars)); } void testPaddingPerfect() { const char inputChars[] = "aaabbb123"; b64Encode((const unsigned char *)inputChars, strlen(inputChars), actualEncodedChars, sizeof(actualEncodedChars)); int size = b64Decode(actualEncodedChars, (unsigned char *)actualDecodedChars, sizeof(actualDecodedChars)); actualDecodedChars[size] = '\0'; CPPUNIT_ASSERT_EQUAL_MESSAGE( "String to base64 decode was: '" + string(actualEncodedChars) + string("' ") + "", string(inputChars), // expected string(actualDecodedChars)); // actual } void testPadding1Short() { const char inputChars[] = "aaabbb12"; b64Encode((const unsigned char *)inputChars, strlen(inputChars), actualEncodedChars, sizeof(actualEncodedChars)); int size = b64Decode(actualEncodedChars, (unsigned char *)actualDecodedChars, sizeof(actualDecodedChars)); actualDecodedChars[size] = '\0'; CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 decode was: '" + string(actualEncodedChars) + string("'"), string(inputChars), string(actualDecodedChars)); } void testPadding2Short() { const char inputChars[] = "aaabbb1"; b64Encode((const unsigned char *)inputChars, strlen(inputChars), actualEncodedChars, sizeof(actualEncodedChars)); int size = b64Decode(actualEncodedChars, (unsigned char *)actualDecodedChars, sizeof(actualDecodedChars)); actualDecodedChars[size] = '\0'; CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 decode was: '" + string(actualEncodedChars) + string("'"), string(inputChars), string(actualDecodedChars)); } void testComplexTextBase64EncodeDecode() { const char inputChars[] = "This module provides functions to encode and decode\n" "strings into the Base64 encoding specified in RFC 2045 -\n" "MIME (Multipurpose Internet Mail Extensions). The Base64\n" "encoding is designed to represent arbitrary sequences of\n" "octets in a form that need not be humanly readable. A\n" "65-character subset ([A-Za-z0-9+/=]) of US-ASCII is used,\n" "enabling 6 bits to be represented per printable character."; const char expectedOutputChars[1000] = "VGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGVuY29kZSBhbmQgZGVjb2RlCnN0cmlu" "Z3MgaW50byB0aGUgQmFzZTY0IGVuY29kaW5nIHNwZWNpZmllZCBpbiBSRkMgMjA0NSAtCk1JTUUg" "KE11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbnMpLiBUaGUgQmFzZTY0CmVuY29k" "aW5nIGlzIGRlc2lnbmVkIHRvIHJlcHJlc2VudCBhcmJpdHJhcnkgc2VxdWVuY2VzIG9mCm9jdGV0" "cyBpbiBhIGZvcm0gdGhhdCBuZWVkIG5vdCBiZSBodW1hbmx5IHJlYWRhYmxlLiBBCjY1LWNoYXJh" "Y3RlciBzdWJzZXQgKFtBLVphLXowLTkrLz1dKSBvZiBVUy1BU0NJSSBpcyB1c2VkLAplbmFibGlu" "ZyA2IGJpdHMgdG8gYmUgcmVwcmVzZW50ZWQgcGVyIHByaW50YWJsZSBjaGFyYWN0ZXIu"; b64Encode((const unsigned char *)inputChars, strlen(inputChars), actualEncodedChars, sizeof(actualEncodedChars)); CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 encode was: '" + string(inputChars) + string("'"), string(expectedOutputChars), string(actualEncodedChars)); int size = b64Decode(actualEncodedChars, (unsigned char *)actualDecodedChars, sizeof(actualDecodedChars)); actualDecodedChars[size] = '\0'; CPPUNIT_ASSERT_EQUAL_MESSAGE("String to base64 decode was: '" + string(actualEncodedChars) + string("'"), string(inputChars), string(actualDecodedChars)); } }; commoncpp2-1.8.1/tests/Makefile.am0000644000175000017500000000343211463314535013724 00000000000000# Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = README dotests.sh test.sh output.txt vc6.mak Makefile.bcc AM_CXXFLAGS = $(THREAD_FLAGS) @WARN_FLAGS@ INCLUDES = -I$(top_srcdir)/inc LDADD = ../src/libccgnu2.la $(THREAD_LIBS) $(DYN_LOADER) Z_LIBS = -lz if WITH_CPPUNIT_TESTS TEST_SUITE = ccxx_tests else TEST_SUITE = endif noinst_PROGRAMS = $(TEST_SUITE) \ bug1 bug2 thread1 thread2 thread3 digest tcpstr1 url1 forever noinst_HEADERS = SampleObject.h SampleSubObject.h Test_Date.h Test_Digest.h \ Test_Engine.h Test_SHATumbler.h Test_TCPStream.h Test_URLString.h if WITH_CPPUNIT_TESTS ccxx_tests_SOURCES = ccxx_tests.cpp SampleObject.cpp SampleSubObject.cpp \ Test_Date.cpp Test_Engine.cpp Test_TCPStream.cpp Test_URLString.cpp # Test_Digest.cpp ccxx_tests_LDADD = ../src/libccext2.la $(XML_LIBS) $(Z_LIBS) $(LDADD) \ $(SSL_LIBS) $(CPPUNIT_LIBS) endif bug1_SOURCES = bug1.cpp bug2_SOURCES = bug2.cpp forever_SOURCES = forever.cpp digest_SOURCES = digest.cpp digest_LDADD = ../src/libccext2.la $(XML_LIBS) $(Z_LIBS) $(SSL_LIBS) $(LDADD) thread1_SOURCES = thread1.cpp thread2_SOURCES = thread2.cpp thread3_SOURCES = thread3.cpp tcpstr1_SOURCES = tcpstr1.cpp url1_SOURCES = url1.cpp url1_LDADD = ../src/libccext2.la $(XML_LIBS) $(Z_LIBS) $(SSL_LIBS) $(LDADD) commoncpp2-1.8.1/tests/README0000644000175000017500000000016411463314535012547 00000000000000Directory for hold automatic regression tests After compiling launch test.sh for exec all automatic test together commoncpp2-1.8.1/tests/Makefile.in0000644000175000017500000005542311463364513013745 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@ # Copyright (C) 1999-2005 Open Source Telecom Corporation. # Copyright (C) 2006-2008 David Sugar, Tycho Softworks. # # This file is free software; as a special exception the author 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. 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@ target_triplet = @target@ noinst_PROGRAMS = $(am__EXEEXT_1) bug1$(EXEEXT) bug2$(EXEEXT) \ thread1$(EXEEXT) thread2$(EXEEXT) thread3$(EXEEXT) \ digest$(EXEEXT) tcpstr1$(EXEEXT) url1$(EXEEXT) \ forever$(EXEEXT) subdir = tests DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/ost_cxx.m4 $(top_srcdir)/m4/ost_debug.m4 \ $(top_srcdir)/m4/ost_dynamic.m4 $(top_srcdir)/m4/ost_endian.m4 \ $(top_srcdir)/m4/ost_getopt.m4 $(top_srcdir)/m4/ost_maint.m4 \ $(top_srcdir)/m4/ost_misc.m4 $(top_srcdir)/m4/ost_poll.m4 \ $(top_srcdir)/m4/ost_posix.m4 $(top_srcdir)/m4/ost_prog.m4 \ $(top_srcdir)/m4/ost_pthread.m4 \ $(top_srcdir)/m4/ost_reentrant.m4 \ $(top_srcdir)/m4/ost_signal.m4 $(top_srcdir)/m4/ost_socket.m4 \ $(top_srcdir)/m4/ost_ssl.m4 $(top_srcdir)/m4/ost_stlport.m4 \ $(top_srcdir)/m4/ost_string.m4 $(top_srcdir)/m4/ost_systime.m4 \ $(top_srcdir)/m4/ost_types.m4 $(top_srcdir)/m4/ost_win32.m4 \ $(top_srcdir)/m4/win32msc.m4 $(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 = @WITH_CPPUNIT_TESTS_TRUE@am__EXEEXT_1 = ccxx_tests$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_bug1_OBJECTS = bug1.$(OBJEXT) bug1_OBJECTS = $(am_bug1_OBJECTS) bug1_LDADD = $(LDADD) am__DEPENDENCIES_1 = bug1_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_bug2_OBJECTS = bug2.$(OBJEXT) bug2_OBJECTS = $(am_bug2_OBJECTS) bug2_LDADD = $(LDADD) bug2_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__ccxx_tests_SOURCES_DIST = ccxx_tests.cpp SampleObject.cpp \ SampleSubObject.cpp Test_Date.cpp Test_Engine.cpp \ Test_TCPStream.cpp Test_URLString.cpp @WITH_CPPUNIT_TESTS_TRUE@am_ccxx_tests_OBJECTS = ccxx_tests.$(OBJEXT) \ @WITH_CPPUNIT_TESTS_TRUE@ SampleObject.$(OBJEXT) \ @WITH_CPPUNIT_TESTS_TRUE@ SampleSubObject.$(OBJEXT) \ @WITH_CPPUNIT_TESTS_TRUE@ Test_Date.$(OBJEXT) \ @WITH_CPPUNIT_TESTS_TRUE@ Test_Engine.$(OBJEXT) \ @WITH_CPPUNIT_TESTS_TRUE@ Test_TCPStream.$(OBJEXT) \ @WITH_CPPUNIT_TESTS_TRUE@ Test_URLString.$(OBJEXT) ccxx_tests_OBJECTS = $(am_ccxx_tests_OBJECTS) am__DEPENDENCIES_2 = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) @WITH_CPPUNIT_TESTS_TRUE@ccxx_tests_DEPENDENCIES = \ @WITH_CPPUNIT_TESTS_TRUE@ ../src/libccext2.la \ @WITH_CPPUNIT_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_CPPUNIT_TESTS_TRUE@ $(am__DEPENDENCIES_2) \ @WITH_CPPUNIT_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @WITH_CPPUNIT_TESTS_TRUE@ $(am__DEPENDENCIES_1) am_digest_OBJECTS = digest.$(OBJEXT) digest_OBJECTS = $(am_digest_OBJECTS) digest_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) am_forever_OBJECTS = forever.$(OBJEXT) forever_OBJECTS = $(am_forever_OBJECTS) forever_LDADD = $(LDADD) forever_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_tcpstr1_OBJECTS = tcpstr1.$(OBJEXT) tcpstr1_OBJECTS = $(am_tcpstr1_OBJECTS) tcpstr1_LDADD = $(LDADD) tcpstr1_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_thread1_OBJECTS = thread1.$(OBJEXT) thread1_OBJECTS = $(am_thread1_OBJECTS) thread1_LDADD = $(LDADD) thread1_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_thread2_OBJECTS = thread2.$(OBJEXT) thread2_OBJECTS = $(am_thread2_OBJECTS) thread2_LDADD = $(LDADD) thread2_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_thread3_OBJECTS = thread3.$(OBJEXT) thread3_OBJECTS = $(am_thread3_OBJECTS) thread3_LDADD = $(LDADD) thread3_DEPENDENCIES = ../src/libccgnu2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_url1_OBJECTS = url1.$(OBJEXT) url1_OBJECTS = $(am_url1_OBJECTS) url1_DEPENDENCIES = ../src/libccext2.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/autoconf/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 = $(bug1_SOURCES) $(bug2_SOURCES) $(ccxx_tests_SOURCES) \ $(digest_SOURCES) $(forever_SOURCES) $(tcpstr1_SOURCES) \ $(thread1_SOURCES) $(thread2_SOURCES) $(thread3_SOURCES) \ $(url1_SOURCES) DIST_SOURCES = $(bug1_SOURCES) $(bug2_SOURCES) \ $(am__ccxx_tests_SOURCES_DIST) $(digest_SOURCES) \ $(forever_SOURCES) $(tcpstr1_SOURCES) $(thread1_SOURCES) \ $(thread2_SOURCES) $(thread3_SOURCES) $(url1_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_LIB = @BASE_LIB@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCXX_DIR = @CCXX_DIR@ CFLAGS = @CFLAGS@ COMMON_FLAGS = @COMMON_FLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CPPUNIT_LIBS = @CPPUNIT_LIBS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DYN_LOADER = @DYN_LOADER@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FTPDIR = @FTPDIR@ GETOPT_LIBS = @GETOPT_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KDOC_DIR = @KDOC_DIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGETOPTOBJS = @LIBGETOPTOBJS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_MAJOR = @LIB_MAJOR@ LIB_VERSION = @LIB_VERSION@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_CCXX_VERSION = @LT_CCXX_VERSION@ LT_MAJOR = @LT_MAJOR@ LT_MINOR = @LT_MINOR@ LT_RELEASE = @LT_RELEASE@ LT_SUBVER = @LT_SUBVER@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MODULE_FLAGS = @MODULE_FLAGS@ 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@ PTHREAD_CC = @PTHREAD_CC@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_FLAGS = @SHARED_FLAGS@ SHELL = @SHELL@ SOCKET_LIBS = @SOCKET_LIBS@ SSL_LIBS = @SSL_LIBS@ STAGE2 = @STAGE2@ STRIP = @STRIP@ THREAD_FLAGS = @THREAD_FLAGS@ THREAD_LIBS = @THREAD_LIBS@ VERSION = @VERSION@ WARN_FLAGS = @WARN_FLAGS@ WINVERSION = @WINVERSION@ ZSTREAM_LIBS = @ZSTREAM_LIBS@ 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@ ccincludedir = @ccincludedir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ etc_confdir = @etc_confdir@ 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@ incprefix = @incprefix@ 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@ ost_cv_dynloader = @ost_cv_dynloader@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ thrprefix = @thrprefix@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in Makefile EXTRA_DIST = README dotests.sh test.sh output.txt vc6.mak Makefile.bcc AM_CXXFLAGS = $(THREAD_FLAGS) @WARN_FLAGS@ INCLUDES = -I$(top_srcdir)/inc LDADD = ../src/libccgnu2.la $(THREAD_LIBS) $(DYN_LOADER) Z_LIBS = -lz @WITH_CPPUNIT_TESTS_FALSE@TEST_SUITE = @WITH_CPPUNIT_TESTS_TRUE@TEST_SUITE = ccxx_tests noinst_HEADERS = SampleObject.h SampleSubObject.h Test_Date.h Test_Digest.h \ Test_Engine.h Test_SHATumbler.h Test_TCPStream.h Test_URLString.h @WITH_CPPUNIT_TESTS_TRUE@ccxx_tests_SOURCES = ccxx_tests.cpp SampleObject.cpp SampleSubObject.cpp \ @WITH_CPPUNIT_TESTS_TRUE@ Test_Date.cpp Test_Engine.cpp Test_TCPStream.cpp Test_URLString.cpp # Test_Digest.cpp @WITH_CPPUNIT_TESTS_TRUE@ccxx_tests_LDADD = ../src/libccext2.la $(XML_LIBS) $(Z_LIBS) $(LDADD) \ @WITH_CPPUNIT_TESTS_TRUE@ $(SSL_LIBS) $(CPPUNIT_LIBS) bug1_SOURCES = bug1.cpp bug2_SOURCES = bug2.cpp forever_SOURCES = forever.cpp digest_SOURCES = digest.cpp digest_LDADD = ../src/libccext2.la $(XML_LIBS) $(Z_LIBS) $(SSL_LIBS) $(LDADD) thread1_SOURCES = thread1.cpp thread2_SOURCES = thread2.cpp thread3_SOURCES = thread3.cpp tcpstr1_SOURCES = tcpstr1.cpp url1_SOURCES = url1.cpp url1_LDADD = ../src/libccext2.la $(XML_LIBS) $(Z_LIBS) $(SSL_LIBS) $(LDADD) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(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 bug1$(EXEEXT): $(bug1_OBJECTS) $(bug1_DEPENDENCIES) @rm -f bug1$(EXEEXT) $(CXXLINK) $(bug1_OBJECTS) $(bug1_LDADD) $(LIBS) bug2$(EXEEXT): $(bug2_OBJECTS) $(bug2_DEPENDENCIES) @rm -f bug2$(EXEEXT) $(CXXLINK) $(bug2_OBJECTS) $(bug2_LDADD) $(LIBS) ccxx_tests$(EXEEXT): $(ccxx_tests_OBJECTS) $(ccxx_tests_DEPENDENCIES) @rm -f ccxx_tests$(EXEEXT) $(CXXLINK) $(ccxx_tests_OBJECTS) $(ccxx_tests_LDADD) $(LIBS) digest$(EXEEXT): $(digest_OBJECTS) $(digest_DEPENDENCIES) @rm -f digest$(EXEEXT) $(CXXLINK) $(digest_OBJECTS) $(digest_LDADD) $(LIBS) forever$(EXEEXT): $(forever_OBJECTS) $(forever_DEPENDENCIES) @rm -f forever$(EXEEXT) $(CXXLINK) $(forever_OBJECTS) $(forever_LDADD) $(LIBS) tcpstr1$(EXEEXT): $(tcpstr1_OBJECTS) $(tcpstr1_DEPENDENCIES) @rm -f tcpstr1$(EXEEXT) $(CXXLINK) $(tcpstr1_OBJECTS) $(tcpstr1_LDADD) $(LIBS) thread1$(EXEEXT): $(thread1_OBJECTS) $(thread1_DEPENDENCIES) @rm -f thread1$(EXEEXT) $(CXXLINK) $(thread1_OBJECTS) $(thread1_LDADD) $(LIBS) thread2$(EXEEXT): $(thread2_OBJECTS) $(thread2_DEPENDENCIES) @rm -f thread2$(EXEEXT) $(CXXLINK) $(thread2_OBJECTS) $(thread2_LDADD) $(LIBS) thread3$(EXEEXT): $(thread3_OBJECTS) $(thread3_DEPENDENCIES) @rm -f thread3$(EXEEXT) $(CXXLINK) $(thread3_OBJECTS) $(thread3_LDADD) $(LIBS) url1$(EXEEXT): $(url1_OBJECTS) $(url1_DEPENDENCIES) @rm -f url1$(EXEEXT) $(CXXLINK) $(url1_OBJECTS) $(url1_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleObject.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SampleSubObject.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_Date.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_Engine.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_TCPStream.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Test_URLString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bug1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bug2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccxx_tests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forever.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcpstr1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url1.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) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -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." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) 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 # 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: commoncpp2-1.8.1/tests/Test_URLString.cpp0000644000175000017500000000405111463314535015222 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include "Test_URLString.h" CPPUNIT_TEST_SUITE_REGISTRATION(URLStringTest); commoncpp2-1.8.1/tests/bug1.cpp0000644000175000017500000000520311463314535013230 00000000000000// Copyright (C) 1999-2005 Open Source Telecom Corporation. // Copyright (C) 2006-2008 David Sugar, Tycho Softworks. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of APE. // // The exception is that, if you link the APE library with other files // to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the APE library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name APE. If you copy code from other releases into a copy of // APE, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for APE, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include // This was a test case for a bug report related to the final self- // deleting the thread. #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class ThreadTest : public Thread { private: void run() { cout << "Run()..." << endl;}; void final() { cout << "Final()..." << endl;}; }; int main() { ThreadTest *thread = new ThreadTest; cout << "before start()..." << endl; // printf("THREAD is %p\n", thread); not useful in reg test thread->start(); Thread::sleep(5000); cout << "exiting..." << endl; // do not delete thread, already deleted in method Final return 0; } commoncpp2-1.8.1/tests/tcpstr1.cpp0000644000175000017500000000124511463314535013774 00000000000000#include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif class ThreadOut: public Thread { public: ThreadOut() { start(); } void run() { TCPStream tcp("127.0.0.1:9000"); tcp << "pippo" << endl; tcp.disconnect(); } }; int main(int argc, char *argv[]) { char line[200]; InetAddress addr = "127.0.0.1"; TCPSocket *sock = new TCPSocket(addr, 9000); // write some output automatically ThreadOut thread; while (1){ if (sock->isPendingConnection()){ TCPStream tcp(*sock); tcp.getline(line, 200); cout << line << endl; tcp.disconnect(); return 0; } } return 0; } commoncpp2-1.8.1/tests/forever.cpp0000644000175000017500000000035511463314535014045 00000000000000#include using namespace ost; class Foo : public Thread { void run() { exit(); }; }; int main() { Foo *f = new Foo(); f->start(); // Endless!? why? do { Thread::sleep( 1000 ); } while( f->isRunning() ); } commoncpp2-1.8.1/tests/output.txt0000644000175000017500000000206311463314535013770 00000000000000bug1 test... before start()... Run()... Final()... exiting... bug2 test... thread1 test... *********************************************** * Testing class Thread without syncronization * *********************************************** Testing thread creation - thread should set n to 1...ok Testing thread is working - thread should change n...ok - thread should change n...ok Testing suspend & resume - thread should not change n...ok - thread should not change n...ok - thread should change n...ok - thread should change n...ok Testing recursive suspend & resume - thread should not change n...ok - thread should not change n...ok - thread should not change n...ok - thread should not change n...ok - thread should change n...ok - thread should change n...ok Testing no suspend on resume - thread should change n...ok - thread should change n...ok Testing resuspend - thread should not change n...ok - thread should not change n...ok Now program should finish... :) digest test... 0c88028bf3aa6a6a143ed846f2be1ea4 tcpstr1 test... pippo url1 test... All seem ok commoncpp2-1.8.1/tests/digest.cpp0000644000175000017500000000041511463314535013651 00000000000000#include #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif int main() { ost::MD5Digest digest; digest << "pippo"; std::cout << digest << std::endl;; return 0; } commoncpp2-1.8.1/tests/SampleObject.cpp0000644000175000017500000001074311463314535014747 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include "SampleObject.h" IMPLEMENT_PERSISTENCE(Test,"Test") Test::Test() : iInteger(0), strString("Null"), strString2("Null") { nullPtr = NULL; //uninitializedNullPtr; // to test whether unpersisting a non constructed NULL var works. subObjectPtr = NULL; subObjectPtr2 = subObjectPtr; // points to the same thing as subObjectPtr for testing } Test::Test(Test &ob) { iInteger = ob.iInteger; strString = ob.strString; } bool Test::operator==(const Test &ob) const { return iInteger == ob.iInteger && strString == ob.strString && strString2 == ob.strString2 && numbers == ob.numbers && strings == ob.strings && moreStrings == ob.moreStrings && nullPtr == ob.nullPtr && uninitializedNullPtr == ob.uninitializedNullPtr && *subObjectPtr == *ob.subObjectPtr && *subObjectPtr2 == *ob.subObjectPtr2 && subObjectRef == ob.subObjectRef && subObjects == ob.subObjects; } bool Test::write(Engine& archive) const { archive << iInteger << strString << strString2; archive << numbers; archive << strings; archive << nullPtr; archive << uninitializedNullPtr; archive << subObjectPtr; archive << subObjectPtr2; archive << subObjectRef; archive << moreStrings; archive << subObjects; return true; } bool Test::read(Engine& archive) { archive >> iInteger >> strString >> strString2; archive >> numbers; archive >> strings; archive >> nullPtr; archive >> uninitializedNullPtr; archive >> subObjectPtr; archive >> subObjectPtr2; archive >> subObjectRef; archive >> moreStrings; archive >> subObjects; return true; } void Test::print(const std::string& name) { cout << name << ":\n" << " iInteger: " << iInteger << endl << " strString: '" << strString << "'" << endl << " strString2: '" << strString2 << "'" << endl; cout << " numbers: "; std::copy(numbers.begin(), numbers.end(), std::ostream_iterator(cout, " ")); cout << endl; cout << " strings: "; std::copy(strings.begin(), strings.end(), std::ostream_iterator(cout, " ")); cout << endl; cout << " moreStrings: "; std::copy(moreStrings.begin(), moreStrings.end(), std::ostream_iterator(cout, " ")); cout << endl; subObjectPtr->print("subObjectPtr"); subObjectPtr2->print("subObjectPtr2"); subObjectRef.print("subObjectRef"); cout << "\nsubObjects (deque):\n"; for (std::deque::const_iterator i = subObjects.begin(); i != subObjects.end(); ++i) i->print("element in deque"); cout << endl; cout << "====================================\n\n"; } commoncpp2-1.8.1/tests/thread2.cpp0000644000175000017500000000164411463314535013730 00000000000000#include #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif // Test child thread destroying before father // class Child: public Thread { public: Child() { } void run() { cout << "child start" << endl; Thread::sleep(3000); cout << "child end" << endl; } void final() { // delete this; } }; class Father: public Thread { public: Father() { } void run() { cout << "starting child thread" << endl; Thread *th = new Child(); th->detach(); Thread::sleep(1000); cout << "father end" << endl; } void final() { // delete this; - not used since detached threads self delete // reset memory to test access violation memset(this,0,sizeof(*this)); } }; int main(int argc, char* argv[]) { cout << "starting father thread" << endl; Father *th = new Father(); th->start(); Thread::sleep(10000); return 0; } commoncpp2-1.8.1/tests/Makefile.bcc0000644000175000017500000000333011463314535014053 00000000000000####################################################### # MAKEFILE for building ccgnu test programs # # # # (c) 2004 by Darko Miletic # # e-mail: kiklop@fibertel.com.ar # ####################################################### .autodepend ILINK32=ilink32 #C compile flags CFLAGS=-q -v- -O2 -k- -tWC -tWM -D$(USERDEFINES);$(SYSDEFINES) -I$(INCDIR) -L$(LIBDIR) LINKFLAGS=-q -v- -ap -Gn -c -L$(LIBDIR) .cpp.obj: @$(CC) $(CFLAGS) -I$(INCDIR) /c -o$@ $< .c.obj: @$(CC) $(CFLAGS) -I$(INCDIR) /c -o$@ $< INCDIR=..\w32;..\Include LIBDIR=..\w32\Release SRC=. OBJ=. BIN=. SYSDEFINES= USERDEFINES=_WINVER=0x0400;_WIN32_WINNT=0x0400;STRICT;_MBCS;NODEBUG;WIN32 ################################ # Target ################################ PROJECT=thread1.exe thread2.exe bug1.exe tcpstr1.exe bug2.exe url1.exe OBJFILES=thread1.obj thread2.obj bug1.obj tcpstr1.obj bug2.obj url1.obj RESFILES= LIBFILES=ccgnu2.lib ccext2.lib DEFFILE= BCC32STARTUP=c0x32.obj BCC32RTLIB=cw32mt.lib ALLOBJS=$(BCC32STARTUP) $(OBJFILES) ALLLIBS=$(LIBFILES) import32.lib $(BCC32RTLIB) all: $(OBJFILES) $(PROJECT) cleanobj copy_dll cleanobj:: -@echo Deleting intermediate files for project -@if exist $(OBJ)\*.obj del $(OBJ)\*.obj -@if exist $(BIN)\*.tds del $(BIN)\*.tds -@if exist $(BIN)\*.map del $(BIN)\*.map cleantgt:: -@echo Deleting output files for project -@if exist *.exe del *.exe -@if exist cc*.dll del cc*.dll clean: cleanobj cleantgt dirs:: -@echo Creating output directory -@md $(OBJ) copy_dll: -@copy /V /Y ..\w32\Release\cc*.dll $(BIN)\ .obj.exe: -@$(ILINK32) $(LINKFLAGS) $(BCC32STARTUP) $&.obj,$@,,$(ALLLIBS),$(DEFFILE) commoncpp2-1.8.1/tests/vc6.mak0000755000175000017500000001077411463314535013072 00000000000000# Generated by MSVC, manually edited # !IF "$(CFG)" == "" CFG=Debug !ENDIF !IF "$(CFG)" != "Release" && "$(CFG)" != "Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "vc6.mak" CFG="Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Release" !MESSAGE "Debug" !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF CPP=cl.exe RSC=rc.exe LINK32=link.exe !IF "$(CFG)" == "Release" OUTDIR=.\Release INTDIR=.\Release CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "../win32" /I "../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c LINK32_FLAGS=ccgnu5.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /libpath:"../win32/Release" !ELSEIF "$(CFG)" == "Debug" OUTDIR=.\Debug INTDIR=.\Debug CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "../win32" /I "../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c LINK32_FLAGS=ccgnu5D.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /pdbtype:sept /libpath:"../win32/Debug" !ENDIF ALL : "$(OUTDIR)\bug1.exe" "$(OUTDIR)\bug2.exe" "$(OUTDIR)\tcpstr1.exe" "$(OUTDIR)\thread1.exe" "$(OUTDIR)\url1.exe" RM=@erase CLEAN : -$(RM) "$(INTDIR)\*.obj" -$(RM) "$(INTDIR)\*.idb" -$(RM) "$(INTDIR)\*.pdb" -$(RM) "$(OUTDIR)\bug1.exe" -$(RM) "$(OUTDIR)\bug1.map" -$(RM) "$(OUTDIR)\bug2.exe" -$(RM) "$(OUTDIR)\bug2.map" -$(RM) "$(OUTDIR)\tcpstr1.exe" -$(RM) "$(OUTDIR)\tcpstr1.map" -$(RM) "$(OUTDIR)\thread1.exe" -$(RM) "$(OUTDIR)\thread1.map" -$(RM) "$(OUTDIR)\url1.exe" -$(RM) "$(OUTDIR)\url1.map" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" # Generate programs # PROG=bug1 LINK32_ADD=/pdb:"$(OUTDIR)\$(PROG).pdb" /map:"$(INTDIR)\$(PROG).map" /out:"$(OUTDIR)\$(PROG).exe" LINK32_OBJS= "$(INTDIR)\$(PROG).obj" "$(OUTDIR)\$(PROG).exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_ADD) $(LINK32_OBJS) << PROG=thread1 LINK32_ADD=/pdb:"$(OUTDIR)\$(PROG).pdb" /map:"$(INTDIR)\$(PROG).map" /out:"$(OUTDIR)\$(PROG).exe" LINK32_OBJS= "$(INTDIR)\$(PROG).obj" "$(OUTDIR)\$(PROG).exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_ADD) $(LINK32_OBJS) << PROG=bug2 LINK32_ADD=/pdb:"$(OUTDIR)\$(PROG).pdb" /map:"$(INTDIR)\$(PROG).map" /out:"$(OUTDIR)\$(PROG).exe" LINK32_OBJS= "$(INTDIR)\$(PROG).obj" "$(OUTDIR)\$(PROG).exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_ADD) $(LINK32_OBJS) << PROG=tcpstr1 LINK32_ADD=/pdb:"$(OUTDIR)\$(PROG).pdb" /map:"$(INTDIR)\$(PROG).map" /out:"$(OUTDIR)\$(PROG).exe" LINK32_OBJS= "$(INTDIR)\$(PROG).obj" "$(OUTDIR)\$(PROG).exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_ADD) $(LINK32_OBJS) << PROG=url1 LINK32_ADD=/pdb:"$(OUTDIR)\$(PROG).pdb" /map:"$(INTDIR)\$(PROG).map" /out:"$(OUTDIR)\$(PROG).exe" LINK32_OBJS= "$(INTDIR)\$(PROG).obj" "$(OUTDIR)\$(PROG).exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_ADD) $(LINK32_OBJS) << # Role # .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << # Generate objects # NAME=thread1 SOURCE=.\$(NAME).cpp "$(INTDIR)\$(NAME).obj" : $(SOURCE) "$(INTDIR)" NAME=bug1 SOURCE=.\$(NAME).cpp "$(INTDIR)\$(NAME).obj" : $(SOURCE) "$(INTDIR)" NAME=tcpstr1 SOURCE=.\$(NAME).cpp "$(INTDIR)\$(NAME).obj" : $(SOURCE) "$(INTDIR)" NAME=bug2 SOURCE=.\$(NAME).cpp "$(INTDIR)\$(NAME).obj" : $(SOURCE) "$(INTDIR)" NAME=url1 SOURCE=.\$(NAME).cpp "$(INTDIR)\$(NAME).obj" : $(SOURCE) "$(INTDIR)" commoncpp2-1.8.1/tests/SampleSubObject.cpp0000644000175000017500000000610311463314535015414 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include "SampleSubObject.h" IMPLEMENT_PERSISTENCE(TestSub, "TestSub") TestSub::TestSub() : iInteger(0), strString("Null"), strString2("Null") {} TestSub::TestSub(const TestSub &ob) { iInteger = ob.iInteger; strString = ob.strString; strString2 = ob.strString2; } bool TestSub::operator==(const TestSub &ob) const { return iInteger == ob.iInteger && strString == ob.strString && strString2 == ob.strString2 && numbers == ob.numbers; } bool TestSub::write(Engine& archive) const { archive << iInteger << strString << strString2; archive << numbers; return true; } bool TestSub::read(Engine& archive) { archive >> iInteger >> strString >> strString2; archive >> numbers; return true; } void TestSub::print(const string& name) const { cout << "------------------------------------\n"; cout << name << ":\n" << " iInteger: " << iInteger << endl << " strString: '" << strString << "'" << endl << " strString2: '" << strString2 << "'" << endl; cout << " numbers: "; std::copy(numbers.begin(), numbers.end(), std::ostream_iterator(cout, " ")); cout << endl; } commoncpp2-1.8.1/tests/thread3.cpp0000644000175000017500000000142211463314535013723 00000000000000#include #include #include #include #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif // Test if cancellation unwinds stack frame // class myObject { public: myObject() {cout << "created auto object on stack" << endl;}; ~myObject() {cout << "destroyed auto object on cancel" << endl;}; }; class myThread: public Thread { public: myThread() : Thread() {}; void run(void) { myObject obj; setCancel(cancelImmediate); Thread::sleep(TIMEOUT_INF); } ~myThread() {cout << "ending thread" << endl;}; }; int main(int argc, char* argv[]) { cout << "starting thread" << endl; myThread *th = new myThread(); th->start(); Thread::sleep(1000); // 1 second delete th; // delete to join return 0; } commoncpp2-1.8.1/tests/Test_Date.cpp0000644000175000017500000000403711463314535014252 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include "Test_Date.h" CPPUNIT_TEST_SUITE_REGISTRATION(DateTest); commoncpp2-1.8.1/tests/Test_Engine.h0000644000175000017500000001025211463314535014243 00000000000000// Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include #include "SampleObject.h" #include using namespace ost; #define BINARY_BUFFER_SIZE 1000 #define STL_CONTAINER_SIZE 1000 // support macros to clean things for testing of primitive types // tests both primitive and pointer to primitive types #define TEST_PRIMITIVE_OUTPUT(type, value) \ type test_##type = value; \ type* test_##type##p = new type(value); \ outputEngine << test_##type; \ outputEngine << *test_##type##p; #define TEST_PRIMITIVE_INPUT(type) \ type test2_##type; \ type* test2_##type##p = new type; \ inputEngine >> test2_##type; \ CPPUNIT_ASSERT(test_##type == test2_##type); \ inputEngine >> *test2_##type##p; \ CPPUNIT_ASSERT(test_##type == *test2_##type##p); \ delete test2_##type##p; \ delete test_##type##p; /** * Test Fixture to excercise the Common C++ Persistence engine * * @author Chad C. Yates */ class EngineTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(EngineTest); CPPUNIT_TEST(testPrimitives); CPPUNIT_TEST(testRawBinary); CPPUNIT_TEST(testSTLVector); CPPUNIT_TEST(testSTLDeque); CPPUNIT_TEST(testSTLMap); CPPUNIT_TEST(testComplexObject); //CPPUNIT_TEST(testModeExceptions); CPPUNIT_TEST_SUITE_END(); private: Test complexObject; public: void setUp(); void tearDown(); /** * Test case for all supported primative types * * @author Chad C. Yates */ void testPrimitives(); /** * Test case for a raw chunk of binary data * * @author Chad C. Yates */ void testRawBinary(); /** * Test case for all an STL Vector * * @author Chad C. Yates */ void testSTLVector(); /** * Test case for all an STL Deque * * @author Chad C. Yates */ void testSTLDeque(); /** * Test case for an STL Map * * @author Chad C. Yates */ void testSTLMap(); /** * Test case for all a complex Object hierarchy derived from BaseObject * * @author Chad C. Yates */ void testComplexObject(); /** * Test case for engine mode exceptions * since the persistence engine does not actually throw exceptions * yet, we can't test for it. * * @author Chad C. Yates */ void testModeExceptions(); }; commoncpp2-1.8.1/tests/SampleSubObject.h0000644000175000017500000000530311463314535015062 00000000000000#ifndef TESTSUBOBJECT_H #define TESTSUBOBJECT_H // Copyright (C) 2002-2003 Chad C. Yates cyates@uidaho.edu // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // As a special exception to the GNU General Public License, permission is // granted for additional uses of the text contained in its release // of Common C++. // // The exception is that, if you link the Common C++ library with other // files to produce an executable, this does not by itself cause the // resulting executable to be covered by the GNU General Public License. // Your use of that executable is in no way restricted on account of // linking the Common C++ library code into it. // // This exception does not however invalidate any other reasons why // the executable file might be covered by the GNU General Public License. // // This exception applies only to the code released under the // name Common C++. If you copy code from other releases into a copy of // Common C++, as the General Public License permits, the exception does // not apply to the code that you add in this way. To avoid misleading // anyone as to the status of such modified files, you must delete // this exception notice from them. // // If you write modifications of your own for Common C++, it is your choice // whether to permit this exception to apply to your modifications. // If you do not wish that, delete this exception notice. #include #include using namespace ost; using std::cout; using std::endl; using std::string; // an object used for embedding into TestObject to test object graph persistence class TestSub : public BaseObject { DECLARE_PERSISTENCE(TestSub) public: int32 iInteger; std::string strString; std::string strString2; std::vector numbers; TestSub(); TestSub(const TestSub &ob); ~TestSub() {}; bool operator==(const TestSub &ob) const; bool operator!=(const TestSub &ob) const {return !(*this == ob); }; void print(const std::string& name) const; virtual bool write(Engine& archive) const; virtual bool read(Engine& archive); }; #endif