diff options
Diffstat (limited to 'apps')
153 files changed, 0 insertions, 22259 deletions
diff --git a/apps/Gateway/Gateway/Channel.cpp b/apps/Gateway/Gateway/Channel.cpp deleted file mode 100644 index 99699a6ee87..00000000000 --- a/apps/Gateway/Gateway/Channel.cpp +++ /dev/null @@ -1,710 +0,0 @@ - -// $Id$ - -#include "Routing_Entry.h" -#include "Channel_Connector.h" - -// Convenient short-hands. -#define CO CONDITION -#define MU MUTEX - -// = The total number of bytes sent/received on this channel. -size_t -Channel::total_bytes (void) -{ - return this->total_bytes_; -} - -void -Channel::total_bytes (size_t bytes) -{ - this->total_bytes_ += bytes; -} - -Channel::Channel (ROUTING_TABLE *rt, - Channel_Connector *cc, - ACE_Thread_Manager *thr_mgr, - int socket_queue_size) - : ACE_Svc_Handler<CHANNEL_PEER_STREAM, SYNCH> (thr_mgr), - routing_table_ (rt), - id_ (-1), - total_bytes_ (0), - state_ (Channel::IDLE), - connector_ (cc), - timeout_ (1), - max_timeout_ (Channel::MAX_RETRY_TIMEOUT), - socket_queue_size_ (socket_queue_size) -{ -} - -// Set the associated channel. - -void -Channel::active (int a) -{ - this->state (a == 0 ? Channel::IDLE : Channel::ESTABLISHED); -} - -// Get the associated channel. - -int -Channel::active (void) -{ - return this->state () == Channel::ESTABLISHED; -} - -// Set the direction. - -void -Channel::direction (char d) -{ - this->direction_ = d; -} - -// Get the direction. - -char -Channel::direction (void) -{ - return this->direction_; -} - -// Sets the timeout delay. - -void -Channel::timeout (int to) -{ - if (to > this->max_timeout_) - to = this->max_timeout_; - - this->timeout_ = to; -} - -// Recalculate the current retry timeout delay using exponential -// backoff. Returns the original timeout (i.e., before the -// recalculation). - -int -Channel::timeout (void) -{ - int old_timeout = this->timeout_; - this->timeout_ *= 2; - - if (this->timeout_ > this->max_timeout_) - this->timeout_ = this->max_timeout_; - - return old_timeout; -} - -// Sets the max timeout delay. - -void -Channel::max_timeout (int mto) -{ - this->max_timeout_ = mto; -} - -// Gets the max timeout delay. - -int -Channel::max_timeout (void) -{ - return this->max_timeout_; -} - -// Restart connection asynchronously when timeout occurs. - -int -Channel::handle_timeout (const ACE_Time_Value &, const void *) -{ - ACE_DEBUG ((LM_DEBUG, - "(%t) attempting to reconnect Channel %d with timeout = %d\n", - this->id (), this->timeout_)); - return this->connector_->initiate_connection (this, ACE_Synch_Options::asynch); -} - -// Restart connection (blocking_semantics dicates whether we -// restart synchronously or asynchronously). - -int -Channel::reinitiate_connection (void) -{ - // Skip over deactivated descriptors. - if (this->get_handle () != -1) - { - // Make sure to close down peer to reclaim descriptor. - this->peer ().close (); - -#if 0 -// if (this->state () == FAILED) -// { - // Reinitiate timeout to improve reconnection time. -// this->timeout (1); -#endif - - ACE_DEBUG ((LM_DEBUG, - "(%t) scheduling reinitiation of Channel %d\n", - this->id ())); - - // Reschedule ourselves to try and connect again. - if (ACE_Service_Config::reactor ()->schedule_timer (this, 0, - this->timeout ()) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - } - return 0; -} - -// Handle shutdown of the Channel object. - -int -Channel::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) shutting down Channel %d on handle %d\n", - this->id (), this->get_handle ())); - - return this->reinitiate_connection (); -} - -// Set the state of the channel. - -void -Channel::state (Channel::State s) -{ - this->state_ = s; -} - -// Perform the first-time initiation of a connection to the peer. - -int -Channel::initialize_connection (void) -{ - this->state_ = Channel::ESTABLISHED; - - // Restart the timeout to 1. - this->timeout (1); - -#if defined (ASSIGN_ROUTING_ID) - // Action that sends the route id to the peerd. - - CONN_ID id = htons (this->id ()); - - ssize_t n = this->peer ().send ((const void *) &id, sizeof id); - - if (n != sizeof id) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - n == 0 ? "gatewayd has closed down unexpectedly" : "send"), -1); -#endif /* ASSIGN_ROUTING_ID */ - return 0; -} - -// Set the size of the socket queue. - -void -Channel::socket_queue_size (void) -{ - if (this->socket_queue_size_ > 0) - { - int option = this->direction_ == 'I' ? SO_RCVBUF : SO_SNDBUF; - - if (this->peer ().set_option (SOL_SOCKET, option, - &this->socket_queue_size_, sizeof (int)) == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "set_option")); - } -} - -// Upcall from the ACE_Acceptor::handle_input() that -// delegates control to our application-specific Channel. - -int -Channel::open (void *a) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) Channel's fd = %d\n", this->peer ().get_handle ())); - - // Set the size of the socket queue. - this->socket_queue_size (); - - // Turn on non-blocking I/O. - if (this->peer ().enable (ACE_NONBLOCK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enable"), -1); - - // Call down to the base class to activate and register this handler. - if (this->ACE_Svc_Handler<CHANNEL_PEER_STREAM, SYNCH>::open (a) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "activate"), -1); - - return this->initialize_connection (); -} - -// Return the current state of the channel. - -Channel::State -Channel::state (void) -{ - return this->state_; -} - -void -Channel::id (CONN_ID id) -{ - this->id_ = id; -} - -CONN_ID -Channel::id (void) -{ - return this->id_; -} - -// Set the peer's address information. -int -Channel::bind (const ACE_INET_Addr &remote_addr, - const ACE_INET_Addr &local_addr, - CONN_ID id) -{ - this->remote_addr_ = remote_addr; - this->local_addr_ = local_addr; - this->id_ = id; - return 0; -} - -ACE_INET_Addr & -Channel::remote_addr (void) -{ - return this->remote_addr_; -} - -ACE_INET_Addr & -Channel::local_addr (void) -{ - return this->local_addr_; -} - -// Constructor sets the routing table pointer. - -Output_Channel::Output_Channel (ROUTING_TABLE *rt, - Channel_Connector *cc, - ACE_Thread_Manager *thr_mgr, - int socket_queue_size) - : Channel (rt, cc, thr_mgr, socket_queue_size) -{ - this->direction_ = 'O'; - this->msg_queue ()->high_water_mark (Output_Channel::QUEUE_SIZE); -} - -// This method should be called only when the peer shuts down -// unexpectedly. This method simply marks the Channel as -// having failed so that handle_close () can reconnect. - -int -Output_Channel::handle_input (ACE_HANDLE) -{ - char buf[1]; - - this->state (Channel::FAILED); - - switch (this->peer ().recv (buf, sizeof buf)) - { - case -1: - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Peer has failed unexpectedly for Output Channel %d\n", - this->id ()), -1); - /* NOTREACHED */ - case 0: - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Peer has shutdown unexpectedly for Output Channel %d\n", - this->id ()), -1); - /* NOTREACHED */ - default: - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Peer is sending input on Output Channel %d\n", - this->id ()), -1); - /* NOTREACHED */ - } -} - -int -Output_Channel::svc (void) -{ - ACE_ERROR_RETURN ((LM_ERROR, "(%t) svc should not be called on Output_Channel!\n"), -1); -} - -// Perform a non-blocking put() of message MB. If we are unable to -// send the entire message the remainder is re-queued at the *front* of -// the Message_List. - -int -Output_Channel::nonblk_put (ACE_Message_Block *mb) -{ - // Try to send the message. If we don't send it all (e.g., due to - // flow control), then re-queue the remainder at the head of the - // Message_List and ask the ACE_Reactor to inform us (via - // handle_output()) when it is possible to try again. - - ssize_t n; - - if ((n = this->send_peer (mb)) == -1) - { - // Things have gone wrong, let's try to close down and set up a new reconnection. - this->state (Channel::FAILED); - this->handle_close (); - return -1; - } - else if (errno == EWOULDBLOCK) // Didn't manage to send everything. - { - ACE_DEBUG ((LM_DEBUG, "(%t) queueing activated on handle %d to routing id %d\n", - this->get_handle (), this->id ())); - - // ACE_Queue in *front* of the list to preserve order. - if (this->msg_queue ()->enqueue_head (mb, (ACE_Time_Value *) &ACE_Time_Value::zero) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enqueue_head"), -1); - - // Tell ACE_Reactor to call us back when we can send again. - else if (ACE_Service_Config::reactor ()-> - schedule_wakeup (this, ACE_Event_Handler::WRITE_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "schedule_wakeup"), -1); - return 0; - } - else - return n; -} - -int -Output_Channel::send_peer (ACE_Message_Block *mb) -{ - ssize_t n; - size_t len = mb->length (); - - if ((n = this->peer ().send (mb->rd_ptr (), len)) <= 0) - return errno == EWOULDBLOCK ? 0 : n; - else if (n < len) - // Re-adjust pointer to skip over the part we did send. - mb->rd_ptr (n); - else /* if (n == length) */ - { - // The whole message is sent, we can now safely deallocate the buffer. - // Note that this should decrement a reference count... - delete mb; - errno = 0; - } - this->total_bytes (n); - return n; -} - -// Finish sending a message when flow control conditions abate. -// This method is automatically called by the ACE_Reactor. - -int -Output_Channel::handle_output (ACE_HANDLE) -{ - ACE_Message_Block *mb = 0; - int status = 0; - - ACE_DEBUG ((LM_DEBUG, "(%t) in handle_output on handle %d\n", this->get_handle ())); - // The list had better not be empty, otherwise there's a bug! - - if (this->msg_queue ()->dequeue_head (mb, (ACE_Time_Value *) &ACE_Time_Value::zero) != -1) - { - switch (this->nonblk_put (mb)) - { - case 0: // Partial send. - ACE_ASSERT (errno == EWOULDBLOCK); - // Didn't write everything this time, come back later... - break; - - case -1: - // Caller is responsible for freeing a ACE_Message_Block if failures occur. - delete mb; - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "transmission failure")); - - /* FALLTHROUGH */ - default: // Sent the whole thing. - - // If we succeed in writing the entire message (or we did not fail - // due to EWOULDBLOCK) then check if there are more messages on the Message_List. - // If there aren't, tell the ACE_Reactor not to notify us anymore (at least - // until there are new messages queued up). - - if (this->msg_queue ()->is_empty ()) - { - ACE_DEBUG ((LM_DEBUG, "(%t) queueing deactivated on handle %d to routing id %d\n", - this->get_handle (), this->id ())); - - - if (ACE_Service_Config::reactor ()-> - cancel_wakeup (this, ACE_Event_Handler::WRITE_MASK) == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "cancel_wakeup")); - } - } - } - else - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "dequeue_head")); - return 0; -} - -// Send a message to a peer (may queue if necessary). - -int -Output_Channel::put (ACE_Message_Block *mb, ACE_Time_Value *) -{ - if (this->msg_queue ()->is_empty ()) - // Try to send the message *without* blocking! - return this->nonblk_put (mb); - else - // If we have queued up messages due to flow control - // then just enqueue and return. - return this->msg_queue ()->enqueue_tail (mb, (ACE_Time_Value *) &ACE_Time_Value::zero); -} - -// Constructor sets the routing table pointer and the connector pointer. - -Input_Channel::Input_Channel (ROUTING_TABLE *rt, - Channel_Connector *cc, - ACE_Thread_Manager *thr_mgr, - int socket_queue_size) - : msg_frag_ (0), - Channel (rt, cc, thr_mgr, socket_queue_size) -{ - this->direction_ = 'I'; - this->msg_queue ()->high_water_mark (0); -} - -int -Input_Channel::put (ACE_Message_Block *, ACE_Time_Value *) -{ - ACE_ERROR_RETURN ((LM_ERROR, "(%t) put should not be called on Input_Channel!\n"), -1); -} - -int -Input_Channel::svc (void) -{ - ACE_ERROR_RETURN ((LM_ERROR, "(%t) svc should not be called on Input_Channel!\n"), -1); -} - -// Receive a Peer message from peerd. Handles fragmentation. -// -// The routing message returned from recv_peer consists of two parts: -// 1. The Address part, contains the virtual routing id. -// 2. The Data part, which contains the actual data to be routed. -// -// The reason for having two parts is to shield the higher layers -// of software from knowledge of the message structure. - -int -Input_Channel::recv_peer (ACE_Message_Block *&route_addr) -{ - Peer_Message *peer_msg; - size_t len; - ssize_t n = 0; - ssize_t m = 0; - size_t offset = 0; - - if (this->msg_frag_ == 0) - // No existing fragment... - ACE_NEW_RETURN (this->msg_frag_, - ACE_Message_Block (sizeof (Peer_Message)), - -1); - - peer_msg = (Peer_Message *) this->msg_frag_->rd_ptr (); - - const ssize_t HEADER_SIZE = sizeof (Peer_Header); - ssize_t header_bytes_left_to_read = HEADER_SIZE - this->msg_frag_->length (); - - if (header_bytes_left_to_read > 0) - { - n = this->peer ().recv (this->msg_frag_->wr_ptr (), header_bytes_left_to_read); - - if (n == -1 /* error */ - || n == 0 /* EOF */) - { - ACE_ERROR ((LM_ERROR, "%p\n", "Recv error during header read ")); - ACE_DEBUG ((LM_DEBUG, "attempted to read %d\n", header_bytes_left_to_read)); - delete this->msg_frag_; - this->msg_frag_ = 0; - return n; - } - - // Bump the write pointer by the amount read. - this->msg_frag_->wr_ptr (n); - - // At this point we may or may not have the ENTIRE header. - if (this->msg_frag_->length () < HEADER_SIZE) - { - ACE_DEBUG ((LM_DEBUG, "Partial header received: only %d bytes\n", - this->msg_frag_->length ())); - // Notify the caller that we didn't get an entire message. - errno = EWOULDBLOCK; - return -1; - } - } - - // At this point there is a complete, valid header in msg_frag_ - len = sizeof peer_msg->buf_ + HEADER_SIZE - this->msg_frag_->length (); - - // Try to receive the remainder of the message - - switch (m = this->peer ().recv (peer_msg->buf_ + offset, len)) - { - case -1: - if (errno == EWOULDBLOCK) - { - // This shouldn't happen since the ACE_Reactor - // just triggered us to handle pending I/O! - ACE_DEBUG ((LM_DEBUG, "(%t) unexpected recv failure\n")); - errno = EWOULDBLOCK; - return -1; - } - else - /* FALLTHROUGH */; - - case 0: // Premature EOF. - delete this->msg_frag_; - this->msg_frag_ = 0; - return 0; - - default: - if (m != len) - // Re-adjust pointer to skip over the part we've read. - { - this->msg_frag_->wr_ptr (m); - errno = EWOULDBLOCK; - return -1; // Inform caller that we didn't get the whole message. - } - else - { - // Set the write pointer at 1 past the end of the message. - this->msg_frag_->wr_ptr (m); - - // Set the read pointer to the beginning of the message. - this->msg_frag_->rd_ptr (this->msg_frag_->base ()); - - // Allocate a routing message header and chain the data portion - // onto its continuation field. - ACE_NEW_RETURN (route_addr, - ACE_Message_Block (sizeof (Peer_Addr), - ACE_Message_Block::MB_PROTO, - this->msg_frag_), - -1); - - Peer_Addr peer_addr (this->id (), peer_msg->header_.routing_id_, 0); - // Copy the routing address from the Peer_Message into routing_addr. - route_addr->copy ((char *) &peer_addr, sizeof (Peer_Addr)); - - // Reset the pointer to indicate we've got an entire message. - this->msg_frag_ = 0; - } - this->total_bytes (m + n); -#if defined (VERBOSE) - ACE_DEBUG ((LM_DEBUG, "(%t) channel id = %d, route id = %d, len = %d, payload = %*s", - peer_addr.conn_id_, peer_msg->header_.routing_id_, peer_msg->header_.len_, - peer_msg->header_.len_, peer_msg->buf_)); -#else - ACE_DEBUG ((LM_DEBUG, "(%t) route id = %d, cur len = %d, total bytes read = %d\n", - peer_msg->header_.routing_id_, peer_msg->header_.len_, this->total_bytes ())); -#endif - return m + n; - } -} - -// Receive various types of input (e.g., Peer message from the -// gatewayd, as well as stdio). - -int -Input_Channel::handle_input (ACE_HANDLE) -{ - ACE_Message_Block *route_addr = 0; - - switch (this->recv_peer (route_addr)) - { - case 0: - // Note that a peer should never initiate a shutdown. - this->state (Channel::FAILED); - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Peer has closed down unexpectedly for Input Channel %d\n", - this->id ()), -1); - /* NOTREACHED */ - case -1: - if (errno == EWOULDBLOCK) - // A short-read, we'll come back and finish it up later on! - return 0; - else // A weird problem occurred, shut down and start again. - { - this->state (Channel::FAILED); - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p for Input Channel %d\n", - "Peer has failed unexpectedly", - this->id ()), -1); - } - /* NOTREACHED */ - default: - return this->route_message (route_addr); - } -} - -// Route a message to its appropriate destination. - -int -Input_Channel::route_message (ACE_Message_Block *route_addr) -{ - // We got a valid message, so determine its virtual routing id, - // which is stored in the first of the two message blocks chained together. - - Peer_Addr *routing_key = (Peer_Addr *) route_addr->rd_ptr (); - - // Skip over the address portion. - const ACE_Message_Block *const data = route_addr->cont (); - - // RE points to the routing entry located for this routing id. - Routing_Entry *re = 0; - - if (this->routing_table_->find (*routing_key, re) != -1) - { - // Check to see if there are any destinations. - if (re->destinations ()->size () == 0) - ACE_DEBUG ((LM_WARNING, - "there are no active destinations for this message currently\n")); - - else // There are destinations, so forward the message. - { - Routing_Entry::ENTRY_SET *esp = re->destinations (); - Routing_Entry::ENTRY_ITERATOR si (*esp); - - for (Channel **channel = 0; si.next (channel) != 0; si.advance ()) - { - // Only process active channels. - if ((*channel)->active ()) - { - // Clone the message portion (should be doing reference counting here...) - ACE_Message_Block *newmsg = data->clone (); - - ACE_DEBUG ((LM_DEBUG, "(%t) sending to peer %d\n", (*channel)->id ())); - - if ((*channel)->put (newmsg) == -1) - { - if (errno == EWOULDBLOCK) // The queue has filled up! - ACE_ERROR ((LM_ERROR, "(%t) %p\n", - "gateway is flow controlled, so we're dropping messages")); - else - ACE_ERROR ((LM_ERROR, "(%t) %p transmission error to route %d\n", - "put", (*channel)->id ())); - - // Caller is responsible for freeing a ACE_Message_Block if failures occur. - delete newmsg; - } - } - } - // Will become superfluous once we have reference counting... - delete route_addr; - return 0; - } - } - delete route_addr; - // Failure return. - ACE_ERROR ((LM_DEBUG, "(%t) find failed on conn id = %d, logical id = %d, payload = %d\n", - routing_key->conn_id_, routing_key->logical_id_, routing_key->payload_)); - return 0; -} - -#if defined (ACE_TEMPLATES_REQUIRE_SPECIALIZATION) -template class ACE_Map_Manager<Peer_Addr, Routing_Entry *, MUTEX>; -template class ACE_Map_Iterator<Peer_Addr, Routing_Entry *, MUTEX>; -template class ACE_Map_Entry<Peer_Addr, Routing_Entry *>; -#endif /* ACE_TEMPLATES_REQUIRE_SPECIALIZATION */ diff --git a/apps/Gateway/Gateway/Channel_Connector.cpp b/apps/Gateway/Gateway/Channel_Connector.cpp deleted file mode 100644 index a5394e8b013..00000000000 --- a/apps/Gateway/Gateway/Channel_Connector.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include "Channel_Connector.h" -// $Id$ - - -Channel_Connector::Channel_Connector (void) -{ -} - -// Override the connection-failure method to add timer support. -// Note that these timers perform "expoential backoff" to -// avoid rapidly trying to reestablish connections when a link -// goes down. - -int -Channel_Connector::handle_close (ACE_HANDLE sd, ACE_Reactor_Mask) -{ - ACE_Connector<Channel, CHANNEL_PEER_CONNECTOR>::AST *stp = 0; - - // Locate the ACE_Svc_Handler corresponding to the socket descriptor. - if (this->handler_map_.find (sd, stp) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) can't locate channel %d in map, %p\n", - sd, "find"), -1); - - Channel *channel = stp->svc_handler (); - - // Schedule a reconnection request at some point in the future - // (note that channel uses an exponential backoff scheme). - if (ACE_Service_Config::reactor ()->schedule_timer (channel, 0, - channel->timeout ()) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - return 0; -} - -// Initiate (or reinitiate) a connection to the Channel. - -int -Channel_Connector::initiate_connection (Channel *channel, - ACE_Synch_Options &synch_options) -{ - char buf[MAXHOSTNAMELEN]; - - // Mark ourselves as idle so that the various iterators - // will ignore us until we are reconnected. - channel->state (Channel::IDLE); - - if (channel->remote_addr ().addr_to_string (buf, sizeof buf) == -1 - || channel->local_addr ().addr_to_string (buf, sizeof buf) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "can't obtain peer's address"), -1); - - // Try to connect to the Peer. - - if (this->connect (channel, channel->remote_addr (), - synch_options, channel->local_addr ()) == -1) - { - if (errno != EWOULDBLOCK) - { - channel->state (Channel::FAILED); - ACE_DEBUG ((LM_DEBUG, "(%t) %p on address %s\n", - "connect", buf)); - - // Reschedule ourselves to try and connect again. - if (synch_options[ACE_Synch_Options::USE_REACTOR]) - { - if (ACE_Service_Config::reactor ()->schedule_timer - (channel, 0, channel->timeout ()) == 0) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - } - else - // Failures on synchronous connects are reported as errors - // so that the caller can decide how to proceed. - return -1; - } - else - { - channel->state (Channel::CONNECTING); - ACE_DEBUG ((LM_DEBUG, - "(%t) in the process of connecting %s to %s\n", - synch_options[ACE_Synch_Options::USE_REACTOR] - ? "asynchronously" : "synchronously", buf)); - } - } - else - { - channel->state (Channel::ESTABLISHED); - ACE_DEBUG ((LM_DEBUG, "(%t) connected to %s on %d\n", - buf, channel->get_handle ())); - } - return 0; -} diff --git a/apps/Gateway/Gateway/Channel_Connector.h b/apps/Gateway/Gateway/Channel_Connector.h deleted file mode 100644 index 3e27f37355a..00000000000 --- a/apps/Gateway/Gateway/Channel_Connector.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Channel_Connector.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_CHANNEL_CONNECTOR) -#define _CHANNEL_CONNECTOR - -#include "ace/Connector.h" -#include "Thr_Channel.h" - -class Channel_Connector : public ACE_Connector<Channel, CHANNEL_PEER_CONNECTOR> - // = TITLE - // A concrete factory class that setups connections to peerds - // and produces a new Channel object to do the dirty work... -{ -public: - Channel_Connector (void); - - // Initiate (or reinitiate) a connection on the Channel. - int initiate_connection (Channel *, - ACE_Synch_Options & = ACE_Synch_Options::synch); - -protected: - // Override the connection-failure method to add timer support. - virtual int handle_close (ACE_HANDLE sd, ACE_Reactor_Mask); -}; - -#endif /* _CHANNEL_CONNECTOR */ diff --git a/apps/Gateway/Gateway/Concurrency_Strategies.h b/apps/Gateway/Gateway/Concurrency_Strategies.h deleted file mode 100644 index 28e59a4b2e6..00000000000 --- a/apps/Gateway/Gateway/Concurrency_Strategies.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Concurrency_strategies.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_CONCURRENCY_STRATEGIES) -#define _CONCURRENCY_STRATEGIES - -#include "ace/Synch.h" - -// The following typedefs are used in order to parameterize the -// synchronization policies without changing the source code! - -// If we don't have threads then use the single-threaded synchronization. -#if !defined (ACE_HAS_THREADS) -#define SYNCH_STRATEGY ACE_NULL_SYNCH -typedef ACE_Null_Mutex MAP_MUTEX; -#else /* ACE_HAS_THREADS */ - -// Note that we only need to make the ACE_Task thread-safe if we are -// using the multi-threaded Thr_Consumer_Proxy... -#if defined (USE_OUTPUT_MT) -#define SYNCH_STRATEGY ACE_MT_SYNCH -#else -#define SYNCH_STRATEGY ACE_NULL_SYNCH -#endif /* USE_OUTPUT_MT || USE_INPUT_MT */ - -// Note that we only need to make the ACE_Map_Manager thread-safe if -// we are using the multi-threaded Thr_Supplier_Proxy. In this -// case, we use an RW_Mutex since we'll lookup Consumers far more -// often than we'll update them. -#if defined (USE_INPUT_MT) -typedef ACE_RW_Mutex MAP_MUTEX; -#else -typedef ACE_Null_Mutex MAP_MUTEX; -#endif /* USE_INPUT_MT */ -#endif /* ACE_HAS_THREADS */ - -// = Forward decls -class Thr_Consumer_Proxy; -class Thr_Supplier_Proxy; -class Consumer_Proxy; -class Supplier_Proxy; - -#if defined (ACE_HAS_THREADS) && (defined (USE_OUTPUT_MT) || defined (USE_INPUT_MT)) -#if defined (USE_OUTPUT_MT) -typedef Thr_Consumer_Proxy CONSUMER_PROXY; -#else -typedef Consumer_Proxy CONSUMER_PROXY; -#endif /* USE_OUTPUT_MT */ - -#if defined (USE_INPUT_MT) -typedef Thr_Supplier_Proxy SUPPLIER_PROXY; -#else -typedef Supplier_Proxy SUPPLIER_PROXY; -#endif /* USE_INPUT_MT */ -#else -// Instantiate a non-multi-threaded Gateway. -typedef Supplier_Proxy SUPPLIER_PROXY; -typedef Consumer_Proxy CONSUMER_PROXY; -#endif /* ACE_HAS_THREADS */ - -#endif /* _CONCURRENCY_STRATEGIES */ diff --git a/apps/Gateway/Gateway/Config_Files.cpp b/apps/Gateway/Gateway/Config_Files.cpp deleted file mode 100644 index 5b95dc4fbf0..00000000000 --- a/apps/Gateway/Gateway/Config_Files.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include "ace/OS.h" -// $Id$ - -#include "Config_Files.h" - -// This fixes a nasty bug with cfront-based compilers (like -// Centerline). -typedef FP::Return_Type FP_RETURN_TYPE; - -FP_RETURN_TYPE -Consumer_Config_File_Parser::read_entry (Consumer_Config_File_Entry &entry, - int &line_number) -{ - FP_RETURN_TYPE read_result; - - // Increment the line count. - line_number++; - - // Ignore comments, check for EOF and EOLINE if this succeeds, we - // have our connection id. - while ((read_result = this->getint (entry.conn_id_)) != FP::SUCCESS) - { - if (read_result == FP::EOFILE) - return FP::EOFILE; - else if (read_result == FP::EOLINE - || read_result == FP::COMMENT) - line_number++; - } - - // Get the logical id. - if ((read_result = this->getint (entry.supplier_id_)) != FP::SUCCESS) - return read_result; - - // Get the payload type. - if ((read_result = this->getint (entry.type_)) != FP::SUCCESS) - return read_result; - - // get all the consumers. - entry.total_consumers_ = 0; - - while ((read_result = this->getint (entry.consumers_[entry.total_consumers_])) - == FP::SUCCESS) - ++entry.total_consumers_; // do nothing (should check against max...) - - if (read_result == FP::EOLINE || read_result == FP::EOFILE) - return FP::SUCCESS; - else - return read_result; -} - -FP_RETURN_TYPE -Connection_Config_File_Parser::read_entry (Connection_Config_File_Entry &entry, - int &line_number) -{ - char buf[BUFSIZ]; - FP_RETURN_TYPE read_result; - // increment the line count - line_number++; - - // Ignore comments, check for EOF and EOLINE - // if this succeeds, we have our connection id - while ((read_result = this->getint (entry.conn_id_)) != FP::SUCCESS) - { - if (read_result == FP::EOFILE) - return FP::EOFILE; - else if (read_result == FP::EOLINE - || read_result == FP::COMMENT) - line_number++; - } - - // get the hostname - if ((read_result = this->getword (entry.host_)) != FP::SUCCESS) - return read_result; - - ACE_INT32 port; - - // Get the port number. - if ((read_result = this->getint (port)) != FP::SUCCESS) - return read_result; - else - entry.remote_port_ = (u_short) port; - - // Get the proxy role. - if ((read_result = this->getword (buf)) != FP::SUCCESS) - return read_result; - else - entry.proxy_role_ = buf[0]; - - // Get the max retry delay. - if ((read_result = this->getint (entry.max_retry_delay_)) != FP::SUCCESS) - return read_result; - - // Get the local port number. - if ((read_result = this->getint (port)) != FP::SUCCESS) - return read_result; - else - entry.local_port_ = (u_short) port; - - return FP::SUCCESS; -} - -#if defined (DEBUGGING) -int main (int argc, char *argv[]) -{ - if (argc != 4) { -// ACE_ERROR_RETURN ((LM_ERROR, "%s filename\n", argv[0]), -1); - cerr << argv[0] << " CCfilename filename Mapfilename.\n"; - exit (1); - } - FP_RETURN_TYPE result; - Connection_Config_File_Entry entry; - Connection_Config_File_Parser CCfile; - - CCfile.open (argv[1]); - - int line_number = 0; - - printf ("ConnID\tHost\t\tRPort\tDir\tRetry\tLPort\n"); - - // Read config file line at a time. - while ((result = CCfile.read_entry (entry, line_number)) != EOF) - { - if (result != FP::SUCCESS) - // ACE_DEBUG ((LM_DEBUG, "Error line %d.\n", line_number)); - cerr << "Error at line " << line_number << endl; - else - printf ("%d\t%s\t%d\t%c\t%d\t%c\t%d\n", - entry.conn_id_, entry.host_, entry.remote_port_, entry.proxy_role_, - entry.max_retry_delay_, entry.transform_, entry.local_port_); - } - CCfile.close(); - - Consumer_Config_File_Entry entry; - Consumer_Config_File_Parser file; - - file.open (argv[2]); - - line_number = 0; - - printf ("\nConnID\tLogic\tPayload\tDestinations\n"); - - // Read config file line at a time. - while ((result = file.read_entry (entry, line_number)) != EOF) - { - if (result != FP::SUCCESS) - cerr << "Error at line " << line_number << endl; - else - { - printf ("%d\t%d\t%d\t%d\t", - entry.conn_id_, entry.supplier_id_, entry.type_); - while (--entry.total_consumers_ >= 0) - printf ("%d,", entry.consumers_[entry.total_consumers_]); - printf ("\n"); - } - } - file.close(); - - return 0; -} -#endif /* DEBUGGING */ - -#if defined (ACE_TEMPLATES_REQUIRE_SPECIALIZATION) -template class File_Parser<Connection_Config_File_Entry>; -template class File_Parser<Consumer_Config_File_Entry>; -#endif /* ACE_TEMPLATES_REQUIRE_SPECIALIZATION */ diff --git a/apps/Gateway/Gateway/Config_Files.h b/apps/Gateway/Gateway/Config_Files.h deleted file mode 100644 index eae0248eb8c..00000000000 --- a/apps/Gateway/Gateway/Config_Files.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Config_Files.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_CONFIG_FILES) -#define _CONFIG_FILES - -#include "ace/OS.h" -#include "File_Parser.h" - -class Connection_Config_File_Entry - // = TITLE - // Stores connection configuration information. -{ -public: - ACE_INT32 conn_id_; - // Connection id for this Proxy_Handler. - - char host_[BUFSIZ]; - // Host to connect with. - - u_short remote_port_; - // Port to connect with. - - char proxy_role_; - // 'S' (supplier) or 'C' (consumer). - - ACE_INT32 max_retry_delay_; - // Maximum amount of time to wait for reconnecting. - - u_short local_port_; - // Our local port number. -}; - -class Connection_Config_File_Parser : public File_Parser<Connection_Config_File_Entry> - // = TITLE - // Parser for the Proxy_Handler Connection file. -{ -public: - virtual FP::Return_Type - read_entry (Connection_Config_File_Entry &entry, int &line_number); -}; - -class Consumer_Config_File_Entry - // = TITLE - // Stores the information in a Consumer Map entry. -{ -public: - enum { - MAX_CONSUMERS = 1000 // Total number of multicast consumers. - }; - - ACE_INT32 conn_id_; - // Connection id for this proxy. - - ACE_INT32 supplier_id_; - // Logical supplier id for this proxy. - - ACE_INT32 type_; - // Message type. - - ACE_INT32 consumers_[MAX_CONSUMERS]; - // Connection ids for consumers that we're routing to. - - int total_consumers_; - // Total number of these consumers. -}; - -class Consumer_Config_File_Parser : public File_Parser<Consumer_Config_File_Entry> - // = TITLE - // Parser for the Consumer Map file. -{ -public: - virtual FP::Return_Type - read_entry (Consumer_Config_File_Entry &entry, int &line_number); -}; - -#endif /* _CONFIG_FILES */ diff --git a/apps/Gateway/Gateway/Consumer_Dispatch_Set.h b/apps/Gateway/Gateway/Consumer_Dispatch_Set.h deleted file mode 100644 index 71e2046b56e..00000000000 --- a/apps/Gateway/Gateway/Consumer_Dispatch_Set.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Consumer_Dispatch_Set.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_DISPATCH_SET) -#define _DISPATCH_SET - -#include "ace/Set.h" - -// Forward reference. -class Proxy_Handler; - -typedef ACE_Unbounded_Set<Proxy_Handler *> Consumer_Dispatch_Set; -typedef ACE_Unbounded_Set_Iterator<Proxy_Handler *> Consumer_Dispatch_Set_Iterator; - -#endif /* _DISPATCH_SET */ diff --git a/apps/Gateway/Gateway/Consumer_Entry.cpp b/apps/Gateway/Gateway/Consumer_Entry.cpp deleted file mode 100644 index c3dcd96ebbf..00000000000 --- a/apps/Gateway/Gateway/Consumer_Entry.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// Defines an entry in the Consumer Map. -// $Id$ - -#include "Consumer_Entry.h" - -Consumer_Entry::Consumer_Entry (void) -{ - ACE_NEW (this->destinations_, Consumer_Entry::ENTRY_SET); -} - -Consumer_Entry::~Consumer_Entry (void) -{ - delete this->destinations_; -} - -// Get the associated set of destinations. - -Consumer_Entry::ENTRY_SET * -Consumer_Entry::destinations (void) -{ - return this->destinations_; -} - -// Set the associated set of destinations. - -void -Consumer_Entry::destinations (Consumer_Entry::ENTRY_SET *s) -{ - this->destinations_ = s; -} - diff --git a/apps/Gateway/Gateway/Consumer_Entry.h b/apps/Gateway/Gateway/Consumer_Entry.h deleted file mode 100644 index fe502991514..00000000000 --- a/apps/Gateway/Gateway/Consumer_Entry.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Consumer_Entry.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_ROUTING_ENTRY) -#define _ROUTING_ENTRY - -#include "ace/Set.h" - -// Forward reference. -class IO_Handler; - -class Consumer_Entry -{ - // = TITLE - // Defines an entry in the Consumer_Map. -public: - Consumer_Entry (void); - ~Consumer_Entry (void); - - typedef ACE_Unbounded_Set<IO_Handler *> ENTRY_SET; - typedef ACE_Unbounded_Set_Iterator<IO_Handler *> ENTRY_ITERATOR; - - // = Set/get the associated set of destinations. - ENTRY_SET *destinations (void); - void destinations (ENTRY_SET *); - -protected: - ENTRY_SET *destinations_; - // The set of destinations; -}; - -#endif /* _ROUTING_ENTRY */ diff --git a/apps/Gateway/Gateway/Consumer_Map.cpp b/apps/Gateway/Gateway/Consumer_Map.cpp deleted file mode 100644 index 6d16601f949..00000000000 --- a/apps/Gateway/Gateway/Consumer_Map.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -#if !defined (_CONSUMER_MAP_C) -#define _CONSUMER_MAP_C - -#include "Consumer_Map.h" - -// Bind the Event_Addr to the INT_ID. - -int -Consumer_Map::bind (Event_Addr event_addr, - Consumer_Entry *Consumer_Entry) -{ - return this->map_.bind (event_addr, Consumer_Entry); -} - -// Find the Consumer_Entry corresponding to the Event_Addr. - -int -Consumer_Map::find (Event_Addr event_addr, - Consumer_Entry *&Consumer_Entry) -{ - return this->map_.find (event_addr, Consumer_Entry); -} - -// Unbind (remove) the Event_Addr from the map. - -int -Consumer_Map::unbind (Event_Addr event_addr) -{ - return this->map_.unbind (event_addr); -} - -Consumer_Map_Iterator::Consumer_Map_Iterator (Consumer_Map &rt) - : map_iter_ (rt.map_) -{ -} - -int -Consumer_Map_Iterator::next (Consumer_Entry *&ss) -{ - // Loop in order to skip over inactive entries if necessary. - - for (ACE_Map_Entry<Event_Addr, Consumer_Entry *> *temp = 0; - this->map_iter_.next (temp) != 0; - this->advance ()) - { - // Otherwise, return the next item. - ss = temp->int_id_; - return 1; - } - return 0; -} - -int -Consumer_Map_Iterator::advance (void) -{ - return this->map_iter_.advance (); -} -#endif /* _CONSUMER_MAP_C */ diff --git a/apps/Gateway/Gateway/Consumer_Map.h b/apps/Gateway/Gateway/Consumer_Map.h deleted file mode 100644 index fd392afaf6e..00000000000 --- a/apps/Gateway/Gateway/Consumer_Map.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Consumer_Map.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_CONSUMER_MAP_H) -#define _CONSUMER_MAP_H - -#include "ace/Map_Manager.h" -#include "Concurrency_Strategies.h" -#include "Event.h" -#include "Consumer_Entry.h" - -class Consumer_Map -{ - // = TITLE - // Define a generic consumer map based on the ACE Map_Manager. - // - // = DESCRIPTION - // This class makes it easier to use the Map_Manager. -public: - int bind (Event_Addr event, Consumer_Entry *Consumer_Entry); - // Associate Event with the Consumer_Entry. - - int find (Event_Addr event, Consumer_Entry *&Consumer_Entry); - // Break any association of EXID. - - int unbind (Event_Addr event); - // Locate EXID and pass out parameter via INID. If found, - // return 0, else -1. - -public: - ACE_Map_Manager<Event_Addr, Consumer_Entry *, MAP_MUTEX> map_; - // Map that associates Event Addrs (external ids) with Consumer_Entry *'s - // <internal IDs>. -}; - -class Consumer_Map_Iterator -{ - // = TITLE - // Define an iterator for the Consumer Map. -public: - Consumer_Map_Iterator (Consumer_Map &mm); - int next (Consumer_Entry *&); - int advance (void); - -private: - ACE_Map_Iterator<Event_Addr, Consumer_Entry *, MAP_MUTEX> map_iter_; - // Map we are iterating over. -}; -#endif /* _CONSUMER_MAP_H */ diff --git a/apps/Gateway/Gateway/Dispatch_Set.h b/apps/Gateway/Gateway/Dispatch_Set.h deleted file mode 100644 index a867f1ca5ff..00000000000 --- a/apps/Gateway/Gateway/Dispatch_Set.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Dispatch_Set.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_DISPATCH_SET) -#define _DISPATCH_SET - -#include "ace/Set.h" - -// Forward reference. -class Proxy_Handler; - -typedef ACE_Unbounded_Set<Proxy_Handler *> Dispatch_Set; -typedef ACE_Unbounded_Set_Iterator<Proxy_Handler *> Dispatch_Set_Iterator; - -#endif /* _DISPATCH_SET */ diff --git a/apps/Gateway/Gateway/Event.h b/apps/Gateway/Gateway/Event.h deleted file mode 100644 index 5e288edf910..00000000000 --- a/apps/Gateway/Gateway/Event.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Event.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (EVENT) -#define EVENT - -#include "ace/OS.h" - -// This is the unique connection identifier that denotes a particular -// Proxy_Handler in the Gateway. -typedef ACE_INT32 ACE_INT32; - -class Event_Key - // = TITLE - // Address used to identify the source/destination of an event. - // - // = DESCRIPTION - // This is really a "virtual forwarding address" thatis used to - // decouple the filtering and forwarding logic of the Event - // Channel from the format of the data. -{ -public: - Event_Key (ACE_INT32 cid = -1, - u_char sid = 0, - u_char type = 0) - : conn_id_ (cid), - supplier_id_ (sid), - type_ (type) {} - - int operator== (const Event_Key &event_addr) const - { - return this->conn_id_ == event_addr.conn_id_ - && this->supplier_id_ == event_addr.supplier_id_ - && this->type_ == event_addr.type_; - } - - ACE_INT32 conn_id_; - // Unique connection identifier that denotes a particular - // Proxy_Handler. - - ACE_INT32 supplier_id_; - // Logical ID. - - ACE_INT32 type_; - // Event type. -}; - -class Event_Header - // = TITLE - // Fixed sized header. - // - // = DESCRIPTION - // This is designed to have a sizeof (16) to avoid alignment - // problems on most platforms. -{ -public: - typedef ACE_INT32 SUPPLIER_ID; - // Type used to forward events from gatewayd. - - enum - { - INVALID_ID = -1 // No peer can validly use this number. - }; - - void decode (void) - { - this->len_ = ntohl (this->len_); - this->supplier_id_ = ntohl (this->supplier_id_); - this->type_ = ntohl (this->type_); - this->priority_ = ntohl (this->priority_); - } - // Decode from network byte order to host byte order. - - void encode (void) - { - this->len_ = htonl (this->len_); - this->supplier_id_ = htonl (this->supplier_id_); - this->type_ = htonl (this->type_); - this->priority_ = htonl (this->priority_); - } - // Encode from host byte order to network byte order. - - size_t len_; - // Length of the data_ payload, in bytes. - - SUPPLIER_ID supplier_id_; - // Source ID. - - ACE_INT32 type_; - // Event type. - - ACE_INT32 priority_; - // Event priority. -}; - -class Event - // = TITLE - // Variable-sized event (data_ may be variable-sized between - // 0 and MAX_PAYLOAD_SIZE). -{ -public: - enum { MAX_PAYLOAD_SIZE = 1024 }; - // The maximum size of an Event. - - Event_Header header_; - // Event header. - - char data_[MAX_PAYLOAD_SIZE]; - // Event data. -}; - -#endif /* EVENT */ diff --git a/apps/Gateway/Gateway/Event_Channel.cpp b/apps/Gateway/Gateway/Event_Channel.cpp deleted file mode 100644 index 02f2cd465f8..00000000000 --- a/apps/Gateway/Gateway/Event_Channel.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -#define ACE_BUILD_SVC_DLL -#include "Proxy_Handler_Connector.h" -#include "Event_Channel.h" - -ACE_Event_Channel_Options::ACE_Event_Channel_Options (void) - : performance_window_ (0), - blocking_semantics_ (ACE_NONBLOCK), - socket_queue_size_ (0) -{ -} - -ACE_Event_Channel::~ACE_Event_Channel (void) -{ -} - -ACE_Event_Channel::ACE_Event_Channel (void) -{ -} - -ACE_Event_Channel_Options & -ACE_Event_Channel::options (void) -{ - return this->options_; -} - -ACE_Event_Channel::handle_timeout (const ACE_Time_Value &, - const void *) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) doing the performance timeout here...\n")); - CONNECTION_MAP_ITERATOR cmi (this->connection_map_); - - // If we've got a ACE_Thread Manager then use it to suspend all the - // threads. This will enable us to get an accurate count. - -#if defined (USE_OUTPUT_MT) || defined (USE_INPUT_MT) - if (ACE_Service_Config::thr_mgr ()->suspend_all () == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "suspend_all"), -1); - ACE_DEBUG ((LM_DEBUG, "(%t) suspending all threads...")); -#endif /* USE_INPUT_MT || USE_OUTPUT_MT */ - - size_t total_bytes_in = 0; - size_t total_bytes_out = 0; - - // Iterate through the connection map summing up the number of bytes - // sent/received. - - for (CONNECTION_MAP_ENTRY *me = 0; - cmi.next (me) != 0; - cmi.advance ()) - { - Proxy_Handler *proxy_handler = me->int_id_; - - if (proxy_handler->proxy_role () == 'C') - total_bytes_out += proxy_handler->total_bytes (); - else // proxy_handler->proxy_role () == 'S' - total_bytes_in += proxy_handler->total_bytes (); - } - -#if defined (ACE_NLOGGING) - ACE_OS::fprintf (stderr, "After %d seconds, \ntotal_bytes_in = %d\ntotal_bytes_out = %d\n", - performance_window_, - total_bytes_in, - total_bytes_out); - - ACE_OS::fprintf (stderr, "%f Mbits/sec received.\n", - (float) (total_bytes_in * 8 / (float) (1024*1024*this->performance_window_))); - - ACE_OS::fprintf (stderr, "%f Mbits/sec sent.\n", - (float) (total_bytes_out * 8 / (float) (1024*1024*this->performance_window_))); -#else - ACE_DEBUG ((LM_DEBUG, "(%t) after %d seconds, \ntotal_bytes_in = %d\ntotal_bytes_out = %d\n", - this->options ().performance_window_, - total_bytes_in, - total_bytes_out)); - ACE_DEBUG ((LM_DEBUG, "(%t) %f Mbits/sec received.\n", - (float) (total_bytes_in * 8 / (float) (1024 * 1024 * this->options ().performance_window_)))); - ACE_DEBUG ((LM_DEBUG, "(%t) %f Mbits/sec sent.\n", - (float) (total_bytes_out * 8 / (float) (1024 * 1024 * this->options ().performance_window_)))); -#endif /* ACE_NLOGGING */ - -#if defined (USE_INPUT_MT) || defined (USE_OUTPUT_MT) - ACE_DEBUG ((LM_DEBUG, "(%t) resuming all threads...")); - - // Resume all the threads again. - - if (ACE_Service_Config::thr_mgr ()->resume_all () == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "resume_all"), -1); -#endif /* USE_INPUT_MT || USE_OUTPUT_MT */ - - return 0; -} - -ACE_Event_Channel::put (ACE_Message_Block *forward_addr, - ACE_Time_Value *) -{ - // We got a valid event, so determine its virtual forwarding - // address, which is stored in the first of the two event blocks, - // which are chained together by this->recv(). - - Event_Key *forwarding_addr = (Event_Key *) forward_addr->rd_ptr (); - - // Skip over the address portion and get the data. - ACE_Message_Block *data = forward_addr->cont (); - - // <dispatch_set> points to the set of Consumers associated with - // this forwarding address. - Consumer_Dispatch_Set *dispatch_set = 0; - - if (this->efd_.find (*forwarding_addr, dispatch_set) == -1) - // Failure. - ACE_ERROR ((LM_DEBUG, - "(%t) find failed on conn id = %d, logical id = %d, type = %d\n", - forwarding_addr->conn_id_, - forwarding_addr->supplier_id_, - forwarding_addr->type_)); - else - { - // Check to see if there are any consumers. - if (dispatch_set->size () == 0) - ACE_DEBUG ((LM_WARNING, - "there are no active consumers for this event currently\n")); - - else // There are consumers, so forward the event. - { - Consumer_Dispatch_Set_Iterator dsi (*dispatch_set); - - // At this point, we should assign a thread-safe locking - // strategy to the Message_Block is we're running in a - // multi-threaded configuration. - // data->locking_strategy (MB_Locking_Strategy::instance ()); - - for (Proxy_Handler **proxy_handler = 0; - dsi.next (proxy_handler) != 0; - dsi.advance ()) - { - // Only process active proxy_handlers. - if ((*proxy_handler)->state () == Proxy_Handler::ESTABLISHED) - { - // Duplicate the event portion via reference - // counting. - ACE_Message_Block *dup_msg = data->duplicate (); - - ACE_DEBUG ((LM_DEBUG, "(%t) sending to peer %d\n", - (*proxy_handler)->id ())); - - if ((*proxy_handler)->put (dup_msg) == -1) - { - if (errno == EWOULDBLOCK) // The queue has filled up! - ACE_ERROR ((LM_ERROR, "(%t) %p\n", - "gateway is flow controlled, so we're dropping events")); - else - ACE_ERROR ((LM_ERROR, "(%t) %p transmission error to peer %d\n", - "put", (*proxy_handler)->id ())); - - // We are responsible for releasing an - // ACE_Message_Block if failures occur. - dup_msg->release (); - } - } - } - } - } - - // Release the memory in the message block. - forward_addr->release (); - return 0; -} - -ACE_Event_Channel::svc (void) -{ - return 0; -} - -int -ACE_Event_Channel::initiate_proxy_connection (Proxy_Handler *proxy_handler, - ACE_Synch_Options &synch_options) -{ - return this->connector_.initiate_connection (proxy_handler, - synch_options); -} - -int -ACE_Event_Channel::complete_proxy_connection (Proxy_Handler *proxy_handler) -{ - int option = proxy_handler->proxy_role () == 'S' ? SO_RCVBUF : SO_SNDBUF; - int socket_queue_size = this->options ().socket_queue_size_; - - if (proxy_handler->peer ().set_option (SOL_SOCKET, - option, - &socket_queue_size, - sizeof (int)) == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "set_option")); - - proxy_handler->thr_mgr (ACE_Service_Config::thr_mgr ()); - - // Our state is now "established." - proxy_handler->state (Proxy_Handler::ESTABLISHED); - - // Restart the timeout to 1. - proxy_handler->timeout (1); - - ACE_INT32 id = htonl (proxy_handler->id ()); - - // Send the connection id to the peerd. - - ssize_t n = proxy_handler->peer ().send ((const void *) &id, sizeof id); - - if (n != sizeof id) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - n == 0 ? "peer has closed down unexpectedly" : "send"), - -1); -} - -// Restart connection (blocking_semantics dicates whether we restart -// synchronously or asynchronously). - -int -ACE_Event_Channel::reinitiate_proxy_connection (Proxy_Handler *proxy_handler) -{ - // Skip over deactivated descriptors. - if (proxy_handler->get_handle () != ACE_INVALID_HANDLE) - { - // Make sure to close down peer to reclaim descriptor. - proxy_handler->peer ().close (); - - ACE_DEBUG ((LM_DEBUG, - "(%t) scheduling reinitiation of Proxy_Handler %d\n", - proxy_handler->id ())); - - // Reschedule ourselves to try and connect again. - if (ACE_Service_Config::reactor ()->schedule_timer - (proxy_handler, 0, proxy_handler->timeout ()) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - } - return 0; -} - -// Initiate connections with the Consumer and Supplier Peers. - -ACE_Event_Channel::initiate_connections (void) -{ - CONNECTION_MAP_ITERATOR cmi (this->connection_map_); - - ACE_Synch_Options synch_options; - - if (this->options ().blocking_semantics_ == ACE_NONBLOCK) - synch_options = ACE_Synch_Options::asynch; - else - synch_options = ACE_Synch_Options::synch; - - // Iterate through the Consumer Map connecting all the - // Proxy_Handlers. - - for (CONNECTION_MAP_ENTRY *me = 0; - cmi.next (me) != 0; - cmi.advance ()) - { - Proxy_Handler *proxy_handler = me->int_id_; - - if (this->initiate_proxy_connection - (proxy_handler, synch_options) == -1) - continue; // Failures are handled elsewhere... - } - - return 0; -} - -// This method gracefully shuts down all the Handlers in the -// Proxy_Handler Connection Map. - -ACE_Event_Channel::close (u_long) -{ -#if defined (USE_INPUT_MT) || defined (USE_OUTPUT_MT) - ACE_DEBUG ((LM_DEBUG, "(%t) suspending all threads\n")); - if (ACE_Service_Config::thr_mgr ()->suspend_all () == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "suspend_all"), -1); -#endif /* USE_INPUT_MT || USE_OUTPUT_MT */ - - CONNECTION_MAP_ITERATOR cmi (this->connection_map_); - - // Iterate over all the handlers and shut them down. - - for (CONNECTION_MAP_ENTRY *me; - cmi.next (me) != 0; - cmi.advance ()) - { - Proxy_Handler *proxy_handler = me->int_id_; - - ACE_DEBUG ((LM_DEBUG, "(%t) closing down connection %d\n", - proxy_handler->id ())); - - if (proxy_handler->state () != Proxy_Handler::IDLE) - // Mark Proxy_Handler as DISCONNECTING so we don't try to - // reconnect... - proxy_handler->state (Proxy_Handler::DISCONNECTING); - - // Deallocate Proxy_Handler resources. - proxy_handler->destroy (); // Will trigger a delete. - } - - return 0; -} - -int -ACE_Event_Channel::find_proxy (ACE_INT32 conn_id, - Proxy_Handler *&proxy_handler) -{ - return this->connection_map_.find (conn_id, proxy_handler); -} - -int -ACE_Event_Channel::bind_proxy (Proxy_Handler *proxy_handler) -{ - switch (this->connection_map_.bind (proxy_handler->id (), proxy_handler)) - { - case -1: - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) bind failed for connection %d\n", - proxy_handler->id ()), -1); - /* NOTREACHED */ - case 1: // Oops, found a duplicate! - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) duplicate connection %d, already bound\n", - proxy_handler->id ()), -1); - /* NOTREACHED */ - case 0: - // Success. - return 0; - } -} - -int -ACE_Event_Channel::subscribe (const Event_Key &event_addr, - Consumer_Dispatch_Set *cds) -{ - // Bind with consumer map, keyed by peer address. - switch (this->efd_.bind (event_addr, cds)) - { - case -1: - ACE_ERROR_RETURN ((LM_ERROR, "(%t) bind failed for connection %d\n", - event_addr.conn_id_), -1); - /* NOTREACHED */ - case 1: // Oops, found a duplicate! - ACE_ERROR_RETURN ((LM_DEBUG, "(%t) duplicate consumer map entry %d, " - "already bound\n", event_addr.conn_id_), -1); - /* NOTREACHED */ - case 0: - // Success. - return 0; - } -} - -ACE_Event_Channel::open (void *) -{ - // Ignore SIPPIPE so each Consumer_Proxy can handle it. - ACE_Sig_Action sig (ACE_SignalHandler (SIG_IGN), SIGPIPE); - -#if 0 - // If this->performance_window_ > 0 start a timer. - - if (this->options ().performance_window_ > 0) - { - if (ACE_Service_Config::reactor ()->schedule_timer - (this, 0, this->options ().performance_window_) == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "schedule_timer")); - else - ACE_DEBUG ((LM_DEBUG, "starting timer for %d seconds...\n", - this->options ().performance_window_))); - } -#endif - - return 0; -} diff --git a/apps/Gateway/Gateway/Event_Channel.h b/apps/Gateway/Gateway/Event_Channel.h deleted file mode 100644 index 1ecf468addf..00000000000 --- a/apps/Gateway/Gateway/Event_Channel.h +++ /dev/null @@ -1,125 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Event_Channel.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (ACE_EVENT_CHANNEL) -#define ACE_EVENT_CHANNEL - -#include "Proxy_Handler_Connector.h" - -class ACE_Svc_Export ACE_Event_Channel_Options - // = TITLE - // Maintains the options for an <ACE_Event_Channel>. -{ -public: - ACE_Event_Channel_Options (void); - // Initialization. - - int performance_window_; - // Number of seconds after connection establishment to report - // throughput. - - int blocking_semantics_; - // 0 == blocking connects, ACE_NONBLOCK == non-blocking connects. - - int socket_queue_size_; - // Size of the socket queue (0 means "use default"). -}; - -class ACE_Svc_Export ACE_Event_Channel : public ACE_Task<SYNCH_STRATEGY> - // = TITLE - // Define a generic Event_Channel. - // - // = DESCRIPTION -{ -public: - // = Initialization and termination methods. - ACE_Event_Channel (void); - ~ACE_Event_Channel (void); - - virtual int open (void * = 0); - // Open the channel. - - virtual int close (u_long = 0); - // Close down the Channel. - - // = Proxy management methods. - int initiate_proxy_connection (Proxy_Handler *, - ACE_Synch_Options & = ACE_Synch_Options::synch); - // Initiate the connection of the <Proxy_Handler> to its peer. - - int complete_proxy_connection (Proxy_Handler *); - // Complete the initialization of the <Proxy_Handler> once it's - // connected to its Peer. - - int reinitiate_proxy_connection (Proxy_Handler *); - // Reinitiate a connection asynchronously when the Peer fails. - - int bind_proxy (Proxy_Handler *); - // Bind the <Proxy_Handler> to the <connection_map_>. - - int find_proxy (ACE_INT32 conn_id, Proxy_Handler *&); - // Locate the <Proxy_Handler> with <conn_id>. - - int subscribe (const Event_Key &event_addr, - Consumer_Dispatch_Set *cds); - // Subscribe the <Consumer_Dispatch_Set> to receive events that - // match <Event_Key>. - - // = Event forwarding method. - virtual int put (ACE_Message_Block *mb, ACE_Time_Value * = 0); - // Pass <mb> to the Event Channel so it can forward it to Consumers. - - ACE_Event_Channel_Options &options (void); - // Points to the Event_Channel options. - - int initiate_connections (void); - // Initiate connections to the peers. - -private: - virtual int svc (void); - // Run as an active object. - - int parse_args (int argc, char *argv[]); - // Parse the command-line arguments. - - virtual int handle_timeout (const ACE_Time_Value &, - const void *arg); - // Perform timer-based performance profiling. - - Proxy_Handler_Connector connector_; - // Used to establish the connections actively. - - // Proxy_Handler_Acceptor acceptor_; - // Used to establish the connections passively. - - // = Make life easier by defining typedefs. - // Note that Proxy_Handler is assumed to the base class of - // SUPPLIER_PROXY and CONSUMER_PROXY. - typedef ACE_Map_Manager<ACE_INT32, Proxy_Handler *, MAP_MUTEX> CONNECTION_MAP; - typedef ACE_Map_Iterator<ACE_INT32, Proxy_Handler *, MAP_MUTEX> CONNECTION_MAP_ITERATOR; - typedef ACE_Map_Entry<ACE_INT32, Proxy_Handler *> CONNECTION_MAP_ENTRY; - - CONNECTION_MAP connection_map_; - // Table that maps Connection IDs to Proxy_Handler *'s. - - Event_Forwarding_Discriminator efd_; - // Map that associates an event to a set of Consumer_Proxy *'s. - - ACE_Event_Channel_Options options_; - // The options for the channel. -}; - -#endif /* ACE_EVENT_CHANNEL */ diff --git a/apps/Gateway/Gateway/Event_Forwarding_Discriminator.cpp b/apps/Gateway/Gateway/Event_Forwarding_Discriminator.cpp deleted file mode 100644 index 4dfbb658c1f..00000000000 --- a/apps/Gateway/Gateway/Event_Forwarding_Discriminator.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -#if !defined (_CONSUMER_MAP_C) -#define _CONSUMER_MAP_C - -#include "Event_Forwarding_Discriminator.h" - -// Bind the Event_Key to the INT_ID. - -int -Event_Forwarding_Discriminator::bind (Event_Key event_addr, - Consumer_Dispatch_Set *cds) -{ - return this->map_.bind (event_addr, cds); -} - -// Find the Consumer_Dispatch_Set corresponding to the Event_Key. - -int -Event_Forwarding_Discriminator::find (Event_Key event_addr, - Consumer_Dispatch_Set *&cds) -{ - return this->map_.find (event_addr, cds); -} - -// Unbind (remove) the Event_Key from the map. - -int -Event_Forwarding_Discriminator::unbind (Event_Key event_addr) -{ - return this->map_.unbind (event_addr); -} - -Event_Forwarding_Discriminator_Iterator::Event_Forwarding_Discriminator_Iterator - (Event_Forwarding_Discriminator &rt) - : map_iter_ (rt.map_) -{ -} - -int -Event_Forwarding_Discriminator_Iterator::next (Consumer_Dispatch_Set *&cds) -{ - ACE_Map_Entry<Event_Key, Consumer_Dispatch_Set *> *temp; - if (this->map_iter_.next (temp) == 0) - return 0; - else - { - cds = temp->int_id_; - return 1; - } -} - -int -Event_Forwarding_Discriminator_Iterator::advance (void) -{ - return this->map_iter_.advance (); -} -#endif /* _CONSUMER_MAP_C */ diff --git a/apps/Gateway/Gateway/Event_Forwarding_Discriminator.h b/apps/Gateway/Gateway/Event_Forwarding_Discriminator.h deleted file mode 100644 index 9b7531c1f46..00000000000 --- a/apps/Gateway/Gateway/Event_Forwarding_Discriminator.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Event_Forwarding_Discriminator.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_CONSUMER_MAP_H) -#define _CONSUMER_MAP_H - -#include "ace/Map_Manager.h" -#include "Concurrency_Strategies.h" -#include "Event.h" -#include "Consumer_Dispatch_Set.h" - -class Event_Forwarding_Discriminator -{ - // = TITLE - // Map events to the set of Consumer_Proxies that have subscribed - // to receive the event. -public: - int bind (Event_Key event, Consumer_Dispatch_Set *cds); - // Associate Event with the Consumer_Dispatch_Set. - - int unbind (Event_Key event); - // Locate EXID and pass out parameter via INID. If found, - // return 0, else -1. - - int find (Event_Key event, Consumer_Dispatch_Set *&cds); - // Break any association of EXID. - -public: - ACE_Map_Manager<Event_Key, Consumer_Dispatch_Set *, MAP_MUTEX> map_; - // Map that associates Event Addrs (external ids) with Consumer_Dispatch_Set *'s - // <internal IDs>. -}; - -class Event_Forwarding_Discriminator_Iterator -{ - // = TITLE - // Define an iterator for the Consumer Map. -public: - Event_Forwarding_Discriminator_Iterator (Event_Forwarding_Discriminator &mm); - int next (Consumer_Dispatch_Set *&); - int advance (void); - -private: - ACE_Map_Iterator<Event_Key, Consumer_Dispatch_Set *, MAP_MUTEX> map_iter_; - // Map we are iterating over. -}; -#endif /* _CONSUMER_MAP_H */ diff --git a/apps/Gateway/Gateway/File_Parser.cpp b/apps/Gateway/Gateway/File_Parser.cpp deleted file mode 100644 index 07bda87180b..00000000000 --- a/apps/Gateway/Gateway/File_Parser.cpp +++ /dev/null @@ -1,142 +0,0 @@ -#if !defined (FILE_PARSER_C) -// $Id$ - -#define FILE_PARSER_C - -#include "ace/OS.h" -#include "File_Parser.h" - -// This fixes a nasty bug with cfront-based compilers (like -// Centerline). -typedef FP::Return_Type FP_RETURN_TYPE; - -// File_Parser stuff. - -template <class ENTRY> int -File_Parser<ENTRY>::open (const char filename[]) -{ - this->infile_ = ACE_OS::fopen (filename, "r"); - if (this->infile_ == 0) - return -1; - else - return 0; -} - -template <class ENTRY> int -File_Parser<ENTRY>::close (void) -{ - return ACE_OS::fclose (this->infile_); -} - -template <class ENTRY> FP_RETURN_TYPE -File_Parser<ENTRY>::getword (char buf[]) -{ - return this->readword (buf); -} - -// Get the next string from the file via this->readword() -// Check make sure the string forms a valid number. -template <class ENTRY> FP_RETURN_TYPE -File_Parser<ENTRY>::getint (ACE_INT32 &value) -{ - char buf[BUFSIZ]; - FP_RETURN_TYPE read_result = this->readword(buf); - if (read_result == FP::SUCCESS) - { - // ptr is used for error checking with ACE_OS::strtol - char *ptr; - - // try to convert the buf to a decimal number - value = ACE_OS::strtol (buf, &ptr, 10); - - // check if the buf is a decimal or not - if (value == 0 && ptr == buf) - return FP::ERROR; - else - return FP::SUCCESS; - } - else - return read_result; -} - - -template <class ENTRY> FP_RETURN_TYPE -File_Parser<ENTRY>::readword (char buf[]) -{ - int wordlength = 0; - int c; - - // Skip over leading delimiters and get word. - - while ((c = getc (this->infile_)) != EOF && c != '\n') - if (this->delimiter (c)) - { - // We've reached the end of a "word". - if (wordlength > 0) - break; - } - else - buf[wordlength++] = c; - - buf[wordlength] = '\0'; - - if (c == EOF) { - // If EOF is just a delimiter, don't return EOF so that the word - // gets processed. - if (wordlength > 0) - { - ungetc (c, this->infile_); - return FP::SUCCESS; - } - else - // else return EOF so that read loops stop - return FP::EOFILE; - } - else if (c == '\n') - { - // if the EOLINE is just a delimiter, don't return EOLINE - // so that the word gets processed - if (wordlength > 0) - ungetc (c, this->infile_); - else - return FP::EOLINE; - } - - // Skip comments. - if (this->comments (buf[0])) - { - if (this->skipline () == EOF) - return FP::EOFILE; - else - return FP::COMMENT; - } - else - return FP::SUCCESS; -} - -template <class ENTRY> int -File_Parser<ENTRY>::delimiter (char ch) -{ - return ch == ' ' || ch == ',' || ch == '\t'; -} - -template <class ENTRY> int -File_Parser<ENTRY>::comments (char ch) -{ - return ch == '#'; -} - -template <class ENTRY> int -File_Parser<ENTRY>::skipline (void) -{ - // Skip the remainder of the line. - - int c; - - while ((c = getc (this->infile_)) != '\n' && c != EOF) - continue; - - return c; -} - -#endif /* _FILE_PARSER_C */ diff --git a/apps/Gateway/Gateway/File_Parser.h b/apps/Gateway/Gateway/File_Parser.h deleted file mode 100644 index f1de7429db0..00000000000 --- a/apps/Gateway/Gateway/File_Parser.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// File_Parser.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_FILE_PARSER) -#define _FILE_PARSER - -#include "ace/OS.h" - -class FP - // = TITLE - // This class serves as a namespace for the Return_Type -{ -public: - enum Return_Type - { - EOLINE, - EOFILE, - SUCCESS, - COMMENT, - ERROR - }; -}; - -template <class ENTRY> -class File_Parser - // = TITLE - // Class used to parse the configuration file for the Consumer - // Map. -{ -public: - // = Open and Close the file specified - int open (const char filename[]); - int close (void); - - virtual FP::Return_Type read_entry (ENTRY &, int &line_number) = 0; - // Implementations use protected methods to fill in the entry. - -protected: - FP::Return_Type getword (char buf[]); - // Read the next ASCII word. - - FP::Return_Type getint (ACE_INT32 &value); - // Read the next integer. - - FP::Return_Type readword (char buf[]); - int delimiter (char ch); - int comments (char ch); - int skipline (void); - - FILE *infile_; -}; - -#if defined (ACE_TEMPLATES_REQUIRE_SOURCE) -#include "File_Parser.cpp" -#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ - -#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) -#pragma implementation ("File_Parser.cpp") -#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ - -#endif /* _FILE_PARSER */ diff --git a/apps/Gateway/Gateway/Gateway.cpp b/apps/Gateway/Gateway/Gateway.cpp deleted file mode 100644 index 4ff09aed1b7..00000000000 --- a/apps/Gateway/Gateway/Gateway.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -#include "ace/Get_Opt.h" -#include "Config_Files.h" -#include "ace/Service_Config.h" -#include "Event_Channel.h" -#include "Gateway.h" - -class Gateway : public ACE_Service_Object - // = TITLE - // Integrates the whole Gateway application. - // - // = DESCRIPTION - // This implementation uses the <ACE_Event_Channel> as the basis - // for the <Gateway> routing. -{ -public: - // = Service configurator hooks. - virtual int init (int argc, char *argv[]); - // Perform initialization. - - virtual int fini (void); - // Perform termination. - - virtual int info (char **, size_t) const; - // Return info about this service. - - int parse_connection_config_file (void); - // Parse the connection configuration file. - - int parse_consumer_config_file (void); - // Parse the consumer configuration file. - -protected: - int handle_input (ACE_HANDLE); - // Shut down the Gateway when input comes in from the controlling - // console. - - int handle_signal (int signum, siginfo_t * = 0, ucontext_t * = 0); - // Shut down the Gateway when a signal arrives. - - int parse_args (int argc, char *argv[]); - // Parse gateway configuration arguments obtained from svc.conf - // file. - - char connection_config_file_[MAXPATHLEN + 1]; - // Name of the connection configuration file. - - char consumer_config_file_[MAXPATHLEN + 1]; - // Name of the consumer map configuration file. - - ACE_Event_Channel event_channel_; - // The Event Channel routes events from Supplier(s) to Consumer(s). - - int active_connector_role_; - // Enabled if we are playing the role of the active Connector. - - int debug_; - // Are we debugging? -}; - -int -Gateway::handle_signal (int signum, siginfo_t *, ucontext_t *) -{ - if (signum > 0) - ACE_DEBUG ((LM_DEBUG, "(%t) %S\n", signum)); - - // Shut down the main event loop. - ACE_Service_Config::end_reactor_event_loop (); - return 0; -} - -int -Gateway::handle_input (ACE_HANDLE h) -{ - if (ACE_Service_Config::reactor ()->remove_handler - (0, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::DONT_CALL) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "remove_handler"), -1); - - char buf[BUFSIZ]; - // Consume the input... - ACE_OS::read (h, buf, sizeof (buf)); - - // Shut us down. - return this->handle_signal (h); -} - -// Parse the "command-line" arguments and set the corresponding flags. - -int -Gateway::parse_args (int argc, char *argv[]) -{ - ACE_OS::strcpy (this->connection_config_file_, "connection_config"); - ACE_OS::strcpy (this->consumer_config_file_, "consumer_config"); - this->active_connector_role_ = 1; - this->debug_ = 0; - - ACE_Get_Opt get_opt (argc, argv, "bc:dpr:q:w:", 0); - - for (int c; (c = get_opt ()) != -1; ) - { - switch (c) - { - case 'b': // Use blocking connection establishment. - this->event_channel_.options ().blocking_semantics_ = 0; - break; - case 'c': - ACE_OS::strncpy (this->connection_config_file_, - get_opt.optarg, - sizeof this->connection_config_file_); - break; - case 'd': - this->debug_ = 1; - break; - case 'p': - // We are not playing the active Connector role. - this->active_connector_role_ = 0; - break; - case 'q': - this->event_channel_.options ().socket_queue_size_ = - ACE_OS::atoi (get_opt.optarg); - break; - case 'r': - ACE_OS::strncpy (this->consumer_config_file_, - get_opt.optarg, - sizeof this->consumer_config_file_); - break; - case 'w': // Time performance for a designated amount of time. - this->event_channel_.options ().performance_window_ = - ACE_OS::atoi (get_opt.optarg); - // Use blocking connection semantics so that we get accurate - // timings (since all connections start at once). - this->event_channel_.options ().blocking_semantics_ = 0; - break; - default: - break; - } - } - return 0; -} - -int -Gateway::init (int argc, char *argv[]) -{ - // Initialize the Event_Channel. - if (this->event_channel_.open () == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "open"), -1); - - // Parse the "command-line" arguments. - this->parse_args (argc, argv); - - ACE_Sig_Set sig_set; - sig_set.sig_add (SIGINT); - sig_set.sig_add (SIGQUIT); - - // Register ourselves to receive SIGINT and SIGQUIT so we can shut - // down gracefully via signals. - - if (ACE_Service_Config::reactor ()->register_handler - (sig_set, this) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "register_handler"), -1); - - if (ACE_Service_Config::reactor ()->register_handler - (0, this, ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "register_handler"), -1); - - if (this->active_connector_role_) - { - // Parse the connection configuration file. - this->parse_connection_config_file (); - - // Parse the consumer map config file and build the consumer - // map. - this->parse_consumer_config_file (); - - // Initiate connections with the peers. - this->event_channel_.initiate_connections (); - } - - return 0; -} - -// This method is automatically called when the gateway is shutdown. -// It closes down the Event Channel. - -int -Gateway::fini (void) -{ - this->event_channel_.close (); - return 0; -} - -// Returns information on the currently active service. - -int -Gateway::info (char **strp, size_t length) const -{ - char buf[BUFSIZ]; - - ACE_OS::sprintf (buf, "%s\t %s", "Gateway daemon", - "# Application-level gateway\n"); - - if (*strp == 0 && (*strp = ACE_OS::strdup (buf)) == 0) - return -1; - else - ACE_OS::strncpy (*strp, buf, length); - return ACE_OS::strlen (buf); -} - -// Parse and build the connection table. - -int -Gateway::parse_connection_config_file (void) -{ - // File that contains the consumer map configuration information. - Connection_Config_File_Parser connection_file; - Connection_Config_File_Entry entry; - int file_empty = 1; - int line_number = 0; - - if (connection_file.open (this->connection_config_file_) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", this->connection_config_file_), -1); - - // Read config file one line at a time. - while (connection_file.read_entry (entry, line_number) != FP::EOFILE) - { - file_empty = 0; - - if (this->debug_) - ACE_DEBUG ((LM_DEBUG, "(%t) conn id = %d, host = %s, remote port = %d, " - "proxy role = %c, max retry timeout = %d, local port = %d\n", - entry.conn_id_, - entry.host_, - entry.remote_port_, - entry.proxy_role_, - entry.max_retry_delay_, - entry.local_port_)); - - Proxy_Handler *proxy_handler = 0; - - // Initialize the entry's peer addressing info. - - ACE_INET_Addr remote_addr (entry.remote_port_, entry.host_); - ACE_INET_Addr local_addr (entry.local_port_); - - // The next few lines of code are dependent on whether we are - // making an Supplier_Proxy or an Consumer_Proxy. - - if (entry.proxy_role_ == 'C') // Configure a Consumer_Proxy. - ACE_NEW_RETURN (proxy_handler, - CONSUMER_PROXY (this->event_channel_, remote_addr, - local_addr, entry.conn_id_), - -1); - else // proxy_role == 'S', so configure a Supplier_Proxy. - ACE_NEW_RETURN (proxy_handler, - SUPPLIER_PROXY (this->event_channel_, remote_addr, - local_addr, entry.conn_id_), - -1); - - // The following code is common to both Supplier_Proxys_ and - // Consumer_Proxys. - - // Initialize max timeout. - proxy_handler->max_timeout (entry.max_retry_delay_); - - // Bind the new Proxy_Handler to the connection ID. - this->event_channel_.bind_proxy (proxy_handler); - } - - if (file_empty) - ACE_ERROR ((LM_WARNING, - "warning: connection proxy_handler configuration file was empty\n")); - return 0; -} - -int -Gateway::parse_consumer_config_file (void) -{ - // File that contains the consumer event forwarding information. - Consumer_Config_File_Parser consumer_file; - Consumer_Config_File_Entry entry; - int file_empty = 1; - int line_number = 0; - - if (consumer_file.open (this->consumer_config_file_) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", this->consumer_config_file_), -1); - - // Read config file line at a time. - while (consumer_file.read_entry (entry, line_number) != FP::EOFILE) - { - file_empty = 0; - - if (this->debug_) - { - ACE_DEBUG ((LM_DEBUG, "(%t) conn id = %d, logical id = %d, payload = %d, " - "number of consumers = %d\n", - entry.conn_id_, - entry.supplier_id_, - entry.type_, - entry.total_consumers_)); - for (int i = 0; i < entry.total_consumers_; i++) - ACE_DEBUG ((LM_DEBUG, "(%t) destination[%d] = %d\n", - i, entry.consumers_[i])); - } - - Consumer_Dispatch_Set *dispatch_set; - ACE_NEW_RETURN (dispatch_set, Consumer_Dispatch_Set, -1); - - Event_Key event_addr (entry.conn_id_, - entry.supplier_id_, - entry.type_); - - // Add the Consumers to the Dispatch_Set. - for (int i = 0; i < entry.total_consumers_; i++) - { - Proxy_Handler *proxy_handler = 0; - - // Lookup destination and add to Consumer_Dispatch_Set set - // if found. - if (this->event_channel_.find_proxy (entry.consumers_[i], - proxy_handler) != -1) - dispatch_set->insert (proxy_handler); - else - ACE_ERROR ((LM_ERROR, "(%t) not found: destination[%d] = %d\n", - i, entry.consumers_[i])); - } - - this->event_channel_.subscribe (event_addr, dispatch_set); - } - - if (file_empty) - ACE_ERROR ((LM_WARNING, - "warning: consumer map configuration file was empty\n")); - return 0; -} - -// The following is a "Factory" used by the ACE_Service_Config and -// svc.conf file to dynamically initialize the state of the Gateway. - -ACE_SVC_FACTORY_DEFINE (Gateway) diff --git a/apps/Gateway/Gateway/Gateway.h b/apps/Gateway/Gateway/Gateway.h deleted file mode 100644 index 057ce981701..00000000000 --- a/apps/Gateway/Gateway/Gateway.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Gateway.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (ACE_GATEWAY) -#define ACE_GATEWAY - -#include "ace/OS.h" - -ACE_SVC_FACTORY_DECLARE (Gateway) - -#endif /* ACE_GATEWAY */ - diff --git a/apps/Gateway/Gateway/IO_Handler_Connector.cpp b/apps/Gateway/Gateway/IO_Handler_Connector.cpp deleted file mode 100644 index 712b348951d..00000000000 --- a/apps/Gateway/Gateway/IO_Handler_Connector.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include "IO_Handler_Connector.h" -// $Id$ - - -IO_Handler_Connector::IO_Handler_Connector (void) -{ -} - -// Override the connection-failure method to add timer support. -// Note that these timers perform "expoential backoff" to -// avoid rapidly trying to reestablish connections when a link -// goes down. - -int -IO_Handler_Connector::handle_close (ACE_HANDLE sd, ACE_Reactor_Mask) -{ - ACE_Connector<IO_Handler, ACE_SOCK_CONNECTOR>::AST *stp = 0; - - // Locate the ACE_Svc_Handler corresponding to the socket descriptor. - if (this->handler_map_.find (sd, stp) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) can't locate channel %d in map, %p\n", - sd, "find"), -1); - - IO_Handler *channel = stp->svc_handler (); - - // Schedule a reconnection request at some point in the future - // (note that channel uses an exponential backoff scheme). - if (ACE_Service_Config::reactor ()->schedule_timer (channel, 0, - channel->timeout ()) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - return 0; -} - -// Initiate (or reinitiate) a connection to the IO_Handler. - -int -IO_Handler_Connector::initiate_connection (IO_Handler *channel, - ACE_Synch_Options &synch_options) -{ - char buf[MAXHOSTNAMELEN]; - - // Mark ourselves as idle so that the various iterators - // will ignore us until we are reconnected. - channel->state (IO_Handler::IDLE); - - if (channel->remote_addr ().addr_to_string (buf, sizeof buf) == -1 - || channel->local_addr ().addr_to_string (buf, sizeof buf) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "can't obtain peer's address"), -1); - - // Try to connect to the Peer. - - if (this->connect (channel, channel->remote_addr (), - synch_options, channel->local_addr ()) == -1) - { - if (errno != EWOULDBLOCK) - { - channel->state (IO_Handler::FAILED); - ACE_DEBUG ((LM_DEBUG, "(%t) %p on address %s\n", - "connect", buf)); - - // Reschedule ourselves to try and connect again. - if (synch_options[ACE_Synch_Options::USE_REACTOR]) - { - if (ACE_Service_Config::reactor ()->schedule_timer - (channel, 0, channel->timeout ()) == 0) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - } - else - // Failures on synchronous connects are reported as errors - // so that the caller can decide how to proceed. - return -1; - } - else - { - channel->state (IO_Handler::CONNECTING); - ACE_DEBUG ((LM_DEBUG, - "(%t) in the process of connecting %s to %s\n", - synch_options[ACE_Synch_Options::USE_REACTOR] - ? "asynchronously" : "synchronously", buf)); - } - } - else - { - channel->state (IO_Handler::ESTABLISHED); - ACE_DEBUG ((LM_DEBUG, "(%t) connected to %s on %d\n", - buf, channel->get_handle ())); - } - return 0; -} diff --git a/apps/Gateway/Gateway/IO_Handler_Connector.h b/apps/Gateway/Gateway/IO_Handler_Connector.h deleted file mode 100644 index 585428c88ee..00000000000 --- a/apps/Gateway/Gateway/IO_Handler_Connector.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// IO_Handler_Connector.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_IO_HANDLER_CONNECTOR) -#define _IO_HANDLER_CONNECTOR - -#include "ace/Connector.h" -#include "Thr_IO_Handler.h" - -class IO_Handler_Connector : public ACE_Connector<IO_Handler, ACE_SOCK_CONNECTOR> - // = TITLE - // A concrete factory class that setups connections to peerds - // and produces a new IO_Handler object to do the dirty work... -{ -public: - IO_Handler_Connector (void); - - // Initiate (or reinitiate) a connection on the IO_Handler. - int initiate_connection (IO_Handler *, - ACE_Synch_Options & = ACE_Synch_Options::synch); - -protected: - // Override the connection-failure method to add timer support. - virtual int handle_close (ACE_HANDLE sd, ACE_Reactor_Mask); -}; - -#endif /* _IO_HANDLER_CONNECTOR */ diff --git a/apps/Gateway/Gateway/Makefile b/apps/Gateway/Gateway/Makefile deleted file mode 100644 index c3ae8dffe4d..00000000000 --- a/apps/Gateway/Gateway/Makefile +++ /dev/null @@ -1,454 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Gateway. -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -BIN = gatewayd -LIB = libGateway.a -SHLIB = libGateway.so - -FILES = Config_Files \ - File_Parser \ - Gateway \ - Event_Channel \ - Event_Forwarding_Discriminator \ - Proxy_Handler \ - Proxy_Handler_Connector \ - Thr_Proxy_Handler - -LSRC = $(addsuffix .cpp,$(FILES)) -LOBJ = $(addsuffix .o,$(FILES)) -SHOBJ = $(addsuffix .so,$(FILES)) - -LDLIBS = -lGateway -LIBS = -lACE - -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -BUILD = $(VLIB) $(VSHLIB) $(SHLIBA) $(VBIN) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nonested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.lib.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.bin.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.local.GNU - -#---------------------------------------------------------------------------- -# Local targets -#---------------------------------------------------------------------------- - -# Default behavior is to use single-threading. See the README -# file for information on how to configure this with multiple -# strategies for threading the input and output channels. -# DEFFLAGS += -DUSE_OUTPUT_MT -DUSE_INPUT_MT - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -.obj/Config_Files.o .shobj/Config_Files.so: Config_Files.cpp \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - Config_Files.h File_Parser.h -.obj/File_Parser.o .shobj/File_Parser.so: File_Parser.cpp \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - File_Parser.h -.obj/Gateway.o .shobj/Gateway.so: Gateway.cpp \ - $(WRAPPER_ROOT)/ace/Service_Config.h \ - $(WRAPPER_ROOT)/ace/Service_Object.h \ - $(WRAPPER_ROOT)/ace/Shared_Object.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - $(WRAPPER_ROOT)/ace/Thread_Manager.h \ - $(WRAPPER_ROOT)/ace/Thread.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Signal.h \ - $(WRAPPER_ROOT)/ace/Set.h \ - $(WRAPPER_ROOT)/ace/Reactor.h \ - $(WRAPPER_ROOT)/ace/Handle_Set.h \ - $(WRAPPER_ROOT)/ace/Timer_Queue.h \ - $(WRAPPER_ROOT)/ace/Token.h \ - $(WRAPPER_ROOT)/ace/Pipe.h \ - $(WRAPPER_ROOT)/ace/Pipe.i \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.h \ - $(WRAPPER_ROOT)/ace/SOCK_IO.h \ - $(WRAPPER_ROOT)/ace/SOCK.h \ - $(WRAPPER_ROOT)/ace/Addr.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.i \ - $(WRAPPER_ROOT)/ace/SOCK.i \ - $(WRAPPER_ROOT)/ace/SOCK_IO.i \ - $(WRAPPER_ROOT)/ace/INET_Addr.h \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.i \ - $(WRAPPER_ROOT)/ace/Reactor.i \ - $(WRAPPER_ROOT)/ace/Proactor.h \ - $(WRAPPER_ROOT)/ace/Message_Block.h \ - $(WRAPPER_ROOT)/ace/Malloc.h \ - $(WRAPPER_ROOT)/ace/Malloc_T.h \ - $(WRAPPER_ROOT)/ace/Memory_Pool.h \ - $(WRAPPER_ROOT)/ace/Mem_Map.h \ - $(WRAPPER_ROOT)/ace/ReactorEx.h \ - $(WRAPPER_ROOT)/ace/Message_Queue.h \ - $(WRAPPER_ROOT)/ace/IO_Cntl_Msg.h \ - $(WRAPPER_ROOT)/ace/Strategies.h \ - $(WRAPPER_ROOT)/ace/Strategies_T.h \ - $(WRAPPER_ROOT)/ace/Svc_Conf_Tokens.h \ - Event_Channel.h Proxy_Handler_Connector.h \ - $(WRAPPER_ROOT)/ace/Connector.h \ - $(WRAPPER_ROOT)/ace/Map_Manager.h \ - $(WRAPPER_ROOT)/ace/Svc_Handler.h \ - $(WRAPPER_ROOT)/ace/Synch_Options.h \ - $(WRAPPER_ROOT)/ace/Task.h \ - $(WRAPPER_ROOT)/ace/Task_T.h \ - $(WRAPPER_ROOT)/ace/Connector.i \ - Thr_Proxy_Handler.h Proxy_Handler.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.i \ - Event_Forwarding_Discriminator.h Concurrency_Strategies.h Event.h \ - Consumer_Dispatch_Set.h Gateway.h -.obj/Event_Channel.o .shobj/Event_Channel.so: Event_Channel.cpp \ - $(WRAPPER_ROOT)/ace/Get_Opt.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/ACE.i \ - Config_Files.h File_Parser.h Proxy_Handler_Connector.h \ - $(WRAPPER_ROOT)/ace/Connector.h \ - $(WRAPPER_ROOT)/ace/Service_Config.h \ - $(WRAPPER_ROOT)/ace/Service_Object.h \ - $(WRAPPER_ROOT)/ace/Shared_Object.h \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - $(WRAPPER_ROOT)/ace/Thread_Manager.h \ - $(WRAPPER_ROOT)/ace/Thread.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Signal.h \ - $(WRAPPER_ROOT)/ace/Set.h \ - $(WRAPPER_ROOT)/ace/Reactor.h \ - $(WRAPPER_ROOT)/ace/Handle_Set.h \ - $(WRAPPER_ROOT)/ace/Timer_Queue.h \ - $(WRAPPER_ROOT)/ace/Token.h \ - $(WRAPPER_ROOT)/ace/Pipe.h \ - $(WRAPPER_ROOT)/ace/Pipe.i \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.h \ - $(WRAPPER_ROOT)/ace/SOCK_IO.h \ - $(WRAPPER_ROOT)/ace/SOCK.h \ - $(WRAPPER_ROOT)/ace/Addr.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.i \ - $(WRAPPER_ROOT)/ace/SOCK.i \ - $(WRAPPER_ROOT)/ace/SOCK_IO.i \ - $(WRAPPER_ROOT)/ace/INET_Addr.h \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.i \ - $(WRAPPER_ROOT)/ace/Reactor.i \ - $(WRAPPER_ROOT)/ace/Proactor.h \ - $(WRAPPER_ROOT)/ace/Message_Block.h \ - $(WRAPPER_ROOT)/ace/Malloc.h \ - $(WRAPPER_ROOT)/ace/Malloc_T.h \ - $(WRAPPER_ROOT)/ace/Memory_Pool.h \ - $(WRAPPER_ROOT)/ace/Mem_Map.h \ - $(WRAPPER_ROOT)/ace/ReactorEx.h \ - $(WRAPPER_ROOT)/ace/Message_Queue.h \ - $(WRAPPER_ROOT)/ace/IO_Cntl_Msg.h \ - $(WRAPPER_ROOT)/ace/Strategies.h \ - $(WRAPPER_ROOT)/ace/Strategies_T.h \ - $(WRAPPER_ROOT)/ace/Svc_Conf_Tokens.h \ - $(WRAPPER_ROOT)/ace/Map_Manager.h \ - $(WRAPPER_ROOT)/ace/Svc_Handler.h \ - $(WRAPPER_ROOT)/ace/Synch_Options.h \ - $(WRAPPER_ROOT)/ace/Task.h \ - $(WRAPPER_ROOT)/ace/Task_T.h \ - $(WRAPPER_ROOT)/ace/Connector.i \ - Thr_Proxy_Handler.h Proxy_Handler.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.i \ - Event_Forwarding_Discriminator.h Concurrency_Strategies.h Event.h \ - Consumer_Dispatch_Set.h Event_Channel.h -.obj/Event_Forwarding_Discriminator.o .shobj/Event_Forwarding_Discriminator.so: Event_Forwarding_Discriminator.cpp \ - Event_Forwarding_Discriminator.h \ - $(WRAPPER_ROOT)/ace/Map_Manager.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/ACE.i \ - Concurrency_Strategies.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - Event.h Consumer_Dispatch_Set.h \ - $(WRAPPER_ROOT)/ace/Set.h -.obj/Proxy_Handler.o .shobj/Proxy_Handler.so: Proxy_Handler.cpp Consumer_Dispatch_Set.h \ - $(WRAPPER_ROOT)/ace/Set.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/ACE.i \ - Proxy_Handler_Connector.h \ - $(WRAPPER_ROOT)/ace/Connector.h \ - $(WRAPPER_ROOT)/ace/Service_Config.h \ - $(WRAPPER_ROOT)/ace/Service_Object.h \ - $(WRAPPER_ROOT)/ace/Shared_Object.h \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - $(WRAPPER_ROOT)/ace/Thread_Manager.h \ - $(WRAPPER_ROOT)/ace/Thread.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Signal.h \ - $(WRAPPER_ROOT)/ace/Reactor.h \ - $(WRAPPER_ROOT)/ace/Handle_Set.h \ - $(WRAPPER_ROOT)/ace/Timer_Queue.h \ - $(WRAPPER_ROOT)/ace/Token.h \ - $(WRAPPER_ROOT)/ace/Pipe.h \ - $(WRAPPER_ROOT)/ace/Pipe.i \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.h \ - $(WRAPPER_ROOT)/ace/SOCK_IO.h \ - $(WRAPPER_ROOT)/ace/SOCK.h \ - $(WRAPPER_ROOT)/ace/Addr.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.i \ - $(WRAPPER_ROOT)/ace/SOCK.i \ - $(WRAPPER_ROOT)/ace/SOCK_IO.i \ - $(WRAPPER_ROOT)/ace/INET_Addr.h \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.i \ - $(WRAPPER_ROOT)/ace/Reactor.i \ - $(WRAPPER_ROOT)/ace/Proactor.h \ - $(WRAPPER_ROOT)/ace/Message_Block.h \ - $(WRAPPER_ROOT)/ace/Malloc.h \ - $(WRAPPER_ROOT)/ace/Malloc_T.h \ - $(WRAPPER_ROOT)/ace/Memory_Pool.h \ - $(WRAPPER_ROOT)/ace/Mem_Map.h \ - $(WRAPPER_ROOT)/ace/ReactorEx.h \ - $(WRAPPER_ROOT)/ace/Message_Queue.h \ - $(WRAPPER_ROOT)/ace/IO_Cntl_Msg.h \ - $(WRAPPER_ROOT)/ace/Strategies.h \ - $(WRAPPER_ROOT)/ace/Strategies_T.h \ - $(WRAPPER_ROOT)/ace/Svc_Conf_Tokens.h \ - $(WRAPPER_ROOT)/ace/Map_Manager.h \ - $(WRAPPER_ROOT)/ace/Svc_Handler.h \ - $(WRAPPER_ROOT)/ace/Synch_Options.h \ - $(WRAPPER_ROOT)/ace/Task.h \ - $(WRAPPER_ROOT)/ace/Task_T.h \ - $(WRAPPER_ROOT)/ace/Connector.i \ - Thr_Proxy_Handler.h Proxy_Handler.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.i \ - Event_Forwarding_Discriminator.h Concurrency_Strategies.h Event.h -.obj/Proxy_Handler_Connector.o .shobj/Proxy_Handler_Connector.so: Proxy_Handler_Connector.cpp \ - Proxy_Handler_Connector.h \ - $(WRAPPER_ROOT)/ace/Connector.h \ - $(WRAPPER_ROOT)/ace/Service_Config.h \ - $(WRAPPER_ROOT)/ace/Service_Object.h \ - $(WRAPPER_ROOT)/ace/Shared_Object.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - $(WRAPPER_ROOT)/ace/Thread_Manager.h \ - $(WRAPPER_ROOT)/ace/Thread.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Signal.h \ - $(WRAPPER_ROOT)/ace/Set.h \ - $(WRAPPER_ROOT)/ace/Reactor.h \ - $(WRAPPER_ROOT)/ace/Handle_Set.h \ - $(WRAPPER_ROOT)/ace/Timer_Queue.h \ - $(WRAPPER_ROOT)/ace/Token.h \ - $(WRAPPER_ROOT)/ace/Pipe.h \ - $(WRAPPER_ROOT)/ace/Pipe.i \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.h \ - $(WRAPPER_ROOT)/ace/SOCK_IO.h \ - $(WRAPPER_ROOT)/ace/SOCK.h \ - $(WRAPPER_ROOT)/ace/Addr.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.i \ - $(WRAPPER_ROOT)/ace/SOCK.i \ - $(WRAPPER_ROOT)/ace/SOCK_IO.i \ - $(WRAPPER_ROOT)/ace/INET_Addr.h \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.i \ - $(WRAPPER_ROOT)/ace/Reactor.i \ - $(WRAPPER_ROOT)/ace/Proactor.h \ - $(WRAPPER_ROOT)/ace/Message_Block.h \ - $(WRAPPER_ROOT)/ace/Malloc.h \ - $(WRAPPER_ROOT)/ace/Malloc_T.h \ - $(WRAPPER_ROOT)/ace/Memory_Pool.h \ - $(WRAPPER_ROOT)/ace/Mem_Map.h \ - $(WRAPPER_ROOT)/ace/ReactorEx.h \ - $(WRAPPER_ROOT)/ace/Message_Queue.h \ - $(WRAPPER_ROOT)/ace/IO_Cntl_Msg.h \ - $(WRAPPER_ROOT)/ace/Strategies.h \ - $(WRAPPER_ROOT)/ace/Strategies_T.h \ - $(WRAPPER_ROOT)/ace/Svc_Conf_Tokens.h \ - $(WRAPPER_ROOT)/ace/Map_Manager.h \ - $(WRAPPER_ROOT)/ace/Svc_Handler.h \ - $(WRAPPER_ROOT)/ace/Synch_Options.h \ - $(WRAPPER_ROOT)/ace/Task.h \ - $(WRAPPER_ROOT)/ace/Task_T.h \ - $(WRAPPER_ROOT)/ace/Connector.i \ - Thr_Proxy_Handler.h Proxy_Handler.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.i \ - Event_Forwarding_Discriminator.h Concurrency_Strategies.h Event.h \ - Consumer_Dispatch_Set.h -.obj/Thr_Proxy_Handler.o .shobj/Thr_Proxy_Handler.so: Thr_Proxy_Handler.cpp Thr_Proxy_Handler.h \ - Proxy_Handler.h \ - $(WRAPPER_ROOT)/ace/Service_Config.h \ - $(WRAPPER_ROOT)/ace/Service_Object.h \ - $(WRAPPER_ROOT)/ace/Shared_Object.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - $(WRAPPER_ROOT)/ace/Thread_Manager.h \ - $(WRAPPER_ROOT)/ace/Thread.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Signal.h \ - $(WRAPPER_ROOT)/ace/Set.h \ - $(WRAPPER_ROOT)/ace/Reactor.h \ - $(WRAPPER_ROOT)/ace/Handle_Set.h \ - $(WRAPPER_ROOT)/ace/Timer_Queue.h \ - $(WRAPPER_ROOT)/ace/Token.h \ - $(WRAPPER_ROOT)/ace/Pipe.h \ - $(WRAPPER_ROOT)/ace/Pipe.i \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.h \ - $(WRAPPER_ROOT)/ace/SOCK_IO.h \ - $(WRAPPER_ROOT)/ace/SOCK.h \ - $(WRAPPER_ROOT)/ace/Addr.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.i \ - $(WRAPPER_ROOT)/ace/SOCK.i \ - $(WRAPPER_ROOT)/ace/SOCK_IO.i \ - $(WRAPPER_ROOT)/ace/INET_Addr.h \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.i \ - $(WRAPPER_ROOT)/ace/Reactor.i \ - $(WRAPPER_ROOT)/ace/Proactor.h \ - $(WRAPPER_ROOT)/ace/Message_Block.h \ - $(WRAPPER_ROOT)/ace/Malloc.h \ - $(WRAPPER_ROOT)/ace/Malloc_T.h \ - $(WRAPPER_ROOT)/ace/Memory_Pool.h \ - $(WRAPPER_ROOT)/ace/Mem_Map.h \ - $(WRAPPER_ROOT)/ace/ReactorEx.h \ - $(WRAPPER_ROOT)/ace/Message_Queue.h \ - $(WRAPPER_ROOT)/ace/IO_Cntl_Msg.h \ - $(WRAPPER_ROOT)/ace/Strategies.h \ - $(WRAPPER_ROOT)/ace/Strategies_T.h \ - $(WRAPPER_ROOT)/ace/Svc_Conf_Tokens.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.h \ - $(WRAPPER_ROOT)/ace/SOCK_Connector.i \ - $(WRAPPER_ROOT)/ace/Svc_Handler.h \ - $(WRAPPER_ROOT)/ace/Synch_Options.h \ - $(WRAPPER_ROOT)/ace/Task.h \ - $(WRAPPER_ROOT)/ace/Task_T.h \ - Event_Forwarding_Discriminator.h \ - $(WRAPPER_ROOT)/ace/Map_Manager.h \ - Concurrency_Strategies.h Event.h Consumer_Dispatch_Set.h \ - Proxy_Handler_Connector.h \ - $(WRAPPER_ROOT)/ace/Connector.h \ - $(WRAPPER_ROOT)/ace/Connector.i - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/apps/Gateway/Gateway/Peer_Message.h b/apps/Gateway/Gateway/Peer_Message.h deleted file mode 100644 index d9e65650095..00000000000 --- a/apps/Gateway/Gateway/Peer_Message.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Peer_Message.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (PEER_MESSAGE) -#define PEER_MESSAGE - -// This is the unique connection identifier that denotes a particular -// Channel in the Gateway. -typedef short CONN_ID; - -class Peer_Addr - // = TITLE - // Peer address is used to identify the source/destination of a - // routing message. -{ -public: - Peer_Addr (CONN_ID cid = -1, u_char lid = 0, u_char pay = 0) - : conn_id_ (cid), logical_id_ (lid), payload_ (pay) {} - - int operator== (const Peer_Addr &pa) const - { - return this->conn_id_ == pa.conn_id_ - && this->logical_id_ == pa.logical_id_ - && this->payload_ == pa.payload_; - } - - CONN_ID conn_id_; - // Unique connection identifier that denotes a particular Channel. - - u_char logical_id_; - // Logical ID. - - u_char payload_; - // Payload type. -}; - - -class Peer_Header - // = TITLE - // Fixed sized header. -{ -public: - typedef u_short ROUTING_ID; - // Type used to route messages from gatewayd. - - enum - { - INVALID_ID = -1 // No peer can validly use this number. - }; - - ROUTING_ID routing_id_; - // Source ID. - - size_t len_; - // Length of the message in bytes. -}; - -class Peer_Message - // = TITLE - // Variable-sized message (buf_ may be variable-sized between - // 0 and MAX_PAYLOAD_SIZE). -{ -public: - enum { MAX_PAYLOAD_SIZE = 1024 }; - // The maximum size of an Peer message (see Peer protocol specs for - // exact #). - - Peer_Header header_; - // Message header. - - char buf_[MAX_PAYLOAD_SIZE]; - // Message payload. -}; - -#endif /* PEER_MESSAGE */ diff --git a/apps/Gateway/Gateway/Proxy_Handler.cpp b/apps/Gateway/Gateway/Proxy_Handler.cpp deleted file mode 100644 index 2f161c171f6..00000000000 --- a/apps/Gateway/Gateway/Proxy_Handler.cpp +++ /dev/null @@ -1,581 +0,0 @@ -// $Id$ - -#include "Event_Channel.h" - -void -Proxy_Handler::id (ACE_INT32 id) -{ - this->id_ = id; -} - -ACE_INT32 -Proxy_Handler::id (void) -{ - return this->id_; -} - -// The total number of bytes sent/received on this Proxy. - -size_t -Proxy_Handler::total_bytes (void) -{ - return this->total_bytes_; -} - -void -Proxy_Handler::total_bytes (size_t bytes) -{ - this->total_bytes_ += bytes; -} - -Proxy_Handler::Proxy_Handler (ACE_Event_Channel &ec, - const ACE_INET_Addr &remote_addr, - const ACE_INET_Addr &local_addr, - ACE_INT32 conn_id) - : remote_addr_ (remote_addr), - local_addr_ (local_addr), - id_ (conn_id), - total_bytes_ (0), - state_ (Proxy_Handler::IDLE), - timeout_ (1), - max_timeout_ (Proxy_Handler::MAX_RETRY_TIMEOUT), - event_channel_ (ec) -{ -} - -// Set the proxy_role. - -void -Proxy_Handler::proxy_role (char d) -{ - this->proxy_role_ = d; -} - -// Get the proxy_role. - -char -Proxy_Handler::proxy_role (void) -{ - return this->proxy_role_; -} - -// Sets the timeout delay. - -void -Proxy_Handler::timeout (int to) -{ - if (to > this->max_timeout_) - to = this->max_timeout_; - - this->timeout_ = to; -} - -// Re-calculate the current retry timeout delay using exponential -// backoff. Returns the original timeout (i.e., before the -// re-calculation). - -int -Proxy_Handler::timeout (void) -{ - int old_timeout = this->timeout_; - this->timeout_ *= 2; - - if (this->timeout_ > this->max_timeout_) - this->timeout_ = this->max_timeout_; - - return old_timeout; -} - -// Sets the max timeout delay. - -void -Proxy_Handler::max_timeout (int mto) -{ - this->max_timeout_ = mto; -} - -// Gets the max timeout delay. - -int -Proxy_Handler::max_timeout (void) -{ - return this->max_timeout_; -} - -// Restart connection asynchronously when timeout occurs. - -int -Proxy_Handler::handle_timeout (const ACE_Time_Value &, - const void *) -{ - ACE_DEBUG ((LM_DEBUG, - "(%t) attempting to reconnect Proxy_Handler %d with timeout = %d\n", - this->id (), this->timeout_)); - - // Delegate the re-connection attempt to the Event Channel. - return this->event_channel_.initiate_proxy_connection - (this, ACE_Synch_Options::asynch); -} - -// Handle shutdown of the Proxy_Handler object. - -int -Proxy_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - ACE_DEBUG ((LM_DEBUG, - "(%t) shutting down Proxy_Handler %d on handle %d\n", - this->id (), this->get_handle ())); - - // Restart the connection, if possible. - return this->event_channel_.reinitiate_proxy_connection (this); -} - -// Set the state of the Proxy. - -void -Proxy_Handler::state (Proxy_Handler::State s) -{ - this->state_ = s; -} - -// Upcall from the <ACE_Acceptor> or <ACE_Connector> that delegates -// control to our Proxy_Handler. - -int -Proxy_Handler::open (void *) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) Proxy_Handler's handle = %d\n", - this->peer ().get_handle ())); - - // Turn on non-blocking I/O. - if (this->peer ().enable (ACE_NONBLOCK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enable"), -1); - - // Call back to the <Event_Channel> to complete our initialization. - else if (this->event_channel_.complete_proxy_connection (this) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "complete_proxy_connection"), -1); - - // Register ourselves to receive input events. - else if (ACE_Service_Config::reactor ()->register_handler - (this, ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "register_handler"), -1); - else - return 0; -} - -// Return the current state of the Proxy. - -Proxy_Handler::State -Proxy_Handler::state (void) -{ - return this->state_; -} - -ACE_INET_Addr & -Proxy_Handler::remote_addr (void) -{ - return this->remote_addr_; -} - -ACE_INET_Addr & -Proxy_Handler::local_addr (void) -{ - return this->local_addr_; -} - -Consumer_Proxy::Consumer_Proxy (ACE_Event_Channel &ec, - const ACE_INET_Addr &remote_addr, - const ACE_INET_Addr &local_addr, - ACE_INT32 conn_id) - : Proxy_Handler (ec, remote_addr, local_addr, conn_id) -{ - this->proxy_role_ = 'C'; - this->msg_queue ()->high_water_mark (Consumer_Proxy::MAX_QUEUE_SIZE); -} - -// This method should be called only when the Consumer shuts down -// unexpectedly. This method simply marks the Proxy_Handler as having -// failed so that handle_close () can reconnect. - -int -Consumer_Proxy::handle_input (ACE_HANDLE) -{ - char buf[1]; - - this->state (Proxy_Handler::FAILED); - - switch (this->peer ().recv (buf, sizeof buf)) - { - case -1: - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Peer has failed unexpectedly for Consumer_Proxy %d\n", - this->id ()), -1); - /* NOTREACHED */ - case 0: - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Peer has shutdown unexpectedly for Consumer_Proxy %d\n", - this->id ()), -1); - /* NOTREACHED */ - default: - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Consumer is erroneously sending input to Consumer_Proxy %d\n", - this->id ()), -1); - /* NOTREACHED */ - } -} - -// Perform a non-blocking put() of event. If we are unable to send -// the entire event the remainder is re-queued at the *front* of the -// Event_List. - -int -Consumer_Proxy::nonblk_put (ACE_Message_Block *event) -{ - // Try to send the event. If we don't send it all (e.g., due to - // flow control), then re-queue the remainder at the head of the - // Event_List and ask the ACE_Reactor to inform us (via - // handle_output()) when it is possible to try again. - - ssize_t n = this->send (event); - - if (n == -1) - { - // Things have gone wrong, let's try to close down and set up a - // new reconnection by calling handle_close(). - this->state (Proxy_Handler::FAILED); - this->handle_close (); - return -1; - } - else if (errno == EWOULDBLOCK) // Didn't manage to send everything. - { - ACE_DEBUG ((LM_DEBUG, - "(%t) queueing activated on handle %d to routing id %d\n", - this->get_handle (), this->id ())); - - // ACE_Queue in *front* of the list to preserve order. - if (this->msg_queue ()->enqueue_head - (event, (ACE_Time_Value *) &ACE_Time_Value::zero) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enqueue_head"), -1); - - // Tell ACE_Reactor to call us back when we can send again. - else if (ACE_Service_Config::reactor ()->schedule_wakeup - (this, ACE_Event_Handler::WRITE_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "schedule_wakeup"), -1); - return 0; - } - else - return n; -} - -ssize_t -Consumer_Proxy::send (ACE_Message_Block *event) -{ - ssize_t len = event->length (); - ssize_t n = this->peer ().send (event->rd_ptr (), len); - - if (n <= 0) - return errno == EWOULDBLOCK ? 0 : n; - else if (n < len) - // Re-adjust pointer to skip over the part we did send. - event->rd_ptr (n); - else // if (n == length) - { - // The whole event is sent, we now decrement the reference count - // (which deletes itself with it reaches 0. - event->release (); - errno = 0; - } - this->total_bytes (n); - return n; -} - -// Finish sending an event when flow control conditions abate. -// This method is automatically called by the ACE_Reactor. - -int -Consumer_Proxy::handle_output (ACE_HANDLE) -{ - ACE_Message_Block *event = 0; - - ACE_DEBUG ((LM_DEBUG, - "(%t) in handle_output on handle %d\n", - this->get_handle ())); - // The list had better not be empty, otherwise there's a bug! - - if (this->msg_queue ()->dequeue_head - (event, (ACE_Time_Value *) &ACE_Time_Value::zero) != -1) - { - switch (this->nonblk_put (event)) - { - case 0: // Partial send. - ACE_ASSERT (errno == EWOULDBLOCK); - // Didn't write everything this time, come back later... - break; - - case -1: - // We are responsible for releasing an ACE_Message_Block if - // failures occur. - event->release (); - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "transmission failure")); - - /* FALLTHROUGH */ - default: // Sent the whole thing. - - // If we succeed in writing the entire event (or we did not - // fail due to EWOULDBLOCK) then check if there are more - // events on the Message_Queue. If there aren't, tell the - // ACE_Reactor not to notify us anymore (at least until - // there are new events queued up). - - if (this->msg_queue ()->is_empty ()) - { - ACE_DEBUG ((LM_DEBUG, - "(%t) queueing deactivated on handle %d to routing id %d\n", - this->get_handle (), this->id ())); - - - if (ACE_Service_Config::reactor ()->cancel_wakeup - (this, ACE_Event_Handler::WRITE_MASK) == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "cancel_wakeup")); - } - } - } - else - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "dequeue_head")); - return 0; -} - -// Send an event to a Consumer (may queue if necessary). - -int -Consumer_Proxy::put (ACE_Message_Block *event, ACE_Time_Value *) -{ - if (this->msg_queue ()->is_empty ()) - // Try to send the event *without* blocking! - return this->nonblk_put (event); - else - // If we have queued up events due to flow control then just - // enqueue and return. - return this->msg_queue ()->enqueue_tail - (event, (ACE_Time_Value *) &ACE_Time_Value::zero); -} - -Supplier_Proxy::Supplier_Proxy (ACE_Event_Channel &ec, - const ACE_INET_Addr &remote_addr, - const ACE_INET_Addr &local_addr, - ACE_INT32 conn_id) - : msg_frag_ (0), - Proxy_Handler (ec, remote_addr, local_addr, conn_id) -{ - this->proxy_role_ = 'S'; - this->msg_queue ()->high_water_mark (0); -} - -// Receive an Event from a Supplier. Handles fragmentation. -// -// The event returned from recv consists of two parts: -// -// 1. The Address part, contains the "virtual" routing id. -// -// 2. The Data part, which contains the actual data to be forwarded. -// -// The reason for having two parts is to shield the higher layers -// of software from knowledge of the event structure. - -int -Supplier_Proxy::recv (ACE_Message_Block *&forward_addr) -{ - if (this->msg_frag_ == 0) - // No existing fragment... - ACE_NEW_RETURN (this->msg_frag_, - ACE_Message_Block (sizeof (Event)), - -1); - - Event *event = (Event *) this->msg_frag_->rd_ptr (); - ssize_t header_received = 0; - - const ssize_t HEADER_SIZE = sizeof (Event_Header); - ssize_t header_bytes_left_to_read = - HEADER_SIZE - this->msg_frag_->length (); - - if (header_bytes_left_to_read > 0) - { - header_received = this->peer ().recv - (this->msg_frag_->wr_ptr (), header_bytes_left_to_read); - - if (header_received == -1 /* error */ - || header_received == 0 /* EOF */) - { - ACE_ERROR ((LM_ERROR, "%p\n", - "Recv error during header read ")); - ACE_DEBUG ((LM_DEBUG, - "attempted to read %d\n", - header_bytes_left_to_read)); - this->msg_frag_ = this->msg_frag_->release (); - return header_received; - } - - // Bump the write pointer by the amount read. - this->msg_frag_->wr_ptr (header_received); - - // At this point we may or may not have the ENTIRE header. - if (this->msg_frag_->length () < HEADER_SIZE) - { - ACE_DEBUG ((LM_DEBUG, - "Partial header received: only %d bytes\n", - this->msg_frag_->length ())); - // Notify the caller that we didn't get an entire event. - errno = EWOULDBLOCK; - return -1; - } - - // Convert the header into host byte order so that we can access - // it directly without having to repeatedly muck with it... - event->header_.decode (); - - if (event->header_.len_ > sizeof event->data_) - { - // This data_ payload is too big! - errno = EINVAL; - ACE_DEBUG ((LM_DEBUG, - "Data payload is too big (%d bytes)\n", - event->header_.len_)); - return -1; - } - - } - - // At this point there is a complete, valid header in Event. Now we - // need to get the event payload. Due to incomplete reads this may - // not be the first time we've read in a fragment for this message. - // We account for this here. Note that the first time in here - // msg_frag_->wr_ptr() will point to event->data_. Every time we do - // a successful fragment read, we advance wr_ptr(). Therefore, by - // subtracting how much we've already read from the - // event->header_.len_ we complete the data_bytes_left_to_read... - - ssize_t data_bytes_left_to_read = - ssize_t (event->header_.len_ - (msg_frag_->wr_ptr () - event->data_)); - - ssize_t data_received = - this->peer ().recv (this->msg_frag_->wr_ptr (), data_bytes_left_to_read); - - // Try to receive the remainder of the event. - - switch (data_received) - { - case -1: - if (errno == EWOULDBLOCK) - // This might happen if only the header came through. - return -1; - else - /* FALLTHROUGH */; - - case 0: // Premature EOF. - this->msg_frag_ = this->msg_frag_->release (); - return 0; - - default: - // Set the write pointer at 1 past the end of the event. - this->msg_frag_->wr_ptr (data_received); - - if (data_received != data_bytes_left_to_read) - { - errno = EWOULDBLOCK; - // Inform caller that we didn't get the whole event. - return -1; - } - else - { - // Set the read pointer to the beginning of the event. - this->msg_frag_->rd_ptr (this->msg_frag_->base ()); - - // Allocate an event forwarding header and chain the data - // portion onto its continuation field. - forward_addr = new ACE_Message_Block (sizeof (Event_Key), - ACE_Message_Block::MB_PROTO, - this->msg_frag_); - if (forward_addr == 0) - { - this->msg_frag_ = this->msg_frag_->release (); - errno = ENOMEM; - return -1; - } - - Event_Key event_addr (this->id (), - event->header_.supplier_id_, - event->header_.type_); - // Copy the forwarding address from the Event_Key into - // forward_addr. - forward_addr->copy ((char *) &event_addr, sizeof (Event_Key)); - - // Reset the pointer to indicate we've got an entire event. - this->msg_frag_ = 0; - } - - this->total_bytes (data_received + header_received); -#if defined (VERBOSE) - ACE_DEBUG ((LM_DEBUG, "(%t) connection id = %d, supplier id = %d, len = %d, payload = %*s", - event_addr.conn_id_, event->header_.supplier_id_, event->header_.len_, - event->header_.len_, event->data_)); -#else - ACE_DEBUG ((LM_DEBUG, "(%t) supplier id = %d, cur len = %d, total bytes read = %d\n", - event->header_.supplier_id_, event->header_.len_, data_received + header_received)); -#endif /* VERBOSE */ - - // Encode before returning so that we can set things out in - // network byte order. - event->header_.encode (); - return data_received + header_received; - } -} - -// Receive various types of input (e.g., Peer event from the -// gatewayd, as well as stdio). - -int -Supplier_Proxy::handle_input (ACE_HANDLE) -{ - ACE_Message_Block *forward_addr = 0; - - switch (this->recv (forward_addr)) - { - case 0: - // Note that a peer should never initiate a shutdown by closing - // the connection. Instead, it should reconnect. - this->state (Proxy_Handler::FAILED); - ACE_ERROR_RETURN ((LM_ERROR, - "(%t) Peer has closed down unexpectedly for Input Proxy_Handler %d\n", - this->id ()), -1); - /* NOTREACHED */ - case -1: - if (errno == EWOULDBLOCK) - // A short-read, we'll come back and finish it up later on! - return 0; - else // A weird problem occurred, shut down and start again. - { - this->state (Proxy_Handler::FAILED); - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p for Input Proxy_Handler %d\n", - "Peer has failed unexpectedly", - this->id ()), -1); - } - /* NOTREACHED */ - default: - return this->forward (forward_addr); - } -} - -// Forward an event to its appropriate Consumer(s). This delegates to -// the <ACE_Event_Channel> to do the actual forwarding. - -int -Supplier_Proxy::forward (ACE_Message_Block *forward_addr) -{ - return this->event_channel_.put (forward_addr); -} - -#if defined (ACE_TEMPLATES_REQUIRE_SPECIALIZATION) -template class ACE_Map_Manager<Event_Key, Consumer_Dispatch_Set *, MAP_MUTEX>; -template class ACE_Map_Iterator<Event_Key, Consumer_Dispatch_Set *, MAP_MUTEX>; -template class ACE_Map_Entry<Event_Key, Consumer_Dispatch_Set *>; -#endif /* ACE_TEMPLATES_REQUIRE_SPECIALIZATION */ diff --git a/apps/Gateway/Gateway/Proxy_Handler.h b/apps/Gateway/Gateway/Proxy_Handler.h deleted file mode 100644 index ffce18d1c71..00000000000 --- a/apps/Gateway/Gateway/Proxy_Handler.h +++ /dev/null @@ -1,202 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Proxy_Handler.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_PROXY_HANDLER) -#define _PROXY_HANDLER - -#include "ace/Service_Config.h" -#include "ace/SOCK_Connector.h" -#include "ace/Svc_Handler.h" -#include "Event_Forwarding_Discriminator.h" -#include "Consumer_Dispatch_Set.h" -#include "Event.h" - -// Forward declaration. -class Proxy_Handler_Connector; -class ACE_Event_Channel; - -class Proxy_Handler : public ACE_Svc_Handler<ACE_SOCK_STREAM, SYNCH_STRATEGY> - // = TITLE - // Proxy_Handler contains info about connection state and addressing. - // - // = DESCRIPTION - // The Proxy_Handler classes process events sent to the Event - // Channel from Suppliers and forward them to Consumers. -{ -public: - Proxy_Handler (ACE_Event_Channel &, - const ACE_INET_Addr &remote_addr, - const ACE_INET_Addr &local_addr, - ACE_INT32 conn_id); - - virtual int open (void * = 0); - // Initialize and activate a single-threaded Proxy_Handler (called by - // ACE_Connector::handle_output()). - - ACE_INET_Addr &remote_addr (void); - // Returns the peer's routing address. - - ACE_INET_Addr &local_addr (void); - // Returns our local address. - - // = Set/get routing id. - ACE_INT32 id (void); - void id (ACE_INT32); - - // = The current state of the Proxy_Handler. - enum State - { - IDLE = 1, // Prior to initialization. - CONNECTING, // During connection establishment. - ESTABLISHED, // Proxy_Handler is established and active. - DISCONNECTING, // Proxy_Handler is in the process of connecting. - FAILED // Proxy_Handler has failed. - }; - - // = Set/get the current state. - void state (State); - State state (void); - - // = Set/get the current retry timeout delay. - void timeout (int); - int timeout (void); - - // = Set/get the maximum retry timeout delay. - void max_timeout (int); - int max_timeout (void); - - // = Set/get proxy role (i.e., 'S' for Supplier and 'C' for Consumer - // (necessary for error checking). - void proxy_role (char); - char proxy_role (void); - - // = The total number of bytes sent/received on this proxy. - size_t total_bytes (void); - void total_bytes (size_t bytes); - // Increment count by <bytes>. - - virtual int handle_timeout (const ACE_Time_Value &, const void *arg); - // Perform timer-based Proxy_Handler reconnection. - -protected: - enum - { - MAX_RETRY_TIMEOUT = 300 // 5 minutes is the maximum timeout. - }; - - virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE, - ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK); - // Perform Proxy_Handler termination. - - ACE_INET_Addr remote_addr_; - // Address of peer. - - ACE_INET_Addr local_addr_; - // Address of us. - - ACE_INT32 id_; - // The assigned routing ID of this entry. - - size_t total_bytes_; - // The total number of bytes sent/received on this proxy. - - State state_; - // The current state of the proxy. - - int timeout_; - // Amount of time to wait between reconnection attempts. - - int max_timeout_; - // Maximum amount of time to wait between reconnection attempts. - - char proxy_role_; - // Indicates which role the proxy plays ('S' == Supplier and 'C' == - // Consumer). - - ACE_Event_Channel &event_channel_; - // Reference to the <ACE_Event_Channel> that we use to forward all - // the events from Consumers and Suppliers. -}; - -class Supplier_Proxy : public Proxy_Handler - // = TITLE - // Handles reception of Events from Suppliers - // - // = DESCRIPTION - // Performs framing and error checking. -{ -public: - // = Initialization method. - Supplier_Proxy (ACE_Event_Channel &, - const ACE_INET_Addr &remote_addr, - const ACE_INET_Addr &local_addr, - ACE_INT32 conn_id); - -protected: - // = All the following methods are upcalls, so they can be protected. - - virtual int handle_input (ACE_HANDLE = ACE_INVALID_HANDLE); - // Receive and process peer events. - - virtual int recv (ACE_Message_Block *&); - // Receive an event from a Supplier. - - int forward (ACE_Message_Block *event); - // Forward the <event> to its appropriate Consumer. This delegates - // to the <ACE_Event_Channel> to do the actual forwarding. - - ACE_Message_Block *msg_frag_; - // Keep track of event fragment to handle non-blocking recv's from - // Suppliers. -}; - -class Consumer_Proxy : public Proxy_Handler - // = TITLE - // Handles transmission of events to Consumers. - // - // = DESCRIPTION - // Performs queueing and error checking. Uses a single-threaded - // Reactive approach to handle flow control. -{ -public: - // = Initialization method. - Consumer_Proxy (ACE_Event_Channel &, - const ACE_INET_Addr &remote_addr, - const ACE_INET_Addr &local_addr, - ACE_INT32 conn_id); - - virtual int put (ACE_Message_Block *event, - ACE_Time_Value * = 0); - // Send an event to a Consumer (may be queued if necessary). - -protected: - // = We'll allow up to 16 megabytes to be queued per-output proxy. - enum {MAX_QUEUE_SIZE = 1024 * 1024 * 16}; - - virtual int handle_output (ACE_HANDLE); - // Finish sending event when flow control conditions abate. - - int nonblk_put (ACE_Message_Block *mb); - // Perform a non-blocking put(). - - virtual ssize_t send (ACE_Message_Block *); - // Send an event to a Consumer. - - virtual int handle_input (ACE_HANDLE); - // Receive and process shutdowns from a Consumer. -}; - -#endif /* _PROXY_HANDLER */ diff --git a/apps/Gateway/Gateway/Proxy_Handler_Connector.cpp b/apps/Gateway/Gateway/Proxy_Handler_Connector.cpp deleted file mode 100644 index dc18eca8500..00000000000 --- a/apps/Gateway/Gateway/Proxy_Handler_Connector.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "Proxy_Handler_Connector.h" -// $Id$ - - -Proxy_Handler_Connector::Proxy_Handler_Connector (void) -{ -} - -// Override the connection-failure method to add timer support. -// Note that these timers perform "expoential backoff" to -// avoid rapidly trying to reestablish connections when a link -// goes down. - -int -Proxy_Handler_Connector::handle_close (ACE_HANDLE sd, ACE_Reactor_Mask) -{ - ACE_Connector<Proxy_Handler, ACE_SOCK_CONNECTOR>::AST *stp = 0; - - // Locate the ACE_Svc_Handler corresponding to the socket descriptor. - if (this->handler_map_.find (sd, stp) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) can't locate proxy %d in connector map, %p\n", - sd, "find"), -1); - - Proxy_Handler *proxy_handler = stp->svc_handler (); - - // Schedule a reconnection request at some point in the future - // (note that proxy_handler uses an exponential backoff scheme). - if (ACE_Service_Config::reactor ()->schedule_timer - (proxy_handler, 0, proxy_handler->timeout ()) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - return 0; -} - -// Initiate (or reinitiate) a connection to the Proxy_Handler. - -int -Proxy_Handler_Connector::initiate_connection (Proxy_Handler *proxy_handler, - ACE_Synch_Options &synch_options) -{ - char addr_buf[MAXHOSTNAMELEN]; - - // Mark ourselves as idle so that the various iterators - // will ignore us until we are reconnected. - proxy_handler->state (Proxy_Handler::IDLE); - - // We check the remote addr second so that it remains in the addr_buf. - if (proxy_handler->local_addr ().addr_to_string (addr_buf, sizeof addr_buf) == -1 - || proxy_handler->remote_addr ().addr_to_string (addr_buf, sizeof addr_buf) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "can't obtain peer's address"), -1); - - // Try to connect to the Peer. - - if (this->connect (proxy_handler, proxy_handler->remote_addr (), - synch_options, proxy_handler->local_addr ()) == -1) - { - if (errno != EWOULDBLOCK) - { - proxy_handler->state (Proxy_Handler::FAILED); - ACE_DEBUG ((LM_DEBUG, "(%t) %p on address %s\n", - "connect", addr_buf)); - - // Reschedule ourselves to try and connect again. - if (synch_options[ACE_Synch_Options::USE_REACTOR]) - { - if (ACE_Service_Config::reactor ()->schedule_timer - (proxy_handler, 0, proxy_handler->timeout ()) == 0) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "schedule_timer"), -1); - } - else - // Failures on synchronous connects are reported as errors - // so that the caller can decide how to proceed. - return -1; - } - else - { - proxy_handler->state (Proxy_Handler::CONNECTING); - ACE_DEBUG ((LM_DEBUG, - "(%t) in the process of connecting %s to %s\n", - synch_options[ACE_Synch_Options::USE_REACTOR] - ? "asynchronously" : "synchronously", addr_buf)); - } - } - else - { - proxy_handler->state (Proxy_Handler::ESTABLISHED); - ACE_DEBUG ((LM_DEBUG, "(%t) connected to %s on %d\n", - addr_buf, proxy_handler->get_handle ())); - } - return 0; -} diff --git a/apps/Gateway/Gateway/Proxy_Handler_Connector.h b/apps/Gateway/Gateway/Proxy_Handler_Connector.h deleted file mode 100644 index 3baea75934a..00000000000 --- a/apps/Gateway/Gateway/Proxy_Handler_Connector.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Proxy_Handler_Connector.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_IO_HANDLER_CONNECTOR) -#define _IO_HANDLER_CONNECTOR - -#include "ace/Connector.h" -#include "Thr_Proxy_Handler.h" - -class Proxy_Handler_Connector : public ACE_Connector<Proxy_Handler, ACE_SOCK_CONNECTOR> - // = TITLE - // A concrete factory class that setups connections to peerds - // and produces a new Proxy_Handler object to do the dirty work... -{ -public: - Proxy_Handler_Connector (void); - - // Initiate (or reinitiate) a connection on the Proxy_Handler. - int initiate_connection (Proxy_Handler *, - ACE_Synch_Options & = ACE_Synch_Options::synch); - -protected: - // Override the connection-failure method to add timer support. - virtual int handle_close (ACE_HANDLE sd, ACE_Reactor_Mask); -}; - -#endif /* _IO_HANDLER_CONNECTOR */ diff --git a/apps/Gateway/Gateway/README b/apps/Gateway/Gateway/README deleted file mode 100644 index e64ad26b568..00000000000 --- a/apps/Gateway/Gateway/README +++ /dev/null @@ -1,23 +0,0 @@ -This application illustrates an application-level Gateway which routes -messages between Consumer and Suppliers in a distributed environment. - -The default configuration is single-threaded, i.e., all -Supplier_Proxys and Consumer_Proxys are multiplexed via the ACE -Reactor within a single thread of control. To obtain a version that -multi-threads both Consumer_Proxys and Supplier_Proxys simply set -the following flag in the Makefile: - -DEFFLAGS += -DUSE_OUTPUT_MT -DUSE_INPUT_MT - -To get a version that uses single-threading for all Supplier_Proxys, -but a separate thread per-Consumer_Proxy set the following flag in -the Makefile: - -DEFFLAGS += -DUSE_OUTPUT_MT - -If you examine the source code, you'll see that very few changes are -required in the source code to switch between single-threading and -multi-threading. The ACE Task class is primarily responsible for -enabling the flexible modification of concurrency strategies with only -minor changes required to the source code, design, and system -architecture. diff --git a/apps/Gateway/Gateway/Routing_Entry.cpp b/apps/Gateway/Gateway/Routing_Entry.cpp deleted file mode 100644 index cc270cfac3a..00000000000 --- a/apps/Gateway/Gateway/Routing_Entry.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// Defines an entry in the Routing Table. -// $Id$ - -#include "Routing_Entry.h" - -Routing_Entry::Routing_Entry (int validity_interval) - : validity_interval_ (validity_interval) -{ - ACE_NEW (this->destinations_, Routing_Entry::ENTRY_SET); -} - -Routing_Entry::~Routing_Entry (void) -{ - delete this->destinations_; -} - -// Get the associated set of destinations. - -Routing_Entry::ENTRY_SET * -Routing_Entry::destinations (void) -{ - return this->destinations_; -} - -// Set the associated set of destinations. - -void -Routing_Entry::destinations (Routing_Entry::ENTRY_SET *s) -{ - this->destinations_ = s; -} - -// Get the current validity interval for this route. - -int -Routing_Entry::validity_interval (void) -{ - return this->validity_interval_; -} - -// Set the current validity interval for this route. - -void -Routing_Entry::validity_interval (int vi) -{ - this->validity_interval_ = vi; -} diff --git a/apps/Gateway/Gateway/Routing_Entry.h b/apps/Gateway/Gateway/Routing_Entry.h deleted file mode 100644 index ab8e0eee53d..00000000000 --- a/apps/Gateway/Gateway/Routing_Entry.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Routing_Entry.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_ROUTING_ENTRY) -#define _ROUTING_ENTRY - -#include "ace/Set.h" - -// Forward reference. -class Channel; - -class Routing_Entry -{ - // = TITLE - // Defines an entry in the Routing_Table. -public: - Routing_Entry (int validity_interval = 0); - ~Routing_Entry (void); - - typedef ACE_Unbounded_Set<Channel *> ENTRY_SET; - typedef ACE_Unbounded_Set_Iterator<Channel *> ENTRY_ITERATOR; - - // = Set/get the associated set of destinations. - ENTRY_SET *destinations (void); - void destinations (ENTRY_SET *); - - // = Set/get current validity interval for this routing entry. - int validity_interval (void); - void validity_interval (int); - -protected: - ENTRY_SET *destinations_; - // The set of destinations; - - int validity_interval_; - // The current validity interval of this link. -}; - -#endif /* _ROUTING_ENTRY */ diff --git a/apps/Gateway/Gateway/Routing_Table.cpp b/apps/Gateway/Gateway/Routing_Table.cpp deleted file mode 100644 index 3ef2f21bc1f..00000000000 --- a/apps/Gateway/Gateway/Routing_Table.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -#if !defined (_ROUTING_TABLE_C) -#define _ROUTING_TABLE_C - - -#include "Routing_Table.h" - -/* Bind the EXT_ID to the INT_ID. */ - -template <class EXT_ID, class INT_ID, class LOCK> int -Routing_Table<EXT_ID, INT_ID, LOCK>::bind (EXT_ID ext_id, INT_ID *int_id) -{ - return this->map_.bind (ext_id, int_id); -} - -/* Find the INT_ID corresponding to the EXT_ID. */ - -template <class EXT_ID, class INT_ID, class LOCK> int -Routing_Table<EXT_ID, INT_ID, LOCK>::find (EXT_ID ext_id, INT_ID *&int_id) -{ - return this->map_.find (ext_id, int_id); -} - -/* Unbind (remove) the EXT_ID from the map. */ - -template <class EXT_ID, class INT_ID, class LOCK> int -Routing_Table<EXT_ID, INT_ID, LOCK>::unbind (EXT_ID ext_id) -{ - return this->map_.unbind (ext_id); -} - -template <class EXT_ID, class INT_ID, class LOCK> -Routing_Iterator<EXT_ID, INT_ID, LOCK>::Routing_Iterator (Routing_Table<EXT_ID, - INT_ID, LOCK> &rt, - int ignore_inactive) - : map_iter_ (rt.map_), - ignore_inactive_ (ignore_inactive) -{ -} - -template <class EXT_ID, class INT_ID, class LOCK> int -Routing_Iterator<EXT_ID, INT_ID, LOCK>::next (INT_ID *&ss) -{ - // Loop in order to skip over inactive entries if necessary. - - for (ACE_Map_Entry<EXT_ID, INT_ID *> *temp = 0; - this->map_iter_.next (temp) != 0; - this->advance ()) - { - // Skip over inactive entries if necessary. - if (temp->int_id_->active () == 0 && this->ignore_inactive_) - continue; - - // Otherwise, return the next item. - ss = temp->int_id_; - return 1; - } - return 0; -} - -template <class EXT_ID, class INT_ID, class LOCK> int -Routing_Iterator<EXT_ID, INT_ID, LOCK>::advance (void) -{ - return this->map_iter_.advance (); -} -#endif /* _ROUTING_TABLE_C */ diff --git a/apps/Gateway/Gateway/Routing_Table.h b/apps/Gateway/Gateway/Routing_Table.h deleted file mode 100644 index 84194f13e49..00000000000 --- a/apps/Gateway/Gateway/Routing_Table.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Routing_Table.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_ROUTING_TABLE_H) -#define _ROUTING_TABLE_H - -#include "ace/Map_Manager.h" - -template <class EXT_ID, class INT_ID, class LOCK> -class Routing_Table -{ - // = TITLE - // Define a generic routing table based on the ACE Map_Manager. - // - // = DESCRIPTION - // We need to have this table, rather than just using the Map_Manager - // directly in order to ignore "inactive" routing entries... -public: - int bind (EXT_ID ext_id, INT_ID *int_id); - // Associate EXT_ID with the INT_ID. - - int find (EXT_ID ext_id, INT_ID *&int_id); - // Break any association of EXID. - - int unbind (EXT_ID ext_id); - // Locate EXID and pass out parameter via INID. If found, - // return 0, else -1. - -public: - ACE_Map_Manager<EXT_ID, INT_ID *, LOCK> map_; - // Map external IDs to internal IDs. -}; - -template <class EXT_ID, class INT_ID, class LOCK> -class Routing_Iterator -{ - // = TITLE - // Define an iterator for the Routing Table. -public: - Routing_Iterator (Routing_Table<EXT_ID, INT_ID, LOCK> &mm, - int ignore_inactive = 1); - int next (INT_ID *&); - int advance (void); - -private: - ACE_Map_Iterator<EXT_ID, INT_ID *, LOCK> map_iter_; - int ignore_inactive_; -}; - -#if defined (ACE_TEMPLATES_REQUIRE_SOURCE) -#include "Routing_Table.cpp" -#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */ -#endif /* _ROUTING_TABLE_H */ diff --git a/apps/Gateway/Gateway/Thr_Channel.cpp b/apps/Gateway/Gateway/Thr_Channel.cpp deleted file mode 100644 index 26e385e2727..00000000000 --- a/apps/Gateway/Gateway/Thr_Channel.cpp +++ /dev/null @@ -1,204 +0,0 @@ -#include "Thr_Channel.h" -// $Id$ - -#include "Channel_Connector.h" - -#if defined (ACE_HAS_THREADS) -Thr_Output_Channel::Thr_Output_Channel (ROUTING_TABLE *rt, - Channel_Connector *cc, - ACE_Thread_Manager *thr_mgr, - int socket_queue_size) - : Output_Channel (rt, cc, thr_mgr, socket_queue_size) -{ -} - -// This method should be called only when the peer shuts down -// unexpectedly. This method marks the Channel as having failed and -// deactivates the ACE_Message_Queue (to wake up the thread blocked on -// <dequeue_head> in svc()). Thr_Output_Handler::handle_close () will -// eventually try to reconnect... - -int -Thr_Output_Channel::handle_input (ACE_HANDLE h) -{ - this->Output_Channel::handle_input (h); - ACE_Service_Config::reactor ()->remove_handler (h, - ACE_Event_Handler::RWE_MASK - | ACE_Event_Handler::DONT_CALL); - // Deactivate the queue while we try to get reconnected. - this->msg_queue ()->deactivate (); - return 0; -} - -// Initialize the threaded Output_Channel object and spawn a new -// thread. - -int -Thr_Output_Channel::open (void *) -{ - // Set the size of the socket queue. - this->socket_queue_size (); - - // Turn off non-blocking I/O. - if (this->peer ().disable (ACE_NONBLOCK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enable"), -1); - - // Register ourselves to receive input events (which indicate that - // the Peer has shut down unexpectedly). - if (ACE_Service_Config::reactor ()->register_handler (this, - ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "register_handler"), -1); - - if (this->initialize_connection ()) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "initialize_connection"), -1); - - // Reactivate message queue. If it was active then this is the - // first time in and we need to spawn a thread, otherwise the queue - // was inactive due to some problem and we've already got a thread. - if (this->msg_queue ()->activate () == ACE_Message_Queue<SYNCH>::WAS_ACTIVE) - { - ACE_DEBUG ((LM_DEBUG, "(%t) spawning new thread\n")); - // Become an active object by spawning a new thread to transmit - // messages to peers. - return this->activate (THR_NEW_LWP | THR_DETACHED); - } - else - { - ACE_DEBUG ((LM_DEBUG, "(%t) reusing existing thread\n")); - return 0; - } -} - -// ACE_Queue up a message for transmission (must not block since all -// Input_Channels are single-threaded). - -int -Thr_Output_Channel::put (ACE_Message_Block *mb, ACE_Time_Value *) -{ - // Perform non-blocking enqueue. - return this->msg_queue ()->enqueue_tail (mb, (ACE_Time_Value *) &ACE_Time_Value::zero); -} - -// Transmit messages to the peer (note simplification resulting from -// threads...) - -int -Thr_Output_Channel::svc (void) -{ - for (;;) - { - ACE_DEBUG ((LM_DEBUG, "(%t) connected! Thr_Output_Channel's fd = %d\n", - this->peer ().get_handle ())); - - // Since this method runs in its own thread it is OK to block on - // output. - - for (ACE_Message_Block *mb = 0; - this->msg_queue ()->dequeue_head (mb) != -1; ) - if (this->send_peer (mb) == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "send failed")); - - ACE_ASSERT (errno == ESHUTDOWN); - - ACE_DEBUG ((LM_DEBUG, "(%t) shutting down threaded Output_Channel %d on handle %d\n", - this->id (), this->get_handle ())); - - this->peer ().close (); - - for (this->timeout (1); - // Default is to reconnect synchronously. - this->connector_->initiate_connection (this) == -1; ) - { - ACE_Time_Value tv (this->timeout ()); - ACE_ERROR ((LM_ERROR, - "(%t) reattempting connection, sec = %d\n", - tv.sec ())); - ACE_OS::sleep (tv); - } - } - - return 0; -} - -Thr_Input_Channel::Thr_Input_Channel (ROUTING_TABLE *rt, - Channel_Connector *cc, - ACE_Thread_Manager *thr_mgr, - int socket_queue_size) - : Input_Channel (rt, cc, thr_mgr, socket_queue_size) -{ -} - -int -Thr_Input_Channel::open (void *) -{ - // Set the size of the socket queue. - this->socket_queue_size (); - - // Turn off non-blocking I/O. - if (this->peer ().disable (ACE_NONBLOCK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enable"), -1); - - if (this->initialize_connection ()) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "initialize_connection"), -1); - - // Reactivate message queue. If it was active then this is the - // first time in and we need to spawn a thread, otherwise the queue - // was inactive due to some problem and we've already got a thread. - if (this->msg_queue ()->activate () == ACE_Message_Queue<SYNCH>::WAS_ACTIVE) - { - ACE_DEBUG ((LM_DEBUG, "(%t) spawning new thread\n")); - // Become an active object by spawning a new thread to transmit - // messages to peers. - return this->activate (THR_NEW_LWP | THR_DETACHED); - } - else - { - ACE_DEBUG ((LM_DEBUG, "(%t) reusing existing thread\n")); - return 0; - } -} - -// Receive messages from a Peer in a separate thread (note reuse of -// existing code!). - -int -Thr_Input_Channel::svc (void) -{ - for (;;) - { - ACE_DEBUG ((LM_DEBUG, "(%t) connected! Thr_Input_Channel's fd = %d\n", - this->peer ().get_handle ())); - - // Since this method runs in its own thread and processes - // messages for one connection it is OK to block on input and - // output. - - while (this->handle_input () != -1) - continue; - - ACE_DEBUG ((LM_DEBUG, - "(%t) shutting down threaded Input_Channel %d on handle %d\n", - this->id (), - this->get_handle ())); - - this->peer ().close (); - - // Deactivate the queue while we try to get reconnected. - this->msg_queue ()->deactivate (); - - for (this->timeout (1); - // Default is to reconnect synchronously. - this->connector_->initiate_connection (this) == -1; ) - { - ACE_Time_Value tv (this->timeout ()); - ACE_ERROR ((LM_ERROR, - "(%t) reattempting connection, sec = %d\n", tv.sec ())); - ACE_OS::sleep (tv); - } - } - return 0; -} - -#endif /* ACE_HAS_THREADS */ diff --git a/apps/Gateway/Gateway/Thr_Channel.h b/apps/Gateway/Gateway/Thr_Channel.h deleted file mode 100644 index a1dc91b1619..00000000000 --- a/apps/Gateway/Gateway/Thr_Channel.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Thr_Channel.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_THR_CHANNEL) -#define _THR_CHANNEL - -#include "Channel.h" - -#if defined (ACE_HAS_THREADS) -class Thr_Output_Channel : public Output_Channel - // = TITLE - // Runs each Output Channel in a separate thread. -{ -public: - Thr_Output_Channel (ROUTING_TABLE *, - Channel_Connector *, - ACE_Thread_Manager *, - int socket_queue_size); - - virtual int open (void *); - // Initialize the threaded Output_Channel object and spawn a new - // thread. - - virtual int handle_input (ACE_HANDLE); - // Called when Peer shutdown unexpectedly. - - virtual int put (ACE_Message_Block *, ACE_Time_Value * = 0); - // Send a message to a peer. - - virtual int svc (void); - // Transmit peer messages. -}; - -class Thr_Input_Channel : public Input_Channel - // = TITLE - // Runs each Input Channel in a separate thread. -{ -public: - Thr_Input_Channel (ROUTING_TABLE *, - Channel_Connector *, - ACE_Thread_Manager *, - int socket_queue_size); - - virtual int open (void *); - // Initialize the object and spawn a new thread. - - virtual int svc (void); - // Transmit peer messages. -}; -#endif /* ACE_HAS_THREADS */ -#endif /* _THR_CHANNEL */ diff --git a/apps/Gateway/Gateway/Thr_IO_Handler.cpp b/apps/Gateway/Gateway/Thr_IO_Handler.cpp deleted file mode 100644 index 109cfad9c3f..00000000000 --- a/apps/Gateway/Gateway/Thr_IO_Handler.cpp +++ /dev/null @@ -1,204 +0,0 @@ -#include "Thr_IO_Handler.h" -// $Id$ - -#include "IO_Handler_Connector.h" - -#if defined (ACE_HAS_THREADS) -Thr_Consumer_Handler::Thr_Consumer_Handler (Consumer_Map *consumer_map, - IO_Handler_Connector *ioc, - ACE_Thread_Manager *thr_mgr, - int socket_queue_size) - : Consumer_Handler (consumer_map, ioc, thr_mgr, socket_queue_size) -{ -} - -// This method should be called only when the peer shuts down -// unexpectedly. This method marks the IO_Handler as having failed and -// deactivates the ACE_Message_Queue (to wake up the thread blocked on -// <dequeue_head> in svc()). Thr_Output_Handler::handle_close () will -// eventually try to reconnect... - -int -Thr_Consumer_Handler::handle_input (ACE_HANDLE h) -{ - this->Consumer_Handler::handle_input (h); - ACE_Service_Config::reactor ()->remove_handler (h, - ACE_Event_Handler::RWE_MASK - | ACE_Event_Handler::DONT_CALL); - // Deactivate the queue while we try to get reconnected. - this->msg_queue ()->deactivate (); - return 0; -} - -// Initialize the threaded Consumer_Handler object and spawn a new -// thread. - -int -Thr_Consumer_Handler::open (void *) -{ - // Set the size of the socket queue. - this->socket_queue_size (); - - // Turn off non-blocking I/O. - if (this->peer ().disable (ACE_NONBLOCK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enable"), -1); - - // Register ourselves to receive input events (which indicate that - // the Peer has shut down unexpectedly). - if (ACE_Service_Config::reactor ()->register_handler (this, - ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "register_handler"), -1); - - if (this->initialize_connection ()) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "initialize_connection"), -1); - - // Reactivate message queue. If it was active then this is the - // first time in and we need to spawn a thread, otherwise the queue - // was inactive due to some problem and we've already got a thread. - if (this->msg_queue ()->activate () == ACE_Message_Queue<SYNCH_STRATEGY>::WAS_ACTIVE) - { - ACE_DEBUG ((LM_DEBUG, "(%t) spawning new thread\n")); - // Become an active object by spawning a new thread to transmit - // messages to peers. - return this->activate (THR_NEW_LWP | THR_DETACHED); - } - else - { - ACE_DEBUG ((LM_DEBUG, "(%t) reusing existing thread\n")); - return 0; - } -} - -// ACE_Queue up a message for transmission (must not block since all -// Supplier_Handlers are single-threaded). - -int -Thr_Consumer_Handler::put (ACE_Message_Block *mb, ACE_Time_Value *) -{ - // Perform non-blocking enqueue. - return this->msg_queue ()->enqueue_tail (mb, (ACE_Time_Value *) &ACE_Time_Value::zero); -} - -// Transmit messages to the peer (note simplification resulting from -// threads...) - -int -Thr_Consumer_Handler::svc (void) -{ - for (;;) - { - ACE_DEBUG ((LM_DEBUG, "(%t) connected! Thr_Consumer_Handler's fd = %d\n", - this->peer ().get_handle ())); - - // Since this method runs in its own thread it is OK to block on - // output. - - for (ACE_Message_Block *mb = 0; - this->msg_queue ()->dequeue_head (mb) != -1; ) - if (this->send (mb) == -1) - ACE_ERROR ((LM_ERROR, "(%t) %p\n", "send failed")); - - ACE_ASSERT (errno == ESHUTDOWN); - - ACE_DEBUG ((LM_DEBUG, "(%t) shutting down threaded Consumer_Handler %d on handle %d\n", - this->id (), this->get_handle ())); - - this->peer ().close (); - - for (this->timeout (1); - // Default is to reconnect synchronously. - this->connector_->initiate_connection (this) == -1; ) - { - ACE_Time_Value tv (this->timeout ()); - ACE_ERROR ((LM_ERROR, - "(%t) reattempting connection, sec = %d\n", - tv.sec ())); - ACE_OS::sleep (tv); - } - } - - return 0; -} - -Thr_Supplier_Handler::Thr_Supplier_Handler (Consumer_Map *consumer_map, - IO_Handler_Connector *ioc, - ACE_Thread_Manager *thr_mgr, - int socket_queue_size) - : Supplier_Handler (consumer_map, ioc, thr_mgr, socket_queue_size) -{ -} - -int -Thr_Supplier_Handler::open (void *) -{ - // Set the size of the socket queue. - this->socket_queue_size (); - - // Turn off non-blocking I/O. - if (this->peer ().disable (ACE_NONBLOCK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "enable"), -1); - - if (this->initialize_connection ()) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", - "initialize_connection"), -1); - - // Reactivate message queue. If it was active then this is the - // first time in and we need to spawn a thread, otherwise the queue - // was inactive due to some problem and we've already got a thread. - if (this->msg_queue ()->activate () == ACE_Message_Queue<SYNCH_STRATEGY>::WAS_ACTIVE) - { - ACE_DEBUG ((LM_DEBUG, "(%t) spawning new thread\n")); - // Become an active object by spawning a new thread to transmit - // messages to peers. - return this->activate (THR_NEW_LWP | THR_DETACHED); - } - else - { - ACE_DEBUG ((LM_DEBUG, "(%t) reusing existing thread\n")); - return 0; - } -} - -// Receive messages from a Peer in a separate thread (note reuse of -// existing code!). - -int -Thr_Supplier_Handler::svc (void) -{ - for (;;) - { - ACE_DEBUG ((LM_DEBUG, "(%t) connected! Thr_Supplier_Handler's fd = %d\n", - this->peer ().get_handle ())); - - // Since this method runs in its own thread and processes - // messages for one connection it is OK to block on input and - // output. - - while (this->handle_input () != -1) - continue; - - ACE_DEBUG ((LM_DEBUG, - "(%t) shutting down threaded Supplier_Handler %d on handle %d\n", - this->id (), - this->get_handle ())); - - this->peer ().close (); - - // Deactivate the queue while we try to get reconnected. - this->msg_queue ()->deactivate (); - - for (this->timeout (1); - // Default is to reconnect synchronously. - this->connector_->initiate_connection (this) == -1; ) - { - ACE_Time_Value tv (this->timeout ()); - ACE_ERROR ((LM_ERROR, - "(%t) reattempting connection, sec = %d\n", tv.sec ())); - ACE_OS::sleep (tv); - } - } - return 0; -} - -#endif /* ACE_HAS_THREADS */ diff --git a/apps/Gateway/Gateway/Thr_IO_Handler.h b/apps/Gateway/Gateway/Thr_IO_Handler.h deleted file mode 100644 index ee056b35361..00000000000 --- a/apps/Gateway/Gateway/Thr_IO_Handler.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// apps -// -// = FILENAME -// Thr_IO_Handler.h -// -// = AUTHOR -// Doug Schmidt -// -// ============================================================================ - -#if !defined (_THR_IO_HANDLER) -#define _THR_IO_HANDLER - -#include "IO_Handler.h" - -#if defined (ACE_HAS_THREADS) -class Thr_Consumer_Handler : public Consumer_Handler - // = TITLE - // Runs each Output IO_Handler in a separate thread. -{ -public: - Thr_Consumer_Handler (Consumer_Map *, - IO_Handler_Connector *, - ACE_Thread_Manager *, - int socket_queue_size); - - virtual int open (void *); - // Initialize the threaded Consumer_Handler object and spawn a new - // thread. - - virtual int handle_input (ACE_HANDLE); - // Called when Peer shutdown unexpectedly. - - virtual int put (ACE_Message_Block *, ACE_Time_Value * = 0); - // Send a message to a peer. - - virtual int svc (void); - // Transmit peer messages. -}; - -class Thr_Supplier_Handler : public Supplier_Handler - // = TITLE - // Runs each Input IO_Handler in a separate thread. -{ -public: - Thr_Supplier_Handler (Consumer_Map *, - IO_Handler_Connector *, - ACE_Thread_Manager *, - int socket_queue_size); - - virtual int open (void *); - // Initialize the object and spawn a new thread. - - virtual int svc (void); - // Transmit peer messages. -}; -#endif /* ACE_HAS_THREADS */ -#endif /* _THR_IO_HANDLER */ diff --git a/apps/Gateway/Gateway/cc_config b/apps/Gateway/Gateway/cc_config deleted file mode 100644 index 96f9ebdedd7..00000000000 --- a/apps/Gateway/Gateway/cc_config +++ /dev/null @@ -1,10 +0,0 @@ -# Conn ID Hostname Remote Port Direction Max Retry Delay Local Port -# ------- -------- ---- --------- --------------- ---------- - 1 tango.cs 10004 I 32 20000 -# 2 tango.cs 10004 O 32 - 3 merengue.cs 10004 O 32 20001 -# 4 mambo.cs 10004 O 32 20000 -# 5 lambada.cs 10004 O 32 20000 -# 6 tango.cs 10004 O 32 20000 -# 7 tango.cs 5001 I 32 -# 8 tango.cs 5002 O 32 diff --git a/apps/Gateway/Gateway/consumer_config b/apps/Gateway/Gateway/consumer_config deleted file mode 100644 index 58884340e61..00000000000 --- a/apps/Gateway/Gateway/consumer_config +++ /dev/null @@ -1,8 +0,0 @@ -# Consumer configuration file -# Conn ID Supplier ID Type Consumers -# ------- ----------- ------- ------------ -# 1 1 0 3,4,5 - 1 1 0 3 - 3 1 0 3 -# 4 1 0 4 -# 5 1 0 5 diff --git a/apps/Gateway/Gateway/gatewayd.cpp b/apps/Gateway/Gateway/gatewayd.cpp deleted file mode 100644 index b0af5f7cace..00000000000 --- a/apps/Gateway/Gateway/gatewayd.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Main driver program for the Gateway. This file is completely -// $Id$ - -// generic code due to the ACE Service Configurator framework! - -#include "ace/Service_Config.h" -#include "Gateway.h" - -int -main (int argc, char *argv[]) -{ - ACE_Service_Config daemon; - - if (daemon.open (argc, argv) == -1) - { - if (errno != ENOENT) - ACE_ERROR ((LM_ERROR, "%p\n%a", "open", 1)); - else // Use static binding. - { - ACE_Service_Object *so = ACE_SVC_INVOKE (Gateway); - - if (so->init (argc - 1, argv + 1) == -1) - ACE_ERROR ((LM_ERROR, "%p\n%a", "init", 1)); - } - } - - // Run forever, performing the configured services until we are shut - // down by a SIGINT/SIGQUIT signal. - - daemon.run_reactor_event_loop (); - - return 0; -} diff --git a/apps/Gateway/Gateway/rt_config b/apps/Gateway/Gateway/rt_config deleted file mode 100644 index e951a0f09be..00000000000 --- a/apps/Gateway/Gateway/rt_config +++ /dev/null @@ -1,7 +0,0 @@ -# Conn ID Logical ID Payload Destinations -# ------- ---------- ------- ------------ -# 1 1 0 3,4,5 - 1 1 0 3 - 3 1 0 3 -# 4 1 0 4 -# 5 1 0 5 diff --git a/apps/Gateway/Gateway/svc.conf b/apps/Gateway/Gateway/svc.conf deleted file mode 100644 index db7a9d04ad5..00000000000 --- a/apps/Gateway/Gateway/svc.conf +++ /dev/null @@ -1,3 +0,0 @@ -#static Svc_Manager "-d -p 2913" -dynamic Gateway Service_Object * ./Gateway:_make_Gateway() active "-d -c connection_config -f consumer_config" - diff --git a/apps/Gateway/Makefile b/apps/Gateway/Makefile deleted file mode 100644 index b7abb07bf51..00000000000 --- a/apps/Gateway/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Gateway application -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -INFO = README - -DIRS = Gateway \ - Peer - - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nolocal.GNU - diff --git a/apps/Gateway/Peer/Gateway_Handler.cpp b/apps/Gateway/Peer/Gateway_Handler.cpp deleted file mode 100644 index cfc9a7dad6f..00000000000 --- a/apps/Gateway/Peer/Gateway_Handler.cpp +++ /dev/null @@ -1,652 +0,0 @@ -#include "ace/Get_Opt.h" -// $Id$ - - -#include "Gateway_Handler.h" - -Gateway_Handler::Gateway_Handler (ACE_Thread_Manager *) - : routing_id_ (0), - msg_frag_ (0), - total_bytes_ (0) -{ - this->msg_queue ()->high_water_mark (Gateway_Handler::QUEUE_SIZE); -} - -int -Gateway_Handler::handle_signal (int signum, siginfo_t *, ucontext_t *) -{ - ACE_DEBUG ((LM_DEBUG, "(%t) %S\n", signum)); - - // Shut down the main event loop. - ACE_Service_Config::end_reactor_event_loop (); - return 0; -} - -// Cache a binding to the HANDLER_MAP. - -void -Gateway_Handler::map (HANDLER_MAP *m) -{ - this->map_ = m; -} - -// Upcall from the ACE_Acceptor::handle_input() that turns control -// over to our application-specific Gateway handler. - -int -Gateway_Handler::open (void *a) -{ - ACE_DEBUG ((LM_DEBUG, "Gateway handler's fd = %d\n", - this->peer ().get_handle ())); - - // Call down to the base class to activate and register this - // handler. - if (this->inherited::open (a) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "open"), -1); - - if (this->peer ().enable (ACE_NONBLOCK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "enable"), -1); - - Gateway_Handler *this_ = this; - - // Add ourselves to the map so we can be removed later on. - if (this->map_->bind (this->get_handle (), this_) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "bind"), -1); - - char *to = ACE_OS::getenv ("TIMEOUT"); - int timeout = to == 0 ? 100000 : ACE_OS::atoi (to); - - // Schedule the time between disconnects. This should really be a - // "tunable" parameter. - if (ACE_Service_Config::reactor ()->schedule_timer (this, 0, timeout) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "schedule_timer")); - - // If there are messages left in the queue, make sure we - // enable the ACE_Reactor appropriately to get them sent out. - if (this->msg_queue ()->is_empty () == 0 - && ACE_Service_Config::reactor ()->schedule_wakeup (this, - ACE_Event_Handler::WRITE_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "schedule_wakeup"), -1); - - // First action is to wait to be notified of our routing id. - this->do_action_ = &Gateway_Handler::await_route_id; - return 0; -} - -// Read messages from stdin and send them to the gatewayd. - -int -Gateway_Handler::xmit_stdin (void) -{ - if (this->routing_id_ != -1) - { - ssize_t n; - ACE_Message_Block *mb; - - ACE_NEW_RETURN (mb, - ACE_Message_Block (sizeof (Event)), - -1); - - Event *peer_msg = (Event *) mb->rd_ptr (); - peer_msg->header_.routing_id_ = this->routing_id_; - - n = ACE_OS::read (ACE_STDIN, peer_msg->buf_, sizeof peer_msg->buf_); - - switch (n) - { - case 0: - ACE_DEBUG ((LM_DEBUG, "stdin closing down\n")); - - // Take stdin out of the ACE_Reactor so we stop trying to - // send messages. - if (ACE_Service_Config::reactor ()->remove_handler - (0, ACE_Event_Handler::DONT_CALL | ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "remove_handler")); - delete mb; - break; - case -1: - delete mb; - ACE_ERROR ((LM_ERROR, "%p\n", "read")); - break; - default: - peer_msg->header_.len_ = htonl (n); - mb->wr_ptr (sizeof (Peer_Header) + n); - - if (this->put (mb) == -1) - { - if (errno == EWOULDBLOCK) // The queue has filled up! - ACE_ERROR ((LM_ERROR, "%p\n", - "gateway is flow controlled, so we're dropping messages")); - else - ACE_ERROR ((LM_ERROR, "%p\n", "transmission failure in xmit_stdin")); - - // Caller is responsible for freeing a ACE_Message_Block - // if failures occur. - delete mb; - } - } - } - return 0; -} - -// Perform a non-blocking put() of message MB. If we are unable to -// send the entire message the remainder is re-Taskd at the *front* of -// the Message_List. - -int -Gateway_Handler::nonblk_put (ACE_Message_Block *mb) -{ - // Try to send the message. If we don't send it all (e.g., due to - // flow control), then re-ACE_Task the remainder at the head of the - // Message_List and ask the ACE_Reactor to inform us (via - // handle_output()) when it is possible to try again. - - ssize_t n; - - if ((n = this->send_peer (mb)) == -1) - return -1; - else if (errno == EWOULDBLOCK) // Didn't manage to send everything. - { - ACE_DEBUG ((LM_DEBUG, - "queueing activated on handle %d to routing id %d\n", - this->get_handle (), this->routing_id_)); - - // ACE_Queue in *front* of the list to preserve order. - if (this->msg_queue ()->enqueue_head - (mb, (ACE_Time_Value *) &ACE_Time_Value::zero) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "enqueue_head"), -1); - - // Tell ACE_Reactor to call us back when we can send again. - if (ACE_Service_Config::reactor ()->schedule_wakeup - (this, ACE_Event_Handler::WRITE_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "schedule_wakeup"), -1); - return 0; - } - else - return n; -} - -// Finish sending a message when flow control conditions abate. This -// method is automatically called by the ACE_Reactor. - -int -Gateway_Handler::handle_output (ACE_HANDLE) -{ - ACE_Message_Block *mb = 0; - - ACE_DEBUG ((LM_DEBUG, "in handle_output\n")); - // The list had better not be empty, otherwise there's a bug! - - if (this->msg_queue ()->dequeue_head - (mb, (ACE_Time_Value *) &ACE_Time_Value::zero) != -1) - { - switch (this->nonblk_put (mb)) - { - case 0: // Partial send. - ACE_ASSERT (errno == EWOULDBLOCK); - // Didn't write everything this time, come back later... - break; - - case -1: - // Caller is responsible for freeing a ACE_Message_Block if - // failures occur. - delete mb; - ACE_ERROR ((LM_ERROR, "%p\n", - "transmission failure in handle_output")); - - /* FALLTHROUGH */ - default: // Sent the whole thing. - - // If we succeed in writing the entire message (or we did - // not fail due to EWOULDBLOCK) then check if there are more - // messages on the Message_List. If there aren't, tell the - // ACE_Reactor not to notify us anymore (at least until - // there are new messages queued up). - - if (this->msg_queue ()->is_empty ()) - { - ACE_DEBUG ((LM_DEBUG, - "queue now empty on handle %d to routing id %d\n", - this->get_handle (), - this->routing_id_)); - - if (ACE_Service_Config::reactor ()->cancel_wakeup - (this, ACE_Event_Handler::WRITE_MASK) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "cancel_wakeup")); - } - } - } - else - ACE_ERROR ((LM_ERROR, "%p\n", "dequeue_head")); - return 0; -} - -// Send a message to a peer (may ACE_Task if necessary). - -int -Gateway_Handler::put (ACE_Message_Block *mb, ACE_Time_Value *) -{ - if (this->msg_queue ()->is_empty ()) - // Try to send the message *without* blocking! - return this->nonblk_put (mb); - else - // If we have queued up messages due to flow control then just - // enqueue and return. - return this->msg_queue ()->enqueue_tail - (mb, (ACE_Time_Value *) &ACE_Time_Value::zero); -} - -// Send an Peer message to gatewayd. - -int -Gateway_Handler::send_peer (ACE_Message_Block *mb) -{ - ssize_t n; - size_t len = mb->length (); - - if ((n = this->peer ().send (mb->rd_ptr (), len)) <= 0) - return errno == EWOULDBLOCK ? 0 : n; - else if (n < (ssize_t) len) - { - // Re-adjust pointer to skip over the part we did send. - mb->rd_ptr (n); - this->total_bytes_ += n; - } - else /* if (n == length) */ - { - // The whole message is sent, we can now safely deallocate the - // buffer. Note that this should decrement a reference count... - this->total_bytes_ += n; - delete mb; - errno = 0; - } - ACE_DEBUG ((LM_DEBUG, "sent %d bytes, total bytes sent = %d\n", - n, this->total_bytes_)); - return n; -} - -// Receive an Peer message from gatewayd. Handles fragmentation. - -int -Gateway_Handler::recv_peer (ACE_Message_Block *&mb) -{ - Event *peer_msg; - size_t len; - ssize_t n; - size_t offset = 0; - - if (this->msg_frag_ == 0) - { - ACE_NEW_RETURN (this->msg_frag_, - ACE_Message_Block (sizeof (Event)), - -1); - - // No existing fragment... - if (this->msg_frag_ == 0) - ACE_ERROR_RETURN ((LM_ERROR, "out of memory\n"), -1); - - peer_msg = (Event *) this->msg_frag_->rd_ptr (); - - switch (n = this->peer ().recv (peer_msg, sizeof (Peer_Header))) - { - case sizeof (Peer_Header): - len = ntohl (peer_msg->header_.len_); - if (len <= sizeof peer_msg->buf_) - { - this->msg_frag_->wr_ptr (sizeof (Peer_Header)); - break; // The message is within the maximum size range. - } - else - ACE_ERROR ((LM_ERROR, "message too long = %d\n", len)); - /* FALLTHROUGH */ - default: - ACE_ERROR ((LM_ERROR, "invalid length = %d\n", n)); - n = -1; - /* FALLTHROUGH */ - case -1: - /* FALLTHROUGH */ - case 0: - // Make sure to free up memory on error returns. - delete this->msg_frag_; - this->msg_frag_ = 0; - return n; - } - } - else - { - offset = this->msg_frag_->length () - sizeof (Peer_Header); - len = peer_msg->header_.len_ - offset; - } - - switch (n = this->peer ().recv (peer_msg->buf_ + offset, len)) - { - case -1: - if (errno == EWOULDBLOCK) - { - // This shouldn't happen since the ACE_Reactor - // just triggered us to handle pending I/O! - ACE_DEBUG ((LM_DEBUG, "unexpected recv failure\n")); - // Since ACE_DEBUG might change errno, we need to reset it - // here. - errno = EWOULDBLOCK; - return -1; - } - else - /* FALLTHROUGH */; - - case 0: // EOF. - delete this->msg_frag_; - this->msg_frag_ = 0; - return n; - - default: - if (n != (ssize_t) len) - // Re-adjust pointer to skip over the part we've read. - { - this->msg_frag_->wr_ptr (n); - errno = EWOULDBLOCK; - // Inform caller that we didn't get the whole message. - return -1; - } - else - { - // Set the write pointer at 1 past the end of the message. - this->msg_frag_->wr_ptr (n); - - // Set the read pointer to the beginning of the message. - this->msg_frag_->rd_ptr (this->msg_frag_->base ()); - - mb = this->msg_frag_; - - // Reset the pointer to indicate we've got an entire - // message. - this->msg_frag_ = 0; - } - return n; - } -} - -// Receive various types of input (e.g., Peer message from the -// gatewayd, as well as stdio). - -int -Gateway_Handler::handle_input (ACE_HANDLE sd) -{ - ACE_DEBUG ((LM_DEBUG, "in handle_input, sd = %d\n", sd)); - if (sd == ACE_STDIN) // Handle message from stdin. - return this->xmit_stdin (); - else - // Perform the appropriate action depending on the state we are - // in. - return (this->*do_action_) (); -} - -// Action that receives the route id. - -int -Gateway_Handler::await_route_id (void) -{ - ssize_t n = this->peer ().recv (&this->routing_id_, - sizeof this->routing_id_); - - if (n != sizeof this->routing_id_) - { - if (n == 0) - ACE_ERROR_RETURN ((LM_ERROR, - "gatewayd has closed down unexpectedly\n"), -1); - else - ACE_ERROR_RETURN ((LM_ERROR, - "%p, bytes received on handle %d = %d\n", - "recv", this->get_handle (), n), -1); - } - else - ACE_DEBUG ((LM_DEBUG, "assigned routing id %d\n", - this->routing_id_)); - - // Transition to the action that waits for Peer messages. - this->do_action_ = &Gateway_Handler::await_messages; - - // Reset standard input. - ACE_OS::rewind (stdin); - - // Register this handler to receive test messages on stdin. - if (ACE_Service_Config::reactor ()->register_handler - (ACE_STDIN, this, ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "register_handler"), -1); - return 0; -} - -// Action that receives messages. - -int -Gateway_Handler::await_messages (void) -{ - ACE_Message_Block *mb = 0; - ssize_t n = this->recv_peer (mb); - - switch (n) - { - case 0: - ACE_ERROR_RETURN ((LM_ERROR, "gatewayd has closed down\n"), -1); - /* NOTREACHED */ - case -1: - if (errno == EWOULDBLOCK) - // A short-read, we'll come back and finish it up later on! - return 0; - else - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "recv_peer"), -1); - /* NOTREACHED */ - default: - { - // We got a valid message, so let's process it now! At the - // moment, we just print out the message contents... - - Event *peer_msg = (Event *) mb->rd_ptr (); - this->total_bytes_ += mb->length (); - -#if defined (VERBOSE) - ACE_DEBUG ((LM_DEBUG, - "route id = %d, len = %d, payload = %*s", - peer_msg->header_.routing_id_, peer_msg->header_.len_, - peer_msg->header_.len_, peer_msg->buf_)); -#else - ACE_DEBUG ((LM_DEBUG, - "route id = %d, cur len = %d, total len = %d\n", - peer_msg->header_.routing_id_, - peer_msg->header_.len_, - this->total_bytes_)); -#endif - delete mb; - return 0; - } - } -} - -// Periodically send messages via ACE_Reactor timer mechanism. - -int -Gateway_Handler::handle_timeout (const ACE_Time_Value &, const void *) -{ - // Skip over deactivated descriptors. - if (this->get_handle () != -1) - { - // Unbind ourselves from the map. - if (this->map_->unbind (this->get_handle ()) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "unbind")); - - // Shut down the handler. - this->handle_close (); - } - return 0; -} - -// Handle shutdown of the Gateway_Handler object. - -int -Gateway_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - if (this->get_handle () != ACE_INVALID_HANDLE) - { - ACE_DEBUG ((LM_DEBUG, "shutting down Gateway_Handler on handle %d\n", - this->get_handle ())); - - // Explicitly remove ourselves for handle 0 (the ACE_Reactor - // removes this->handle (), note that - // ACE_Event_Handler::DONT_CALL instructs the ACE_Reactor *not* - // to call this->handle_close(), which would otherwise lead to - // recursion!). - if (ACE_Service_Config::reactor ()->remove_handler - (0, ACE_Event_Handler::DONT_CALL | ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR ((LM_ERROR, "handle = %d: %p\n", - 0, "remove_handler")); - - // Deregister this handler with the ACE_Reactor. - if (ACE_Service_Config::reactor ()->remove_handler - (this, ACE_Event_Handler::DONT_CALL | ACE_Event_Handler::RWE_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "handle = %d: %p\n", - this->get_handle (), "remove_handler"), -1); - - // Close down the peer. - this->peer ().close (); - } - return 0; -} - -Gateway_Acceptor::Gateway_Acceptor (Gateway_Handler *handler) - : gateway_handler_ (handler) -{ - this->gateway_handler_->map (&this->map_); -} - -// Note how this method just passes back the pre-allocated -// Gateway_Handler instead of having the ACE_Acceptor allocate a new -// one each time! - -Gateway_Handler * -Gateway_Acceptor::make_svc_handler (void) -{ - return this->gateway_handler_; -} - -int -Gateway_Acceptor::handle_signal (int signum, siginfo_t *, ucontext_t *) -{ - ACE_DEBUG ((LM_DEBUG, "signal %S occurred\n", signum)); - return 0; -} - -/* Returns information on the currently active service. */ - -int -Gateway_Acceptor::info (char **strp, size_t length) const -{ - char buf[BUFSIZ]; - char addr_str[BUFSIZ]; - - ACE_INET_Addr addr; - - if (this->acceptor ().get_local_addr (addr) == -1) - return -1; - else if (addr.addr_to_string (addr_str, sizeof addr) == -1) - return -1; - - ACE_OS::sprintf (buf, "%s\t %s/%s %s", - "Gateway peer daemon", addr_str, "tcp", - "# IRIDIUM SRP traffic generator and data sink\n"); - - if (*strp == 0 && (*strp = ACE_OS::strdup (buf)) == 0) - return -1; - else - ACE_OS::strncpy (*strp, buf, length); - return ACE_OS::strlen (buf); -} - -// Hook called by the explicit dynamic linking facility to terminate -// the peer. - -int -Gateway_Acceptor::fini (void) -{ - HANDLER_ITERATOR mi (this->map_); - - for (MAP_ENTRY *me = 0; - mi.next (me) != 0; - mi.advance ()) - { - if (me->int_id_->get_handle () != -1) - { - ACE_DEBUG ((LM_DEBUG, "closing down handle %d\n", - me->int_id_->get_handle ())); - me->int_id_->handle_close (); - } - else - ACE_DEBUG ((LM_DEBUG, "already closed %d\n")); - me->int_id_->destroy (); // Will trigger a delete. - } - - this->gateway_handler_->destroy (); // Will trigger a delete. - return inherited::fini (); -} - -// Hook called by the explicit dynamic linking facility to initialize -// the peer. - -int -Gateway_Acceptor::init (int argc, char *argv[]) -{ - ACE_Get_Opt get_opt (argc, argv, "dp:", 0); - ACE_INET_Addr addr; - - for (int c; (c = get_opt ()) != -1; ) - { - switch (c) - { - case 'p': - addr.set (ACE_OS::atoi (get_opt.optarg)); - break; - case 'd': - break; - default: - break; - } - } - - if (ACE_Service_Config::reactor ()->register_handler (SIGPIPE, this) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "register_handler"), -1); - - if (this->open (addr) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "open"), -1); - else if (ACE_Service_Config::reactor ()->register_handler - (this, ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR_RETURN ((LM_ERROR, - "registering service with ACE_Reactor\n"), -1); - - ACE_Sig_Set sig_set; - sig_set.sig_add (SIGINT); - sig_set.sig_add (SIGQUIT); - - // Register ourselves to receive SIGINT and SIGQUIT so we can shut - // down gracefully via signals. - - if (ACE_Service_Config::reactor ()->register_handler (sig_set, - this) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "register_handler"), -1); - return 0; -} - -// Dynamically linked factory function that dynamically allocates a -// new Gateway_Acceptor object. - -ACE_Service_Object * -_alloc_peerd (void) -{ - // This function illustrates how we can associate a ACE_Svc_Handler - // with the ACE_Acceptor at initialization time. - Gateway_Handler *handler; - - ACE_NEW_RETURN (handler, Gateway_Handler, 0); - ACE_Service_Object *temp; - - ACE_NEW_RETURN (temp, Gateway_Acceptor (handler), 0); - return temp; -} diff --git a/apps/Gateway/Peer/Gateway_Handler.h b/apps/Gateway/Peer/Gateway_Handler.h deleted file mode 100644 index 6dc4539e6b7..00000000000 --- a/apps/Gateway/Peer/Gateway_Handler.h +++ /dev/null @@ -1,154 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -/* These Gateway handler classes process Peer messages sent from the - communication gateway daemon (gatewayd) to its various peers, e.g., - CF and ETS, (represented collectively in this prototype as peerd). - . These classes works as follows: - - 1. Gateway_Acceptor creates a listener endpoint and waits passively - for gatewayd to connect with it. - - 2. When gatewayd connects, Gateway_Acceptor creates an - Gateway_Handler object that sends/receives messages from - gatewayd. - - 3. Gateway_Handler waits for gatewayd to inform it of its routing - ID, which is prepended to all outgoing messages send from peerd. - - 4. Once the routing ID is set, peerd periodically sends messages to - gatewayd. Peerd also receives and "processes" messages - forwarded to it from gatewayd. In this program, peerd - "processes" messages by writing them to stdout. */ - -#if !defined (GATEWAY_HANDLER) -#define GATEWAY_HANDLER - -#include "ace/Service_Config.h" -#include "ace/Svc_Handler.h" -#include "ace/Acceptor.h" -#include "ace/SOCK_Stream.h" -#include "ace/SOCK_Acceptor.h" -#include "ace/INET_Addr.h" -#include "ace/Map_Manager.h" -#include "Peer_Message.h" - -// Forward declaration. -class Gateway_Handler; - -// Maps a ACE_HANDLE onto a Gateway_Handler *. -typedef ACE_Map_Manager <ACE_HANDLE, Gateway_Handler *, ACE_Null_Mutex> HANDLER_MAP; -typedef ACE_Map_Iterator<ACE_HANDLE, Gateway_Handler *, ACE_Null_Mutex> HANDLER_ITERATOR; -typedef ACE_Map_Entry <ACE_HANDLE, Gateway_Handler *> MAP_ENTRY; - -// Handle Peer messages arriving as events. - -class Gateway_Handler : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> -{ -public: - Gateway_Handler (ACE_Thread_Manager * = 0); - - virtual int open (void * = 0); - // Initialize the handler (called by ACE_Acceptor::handle_input()) - - virtual int handle_input (ACE_HANDLE); - // Receive and process peer messages. - - virtual int put (ACE_Message_Block *, ACE_Time_Value *tv = 0); - // Send a message to a gateway (may be queued if necessary). - - virtual int handle_output (ACE_HANDLE); - // Finish sending a message when flow control conditions abate. - - virtual int handle_timeout (const ACE_Time_Value &, - const void *arg); - // Periodically send messages via ACE_Reactor timer mechanism. - - virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE, - ACE_Reactor_Mask = ACE_Event_Handler::RWE_MASK); - // Perform object termination. - - void map (HANDLER_MAP *); - // Cache a binding to the HANDLER_MAP. - -protected: - typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> inherited; - - // We'll allow up to 16 megabytes to be queued per-output - // channel!!!! This is clearly a policy in search of refinement... - enum { QUEUE_SIZE = 1024 * 1024 * 16 }; - - int handle_signal (int signum, siginfo_t *, ucontext_t *); - - Peer_Header::ROUTING_ID routing_id_; - // Routing ID of the peer (obtained from gatewayd). - - virtual int nonblk_put (ACE_Message_Block *mb); - // Perform a non-blocking put(). - - virtual int recv_peer (ACE_Message_Block *&); - // Receive an Peer message from gatewayd. - - virtual int send_peer (ACE_Message_Block *); - // Send an Peer message to gatewayd. - - int xmit_stdin (void); - // Receive a message from stdin and send it to the gateway. - - int (Gateway_Handler::*do_action_) (void); - // Pointer-to-member-function for the current action to run in this state. - - int await_route_id (void); - // Action that receives the route id. - - int await_messages (void); - // Action that receives messages. - - ACE_Message_Block *msg_frag_; - // Keep track of message fragment to handle non-blocking recv's from gateway. - - size_t total_bytes_; - // The total number of bytes sent/received to the gateway. - - HANDLER_MAP *map_; - // Maps the ACE_HANDLE onto the Gateway_Handler *. -}; - -// A factory class that accept connections from gatewayd and -// dynamically creates a new Gateway_Handler object to do the dirty work. - -class Gateway_Acceptor : public ACE_Acceptor<Gateway_Handler, ACE_SOCK_ACCEPTOR> -{ -public: - // = Initialization methods, called when dynamically linked. - Gateway_Acceptor (Gateway_Handler *handler); - virtual int init (int argc, char *argv[]); - // Initialize the acceptor. - - virtual int info (char **, size_t) const; - // Return info about this service. - - virtual int fini (void); - // Perform termination. - - virtual Gateway_Handler *make_svc_handler (void); - // Factory method that creates the Gateway_Handler once. - - virtual int handle_signal (int signum, siginfo_t *, ucontext_t *); - // Handle various signals (e.g., SIGPIPE) - - HANDLER_MAP map_; - // Maps the ACE_HANDLE onto the Gateway_Handler *. - - Gateway_Handler *gateway_handler_; - // Pointer to memory allocated exactly once. - - typedef ACE_Acceptor<Gateway_Handler, ACE_SOCK_ACCEPTOR> inherited; -}; - -// Factory function that allocates a new Peer daemon. -extern "C" ACE_Service_Object *_alloc_peerd (void); - -#endif /* GATEWAY_HANDLER */ - diff --git a/apps/Gateway/Peer/Makefile b/apps/Gateway/Peer/Makefile deleted file mode 100644 index 3176a62b455..00000000000 --- a/apps/Gateway/Peer/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Peer portion of the Gateway application -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -BIN = peerd - -FILES = Peer - -LSRC = $(addsuffix .cpp,$(FILES)) -LOBJ = $(addsuffix .o,$(FILES)) -SHOBJ = $(addsuffix .so,$(FILES)) - -LDLIBS = $(addprefix .shobj/,$(SHOBJ)) - -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -BUILD = $(VBIN) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nonested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.lib.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.bin.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.local.GNU - -#---------------------------------------------------------------------------- -# Local targets -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -.obj/Peer.o .shobj/Peer.so: Peer.cpp \ - $(WRAPPER_ROOT)/ace/Get_Opt.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/stdcpp.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/ACE.i \ - Peer.h \ - $(WRAPPER_ROOT)/ace/Service_Config.h \ - $(WRAPPER_ROOT)/ace/Service_Object.h \ - $(WRAPPER_ROOT)/ace/Shared_Object.h \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - $(WRAPPER_ROOT)/ace/Thread_Manager.h \ - $(WRAPPER_ROOT)/ace/Thread.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Set.h \ - $(WRAPPER_ROOT)/ace/Proactor.h \ - $(WRAPPER_ROOT)/ace/Message_Block.h \ - $(WRAPPER_ROOT)/ace/Malloc.h \ - $(WRAPPER_ROOT)/ace/Malloc_T.h \ - $(WRAPPER_ROOT)/ace/Memory_Pool.h \ - $(WRAPPER_ROOT)/ace/Signal.h \ - $(WRAPPER_ROOT)/ace/Mem_Map.h \ - $(WRAPPER_ROOT)/ace/Timer_Queue.h \ - $(WRAPPER_ROOT)/ace/Timer_Queue.i \ - $(WRAPPER_ROOT)/ace/ReactorEx.h \ - $(WRAPPER_ROOT)/ace/Token.h \ - $(WRAPPER_ROOT)/ace/Reactor.h \ - $(WRAPPER_ROOT)/ace/Handle_Set.h \ - $(WRAPPER_ROOT)/ace/Pipe.h \ - $(WRAPPER_ROOT)/ace/Pipe.i \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.h \ - $(WRAPPER_ROOT)/ace/SOCK_IO.h \ - $(WRAPPER_ROOT)/ace/SOCK.h \ - $(WRAPPER_ROOT)/ace/Addr.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.h \ - $(WRAPPER_ROOT)/ace/IPC_SAP.i \ - $(WRAPPER_ROOT)/ace/SOCK.i \ - $(WRAPPER_ROOT)/ace/SOCK_IO.i \ - $(WRAPPER_ROOT)/ace/INET_Addr.h \ - $(WRAPPER_ROOT)/ace/SOCK_Stream.i \ - $(WRAPPER_ROOT)/ace/Reactor.i \ - $(WRAPPER_ROOT)/ace/Svc_Conf_Tokens.h \ - $(WRAPPER_ROOT)/ace/Svc_Handler.h \ - $(WRAPPER_ROOT)/ace/Synch_Options.h \ - $(WRAPPER_ROOT)/ace/Task.h \ - $(WRAPPER_ROOT)/ace/Task_T.h \ - $(WRAPPER_ROOT)/ace/Message_Queue.h \ - $(WRAPPER_ROOT)/ace/IO_Cntl_Msg.h \ - $(WRAPPER_ROOT)/ace/Acceptor.h \ - $(WRAPPER_ROOT)/ace/Strategies.h \ - $(WRAPPER_ROOT)/ace/Acceptor.i \ - $(WRAPPER_ROOT)/ace/SOCK_Acceptor.h \ - $(WRAPPER_ROOT)/ace/Map_Manager.h \ - Event.h - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/apps/Gateway/Peer/Peer_Message.h b/apps/Gateway/Peer/Peer_Message.h deleted file mode 100644 index 67f57f148cb..00000000000 --- a/apps/Gateway/Peer/Peer_Message.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// Define the Peer message schema (this may change). - -#if !defined (PEER_MESSAGE) -#define PEER_MESSAGE - -// Fixed sized header. - -class Peer_Header -{ -public: -// Type used to route messages from gatewayd. - typedef short ROUTING_ID; - - enum - { - INVALID_ID = -1 // No peer may use this number. - }; - - // Source ID. - ROUTING_ID routing_id_; - - // Length of the message in bytes. - size_t len_; -}; - -// Variable-sized message (buf_ may be variable-sized between -// 0 and MAX_PAYLOAD_SIZE). - -class Peer_Message -{ -public: - // The maximum size of an Peer message (see Peer protocol specs for exact #). - enum { MAX_PAYLOAD_SIZE = 1024 }; - - Peer_Header header_; - - // Message payload - char buf_[MAX_PAYLOAD_SIZE]; -}; - -#endif /* PEER_MESSAGE */ diff --git a/apps/Gateway/Peer/peerd.cpp b/apps/Gateway/Peer/peerd.cpp deleted file mode 100644 index ab59567fc08..00000000000 --- a/apps/Gateway/Peer/peerd.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// $Id$ - -// Driver for the peer daemon (peerd). Note that this is completely -// generic code due to the Service Configurator framework! - -#include "ace/Service_Config.h" -#include "Peer.h" - -int -main (int argc, char *argv[]) -{ - ACE_Service_Config daemon; - - if (daemon.open (argc, argv) == -1) - { - if (errno != ENOENT) - ACE_ERROR ((LM_ERROR, "%p\n%a", "open", 1)); - else // Use static binding. - { - ACE_Service_Object *so = ACE_SVC_INVOKE (Peer_Acceptor); - - if (so->init (argc - 1, argv + 1) == -1) - ACE_ERROR ((LM_ERROR, "%p\n%a", "init", 1)); - } - } - - // Create an adapter to end the event loop. - ACE_Sig_Adapter sa ((ACE_Sig_Handler_Ex) ACE_Service_Config::end_reactor_event_loop); - - ACE_Sig_Set sig_set; - sig_set.sig_add (SIGINT); - sig_set.sig_add (SIGQUIT); - - // Register ourselves to receive SIGINT and SIGQUIT so we can shut - // down gracefully via signals. - ACE_Service_Config::reactor ()->register_handler (sig_set, &sa); - - // Run forever, performing the configured services until we are shut - // down by a SIGINT/SIGQUIT signal. - - daemon.run_reactor_event_loop (); - - return 0; -} diff --git a/apps/Gateway/Peer/svc.conf b/apps/Gateway/Peer/svc.conf deleted file mode 100644 index 6c9bc3bc3d7..00000000000 --- a/apps/Gateway/Peer/svc.conf +++ /dev/null @@ -1,3 +0,0 @@ -#static Svc_Manager "-d -p 291" -dynamic Peer1 Service_Object *.shobj/Peer:_make_Peer_Acceptor() active "-p 10004" -#dynamic Peer2 Service_Object *.shobj/Peer:_make_Peer_Acceptor() active "-p 10003" diff --git a/apps/Gateway/README b/apps/Gateway/README deleted file mode 100644 index ffd7e52bdf4..00000000000 --- a/apps/Gateway/README +++ /dev/null @@ -1,92 +0,0 @@ -OVERVIEW - -This directory contains source code for a prototype application-level -gateway implemented with ACE. This prototype was developed in my -cs422 OS class at Washington University. It illustrates the use of -Event Channels to forward events from Suppliers to Consumers in a -distributed system. - -You can get a paper that explains the patterns used in this -implementation at the following WWW URL: - -http://www.cs.wustl.edu/~schmidt/TAPOS-95.ps.gz - -DIRECTORY STRUCTURE - -There are 2 directories: - -Gateway - - -- The application Gateway, which must be started *after* all - the Peers described below). This process reads the - connection_config and consumer_config files: - - 1. The connection_config file is used to establish the "physical - configuration." It tells the Gateway what connections - to establish with particular hosts using particular - ports. - - 2. The consumer_config file is used to establish the "logical - configuration." It tells the Gateway how to forward - data coming from "sources" to the appropriate - "destinations." -Peer - - -- The test driver programs that must be started *before* the - Gateway. To do anything interesting you'll need at least - two Peers: one to supply events and one to consume events. - In the configuration files, these two types of Peers are - designated as follows: - - 1. Supplier Peers (designated by an 'S' in the Gateway's - connection_config configuration file). These Peers are - "suppliers" of events to the Gateway. - - 2. Consumer Peers (designated by an 'C' in the Gateway's - connection_config file). These Peers are "consumers" of - events forwarded by the Gateway (forwarding is based on - the settings in the consumer_config configuration file). - -RUNNING THE TESTS - -To run the tests do the following: - -1. Compile everything (i.e., first compile the ACE libraries, then - compile the the Gateway directories). - -2. Edit the consumer_config and connection_config files as discussed - above to indicate the desired physical and logical mappings. - -3. Start up the Peers (peerd). You can start up as many as you - like, as per the connection_config file, but you'll need at least - two (one to supply and one to consume). I typically start up each - Peer in a different window on a different machine. The Peers - should print out some diagnostic info and then block awaiting - connections from the Gateway. - -4. Start up the Gateway (gatewayd). This will print out a bunch of - events as it reads the config files and connects to all the Peers. - Assuming everything works, then all the Peers will be connected. - If some of the Peers aren't set up correctly then the Gateway will - use an exponential backoff algorithm to attempt to reestablish - those connections. - -5. Once the Gateway has connected with all the Peers you can send - events from Supplier Peers by typing commands in the Peer window. - This Supplier will be sent to the Gateway, which will forward the - event to all Consumer Peers that have "subscribed" to receive these - events. - - Note that if you type ^C in a Peer window the Peer will shutdown - its handlers and exit. The Gateway will detect this and will start - trying to reestablish the connection using the same exponential - backoff algorithm it used for the initial connection establishment. - -7. When you want to terminate a Gateway, just type ^C and the process - will shut down gracefully. - -Please let me know if there are any questions. - - Doug - - schmidt@cs.wustl.edu diff --git a/apps/Makefile b/apps/Makefile deleted file mode 100644 index 3883598f646..00000000000 --- a/apps/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the apps directory -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -INFO = README - -DIRS = Gateway - -# The following directory isn't compiled by default since haven't -# finished integrating it into ACE... -# -# Orbix-Examples - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nolocal.GNU - diff --git a/apps/Orbix-Examples/Event_Comm/Consumer/Input_Handler.cpp b/apps/Orbix-Examples/Event_Comm/Consumer/Input_Handler.cpp deleted file mode 100644 index 004b54d6fd5..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Consumer/Input_Handler.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "Input_Handler.h" -// $Id$ - -#include "Notification_Receiver_Handler.h" - -#if defined (ACE_HAS_ORBIX) - -Input_Handler::~Input_Handler (void) -{ - ACE_DEBUG ((LM_DEBUG, "closing down Input_Handler::~Input_Handler\n")); - this->handle_close (); -} - -int -Input_Handler::consumer_initiated_shutdown (void) -{ - return this->consumer_initiated_shutdown_; -} - -void -Input_Handler::consumer_initiated_shutdown (int c) -{ - this->consumer_initiated_shutdown_ = c; -} - -ACE_HANDLE -Input_Handler::get_handle (void) const -{ - return this->handle_; -} - -int -Input_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - ACE_DEBUG ((LM_DEBUG, "closing down Consumer::Input_Handler\n")); - - Event_Comm::Notification_Receiver *receiver = this->receiver_handler_->receiver (); - Event_Comm::Notifier *notifier = this->receiver_handler_->notifier (); - - if (this->consumer_initiated_shutdown ()) - { - // Only try to unsubscribe if the Consumer initiated the - // shutdown. Otherwise, the Supplier initiated it and - // it has probably gone away by now! - TRY { - // Gracefully shutdown the Receiver by removing it - // from the Notifier's internal map. - - notifier->unsubscribe (receiver, "", IT_X); - } CATCHANY { - cerr << IT_X << endl; - } ENDTRY; - } - // Don't execute a callback here otherwise we'll recurse indefinitely! - if (ACE_Service_Config::reactor ()->remove_handler (this, ACE_Event_Handler::READ_MASK - | ACE_Event_Handler::DONT_CALL) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "remove_handler")); - - // *Must* be allocated dyanmically! - delete (void *) this; - return 0; -} - -Input_Handler::Input_Handler (Notification_Receiver_Handler *ch, - ACE_HANDLE handle) - : receiver_handler_ (ch), - handle_ (handle), - consumer_initiated_shutdown_ (0) -{ - if (ACE_Service_Config::reactor ()->register_handler (this, - ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR ((LM_ERROR, "Input_Handler::Input_Handler\n")); -} - -int -Input_Handler::handle_input (ACE_HANDLE h) -{ - char buf[BUFSIZ]; - ssize_t n; - - // Read up to BUFSIZ worth of data from ACE_HANDLE h. - - n = ACE_OS::read (h, buf, sizeof buf - 1); - - if (n > 0) - { - // Null terminate the buffer, replacing the '\n' with '\0'. - if (buf[n - 1] == '\n' || buf[n - 1] == EOF) - buf[n - 1] = '\0'; - else - buf[n] = '\0'; - ACE_DEBUG ((LM_DEBUG, "notifying for event %s\n", buf)); - - } - else - { - ACE_OS::strcpy (buf, "quit"); - ACE_DEBUG ((LM_DEBUG, "shutting down Input_Handler\n")); - } - - Event_Comm::Notifier *notifier = this->receiver_handler_->notifier (); - - ACE_ASSERT (notifier != 0); - - if (ACE_OS::strcmp (buf, "quit") == 0) - { - // Consumer wants to shutdown. - this->consumer_initiated_shutdown (1); - - // Tell the main event loop to shutdown. - ACE_Service_Config::end_reactor_event_loop (); - } - else - { - TRY { - Event_Comm::Notification notification; - - notification.tag_ = ACE_OS::strdup (buf); - - notifier->send_notification (notification, IT_X); - } - CATCHANY { - cerr << "Unexpected exception " << IT_X << endl; - } ENDTRY; - } - - /* NOTREACHED */ - return 0; -} -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/Consumer/Input_Handler.h b/apps/Orbix-Examples/Event_Comm/Consumer/Input_Handler.h deleted file mode 100644 index 673965adacb..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Consumer/Input_Handler.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Input_Handler.h -// -// = DESCRIPTION -// Subclass of ACE ACE_Service_Object that receives unsubscribes from -// the Notifier when input is received from the keyboard. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_INPUT_HANDLER_H) -#define _INPUT_HANDLER_ - -#include "ace/Service_Config.h" - -#if defined (ACE_HAS_ORBIX) -// Forward declaration. -class Notification_Receiver_Handler; - -class Input_Handler : public ACE_Service_Object - // = TITLE - // Handles input events generated from a keyboard. - // - // = DESCRIPTION -{ -public: - Input_Handler (Notification_Receiver_Handler *, ACE_HANDLE h = 0); - - virtual int handle_input (ACE_HANDLE); - // Dispatch the callback when events occur. - - virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE, - ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK); - // Close down the handler. - - int consumer_initiated_shutdown (void); - // Report whether the Consumer initiated the shutdown. - - void consumer_initiated_shutdown (int); - // Indicate that the Consumer initiated the shutdown. - -private: - ~Input_Handler (void); - // Ensure dynamic allocation. - - virtual ACE_HANDLE get_handle (void) const; - - ACE_HANDLE handle_; - // ACE_HANDLE where the input comes from. - - Notification_Receiver_Handler *receiver_handler_; - // Pointer to the <Notification_Receiver_Handler> that - // receives notifications from the <Event_Comm::Notifier>. - - int consumer_initiated_shutdown_; - // Keep track of whether the Consumer initiated the shutdown. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _INPUT_HANDLER_H */ diff --git a/apps/Orbix-Examples/Event_Comm/Consumer/Makefile b/apps/Orbix-Examples/Event_Comm/Consumer/Makefile deleted file mode 100644 index 872b72a1880..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Consumer/Makefile +++ /dev/null @@ -1,165 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Consumer. -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -BIN = consumer - -FILES = Notification_Receiver_Handler \ - Input_Handler - -LSRC = $(addsuffix .cpp,$(FILES)) consumer.cpp -LOBJ = $(addsuffix .o,$(FILES)) -SHOBJ = $(addsuffix .so,$(FILES)) - -SRX = ../src/.obj - -LDLIBS = $(addprefix .shobj/,$(LOBJ)) ../src/libEvent_Comm.a -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -BUILD = $(VBIN) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nonested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.lib.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.bin.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.local.GNU - -#---------------------------------------------------------------------------- -# Local targets -#---------------------------------------------------------------------------- - -CPPFLAGS += -I../include -VLDLIBS += -lgen - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -Notification_Receiver_Handler.o: Notification_Receiver_Handler.cpp \ - Notification_Receiver_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/CORBA_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Event_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Signal.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Token.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Shared_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Manager.h \ - ../include/Event_Comm_i.h ../include/Notification_Receiver_i.h \ - ../include/Notifier_i.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Map_Manager.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.i \ - ../include/Event_Comm.hh -Input_Handler.o: Input_Handler.cpp Input_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Event_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Signal.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Token.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Shared_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Manager.h \ - Notification_Receiver_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/CORBA_Handler.h \ - ../include/Event_Comm_i.h ../include/Notification_Receiver_i.h \ - ../include/Notifier_i.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Map_Manager.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.i \ - ../include/Event_Comm.hh -consumer.o: consumer.cpp \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - Notification_Receiver_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/CORBA_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Event_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Signal.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Token.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Shared_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Manager.h \ - ../include/Event_Comm_i.h ../include/Notification_Receiver_i.h \ - ../include/Notifier_i.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Map_Manager.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.i \ - ../include/Event_Comm.hh Input_Handler.h - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/apps/Orbix-Examples/Event_Comm/Consumer/Notification_Receiver_Handler.cpp b/apps/Orbix-Examples/Event_Comm/Consumer/Notification_Receiver_Handler.cpp deleted file mode 100644 index 31164061eea..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Consumer/Notification_Receiver_Handler.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// $Id$ - -#include "Notification_Receiver_Handler.h" - -#if defined (ACE_HAS_ORBIX) - -#if defined (ACE_HAS_MT_ORBIX) -typedef ACE_MT_CORBA_Handler CORBA_HANDLER; -#else -typedef ACE_ST_CORBA_Handler CORBA_HANDLER; -#endif /* ACE_HAS_MT_ORBIX */ - -int -Notification_Receiver_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ -// ACE_ST_CORBA_Handler::remove_service (Event_Comm_Notification_Receiver_IMPL); - - if (this->receiver_ != 0) - { - ACE_DEBUG ((LM_DEBUG, "closing down Notification_Receiver_Handler\n")); - CORBA_HANDLER::instance ()->deactivate_service (Event_Comm_Notification_Receiver_IMPL, - this->receiver_->_marker ()); - CORBA::release (this->receiver_); - this->receiver_ = 0; - CORBA::release (this->notifier_); - this->notifier_ = 0; - // *Must* be allocated dynamically in order to delete this! - delete this; - } - return 0; -} - -Notification_Receiver_Handler::Notification_Receiver_Handler (int argc, char *argv[]) - : notifier_ (0), - receiver_ (0) -{ - const char *server_name = Event_Comm_Notification_Receiver_IMPL; - char buf[BUFSIZ]; - char *receiver_marker = buf; - char *filtering_criteria; - char *host; - char *notifier_marker; - char *service_location = argv[0]; - - // First see if we have any environment variables. - filtering_criteria = ACE_OS::getenv ("FILTERING_CRITERIA"); - host = ACE_OS::getenv ("HOST"); - notifier_marker = ACE_OS::getenv ("NOTIFIER_MARKER"); - - // Then override these variables with command-line arguments. - filtering_criteria = argc > 1 ? argv[1] : ""; - host = argc > 2 ? argv[2] : "tango.cs"; - notifier_marker = argc > 3 ? argv[3] : "notifier:" Event_Comm_Notifier_IR; - - CORBA::Orbix.setDiagnostics (0); - - struct utsname name; - - // Make the marker name be the "/hostname/processid" - ACE_OS::uname (&name); - sprintf (buf, "/%s/%d", name.nodename, ACE_OS::getpid ()); - - CORBA_HANDLER::instance ()->activate_service (Event_Comm_Notification_Receiver_IMPL, - receiver_marker, service_location); - - // Create the receiver object. - this->receiver_ = new TIE_Event_Comm_Notification_Receiver (Notification_Receiver_i) - (new Notification_Receiver_i); - - this->receiver_->_marker (receiver_marker); - - ACE_ASSERT (this->receiver_); - - TRY { - // Get a binding to the notifier. - this->notifier_ = Event_Comm::Notifier::_bind (notifier_marker, host, IT_X); - - if (this->notifier_ != CORBA::OBJECT_NIL) - // Subscribe ourselves with the notifier's broker. - this->notifier_->subscribe (this->receiver_, - filtering_criteria, IT_X); - } CATCHANY { - cerr << "Unexpected exception " << IT_X << endl; - ACE_OS::exit (1); - } ENDTRY; - // Print out context. - - receiver_marker = (char *) this->receiver_->_marker (); - CORBA::BOA::activationMode mode = CORBA::Orbix.myActivationMode (); - ACE_DEBUG ((LM_DEBUG, "starting up a %spersistent server in mode %d with marker name %s\n", - mode == CORBA::BOA::persistentActivationMode ? "" : "non-", - mode, receiver_marker)); -} - -Event_Comm::Notification_Receiver * -Notification_Receiver_Handler::receiver (void) -{ - return this->receiver_; -} - -Event_Comm::Notifier * -Notification_Receiver_Handler::notifier (void) -{ - return this->notifier_; -} - -// Destroy a Receiver target object. - -Notification_Receiver_Handler::~Notification_Receiver_Handler (void) -{ - this->handle_close (-1, ACE_Event_Handler::ALL_EVENTS_MASK); -} - -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/Consumer/Notification_Receiver_Handler.h b/apps/Orbix-Examples/Event_Comm/Consumer/Notification_Receiver_Handler.h deleted file mode 100644 index a676b84e2f3..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Consumer/Notification_Receiver_Handler.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notifier_Receiver_Handler.h -// -// = DESCRIPTION -// Subclass of Corba_Handler that sets up the Notification_Receiver handler -// for use with the ACE ACE_Reactor. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_NOTIFICATION_RECEIVER_HANDLER_H) -#define _NOTIFICATION_RECEIVER_HANDLER_H - -#include "ace/CORBA_Handler.h" -#include "Event_Comm_i.h" - -#if defined (ACE_HAS_ORBIX) - -class Notification_Receiver_Handler - // = TITLE - // Subclass of Corba_Handler that sets up the Notification Receiver handler - // for use with the ACE ACE_Reactor. - // - // = DESCRIPTION - // Note that this class doesn't inherit from ACE_ST_CORBA_Handler (unlike - // the Supplier's Notifier_Handler class). Instead, it uses an - // alternative interface that can be called directly. -{ -public: - Notification_Receiver_Handler (int argc, char *argv[]); - - Event_Comm::Notification_Receiver *receiver (void); - Event_Comm::Notifier *notifier (void); - - virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE, - ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK); - // Close down the handler. - -private: - ~Notification_Receiver_Handler (void); - // Ensure dynamic allocation. - - Event_Comm::Notification_Receiver *receiver_; - // Pointer to an IDL <Notification_Receiver> proxy object. - - Event_Comm::Notifier *notifier_; - // Pointer to an IDL <Notifier> proxy object. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _NOTIFICATION_RECEIVER_HANDLER_H */ diff --git a/apps/Orbix-Examples/Event_Comm/Consumer/consumer.cpp b/apps/Orbix-Examples/Event_Comm/Consumer/consumer.cpp deleted file mode 100644 index 73717f66bd3..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Consumer/consumer.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// Consumer driver for the Orbix Notification example. - - -#include "Notification_Receiver_Handler.h" -#include "Input_Handler.h" - -#if defined (ACE_HAS_ORBIX) - -class Consumer : public ACE_Event_Handler -{ -public: - Consumer (int argc, char *argv[]); - ~Consumer (void); - - void run (void); - // Execute the consumer; - -private: - virtual int handle_signal (int signum, siginfo_t *, ucontext_t *); - - virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); - - Input_Handler *ih_; - // Handler for keyboard input. - - Notification_Receiver_Handler *nrh_; - // Handler for CORBA Consumer. - - ACE_Service_Config daemon_; - // ACE server event-loop mechanism. -}; - -int -Consumer::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - ACE_DEBUG ((LM_DEBUG, "closing down Consumer\n")); - return 0; -} - -int -Consumer::handle_signal (int signum, siginfo_t *, ucontext_t *) -{ - ACE_DEBUG ((LM_DEBUG, "%S\n", signum)); - - // Indicate that the consumer initiated the shutdown. - this->ih_->consumer_initiated_shutdown (1); - - // Shut down the event loop. - ACE_Service_Config::end_reactor_event_loop (); - return 0; -} - -// Run the event loop until someone calls -// calls ACE_Service_Config::end_reactor_event_loop(). - -void -Consumer::run (void) -{ - if (ACE_Service_Config::run_reactor_event_loop () == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "run_reactor_event_loop")); -} - -Consumer::Consumer (int argc, char *argv[]) - : ih_ (0), - nrh_ (0) -{ - // Initialize the server. - if (this->daemon_.open (argc, argv) == -1) - { - if (errno == ENOENT) // There's no svc.conf file, so use static linking... - { - ACE_DEBUG ((LM_DEBUG, "no config file, using static binding\n")); - // The constructor registers the handlers... - this->nrh_ = new Notification_Receiver_Handler (argc, argv); - ACE_ASSERT (this->nrh_ != 0); - this->ih_ = new Input_Handler (this->nrh_); - ACE_ASSERT (this->ih_ != 0); - } - else - ACE_ERROR ((LM_ERROR, "%p\n%a", "open", 1)); - } - - if (ACE_Service_Config::reactor ()->register_handler (SIGINT, this) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "register_handler")); -} - -Consumer::~Consumer (void) -{ - // Free up the handlers if they were statically bound. - this->ih_->handle_close (); - this->nrh_->handle_close (); -} - -int -main (int argc, char *argv[]) -{ - // Initialize the supplier and consumer object references. - Consumer consumer (argc, argv); - - // Loop forever handling events. - consumer.run (); - - return 0; -} -#else /* !defined ACE_HAS_ORBIX */ -int -main (int argc, char *argv[]) -{ - ACE_ERROR_RETURN ((LM_ERROR, "you must have Orbix to run application %s\n", argv[0]), 1); -} -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/Makefile b/apps/Orbix-Examples/Event_Comm/Makefile deleted file mode 100644 index 3e0c8ae2dd8..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the consumer/supplier notification application -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -INFO = README - -DIRS = libsrc \ - Consumer \ - Supplier - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nolocal.GNU - diff --git a/apps/Orbix-Examples/Event_Comm/README b/apps/Orbix-Examples/Event_Comm/README deleted file mode 100644 index 1bd7b5d8c45..00000000000 --- a/apps/Orbix-Examples/Event_Comm/README +++ /dev/null @@ -1,109 +0,0 @@ -OVERVIEW - -This directory contains source code for a prototype CORBA-based -distributed notification mechanism. This mechanism implements a -"publish/subscribe" communication protocol. It allows Suppliers to -pass messages containing object references to a dynamically managed -group of Consumers. This is similar to the OMG COSS Event Service, -though not as sophisticated. - -This example also illustrates how to integrate Orbix with the ACE -libraries. - -DIRECTORY STRUCTURE - -There are 4 directories: - -Supplier - - -- The supplier test driver, which must be started - first. It has an instance of an IDL Notifier - object. This object accepts subscriptions from Consumers - and forwards events sent to it either via Consumers or - via its standard input. - - The Supplier must be registered with the ORB using the - following command: - - % putit Event_Comm_Notifier <pathname>/supplier - -Consumer - - -- The consumer test driver, which must be started - after the Supplier. It has an instance of an - IDL Notification_Receiver object. This object is - used to receive notifications from the Notifier object - residing in the Supplier. When the Consumer starts up it - gets an object reference to the Supplier's Notifier. - It then subscribes its Notification_Receiver object with - the Supplier's Notifier by passing an object reference. - - In addition to passing an object reference to a - Notification_Receiver, the Consumer also may specify a - filtering criteria, which is a regular expression. If - the filtering criteria is the string "" then the Notifier - will send all Notifications to the Consumer (i.e., "" is - treated as a "wildcard"). Otherwise, the filtering - criteria is considered to be a regular expression, - and only those Notification tags that match the regular - expression will be forwarded to the Consumer. The regular - expressions are those used by ed(1) (see the regexp(5) - manual page for more info). - - The Consumer must be registered with the ORB - using the following command: - - % putit Event_Comm_Notification_Receiver <pathname>/consumer - -include - - -- This contains links to the appropriate header - files. - -libsrc - - -- This contains the IDL files and IDL implementation - classes that support the distributed notification scheme. - These are shared by the Consumer and Supplier. - -RUNNING THE TESTS - -To run the tests do the following: - -1. Compile everything. - -2. Start up the Orbix daemon (orbixd) if it's not already - running. - -3. Register the Consumer (i.e., Notification_Receiver) and Supplier - (i.e., Notifier) with the Orbix daemon (orbixd), as described - above. - -4. Start the Supplier/supplier executable. - -5. Start up as many copies of the Consumer/consumer as you'd like. - Typically, I run each one in its own window. If you'd like to use - different machines make sure that you start up the Orbix daemon on - each one and register the Consumer. - -6. Once the Consumers have subscribed you can send them info by typing - commands in the Supplier window. These will be sent to all the - Consumers who have subscribed. Likewise, you can send messages - from a Consumer to all other Consumers by typing messages in a - Consumer window. - - Note that if you type "quit", ^D, or ^C in a Consumer window the - Consumer will unsubscribe and shutdown its handlers and exit. - Likewise, if you type "quit", ^D, or ^C in the Supplier window - the Supplier will disconnect all of its Consumers and exit. - When a Consumer is disconnected from its Supplier it automatically - shuts itself down. - -7. When you want to terminate a Consumer or a Supplier, just type ^C - and the process will shut down gracefully. - -Please let me know if there are any questions. - - Doug - -schmidt@cs.wustl.edu diff --git a/apps/Orbix-Examples/Event_Comm/Supplier/Input_Handler.cpp b/apps/Orbix-Examples/Event_Comm/Supplier/Input_Handler.cpp deleted file mode 100644 index 0769ecfcd69..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Supplier/Input_Handler.cpp +++ /dev/null @@ -1,120 +0,0 @@ -#include "Event_Comm.hh" -// $Id$ - -#include "Notifier_Handler.h" -#include "Input_Handler.h" - -#if defined (ACE_HAS_ORBIX) - -int -Input_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - ACE_DEBUG ((LM_DEBUG, "closing down Supplier::Input_Handler\n")); - - Event_Comm::Notifier *notifier = this->notifier_->notifier (); - ACE_ASSERT (notifier != 0); - - ACE_OS::fclose (this->fp_); - - TRY { - // Disconnect all the consumers gracefully. - notifier->send_disconnect ("quit", IT_X); - } CATCHANY { - cerr << IT_X << endl; - } ENDTRY; - - // Don't execute a callback here otherwise we'll recurse indefinitely! - if (ACE_Service_Config::reactor ()->remove_handler (this, ACE_Event_Handler::READ_MASK - | ACE_Event_Handler::DONT_CALL) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "remove_handler")); - - // *Must* be allocated dyanmically! - delete (void *) this; - return 0; -} - -Input_Handler::Input_Handler (Notifier_Handler *notifier, - ACE_HANDLE handle) // Use stdin by default. - : notifier_ (notifier), - handle_ (handle) -{ - // Register ourselves with the ACE_Reactor so that input events - // cause our handle_input() method to be dispatched automatically. - - if (ACE_Service_Config::reactor ()->register_handler (this, - ACE_Event_Handler::READ_MASK) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "register_handler")); - - this->fp_ = ACE_OS::fdopen (handle, "r"); - - if (this->fp_ == 0) - ACE_ERROR ((LM_ERROR, "%p\n", "fdopen")); -} - -Input_Handler::~Input_Handler (void) -{ - ACE_DEBUG ((LM_DEBUG, "closing down Input_Handler::~Input_Handler\n")); - this->handle_close (); -} - -ACE_HANDLE -Input_Handler::get_handle (void) const -{ - return this->handle_; -} - -// Frame input events and notify <Consumers>. - -int -Input_Handler::handle_input (ACE_HANDLE h) -{ - char buf[BUFSIZ]; - - // Read up to BUFSIZ worth of data from ACE_HANDLE h. - - if (ACE_OS::fgets (buf, sizeof buf - 1, this->fp_) == 0) - { - ACE_OS::strcpy (buf, "quit"); - ACE_DEBUG ((LM_DEBUG, "shutting down Input_Handler\n")); - } - else - { - size_t n = ACE_OS::strlen (buf); - - // Null terminate the buffer, replacing the '\n' with '\0'. - if (buf[n - 1] == '\n' || buf[n - 1] == EOF) - buf[n - 1] = '\0'; - else - buf[n] = '\0'; - ACE_DEBUG ((LM_DEBUG, "notifying for event %s\n", buf)); - } - - Event_Comm::Notifier *notifier = this->notifier_->notifier (); - ACE_ASSERT (notifier != 0); - - if (ACE_OS::strcmp (buf, "quit") == 0) - // Tell the main event loop to shutdown. - ACE_Service_Config::end_reactor_event_loop (); - else - { - // Use the notifier to notify Consumers. - TRY { - Event_Comm::Notification notification; - - // Pass the buf over in the tag field. - notification.tag_ = ACE_OS::strdup (buf); - - // This is where the "any" value goes or the object reference... - // notification.value_ = ... - - // Forward <Notification> to all <Notification_Receivers>. - notifier->send_notification (notification, IT_X); - } - CATCHANY { - cerr << "unexpected exception " << IT_X << endl; - } ENDTRY; - } - return 0; -} - -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/Supplier/Input_Handler.h b/apps/Orbix-Examples/Event_Comm/Supplier/Input_Handler.h deleted file mode 100644 index c888b1e75cd..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Supplier/Input_Handler.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Input_Handler.h -// -// = DESCRIPTION -// Handle input from the keyboard. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_INPUT_HANDLER_H) -#define _INPUT_HANDLER_H - -#include "ace/Service_Config.h" - -#if defined (ACE_HAS_ORBIX) - -// Forward declaration. -class Notifier_Handler; - -class Input_Handler : public ACE_Service_Object - // = TITLE - // Handles input events generated from a keyboard. - // - // = DESCRIPTION - // The events are currently framed and forwarded to - // all Consumers. In the future, we will need to - // be more selective and only send to those Consumers - // whose filtering criteria matches! -{ -public: - Input_Handler (Notifier_Handler *, ACE_HANDLE = 0); // Use stdin by default. - - virtual int handle_input (ACE_HANDLE); - // Frame input events and notify <Consumers>. - - virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE, - ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK); - // Close down the handler. - -protected: - virtual ACE_HANDLE get_handle (void) const; - - ACE_HANDLE handle_; - // ACE_HANDLE where the input comes from. - - Notifier_Handler *notifier_; - // Pointer to a <Notifier_Handler> that's used to inform - // Consumers that events of interest have occurred. - - FILE *fp_; - // Pointer to an input ACE_FILE. - -private: - ~Input_Handler (void); - // Ensure dynamic allocation. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _INPUT_HANDLER_H */ diff --git a/apps/Orbix-Examples/Event_Comm/Supplier/Makefile b/apps/Orbix-Examples/Event_Comm/Supplier/Makefile deleted file mode 100644 index 4ded1a20e24..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Supplier/Makefile +++ /dev/null @@ -1,164 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Notifier. -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -BIN = supplier - -FILES = Input_Handler \ - Notifier_Handler - -LSRC = $(addsuffix .cpp,$(FILES)) supplier.cpp -LOBJ = $(addsuffix .o,$(FILES)) -SHOBJ = $(addsuffix .so,$(FILES)) - -SRX = ../src/.obj - -LDLIBS = $(addprefix .shobj/,$(LOBJ)) ../src/libEvent_Comm.a - -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -BUILD = $(VBIN) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nonested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.lib.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.bin.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.local.GNU - -#---------------------------------------------------------------------------- -# Local targets -#---------------------------------------------------------------------------- - -CPPFLAGS += -I../include -VLDLIBS += -lgen - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -Input_Handler.o: Input_Handler.cpp ../include/Event_Comm.hh Notifier_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/CORBA_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Event_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Signal.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Token.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Shared_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Manager.h \ - ../include/Event_Comm_i.h ../include/Notification_Receiver_i.h \ - ../include/Notifier_i.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Map_Manager.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.i \ - Input_Handler.h -Notifier_Handler.o: Notifier_Handler.cpp Notifier_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/CORBA_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Event_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Signal.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Token.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Shared_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Manager.h \ - ../include/Event_Comm_i.h ../include/Notification_Receiver_i.h \ - ../include/Notifier_i.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Map_Manager.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.i \ - ../include/Event_Comm.hh -supplier.o: supplier.cpp \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Event_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Signal.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Token.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Shared_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Manager.h \ - Notifier_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/CORBA_Handler.h \ - ../include/Event_Comm_i.h ../include/Notification_Receiver_i.h \ - ../include/Notifier_i.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Map_Manager.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.i \ - ../include/Event_Comm.hh Input_Handler.h - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/apps/Orbix-Examples/Event_Comm/Supplier/Notifier_Handler.cpp b/apps/Orbix-Examples/Event_Comm/Supplier/Notifier_Handler.cpp deleted file mode 100644 index 41f68c77b86..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Supplier/Notifier_Handler.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "Notifier_Handler.h" -// $Id$ - - -#if defined (ACE_HAS_ORBIX) - -#if defined (ACE_HAS_MT_ORBIX) -typedef ACE_MT_CORBA_Handler CORBA_HANDLER; -#else -typedef ACE_ST_CORBA_Handler CORBA_HANDLER; -#endif /* ACE_HAS_MT_ORBIX */ - -int -Notifier_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - if (this->notifier_ != 0) - { - ACE_DEBUG ((LM_DEBUG, "closing down Notifier_Handler\n")); - CORBA_HANDLER::instance ()->deactivate_service (Event_Comm_Notifier_IMPL, - this->notifier_->_marker ()); - CORBA::release (this->notifier_); - this->notifier_ = 0; - // *Must* be allocated dyanmically! - delete this; - } - return 0; -} - -Event_Comm::Notifier * -Notifier_Handler::notifier (void) -{ - return this->notifier_; -} - -void -Notifier_Handler::notifier (Event_Comm::Notifier *notifier) -{ - if (this->notifier_ != notifier) - { - CORBA::release (this->notifier_); - this->notifier_ = notifier; - } -} - -// Create and initialize a Notifier target object. - -Notifier_Handler::Notifier_Handler (const char *service_location, - const char *marker, - int putit) -{ - CORBA_HANDLER::instance ()->activate_service (Event_Comm_Notifier_IMPL, - putit ? marker : 0, service_location); - - // Create a notifier object using the implementation class Notifier_i. - this->notifier_ = - new TIE_Event_Comm_Notifier (Notifier_i) (new Notifier_i, marker); -} - -// Destroy a Notifier target object. - -Notifier_Handler::~Notifier_Handler (void) -{ - this->handle_close (); -} - -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/Supplier/Notifier_Handler.h b/apps/Orbix-Examples/Event_Comm/Supplier/Notifier_Handler.h deleted file mode 100644 index 43730693c93..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Supplier/Notifier_Handler.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notifier_Handler.h -// -// = DESCRIPTION -// Integrate CORBA with the ACE ACE_Reactor. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_NOTIFIER_HANDLER_H) -#define _NOTIFIER_HANDLER_H - -#include "ace/CORBA_Handler.h" -#include "Event_Comm_i.h" - -#if defined (ACE_HAS_ORBIX) - -class Notifier_Handler - // = TITLE - // Integrate CORBA with the ACE ACE_Reactor. - // - // = DESCRIPTION - // -{ -public: - Notifier_Handler (const char *service_location, - const char *marker = "notifier", - int putit = 1); // Default marker name. - - Event_Comm::Notifier *notifier (void); - void notifier (Event_Comm::Notifier *); - - virtual int handle_close (ACE_HANDLE = ACE_INVALID_HANDLE, - ACE_Reactor_Mask = ACE_Event_Handler::NULL_MASK); - // Close down the handler. - -private: - ~Notifier_Handler (void); - // Ensure dynamic allocation. - - Event_Comm::Notifier *notifier_; - // Pointer to an a <Event_Comm::Notifier> object. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _NOTIFIER_HANDLER_H */ diff --git a/apps/Orbix-Examples/Event_Comm/Supplier/supplier.cpp b/apps/Orbix-Examples/Event_Comm/Supplier/supplier.cpp deleted file mode 100644 index 0b818020e2c..00000000000 --- a/apps/Orbix-Examples/Event_Comm/Supplier/supplier.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -// Supplier driver for the Orbix Publish/Subscribe example. - -// The executable file generated from this code should be registered -// (under the name 'logger') using the 'putit' command. - -#include "ace/Service_Config.h" - -#include "Notifier_Handler.h" -#include "Input_Handler.h" - -#if defined (ACE_HAS_ORBIX) - -class Supplier : public ACE_Event_Handler -{ -public: - Supplier (int argc, char *argv[]); - ~Supplier (void); - - void run (void); - // Execute the supplier. - -private: - virtual int handle_signal (int signum, siginfo_t *, ucontext_t *); - - virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask); - - Input_Handler *ih_; - // Handler for keyboard input. - - Notifier_Handler *nh_; - // Handler for CORBA Notifier. - - ACE_Service_Config daemon_; - // ACE server event-loop mechanism. -}; - -int -Supplier::handle_close (ACE_HANDLE, ACE_Reactor_Mask) -{ - ACE_DEBUG ((LM_DEBUG, "closing down Supplier\n")); - return 0; -} - -int -Supplier::handle_signal (int signum, siginfo_t *, ucontext_t *) -{ - ACE_DEBUG ((LM_DEBUG, "%S\n", signum)); - ACE_Service_Config::end_reactor_event_loop (); - return 0; -} - -void -Supplier::run (void) -{ - if (ACE_Service_Config::run_reactor_event_loop () == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "run_reactor_event_loop")); -} - -Supplier::Supplier (int argc, char *argv[]) - : ih_ (0), - nh_ (0) -{ - // Initialize the server. - if (this->daemon_.open (argc, argv) == -1) - { - if (errno == ENOENT) // There's no svc.conf file, so use static linking... - { - ACE_DEBUG ((LM_DEBUG, "no config file, using static binding\n")); - // The constructor registers the handlers... - int putit = argc > 1 ? 1 : 0; - - // Pass in program exec name to use a service_location! - this->nh_ = new Notifier_Handler (argv[0], "notifier", putit); - ACE_ASSERT (this->nh_ != 0); - this->ih_ = new Input_Handler (this->nh_); - ACE_ASSERT (this->ih_ != 0); - } - else - ACE_ERROR ((LM_ERROR, "%p\n%a", "open", 1)); - } - - ACE_DEBUG ((LM_DEBUG, "starting up server %s\n", - CORBA::Orbix.myImplementationName ())); - - if (ACE_Service_Config::reactor ()->register_handler (SIGINT, this) == -1) - ACE_ERROR ((LM_ERROR, "%p\n", "register_handler")); -} - -Supplier::~Supplier (void) -{ - // Free up the handlers if they were statically bound. - this->ih_->handle_close (); - this->nh_->handle_close (); -} - -int -main (int argc, char *argv[]) -{ - // Initialize server daemon. - Supplier supplier (argc, argv); - - // Loop forever handling events. - supplier.run (); - - return 0; -} -#else /* !defined ACE_HAS_ORBIX */ -int -main (int argc, char *argv[]) -{ - ACE_ERROR_RETURN ((LM_ERROR, "you must have Orbix to run application %s\n", argv[0]), 1); -} -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/include/Event_Comm.hh b/apps/Orbix-Examples/Event_Comm/include/Event_Comm.hh deleted file mode 100644 index 85ad256da2a..00000000000 --- a/apps/Orbix-Examples/Event_Comm/include/Event_Comm.hh +++ /dev/null @@ -1,887 +0,0 @@ - -#ifndef Event_Comm_hh -#define Event_Comm_hh - -#include <CORBA.h> - -#include <string.h> - -class Event_Comm { -public: - -#ifndef Event_Comm_Notification_defined -#define Event_Comm_Notification_defined - - struct Notification { - CORBA::String_mgr tag_; - - void encodeOp (CORBA::Request &IT_r) const; - void decodeOp (CORBA::Request &IT_r); - void decodeInOutOp (CORBA::Request &IT_r); - static void* IT_anySupport (CORBA::Request &IT_r, - void *&, void*, const CORBA::Flags&); - static const void *IT_fn; - }; - - static const CORBA::TypeCode_ptr _tc_Notification; - -#ifndef Event_Comm_NotificationVarH -#define Event_Comm_NotificationVarH - -#ifndef Event_Comm_NotificationvPtr -#define Event_Comm_NotificationvPtr -typedef Notification* Notification_vPtr; -#endif - -class Notification_var : public CORBA::_var -{ - public: - - Notification_var () { - _ptr = NULL; - } - - Notification_var (Notification *IT_p) { - _ptr = IT_p; - } - - Notification_var (const Notification_var &IT_s) { - if (!IT_s._ptr) { - _ptr = IT_s._ptr; - return; - } - _ptr = new Notification (*(IT_s._ptr)); - } - - Notification_var &operator= (Notification *IT_p) { - if (_ptr != IT_p) { - delete _ptr; - } - _ptr = IT_p; - return (*this); - } - - Notification_var &operator= (const Notification_var &IT_s) { - if (_ptr != IT_s._ptr) { - delete _ptr; - } - _ptr = new Notification (*(IT_s._ptr)); - return (*this); - } - - ~Notification_var () { - delete _ptr; - } - - Notification* operator-> () { - return _ptr; - } - - operator const Notification_vPtr () const { return _ptr;} - operator Notification_vPtr& () { return _ptr;} - operator Notification& () const { return * _ptr;} - - protected: - Notification *_ptr; - private: - Notification_var &operator= (const CORBA::_var &IT_s); - Notification_var (const CORBA::_var &IT_s); -}; - -#endif - - -#endif - - -#ifndef _Event_Comm_Notification_Receiver_defined -#define _Event_Comm_Notification_Receiver_defined -class Notification_Receiver_dispatch : public virtual CORBA::PPTR { -public: - - Notification_Receiver_dispatch (void *IT_p, CORBA::Object* IT_o, const char *IT_m, - CORBA::LoaderClass *IT_l, char *IT_i, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_l,IT_i,IT_im) {} - - - Notification_Receiver_dispatch (char *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notification_Receiver_dispatch () {} - - Notification_Receiver_dispatch (ObjectReference *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notification_Receiver_dispatch (void *IT_p, CORBA::Object *IT_o, const char *IT_m, - char *IT_i, CORBA::Object* IT_ob, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_i,IT_ob,IT_im) {} - - - virtual unsigned char dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void* IT_pp=NULL); - - -}; - -class Notification_Receiver; - -#ifndef Event_Comm_Notification_ReceiverPtr -#define Event_Comm_Notification_ReceiverPtr - - typedef Notification_Receiver* Notification_Receiver_ptr; - - typedef Notification_Receiver* Notification_ReceiverRef; - -#endif - - -#ifndef Event_Comm_Notification_ReceiverForwH -#define Event_Comm_Notification_ReceiverForwH -static CORBA::ObjectRef Notification_Receiver_getBase (void *); -static void Notification_Receiver_release (Notification_Receiver *, CORBA::Environment &IT_env); -static void Notification_Receiver_release (Notification_Receiver_ptr); -static Notification_Receiver* Notification_Receiver_duplicate (Notification_Receiver_ptr, CORBA::Environment &IT_env); -static Notification_Receiver* Notification_Receiver_duplicate (Notification_Receiver_ptr ); -static Notification_Receiver_ptr Notification_Receiver_nil (CORBA::Environment &IT_env); -static Notification_Receiver_ptr Notification_Receiver_nil (); -#endif -#define Event_Comm_Notification_Receiver_IMPL "Event_Comm_Notification_Receiver" - - -class Notification_Receiver; - - typedef Notification_Receiver Notification_ReceiverProxy; -#define Event_Comm_Notification_Receiver_IR "Event_Comm_Notification_Receiver" -#define Event_Comm_Notification_Receiver_IMPL "Event_Comm_Notification_Receiver" - -#ifndef Event_Comm_Notification_ReceiverPtr -#define Event_Comm_Notification_ReceiverPtr - - typedef Notification_Receiver* Notification_Receiver_ptr; - - typedef Notification_Receiver* Notification_ReceiverRef; - -#endif - -class Notification_Receiver: public virtual CORBA::Object { -public: - Notification_Receiver (char *IT_OR); - Notification_Receiver (ObjectReference *IT_OR); - Notification_Receiver () : CORBA::Object (1) {} -protected: - Notification_Receiver_ptr __duplicate( - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::Object::__duplicate (IT_env); - return this; - } -public: - static Notification_Receiver_ptr _duplicate( - Notification_Receiver_ptr obj, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - if (CORBA::is_nil(obj, IT_env)) { - IT_raise.maybeRaise (); - return (obj); - } - Notification_Receiver_ptr IT_obj = obj->__duplicate (IT_env); - IT_raise.maybeRaise(); - return IT_obj; - } -public: - static Notification_Receiver* _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notification_Receiver* _bind (CORBA::Environment &IT_env); - static Notification_Receiver* _bind (const char* IT_markerServer=NULL, const char* host=NULL, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notification_Receiver* _narrow (CORBA::Object* , CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notification_Receiver_ptr _nil (CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - IT_raise.maybeRaise(); - return (Notification_Receiver_ptr) CORBA::OBJECT_NIL;} - virtual void receive_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void disconnect (const char * reason, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); -}; - - static const CORBA::TypeCode_ptr _tc_Notification_Receiver; - - static const CORBA::TypeCode_ptr _tc_Notification_ReceiverRef; - -#ifndef Event_Comm_Notification_ReceiverVarH -#define Event_Comm_Notification_ReceiverVarH - -#ifndef Event_Comm_Notification_ReceivervPtr -#define Event_Comm_Notification_ReceivervPtr -typedef Notification_Receiver* Notification_Receiver_vPtr; -#endif - -class Notification_Receiver_var : public CORBA::_var -{ - public: - - Notification_Receiver_var () { - _ptr = Notification_Receiver_nil (); - } - - Notification_Receiver_var (Notification_Receiver *IT_p) { - _ptr = IT_p; - } - - Notification_Receiver_var (const Notification_Receiver_var &IT_s) { - _ptr = Notification_Receiver_duplicate (IT_s._ptr); - } - - Notification_Receiver_var &operator= (Notification_Receiver *IT_p) { - Notification_Receiver_release (_ptr); - _ptr = IT_p; - return (*this); - } - - Notification_Receiver_var &operator= (const Notification_Receiver_var &IT_s) { - Notification_Receiver_release (_ptr); - _ptr = Notification_Receiver_duplicate (IT_s._ptr); - return (*this); - } - - ~Notification_Receiver_var () { - Notification_Receiver_release (_ptr); - } - - Notification_Receiver* operator-> () { - return _ptr; - } - - operator const Notification_Receiver_vPtr () const { return _ptr;} - operator Notification_Receiver_vPtr& () { return _ptr;} - - protected: - Notification_Receiver *_ptr; - private: - Notification_Receiver_var &operator= (const CORBA::_var &IT_s); - Notification_Receiver_var (const CORBA::_var &IT_s); - Notification_Receiver_var &operator= (const CORBA::_mgr &IT_s); - Notification_Receiver_var &operator= (const CORBA::_SeqElem &IT_s); - Notification_Receiver_var (const CORBA::_mgr &IT_s); - Notification_Receiver_var (const CORBA::_SeqElem &IT_s); -}; - -#endif - - -#ifndef Event_Comm_Notification_ReceiverMgrH -#define Event_Comm_Notification_ReceiverMgrH - -class Notification_Receiver_mgr : public CORBA::_mgr -{ - public: - - Notification_Receiver_mgr () { - _ptr = Notification_Receiver_nil (); - _release = 1; - } - - Notification_Receiver_mgr (const Notification_Receiver_mgr &IT_s) { - _ptr = Notification_Receiver_duplicate (IT_s._ptr); - _release = 1; - } - - Notification_Receiver_mgr &operator= (Notification_Receiver *IT_p) { - if (_ptr && _release) - Notification_Receiver_release (_ptr); - _ptr = IT_p; - _release = 1; - return (*this); - } - - Notification_Receiver_mgr &operator= (const Notification_Receiver_mgr &IT_s) { - if (_ptr && _release) - Notification_Receiver_release (_ptr); - _ptr = Notification_Receiver_duplicate(IT_s._ptr); - _release = 1; - return (*this); - } - - Notification_Receiver_mgr &operator= (const Notification_Receiver_var &IT_s) { - if (_ptr && _release) - Notification_Receiver_release (_ptr); - _ptr = Notification_Receiver_duplicate(IT_s); - _release = 1; - return (*this); - } - - ~Notification_Receiver_mgr () { - if (_release) - Notification_Receiver_release (_ptr); - } - - unsigned char release () { - return _release; - } - - void release (unsigned char rel) { - _release = rel; - } - - operator int () const { - CORBA::Environment env; - CORBA::EnvExcRaiser IT_raise (&env); - return (!(CORBA::is_nil((CORBA::Object*) _ptr, env))); - } - - operator void* () const { - return _ptr; - } - - operator CORBA::Object * () const { - return (CORBA::Object *) _ptr; - } - - operator Notification_Receiver* () const { - return (Notification_Receiver*) _ptr; - } - - Notification_Receiver *_ptr; - - protected: - - unsigned char _release; -}; - -#endif - -#ifndef Event_Comm_Notification_ReceiverSeqElemH -#define Event_Comm_Notification_ReceiverSeqElemH - -class Notification_Receiver_SeqElem : public CORBA::_SeqElem -{ - public: - - Notification_Receiver_SeqElem (Event_Comm::Notification_Receiver_ptr* IT_p, unsigned char rel) { - _ptr = IT_p; - _release = rel; - } - - Notification_Receiver_SeqElem &operator= (Event_Comm::Notification_Receiver_ptr IT_p) { - if (!_ptr) - return (*this); - if (*(_ptr) && _release) - Notification_Receiver_release (*(_ptr)); - *(_ptr) = IT_p; - return (*this); - } - - Notification_Receiver_SeqElem &operator= (const Notification_Receiver_SeqElem &IT_s) { - if (!_ptr|| !IT_s._ptr) - return (*this); - if (*(_ptr) && _release) - Notification_Receiver_release (*(_ptr)); - *(_ptr) = Notification_Receiver_duplicate(*(IT_s._ptr)); - return (*this); - } - - operator Event_Comm::Notification_Receiver_ptr () const -{ - if (!_ptr) - return (Notification_Receiver_nil()); - return (Event_Comm::Notification_Receiver_ptr) (*_ptr); - } - - Notification_Receiver_ptr operator->() const { return *_ptr;} - - protected: - Event_Comm::Notification_Receiver_ptr *_ptr; - unsigned char _release; -}; - -#endif - - -#define TIE_Event_Comm_Notification_Receiver(X) Event_Comm_Notification_Receiver##X - -#define DEF_TIE_Event_Comm_Notification_Receiver(X) \ - class Event_Comm_Notification_Receiver##X : public virtual Event_Comm::Notification_Receiver { \ - X* m_obj; \ - public: \ - \ - Event_Comm_Notification_Receiver##X (X *objp, const char* m="", CORBA::LoaderClass *l=0)\ - : Event_Comm::Notification_Receiver(), CORBA::Object (), m_obj(objp) { \ - m_pptr = new Event_Comm::Notification_Receiver_dispatch \ - (( Event_Comm::Notification_Receiver*)this,(CORBA::Object*)this,m,l,Event_Comm_Notification_Receiver_IR,m_obj); \ - } \ - Event_Comm_Notification_Receiver##X (CORBA::Object *IT_p, const char* IT_m="", void *IT_q=0)\ - : Event_Comm::Notification_Receiver(), CORBA::Object () { \ - m_pptr = new Event_Comm::Notification_Receiver_dispatch \ - (( Event_Comm::Notification_Receiver*)this,(CORBA::Object*)this,IT_m,Event_Comm_Notification_Receiver_IR,IT_p,IT_q); \ - m_obj = (X*)(m_pptr->getImplObj ()); \ - } \ - \ - virtual ~Event_Comm_Notification_Receiver##X () { \ - if (_okToDeleteImpl ()) delete m_obj; } \ - \ - virtual void* _deref () { \ - return m_obj; } \ - \ - virtual void receive_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->receive_notification ( notification,IT_env);\ -}\ - \ - virtual void disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->disconnect ( reason,IT_env);\ -}\ - \ - }; - - -#define QUALS_Event_Comm_Notification_Receiver \ - virtual void receive_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->receive_notification ( notification,IT_env);\ -}\ - \ - virtual void disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->disconnect ( reason,IT_env);\ -}\ - - - - -class Notification_ReceiverProxyFactoryClass : public virtual CORBA::ObjectFactoryClass { -public: - Notification_ReceiverProxyFactoryClass (unsigned char IT_p=0) - : CORBA::ProxyFactory (Event_Comm_Notification_Receiver_IR, IT_p) {} - - virtual void* New (char *IT_OR, CORBA::Environment&); - - virtual void* New (ObjectReference *IT_OR, CORBA::Environment&); - - virtual void* New2 (); - - virtual void* IT_castUp (void *IT_p, char* IT_s); - - virtual CORBA::PPTR* pptr (void *IT_p); - - virtual void baseInterfaces (_IDL_SEQUENCE_string&); - - -}; - -static Notification_ReceiverProxyFactoryClass Notification_ReceiverProxyFactory; - - - -#endif - - -#ifndef _Event_Comm_Notifier_defined -#define _Event_Comm_Notifier_defined -class Notifier_dispatch : public virtual CORBA::PPTR { -public: - - Notifier_dispatch (void *IT_p, CORBA::Object* IT_o, const char *IT_m, - CORBA::LoaderClass *IT_l, char *IT_i, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_l,IT_i,IT_im) {} - - - Notifier_dispatch (char *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notifier_dispatch () {} - - Notifier_dispatch (ObjectReference *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notifier_dispatch (void *IT_p, CORBA::Object *IT_o, const char *IT_m, - char *IT_i, CORBA::Object* IT_ob, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_i,IT_ob,IT_im) {} - - - virtual unsigned char dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void* IT_pp=NULL); - - -}; - -class Notifier; - -#ifndef Event_Comm_NotifierPtr -#define Event_Comm_NotifierPtr - - typedef Notifier* Notifier_ptr; - - typedef Notifier* NotifierRef; - -#endif - - -#ifndef Event_Comm_NotifierForwH -#define Event_Comm_NotifierForwH -static CORBA::ObjectRef Notifier_getBase (void *); -static void Notifier_release (Notifier *, CORBA::Environment &IT_env); -static void Notifier_release (Notifier_ptr); -static Notifier* Notifier_duplicate (Notifier_ptr, CORBA::Environment &IT_env); -static Notifier* Notifier_duplicate (Notifier_ptr ); -static Notifier_ptr Notifier_nil (CORBA::Environment &IT_env); -static Notifier_ptr Notifier_nil (); -#endif -#define Event_Comm_Notifier_IMPL "Event_Comm_Notifier" - - -class Notifier; - - typedef Notifier NotifierProxy; -#define Event_Comm_Notifier_IR "Event_Comm_Notifier" -#define Event_Comm_Notifier_IMPL "Event_Comm_Notifier" - -#ifndef Event_Comm_NotifierPtr -#define Event_Comm_NotifierPtr - - typedef Notifier* Notifier_ptr; - - typedef Notifier* NotifierRef; - -#endif - -class Notifier: public virtual CORBA::Object { -public: - Notifier (char *IT_OR); - Notifier (ObjectReference *IT_OR); - Notifier () : CORBA::Object (1) {} -protected: - Notifier_ptr __duplicate( - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::Object::__duplicate (IT_env); - return this; - } -public: - static Notifier_ptr _duplicate( - Notifier_ptr obj, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - if (CORBA::is_nil(obj, IT_env)) { - IT_raise.maybeRaise (); - return (obj); - } - Notifier_ptr IT_obj = obj->__duplicate (IT_env); - IT_raise.maybeRaise(); - return IT_obj; - } -public: - static Notifier* _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notifier* _bind (CORBA::Environment &IT_env); - static Notifier* _bind (const char* IT_markerServer=NULL, const char* host=NULL, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notifier* _narrow (CORBA::Object* , CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notifier_ptr _nil (CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - IT_raise.maybeRaise(); - return (Notifier_ptr) CORBA::OBJECT_NIL;} - virtual void send_disconnect (const char * reason, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void send_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void subscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void unsubscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); -}; - - static const CORBA::TypeCode_ptr _tc_Notifier; - - static const CORBA::TypeCode_ptr _tc_NotifierRef; - -#ifndef Event_Comm_NotifierVarH -#define Event_Comm_NotifierVarH - -#ifndef Event_Comm_NotifiervPtr -#define Event_Comm_NotifiervPtr -typedef Notifier* Notifier_vPtr; -#endif - -class Notifier_var : public CORBA::_var -{ - public: - - Notifier_var () { - _ptr = Notifier_nil (); - } - - Notifier_var (Notifier *IT_p) { - _ptr = IT_p; - } - - Notifier_var (const Notifier_var &IT_s) { - _ptr = Notifier_duplicate (IT_s._ptr); - } - - Notifier_var &operator= (Notifier *IT_p) { - Notifier_release (_ptr); - _ptr = IT_p; - return (*this); - } - - Notifier_var &operator= (const Notifier_var &IT_s) { - Notifier_release (_ptr); - _ptr = Notifier_duplicate (IT_s._ptr); - return (*this); - } - - ~Notifier_var () { - Notifier_release (_ptr); - } - - Notifier* operator-> () { - return _ptr; - } - - operator const Notifier_vPtr () const { return _ptr;} - operator Notifier_vPtr& () { return _ptr;} - - protected: - Notifier *_ptr; - private: - Notifier_var &operator= (const CORBA::_var &IT_s); - Notifier_var (const CORBA::_var &IT_s); - Notifier_var &operator= (const CORBA::_mgr &IT_s); - Notifier_var &operator= (const CORBA::_SeqElem &IT_s); - Notifier_var (const CORBA::_mgr &IT_s); - Notifier_var (const CORBA::_SeqElem &IT_s); -}; - -#endif - - -#ifndef Event_Comm_NotifierMgrH -#define Event_Comm_NotifierMgrH - -class Notifier_mgr : public CORBA::_mgr -{ - public: - - Notifier_mgr () { - _ptr = Notifier_nil (); - _release = 1; - } - - Notifier_mgr (const Notifier_mgr &IT_s) { - _ptr = Notifier_duplicate (IT_s._ptr); - _release = 1; - } - - Notifier_mgr &operator= (Notifier *IT_p) { - if (_ptr && _release) - Notifier_release (_ptr); - _ptr = IT_p; - _release = 1; - return (*this); - } - - Notifier_mgr &operator= (const Notifier_mgr &IT_s) { - if (_ptr && _release) - Notifier_release (_ptr); - _ptr = Notifier_duplicate(IT_s._ptr); - _release = 1; - return (*this); - } - - Notifier_mgr &operator= (const Notifier_var &IT_s) { - if (_ptr && _release) - Notifier_release (_ptr); - _ptr = Notifier_duplicate(IT_s); - _release = 1; - return (*this); - } - - ~Notifier_mgr () { - if (_release) - Notifier_release (_ptr); - } - - unsigned char release () { - return _release; - } - - void release (unsigned char rel) { - _release = rel; - } - - operator int () const { - CORBA::Environment env; - CORBA::EnvExcRaiser IT_raise (&env); - return (!(CORBA::is_nil((CORBA::Object*) _ptr, env))); - } - - operator void* () const { - return _ptr; - } - - operator CORBA::Object * () const { - return (CORBA::Object *) _ptr; - } - - operator Notifier* () const { - return (Notifier*) _ptr; - } - - Notifier *_ptr; - - protected: - - unsigned char _release; -}; - -#endif - -#ifndef Event_Comm_NotifierSeqElemH -#define Event_Comm_NotifierSeqElemH - -class Notifier_SeqElem : public CORBA::_SeqElem -{ - public: - - Notifier_SeqElem (Event_Comm::Notifier_ptr* IT_p, unsigned char rel) { - _ptr = IT_p; - _release = rel; - } - - Notifier_SeqElem &operator= (Event_Comm::Notifier_ptr IT_p) { - if (!_ptr) - return (*this); - if (*(_ptr) && _release) - Notifier_release (*(_ptr)); - *(_ptr) = IT_p; - return (*this); - } - - Notifier_SeqElem &operator= (const Notifier_SeqElem &IT_s) { - if (!_ptr|| !IT_s._ptr) - return (*this); - if (*(_ptr) && _release) - Notifier_release (*(_ptr)); - *(_ptr) = Notifier_duplicate(*(IT_s._ptr)); - return (*this); - } - - operator Event_Comm::Notifier_ptr () const -{ - if (!_ptr) - return (Notifier_nil()); - return (Event_Comm::Notifier_ptr) (*_ptr); - } - - Notifier_ptr operator->() const { return *_ptr;} - - protected: - Event_Comm::Notifier_ptr *_ptr; - unsigned char _release; -}; - -#endif - - -#define TIE_Event_Comm_Notifier(X) Event_Comm_Notifier##X - -#define DEF_TIE_Event_Comm_Notifier(X) \ - class Event_Comm_Notifier##X : public virtual Event_Comm::Notifier { \ - X* m_obj; \ - public: \ - \ - Event_Comm_Notifier##X (X *objp, const char* m="", CORBA::LoaderClass *l=0)\ - : Event_Comm::Notifier(), CORBA::Object (), m_obj(objp) { \ - m_pptr = new Event_Comm::Notifier_dispatch \ - (( Event_Comm::Notifier*)this,(CORBA::Object*)this,m,l,Event_Comm_Notifier_IR,m_obj); \ - } \ - Event_Comm_Notifier##X (CORBA::Object *IT_p, const char* IT_m="", void *IT_q=0)\ - : Event_Comm::Notifier(), CORBA::Object () { \ - m_pptr = new Event_Comm::Notifier_dispatch \ - (( Event_Comm::Notifier*)this,(CORBA::Object*)this,IT_m,Event_Comm_Notifier_IR,IT_p,IT_q); \ - m_obj = (X*)(m_pptr->getImplObj ()); \ - } \ - \ - virtual ~Event_Comm_Notifier##X () { \ - if (_okToDeleteImpl ()) delete m_obj; } \ - \ - virtual void* _deref () { \ - return m_obj; } \ - \ - virtual void send_disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_disconnect ( reason,IT_env);\ -}\ - \ - virtual void send_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_notification ( notification,IT_env);\ -}\ - \ - virtual void subscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->subscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - \ - virtual void unsubscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->unsubscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - \ - }; - - -#define QUALS_Event_Comm_Notifier \ - virtual void send_disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_disconnect ( reason,IT_env);\ -}\ - \ - virtual void send_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_notification ( notification,IT_env);\ -}\ - \ - virtual void subscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->subscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - \ - virtual void unsubscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->unsubscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - - - - -class NotifierProxyFactoryClass : public virtual CORBA::ObjectFactoryClass { -public: - NotifierProxyFactoryClass (unsigned char IT_p=0) - : CORBA::ProxyFactory (Event_Comm_Notifier_IR, IT_p) {} - - virtual void* New (char *IT_OR, CORBA::Environment&); - - virtual void* New (ObjectReference *IT_OR, CORBA::Environment&); - - virtual void* New2 (); - - virtual void* IT_castUp (void *IT_p, char* IT_s); - - virtual CORBA::PPTR* pptr (void *IT_p); - - virtual void baseInterfaces (_IDL_SEQUENCE_string&); - - -}; - -static NotifierProxyFactoryClass NotifierProxyFactory; - - - -#endif - -}; - - -void operator<<= (CORBA::any &IT_a, Event_Comm::Notification_Receiver_ptr IT_t); -CORBA::Boolean operator>>= (const CORBA::any &IT_a, Event_Comm::Notification_Receiver_ptr& IT_t); - - -void operator<<= (CORBA::any &IT_a, Event_Comm::Notifier_ptr IT_t); -CORBA::Boolean operator>>= (const CORBA::any &IT_a, Event_Comm::Notifier_ptr& IT_t); - - -void operator<<= (CORBA::any &IT_a, const Event_Comm::Notification& IT_t); -CORBA::Boolean operator>>= (const CORBA::any &IT_a, Event_Comm::Notification*& IT_t); - - -#endif diff --git a/apps/Orbix-Examples/Event_Comm/include/Event_Comm_i.h b/apps/Orbix-Examples/Event_Comm/include/Event_Comm_i.h deleted file mode 100644 index 61f2212da19..00000000000 --- a/apps/Orbix-Examples/Event_Comm/include/Event_Comm_i.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Event_Comm_i.h -// -// = DESCRIPTION -// Class interface for the implementation of the distributed -// event notification mechanism. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_EVENT_COMM_I_H) -#define _EVENT_COMM_I_H - -#include "Notification_Receiver_i.h" -#include "Notifier_i.h" - -#if defined (ACE_HAS_ORBIX) - -// Tie the Notification_Receiver and Notifier implementation classes -// together with the IDL interface. - -DEF_TIE_Event_Comm_Notification_Receiver (Notification_Receiver_i) -DEF_TIE_Event_Comm_Notifier (Notifier_i) - -#endif /* ACE_HAS_ORBIX */ -#endif /* _EVENT_COMM_I_H */ diff --git a/apps/Orbix-Examples/Event_Comm/include/Notification_Receiver_i.h b/apps/Orbix-Examples/Event_Comm/include/Notification_Receiver_i.h deleted file mode 100644 index 91bb99d6124..00000000000 --- a/apps/Orbix-Examples/Event_Comm/include/Notification_Receiver_i.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notification_Receiver__i.h -// -// = DESCRIPTION -// Class interface for the implementation of the <Notification_Receiver> -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_Notification_Receiver_i_H) -#define _Notification_Receiver_i_H - -#if defined (ACE_HAS_ORBIX) -#include "Event_Comm.hh" - -class Notification_Receiver_i - // = TITLE - // Defines the implementation class for event <Notification_Receivers>. - // - // = DESCRIPTION -{ -public: - Notification_Receiver_i (void); - ~Notification_Receiver_i (void); - - virtual void receive_notification (const Event_Comm::Notification ¬ification, - CORBA::Environment &IT_env); - // Pass the <Notification> to the <Notification_Receiver>. - - virtual void disconnect (const char *reason, - CORBA::Environment &IT_env); - // Disconnect the <Notification_Receiver> from the <Notifier>, - // giving it the <reason>. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _Notification_Receiver_i_H */ diff --git a/apps/Orbix-Examples/Event_Comm/include/Notifier_i.h b/apps/Orbix-Examples/Event_Comm/include/Notifier_i.h deleted file mode 100644 index 523710811a5..00000000000 --- a/apps/Orbix-Examples/Event_Comm/include/Notifier_i.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notifier_i.h -// -// = DESCRIPTION -// Class interface for the implementation of the <Notifier> -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_Notifier_i_H) -#define _Notifier_i_H - -#include "ace/Map_Manager.h" -#include "ace/Synch.h" -#include "ace/SString.h" -#include "Event_Comm.hh" - -#if defined (ACE_HAS_ORBIX) - -// Forward reference. -class Notification_Receiver_Entry; - -class Notifier_i - // = TITLE - // Defines the implementation class for event <Notifiers>. - // - // = DESCRIPTION -{ -public: - enum - { - DEFAULT_SIZE = 1024 // Default max number of Event_Comm::Notification_Receivers. - }; - - Notifier_i (size_t size_hint = Notifier_i::DEFAULT_SIZE); - // Initialize a Notifier_i object with the specified size hint. - - void send_disconnect (const char *reason, - CORBA::Environment &IT_env); - // Disconnect all the receivers, giving them the <reason>. - - void send_notification (const Event_Comm::Notification ¬ification, - CORBA::Environment &IT_env); - // Send the <Notification> to all the consumers who - // have subscribed and who match the filtering criteria. - - void subscribe (Event_Comm::Notification_Receiver *notification_receiver, - const char *filtering_criteria, - CORBA::Environment &IT_env); - // Subscribe the <Notification_Receiver> to receive events that - // match <filtering_criteria> applied by the <Notifier>. - - void unsubscribe (Event_Comm::Notification_Receiver *notification_receiver, - const char *filtering_criteria, - CORBA::Environment &IT_env); - // Unsubscribe the <Notification_Receiver>. - -private: - // The following implementation should be replaced - // by a standard container class from STL... - - typedef ACE_Map_Manager <ACE_SString, Notification_Receiver_Entry *, ACE_Null_Mutex> MAP_MANAGER; - typedef ACE_Map_Iterator <ACE_SString, Notification_Receiver_Entry *, ACE_Null_Mutex> MAP_ITERATOR; - typedef ACE_Map_Entry <ACE_SString, Notification_Receiver_Entry *> MAP_ENTRY; - - MAP_MANAGER map_; - // Table that maps a <Event_Comm::Notification_Receiver *> to a <Notification_Receiver_Entry *>. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _Notifier_i_H */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm.hh b/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm.hh deleted file mode 100644 index 85ad256da2a..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm.hh +++ /dev/null @@ -1,887 +0,0 @@ - -#ifndef Event_Comm_hh -#define Event_Comm_hh - -#include <CORBA.h> - -#include <string.h> - -class Event_Comm { -public: - -#ifndef Event_Comm_Notification_defined -#define Event_Comm_Notification_defined - - struct Notification { - CORBA::String_mgr tag_; - - void encodeOp (CORBA::Request &IT_r) const; - void decodeOp (CORBA::Request &IT_r); - void decodeInOutOp (CORBA::Request &IT_r); - static void* IT_anySupport (CORBA::Request &IT_r, - void *&, void*, const CORBA::Flags&); - static const void *IT_fn; - }; - - static const CORBA::TypeCode_ptr _tc_Notification; - -#ifndef Event_Comm_NotificationVarH -#define Event_Comm_NotificationVarH - -#ifndef Event_Comm_NotificationvPtr -#define Event_Comm_NotificationvPtr -typedef Notification* Notification_vPtr; -#endif - -class Notification_var : public CORBA::_var -{ - public: - - Notification_var () { - _ptr = NULL; - } - - Notification_var (Notification *IT_p) { - _ptr = IT_p; - } - - Notification_var (const Notification_var &IT_s) { - if (!IT_s._ptr) { - _ptr = IT_s._ptr; - return; - } - _ptr = new Notification (*(IT_s._ptr)); - } - - Notification_var &operator= (Notification *IT_p) { - if (_ptr != IT_p) { - delete _ptr; - } - _ptr = IT_p; - return (*this); - } - - Notification_var &operator= (const Notification_var &IT_s) { - if (_ptr != IT_s._ptr) { - delete _ptr; - } - _ptr = new Notification (*(IT_s._ptr)); - return (*this); - } - - ~Notification_var () { - delete _ptr; - } - - Notification* operator-> () { - return _ptr; - } - - operator const Notification_vPtr () const { return _ptr;} - operator Notification_vPtr& () { return _ptr;} - operator Notification& () const { return * _ptr;} - - protected: - Notification *_ptr; - private: - Notification_var &operator= (const CORBA::_var &IT_s); - Notification_var (const CORBA::_var &IT_s); -}; - -#endif - - -#endif - - -#ifndef _Event_Comm_Notification_Receiver_defined -#define _Event_Comm_Notification_Receiver_defined -class Notification_Receiver_dispatch : public virtual CORBA::PPTR { -public: - - Notification_Receiver_dispatch (void *IT_p, CORBA::Object* IT_o, const char *IT_m, - CORBA::LoaderClass *IT_l, char *IT_i, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_l,IT_i,IT_im) {} - - - Notification_Receiver_dispatch (char *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notification_Receiver_dispatch () {} - - Notification_Receiver_dispatch (ObjectReference *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notification_Receiver_dispatch (void *IT_p, CORBA::Object *IT_o, const char *IT_m, - char *IT_i, CORBA::Object* IT_ob, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_i,IT_ob,IT_im) {} - - - virtual unsigned char dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void* IT_pp=NULL); - - -}; - -class Notification_Receiver; - -#ifndef Event_Comm_Notification_ReceiverPtr -#define Event_Comm_Notification_ReceiverPtr - - typedef Notification_Receiver* Notification_Receiver_ptr; - - typedef Notification_Receiver* Notification_ReceiverRef; - -#endif - - -#ifndef Event_Comm_Notification_ReceiverForwH -#define Event_Comm_Notification_ReceiverForwH -static CORBA::ObjectRef Notification_Receiver_getBase (void *); -static void Notification_Receiver_release (Notification_Receiver *, CORBA::Environment &IT_env); -static void Notification_Receiver_release (Notification_Receiver_ptr); -static Notification_Receiver* Notification_Receiver_duplicate (Notification_Receiver_ptr, CORBA::Environment &IT_env); -static Notification_Receiver* Notification_Receiver_duplicate (Notification_Receiver_ptr ); -static Notification_Receiver_ptr Notification_Receiver_nil (CORBA::Environment &IT_env); -static Notification_Receiver_ptr Notification_Receiver_nil (); -#endif -#define Event_Comm_Notification_Receiver_IMPL "Event_Comm_Notification_Receiver" - - -class Notification_Receiver; - - typedef Notification_Receiver Notification_ReceiverProxy; -#define Event_Comm_Notification_Receiver_IR "Event_Comm_Notification_Receiver" -#define Event_Comm_Notification_Receiver_IMPL "Event_Comm_Notification_Receiver" - -#ifndef Event_Comm_Notification_ReceiverPtr -#define Event_Comm_Notification_ReceiverPtr - - typedef Notification_Receiver* Notification_Receiver_ptr; - - typedef Notification_Receiver* Notification_ReceiverRef; - -#endif - -class Notification_Receiver: public virtual CORBA::Object { -public: - Notification_Receiver (char *IT_OR); - Notification_Receiver (ObjectReference *IT_OR); - Notification_Receiver () : CORBA::Object (1) {} -protected: - Notification_Receiver_ptr __duplicate( - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::Object::__duplicate (IT_env); - return this; - } -public: - static Notification_Receiver_ptr _duplicate( - Notification_Receiver_ptr obj, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - if (CORBA::is_nil(obj, IT_env)) { - IT_raise.maybeRaise (); - return (obj); - } - Notification_Receiver_ptr IT_obj = obj->__duplicate (IT_env); - IT_raise.maybeRaise(); - return IT_obj; - } -public: - static Notification_Receiver* _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notification_Receiver* _bind (CORBA::Environment &IT_env); - static Notification_Receiver* _bind (const char* IT_markerServer=NULL, const char* host=NULL, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notification_Receiver* _narrow (CORBA::Object* , CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notification_Receiver_ptr _nil (CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - IT_raise.maybeRaise(); - return (Notification_Receiver_ptr) CORBA::OBJECT_NIL;} - virtual void receive_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void disconnect (const char * reason, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); -}; - - static const CORBA::TypeCode_ptr _tc_Notification_Receiver; - - static const CORBA::TypeCode_ptr _tc_Notification_ReceiverRef; - -#ifndef Event_Comm_Notification_ReceiverVarH -#define Event_Comm_Notification_ReceiverVarH - -#ifndef Event_Comm_Notification_ReceivervPtr -#define Event_Comm_Notification_ReceivervPtr -typedef Notification_Receiver* Notification_Receiver_vPtr; -#endif - -class Notification_Receiver_var : public CORBA::_var -{ - public: - - Notification_Receiver_var () { - _ptr = Notification_Receiver_nil (); - } - - Notification_Receiver_var (Notification_Receiver *IT_p) { - _ptr = IT_p; - } - - Notification_Receiver_var (const Notification_Receiver_var &IT_s) { - _ptr = Notification_Receiver_duplicate (IT_s._ptr); - } - - Notification_Receiver_var &operator= (Notification_Receiver *IT_p) { - Notification_Receiver_release (_ptr); - _ptr = IT_p; - return (*this); - } - - Notification_Receiver_var &operator= (const Notification_Receiver_var &IT_s) { - Notification_Receiver_release (_ptr); - _ptr = Notification_Receiver_duplicate (IT_s._ptr); - return (*this); - } - - ~Notification_Receiver_var () { - Notification_Receiver_release (_ptr); - } - - Notification_Receiver* operator-> () { - return _ptr; - } - - operator const Notification_Receiver_vPtr () const { return _ptr;} - operator Notification_Receiver_vPtr& () { return _ptr;} - - protected: - Notification_Receiver *_ptr; - private: - Notification_Receiver_var &operator= (const CORBA::_var &IT_s); - Notification_Receiver_var (const CORBA::_var &IT_s); - Notification_Receiver_var &operator= (const CORBA::_mgr &IT_s); - Notification_Receiver_var &operator= (const CORBA::_SeqElem &IT_s); - Notification_Receiver_var (const CORBA::_mgr &IT_s); - Notification_Receiver_var (const CORBA::_SeqElem &IT_s); -}; - -#endif - - -#ifndef Event_Comm_Notification_ReceiverMgrH -#define Event_Comm_Notification_ReceiverMgrH - -class Notification_Receiver_mgr : public CORBA::_mgr -{ - public: - - Notification_Receiver_mgr () { - _ptr = Notification_Receiver_nil (); - _release = 1; - } - - Notification_Receiver_mgr (const Notification_Receiver_mgr &IT_s) { - _ptr = Notification_Receiver_duplicate (IT_s._ptr); - _release = 1; - } - - Notification_Receiver_mgr &operator= (Notification_Receiver *IT_p) { - if (_ptr && _release) - Notification_Receiver_release (_ptr); - _ptr = IT_p; - _release = 1; - return (*this); - } - - Notification_Receiver_mgr &operator= (const Notification_Receiver_mgr &IT_s) { - if (_ptr && _release) - Notification_Receiver_release (_ptr); - _ptr = Notification_Receiver_duplicate(IT_s._ptr); - _release = 1; - return (*this); - } - - Notification_Receiver_mgr &operator= (const Notification_Receiver_var &IT_s) { - if (_ptr && _release) - Notification_Receiver_release (_ptr); - _ptr = Notification_Receiver_duplicate(IT_s); - _release = 1; - return (*this); - } - - ~Notification_Receiver_mgr () { - if (_release) - Notification_Receiver_release (_ptr); - } - - unsigned char release () { - return _release; - } - - void release (unsigned char rel) { - _release = rel; - } - - operator int () const { - CORBA::Environment env; - CORBA::EnvExcRaiser IT_raise (&env); - return (!(CORBA::is_nil((CORBA::Object*) _ptr, env))); - } - - operator void* () const { - return _ptr; - } - - operator CORBA::Object * () const { - return (CORBA::Object *) _ptr; - } - - operator Notification_Receiver* () const { - return (Notification_Receiver*) _ptr; - } - - Notification_Receiver *_ptr; - - protected: - - unsigned char _release; -}; - -#endif - -#ifndef Event_Comm_Notification_ReceiverSeqElemH -#define Event_Comm_Notification_ReceiverSeqElemH - -class Notification_Receiver_SeqElem : public CORBA::_SeqElem -{ - public: - - Notification_Receiver_SeqElem (Event_Comm::Notification_Receiver_ptr* IT_p, unsigned char rel) { - _ptr = IT_p; - _release = rel; - } - - Notification_Receiver_SeqElem &operator= (Event_Comm::Notification_Receiver_ptr IT_p) { - if (!_ptr) - return (*this); - if (*(_ptr) && _release) - Notification_Receiver_release (*(_ptr)); - *(_ptr) = IT_p; - return (*this); - } - - Notification_Receiver_SeqElem &operator= (const Notification_Receiver_SeqElem &IT_s) { - if (!_ptr|| !IT_s._ptr) - return (*this); - if (*(_ptr) && _release) - Notification_Receiver_release (*(_ptr)); - *(_ptr) = Notification_Receiver_duplicate(*(IT_s._ptr)); - return (*this); - } - - operator Event_Comm::Notification_Receiver_ptr () const -{ - if (!_ptr) - return (Notification_Receiver_nil()); - return (Event_Comm::Notification_Receiver_ptr) (*_ptr); - } - - Notification_Receiver_ptr operator->() const { return *_ptr;} - - protected: - Event_Comm::Notification_Receiver_ptr *_ptr; - unsigned char _release; -}; - -#endif - - -#define TIE_Event_Comm_Notification_Receiver(X) Event_Comm_Notification_Receiver##X - -#define DEF_TIE_Event_Comm_Notification_Receiver(X) \ - class Event_Comm_Notification_Receiver##X : public virtual Event_Comm::Notification_Receiver { \ - X* m_obj; \ - public: \ - \ - Event_Comm_Notification_Receiver##X (X *objp, const char* m="", CORBA::LoaderClass *l=0)\ - : Event_Comm::Notification_Receiver(), CORBA::Object (), m_obj(objp) { \ - m_pptr = new Event_Comm::Notification_Receiver_dispatch \ - (( Event_Comm::Notification_Receiver*)this,(CORBA::Object*)this,m,l,Event_Comm_Notification_Receiver_IR,m_obj); \ - } \ - Event_Comm_Notification_Receiver##X (CORBA::Object *IT_p, const char* IT_m="", void *IT_q=0)\ - : Event_Comm::Notification_Receiver(), CORBA::Object () { \ - m_pptr = new Event_Comm::Notification_Receiver_dispatch \ - (( Event_Comm::Notification_Receiver*)this,(CORBA::Object*)this,IT_m,Event_Comm_Notification_Receiver_IR,IT_p,IT_q); \ - m_obj = (X*)(m_pptr->getImplObj ()); \ - } \ - \ - virtual ~Event_Comm_Notification_Receiver##X () { \ - if (_okToDeleteImpl ()) delete m_obj; } \ - \ - virtual void* _deref () { \ - return m_obj; } \ - \ - virtual void receive_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->receive_notification ( notification,IT_env);\ -}\ - \ - virtual void disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->disconnect ( reason,IT_env);\ -}\ - \ - }; - - -#define QUALS_Event_Comm_Notification_Receiver \ - virtual void receive_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->receive_notification ( notification,IT_env);\ -}\ - \ - virtual void disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->disconnect ( reason,IT_env);\ -}\ - - - - -class Notification_ReceiverProxyFactoryClass : public virtual CORBA::ObjectFactoryClass { -public: - Notification_ReceiverProxyFactoryClass (unsigned char IT_p=0) - : CORBA::ProxyFactory (Event_Comm_Notification_Receiver_IR, IT_p) {} - - virtual void* New (char *IT_OR, CORBA::Environment&); - - virtual void* New (ObjectReference *IT_OR, CORBA::Environment&); - - virtual void* New2 (); - - virtual void* IT_castUp (void *IT_p, char* IT_s); - - virtual CORBA::PPTR* pptr (void *IT_p); - - virtual void baseInterfaces (_IDL_SEQUENCE_string&); - - -}; - -static Notification_ReceiverProxyFactoryClass Notification_ReceiverProxyFactory; - - - -#endif - - -#ifndef _Event_Comm_Notifier_defined -#define _Event_Comm_Notifier_defined -class Notifier_dispatch : public virtual CORBA::PPTR { -public: - - Notifier_dispatch (void *IT_p, CORBA::Object* IT_o, const char *IT_m, - CORBA::LoaderClass *IT_l, char *IT_i, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_l,IT_i,IT_im) {} - - - Notifier_dispatch (char *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notifier_dispatch () {} - - Notifier_dispatch (ObjectReference *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - Notifier_dispatch (void *IT_p, CORBA::Object *IT_o, const char *IT_m, - char *IT_i, CORBA::Object* IT_ob, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_i,IT_ob,IT_im) {} - - - virtual unsigned char dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void* IT_pp=NULL); - - -}; - -class Notifier; - -#ifndef Event_Comm_NotifierPtr -#define Event_Comm_NotifierPtr - - typedef Notifier* Notifier_ptr; - - typedef Notifier* NotifierRef; - -#endif - - -#ifndef Event_Comm_NotifierForwH -#define Event_Comm_NotifierForwH -static CORBA::ObjectRef Notifier_getBase (void *); -static void Notifier_release (Notifier *, CORBA::Environment &IT_env); -static void Notifier_release (Notifier_ptr); -static Notifier* Notifier_duplicate (Notifier_ptr, CORBA::Environment &IT_env); -static Notifier* Notifier_duplicate (Notifier_ptr ); -static Notifier_ptr Notifier_nil (CORBA::Environment &IT_env); -static Notifier_ptr Notifier_nil (); -#endif -#define Event_Comm_Notifier_IMPL "Event_Comm_Notifier" - - -class Notifier; - - typedef Notifier NotifierProxy; -#define Event_Comm_Notifier_IR "Event_Comm_Notifier" -#define Event_Comm_Notifier_IMPL "Event_Comm_Notifier" - -#ifndef Event_Comm_NotifierPtr -#define Event_Comm_NotifierPtr - - typedef Notifier* Notifier_ptr; - - typedef Notifier* NotifierRef; - -#endif - -class Notifier: public virtual CORBA::Object { -public: - Notifier (char *IT_OR); - Notifier (ObjectReference *IT_OR); - Notifier () : CORBA::Object (1) {} -protected: - Notifier_ptr __duplicate( - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::Object::__duplicate (IT_env); - return this; - } -public: - static Notifier_ptr _duplicate( - Notifier_ptr obj, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - if (CORBA::is_nil(obj, IT_env)) { - IT_raise.maybeRaise (); - return (obj); - } - Notifier_ptr IT_obj = obj->__duplicate (IT_env); - IT_raise.maybeRaise(); - return IT_obj; - } -public: - static Notifier* _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notifier* _bind (CORBA::Environment &IT_env); - static Notifier* _bind (const char* IT_markerServer=NULL, const char* host=NULL, - CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notifier* _narrow (CORBA::Object* , CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()); - static Notifier_ptr _nil (CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) { - CORBA::EnvExcRaiser IT_raise (&IT_env); - IT_raise.maybeRaise(); - return (Notifier_ptr) CORBA::OBJECT_NIL;} - virtual void send_disconnect (const char * reason, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void send_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void subscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); - virtual void unsubscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env=CORBA::IT_chooseDefaultEnv ()) throw (CORBA::SystemException); -}; - - static const CORBA::TypeCode_ptr _tc_Notifier; - - static const CORBA::TypeCode_ptr _tc_NotifierRef; - -#ifndef Event_Comm_NotifierVarH -#define Event_Comm_NotifierVarH - -#ifndef Event_Comm_NotifiervPtr -#define Event_Comm_NotifiervPtr -typedef Notifier* Notifier_vPtr; -#endif - -class Notifier_var : public CORBA::_var -{ - public: - - Notifier_var () { - _ptr = Notifier_nil (); - } - - Notifier_var (Notifier *IT_p) { - _ptr = IT_p; - } - - Notifier_var (const Notifier_var &IT_s) { - _ptr = Notifier_duplicate (IT_s._ptr); - } - - Notifier_var &operator= (Notifier *IT_p) { - Notifier_release (_ptr); - _ptr = IT_p; - return (*this); - } - - Notifier_var &operator= (const Notifier_var &IT_s) { - Notifier_release (_ptr); - _ptr = Notifier_duplicate (IT_s._ptr); - return (*this); - } - - ~Notifier_var () { - Notifier_release (_ptr); - } - - Notifier* operator-> () { - return _ptr; - } - - operator const Notifier_vPtr () const { return _ptr;} - operator Notifier_vPtr& () { return _ptr;} - - protected: - Notifier *_ptr; - private: - Notifier_var &operator= (const CORBA::_var &IT_s); - Notifier_var (const CORBA::_var &IT_s); - Notifier_var &operator= (const CORBA::_mgr &IT_s); - Notifier_var &operator= (const CORBA::_SeqElem &IT_s); - Notifier_var (const CORBA::_mgr &IT_s); - Notifier_var (const CORBA::_SeqElem &IT_s); -}; - -#endif - - -#ifndef Event_Comm_NotifierMgrH -#define Event_Comm_NotifierMgrH - -class Notifier_mgr : public CORBA::_mgr -{ - public: - - Notifier_mgr () { - _ptr = Notifier_nil (); - _release = 1; - } - - Notifier_mgr (const Notifier_mgr &IT_s) { - _ptr = Notifier_duplicate (IT_s._ptr); - _release = 1; - } - - Notifier_mgr &operator= (Notifier *IT_p) { - if (_ptr && _release) - Notifier_release (_ptr); - _ptr = IT_p; - _release = 1; - return (*this); - } - - Notifier_mgr &operator= (const Notifier_mgr &IT_s) { - if (_ptr && _release) - Notifier_release (_ptr); - _ptr = Notifier_duplicate(IT_s._ptr); - _release = 1; - return (*this); - } - - Notifier_mgr &operator= (const Notifier_var &IT_s) { - if (_ptr && _release) - Notifier_release (_ptr); - _ptr = Notifier_duplicate(IT_s); - _release = 1; - return (*this); - } - - ~Notifier_mgr () { - if (_release) - Notifier_release (_ptr); - } - - unsigned char release () { - return _release; - } - - void release (unsigned char rel) { - _release = rel; - } - - operator int () const { - CORBA::Environment env; - CORBA::EnvExcRaiser IT_raise (&env); - return (!(CORBA::is_nil((CORBA::Object*) _ptr, env))); - } - - operator void* () const { - return _ptr; - } - - operator CORBA::Object * () const { - return (CORBA::Object *) _ptr; - } - - operator Notifier* () const { - return (Notifier*) _ptr; - } - - Notifier *_ptr; - - protected: - - unsigned char _release; -}; - -#endif - -#ifndef Event_Comm_NotifierSeqElemH -#define Event_Comm_NotifierSeqElemH - -class Notifier_SeqElem : public CORBA::_SeqElem -{ - public: - - Notifier_SeqElem (Event_Comm::Notifier_ptr* IT_p, unsigned char rel) { - _ptr = IT_p; - _release = rel; - } - - Notifier_SeqElem &operator= (Event_Comm::Notifier_ptr IT_p) { - if (!_ptr) - return (*this); - if (*(_ptr) && _release) - Notifier_release (*(_ptr)); - *(_ptr) = IT_p; - return (*this); - } - - Notifier_SeqElem &operator= (const Notifier_SeqElem &IT_s) { - if (!_ptr|| !IT_s._ptr) - return (*this); - if (*(_ptr) && _release) - Notifier_release (*(_ptr)); - *(_ptr) = Notifier_duplicate(*(IT_s._ptr)); - return (*this); - } - - operator Event_Comm::Notifier_ptr () const -{ - if (!_ptr) - return (Notifier_nil()); - return (Event_Comm::Notifier_ptr) (*_ptr); - } - - Notifier_ptr operator->() const { return *_ptr;} - - protected: - Event_Comm::Notifier_ptr *_ptr; - unsigned char _release; -}; - -#endif - - -#define TIE_Event_Comm_Notifier(X) Event_Comm_Notifier##X - -#define DEF_TIE_Event_Comm_Notifier(X) \ - class Event_Comm_Notifier##X : public virtual Event_Comm::Notifier { \ - X* m_obj; \ - public: \ - \ - Event_Comm_Notifier##X (X *objp, const char* m="", CORBA::LoaderClass *l=0)\ - : Event_Comm::Notifier(), CORBA::Object (), m_obj(objp) { \ - m_pptr = new Event_Comm::Notifier_dispatch \ - (( Event_Comm::Notifier*)this,(CORBA::Object*)this,m,l,Event_Comm_Notifier_IR,m_obj); \ - } \ - Event_Comm_Notifier##X (CORBA::Object *IT_p, const char* IT_m="", void *IT_q=0)\ - : Event_Comm::Notifier(), CORBA::Object () { \ - m_pptr = new Event_Comm::Notifier_dispatch \ - (( Event_Comm::Notifier*)this,(CORBA::Object*)this,IT_m,Event_Comm_Notifier_IR,IT_p,IT_q); \ - m_obj = (X*)(m_pptr->getImplObj ()); \ - } \ - \ - virtual ~Event_Comm_Notifier##X () { \ - if (_okToDeleteImpl ()) delete m_obj; } \ - \ - virtual void* _deref () { \ - return m_obj; } \ - \ - virtual void send_disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_disconnect ( reason,IT_env);\ -}\ - \ - virtual void send_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_notification ( notification,IT_env);\ -}\ - \ - virtual void subscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->subscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - \ - virtual void unsubscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->unsubscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - \ - }; - - -#define QUALS_Event_Comm_Notifier \ - virtual void send_disconnect (const char * reason, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_disconnect ( reason,IT_env);\ -}\ - \ - virtual void send_notification (const Event_Comm::Notification& notification, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->send_notification ( notification,IT_env);\ -}\ - \ - virtual void subscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->subscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - \ - virtual void unsubscribe (Event_Comm::Notification_Receiver_ptr notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) throw (CORBA::SystemException){\ - m_obj->unsubscribe ( notification_receiver, filtering_criteria,IT_env);\ -}\ - - - - -class NotifierProxyFactoryClass : public virtual CORBA::ObjectFactoryClass { -public: - NotifierProxyFactoryClass (unsigned char IT_p=0) - : CORBA::ProxyFactory (Event_Comm_Notifier_IR, IT_p) {} - - virtual void* New (char *IT_OR, CORBA::Environment&); - - virtual void* New (ObjectReference *IT_OR, CORBA::Environment&); - - virtual void* New2 (); - - virtual void* IT_castUp (void *IT_p, char* IT_s); - - virtual CORBA::PPTR* pptr (void *IT_p); - - virtual void baseInterfaces (_IDL_SEQUENCE_string&); - - -}; - -static NotifierProxyFactoryClass NotifierProxyFactory; - - - -#endif - -}; - - -void operator<<= (CORBA::any &IT_a, Event_Comm::Notification_Receiver_ptr IT_t); -CORBA::Boolean operator>>= (const CORBA::any &IT_a, Event_Comm::Notification_Receiver_ptr& IT_t); - - -void operator<<= (CORBA::any &IT_a, Event_Comm::Notifier_ptr IT_t); -CORBA::Boolean operator>>= (const CORBA::any &IT_a, Event_Comm::Notifier_ptr& IT_t); - - -void operator<<= (CORBA::any &IT_a, const Event_Comm::Notification& IT_t); -CORBA::Boolean operator>>= (const CORBA::any &IT_a, Event_Comm::Notification*& IT_t); - - -#endif diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm.idl b/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm.idl deleted file mode 100644 index 26890129d70..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm.idl +++ /dev/null @@ -1,92 +0,0 @@ -/* -*- C++ -*- */ -// @(#)Event_Comm.idl 1.1 10/18/96 - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Event_Comm.idl -// -// = DESCRIPTION -// The CORBA IDL module for distributed event notification. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#ifndef _EVENT_COMM_IDL -#define _EVENT_COMM_IDL - -module Event_Comm - // = TITLE - // The CORBA IDL module for distributed event notification. - // - // = DESCRIPTION -{ - struct Notification - // = TITLE - // Defines the interface for an event <Notification>. - // - // = This is the type passed by the Notifier to the Notification_Receiver. - // Since it contains an <any>, it can hold any values. Naturally, - // the consumer must understand how to interpret this! - { - string tag_; - // Tag for the notification. - - // any value_; - // A notification can contain anything. - -// Object object_ref_; - // Object reference for callbacks. - }; - - interface Notification_Receiver - // = TITLE - // Defines the interface for a <Notification_Receiver> of events. - // Note that all operations are <oneway> to avoid blocking. - // - // = DESCRIPTION - { - oneway void receive_notification (in Notification notification); - // Inform the <Notification_Receiver> that <event> has occurred. - - oneway void disconnect (in string reason); - // Disconnect the <Notification_Receiver> from the <Notifier>, - // giving it the <reason>. - }; - - interface Notifier - // = TITLE - // Defines the interface for a <Notifier> of events. - // - // = DESCRIPTION - { - oneway void send_disconnect (in string reason); - // Disconnect all the receivers, giving them the <reason>. - - oneway void send_notification (in Notification notification); - // Send the <Notification> to all the consumers who - // have subscribed and who match the filtering criteria. - - oneway void subscribe (in Notification_Receiver notification_receiver, - in string filtering_criteria); - // Subscribe the <Notification_Receiver> to receive events that - // match the regular expresssion <filtering_criteria> applied by - // the <Notifier>. If <filtering_criteria> is "" then all events - // are matched. - - oneway void unsubscribe (in Notification_Receiver notification_receiver, - in string filtering_criteria); - // Unsubscribe the <Notification_Receiver> that matches the - // filtering criteria. If <filtering_criteria> is "" then - // all <Notification_Receivers> with the matching object reference - // are removed. - }; -}; - -#endif /* _EVENT_COMM_IDL */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Event_CommC.cpp b/apps/Orbix-Examples/Event_Comm/libsrc/Event_CommC.cpp deleted file mode 100644 index b7e328c556c..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Event_CommC.cpp +++ /dev/null @@ -1,351 +0,0 @@ - -// $Id$ - -#include "Event_Comm.hh" - - -#ifndef Event_Comm_Notification_Ops -#define Event_Comm_Notification_Ops - -void Event_Comm::Notification:: encodeOp (CORBA::Request &IT_r) const { - IT_r.encodeStringOp (tag_); -} - -void Event_Comm::Notification:: decodeOp (CORBA::Request &IT_r) { - IT_r.decodeStringOp(tag_); -} - -void Event_Comm::Notification:: decodeInOutOp (CORBA::Request &IT_r) { - IT_r.decodeInOutStrOp(tag_, 0); -} - -void* Event_Comm::Notification:: IT_anySupport (CORBA::Request &IT_r, - void *& IT_v, void *IT_to, const CORBA::Flags& IT_f) { - Event_Comm::Notification* IT_l = (Event_Comm::Notification*)IT_v; - - if (IT_f.isSetAll (CORBA::ARG_INOUT)) { - if (!IT_l) - IT_l = new Event_Comm::Notification(); - IT_l -> decodeInOutOp (IT_r); - IT_v = IT_l; - } - else if (IT_f.isSet (CORBA::ARG_IN)) { - IT_l -> encodeOp (IT_r); - } - else if (IT_f.isSet (CORBA::ARG_OUT)) { - if (!IT_l) - IT_l = new Event_Comm::Notification(); - IT_l -> decodeOp (IT_r); - IT_v = IT_l; - } - else if (IT_f.isSet (CORBA::_ANY_ASSIGN)) { - Event_Comm::Notification*IT_s = IT_to ? (Event_Comm::Notification*)IT_to : new Event_Comm::Notification; - *IT_s = *IT_l; return IT_s; - } - else if (IT_f.isSet (CORBA::_ANY_DELETE)) { - if (IT_to) IT_l->Event_Comm::Notification::~Notification(); - else delete IT_l; - return NULL; - } - else if (IT_f.isSet (CORBA::_ANY_SIZEOF)) { - return (void*) (sizeof (Event_Comm::Notification)); - } - else if (IT_f.isNil ()) { - if (!IT_l) - IT_l = new Event_Comm::Notification(); - IT_l -> decodeOp (IT_r); - IT_v = IT_l; - } - return NULL; -} - -const void *Event_Comm::Notification:: IT_fn = -CORBA::anyTable.record ("Event_Comm::Notification", &Event_Comm::Notification:: IT_anySupport); - -Event_Comm::Notification &Event_Comm::Notification:: operator= (const Event_Comm::IONANC_Notification& IT_p) { - this->operator= (*(Event_Comm::Notification*) &IT_p); - return (*this); -} - -Event_Comm::Notification:: operator Event_Comm::IONANC_Notification () { - Event_Comm::IONANC_Notification tmp; - memset (&tmp, 0, sizeof(tmp)); - ((Event_Comm::Notification *) &tmp)->operator= (*this); - return tmp; -} - -Event_Comm::Notification:: operator const Event_Comm::IONANC_Notification () const { - Event_Comm::IONANC_Notification tmp; - memset (&tmp, 0, sizeof(tmp)); - ((Event_Comm::Notification *) &tmp)->operator= (*this); - return tmp; -} - -Event_Comm::Notification::~Notification () { - if (tag_) delete [] tag_; -} - -Event_Comm::Notification:: Notification (const Event_Comm::Notification &IT_s) - { - if (IT_s.tag_) { - tag_=new char [strlen(IT_s.tag_)+1]; - strcpy (tag_, IT_s.tag_); - } - else { - tag_ = NULL; - } -} - -Event_Comm::Notification:: Notification () { - tag_ = NULL; -} - -Event_Comm::Notification &Event_Comm::Notification:: operator= (const Event_Comm::Notification& IT_s) { - if (this == &IT_s) return *this; - if (tag_) delete [] tag_; - if (IT_s.tag_) { - tag_=new char [strlen(IT_s.tag_)+1]; - strcpy (tag_, IT_s.tag_); - } - else { - tag_ = NULL; - } - return *this; -} - -Event_Comm::IONANC_Notification:: operator Event_Comm::Notification () { - return (*((Event_Comm::Notification *) this)); -} - -Event_Comm::IONANC_Notification:: operator const Event_Comm::Notification () const { - return (*((const Event_Comm::Notification *) this)); -} - - -#endif -Event_Comm::Notification_Receiver::Notification_Receiver (char *IT_OR) { - m_pptr = new Notification_Receiver_dispatch (IT_OR, this,(CORBA::Object*)this); -} - -#ifndef Event_Comm_Notification_ReceiverForwC -#define Event_Comm_Notification_ReceiverForwC -CORBA::ObjectRef Event_Comm::Notification_Receiver_getBase(void *IT_p){ - return (Event_Comm::Notification_Receiver*)IT_p;} - -void Event_Comm::Notification_Receiver_release (void *IT_p, CORBA::Environment &IT_env) { - ((Event_Comm::Notification_Receiver*)IT_p)->_release(IT_env);} - -Event_Comm::Notification_Receiver* Event_Comm::Notification_Receiver_duplicate (void *IT_p, CORBA::Environment &IT_env) { - return ((Event_Comm::Notification_Receiver*)IT_p)->_duplicate(IT_env); } -#endif - - - -Event_Comm::Notification_Receiver* Event_Comm::Notification_Receiver:: _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env) { - Notification_Receiver*IT_p = - (Notification_Receiver*)CORBA::Factory.New (IT_markerServer, IT_env, IT_c, host, - Event_Comm_Notification_Receiver_IMPL, Event_Comm_Notification_Receiver_IR); - return IT_p ? IT_p->_duplicate () : NULL; } - - - -Event_Comm::Notification_Receiver* Event_Comm::Notification_Receiver:: _bind (CORBA::Environment &IT_env) { - return _bind (NULL,NULL,CORBA::Context(), IT_env); } - - -Event_Comm::Notification_Receiver* Event_Comm::Notification_Receiver:: _bind (const char* IT_markerServer, const char* host, - CORBA::Environment &IT_env) { - return _bind (IT_markerServer, host, CORBA::Context (), IT_env); } -Event_Comm::Notification_Receiver* Event_Comm::Notification_Receiver::_narrow (CORBA::Object* IT_obj, CORBA::Environment &IT_env) { - Event_Comm::Notification_Receiver* IT_p = (Event_Comm::Notification_Receiver*)CORBA::Object::_castDown (IT_obj, Event_Comm_Notification_Receiver_IR, IT_env); - return IT_p ? IT_p->_duplicate(IT_env) : NULL; - } - -void* Event_Comm::Notification_ReceiverProxyFactoryClass::New (char *IT_OR, CORBA::Environment&) { - return new Notification_Receiver(IT_OR);} - -void* Event_Comm::Notification_ReceiverProxyFactoryClass::New2 () { - return new Notification_Receiver();} - -void* Event_Comm::Notification_ReceiverProxyFactoryClass::IT_castUp (void *IT_p, char* IT_s) { - void *IT_l; - if (!CORBA::_interfaceCmp (IT_s,Event_Comm_Notification_Receiver_IR)) - return IT_p; - else if (IT_l=CORBA::ObjectFactoryClass::IT_castUp((CORBA::Object*)((Event_Comm::Notification_Receiver*)IT_p),IT_s)) - return IT_l; - else return NULL; - } - - -CORBA::PPTR* Event_Comm::Notification_ReceiverProxyFactoryClass::pptr (void *IT_p) { - return ((Event_Comm::Notification_Receiver*)IT_p)->_pptr ();} - -void Event_Comm::Notification_ReceiverProxyFactoryClass::baseInterfaces (_IDL_SEQUENCE_string& seq) { - add (seq, Event_Comm_Notification_Receiver_IR); - CORBA::ObjectFactoryClass::baseInterfaces (seq); -} - - void Event_Comm::Notification_Receiver:: receive_notification(const Event_Comm::Notification& notification, CORBA::Environment &IT_env) { - - if (IT_env || m_isNull) return ; - CORBA::Request IT_r (this, "receive_notification",IT_env,1,1); - if (!IT_r.isException (IT_env)) { - notification.encodeOp (IT_r); - } - - IT_r.invoke (CORBA::Flags(CORBA::INV_NO_RESPONSE), IT_env); - } - - void Event_Comm::Notification_Receiver:: disconnect(const char * reason, CORBA::Environment &IT_env) { - - if (IT_env || m_isNull) return ; - CORBA::Request IT_r (this, "disconnect",IT_env,1,1); - if (!IT_r.isException (IT_env)) { - IT_r.encodeStringOp (reason); - } - - IT_r.invoke (CORBA::Flags(CORBA::INV_NO_RESPONSE), IT_env); - } - - -Event_Comm::Notification_ReceiverProxyFactoryClass Event_Comm::Notification_ReceiverProxyFactory(1); - - -#ifndef Event_Comm_Notification_Receiver_dispatch_impl - -unsigned char Event_Comm::Notification_Receiver_dispatch::dispatch (CORBA::Request &IT_r, - unsigned char, void *) { - IT_r.makeRuntimeException1 ("Event_Comm::Notification_Receiver"); - return 0; -} - -#endif - -Event_Comm::Notifier::Notifier (char *IT_OR) { - m_pptr = new Notifier_dispatch (IT_OR, this,(CORBA::Object*)this); -} - -#ifndef Event_Comm_NotifierForwC -#define Event_Comm_NotifierForwC -CORBA::ObjectRef Event_Comm::Notifier_getBase(void *IT_p){ - return (Event_Comm::Notifier*)IT_p;} - -void Event_Comm::Notifier_release (void *IT_p, CORBA::Environment &IT_env) { - ((Event_Comm::Notifier*)IT_p)->_release(IT_env);} - -Event_Comm::Notifier* Event_Comm::Notifier_duplicate (void *IT_p, CORBA::Environment &IT_env) { - return ((Event_Comm::Notifier*)IT_p)->_duplicate(IT_env); } -#endif - - - -Event_Comm::Notifier* Event_Comm::Notifier:: _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env) { - Notifier*IT_p = - (Notifier*)CORBA::Factory.New (IT_markerServer, IT_env, IT_c, host, - Event_Comm_Notifier_IMPL, Event_Comm_Notifier_IR); - return IT_p ? IT_p->_duplicate () : NULL; } - - - -Event_Comm::Notifier* Event_Comm::Notifier:: _bind (CORBA::Environment &IT_env) { - return _bind (NULL,NULL,CORBA::Context(), IT_env); } - - -Event_Comm::Notifier* Event_Comm::Notifier:: _bind (const char* IT_markerServer, const char* host, - CORBA::Environment &IT_env) { - return _bind (IT_markerServer, host, CORBA::Context (), IT_env); } -Event_Comm::Notifier* Event_Comm::Notifier::_narrow (CORBA::Object* IT_obj, CORBA::Environment &IT_env) { - Event_Comm::Notifier* IT_p = (Event_Comm::Notifier*)CORBA::Object::_castDown (IT_obj, Event_Comm_Notifier_IR, IT_env); - return IT_p ? IT_p->_duplicate(IT_env) : NULL; - } - -void* Event_Comm::NotifierProxyFactoryClass::New (char *IT_OR, CORBA::Environment&) { - return new Notifier(IT_OR);} - -void* Event_Comm::NotifierProxyFactoryClass::New2 () { - return new Notifier();} - -void* Event_Comm::NotifierProxyFactoryClass::IT_castUp (void *IT_p, char* IT_s) { - void *IT_l; - if (!CORBA::_interfaceCmp (IT_s,Event_Comm_Notifier_IR)) - return IT_p; - else if (IT_l=CORBA::ObjectFactoryClass::IT_castUp((CORBA::Object*)((Event_Comm::Notifier*)IT_p),IT_s)) - return IT_l; - else return NULL; - } - - -CORBA::PPTR* Event_Comm::NotifierProxyFactoryClass::pptr (void *IT_p) { - return ((Event_Comm::Notifier*)IT_p)->_pptr ();} - -void Event_Comm::NotifierProxyFactoryClass::baseInterfaces (_IDL_SEQUENCE_string& seq) { - add (seq, Event_Comm_Notifier_IR); - CORBA::ObjectFactoryClass::baseInterfaces (seq); -} - - void Event_Comm::Notifier:: send_disconnect(const char * reason, CORBA::Environment &IT_env) { - - if (IT_env || m_isNull) return ; - CORBA::Request IT_r (this, "send_disconnect",IT_env,1,1); - if (!IT_r.isException (IT_env)) { - IT_r.encodeStringOp (reason); - } - - IT_r.invoke (CORBA::Flags(CORBA::INV_NO_RESPONSE), IT_env); - } - - void Event_Comm::Notifier:: send_notification(const Event_Comm::Notification& notification, CORBA::Environment &IT_env) { - - if (IT_env || m_isNull) return ; - CORBA::Request IT_r (this, "send_notification",IT_env,1,1); - if (!IT_r.isException (IT_env)) { - notification.encodeOp (IT_r); - } - - IT_r.invoke (CORBA::Flags(CORBA::INV_NO_RESPONSE), IT_env); - } - - void Event_Comm::Notifier:: subscribe(Event_Comm::Notification_Receiver* notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) { - - if (IT_env || m_isNull) return ; - CORBA::Request IT_r (this, "subscribe",IT_env,1,1); - if (!IT_r.isException (IT_env)) { - IT_r << (CORBA::Object*)notification_receiver; - - IT_r.encodeStringOp (filtering_criteria); - } - - IT_r.invoke (CORBA::Flags(CORBA::INV_NO_RESPONSE), IT_env); - } - - void Event_Comm::Notifier:: unsubscribe(Event_Comm::Notification_Receiver* notification_receiver, const char * filtering_criteria, CORBA::Environment &IT_env) { - - if (IT_env || m_isNull) return ; - CORBA::Request IT_r (this, "unsubscribe",IT_env,1,1); - if (!IT_r.isException (IT_env)) { - IT_r << (CORBA::Object*)notification_receiver; - - IT_r.encodeStringOp (filtering_criteria); - } - - IT_r.invoke (CORBA::Flags(CORBA::INV_NO_RESPONSE), IT_env); - } - - -Event_Comm::NotifierProxyFactoryClass Event_Comm::NotifierProxyFactory(1); - - -#ifndef Event_Comm_Notifier_dispatch_impl - -unsigned char Event_Comm::Notifier_dispatch::dispatch (CORBA::Request &IT_r, - unsigned char, void *) { - IT_r.makeRuntimeException1 ("Event_Comm::Notifier"); - return 0; -} - -#endif - diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Event_CommS.cpp b/apps/Orbix-Examples/Event_Comm/libsrc/Event_CommS.cpp deleted file mode 100644 index 7609370a2e6..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Event_CommS.cpp +++ /dev/null @@ -1,166 +0,0 @@ - -// $Id$ - -#include "Event_Comm.hh" - - -#define Event_Comm_Notification_Receiver_dispatch_impl - -unsigned char Event_Comm::Notification_Receiver_dispatch::dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void *IT_pp) { - if (!IT_pp) - IT_pp = m_obj; - const char *IT_s = IT_r.getOperation (); - if (!strcmp(IT_s,"receive_notification")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~receive_notification~+notification{R~Event_Comm::Notification~tag_{0}},>{v},O{}\ -")) - return 1; - Event_Comm::Notification notification; - notification.decodeOp (IT_r); - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((Event_Comm::Notification_Receiver*)IT_pp)->receive_notification ( notification, IT_env); - - IT_r.replyNoResults (CORBA::Flags(CORBA::INV_NO_RESPONSE),IT_env); - return 1; - } - - else if (!strcmp(IT_s,"disconnect")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~disconnect~+reason{0},>{v},O{}\ -")) - return 1; - char * reason; - IT_r.decodeStringOp(reason); - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((Event_Comm::Notification_Receiver*)IT_pp)->disconnect ( reason, IT_env); - - delete [] reason; - IT_r.replyNoResults (CORBA::Flags(CORBA::INV_NO_RESPONSE),IT_env); - return 1; - } - - else if (IT_isTarget) - IT_r.makeRuntimeException2 (); - - return 0; -} - -#define Event_Comm_Notifier_dispatch_impl - -unsigned char Event_Comm::Notifier_dispatch::dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void *IT_pp) { - if (!IT_pp) - IT_pp = m_obj; - const char *IT_s = IT_r.getOperation (); - if (!strcmp(IT_s,"send_disconnect")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~send_disconnect~+reason{0},>{v},O{}\ -")) - return 1; - char * reason; - IT_r.decodeStringOp(reason); - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((Event_Comm::Notifier*)IT_pp)->send_disconnect ( reason, IT_env); - - delete [] reason; - IT_r.replyNoResults (CORBA::Flags(CORBA::INV_NO_RESPONSE),IT_env); - return 1; - } - - else if (!strcmp(IT_s,"send_notification")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~send_notification~+notification{R~Event_Comm::Notification~tag_{0}},>{v},O{}\ -")) - return 1; - Event_Comm::Notification notification; - notification.decodeOp (IT_r); - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((Event_Comm::Notifier*)IT_pp)->send_notification ( notification, IT_env); - - IT_r.replyNoResults (CORBA::Flags(CORBA::INV_NO_RESPONSE),IT_env); - return 1; - } - - else if (!strcmp(IT_s,"subscribe")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~subscribe~+notification_receiver{O~Event_Comm::Notification_Receiver},+filtering_criteria{0},>{v},O{}\ -")) - return 1; - Event_Comm::Notification_Receiver* notification_receiver; - notification_receiver = (Event_Comm::Notification_Receiver*) IT_r.decodeObjRef (Event_Comm_Notification_Receiver_IR); - if (notification_receiver) notification_receiver->_duplicate (); - - char * filtering_criteria; - IT_r.decodeStringOp(filtering_criteria); - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((Event_Comm::Notifier*)IT_pp)->subscribe ( notification_receiver, filtering_criteria, IT_env); - - if (notification_receiver) notification_receiver->_release (); - - delete [] filtering_criteria; - IT_r.replyNoResults (CORBA::Flags(CORBA::INV_NO_RESPONSE),IT_env); - - return 1; - } - - else if (!strcmp(IT_s,"unsubscribe")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~unsubscribe~+notification_receiver{O~Event_Comm::Notification_Receiver},+filtering_criteria{0},>{v},O{}\ -")) - return 1; - Event_Comm::Notification_Receiver* notification_receiver; - notification_receiver = (Event_Comm::Notification_Receiver*) IT_r.decodeObjRef (Event_Comm_Notification_Receiver_IR); - if (notification_receiver) notification_receiver->_duplicate (); - - char * filtering_criteria; - IT_r.decodeStringOp(filtering_criteria); - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((Event_Comm::Notifier*)IT_pp)->unsubscribe ( notification_receiver, filtering_criteria, IT_env); - - if (notification_receiver) notification_receiver->_release (); - - delete [] filtering_criteria; - IT_r.replyNoResults (CORBA::Flags(CORBA::INV_NO_RESPONSE),IT_env); - - return 1; - } - - else if (IT_isTarget) - IT_r.makeRuntimeException2 (); - - return 0; -} - -#include "Event_CommC.cpp" - diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm_i.h b/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm_i.h deleted file mode 100644 index 57ab7124255..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Event_Comm_i.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Event_Comm_i.h -// -// = DESCRIPTION -// Class interface for the implementation of the distributed -// event notification mechanism. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_EVENT_COMM_I_H) -#define _EVENT_COMM_I_H - -#include "Notification_Receiver_i.h" -#include "Notifier_i.h" - -#if defined (ACE_HAS_ORBIX) -#define nil 0 - -// Tie the Notification_Receiver and Notifier implementation classes -// together with the IDL interface. - -DEF_TIE_Event_Comm_Notification_Receiver (Notification_Receiver_i) -DEF_TIE_Event_Comm_Notifier (Notifier_i) - -#endif /* ACE_HAS_ORBIX */ -#endif /* _EVENT_COMM_I_H */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Makefile b/apps/Orbix-Examples/Event_Comm/libsrc/Makefile deleted file mode 100644 index add9fd31151..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Makefile +++ /dev/null @@ -1,113 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Event Communications library -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -LIB = libEvent_Comm.a -SHLIB = libEvent_Comm.so - -FILES = Event_CommS \ - Event_CommC \ - Notifier_i \ - Notification_Receiver_i - -LSRC = $(addsuffix .cpp,$(FILES)) -LOBJ = $(addsuffix .o,$(FILES)) -SHOBJ = $(addsuffix .so,$(FILES)) - -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -BUILD = $(VLIB) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nonested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.lib.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.local.GNU - -#---------------------------------------------------------------------------- -# Orbix related macros and target settings. -#---------------------------------------------------------------------------- - -ORBIX_BINDIR = $(ORBIX_ROOT)/bin -ORBIX_LIBDIR = $(ORBIX_ROOT)/lib -ORBIX_INCDIR = $(ORBIX_ROOT)/include - -CPPFLAGS += -DEXCEPTIONS -I$(ORBIX_INCDIR) -DWANT_ORBIX_FDS -LDFLAGS += -L$(ORBIX_LIBDIR) -R $(ORBIX_LIBDIR) - -IDLFLAGS = -A -s S.cpp -c C.cpp - -#---------------------------------------------------------------------------- -# Local targets -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -Event_CommS.o: Event_CommS.cpp Event_Comm.hh Event_CommC.cpp -Event_CommC.o: Event_CommC.cpp Event_Comm.hh -Notifier_i.o: Notifier_i.cpp \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - Notification_Receiver_i.h Notifier_i.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Map_Manager.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/SString.i \ - Event_Comm.hh -Notification_Receiver_i.o: Notification_Receiver_i.cpp \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/sysincludes.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Priority.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Record.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Log_Msg.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Time_Value.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Synch_T.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Specific.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Config.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Handle_Set.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Event_Handler.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Timer_Queue.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Signal.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Set.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Token.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Reactor.i \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Shared_Object.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Service_Record.h \ - /project/adaptive/ACE_wrappers/build/SunOS5.4/include/ace/Thread_Manager.h \ - Notification_Receiver_i.h - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Notification.idl b/apps/Orbix-Examples/Event_Comm/libsrc/Notification.idl deleted file mode 100644 index ecfd5adb8e0..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Notification.idl +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- C++ -*- */ -// @(#)Notification.idl 1.1 10/18/96 - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notification.idl -// -// = DESCRIPTION -// This is the CORBA IDL interface for the Event Communication <Notification>. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#ifndef _NOTIFICATION_IDL -#define _NOTIFICATION_IDL - -struct Notification - // = TITLE - // Defines the interface for an event <Notification>. - // - // = This is the type passed by the Notifier to the Notification_Receiver. - // Since it contains an <any>, it can hold any values. Naturally, - // the consumer must understand how to interpret this! -{ - string tag_; - // Tag for the notification. - -// any value_; - // A notification can contain anything. - - Object object_ref_; - // Object reference for callbacks. -}; - -#endif /* _NOTIFICATION_IDL */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver.idl b/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver.idl deleted file mode 100644 index 222f18782f7..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver.idl +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- C++ -*- */ -// @(#)Notification_Receiver.idl 1.1 10/18/96 - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notification_Receiver.idl -// -// = DESCRIPTION -// The CORBA IDL interface for the Event Communication -// <Notification_Receiver> component. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#include "Notification.idl" - -#ifndef _Notification_Receiver_iDL -#define _Notification_Receiver_iDL - -interface Notification_Receiver - // = TITLE - // Defines the interface for a <Notification_Receiver> of events. - // Note that all operations are <oneway> to avoid blocking. - // - // = DESCRIPTION -{ - oneway void receive_notification (in Notification notification); - // Inform the <Notification_Receiver> that <event> has occurred. - - oneway void disconnect (in string reason); - // Disconnect the <Notification_Receiver> from the <Notifier>, - // giving it the <reason>. -}; - -#endif /* _Notification_Receiver_iDL */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver_i.cpp b/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver_i.cpp deleted file mode 100644 index 57fb7cf8f91..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver_i.cpp +++ /dev/null @@ -1,39 +0,0 @@ - -// $Id$ - -#include "ace/Service_Config.h" -#include "Notification_Receiver_i.h" - -#if defined (ACE_HAS_ORBIX) - -Notification_Receiver_i::Notification_Receiver_i (void) -{ -} - -Notification_Receiver_i::~Notification_Receiver_i (void) -{ -} - -// Inform the <Event_Comm::Notification_Receiver> that <event> has occurred. - -void -Notification_Receiver_i::receive_notification - (const Event_Comm::Notification ¬ification, - CORBA::Environment &IT_env) -{ - const char *tmpstr = notification.tag_; - - ACE_DEBUG ((LM_DEBUG, "**** got notification = %s\n", tmpstr)); -} - -// Disconnect the <Event_Comm::Notification_Receiver> from the <Event_Comm::Notifier>. - -void -Notification_Receiver_i::disconnect (const char *reason, - CORBA::Environment &IT_env) -{ - ACE_DEBUG ((LM_DEBUG, "**** got disconnected due to %s\n", reason)); - ACE_Service_Config::end_reactor_event_loop (); -} - -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver_i.h b/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver_i.h deleted file mode 100644 index 91bb99d6124..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Notification_Receiver_i.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notification_Receiver__i.h -// -// = DESCRIPTION -// Class interface for the implementation of the <Notification_Receiver> -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_Notification_Receiver_i_H) -#define _Notification_Receiver_i_H - -#if defined (ACE_HAS_ORBIX) -#include "Event_Comm.hh" - -class Notification_Receiver_i - // = TITLE - // Defines the implementation class for event <Notification_Receivers>. - // - // = DESCRIPTION -{ -public: - Notification_Receiver_i (void); - ~Notification_Receiver_i (void); - - virtual void receive_notification (const Event_Comm::Notification ¬ification, - CORBA::Environment &IT_env); - // Pass the <Notification> to the <Notification_Receiver>. - - virtual void disconnect (const char *reason, - CORBA::Environment &IT_env); - // Disconnect the <Notification_Receiver> from the <Notifier>, - // giving it the <reason>. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _Notification_Receiver_i_H */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Notifier.idl b/apps/Orbix-Examples/Event_Comm/libsrc/Notifier.idl deleted file mode 100644 index 75e738e0627..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Notifier.idl +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- C++ -*- */ -// @(#)Notifier.idl 1.1 10/18/96 - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notifier.idl -// -// = DESCRIPTION -// This is the CORBA IDL interface for the Event Communication <Notifier>. -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#ifndef _Notifier_iDL -#define _Notifier_iDL - -#include "Notification.idl" -#include "Notification_Receiver.idl" - -interface Notifier - // = TITLE - // Defines the interface for a <Notifier> of events. - // - // = DESCRIPTION -{ - oneway void send_disconnect (in string reason); - // Disconnect all the receivers, giving them the <reason>. - - oneway void send_notification (in Notification notification); - // Send the <Notification> to all the consumers who - // have subscribed and who match the filtering criteria. - - oneway void subscribe (in Notification_Receiver notification_receiver, - in string filtering_criteria); - // Subscribe the <Notification_Receiver> to receive events that - // match <filtering_criteria> applied by the <Notifier>. - - oneway void unsubscribe (in Notification_Receiver notification_receiver); - // Unsubscribe the <Notification_Receiver>. -}; - -#endif /* _Notifier_iDL */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Notifier_i.cpp b/apps/Orbix-Examples/Event_Comm/libsrc/Notifier_i.cpp deleted file mode 100644 index 192a0aaab2a..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Notifier_i.cpp +++ /dev/null @@ -1,324 +0,0 @@ - -// $Id$ - -#include "Notification_Receiver_i.h" -#include "Notifier_i.h" - -#if defined (ACE_HAS_ORBIX) - -class Notification_Receiver_Entry - // = TITLE - // Keeps track of context information associated with - // a <Event_Comm::Notification_Receiver> entry. - // - // = DESCRIPTION - // -{ -public: - Notification_Receiver_Entry (Event_Comm::Notification_Receiver *notification_receiver, - const char *filtering_criteria); - ~Notification_Receiver_Entry (void); - - // = Set/get filtering criteria. - void criteria (const char *criteria); - const char *criteria (void); - - // = Set/get Event_Comm::Notification_Receiver object reference. - Event_Comm::Notification_Receiver *receiver (void); - void receiver (Event_Comm::Notification_Receiver *); - - // = Set/get the compiled regular expression buffer. - const char *regexp (void); - void regexp (char *); - -private: - const char *filtering_criteria_; - // String containing the filtering criteria. - - char *compiled_regexp_; - // Compiled representation of the regular expression (see - // regexpr(3g)). - - Event_Comm::Notification_Receiver *receiver_; - // Object reference for the Event_Comm::Notification_Receiver. -}; - -// = Set/get filtering criteria. - -void -Notification_Receiver_Entry::criteria (const char *criteria) -{ - ACE_OS::free (ACE_MALLOC_T (this->filtering_criteria_)); - this->filtering_criteria_ = ACE_OS::strdup (criteria); -} - -const char * -Notification_Receiver_Entry::criteria (void) -{ - return this->filtering_criteria_; -} - -// = Set/get Event_Comm::Notification_Receiver object reference. - -Event_Comm::Notification_Receiver * -Notification_Receiver_Entry::receiver (void) -{ - return this->receiver_; -} - -void -Notification_Receiver_Entry::receiver (Event_Comm::Notification_Receiver *receiver) -{ - this->receiver_ = receiver; -} - -const char * -Notification_Receiver_Entry::regexp (void) -{ - return this->compiled_regexp_; -} - -void -Notification_Receiver_Entry::regexp (char *regexp) -{ - ACE_OS::free (ACE_MALLOC_T (this->compiled_regexp_)); - this->compiled_regexp_ = regexp; -} - -Notification_Receiver_Entry::Notification_Receiver_Entry (Event_Comm::Notification_Receiver *receiver, - const char *filtering_criteria) - : receiver_ (receiver), - filtering_criteria_ (0), - compiled_regexp_ (0) -{ - char *compile_buffer = 0; - - this->criteria (filtering_criteria); - ACE_ASSERT (this->criteria ()); - - // Check for wildcard case first. - if (ACE_OS::strcmp (filtering_criteria, "") == 0) - compile_buffer = ACE_OS::strdup (""); - else // Compile the regular expression (the 0's cause ACE_OS::compile to allocate space). - compile_buffer = ACE_OS::compile (filtering_criteria, 0, 0); - - // Should throw an exception here! - ACE_ASSERT (compile_buffer != 0); - - this->regexp (compile_buffer); - ACE_ASSERT (this->regexp ()); - - // Increment the reference count since we are keeping a copy of - // this... - this->receiver_->_duplicate (this->receiver_); -} - -Notification_Receiver_Entry::~Notification_Receiver_Entry (void) -{ - ACE_OS::free (this->filtering_criteria_); - ACE_OS::free (this->compiled_regexp_); - // Decrement the object reference count. - CORBA::release (this->receiver_); -} - -Notifier_i::Notifier_i (size_t size) - : map_ (size) -{ -} - -// Add a new receiver to the table, being careful to check for -// duplicate entries. A receiver is considered a duplicate under -// the following circumstances: -// 1. It has the same marker name and the same filtering criteria -// 2. It has the same marker name and its filtering criteria is "" (the wild card). - -void -Notifier_i::subscribe (Event_Comm::Notification_Receiver *receiver_ref, - const char *filtering_criteria, - CORBA::Environment &IT_env) -{ - ACE_DEBUG ((LM_DEBUG, - "in Notifier_i::subscribe for %s with filtering criteria \"%s\"\n", - receiver_ref->_marker (), filtering_criteria)); - ACE_SString key (receiver_ref->_marker ()); - MAP_ITERATOR mi (this->map_); - - // Try to locate an entry using its marker name (which should be - // unique across the system). If we don't find the entry, or if the - // filtering criteria is different that is good news since we - // currently don't allow duplicates... In particular, if @@ Should - // duplicates be allowed? - - for (MAP_ENTRY *me = 0; mi.next (me) != 0; mi.advance ()) - { - Notification_Receiver_Entry *nr_entry = me->int_id_; - - // Check for a duplicate entry. - if (key == me->ext_id_ - && (ACE_OS::strcmp (filtering_criteria, "") == 0 - || ACE_OS::strcmp (filtering_criteria, nr_entry->criteria ()) == 0)) - { - // Inform the caller that the - // Event_Comm::Notification_Receiver * is already being - // used. - - errno = EADDRINUSE; - ACE_ERROR ((LM_ERROR, - "duplicate entry for receiver %s with criteria \"%s\"", - receiver_ref->_marker (), filtering_criteria)); - // Raise exception here??? - return; - } - } - - // If we get this far then we didn't find a duplicate, so add the - // new entry! - Notification_Receiver_Entry *nr_entry = - new Notification_Receiver_Entry (receiver_ref, filtering_criteria); - - if (nr_entry == 0) - { - errno = ENOMEM; - ACE_ERROR ((LM_ERROR, "%p\n", "new failed")); - // Raise exception here... - } - // Try to add new <Notification_Receiver_Entry> to the map. - else if (this->map_.bind (key, nr_entry) == -1) - { - // Prevent memory leaks. - delete nr_entry; - // Raise exception here... - ACE_ERROR ((LM_ERROR, "%p\n", "bind failed")); - } -} - -// Remove a receiver from the table. - -void -Notifier_i::unsubscribe (Event_Comm::Notification_Receiver *receiver_ref, - const char *filtering_criteria, - CORBA::Environment &IT_env) -{ - ACE_DEBUG ((LM_DEBUG, "in Notifier_i::unsubscribe for %s\n", - receiver_ref->_marker ())); - Notification_Receiver_Entry *nr_entry = 0; - ACE_SString key; - MAP_ITERATOR mi (this->map_); - int found = 0; - - // Don't make a copy since we are deleting... - key.rep ((char *) receiver_ref->_marker ()); - - // Locate <Notification_Receiver_Entry> and free up resources. @@ - // Note, we don't properly handle deallocation of KEYS! - - for (MAP_ENTRY *me = 0; mi.next (me) != 0; mi.advance ()) - { - if (key == me->ext_id_ - && (ACE_OS::strcmp (filtering_criteria, "") == 0 - || ACE_OS::strcmp (filtering_criteria, nr_entry->criteria ()) == 0)) - { - ACE_DEBUG ((LM_DEBUG, "removed entry %s with criteria \"%s\"\n", - receiver_ref->_marker (), filtering_criteria)); - found = 1; - // @@ This is a hack, we need a better approach! - if (this->map_.unbind (key, nr_entry) == -1) - ACE_ERROR ((LM_ERROR, "unbind failed for %s\n", - receiver_ref->_marker ())); - else - delete nr_entry; - } - } - - if (found == 0) - ACE_ERROR ((LM_ERROR, "entry %s with criteria \"%s\" not found\n", - receiver_ref->_marker (), filtering_criteria)); -} - -// Disconnect all the receivers, giving them the <reason>. - -void -Notifier_i::send_disconnect (const char *reason, - CORBA::Environment &IT_env) -{ - ACE_DEBUG ((LM_DEBUG, "in Notifier_i::send_disconnect = %s\n", reason)); - - MAP_ITERATOR mi (this->map_); - int count = 0; - - // Notify all the receivers, taking into account the filtering criteria. - - for (MAP_ENTRY *me = 0; mi.next (me) != 0; mi.advance ()) - { - Event_Comm::Notification_Receiver *receiver_ref = me->int_id_->receiver (); - ACE_ASSERT (receiver_ref->_marker () != 0); - ACE_DEBUG ((LM_DEBUG, "disconnecting client %s\n", receiver_ref->_marker ())); - TRY { - receiver_ref->disconnect (reason, IT_X); - } - CATCHANY { - cerr << "Unexpected exception " << IT_X << endl; - } - ENDTRY; - delete me->int_id_; - delete me->ext_id_.rep (); - count++; - } - - this->map_.close (); - if (count == 1) - ACE_DEBUG ((LM_DEBUG, "there was 1 receiver\n")); - else - ACE_DEBUG ((LM_DEBUG, "there were %d receivers\n", count)); -} - -// Notify all receivers whose filtering criteria match the event. - -void -Notifier_i::send_notification (const Event_Comm::Notification ¬ification, - CORBA::Environment &IT_env) -{ - ACE_DEBUG ((LM_DEBUG, "in Notifier_i::send_notification = %s\n", - notification.tag_)); - MAP_ITERATOR mi (this->map_); - int count = 0; - - // Notify all the receivers. - // @@ Later on we need to consider the filtering_criteria! - - for (MAP_ENTRY *me = 0; mi.next (me) != 0; mi.advance ()) - { - Event_Comm::Notification_Receiver *receiver_ref = me->int_id_->receiver (); - ACE_ASSERT (receiver_ref->_marker () != 0); - const char *regexp = me->int_id_->regexp (); - const char *criteria = me->int_id_->criteria (); - ACE_ASSERT (regexp); - ACE_ASSERT (criteria); - - // Do a regular expression comparison to determine matching. - if (ACE_OS::strcmp ("", criteria) == 0 // Everything matches the wildcard. -// || ACE_OS::strcmp (notification.tag_, regexp) == 0) - || ACE_OS::step (notification.tag_, regexp) != 0) - { - ACE_DEBUG ((LM_DEBUG, "string %s matched regexp \"%s\" for client %s\n", - notification.tag_, me->int_id_->criteria (), - receiver_ref->_marker ())); - TRY { - receiver_ref->receive_notification (notification, IT_X); - } - CATCHANY { - cerr << "Unexpected exception " << IT_X << endl; - continue; - } - ENDTRY; - count++; - } - } - - if (count == 1) - ACE_DEBUG ((LM_DEBUG, "there was 1 receiver\n")); - else - ACE_DEBUG ((LM_DEBUG, "there were %d receivers\n", count)); -} - -#endif /* ACE_HAS_ORBIX */ diff --git a/apps/Orbix-Examples/Event_Comm/libsrc/Notifier_i.h b/apps/Orbix-Examples/Event_Comm/libsrc/Notifier_i.h deleted file mode 100644 index 523710811a5..00000000000 --- a/apps/Orbix-Examples/Event_Comm/libsrc/Notifier_i.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -// ============================================================================ -// -// = LIBRARY -// EventComm -// -// = FILENAME -// Notifier_i.h -// -// = DESCRIPTION -// Class interface for the implementation of the <Notifier> -// -// = AUTHOR -// Douglas C. Schmidt (schmidt@cs.wustl.edu) -// -// ============================================================================ - -#if !defined (_Notifier_i_H) -#define _Notifier_i_H - -#include "ace/Map_Manager.h" -#include "ace/Synch.h" -#include "ace/SString.h" -#include "Event_Comm.hh" - -#if defined (ACE_HAS_ORBIX) - -// Forward reference. -class Notification_Receiver_Entry; - -class Notifier_i - // = TITLE - // Defines the implementation class for event <Notifiers>. - // - // = DESCRIPTION -{ -public: - enum - { - DEFAULT_SIZE = 1024 // Default max number of Event_Comm::Notification_Receivers. - }; - - Notifier_i (size_t size_hint = Notifier_i::DEFAULT_SIZE); - // Initialize a Notifier_i object with the specified size hint. - - void send_disconnect (const char *reason, - CORBA::Environment &IT_env); - // Disconnect all the receivers, giving them the <reason>. - - void send_notification (const Event_Comm::Notification ¬ification, - CORBA::Environment &IT_env); - // Send the <Notification> to all the consumers who - // have subscribed and who match the filtering criteria. - - void subscribe (Event_Comm::Notification_Receiver *notification_receiver, - const char *filtering_criteria, - CORBA::Environment &IT_env); - // Subscribe the <Notification_Receiver> to receive events that - // match <filtering_criteria> applied by the <Notifier>. - - void unsubscribe (Event_Comm::Notification_Receiver *notification_receiver, - const char *filtering_criteria, - CORBA::Environment &IT_env); - // Unsubscribe the <Notification_Receiver>. - -private: - // The following implementation should be replaced - // by a standard container class from STL... - - typedef ACE_Map_Manager <ACE_SString, Notification_Receiver_Entry *, ACE_Null_Mutex> MAP_MANAGER; - typedef ACE_Map_Iterator <ACE_SString, Notification_Receiver_Entry *, ACE_Null_Mutex> MAP_ITERATOR; - typedef ACE_Map_Entry <ACE_SString, Notification_Receiver_Entry *> MAP_ENTRY; - - MAP_MANAGER map_; - // Table that maps a <Event_Comm::Notification_Receiver *> to a <Notification_Receiver_Entry *>. -}; - -#endif /* ACE_HAS_ORBIX */ -#endif /* _Notifier_i_H */ diff --git a/apps/Orbix-Examples/Logger/Logger.cpp b/apps/Orbix-Examples/Logger/Logger.cpp deleted file mode 100644 index e5a9f4b76ef..00000000000 --- a/apps/Orbix-Examples/Logger/Logger.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include <iostream.h> -// $Id$ - -#include "Logger.h" - -Logger::~Logger (void) -{ - // Release and free up the object reference. - this->logref_->_release (); - - // Must use free since we used strdup(3C). - ACE_OS::free (ACE_MALLOC_T (this->server_)); -} - -// Constructor takes the name of the host where the server -// is located. If server == 0, then use the locator service. - -Logger::Logger (char *server, size_t max_message_size) - : server_ (server == 0 ? 0 : ACE_OS::strdup (server)), - ip_ (0), - pid_ (ACE_OS::getpid ()) -{ - struct utsname name; - -#if 0 - // Could also use sysinfo(2)... - - ACE_OS::sysinfo (SI_HOSTNAME, clienthost, MAXHOSTNAMELEN); -#endif - - ACE_OS::uname (&name); - hostent *hp = ACE_OS::gethostbyname (name.nodename); - - if (hp != 0) - memcpy ((void *) &this->ip_, (void *) hp->h_addr, hp->h_length); - - TRY { - // First bind to the logger object. - // argv[1] has the hostname (if any) of the target logger object; - // The default is the local host: - this->logref_ = profile_logger::_bind ("", this->server_, IT_X); - } CATCHANY { - // an error occurred while trying to bind to the logger object. - cerr << "Bind to object failed" << endl; - cerr << "Unexpected exception " << IT_X << endl; - } ENDTRY; - // Pre-assign certain values that don't change. - this->log_msg_.app_id = this->pid_; - this->log_msg_.host_addr = this->ip_; - this->log_msg_.msg_data._maximum = max_message_size; -} - -// Transmit the message to the logging server. - -int -Logger::log (logger::Log_Priority priority, char message[], int length) -{ - // The following values change with every logging operation. - this->log_msg_.type = priority; - this->log_msg_.time = ACE_OS::time (0); - this->log_msg_.msg_data._length = length; - this->log_msg_.msg_data._buffer = message; - - TRY { - // Try to log a message. - this->logref_->log (this->log_msg_, IT_X); - } CATCHANY { - // an error occurred while trying to read the height and width: - cerr << "call to log failed" << endl; - cerr << "Unexpected exception " << IT_X << endl; - return -1; - } ENDTRY; - // success. - return 0; -} - -// Get the value of verbose. - -int -Logger::verbose (void) -{ - int verbosity = 0; - - TRY { - verbosity = this->logref_->verbose (); - } CATCHANY { - return -1; - } ENDTRY; - return verbosity; -} - -// Set the value of verbose. - -int -Logger::verbose (int value) -{ - int verbosity = 0; - - TRY { - this->logref_->verbose (value); - } CATCHANY { - return -1; - } ENDTRY; - return 0; -} - -// Activate the timer. - -int -Logger::start_timer (void) -{ - TRY { - this->logref_->start_timer (); - } CATCHANY { - return -1; - } ENDTRY; - return 0; -} - -// Deactivate the timer and return the elapsed time. - -int -Logger::stop_timer (profile_logger::Elapsed_Time &et) -{ - TRY { - this->logref_->stop_timer (et); - } CATCHANY { - return -1; - } ENDTRY; - return 0; -} diff --git a/apps/Orbix-Examples/Logger/Logger.h b/apps/Orbix-Examples/Logger/Logger.h deleted file mode 100644 index 5832c96aab6..00000000000 --- a/apps/Orbix-Examples/Logger/Logger.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -#if !defined (_LOGGER_H) -#define _LOGGER_H - -#include "ace/OS.h" -#include "logger.hh" - -class Logger - // = TITLE - // Wrapper class that uses CORBA object reference - // as the transport mechanism to simplify implementation. -{ -public: - Logger (char *server, size_t max_message_size); - // Constructor takes the name of the host where the server - // is located. If server == 0, then use the locator service. - - ~Logger (void); - // Destructor releases the object reference. - - int log (logger::Log_Priority prio, char msg[], int len); - // Log a <msg> of length <len> with priority <prio>. - - int verbose (void); - // Report current level of verbosity. - - int verbose (int verbosity); - // Set the level of verbosity (0 == no verbose, > 0 == verbose). - - int start_timer (void); - // Activate the timer. - - int stop_timer (profile_logger::Elapsed_Time &et); - // Deactivate the timer and return the elapsed time. - -private: - profile_logger *logref_; - // CORBA object reference proxy. - - int pid_; - // Process ID. - - u_long ip_; - // IP address of self. - - logger::Log_Record log_msg_; - // Cache certain non-changing values to avoid recomputing them. - - char *server_; - // Name of server that we are bound to. -}; - -#endif /* _LOGGER_H */ diff --git a/apps/Orbix-Examples/Logger/Makefile b/apps/Orbix-Examples/Logger/Makefile deleted file mode 100644 index 7193cee9945..00000000000 --- a/apps/Orbix-Examples/Logger/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Logger. -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -SVR_OBJS = loggerS.o logger_i.o server.o -CLT_OBJS = loggerC.o client.o Logger.o - -LDLIBS = - -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nonested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.lib.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.bin.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.local.GNU - -#---------------------------------------------------------------------------- -# Orbix related macros and target settings. -#---------------------------------------------------------------------------- - -ORBIX_BINDIR = $(ORBIX_ROOT)/bin -ORBIX_LIBDIR = $(ORBIX_ROOT)/lib -ORBIX_INCDIR = $(ORBIX_ROOT)/include - -CPPFLAGS += -DEXCEPTIONS -I$(ORBIX_INCDIR) -DWANT_ORBIX_FDS -LDFLAGS += -L$(ORBIX_LIBDIR) -R $(ORBIX_LIBDIR) - -IDLFLAGS = -s S.cpp -c C.cpp -B - -#---------------------------------------------------------------------------- -# Local targets -#---------------------------------------------------------------------------- - -all: client server - -client: $(addprefix $(VDIR),$(CLT_OBJS)) - $(LINK.cc) -o client $(addprefix $(VDIR),$(CLT_OBJS)) $(LDFLAGS) -lITsrvmt $(VLDLIBS) - -server: $(addprefix $(VDIR),$(SVR_OBJS)) - $(LINK.cc) -o server $(addprefix $(VDIR),$(SVR_OBJS)) $(LDFLAGS) -lITsrvmt $(VLDLIBS) - -#---------------------------------------------------------------------------- -# Dependencies -#---------------------------------------------------------------------------- -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - - - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/apps/Orbix-Examples/Logger/Orbix.hostgroups b/apps/Orbix-Examples/Logger/Orbix.hostgroups deleted file mode 100644 index 013636e79c4..00000000000 --- a/apps/Orbix-Examples/Logger/Orbix.hostgroups +++ /dev/null @@ -1 +0,0 @@ -all:tango diff --git a/apps/Orbix-Examples/Logger/Orbix.hosts b/apps/Orbix-Examples/Logger/Orbix.hosts deleted file mode 100644 index 2e11d889bed..00000000000 --- a/apps/Orbix-Examples/Logger/Orbix.hosts +++ /dev/null @@ -1,3 +0,0 @@ -profile_logger:tango: -logger:tango: -IT_daemon:tango: diff --git a/apps/Orbix-Examples/Logger/README b/apps/Orbix-Examples/Logger/README deleted file mode 100644 index 19b1db681f2..00000000000 --- a/apps/Orbix-Examples/Logger/README +++ /dev/null @@ -1,35 +0,0 @@ -The directory contains the source code that implements an Orbix -version of the distributed Logger. Other ACE versions of this code -appear in the ./apps/Logger directory. It is interesting to compare -and contrast the alternative implementations. - -RUNNING: - -The client is run as follows: - -client -h host -m max_message_size - -The -h host is optional if the locator service is properly configured. -The -m specifies the maximum number of kilobytes to be sent per log. This -is useful when redirecting messages to stdin. - -TIMING: - -I recommend timing the log's by specifying a max_message_size and -redirecting /usr/dict/words. This will give you several trials from -which to take an average. - -CLIENT: - -While using the client and typing in messages manually, capital Q and V -must be used to quit and toggle verbose respectively. This allows you -to redirect /usr/dict/words without quiting at the q's!! - -SERVER: - -To turn off message reporting on the server side, do a - -setenv NO_MESSAGES - -in the enviroment where the server will be run. If this is done, the server -will only report that a message was received, but not display the messages. diff --git a/apps/Orbix-Examples/Logger/a1.tex b/apps/Orbix-Examples/Logger/a1.tex deleted file mode 100644 index 5d10042e26e..00000000000 --- a/apps/Orbix-Examples/Logger/a1.tex +++ /dev/null @@ -1,232 +0,0 @@ -\documentstyle[times,11pt,moretext] {article} -\input macros -\input widen -\input psfig - -\begin{document} -\centerline{\Large Washington University} -\centerline{\Large Department of Computer Science} -\bigskip -\centerline{\large CS523: Distributed Operating Systems} -%\smallskip -%\centerline{\large Spring 1995} -\bigskip -\centerline{\large Programming Project} -% \centerline{\large Due Tuesday, January $31^{st}$, 1995} - -\section{Overview} - -In this assignment, you will implement a distributed logging service -shown in Figure~\ref{logenv}. Applications use this service to log -information (such as error notifications, debugging traces, and status -updates) in a distributed environment. In this service, CORBA remote -operations are used to send logging records to a central logging -server. The logging server outputs the logging records to a console, -a printer, a file, or a network management database, etc. - -\section{Design and Implementation Issues} - -The distributed logging service will be designed as a client/server -pair, containing the objects shown in Figure~\ref{simplog}. - -\subsection{CORBA IDL Specification} -The following CORBA IDL specification defines the logging interface: - -{ -\small -\ls{0.9} -\begin{verbatim} -// IDL schema definition -interface Logger -{ - // Types of logging messages. - enum Log_Priority { - LM_DEBUG, // Debugging messages - LM_WARNING, // Warning messages - LM_ERROR, // Errors - LM_EMERG // A panic condition - }; - - // Format of the logging record. - struct Log_Record { - Log_Priority type; // Type of logging message. - long time; // Time stamp at sender. - long app_id; // Process ID of sender. - long host_addr; // IP address of the sender. - sequence<char> msg_data; // Sender-specific logging message. - }; - - // Transmit a Log_Record to the logging server. - oneway void log (in Log_Record log_rec); - - // Toggle verbose formatting - attribute char verbose; -}; -\end{verbatim}} - -\begin{figure} -\center{\ \psfig{figure=graphics/logsimp.eps,width=13cm}\ } -\vspace{-0.12in} -\caption{Distributed Logging Service} -\label{logenv} -\end{figure} - -You will use a CORBA IDL compiler to translate this specification into -client-side {\em stubs} and server-side {\em skeletons}. The client -application (which you must write) will use the stubs as a {\em proxy} -to access the logging services provided by the server. You must also -write the implementation of the server, which provides the logging -service. - -\subsection{Client and Server Functionality} -For the purposes of the assignment, you can make the client driver -program very simple. The client can read a line from its standard -input and send it to the logging server. The server can then format -and print the line on its standard output. For example, if you type -this line to the client: - -\begin{verbatim} -To boldly go where no one has gone before -\end{verbatim} - -\noindent Then the server should output something like this: - -\begin{verbatim} -Jan 24 14:50:28 1995@tango.cs.wustl.edu@18352@LM_DEBUG -::To boldly go where no one has gone before -\end{verbatim} - -\noindent Note that the server has printed out the logging message -timestamp, sender's hostname and process id, and the message priority, -followed by the logging message data. - -\begin{figure} -\center{\ \psfig{figure=graphics/simplog.eps,width=13cm}\ } -\vspace{-0.12in} -\caption{CORBA-based Logger Design} -\label{simplog} -\end{figure} - -Note that in order to pass the client's IP address (which is -represented as a 4-byte {\tt long}) in the logging message, you'll -need to learn about several other UNIX routines. On the client-side -you'll need to use {\tt uname(2)} and {\tt gethostbyname(2)} to -determine the IP address of the client host. On the server-side, -you'll need to use the {\tt gethostbyaddr(2)} function to convert the -4-byte IP host address into an ASCII version of the host name. I -recommend that you check the manual pages and read Richard Steven's -book ``UNIX Network Programming'' for more details on using these -functions. - -\subsection{Invoking the Client and Server} -Once the client and server components are written, compiled, and -linked together you will use the {\tt putit} command to register the -server with the Orbix daemon. You'll then need to start up a copy of -{\tt orbixd} (if there isn't already one running). {\tt orbixd} -serves as the Object Request Broker for the local endpoint. - -A client will bind to the {\tt Logger} interface via the generated -{\tt Logger::\_bind} method. There are two general ways to use this -method. The first is to explicitly pass in the name of the server -where {\tt orbixd} is running (your client should accept a -command-line argument that is the name of the server, {\em e.g.,} -``tango.cs.wustl.edu''). - -The second method is to use the CORBA locator service to get an object -reference for the logging service. You'll need to read the Orbix -documentation to learn how to set up a location file. This file will -enable you to omit the name of the server in the call to {\tt -Logger::\_bind}. By using the locator server, your clients can bind -to object's implicitly. Make sure that your solution will work for -either implicit or explicit service location. - -Once the client application has bound (either explicitly or -implicitly) to an object reference for the {\tt Logger}, it can log -messages by calling the {\tt log} method via the object reference -proxy. - -\subsection{Performance Measurement} - -An important part of developing distributed systems is understanding -the performance implications of different design approaches. In order -to measure the performance overhead of using CORBA to build the -Logger, you will write a simple extension to the original {\tt Logger} -interface, as follows: - -{ -\small -\ls{0.9} -\begin{verbatim} -// IDL schema definition -interface Profile_Logger - : Logger // Profile_Logger IS-A Logger -{ - // Stores the amount of time that has elapsed. - struct Elapsed_Time - { - double real_time; - double user_time; - double system_time; - }; - - // Activate the timer. - void start_timer (void); - - // Deactivate the timer and return the elapsed time. - void stop_timer (out Elapsed_Time et); -}; -\end{verbatim}} - -\noindent You will need to modify your client program so that it can -time a series of {\tt Logger::log} operations for various sizes of -logging messages. This will help us understand the performance -overhead of CORBA. - -The main benchmarking should take place within a loop in your client -program. Basically, your client call {\tt -Profile\_Logger::start\_timer} just before sending the first of the -logging messages. After a suitable number of iterations (defined on -the command-line), you client will call {\tt -Profile\_Logger::stop\_timer} to determine and report the elapsed time -to the user. You should print out the ``real'' time, as well as the -``system $+$ user'' times. Make sure that you print out the -throughput in terms of megabits/sec (rather than bytes/sec or -kbytes/sec). Be sure to include the fixed-sized {\tt Log\_Record} -object, as well as the variable-sized {\tt msg\_data} portion in your -computations. - -The number of iterations and the size of the messages sent by the -client should be parameterizable on the command-line. Make sure that -your timing tests are run between processes on two different machines -(rather than processes on the same machine). If possible, try to run -the client and server processes on two machines on the same subnet. - -When you are finished with your timing test, you should explain the -timing results and indicate trends that you observed. - -\section{Learning and Using CORBA} - -To help you learn how CORBA works, I will be making copies of the -Orbix programmer's manual available for a small reproduction fee. -This manual explains how to program in CORBA. I will announce in -class where this will be available. - -We will be using IONA's Orbix CORBA Object Request Broker (ORB) -implementation. The libraries, executables, CORBA IDL compiler, and -example demo applications are located in {\tt -/project/adaptive/Orbix}. Please note that this is an automounted -directory, so you will need to {\tt cd} directly to it in order to see -the contents. To configure Orbix for your environment, copy the {\tt -/project/adaptive/Orbix/Orbix.cfg} file to your account. You'll need -to set the environment variable {\tt IT\_CONFIG\_PATH} to the complete -path where this file is located. - -\section{Concluding Remarks} -In office hours and in class, we will discuss how to use C++ and CORBA -in order to develop your solutions. Note that this assignment will -teach you many skills required to become adept at network programming. -However, it also will require a great deal of thought and planning. -Please make sure you start early, come to office hours, and ask lots -of questions. - -\end{document} diff --git a/apps/Orbix-Examples/Logger/client.cpp b/apps/Orbix-Examples/Logger/client.cpp deleted file mode 100644 index 6a0104bd07e..00000000000 --- a/apps/Orbix-Examples/Logger/client.cpp +++ /dev/null @@ -1,142 +0,0 @@ -// A client for the distributed logger example. This program reads -// $Id$ - -// from either stdin or from a redirected file and sends all the -// contents to the logging server. It also computes how long it takes -// to send this stuff. - - -#include "Logger.h" - -// maximum message size -static size_t max_message_size = BUFSIZ; - -// Default behavior is to use the locator service. -static char *hostname = 0; - -// Should we prompt the user? -static int user_prompt; - -static void -parse_args (int argc, char *argv[]) -{ - extern char *optarg; - extern int optind; - int c; - - ACE_LOG_MSG->open (argv[0]); - - // If a file has been redirected, don't activate user prompts - if (ACE_OS::isatty (0)) - user_prompt = 1; - else - user_prompt = 0; - - while ((c = ACE_OS::getopt (argc, argv, "m:h:")) != -1) - switch (c) - { - case 'm': - max_message_size = ACE_OS::atoi (optarg) * BUFSIZ; - break; - case 'h': - hostname = optarg; - break; - default: - ACE_ERROR ((LM_ERROR, "%n: -h host -m max_message_size (in kbytes)\n%a", 1)); - /* NOTREACHED */ - } -} - -// Enable/disable verbose logging. - -static int -toggle_verbose (Logger &logger) -{ - int verbose_value; - - verbose_value = logger.verbose (); - logger.verbose (!verbose_value); - return 0; -} - -// Transmit messages to the server. - -int -transmit (Logger &logger, char buf[], ACE_HANDLE handle = 0) -{ - if (user_prompt) - cout << "\nEnter message ('Q':quit,'V':toggle verbose):\n" << flush; - - ssize_t nbytes = ACE_OS::read (handle, buf, max_message_size); - - if (nbytes <= 0) - return nbytes; // End of file or error. - buf[nbytes] = '\0'; - - if (user_prompt) - { - if (buf[0] == 'Q' || buf[0] == 'q') - return 0; - // toggle verbose? - else if (buf[0] == 'V' || buf[0] == 'v') - toggle_verbose (logger); - } - - // send the message to the logger - if (logger.log (logger::LM_DEBUG, buf, nbytes) == -1) - return -1; - else - return nbytes; -} - -// Print the results of the tests. - -void -report_results (profile_logger::Elapsed_Time &et, size_t total_bytes) -{ - ACE_DEBUG ((LM_DEBUG, - "real time = %8.2f\n" - "user time = %8.2f\n" - "sys time = %8.2f\n" - "mbits sec = %8.2f\n", - et.real_time, et.user_time, et.system_time, - (total_bytes / et.real_time) * 8.0 / 1024.0 / 1024.0)); -} - -int -main (int argc, char **argv) -{ - parse_args (argc,argv); - - // Pointer to the logger object that will be used. - Logger logger (hostname, max_message_size); - char *buf = new char [max_message_size]; - size_t total_bytes = 0; - size_t nbytes = 0; - - logger.start_timer (); - - // Transmit logging records until user quits. - - for (int done = 0; done == 0;) - switch (nbytes = transmit (logger, buf)) - { - case -1: - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "transmit"), -1); - /* NOTREACHED */ - case 0: - done = 1; - break; - default: - total_bytes += nbytes; - break; - } - - profile_logger::Elapsed_Time et; - - if (logger.stop_timer (et) == -1) - ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "stop timer"), -1); - - report_results (et, total_bytes); - return 0; -} diff --git a/apps/Orbix-Examples/Logger/logger.hh b/apps/Orbix-Examples/Logger/logger.hh deleted file mode 100644 index 0d0eeeca2f0..00000000000 --- a/apps/Orbix-Examples/Logger/logger.hh +++ /dev/null @@ -1,434 +0,0 @@ - -#ifndef logger_hh -#define logger_hh - -#include <CORBA.h> - -#include <string.h> - - -#ifndef _IDL_SEQUENCE_char_defined -#define _IDL_SEQUENCE_char_defined - -struct IONANC__IDL_SEQUENCE_char; -struct _IDL_SEQUENCE_char { - unsigned long _maximum; - unsigned long _length; - char *_buffer; - - operator IONANC__IDL_SEQUENCE_char(); - operator const IONANC__IDL_SEQUENCE_char() const; - _IDL_SEQUENCE_char& operator= (const IONANC__IDL_SEQUENCE_char&); - - _IDL_SEQUENCE_char& operator= (const _IDL_SEQUENCE_char&); - _IDL_SEQUENCE_char (const _IDL_SEQUENCE_char&); - - _IDL_SEQUENCE_char (unsigned long IT_size = 0); - - ~_IDL_SEQUENCE_char () { if (_buffer) delete [] _buffer; } - - char& operator [] (unsigned long IT_i) const {return _buffer[IT_i]; } - - void encodeOp (CORBA::Request &IT_r) const; - void decodeOp (CORBA::Request &IT_r); - void decodeInOutOp (CORBA::Request &IT_r); -}; - -struct IONANC__IDL_SEQUENCE_char { - unsigned long _maximum; - unsigned long _length; - char *_buffer; - - char& operator [] (unsigned long IT_i) const; - - operator _IDL_SEQUENCE_char (); - - operator const _IDL_SEQUENCE_char () const; - -}; - - - -#endif - - -#ifndef _logger_defined -#define _logger_defined -class logger_dispatch : public virtual CORBA::PPTR { -public: - - logger_dispatch (void *IT_p, CORBA::Object* IT_o, const char *IT_m, - CORBA::LoaderClass *IT_l, char *IT_i, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_l,IT_i,IT_im) {} - - - logger_dispatch (char *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - logger_dispatch () {} - - logger_dispatch (void *IT_p, CORBA::Object *IT_o, const char *IT_m, - char *IT_i, CORBA::Object* IT_ob, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_i,IT_ob,IT_im) {} - - - virtual unsigned char dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void* IT_pp=NULL); - - -}; - -class logger; - - -#ifndef loggerForwH -#define loggerForwH -CORBA::ObjectRef logger_getBase (void *); -void logger_release (void *, CORBA::Environment &IT_env=CORBA::default_environment); -logger* logger_duplicate (void *, CORBA::Environment &IT_env=CORBA::default_environment); -#endif -#define logger_IMPL "logger" - - -class logger; -#define logger_IR "logger" -#define logger_IMPL "logger" - -typedef logger* loggerRef; -typedef logger* logger_ptr; -class logger: public virtual CORBA::Object { -public: - logger (char *IT_OR); - logger () : CORBA::Object (1) {} - logger* _duplicate( - CORBA::Environment &IT_env=CORBA::default_environment) { - CORBA::Object::_duplicate (IT_env); return this; } - static logger* _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env=CORBA::default_environment); - static logger* _bind (CORBA::Environment &IT_env); - static logger* _bind (const char* IT_markerServer=NULL, const char* host=NULL, - CORBA::Environment &IT_env=CORBA::default_environment); - static logger* _narrow (CORBA::Object* , CORBA::Environment &IT_env=CORBA::default_environment); -enum Log_Priority {LM_MESSAGE,LM_DEBUG,LM_WARNING,LM_ERROR,LM_EMERG}; - -#ifndef logger_Log_Record_defined -#define logger_Log_Record_defined - -struct IONANC_Log_Record; -struct Log_Record { - logger::Log_Priority type; - long time; - long app_id; - long host_addr; - _IDL_SEQUENCE_char msg_data; - - void encodeOp (CORBA::Request &IT_r) const; - void decodeOp (CORBA::Request &IT_r); - void decodeInOutOp (CORBA::Request &IT_r); - Log_Record(const Log_Record &); - Log_Record(); - operator logger::IONANC_Log_Record(); - operator const logger::IONANC_Log_Record() const; - Log_Record& operator= (const IONANC_Log_Record&); - ~Log_Record(); - Log_Record& operator= (const Log_Record&); -}; - -struct IONANC_Log_Record { - logger::Log_Priority type; - long time; - long app_id; - long host_addr; - IONANC__IDL_SEQUENCE_char msg_data; - operator logger::Log_Record (); - operator const logger::Log_Record () const; - }; - - -#endif - - virtual void log (const logger::Log_Record& log_rec, CORBA::Environment &IT_env=CORBA::default_environment); - virtual void verbose (char verbose, CORBA::Environment &IT_env=CORBA::default_environment); - virtual char verbose (CORBA::Environment &IT_env=CORBA::default_environment); -}; - - -#define TIE_logger(X) logger##X - -#define DEF_TIE_logger(X) \ - class logger##X : public virtual logger { \ - X* m_obj; \ - public: \ - \ - logger##X (X *objp, const char* m="", CORBA::LoaderClass *l=nil)\ - : logger(), CORBA::Object (), m_obj(objp) { \ - m_pptr = new logger_dispatch \ - (( logger*)this,(CORBA::Object*)this,m,l,logger_IR,m_obj); \ - } \ - logger##X (CORBA::Object *IT_p, const char* IT_m="", void *IT_q=nil)\ - : logger(), CORBA::Object () { \ - m_pptr = new logger_dispatch \ - (( logger*)this,(CORBA::Object*)this,IT_m,logger_IR,IT_p,IT_q); \ - m_obj = (X*)(m_pptr->getImplObj ()); \ - } \ - \ - virtual ~logger##X () { \ - if (_okToDeleteImpl ()) delete m_obj; } \ - \ - virtual void* _deref () { \ - return m_obj; } \ - \ - virtual void log (const logger::Log_Record& log_rec, CORBA::Environment &IT_env) {\ -m_obj->log ( log_rec,IT_env);\ -}\ - \ -virtual void verbose (char verbose, CORBA::Environment &IT_env) {\ - m_obj->verbose(verbose,IT_env); }\ - \ -virtual char verbose (CORBA::Environment &IT_env) {\ -return m_obj->verbose(IT_env); }\ - \ - }; - - -#define QUALS_logger \ - virtual void log (const logger::Log_Record& log_rec, CORBA::Environment &IT_env) {\ -m_obj->log ( log_rec,IT_env);\ -}\ - \ -virtual void verbose (char verbose, CORBA::Environment &IT_env) {\ - m_obj->verbose(verbose,IT_env); }\ - \ -virtual char verbose (CORBA::Environment &IT_env) {\ -return m_obj->verbose(IT_env); }\ - - - - -class loggerProxyFactoryClass : public virtual CORBA::ObjectFactoryClass { -public: - loggerProxyFactoryClass (unsigned char IT_p=0) - : CORBA::ProxyFactory (logger_IR, IT_p) {} - - virtual void* New (char *IT_OR, CORBA::Environment&); - - virtual void* New2 (); - - virtual void* IT_castUp (void *IT_p, char* IT_s); - - virtual CORBA::PPTR* pptr (void *IT_p); - - virtual void baseInterfaces (_IDL_SEQUENCE_string&); - - -}; - -extern loggerProxyFactoryClass loggerProxyFactory; - - - -class loggerBOAImpl : public virtual logger { -public: - loggerBOAImpl (const char *m="", CORBA::LoaderClass *l=NULL) { - if (CORBA::PPTR::isOK (m_pptr, logger_IR)) - m_pptr = new logger_dispatch ( (logger*)this, - (CORBA::Object*)this, m, l, logger_IR, this); -} - - virtual void log (const logger::Log_Record& log_rec, CORBA::Environment &IT_env=CORBA::default_environment) =0; - virtual void verbose (char verbose, CORBA::Environment &IT_env=CORBA::default_environment)=0; - virtual char verbose (CORBA::Environment &IT_env=CORBA::default_environment)=0; -}; - - -#endif - - -#ifndef _profile_logger_defined -#define _profile_logger_defined -class profile_logger_dispatch : public virtual logger_dispatch { -public: - - profile_logger_dispatch (void *IT_p, CORBA::Object* IT_o, const char *IT_m, - CORBA::LoaderClass *IT_l, char *IT_i, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_l,IT_i,IT_im) {} - - - profile_logger_dispatch (char *IT_OR, void *IT_p, CORBA::Object *IT_o) - : CORBA::PPTR (IT_OR,IT_p,IT_o) {} - - - profile_logger_dispatch () {} - - profile_logger_dispatch (void *IT_p, CORBA::Object *IT_o, const char *IT_m, - char *IT_i, CORBA::Object* IT_ob, void* IT_im) - : CORBA::PPTR (IT_p,IT_o,IT_m,IT_i,IT_ob,IT_im) {} - - - virtual unsigned char dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void* IT_pp=NULL); - - -}; - -class profile_logger; - - -#ifndef profile_loggerForwH -#define profile_loggerForwH -CORBA::ObjectRef profile_logger_getBase (void *); -void profile_logger_release (void *, CORBA::Environment &IT_env=CORBA::default_environment); -profile_logger* profile_logger_duplicate (void *, CORBA::Environment &IT_env=CORBA::default_environment); -#endif -#define profile_logger_IMPL "profile_logger" - - -class profile_logger; -#define profile_logger_IR "profile_logger" -#define profile_logger_IMPL "profile_logger" - -typedef profile_logger* profile_loggerRef; -typedef profile_logger* profile_logger_ptr; -class profile_logger: public virtual logger { -public: - profile_logger (char *IT_OR); - profile_logger () : CORBA::Object (1) {} - profile_logger* _duplicate( - CORBA::Environment &IT_env=CORBA::default_environment) { - CORBA::Object::_duplicate (IT_env); return this; } - static profile_logger* _bind (const char* IT_markerServer, const char* host, - const CORBA::Context &IT_c, - CORBA::Environment &IT_env=CORBA::default_environment); - static profile_logger* _bind (CORBA::Environment &IT_env); - static profile_logger* _bind (const char* IT_markerServer=NULL, const char* host=NULL, - CORBA::Environment &IT_env=CORBA::default_environment); - static profile_logger* _narrow (CORBA::Object* , CORBA::Environment &IT_env=CORBA::default_environment); - -#ifndef profile_logger_Elapsed_Time_defined -#define profile_logger_Elapsed_Time_defined - -struct Elapsed_Time { - double real_time; - double user_time; - double system_time; - - void encodeOp (CORBA::Request &IT_r) const; - void decodeOp (CORBA::Request &IT_r); - void decodeInOutOp (CORBA::Request &IT_r); -}; - - -#endif - - virtual void start_timer (CORBA::Environment &IT_env=CORBA::default_environment); - virtual void stop_timer (profile_logger::Elapsed_Time& et, CORBA::Environment &IT_env=CORBA::default_environment); -}; - - -#define TIE_profile_logger(X) profile_logger##X - -#define DEF_TIE_profile_logger(X) \ - class profile_logger##X : public virtual profile_logger { \ - X* m_obj; \ - public: \ - \ - profile_logger##X (X *objp, const char* m="", CORBA::LoaderClass *l=nil)\ - : profile_logger(), CORBA::Object (), m_obj(objp) { \ - m_pptr = new profile_logger_dispatch \ - (( profile_logger*)this,(CORBA::Object*)this,m,l,profile_logger_IR,m_obj); \ - } \ - profile_logger##X (CORBA::Object *IT_p, const char* IT_m="", void *IT_q=nil)\ - : profile_logger(), CORBA::Object () { \ - m_pptr = new profile_logger_dispatch \ - (( profile_logger*)this,(CORBA::Object*)this,IT_m,profile_logger_IR,IT_p,IT_q); \ - m_obj = (X*)(m_pptr->getImplObj ()); \ - } \ - \ - virtual ~profile_logger##X () { \ - if (_okToDeleteImpl ()) delete m_obj; } \ - \ - virtual void* _deref () { \ - return m_obj; } \ - \ - virtual void log (const logger::Log_Record& log_rec, CORBA::Environment &IT_env) {\ -m_obj->log ( log_rec,IT_env);\ -}\ - \ -virtual void verbose (char verbose, CORBA::Environment &IT_env) {\ - m_obj->verbose(verbose,IT_env); }\ - \ -virtual char verbose (CORBA::Environment &IT_env) {\ -return m_obj->verbose(IT_env); }\ - virtual void start_timer (CORBA::Environment &IT_env) {\ -m_obj->start_timer (IT_env);\ -}\ - \ - virtual void stop_timer (profile_logger::Elapsed_Time& et, CORBA::Environment &IT_env) {\ -m_obj->stop_timer ( et,IT_env);\ -}\ - \ - }; - - -#define QUALS_profile_logger \ - virtual void log (const logger::Log_Record& log_rec, CORBA::Environment &IT_env) {\ -m_obj->log ( log_rec,IT_env);\ -}\ - \ -virtual void verbose (char verbose, CORBA::Environment &IT_env) {\ - m_obj->verbose(verbose,IT_env); }\ - \ -virtual char verbose (CORBA::Environment &IT_env) {\ -return m_obj->verbose(IT_env); }\ - virtual void start_timer (CORBA::Environment &IT_env) {\ -m_obj->start_timer (IT_env);\ -}\ - \ - virtual void stop_timer (profile_logger::Elapsed_Time& et, CORBA::Environment &IT_env) {\ -m_obj->stop_timer ( et,IT_env);\ -}\ - - - - -class profile_loggerProxyFactoryClass : public virtual loggerProxyFactoryClass { -public: - profile_loggerProxyFactoryClass (unsigned char IT_p=0) - : CORBA::ProxyFactory (profile_logger_IR, IT_p) {} - - virtual void* New (char *IT_OR, CORBA::Environment&); - - virtual void* New2 (); - - virtual void* IT_castUp (void *IT_p, char* IT_s); - - virtual CORBA::PPTR* pptr (void *IT_p); - - virtual void baseInterfaces (_IDL_SEQUENCE_string&); - - -}; - -extern profile_loggerProxyFactoryClass profile_loggerProxyFactory; - - - -class profile_loggerBOAImpl : public virtual profile_logger { -public: - profile_loggerBOAImpl (const char *m="", CORBA::LoaderClass *l=NULL) { - if (CORBA::PPTR::isOK (m_pptr, profile_logger_IR)) - m_pptr = new profile_logger_dispatch ( (profile_logger*)this, - (CORBA::Object*)this, m, l, profile_logger_IR, this); -} - - virtual void start_timer (CORBA::Environment &IT_env=CORBA::default_environment) =0; - virtual void stop_timer (profile_logger::Elapsed_Time& et, CORBA::Environment &IT_env=CORBA::default_environment) =0; -}; - - -#endif - - -#endif diff --git a/apps/Orbix-Examples/Logger/logger.idl b/apps/Orbix-Examples/Logger/logger.idl deleted file mode 100644 index 0fe673a84b9..00000000000 --- a/apps/Orbix-Examples/Logger/logger.idl +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- C++ -*- */ -// @(#)logger.idl 1.1 10/18/96 - -// logger.idl - -interface logger -// = TITLE -// This is the CORBA interface for the logger class. -{ - // = Types of logging messages. - enum Log_Priority - { - LM_MESSAGE, - LM_DEBUG, - LM_WARNING, - LM_ERROR, - LM_EMERG - }; - - // = Format of the logging record. - struct Log_Record - { - Log_Priority type; // Type of logging message. - long time; // Time stamp at sender. - long app_id; // Process ID of sender. - long host_addr; // IP address of the sender. - sequence<char> msg_data; // Sender-specific logging message. - }; - - oneway void log (in Log_Record log_rec); - // Transmit a Log_Record to the logging server. - - attribute char verbose; - // Toggle verbose formatting -}; - -interface profile_logger - : logger // Profile_Logger IS-A Logger -// = TITLE -// IDL Profile Logger definition that is used -// to compute statistics about the logging. -{ - // = Stores the amount of time that has elapsed. - struct Elapsed_Time - { - double real_time; - double user_time; - double system_time; - }; - - void start_timer (); - // Activate the timer. - - void stop_timer (out Elapsed_Time et); - // Deactivate the timer and return the elapsed time. -}; diff --git a/apps/Orbix-Examples/Logger/loggerS.cpp b/apps/Orbix-Examples/Logger/loggerS.cpp deleted file mode 100644 index 51d9a70fd03..00000000000 --- a/apps/Orbix-Examples/Logger/loggerS.cpp +++ /dev/null @@ -1,141 +0,0 @@ - -// $Id$ - -#include "logger.hh" - - -#define logger_dispatch_impl - -unsigned char logger_dispatch::dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void *IT_pp) { - if (!IT_pp) - IT_pp = m_obj; - const char *IT_s = IT_r.getOperation (); - if (!strcmp(IT_s,"log")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~log~+log_rec{R~logger::Log_Record~type{E~logger::Log_Priority~LM_MESSAGE,LM_DEBUG,LM_WARNING,LM_ERROR,LM_EMERG},time{l},app_id{l},host_addr{l},msg_data{S{c},0}},>{v},O{}\ -")) - return 1; - logger::Log_Record log_rec; - log_rec.decodeOp (IT_r); - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((logger*)IT_pp)->log ( log_rec, IT_env); - - IT_r.replyNoResults (CORBA::Flags(CORBA::INV_NO_RESPONSE),IT_env); - return 1; - } - - else if (!strcmp (IT_s,"_get_verbose")) { - char verbose; - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~_get_verbose~>{c},N{}\ -")) - return 1; - if (IT_f) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - verbose = ((logger*)IT_pp)->verbose(IT_env); - - if (!IT_r.isException (IT_env)) { - if (!IT_r.convertToReply ("\ -c\ -", IT_env)) return 1; - IT_r << verbose; - } - else IT_r.makeSystemException (IT_env); - - return 1; - } - else if (!strcmp (IT_s,"_set_verbose")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (IT_r.tcAssert ("\ -Ro~_set_verbose~+{c},>{v},N{}\ -")) { - char verbose; - IT_r >> verbose; - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((logger*)IT_pp)->verbose(verbose, IT_env); - } - IT_r.replyNoResults (IT_env); - return 1; - } - - else if (IT_isTarget) - IT_r.makeRuntimeException2 (); - - return 0; -} - -#define profile_logger_dispatch_impl - -unsigned char profile_logger_dispatch::dispatch (CORBA::Request &IT_r, - unsigned char IT_isTarget, void *IT_pp) { - if (!IT_pp) - IT_pp = m_obj; - const char *IT_s = IT_r.getOperation (); - if (!strcmp(IT_s,"start_timer")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~start_timer~>{v},N{}\ -")) - return 1; - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((profile_logger*)IT_pp)->start_timer (IT_env); - - IT_r.replyNoResults (IT_env); - return 1; - } - - else if (!strcmp(IT_s,"stop_timer")) { - CORBA::Environment IT_env (IT_r); - CORBA::Filter* IT_f = CORBA::Orbix.getFilter (); - if (!IT_r.tcAssert ("\ -Ro~stop_timer~-et{R~profile_logger::Elapsed_Time~real_time{d},user_time{d},system_time{d}},>{v},N{}\ -")) - return 1; - profile_logger::Elapsed_Time et; - - if (IT_f && !IT_r.isException (IT_env)) - IT_f->inRequestPostM (IT_r, IT_env); - if (!IT_r.isException (IT_env)) - ((profile_logger*)IT_pp)->stop_timer ( et, IT_env); - - - if (!IT_r.isException (IT_env)) { - if (!IT_r.convertToReply ("\ -v\ -", IT_env)) return 1; - et.encodeOp (IT_r); - } - - else IT_r.makeSystemException (IT_env); - return 1; - } - - else if (logger_dispatch::dispatch (IT_r, 0, - (logger*)((profile_logger*)IT_pp))) { - return 1; - } - - else if (IT_isTarget) - IT_r.makeRuntimeException2 (); - - return 0; -} - -#include "loggerC.cpp" - diff --git a/apps/Orbix-Examples/Logger/logger_i.cpp b/apps/Orbix-Examples/Logger/logger_i.cpp deleted file mode 100644 index 1bee6b3f7e1..00000000000 --- a/apps/Orbix-Examples/Logger/logger_i.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// Implementation of the logger object. -// $Id$ - - -#include "ace/OS.h" -#include <iostream.h> -#include "logger_i.h" - -// Select non-verbose logging by default. - -logger_i::logger_i (int verbose) - : verbose_value_ (verbose) -{ - if (ACE_OS::getenv ("NO_MESSAGES") == 0) - this->verbose_message_ = 1; - else - this->verbose_message_ = 0; -} - -// Implement the log method. - -void -logger_i::log (const logger::Log_Record &log_rec, CORBA::Environment &IT_env) -{ - if (this->verbose_value_) // If verbose mode is on - { - char *tm; - - // Convert time - if ((tm = ACE_OS::ctime (&log_rec.time)) == 0) - cerr << "ctime failed" << endl; - else - { - hostent *hp; - - /* 01234567890123456789012345 */ - /* Wed Oct 18 14:25:36 1989n0 */ - tm[24] = '@'; - cout << tm; - - // Get host name of client - - if ((hp = gethostbyaddr((char *) &log_rec.host_addr, - sizeof log_rec.host_addr, AF_INET)) == NULL) - { - cerr << "server: error in calling gethostbyaddr" << endl; - cerr << "h_errno = " << h_errno << endl; - return; - } - else // Output client hostname. - cout << hp->h_name << "@"; - - // Output PID of client - cout << log_rec.app_id << "@"; - - // Output priority - - switch (log_rec.type) - { - case logger::LM_DEBUG: - cout << "LM_DEBUG"; - break; - case logger::LM_WARNING: - cout << "LM_WARNING"; - break; - case logger::LM_ERROR: - cout << "LM_ERROR"; - break; - case logger::LM_EMERG: - cout << "LM_EMERG"; - break; - } - } - } - if (this->verbose_message_) - { - cout << "::"; - // Output message - cout.write (log_rec.msg_data._buffer, log_rec.msg_data._length) << flush; - } -} - -// Enable/disable verbosity. - -void -logger_i::verbose (char verbose, CORBA::Environment &IT_env) -{ - this->verbose_value_ = verbose; -} - -// Report current verbosity level. - -char -logger_i::verbose (CORBA::Environment &IT_env) -{ - return this->verbose_value_; -} - -// Profile_Logger_i - -void -profile_logger_i::start_timer (CORBA::Environment &IT_env) -{ - this->pt_.start (); -} - -void -profile_logger_i::stop_timer (profile_logger::Elapsed_Time& et, - CORBA::Environment &IT_env) -{ - this->pt_.stop (); - - ACE_Profile_Timer::ACE_Elapsed_Time e; - - this->pt_.elapsed_time (e); - - et.real_time = e.real_time; - et.user_time = e.user_time; - et.system_time = e.system_time; -} diff --git a/apps/Orbix-Examples/Logger/logger_i.h b/apps/Orbix-Examples/Logger/logger_i.h deleted file mode 100644 index 40d7b77c6bf..00000000000 --- a/apps/Orbix-Examples/Logger/logger_i.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - - -#include "ace/Profile_Timer.h" -#define EXCEPTIONS -#include "logger.hh" - -class logger_i -#if defined (USE_BOA_IMPL) - : virtual public loggerBOAImpl -#endif /* USE_BOA_IMPL */ - // = TITLE - // Implementation of the logger interface. - // - // = DESCRIPTION - // Uses either the BOAImpl or the DEF_TIE approach, - // depending on the #ifdef -{ -public: - logger_i (int verbose = 0); - // Select non-verbose logging by default. - - virtual void log (const logger::Log_Record &log_rec, CORBA::Environment &IT_env); - // Implement the log method. - - virtual void verbose (char verbose, CORBA::Environment &IT_env); - // Enable/disable verbosity. - - virtual char verbose (CORBA::Environment &IT_env); - // Report current verbosity level. - -private: - unsigned char verbose_value_; - // Indicate if we are using verbose logging or not. - - unsigned char verbose_message_; - // Indicate if we outputting the messages (turn off if you - // want to conduct timing tests that just measure throughput). -}; - -class profile_logger_i : -#if defined (USE_BOA_IMPL) - public virtual profile_loggerBOAImpl, - public virtual Logger_i -#else /* USE_TIE */ - public logger_i -#endif /* USE_BOA_IMPL */ - // = TITLE - // Implementation of the profiler logger interface. - // - // = DESCRIPTION - // Uses the BOAImpl approach. -{ -public: - virtual void start_timer (CORBA::Environment &env); - // Activate the timer. - - virtual void stop_timer (profile_logger::Elapsed_Time &et, - CORBA::Environment &env); - // Deactivate the timer and return the elapsed time. - -private: - ACE_Profile_Timer pt_; - // Object that keeps track of the user and system execution time. -}; - -#if !defined (USE_BOA_IMPL) -// Indicate that the C++ classes logger_i and profile_logger_i implement -// the IDL interface logger and profile_logger, respectively: - -DEF_TIE_logger (logger_i) -DEF_TIE_profile_logger (profile_logger_i) - -#endif /* USE_BOA_IMPL */ diff --git a/apps/Orbix-Examples/Logger/server.cpp b/apps/Orbix-Examples/Logger/server.cpp deleted file mode 100644 index 0e9339a7028..00000000000 --- a/apps/Orbix-Examples/Logger/server.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// server.C -// $Id$ - - -// The server for the logger example. -// This uses the TRY,CATCHANY,ENDTRY macros for error testing. - -// The executable file generated from this code should be registered -// (under the name 'logger') using the 'putit' command. - -#include <iostream.h> -#include "logger_i.h" - -int -main (int, char *[]) -{ - // Tell the server not to hang up while clients are connected. - CORBA::Orbix.setNoHangup (1); - - // create a logger object - using the implementation class logger_i -#if defined (USE_BOA_IMPL) - profile_logger_i profile_logger; -#else - TIE_profile_logger (profile_logger_i) profile_logger (new profile_logger_i); -#endif /* USE_BOA_IMPL */ - - TRY { - // tell Orbix that we have completed the server's initialisation: - CORBA::Orbix.impl_is_ready (profile_logger_IMPL, IT_X); - } CATCHANY { - // an error occured calling impl_is_ready () - output the error. - cout << IT_X << endl; - } ENDTRY; - - // impl_is_ready() returns only when Orbix times-out an idle server - // (or an error occurs). - cerr << "server exiting" << endl; - - return 0; -} diff --git a/apps/Orbix-Examples/Makefile b/apps/Orbix-Examples/Makefile deleted file mode 100644 index 723a4dce7c3..00000000000 --- a/apps/Orbix-Examples/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Orbix applications -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -INFO = README - -DIRS = Event_Comm \ - Logger - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nolocal.GNU - diff --git a/apps/README b/apps/README deleted file mode 100644 index 348bf472216..00000000000 --- a/apps/README +++ /dev/null @@ -1,19 +0,0 @@ -The subdirectories in this directory provide a number of complete -applications that utilize the ACE features. - - . Gateway -- Implements a connection-oriented application-level - gateway that uses source-based and destination-based routing - of messages between peers connected via TCP/IP networks. - - . Orbix-Examples -- Implements several applications that - integrate ACE and Orbix (which is IONA's implementation of - CORBA). - - . Synch-Benchmarks -- Implements a number of benchmarks - that test the performance of various synchronization - mechanisms. - - . TTCP -- Implements several variants of the TTCP benchmarking - test for TCP and UCP using C sockets, ACE C++ wrappers, and - several versions of CORBA (Orbix and ORBeline). - diff --git a/apps/gperf/COPYING b/apps/gperf/COPYING deleted file mode 100644 index 9a170375811..00000000000 --- a/apps/gperf/COPYING +++ /dev/null @@ -1,249 +0,0 @@ - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 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 license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our 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. The -General Public License applies to the Free Software Foundation's -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, 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 a 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 tell them 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. - - 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 Agreement 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 work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 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 -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual 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 General - Public License. - - d) 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. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 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 - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying 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. - - 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. - - 7. 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 the 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 -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. 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 - - 9. 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. - - 10. 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 humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, 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) 19xx 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 a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision' (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/apps/gperf/ChangeLog b/apps/gperf/ChangeLog deleted file mode 100644 index d0e86c82103..00000000000 --- a/apps/gperf/ChangeLog +++ /dev/null @@ -1,1335 +0,0 @@ -Sun Apr 14 14:31:10 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) - - * src: Changed things so that there's no longer any use of the - Read_Line and Std_Err code. All of this has been pushed into - the ACE components, which is where it belongs... - - * src: Changed things so that there's no longer any use of the - pointless inheritance in the code. This was a result of my not - understanding inheritance back in 1989... ;-) - - * Began to integrate GNU gperf into the ACE release. Started off - by bringing the standard GNU version up to date wrt to the - changes I made back in 1991! - -Tue Oct 10 16:37:28 1995 Mike Stump <mrs@cygnus.com> - - * src/new.cc: Since malloc/delete are not paired, we cannot call - free. - -Wed Jan 4 12:40:14 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * src/Makefile.in ($(TARGETPROG)): Link with $(LDFLAGS). - Patch from John Interrante <interran@uluru.stanford.edu>. - -Sat Nov 5 19:12:48 1994 Jason Merrill (jason@phydeaux.cygnus.com) - - * src/Makefile.in (LIBS): Remove. - -Tue Oct 18 17:51:14 1994 Per Bothner <bothner@kalessin.cygnus.com> - - * src/std-err.cc: Use stderror, instead of the non-standard - sys_nerr and sys_errlist. - -Sat Sep 17 22:02:13 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * src/key-list.cc (output_hash_function): - Patch from William Bader <wbader@CSEE.Lehigh.Edu>. - -Fri Jul 15 09:38:11 1994 Per Bothner (bothner@cygnus.com) - - * src/std-err.cc: #include <errno.h>, and only declare - extern int errno if errno is not a macro. - -Mon May 30 17:29:34 1994 Per Bothner (bothner@kalessin.cygnus.com) - - * Makefile.in (src_all, install): Make sure to add '/' after - `pwd` in $rootme, as expected by FLAGS_TO_PASS. - -Wed May 11 00:47:22 1994 Jason Merrill (jason@deneb.cygnus.com) - - Make libg++ build with gcc -ansi -pedantic-errors - * src/options.h: Lose commas at end of enumerator lists. - -Sun Dec 5 19:16:40 1993 Brendan Kehoe (brendan@lisa.cygnus.com) - - * src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an - argument to fprintf, since it's not expecting one. - -Fri Nov 26 19:03:18 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * src/list-node.cc: #undef index, for the sake of broken NeXT, - -Thu Nov 4 11:16:03 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * Makefile.in (install): Use INSTALL_DATA for gperf.1. - -Mon Oct 25 18:40:51 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * src/key-list.cc (Key_List::read_keys): Use POW macro - to increase hash table size to power of 2. - - * options.h (LARGE_STACK_ARRAYS): New flag. Defaults to zero. - * gen-perf.cc, key-list.cc, read-line.cc: - Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set. - * main.cc (main): Only call setrlimit (RLIMIT_STACK, ...) - if LARGE_STACK_ARRAYS. - -Mon Oct 4 17:45:08 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * src/gen-perf.cc: Always use ANSI rand/srand instead of BSDisms. - -Wed Aug 18 12:19:53 1993 Per Bothner (bothner@kalessin.cygnus.com) - - * Makefile.in (src_all): Make less verbose output. - -Fri May 28 14:01:18 1993 Per Bothner (bothner@rtl.cygnus.com) - - * src/gen-perf.cc (Gen_Perf::change): Don't use gcc-specific - 2-operand conditional expression. - * src/key-list.cc (Key_List::output_lookup_array): - Don't use variable-size stack arrays, unless compiled by g++. - -Tue May 4 14:08:44 1993 Per Bothner (bothner@cygnus.com) - - Changes (mostly from Peter Schauer) to permit compilation - using cfront 3.0 and otherwise be ARM-conforming. - * src/key-list.h: class Key_List must use public derivation - of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc - calls Std_Err::report_error). - * src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc - (Hash_Table::operator()): Don't use gcc-specific 2-operand - conditional expression. - * src/iterator.cc (Iterator::operator()): Don't use gcc-specific - range construct in case label. - * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys), - src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc - (Read_Line::readln_aux): If not gcc, don't allocate - variable-sized arrays on stack. - * src/new.cc (operator new): Argument type should be size_t. - * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys), - new/cc (::operator new): Don't use non-standard >?= operator. - -Tue Apr 27 20:11:30 1993 Per Bothner (bothner@cygnus.com) - - * src/Makefile.in: Define TARGETPROG, and use it. - -Mon Apr 19 00:29:18 1993 Per Bothner (bothner@cygnus.com) - - * Makefile.in, configure.in: Re-vamped configure scheme. - * gperf.texinfo: Renamed to gperf.texi. - * src/bool-array.{h,cc}: ANSIfy bzero->memset. - -Sat Jan 30 20:21:28 1993 Brendan Kehoe (brendan@lisa.cygnus.com) - - * tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out, - pout, and preout. - -Tue Dec 29 08:58:17 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make. - (FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM. - -Mon Dec 21 18:46:46 1992 Per Bothner (bothner@rtl.cygnus.com) - - * tests/expected.* renamed to *.exp to fit in 14 chars. - * tests/Makefile.in: Update accordingly. - Also rename output.* to *.out. - * src/Makefile.in (clean): Remove gperf program. - -Wed Dec 9 14:33:34 1992 Per Bothner (bothner@cygnus.com) - - * src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset. - -Thu Dec 3 19:34:12 1992 Per Bothner (bothner@cygnus.com) - - * Makefile.in (distclean, realclean): Don't delete - Makefile before recursing. - -Fri Nov 6 13:41:49 1992 Per Bothner (bothner@rtl.cygnus.com) - - * key-list.{h,cc}: Remove MAX_INT (and similar) constant - fields from Key_List class, and use INT_MAX (etc) from limits.h. - * key-list.{h,cc}, options.{h,cc}, vectors.h: Removed all - uses of initialized const fields, as they are non-standard - - and their use was easy to do away with. Mostly, just - made the constants static non-fields in the .cc file. - -Mon Nov 2 13:10:11 1992 Per Bothner (bothner@cygnus.com) - - * tests/Makefile.in: When generating cinset.c, don't pass -C, - since -C assumes an ANSI compiler. Add the -C flag (with -a) - when generating test.out.3 instead. - * tests/expected.out.3: Update accordingly. - -Wed Aug 12 11:47:54 1992 Per Bothner (bothner@cygnus.com) - - * Makefile.in: Factor out common flags into $(FLAGS_TO_PASS). - * Makefile.in: 'install-info' depends on gperf.info. - -Mon Aug 10 11:39:52 1992 Ian Lance Taylor (ian@dumbest.cygnus.com) - - * Makefile.in, src/Makefile.in: always create installation - directories. - -Mon Jul 20 15:33:21 1992 Mike Stump (mrs@cygnus.com) - - * src/new.cc (operator new): Add cast from void * to char *, - since it is not a standard conversion. - -Wed Jun 17 16:25:30 1992 Per Bothner (bothner@rtl.cygnus.com) - - * src/gen-perf.cc: #include <_G_config.h> for _G_SYSV. - * src/key-list.cc: alloca() hair. - * src/main.cc (main): Only call getrlimit if _G_HAVE_SYS_RESOURCE. - * Makefile,in, {src,test}/Makefile.in: Fix *clean rules. - -Fri May 29 13:21:13 1992 Per Bothner (bothner@rtl.cygnus.com) - - * src/gen-perf.cc: Replace USG -> _G_SYSV. - -Thu May 14 13:58:36 1992 Per Bothner (bothner@rtl.cygnus.com) - - * src/Makefile.in: Don't pass obsolete flag -DUNLIMIT_STACK. - * tests/Makefile.in (clean): Fix. - -Sat Mar 7 00:03:56 1992 K. Richard Pixley (rich@rtl.cygnus.com) - - * gperf.texinfo: added menu item hook. - -Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) - - * Makefile.in, configure.in: removed traces of namesubdir, - -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced - copyrights to '92, changed some from Cygnus to FSF. - -Sun Jan 26 19:21:58 1992 Per Bothner (bothner at cygnus.com) - - * tests/Makefile.in: Use re-directed stdin instead of file - name in argv. This allows us to remove the filename - from the output, the expected output, and hence the diffs. - (Note that the input file is in $(srcdir), which we cannot - place in the expected out files.) - * tests/expected.out.[1235]: Edit out input filename, - to match new output. - -Mon Nov 4 15:04:41 1991 Douglas C. Schmidt (schmidt at bastille.ics.uci.edu) - - * Need to do something about the end-of-line marker being - hard-coded to '\n'... - - * Need to do something about the comment character being - hard-coded to '#'... - -Fri Sep 27 09:30:15 1991 Douglas C. Schmidt (schmidt at net4.ics.uci.edu) - - * Fixed a stupid problem with printout out a local enum with the - -E option (I forgot to check for the case of 0 duplicates, so it - was saying 1 duplicate instead!). - -Mon Aug 19 00:39:40 1991 Douglas C. Schmidt (schmidt at javel.ics.uci.edu) - - * Yow, all finished making gperf run with cfront/Saber C++. Not - really all that hard, actually, though did need to remove some - GNU specific hacks, like dynamically sized arrays and - initializing class data members in their declarations, etc. - - * Bumped up the version # to reflect the recent changes. - -Sun Aug 18 22:25:32 1991 Douglas C. Schmidt (schmidt at javel.ics.uci.edu) - - * Changed passage of Options::usage function in Options.C to have - a leading `&' so that Saber C++ wouldn't complain... - - * Added a new header file called gperf.h that includes system-wide - info. - - * Hacked up the release to work with Saber C++! Changed all *.cc - files to *.C. - -Mon Aug 5 21:18:47 1991 Douglas C. Schmidt (schmidt at net1.ics.uci.edu) - - * Yow, hacked in the nifty changes to the Std_Err error handling - abstraction. This now adds format string support for printing - out signals and the name of the function when things go wrong. - Make changes throughout the source to make use of the new - facilities and also to make sure all previous uses of - Std_Err::report_error are now prefixed by the name of the class. - -Tue Jul 30 00:02:39 1991 Douglas C. Schmidt (schmidt at net4.ics.uci.edu) - - * Make sure to add 1 to the Key_List::total_duplicates value when - printing it out since any time we have more than zero duplicates - we really have two or more duplicates! - - * Added support for the -O (optimize option). This option - optimizes the generated lookup function by assuming that all - input keywords are members of the keyset from the keyfile. - - * Added #define DUPLICATES and #define HASH_VALUE_RANGE (and of - course the enum equivalent) to the generated output. Don't know - how useful this will be, but it allows us to determine at a - glance whether we've got a minimal perfect hash function (in - which case TOTAL_KEYWORDS = HASH_VALUE_RANGE, and DUPLICATES = - 0). - - * Fixed a small bug in the Key_List::output_keyword_table routine - that caused an extra newline to be printed if there where no - leading blank entries... (who cares, right?!) - -Mon Jul 29 22:05:40 1991 Douglas C. Schmidt (schmidt at net4.ics.uci.edu) - - * Modified the handling of the -E (emit enums rather than - #defines) option in conjunction with the -G option. Now, if -G - and -E are given the enums are generated outside the lookup - function, rather than within it! - - * Yow, as part of my Software Practice and Experience submission - writeup I realized I needed to make the # comment character work - correctly. Now if you put a backslash character ('\') in front - of the # it treats the first character as a #. Naturally, to - put a '\' character on the front of the line you need to escape - it also, i.e., - \\I'm a line that starts with only one \ - # I'm a comment line - \#define I'm walking a fine line... ;-) - -Wed Jun 26 11:21:02 1991 Douglas C. Schmidt (schmidt at bastille.ics.uci.edu) - - * Changed all uses of the identifier `iteration_number' to - `generation_number' (also updated the paper!). - -Tue Apr 9 07:59:42 1991 Doug Schmidt (schmidt at net4.ics.uci.edu) - - * Had to change a whole bunch of little thangs in key-list.cc and - list-node.cc to make the -I option work. - - * Changed an alloca statement in key-list.cc to reflect the - strncasecmp modification (i.e., we now need to be able to - allocate a longer buffer if the -I option is used). - -Mon Apr 8 18:17:04 1991 Doug Schmidt (schmidt at net4.ics.uci.edu) - - * Yucko, there was a bug in the handling of -c (and of course the - new -I command in key-list.cc). Apparently when I added the - super-duper hack that provided support for duplicate keys I - forgot to update the strcmp output... - - * Boy, it has been a *long* time since I hacked this puppy. Let's - see, I'm about to add long-overdue support for case-insensitive - string comparisons to gperf's generated output code. We are - going to employ the hitherto unused option -I to indicte this! - -Thu Jun 28 16:17:27 1990 Doug Schmidt (schmidt at brilliant) - - * Wow, first fix on the new job! There was a dumb error - in Key_List::output_lookup_function, where I printed the - string "&wordlist[key]" instead of the correct "&wordlist[index]". - - * Added a couple of #ifdefs for USG support. - -Sun Jun 3 17:16:36 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Updated the version number to 2.5 and sent to Doug Lea for release - with the latest GNU libg++. - - * Changed the error handling when a keyword file cannot be opened - (now calls perror). - -Wed May 30 14:49:40 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Instrumented the source code with trace statements automagically - inserted using my new automated trace instrumentation tool! - -Wed May 9 11:47:41 1990 Doug Schmidt (schmidt at siam.ics.uci.edu) - - * Really fixed the previous bug. Turns out that a small amount - of logic had to be duplicated to handle static links that occur - as part of dynamic link chains. What a pain!!! - -Tue May 8 23:11:44 1990 Doug Schmidt (schmidt at siam.ics.uci.edu) - - * Fixed a stupid bug in Key_List::output_lookup_array that was - causing incorrect counts to be generated when there were both - static and dynamic links occurring for the same hash value. - Also simplified the code that performs the logic in this routine. - -Mon Apr 30 17:37:24 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Fixed stupid bug in Key_List::output_lookup_array that was - making the generated lookup[] array contain `chars' even - when the values stored in the chars are greater than 127! - - * Changed the behavior of the -G (global table) option so that it - will output the `length[]' array in the global scope along with - the `word_list[]' array. - - * Fixed a stupid bug in Key_List::output_lookup_function that - would always output the complicated `duplicate-handling' lookup - logic, even when there were no duplicates in the input! - - * Yikes, had to modify a bunch of stuff in key-list.cc to correctly - handle duplicate entries. Changed the generated code so that - the MIN_HASH_VALUE is no longer subtracted off when calculating - the hash value for a keyword. This required changing some other - code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places. - Finally, this means that the generated tables may contain leading - null entries, but I suppose it is better to trade-off space to get - faster performance... - -Mon Mar 26 13:08:43 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Updated version number to 2.4 to reflect the latest changes. - - * Changed the main program so that it always prints out gperf's - execution timings to the generated output file. - -Sun Mar 25 12:39:30 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Added the -Z option so that users can specify the name of the - generated class explicitly. Updated documentation to reflect - this change. - - * Modified the generated C++ class interface so that the functions - are declared static (to remove the overhead of passing the `this' - pointer). This means that operator()() can no longer be used, - since it only works on non-static member functions. - Also changed things so that there is no constructor (why waste - the extra call, when it doesn't do anything, eh?) - - * Modified the behavior of Key_List::output when the -L C++ option - is enabled. Previously the code generated use const data members - to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc. However, as - pointed out by James Clark this may result in suboptimal behavior - on the part of C++ compilers that can't inline these values. - Therefore, the new behavior is identical to what happens with - -L C, i.e., either #defines or function-specific enums are used. - Why sacrifice speed for some abstract notion of `code purity?' ;-) - -Tue Mar 6 18:17:42 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Added the -E option that defines constant values using an enum - local to the lookup function rather than with #defines. This - also means that different lookup functions can reside in the - same file. Thanks to James Clark (jjc@ai.mit.edu). - -Sat Mar 3 20:19:00 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Added a special case to key_list::output_switch that doesn't - generate extra comparisons when the `-S' is given an argument - of 1 (the normal case). This should speed up the generated - code output a tad... - -Fri Feb 23 14:21:28 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Renamed all instances of member function get_keysig_size - to get_max_keysig_size, since this is more precise... - - * Changed all occurrences of charset to keysig (stands for ``key - signature'') to reflect the new naming convention used in the - USENIX paper. - -Thu Feb 22 11:28:36 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Changed the name of the generated associated values table from - asso_value to asso_values to reflect conventions in the USENIX - C++ paper. - -Thu Feb 15 23:29:03 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Updated the gperf.texinfo file to fix some formatting problems - that had crept in since last time. - -Wed Feb 14 23:27:24 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Fixed stupid bug in key-list.cc (get_special_input), wher - gperf replaced each '%' with the succeeding character. - - * Added support for multiple target language generation. Currently - handled languages are C and C++, with C as the default. Updated - documentation and option handler to reflect the changes. - - * Added a global destructor to new.cc and removed the #ifdef, since - the bloody thing now works with libg++. - -Mon Feb 14 13:00:00 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Found out that my gperf paper was accepted at the upcoming - USENIX C++ Conference in San Francisco. Yow! - -Tue Jan 30 09:00:29 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * #ifdef'd out the new.cc memory allocator, since there are - problems with this and the libg++ stuff. - - * Changed key-list.h so that class Vectors is a public (rather - than private) base class for class Key_List. The previous - form was illegal C++, but wasn't being caught by the old - g++ compiler. Should work now... ;-) - -Sun Dec 10 14:08:23 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added several changes from rfg@ics.uci.edu. These changes - help to automate the build process. - -Wed Nov 15 15:49:33 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Removed conditional compilation for GATHER_STATISTICS. There's - really no good reason to avoid collecting this info at run-time, - since that section of code is *hardly* the bottleneck... ;-) - - * Simplified the C output routines in Key_List::set_output_types - and Key_List::output_keyword_table a bit in order to - speed-up and clean up the code generation. - - * Modified function Key_List::get_special_input so that it does - not try to `delete' a buffer that turned out to be too short. - This is important since the new memory management scheme - does not handle deletions. However, adding a small amount of - garbage won't hurt anything, since we generally don't do this - operation more than a couple times *at most*! - - * Created a new file (new.cc) which includes my own overloaded - operator new. This function should dramatically reduce the - number of calls to malloc since it grabs large chunks and - doles them out in small pieces. As a result of this change - the class-specific `operator new' was removed from class List_Node. - -Tue Nov 14 21:45:30 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Continued to refine the great hack. The latest trick is to - try and replace most uses of dynamic memory (i.e., calls to - new) with uses of gcc dynamic arrays (i.e., an alloca solution). - This makes life much easier for the overall process-size, since - it reduces the amount of overhead for memory management. As a - side-effect from this change there is no reason to have the - Bool_Array::dispose member function, so it's outta here! - - * Fixed a stupid bug that was an disaster waiting to happen... - Instead of making the boolean array large enough to index - max_hash_value it was only large enough to index max_hash_value - - 1. Once again, an off-by-one mistake in C/C++!!!! - -Mon Nov 13 19:38:27 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added the final great hack! This allows us to generate hash tables - for near-perfect hash functions that contain duplicates, *without* - having to use switch statements! Since many compilers die on large - switch statements this feature is essential. Furthermore, it appears - that the generated code is often *smaller* than that put out by - compilers, even though a large, sparse array must be created. - Here's the general idea: - - a. Generate the wordlist as a contiguous block of keywords, - just as before when using a switch statement. This - wordlist *must* be sorted by hash value. - - b. Generate the lookup array, which is an array of signed - {chars,shorts,ints}, (which ever allows full coverage of - the wordlist dimensions). If the value v, where v = - lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we - simply use this result as a direct access into the wordlist - array to snag the keyword for comparison. - - c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS - this is an indication that we'll need to search through - some number of duplicates hash values. Using a hash - linking scheme we'd then index into a different part of - the hash table that provides the starting index and total - length of the duplicate entries to find via linear search! - -Sun Nov 12 13:48:10 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Simplified Key_List::output_min_max considerably by recognizing - that since the keyword list was already sorted by hash value finding - the min and max values is trivial! - - * Improved the debugging diagnostics considerably in classes Key_List, - Hash_Table, and Gen_Perf. - - * Modified the `-s' option so that a negative argument is now - interpreted to mean `allow the maximum associated value to be - about x times *smaller* than the number of input keys.' This - should help prevent massive explosion of generated hash table - size for large keysets. - -Sat Nov 11 11:31:13 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added a field in class Key_List that counts the total number - of duplicate keywords, both static and dynamic. - - * Added a new member function Bool_Array that deletes the dynamic - memory allocated to Bool_Array::storage_array. This space may - be needed for subsequent options, so it made sense to free it as - soon as possible... - - * Renamed file/class Alpha_Vectors to Vectors, to avoid problems - with 14 character length filenames on SYSV. Also changed file - adapredefined.gperf to adadefs.gperf in the ./tests directory. - - * Modified class Options by changing the member function - Options::total_positions to Options::get_charset_size and - Options::set_charset_size. These two routines now either return - the total charset size *or* the length of the largest keyword - if the user specifies the -k'*' (ALLCHARS) option. This change - cleans up client code. - - * Merged all the cperf changes into gperf. - - * Made sure to explicitly initialize perfect.fewest_collisions to - 0. - - * Cleaned up some loose ends noticed by Nels Olson. - 1. Removed `if (collisions <= perfect.fewest_collisions)' - from Gen_Perf::affects_prev since it was superfluous. - 2. Removed the fields best_char_value and best_asso_value - from Gen_Perf. There were also unnecessary. - 3. Fixed a braino in the Bool_Array::bool_array_reset - function. Since iteration numbers can never be zero - the `if (bool_array.iteration_number++ == 0)' must be - `if (++bool_array.iteration_number == 0).' - 4. Modified Std_Err::report_error so that it correctly handles - "%%". - - * It is important to note that -D no longer enables -S. - There is a good reason for this change, which will become - manifested in the next release... (suspense!). - - * Made some subtle changes to Key_List::print_switch so that if finally - seems to work correctly. Needs more stress testing, however... - - * Made a major change to the Key_List::print_switch function. - The user can now specify the number of switch statements to generate - via an argument to the -S option, i.e., -S1 means `generate 1 - switch statement with all keywords in it,' -S2 means generate - 2 switch statements with 1/2 the elements in each one, etc. - Hopefully this will fix the problem with C compilers not being - able to generate code for giant switch statements (but don't - hold your breath!) - - * Changed Key_List::length function to Key_List::keyword_list_length. - - * Added a feature to main.c that prints out the starting wall-clock - time before the program begins and prints out the ending wall-clock - time when the program is finished. - - * Added the GATHER_STATISTICS code in hash-table.c so we can - keep track of how well double hashing is doing. Eventually, - GATHER_STATISTICS will be added so that all instrumentation - code can be conditionally compiled in. - - * Fixed a stupid bug in Key_List::print_switch routine. This - was necessary to make sure the generated switch statement worked - correctly when *both* `natural,' i.e., static links and dynamic - links, i.e., unresolved duplicates, hash to the same value. - - * Modified Bool_Array::~Bool_Array destructor so that - it now frees the bool_array.storage_array when it is no longer - needed. Since this array is generally very large it makes sense - to return the memory to the freelist when it is no longer in use. - - * Changed the interface to constructor Hash_Table::Hash_Table. This - constructor now passed a pointer to a power-of-two sized buffer that - serve as storage for the hash table. Although this weakens information - hiding a little bit it greatly reduces dynamic memory fragmentation, - since we can now obtain the memory via a call to alloca, rather - than malloc. This change modified Key_List::read_keys calling - interface. - - * Since alloca is now being used more aggressively a conditional - compilation section was added in main.c. Taken from GNU GCC, - this code gets rid of any avoidable limit on stack size so that - alloca does not fail. It is only used if the -DRLIMIT_STACK - symbol is defined when gperf is compiled. - - * Added warnings in option.c so that user's would be informed - that -r superceeds -i on the command-line. - - * Rewrote Gen_Perf::affects_prev. First, the code structure - was cleaned up considerably (removing the need for a dreaded - goto!). Secondly, a major change occurred so that Gen_Perf::affects_prev - returns FALSE (success) when fewest_hits gets down to whatever - it was after inserting the previous key (instead of waiting for - it to reach 0). In other words, it stops trying if it can - resolve the new collisions added by a key, even if there are - still other old, unresolved collisions. This modification was - suggested by Nels Olson and seems to *greatly* increase the - speed of gperf for large keyfiles. Thanks Nels! - - * In a similar vein, inside the Gen_Perf::change routine - the variable `perfect.fewest_collisions is no longer initialized - with the length of the keyword list. Instead it starts out at - 0 and is incremented by 1 every time change () is called. - The rationale for this behavior is that there are times when a - collision causes the number of duplicates (collisions) to - increase by a large amount when it would presumably just have - gone up by 1 if none of the asso_values were changed. That is, - at the beginning of change(), you could initialize fewest_hits - to 1+(previous value of fewest_hits) instead of to the number of - keys. Thanks again, Nels. - - * Replaced alloca with new in the Gen_Perf::change function. - This should eliminate some overhead at the expense of a little - extra memory that is never reclaimed. - - * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union - to reflect the change in behavior. - - * Added the -e option so users can supply a string containing - the characters used to separate keywords from their attributes. - The default behavior is ",\n". - - * Removed the char *uniq_set field from LIST_NODE and modified - uses of uniq_set in perfect.c and keylist.c. Due to changes - to Gen_Perf::compute_disjoint_sets this field was no longer - necessary, and its removal makes the program smaller and - potentially faster. - - * Added lots of changes/fixes suggested by Nels Olson - (umls.UUCP!olson@mis.ucsf.edu). In particular: - 1. Changed Bool_Array so that it would dynamically create - an array of unsigned shorts rather than ints if the - LO_CAL symbol was defined during program compilation. - This cuts the amount of dynamic memory usage in half, - which is important for large keyfile input. - 2. Added some additional debugging statements that print extra - info to stderr when the -d option is enabled. - 3. Fixed a really stupid bug in Key_List::print_switch - A right paren was placed at the wrong location, which broke - strlen (). - 4. Fixed a subtle problem with printing case values when keylinks - appear. The logic failed to account for the fact that there - can be keylinks *and* regular node info also! - 5. Changed the behavior of Key_List::read_keys so that it would - honor -D unequivocally, i.e., it doesn't try to turn off dup - handling if the user requests it, even if there are no - immediate links in the keyfile input. - 6. Modified the -j option so that -j 0 means `try random values - when searching for a way to resolve collisions.' - 7. Added a field `num_done' to the Gen_Perf struct. This is used - to report information collected when trying to resolve - hash collisions. - 8. Modified the merge_sets algorithm to perform a disjoint - union of two multisets. This ensures that subsequent - processing in Gen_Perf::affect_prev doesn't - waste time trying to change an associated value that is - shared between two conflicting keywords. - 9. Modified Gen_Perf::affects_prev so that it doesn't try - random jump values unless the -j 0 option is enabled. - 10. Fixed a silly bug in Gen_Perf::change. This problem caused - gperf to seg fault when the -k* option was given and the - keyfile file had long keywords. - -Sun Oct 29 00:18:55 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) - - * Modified class-specific new operations for Read_Line and - List_Node so they don't fail if SIZE is larger than twice - the previous buffer size. Note we double buffer size - everytime the previous buffer runs out, as a heuristic - to reduce future calls to malloc. - -Sun Oct 22 13:49:43 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Updated gperf version number to 2.0. Send to Doug Lea for - incorporation into the long-awaited `official' libg++ 1.36 - release! - - * Thanks to Nels Olson a silly bug in Gen_Perf::change () - was fixed. This problem caused gperf to seg fault when - the -k* option was given and the keyfile file had long - keywords. - - * Modified Key_List::print_hash_function so that it output - max_hash_value + 1 (rather than just max_hash_value) for - any associated value entries that don't correspond to - keyword charset characters. This should speed up rejection - of non-keyword strings a little in some cases. - -Sat Oct 21 19:28:36 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Fixed Key_List::print_hash_function so that it no longer output - things like `return 0 + ...' Although this probably gets - optimized away by even the worst C compilers there isn't any - point tempting fate... ;-) - - * Fixed class List_Node's constructor so that it wouldn't a priori - refuse to consider trying to hash keys whose length is less - than the smallest user-specified key position. It turns out - this is not a problem unless the user also specifies the -n - (NOLENGTH) option, in which case such keys most likely - don't have a prayer of being hashed correctly! - - * Changed the name of the generated lookup table from `Hash_Table' - to `asso_value' to be consistent with the gperf paper. - -Tue Oct 17 14:19:48 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added a flag GATHER_STATISTICS in the Makefile. If defined - during compilation this turns on certain collection facilities - that track the performance of gperf during its execution. In - particular, I want to see how many collisions occur for the - double hashing Hash_Table. - - * Added a safety check so that we don't screw up if the total - number of `resets' of the Bool_Array exceeds MAX_INT. Since - this number is around 2^31 it is unlikely that this would ever - occur for most input, but why take the risk? - - * Changed the behavior for the -a (ANSI) option so that the - generated prototypes use int rather than size_t for the LEN - parameter. It was too ugly having to #include <stddef.h> all - over the place... - -Mon Oct 16 11:00:35 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Continued to work on the gperf paper for the USENIX C++ - conference. At some point this will be merged back into - the gperf documentation... - -Sat Oct 14 20:29:43 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) - - * Added a majorly neat hack to Bool_Array, suggested by rfg. - The basic idea was to throw away the Ullman array technique. - The Ullman array was used to remove the need to reinitialize all - the Bool_Array elements to zero everytime we needed to determine - whether there were duplicate hash values in the keyword list. - The current trick uses an `iteration number' scheme, which takes - about 1/3 the space and reduces the overall program running a - time by about 20 percent for large input! The hack works as - follows: - - 1. Dynamically allocation 1 boolean array of size k. - 2. Initialize the boolean array to zeros, and consider the first - iteration to be iteration 1. - 2. Then on all subsequent iterations we `reset' the bool array by - kicking the iteration count by 1. - 3. When it comes time to check whether a hash value is currently - in the boolean array we simply check its index location. If - the value stored there is *not* equal to the current iteration - number then the item is clearly *not* in the set. In that - case we assign the iteration number to that array's index - location for future reference. Otherwise, if the item at - the index location *is* equal to the iteration number we've - found a duplicate. No muss, no fuss! - -Mon Oct 2 12:30:54 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Changed some consts in options.h to enumerals, since g++ - doesn't seem to like them at the moment! - -Sat Sep 30 12:55:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Fixed a stupid bug in Key_List::print_hash_function that manifested - itself if the `-k$' option was given (i.e., only use the key[length] - character in the hash function). - - * Added support for the -C option. This makes the contents of - all generated tables `readonly'. - - * Changed the handling of generated switches so that there is - only one call to str[n]?cmp. This *greatly* reduces the size of - the generated assembly code on all compilers I've seen. - - * Fixed a subtle bug that occurred when the -l and -S option - was given. Code produced looked something like: - - if (len != key_len || !strcmp (s1, resword->name)) return resword; - - which doesn't make any sense. Clearly, this should be: - - if (len == key_len && !strcmp (s1, resword->name)) return resword; - -Tue Sep 26 10:36:50 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Changed class Read_Line's definition so that it no longer - needs to know about the buffering scheme used to speed up - dynamic memory allocation of input keywords and their - associated attributes. This means that operator new is no longer - a friend of Read_Line. - -Mon Sep 25 23:17:10 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Decided that Obstacks had too much overhead, so they were - removed in favor of super-efficient, low-overhead buffered - storage allocation hacks in Read_Line and List_Node. - - * No longer try to inline functions that g++ complains about - (Key_List::Merge and Key_List::Merge_Sort). - -Sun Sep 24 13:11:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Changed classes Read_Line and List_Node to use Obstacks in order - to cache memory allocation for keyword strings and List_Nodes. - - * Continued to experiment with inheritance schemes. - - * Added a new file `alpha.h', that declares static data shared - (i.e., inherited) between classes List_Node and Key_List. - -Tue Sep 12 16:14:41 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Made numerous changes to incorporate multiple inheritance in - gperf. - -Wed Aug 16 23:04:08 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added the -DCOMPILER_FIXED flag to the ./src/Makefile. This - implies that people trying to compile gperf need to have a - working version of the new g++ compiler (1.36.0). - - * Removed some extra spaces that were being added in the generated - C code. - -Mon Jul 24 17:09:46 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c - so that the generated functions take an unsigned int length argument. - If -a is enabled the prototype is (const char *str, size_t len). - -Fri Jul 21 13:06:15 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented - the indentation from working correctly. - - * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc - that prevented links from being printed correctly. - -Tue Jul 18 16:04:31 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Fixed up readline.cc and readline.h so that they work OK - with g++ compilers that aren't completely up-to-date. - If symbol COMPILER_FIXED is defined then the behavior - that works on my more recent version of g++ is enabled. - -Sun Jul 9 17:53:28 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Changed the ./tests subdirectory Makefile so that it - uses $(CC) instead of gcc. - -Sun Jul 2 21:52:15 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Fixed a number of subtle bugs that occurred when -S was - combined with various and sundry options. - - * Added the -G option, that makes the generated keyword table - a global static variable, rather than hiding it inside - the lookup function. This allows other functions to directly - access the contents in this table. - - * Added the "#" feature, that allows comments inside the keyword - list from the input file. Comment handling takes place in readline.c. - This simplifies the code and reduces the number of malloc calls. - - * Also added the -H option (user can give the name of the hash - function) and the -T option (prevents the transfer of the type decl - to the output file, which is useful if the type is already defined - elsewhere). - -Thu Jun 22 20:39:39 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Modified many classes so that they would inherit Std_Err as - a base class. This makes things more abstract... - -Fri Jun 16 14:23:00 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Modified the -f (FAST) option. This now takes an argument. - The argument corresponds to the number of iterations used - to resolve collisions. -f 0 uses the length of the - keyword list (which is what -f did before). This makes - life much easier when dealing with large keyword files. - -Tue Jun 6 17:53:27 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added the -c (comparison) option. Enabling this - will use the strncmp function for string comparisons. - The default is to use strcmp. - - * Fixed a typo in key_list.cc (PRINT_SWITCH). This caused - faulty C code to be generated when the -D, -p, and -t - options were all enabled. - -Thu May 25 14:07:21 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) - - * Once again, changed class Read_Line to overload global operator - new. Hopefully, this will work...! - -Sun May 21 01:51:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Modified Key_List::print_hash_function () so that it properly - formats the associated values in the hash table according to - the maximum number of digits required to represent the largest - value. - - * Removed the named return value from class Hash_Table's - operator (), since this causes a seg fault when -O is enabled. - No sense tripping subtle g++ bugs if we don't have to.... ;-) - - * Removed the operator new hack from Read_Line, since this seemed - to create horrible bus error problems. - - * Changed many class member functions and data members to be `static', - if they don't manipulate this! - -Fri May 12 23:06:56 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Changed class Std_Err to use static member functions, a la - Ada or Modula 2. This eliminates the need for an explicit - error-handler class object. - - * Added the ``named return value'' feature to Hash_Table::operator () - and Bool_Array::operator [], just for the heck of it.... ;-) - - * Changed the previous hack in Read_Line so that we now use - the overloaded global `new' instead of NEW_STRING! - -Wed May 3 17:36:55 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Updated to version 1.7. This reflects the recent major changes - and the new C port. - - * Modified the GNU getopt.cc routine to have a class-based interface. - - * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum - hash table size from being printed (maybe the stream classes - weren't so bad after all.... ;-). - - * Added support for the -f option. This generates the perfect - hash function ``fast.'' It reduces the execution time of - gperf, at the cost of minimizing the range of hash values. - -Tue May 2 16:23:29 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Added an efficiency hack to Read_Line. Instead of making - a call to operator NEW (a.k.a. malloc) for each input string - a new member function NEW_STRING stores a large buffer from - which new strings are carved out, growing the buffer if - necessary. It might be useful to add this throughout the - program.... - - * Removed all unnecessary calls to DELETE. If the program is about - to exit it is silly to waste time freeing memory. - - * Added the GNU getopt program to the distribution. This makes - GPERF portable to systems that don't include getopt in libc. - - * Added a strcspn member to class Key_List. This also increases - portability. - - * Added the get_include_src function from keylist.c as a member - function in class Key_List. Hopefully every function is - now associated with a class. This aids abstraction and - modularity. - - * Ported gperf to C. From now on both K&R C and GNU G++ versions - will be supported. There will be two ChangeLog files, one - for each version of the program. - -Mon May 1 16:41:45 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Fixed a bug with -k'*'. This now prints out *all* the cases - up to the length of the longest word in the keyword set. - -Sun Apr 30 12:15:25 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Removed all use of the stream classes. Too ugly, slow, and - not handled by the c++-mode formatter.... - - * Modified the handling of links (i.e., keywords that have - identical hash values as other keywords). This should - speed up hash function generation for keyword sets with - many duplicate entries. The trick is to treat duplicate - values as equivalence classes, so that each set of duplicate - values is represented only once in the main list processing. - - * Fixed some capitialization typos and indentations mistakes in - Key_List::print_hash_function. - -Sat Apr 29 12:04:03 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Fixed a typo/logico in Key_List::print_switch that prevented - the last keyword in the keyword list to be print out. This - requires further examination..... - - * Fixed a stupid bug in List_Node::List_node. If the -k'*' option - was enabled the KEY_SET string wasn't getting terminated with - '\0'! - -Fri Apr 28 12:38:35 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc. - Also changed the strexp class to iterator. Continued to work - on style... - - * Updated the version number to 1.6. This reflects all the - recent changes. - -Thu Apr 27 00:14:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added the -D option that properly handles keyword sets that - contain duplicate hash values. - - * Continued the stylistic changes. Added the #pragma once - directive to all the *.h files. Removed all #defines and - replaced them with static consts. Also moved the key_sort - routine from options.cc into the options class as a - member function. - -Mon Apr 3 13:26:55 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) - - * Made massive stylistic changes to bring source code into - conformance with GNU style guidelines. - -Thu Mar 30 23:28:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Fixed up the output routines so that they generate code - corresponding to the GNU style guidelines. - -Sat Mar 11 13:12:37 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Fixed Stderr constructors so that they wouldn't try to - use the base class initializer syntax for the static - class variable Program_Name. G++ 1.34 is stricter in - enforcing the rules! - -Fri Mar 10 11:24:14 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Removed -v and ``| more'' from the Makefile to keep rfg happy... - -Thu Mar 2 12:37:30 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion - into libg++ 1.34. Note that there is a small bug with - the new %{ ... %} source inclusion facility, since it doesn't - understand comments and will barf if %{ or %} appear nested - inside the outermost delimiters. This is too trivial of - a defect to fix at the moment... - -Tue Feb 28 11:19:58 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added the -K option, which allows the user to provide a - alternative name for the keyword structure component. - The default is still ``name.'' - - * Added the LEX and YACC-like ability to include arbitrary - text at the beginning of the generated C source code output. - This required two new functions Get_Special_Input, - Key_List::Save_Include_Src; - - * Fixed memory allocation bug in Key_List::Set_Types. - Variable Return_Type needs 1 additional location - to store the "*" if the -p option is used. - - * Added code to NULL terminate both Struct_Tag and Return_Type, - *after* the strncpy (stupid mistake). - -Mon Feb 27 14:39:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added a new option -N. This allows the user to specify the - name to be used for the generated lookup function. The - default name is still ``in_word_set.'' This makes it - possible to completely automate the perfect hash function - generation process! - -Mon Feb 20 23:33:14 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Corrected the Hash_Table::operator () function so that - *it* is responsible for deciding when a new key has the - same signature as a previously seen key. The key length - information is now used internally to this function to - decide whether to add to the hash table those keys with - the same key sets, but different lengths. Before, this - was handled by the Key_List::Read_Keys function. However, - this failed to work for certain duplicate keys, since - they weren't being entered into the hash table properly. - -Sun Feb 19 16:02:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Modified class Options by moving the enum Option_Type out - of the class. This is to satisfy the new enumeration - scope rules in C++. - -Sun Jan 15 15:12:09 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Incremented the version number upto 1.4 to reflect the new - options that affect the generated code. Send the new - distribution off to Michael for use with g++ 1.33. - - * Added a fix to Key_List::Read_Keys so that it checks for links - properly when the -n option is used. Previously, it didn't - catch obvious links, which caused it to spend large amount - of time searching for a solution that could never occur! - - * Modified the Key_List data structure to record *both* the - minimum and the maximum key lengths. This information - is now computed in Key_List::Read_Keys, and thus - Key_List::Print_Min_Max doesn't need to bother. - - * Modifed the key position iterator scheme in options.cc to - eliminate the need for member function Options::Advance. - Now, the Options::Get function performs the advancement - automatically, obviating the need for an extra function call. - - * Added the new function Options::Print_Options, to print out - the user-specified command line options to generated C - output file. - - * Added a new function, Key_List::Print_Keylength_Table, - which creates a table of lengths for use in speeding - up the keyword search. This also meant that a new - option, -l (LENTABLE) is recognized. It controls - whether the length table is printed and the comparison - made in the generated function ``in_word_set.'' - - * Added a comment at the top of the generated C code - output file that tells what version of gperf was used. - Next, I'll also dump out the command line options - as a comment too. Thanks to Michael Tiemann for the - feedback on this. - - * Fixed the -n option to make it work correctly with - other parts of the program (most notably the Perfect::Hash - function and the computation of minimum and maximum lengths. - -Fri Jan 13 21:25:27 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) - - * Realized the the need to add a test that will enable - optimziation of the generated C code in the ``hash'' function - by checking whether all the requested key positions are - guaranteed to exist due to the comparison in `in_word_set.'' - I'll put this in soon.... - -Thu Jan 12 20:09:21 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Added pascal, modula3, and modula2 tests inputs to the - Makefile - - * Recognised that there is a bug with the -n option. However - I'm too busy to fix it properly, right now. The problem - is that the generated #define end up being 0, since that's - my hack to make -n work. This needs complete rethinking! - -Tue Jan 10 00:08:16 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Added a new option, -n, that instructs gperf to not use the - length of an identifier when computing the hash functions. - I'm not sure how useful this is! - - * Retransmitted the distribution to rocky.oswego.edu. Hopefully, - this will work! - - * Began fixing the indentation and capitalization to conform - to the GNU coding guidelines. - -Mon Jan 9 22:23:18 1989 Doug Schmidt (schmidt at pompe.ics.uci.edu) - - * Fixed horrible bug in Read_Line::Readln_Aux. This was - a subtle and pernicous off-by-1 error, that overwrote - past the last character of the input string buffer. I - think this fault was killing the vax! - - * Yow, fixed an oversight in List_Node::List_Node, where the - pointer field Next was uninitialized. Luckily, the new routine - seems to return 0 filled objects the first time through! - -Sun Jan 8 13:43:14 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Modified the ``key linked'' diagnostic in Key_List::Read_Keys - to be more helpful and easy to read. - - * Fixed the List_Node::List_Node so that it would ignore trailing - fields if the -t option was not enabled. - - * Moved the List_Node declarations out of keylist.h and - into a file of its own, called listnode.cc and listnode.h - Made Set_Sort a member function of class List_Node. - - * Massively updated the documentation in the gperf.texinfo file. - - * Polished off the major revision to the print functions, - added a few new tests in the Makefile to check for the - validity of the program and ftp'ed the entire distribution - off to Doug Lea for libg++. ( changed it to - 1.3 to reflect the major changes with the generated - C code ). - - * Fixed Key_List::Print_Switch to deal with the -p and -t options. - This meant that the ``still-born'' function Key_List:: - Print_Type_Switch was superflous, so I removed it. - Also, removed the restriction in Option that the -p and - -t options couldn't be used simultaneously. - - * Modified List_Node::List_Node, to perform only 1 call to - ``new'' when dynamically allocating memory for the Key_Set - and the Uniq_Set. - -Sat Jan 7 14:10:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) - - * Fixed a big bug with the new policy of nesting the - wordlist inside of generated function ``in_word_set.'' - I'd forgotten to declare the wordlist array as static! - ( arrgh ). - - * Added a new function Key_List::Set_Types, that figures out - the return type for generated function ``in_word_set,'' - the user-defined ``struct tag,'' if one is used, and also - formates the array type for the static local array. - - * Changed the print routines to take advantage of the - new -p option. - - * Began adding the hooks to allow the return of a pointer - to a user defined struct location from the generated - ``in_word_set'' function instead of the current 0 or 1 - return value. Created function Key_List::Print_Type_Switch - and added option -p to class Option, allowing the user to - request generation of the aforementioned pointers returned - instead of booleans. - - * Put in checks in class Option to make sure that -S and -t - options are not used simultaneously. This restriction - will be removed in subsequent releases, once I decide on - a clean way to implement it. - - * Sent version 1.2 to Doug Lea for possible inclusion into - the libg++ distribution. - - * Moved the static word_list array inside the generated function - in_word_set. This supports better data hiding. - - * Added a texinfo file, gperf.texinfo - - * Revised the Makefile to cleanup the droppings from texinfo - and changed the name of gperf.cc and gperf.h to perfect.cc - and perfect.h. - -Fri Jan 6 13:04:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) - - * Implemented the switch statement output format. Much better - for large datasets in terms of space used. - - * Added new functions to break up the Key_List::Output function. - Functions added were Key_List::Print_Switch, - Key_List::Print_Min_Max, Key_List::Print_Keyword_Table, - Key_List::Print_Hash_Function, and - Key_List::Print_Lookup_Function. This simplifies the big mess - in Key_List::Output considerably! - - * Added switch statement option to Options, which potentially - trades time for space in the generated lookup code. - -Thu Jan 5 22:46:34 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) - - * Released version 1.1 - - * Fixed a bug with Gperf::Merge_Set, it was skipping letters - shared between the Set_1 and Set_2. - - * Added the optimal min/max algorithm in Key_List::Output. This - runs in O (3n/2), rather than O (2n) time. - - * Changed Gperf::Sort_Set to use insertion sort, rather than - bubble sort. - - * Added a check in Key_List::Output for the special case where - the keys used are 1,$. It is possible to generate more - efficient C code in this case. diff --git a/apps/gperf/Makefile b/apps/gperf/Makefile deleted file mode 100644 index f9a0d4b9bd1..00000000000 --- a/apps/gperf/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for the Orbix applications -#---------------------------------------------------------------------------- - -#---------------------------------------------------------------------------- -# Local macros -#---------------------------------------------------------------------------- - -INFO = README - -DIRS = src \ - tests - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nolocal.GNU - diff --git a/apps/gperf/README b/apps/gperf/README deleted file mode 100644 index bd9d14ea680..00000000000 --- a/apps/gperf/README +++ /dev/null @@ -1,24 +0,0 @@ -While teaching a data structures course at University of California, -Irvine, I developed a program called GPERF that generates perfect hash -functions for sets of key words. A perfect hash function is simply: - - A hash function and a data structure that allows - recognition of a key word in a set of words using - exactly 1 probe into the data structure. - -The gperf.texinfo file explains how the program works, the form of the -input, what options are available, and hints on choosing the best -options for particular key word sets. The texinfo file is readable -both via the GNU emacs `info' command, and is also suitable for -typesetting with TeX. - -The enclosed Makefile creates the executable program ``gperf'' and -also runs some tests. - -Output from the GPERF program is used to recognize reserved words in -the GNU C, GNU C++, and GNU Pascal compilers, as well as with the GNU -indent program. - -Happy hacking! - -Douglas C. Schmidt diff --git a/apps/gperf/gperf.1 b/apps/gperf/gperf.1 deleted file mode 100644 index 5673c80062a..00000000000 --- a/apps/gperf/gperf.1 +++ /dev/null @@ -1,23 +0,0 @@ -.TH GPERF 1 "December 16, 1988 -.UC 4 -.SH NAME -gperf \- generate a perfect hash function from a key set -.SH SYNOPSIS -.B gperf -[ -.B \-adghijklnoprsStv -] [ -.I keyfile -] -.SH DESCRIPTION - -\fIgperf\fP reads a set of ``keys'' from \fIkeyfile\fP (or, by -default, from the standard input) and attempts to find a non-minimal -perfect hashing function that recognizes a member of the key set in -constant, i.e., O(1), time. If such a function is found the program -generates a pair of \fIC\fP source code routines that perform the -hashing and table lookup. All generated code is directed to the -standard output. - -Please refer to the \fIgperf.texinfo\fP file for more information. -This file is distributed with \fIgperf\fP release. diff --git a/apps/gperf/gperf.info b/apps/gperf/gperf.info deleted file mode 100644 index a0947230573..00000000000 --- a/apps/gperf/gperf.info +++ /dev/null @@ -1,1127 +0,0 @@ -This is Info file gperf.info, produced by Makeinfo-1.55 from the input -file ./gperf.texi. - -START-INFO-DIR-ENTRY -* Gperf: (gperf). Perfect Hash Function Generator. -END-INFO-DIR-ENTRY - - This file documents the features of the GNU Perfect Hash Function -Generator - - Copyright (C) 1989 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided also -that the section entitled "GNU General Public License" is included -exactly as in the original, and provided that the entire resulting -derived work is distributed under the terms of a permission notice -identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that the section entitled "GNU `gperf' General Public -License" an d this permission notice may be included in translations -approved by the Free Software Foundation instead of in the original -English. - - -File: gperf.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) - -Introduction -************ - - This manual documents the GNU `gperf' perfect hash function generator -utility, focusing on its features and how to use them, and how to report -bugs. - -* Menu: - -* Copying:: GNU `gperf' General Public License says - how you can copy and share `gperf'. -* Contributors:: People who have contributed to `gperf'. -* Motivation:: Static search structures and GNU GPERF. -* Search Structures:: Static search structures and GNU `gperf' -* Description:: High-level discussion of how GPERF functions. -* Options:: A description of options to the program. -* Bugs:: Known bugs and limitations with GPERF. -* Projects:: Things still left to do. -* Implementation:: Implementation Details for GNU GPERF. -* Bibliography:: Material Referenced in this Report. - - -- The Detailed Node Listing -- - -High-Level Description of GNU `gperf' - -* Input Format:: Input Format to `gperf' -* Output Format:: Output Format for Generated C Code with `gperf' - -Input Format to `gperf' - -* Declarations:: `struct' Declarations and C Code Inclusion. -* Keywords:: Format for Keyword Entries. -* Functions:: Including Additional C Functions. - - -File: gperf.info, Node: Copying, Next: Contributors, Prev: Top, Up: Top - -GNU GENERAL PUBLIC LICENSE -************************** - - Version 1, February 1989 - - Copyright (C) 1989 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 license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our 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. The -General Public License applies to the Free Software Foundation's -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, 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 a 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 tell them 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. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 1. This License Agreement 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 work - containing the Program or a portion of it, either verbatim or with - modifications. Each licensee is addressed as "you". - - 2. 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 General Public License - and to the absence of any warranty; and give any other recipients - of the Program a copy of this General Public License along with - the Program. You may charge a fee for the physical act of - transferring a copy. - - 3. You may modify your copy or copies of the Program or any portion of - it, and copy and distribute such modifications under the terms of - Paragraph 1 above, provided that you also do the following: - - * cause the modified files to carry prominent notices stating - that you changed the files and the date of any change; and - - * cause the whole of any work that you distribute or publish, - that in whole or in part contains the Program or any part - thereof, either with or without modifications, to be licensed - at no charge to all third parties under the terms of this - General Public License (except that you may choose to grant - warranty protection to some or all third parties, at your - option). - - * If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the simplest and most usual 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 General Public License. - - * 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. - - Mere aggregation of another independent work with the Program (or - its derivative) on a volume of a storage or distribution medium - does not bring the other work under the scope of these terms. - - 4. You may copy and distribute the Program (or a portion or - derivative of it, under Paragraph 2) in object code or executable - form under the terms of Paragraphs 1 and 2 above provided that you - also do one of the following: - - * accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - * accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal - charge for the cost of distribution) a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Paragraphs 1 and 2 above; or, - - * accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative - is allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - - Source code for a work means the preferred form of the work for - making modifications to it. For an executable file, complete - source code means all the source code for all modules it contains; - but, as a special exception, it need not include source code for - modules which are standard libraries that accompany the operating - system on which the executable file runs, or for standard header - files or definitions files that accompany that operating system. - - 5. You may not copy, modify, sublicense, distribute or transfer the - Program except as expressly provided under this General Public - License. Any attempt otherwise to copy, modify, sublicense, - distribute or transfer the Program is void, and will automatically - terminate your rights to use the Program under this License. - However, parties who have received copies, or rights to use - copies, from you under this General Public License will not have - their licenses terminated so long as such parties remain in full - compliance. - - 6. By copying, distributing or modifying 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. - - 7. 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. - - 8. 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 the 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 the license, you may choose - any version ever published by the Free Software Foundation. - - 9. 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 - - 10. 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. - - 11. 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 humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. - Copyright (C) 19YY NAME OF AUTHOR - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, 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 a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision' (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - SIGNATURE OF TY COON, 1 April 1989 - Ty Coon, President of Vice - - That's all there is to it! - - -File: gperf.info, Node: Contributors, Next: Motivation, Prev: Copying, Up: Top - -Contributors to GNU `gperf' Utility -*********************************** - - * The GNU `gperf' perfect hash function generator utility was - originally written in GNU C++ by Douglas C. Schmidt. It is now - also available in a highly-portable "old-style" C version. The - general idea for the perfect hash function generator was inspired - by Keith Bostic's algorithm written in C, and distributed to - net.sources around 1984. The current program is a heavily - modified, enhanced, and extended implementation of Keith's basic - idea, created at the University of California, Irvine. Bugs, - patches, and suggestions should be reported to schmidt at - ics.uci.edu. - - * Special thanks is extended to Michael Tiemann and Doug Lea, for - providing a useful compiler, and for giving me a forum to exhibit - my creation. - - In addition, Adam de Boor and Nels Olson provided many tips and - insights that greatly helped improve the quality and functionality - of `gperf'. - - -File: gperf.info, Node: Motivation, Next: Search Structures, Prev: Contributors, Up: Top - -Introduction -************ - - `gperf' is a perfect hash function generator written in C++. It -transforms an *n* element user-specified keyword set *W* into a perfect -hash function *F*. *F* uniquely maps keywords in *W* onto the range -0..*k*, where *k* >= *n*. If *k = n* then *F* is a *minimal* perfect -hash function. `gperf' generates a 0..*k* element static lookup table -and a pair of C functions. These functions determine whether a given -character string *s* occurs in *W*, using at most one probe into the -lookup table. - - `gperf' currently generates the reserved keyword recognizer for -lexical analyzers in several production and research compilers and -language processing tools, including GNU C, GNU C++, GNU Pascal, GNU -Modula 3, and GNU indent. Complete C++ source code for `gperf' is -available via anonymous ftp from ics.uci.edu. `gperf' also is -distributed along with the GNU libg++ library. A highly portable, -functionally equivalent K&R C version of `gperf' is archived in -comp.sources.unix, volume 20. Finally, a paper describing `gperf''s -design and implementation in greater detail is available in the Second -USENIX C++ Conference proceedings. - - -File: gperf.info, Node: Search Structures, Next: Description, Prev: Motivation, Up: Top - -Static search structures and GNU `gperf' -**************************************** - - A "static search structure" is an Abstract Data Type with certain -fundamental operations, *e.g.*, *initialize*, *insert*, and *retrieve*. -Conceptually, all insertions occur before any retrievals. In -practice, `gperf' generates a `static' array containing search set -keywords and any associated attributes specified by the user. Thus, -there is essentially no execution-time cost for the insertions. It is -a useful data structure for representing *static search sets*. Static -search sets occur frequently in software system applications. Typical -static search sets include compiler reserved words, assembler -instruction opcodes, and built-in shell interpreter commands. Search -set members, called "keywords", are inserted into the structure only -once, usually during program initialization, and are not generally -modified at run-time. - - Numerous static search structure implementations exist, *e.g.*, -arrays, linked lists, binary search trees, digital search tries, and -hash tables. Different approaches offer trade-offs between space -utilization and search time efficiency. For example, an *n* element -sorted array is space efficient, though the average-case time -complexity for retrieval operations using binary search is proportional -to log *n*. Conversely, hash table implementations often locate a -table entry in constant time, but typically impose additional memory -overhead and exhibit poor worst case performance. - - *Minimal perfect hash functions* provide an optimal solution for a -particular class of static search sets. A minimal perfect hash -function is defined by two properties: - - * It allows keyword recognition in a static search set using at most - *one* probe into the hash table. This represents the "perfect" - property. - - * The actual memory allocated to store the keywords is precisely - large enough for the keyword set, and *no larger*. This is the - "minimal" property. - - For most applications it is far easier to generate *perfect* hash -functions than *minimal perfect* hash functions. Moreover, non-minimal -perfect hash functions frequently execute faster than minimal ones in -practice. This phenomena occurs since searching a sparse keyword table -increases the probability of locating a "null" entry, thereby reducing -string comparisons. `gperf''s default behavior generates -*near-minimal* perfect hash functions for keyword sets. However, -`gperf' provides many options that permit user control over the degree -of minimality and perfection. - - Static search sets often exhibit relative stability over time. For -example, Ada's 63 reserved words have remained constant for nearly a -decade. It is therefore frequently worthwhile to expend concerted -effort building an optimal search structure *once*, if it subsequently -receives heavy use multiple times. `gperf' removes the drudgery -associated with constructing time- and space-efficient search -structures by hand. It has proven a useful and practical tool for -serious programming projects. Output from `gperf' is currently used in -several production and research compilers, including GNU C, GNU C++, -GNU Pascal, and GNU Modula 3. The latter two compilers are not yet -part of the official GNU distribution. Each compiler utilizes `gperf' -to automatically generate static search structures that efficiently -identify their respective reserved keywords. - - -File: gperf.info, Node: Description, Next: Options, Prev: Search Structures, Up: Top - -High-Level Description of GNU `gperf' -************************************* - -* Menu: - -* Input Format:: Input Format to `gperf' -* Output Format:: Output Format for Generated C Code with `gperf' - - The perfect hash function generator `gperf' reads a set of -"keywords" from a "keyfile" (or from the standard input by default). -It attempts to derive a perfect hashing function that recognizes a -member of the "static keyword set" with at most a single probe into the -lookup table. If `gperf' succeeds in generating such a function it -produces a pair of C source code routines that perform hashing and -table lookup recognition. All generated C code is directed to the -standard output. Command-line options described below allow you to -modify the input and output format to `gperf'. - - By default, `gperf' attempts to produce time-efficient code, with -less emphasis on efficient space utilization. However, several options -exist that permit trading-off execution time for storage space and vice -versa. In particular, expanding the generated table size produces a -sparse search structure, generally yielding faster searches. -Conversely, you can direct `gperf' to utilize a C `switch' statement -scheme that minimizes data space storage size. Furthermore, using a C -`switch' may actually speed up the keyword retrieval time somewhat. -Actual results depend on your C compiler, of course. - - In general, `gperf' assigns values to the characters it is using for -hashing until some set of values gives each keyword a unique value. A -helpful heuristic is that the larger the hash value range, the easier -it is for `gperf' to find and generate a perfect hash function. -Experimentation is the key to getting the most from `gperf'. - - -File: gperf.info, Node: Input Format, Next: Output Format, Prev: Description, Up: Description - -Input Format to `gperf' -======================= - - You can control the input keyfile format by varying certain -command-line arguments, in particular the `-t' option. The input's -appearance is similar to GNU utilities `flex' and `bison' (or UNIX -utilities `lex' and `yacc'). Here's an outline of the general format: - - declarations - %% - keywords - %% - functions - - *Unlike* `flex' or `bison', all sections of `gperf''s input are -optional. The following sections describe the input format for each -section. - -* Menu: - -* Declarations:: `struct' Declarations and C Code Inclusion. -* Keywords:: Format for Keyword Entries. -* Functions:: Including Additional C Functions. - - -File: gperf.info, Node: Declarations, Next: Keywords, Prev: Input Format, Up: Input Format - -`struct' Declarations and C Code Inclusion ------------------------------------------- - - The keyword input file optionally contains a section for including -arbitrary C declarations and definitions, as well as provisions for -providing a user-supplied `struct'. If the `-t' option *is* enabled, -you *must* provide a C `struct' as the last component in the -declaration section from the keyfile file. The first field in this -struct must be a `char *' identifier called "name," although it is -possible to modify this field's name with the `-K' option described -below. - - Here is simple example, using months of the year and their -attributes as input: - - struct months { char *name; int number; int days; int leap_days; }; - %% - january, 1, 31, 31 - february, 2, 28, 29 - march, 3, 31, 31 - april, 4, 30, 30 - may, 5, 31, 31 - june, 6, 30, 30 - july, 7, 31, 31 - august, 8, 31, 31 - september, 9, 30, 30 - october, 10, 31, 31 - november, 11, 30, 30 - december, 12, 31, 31 - - Separating the `struct' declaration from the list of key words and -other fields are a pair of consecutive percent signs, `%%', appearing -left justified in the first column, as in the UNIX utility `lex'. - - Using a syntax similar to GNU utilities `flex' and `bison', it is -possible to directly include C source text and comments verbatim into -the generated output file. This is accomplished by enclosing the region -inside left-justified surrounding `%{', `%}' pairs. Here is an input -fragment based on the previous example that illustrates this feature: - - %{ - #include <assert.h> - /* This section of code is inserted directly into the output. */ - int return_month_days (struct months *months, int is_leap_year); - %} - struct months { char *name; int number; int days; int leap_days; }; - %% - january, 1, 31, 31 - february, 2, 28, 29 - march, 3, 31, 31 - ... - - It is possible to omit the declaration section entirely. In this -case the keyfile begins directly with the first keyword line, *e.g.*: - - january, 1, 31, 31 - february, 2, 28, 29 - march, 3, 31, 31 - april, 4, 30, 30 - ... - - -File: gperf.info, Node: Keywords, Next: Functions, Prev: Declarations, Up: Input Format - -Format for Keyword Entries --------------------------- - - The second keyfile format section contains lines of keywords and any -associated attributes you might supply. A line beginning with `#' in -the first column is considered a comment. Everything following the `#' -is ignored, up to and including the following newline. - - The first field of each non-comment line is always the key itself. -It should be given as a simple name, *i.e.*, without surrounding string -quotation marks, and be left-justified flush against the first column. -In this context, a "field" is considered to extend up to, but not -include, the first blank, comma, or newline. Here is a simple example -taken from a partial list of C reserved words: - - # These are a few C reserved words, see the c.`gperf' file - # for a complete list of ANSI C reserved words. - unsigned - sizeof - switch - signed - if - default - for - while - return - - Note that unlike `flex' or `bison' the first `%%' marker may be -elided if the declaration section is empty. - - Additional fields may optionally follow the leading keyword. Fields -should be separated by commas, and terminate at the end of line. What -these fields mean is entirely up to you; they are used to initialize the -elements of the user-defined `struct' provided by you in the -declaration section. If the `-t' option is *not* enabled these fields -are simply ignored. All previous examples except the last one contain -keyword attributes. - - -File: gperf.info, Node: Functions, Prev: Keywords, Up: Input Format - -Including Additional C Functions --------------------------------- - - The optional third section also corresponds closely with conventions -found in `flex' and `bison'. All text in this section, starting at the -final `%%' and extending to the end of the input file, is included -verbatim into the generated output file. Naturally, it is your -responsibility to ensure that the code contained in this section is -valid C. - - -File: gperf.info, Node: Output Format, Prev: Input Format, Up: Description - -Output Format for Generated C Code with `gperf' -=============================================== - - Several options control how the generated C code appears on the -standard output. Two C function are generated. They are called `hash' -and `in_word_set', although you may modify the name for `in_word_set' -with a command-line option. Both functions require two arguments, a -string, `char *' STR, and a length parameter, `int' LEN. Their default -function prototypes are as follows: - - static int hash (char *str, int len); - int in_word_set (char *str, int len); - - By default, the generated `hash' function returns an integer value -created by adding LEN to several user-specified STR key positions -indexed into an "associated values" table stored in a local static -array. The associated values table is constructed internally by -`gperf' and later output as a static local C array called HASH_TABLE; -its meaning and properties are described below. *Note -Implementation::. The relevant key positions are specified via the `-k' -option when running `gperf', as detailed in the *Options* section -below. *Note Options::. - - Two options, `-g' (assume you are compiling with GNU C and its -`inline' feature) and `-a' (assume ANSI C-style function prototypes), -alter the content of both the generated `hash' and `in_word_set' -routines. However, function `in_word_set' may be modified more -extensively, in response to your option settings. The options that -affect the `in_word_set' structure are: - - `-p' - Have function `in_word_set' return a pointer rather than a - boolean. - - `-t' - Make use of the user-defined `struct'. - - `-S TOTAL SWITCH STATEMENTS' - Generate 1 or more C `switch' statement rather than use a - large, (and potentially sparse) static array. Although the - exact time and space savings of this approach vary according - to your C compiler's degree of optimization, this method - often results in smaller and faster code. - - If the `-t', `-S', and `-p' options are omitted the default action -is to generate a `char *' array containing the keys, together with -additional null strings used for padding the array. By experimenting -with the various input and output options, and timing the resulting C -code, you can determine the best option choices for different keyword -set characteristics. - - -File: gperf.info, Node: Options, Next: Bugs, Prev: Description, Up: Top - -Options to the `gperf' Utility -****************************** - - There are *many* options to `gperf'. They were added to make the -program more convenient for use with real applications. "On-line" help -is readily available via the `-h' option. Other options include: - - `-a' - Generate ANSI Standard C code using function prototypes. The - default is to use "classic" K&R C function declaration syntax. - - `-c' - Generates C code that uses the `strncmp' function to perform - string comparisons. The default action is to use `strcmp'. - - `-C' - Makes the contents of all generated lookup tables constant, - *i.e.*, "readonly." Many compilers can generate more - efficient code for this by putting the tables in readonly - memory. - - `-d' - Enables the debugging option. This produces verbose - diagnostics to "standard error" when `gperf' is executing. - It is useful both for maintaining the program and for - determining whether a given set of options is actually - speeding up the search for a solution. Some useful - information is dumped at the end of the program when the `-d' - option is enabled. - - `-D' - Handle keywords whose key position sets hash to duplicate - values. Duplicate hash values occur for two reasons: - - * Since `gperf' does not backtrack it is possible for it - to process all your input keywords without finding a - unique mapping for each word. However, frequently only - a very small number of duplicates occur, and the - majority of keys still require one probe into the table. - - * Sometimes a set of keys may have the same names, but - possess different attributes. With the -D option - `gperf' treats all these keys as part of an equivalence - class and generates a perfect hash function with multiple - comparisons for duplicate keys. It is up to you to - completely disambiguate the keywords by modifying the - generated C code. However, `gperf' helps you out by - organizing the output. - - Option `-D' is extremely useful for certain large or highly - redundant keyword sets, *i.e.*, assembler instruction opcodes. - Using this option usually means that the generated hash - function is no longer perfect. On the other hand, it permits - `gperf' to work on keyword sets that it otherwise could not - handle. - - `-e KEYWORD DELIMITER LIST' - Allows the user to provide a string containing delimiters - used to separate keywords from their attributes. The default - is ",\n". This option is essential if you want to use - keywords that have embedded commas or newlines. One useful - trick is to use -e'TAB', where TAB is the literal tab - character. - - `-E' - Define constant values using an enum local to the lookup - function rather than with #defines. This also means that - different lookup functions can reside in the same file. - Thanks to James Clark (jjc at ai.mit.edu). - - `-f ITERATION AMOUNT' - Generate the perfect hash function "fast." This decreases - `gperf''s running time at the cost of minimizing generated - table-size. The iteration amount represents the number of - times to iterate when resolving a collision. `0' means - `iterate by the number of keywords. This option is probably - most useful when used in conjunction with options `-D' and/or - `-S' for *large* keyword sets. - - `-g' - Assume a GNU compiler, *e.g.*, `g++' or `gcc'. This makes - all generated routines use the "inline" keyword to remove the - cost of function calls. Note that `-g' does *not* imply - `-a', since other non-ANSI C compilers may have provisions - for a function `inline' feature. - - `-G' - Generate the static table of keywords as a static global - variable, rather than hiding it inside of the lookup function - (which is the default behavior). - - `-h' - Prints a short summary on the meaning of each program option. - Aborts further program execution. - - `-H HASH FUNCTION NAME' - Allows you to specify the name for the generated hash - function. Default name is `hash.' This option permits the - use of two hash tables in the same file. - - `-i INITIAL VALUE' - Provides an initial VALUE for the associate values array. - Default is 0. Increasing the initial value helps inflate the - final table size, possibly leading to more time efficient - keyword lookups. Note that this option is not particularly - useful when `-S' is used. Also, `-i' is overriden when the - `-r' option is used. - - `-j JUMP VALUE' - Affects the "jump value," *i.e.*, how far to advance the - associated character value upon collisions. JUMP VALUE is - rounded up to an odd number, the default is 5. If the JUMP - VALUE is 0 `gper f' jumps by random amounts. - - `-k KEYS' - Allows selection of the character key positions used in the - keywords' hash function. The allowable choices range between - 1-126, inclusive. The positions are separated by commas, - *e.g.*, `-k 9,4,13,14'; ranges may be used, *e.g.*, `-k 2-7'; - and positions may occur in any order. Furthermore, the - meta-character '*' causes the generated hash function to - consider *all* character positions in each key, whereas '$' - instructs the hash function to use the "final character" of a - key (this is the only way to use a character position greater - than 126, incidentally). - - For instance, the option `-k 1,2,4,6-10,'$'' generates a hash - function that considers positions 1,2,4,6,7,8,9,10, plus the - last character in each key (which may differ for each key, - obviously). Keys with length less than the indicated key - positions work properly, since selected key positions - exceeding the key length are simply not referenced in the - hash function. - - `-K KEY NAME' - By default, the program assumes the structure component - identifier for the keyword is "name." This option allows an - arbitrary choice of identifier for this component, although - it still must occur as the first field in your supplied - `struct'. - - `-l' - Compare key lengths before trying a string comparison. This - might cut down on the number of string comparisons made - during the lookup, since keys with different lengths are - never compared via `strcmp'. However, using `-l' might - greatly increase the size of the generated C code if the - lookup table range is large (which implies that the switch - option `-S' is not enabled), since the length table contains - as many elements as there are entries in the lookup table. - - `-L GENERATED LANGUAGE NAME' - Instructs `gperf' to generate code in the language specified - by the option's argument. Languages handled are currently - C++ and C. The default is C. - - `-n' - Instructs the generator not to include the length of a - keyword when computing its hash value. This may save a few - assembly instructions in the generated lookup table. - - `-N LOOKUP FUNCTION NAME' - Allows you to specify the name for the generated lookup - function. Default name is `in_word_set.' This option - permits completely automatic generation of perfect hash - functions, especially when multiple generated hash functions - are used in the same application. - - `-o' - Reorders the keywords by sorting the keywords so that - frequently occuring key position set components appear first. - A second reordering pass follows so that keys with "already - determined values" are placed towards the front of the - keylist. This may decrease the time required to generate a - perfect hash function for many keyword sets, and also produce - more minimal perfect hash functions. The reason for this is - that the reordering helps prune the search time by handling - inevitable collisions early in the search process. On the - other hand, if the number of keywords is *very* large using - `-o' may *increase* `gperf''s execution time, since - collisions will begin earlier and continue throughout the - remainder of keyword processing. See Cichelli's paper from - the January 1980 Communications of the ACM for details. - - `-p' - Changes the return value of the generated function - `in_word_set' from boolean (*i.e.*, 0 or 1), to either type - "pointer to user-defined struct," (if the `-t' option is - enabled), or simply to `char *', if `-t' is not enabled. - This option is most useful when the `-t' option (allowing - user-defined structs) is used. For example, it is possible - to automatically generate the GNU C reserved word lookup - routine with the options `-p' and `-t'. - - `-r' - Utilizes randomness to initialize the associated values - table. This frequently generates solutions faster than using - deterministic initialization (which starts all associated - values at 0). Furthermore, using the randomization option - generally increases the size of the table. If `gperf' has - difficultly with a certain keyword set try using `-r' or `-D'. - - `-s SIZE-MULTIPLE' - Affects the size of the generated hash table. The numeric - argument for this option indicates "how many times larger or - smaller" the maximum associated value range should be, in - relationship to the number of keys. If the SIZE-MULTIPLE is - negative the maximum associated value is calculated by - *dividing* it into the total number of keys. For example, a - value of 3 means "allow the maximum associated value to be - about 3 times larger than the number of input keys." - - Conversely, a value of -3 means "allow the maximum associated - value to be about 3 times smaller than the number of input - keys." Negative values are useful for limiting the overall - size of the generated hash table, though this usually - increases the number of duplicate hash values. - - If `generate switch' option `-S' is *not* enabled, the maximum - associated value influences the static array table size, and - a larger table should decrease the time required for an - unsuccessful search, at the expense of extra table space. - - The default value is 1, thus the default maximum associated - value about the same size as the number of keys (for - efficiency, the maximum associated value is always rounded up - to a power of 2). The actual table size may vary somewhat, - since this technique is essentially a heuristic. In - particular, setting this value too high slows down `gperf''s - runtime, since it must search through a much larger range of - values. Judicious use of the `-f' option helps alleviate this - overhead, however. - - `-S TOTAL SWITCH STATEMENTS' - Causes the generated C code to use a `switch' statement - scheme, rather than an array lookup table. This can lead to - a reduction in both time and space requirements for some - keyfiles. The argument to this option determines how many - `switch' statements are generated. A value of 1 generates 1 - `switch' containing all the elements, a value of 2 generates - 2 tables with 1/2 the elements in each `switch', etc. This - is useful since many C compilers cannot correctly generate - code for large `switch' statements. This option was inspired - in part by Keith Bostic's original C program. - - `-t' - Allows you to include a `struct' type declaration for - generated code. Any text before a pair of consecutive %% is - consider part of the type declaration. Key words and - additional fields may follow this, one group of fields per - line. A set of examples for generating perfect hash tables - and functions for Ada, C, and G++, Pascal, and Modula 2 and 3 - reserved words are distributed with this release. - - `-T' - Prevents the transfer of the type declaration to the output - file. Use this option if the type is already defined - elsewhere. - - `-v' - Prints out the current version number. - - `-Z CLASS NAME' - Allow user to specify name of generated C++ class. Default - name is `Perfect_Hash'. - - -File: gperf.info, Node: Bugs, Next: Projects, Prev: Options, Up: Top - -Known Bugs and Limitations with `gperf' -*************************************** - - The following are some limitations with the current release of -`gperf': - - * The `gperf' utility is tuned to execute quickly, and works quickly - for small to medium size data sets (around 1000 keywords). It is - extremely useful for maintaining perfect hash functions for - compiler keyword sets. Several recent enhancements now enable - `gperf' to work efficiently on much larger keyword sets (over - 15,000 keywords). When processing large keyword sets it helps - greatly to have over 8 megs of RAM. - - However, since `gperf' does not backtrack no guaranteed solution - occurs on every run. On the other hand, it is usually easy to - obtain a solution by varying the option parameters. In - particular, try the `-r' option, and also try changing the default - arguments to the `-s' and `-j' options. To *guarantee* a - solution, use the `-D' and `-S' options, although the final - results are not likely to be a *perfect* hash function anymore! - Finally, use the `-f' option if you want `gperf' to generate the - perfect hash function *fast*, with less emphasis on making it - minimal. - - * The size of the generate static keyword array can get *extremely* - large if the input keyword file is large or if the keywords are - quite similar. This tends to slow down the compilation of the - generated C code, and *greatly* inflates the object code size. If - this situation occurs, consider using the `-S' option to reduce - data size, potentially increasing keyword recognition time a - negligible amount. Since many C compilers cannot correctly - generated code for large switch statements it is important to - qualify the -S option with an appropriate numerical argument that - controls the number of switch statements generated. - - * The maximum number of key positions selected for a given key has an - arbitrary limit of 126. This restriction should be removed, and if - anyone considers this a problem write me and let me know so I can - remove the constraint. - - * The C++ source code only compiles correctly with GNU G++, version - 1.36 (and hopefully later versions). Porting to AT&T cfront would - be tedious, but possible (and desirable). There is also a K&R C - version available now. This should compile without change on most - BSD systems, but may require a bit of work to run on SYSV, since - `gperf' uses ALLOCA in several places. Send mail to schmidt at - ics.uci.edu for information. - - -File: gperf.info, Node: Projects, Next: Implementation, Prev: Bugs, Up: Top - -Things Still Left to Do -*********************** - - It should be "relatively" easy to replace the current perfect hash -function algorithm with a more exhaustive approach; the perfect hash -module is essential independent from other program modules. Additional -worthwhile improvements include: - - * Make the algorithm more robust. At present, the program halts - with an error diagnostic if it can't find a direct solution and - the `-D' option is not enabled. A more comprehensive, albeit - computationally expensive, approach would employ backtracking or - enable alternative options and retry. It's not clear how helpful - this would be, in general, since most search sets are rather small - in practice. - - * Another useful extension involves modifying the program to generate - "minimal" perfect hash functions (under certain circumstances, the - current version can be rather extravagant in the generated table - size). Again, this is mostly of theoretical interest, since a - sparse table often produces faster lookups, and use of the `-S' - `switch' option can minimize the data size, at the expense of - slightly longer lookups (note that the gcc compiler generally - produces good code for `switch' statements, reducing the need for - more complex schemes). - - * In addition to improving the algorithm, it would also be useful to - generate a C++ class or Ada package as the code output, in - addition to the current C routines. - - -File: gperf.info, Node: Implementation, Next: Bibliography, Prev: Projects, Up: Top - -Implementation Details of GNU `gperf' -************************************* - - A paper describing the high-level description of the data structures -and algorithms used to implement `gperf' will soon be available. This -paper is useful not only from a maintenance and enhancement perspective, -but also because they demonstrate several clever and useful programming -techniques, *e.g.*, `Iteration Number' boolean arrays, double hashing, -a "safe" and efficient method for reading arbitrarily long input from a -file, and a provably optimal algorithm for simultaneously determining -both the minimum and maximum elements in a list. - - -File: gperf.info, Node: Bibliography, Prev: Implementation, Up: Top - -Bibliography -************ - - [1] Chang, C.C.: A Scheme for Constructing Ordered Minimal Perfect -Hashing Functions Information Sciences 39(1986), 187-195. - - [2] Cichelli, Richard J. Author's Response to "On Cichelli's Minimal -Perfec t Hash Functions Method" Communications of the ACM, 23, -12(December 1980), 729. - - [3] Cichelli, Richard J. Minimal Perfect Hash Functions Made Simple -Communications of the ACM, 23, 1(January 1980), 17-19. - - [4] Cook, C. R. and Oldehoeft, R.R. A Letter Oriented Minimal -Perfect Hashing Function SIGPLAN Notices, 17, 9(September 1982), 18-27. - - [5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M. -Practical Perfect Hashing Computer Journal, 28, 1(January 1985), 54-58. - - [6] Jaeschke, G. Reciprocal Hashing: A Method for Generating Minimal -Perfect Hashing Functions Communications of the ACM, 24, 12(December -1981), 829-833. - - [7] Jaeschke, G. and Osterburg, G. On Cichelli's Minimal Perfect -Hash Functions Method Communications of the ACM, 23, 12(December 1980), -728-729. - - [8] Sager, Thomas J. A Polynomial Time Generator for Minimal Perfect -Hash Functions Communications of the ACM, 28, 5(December 1985), 523-532 - - [9] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator -Second USENIX C++ Conference Proceedings, April 1990. - - [10] Sebesta, R.W. and Taylor, M.A. Minimal Perfect Hash Functions -for Reserved Word Lists SIGPLAN Notices, 20, 12(September 1985), 47-53. - - [11] Sprugnoli, R. Perfect Hashing Functions: A Single Probe -Retrieving Method for Static Sets Communications of the ACM, 20 -11(November 1977), 841-850. - - [12] Stallman, Richard M. Using and Porting GNU CC Free Software -Foundation, 1988. - - [13] Stroustrup, Bjarne The C++ Programming Language. -Addison-Wesley, 1986. - - [14] Tiemann, Michael D. User's Guide to GNU C++ Free Software -Foundation, 1989. - - - -Tag Table: -Node: Top1218 -Node: Copying2456 -Node: Contributors15759 -Node: Motivation16859 -Node: Search Structures18126 -Node: Description21679 -Node: Input Format23499 -Node: Declarations24294 -Node: Keywords26601 -Node: Functions28192 -Node: Output Format28686 -Node: Options31156 -Node: Bugs44526 -Node: Projects47213 -Node: Implementation48790 -Node: Bibliography49509 - -End Tag Table diff --git a/apps/gperf/gperf.texi b/apps/gperf/gperf.texi deleted file mode 100644 index 649d05f7ec6..00000000000 --- a/apps/gperf/gperf.texi +++ /dev/null @@ -1,1184 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@settitle User's Guide to @code{gperf} -@setfilename gperf.info - -@ifinfo -@format -START-INFO-DIR-ENTRY -* Gperf: (gperf). Perfect Hash Function Generator. -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@ifinfo -This file documents the features of the GNU Perfect Hash Function Generator - -Copyright (C) 1989 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through @TeX{} and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU General Public License'' is included exactly as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU @code{gperf} General Public License'' an -d -this permission notice may be included in translations approved by the -Free Software Foundation instead of in the original English. -@end ifinfo - -@setchapternewpage odd - -@titlepage -@center @titlefont{User's Guide} -@sp 2 -@center @titlefont{for the} -@sp 2 -@center @titlefont{GNU GPERF Utility} -@sp 4 -@center Douglas C. Schmidt -@sp 3 -@center last updated 1 November 1989 -@sp 1 -@center for version 2.0 -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1989 Free Software Foundation, Inc. - - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -section entitled ``GNU @code{gperf} General Public License'' is included exactl -y as -in the original, and provided that the entire resulting derived work is -distributed under the terms of a permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that the section entitled ``GNU @code{gperf} General Public License'' ma -y be -included in a translation approved by the author instead of in the original -English. -@end titlepage - -@ifinfo -@node Top, Copying, (dir), (dir) -@ichapter Introduction - -This manual documents the GNU @code{gperf} perfect hash function generator -utility, focusing on its features and how to use them, and how to report -bugs. - -@end ifinfo -@menu -* Copying:: GNU @code{gperf} General Public License says - how you can copy and share @code{gperf}. -* Contributors:: People who have contributed to @code{gperf}. -* Motivation:: Static search structures and GNU GPERF. -* Search Structures:: Static search structures and GNU @code{gperf} -* Description:: High-level discussion of how GPERF functions. -* Options:: A description of options to the program. -* Bugs:: Known bugs and limitations with GPERF. -* Projects:: Things still left to do. -* Implementation:: Implementation Details for GNU GPERF. -* Bibliography:: Material Referenced in this Report. - - --- The Detailed Node Listing --- - -High-Level Description of GNU @code{gperf} - -* Input Format:: Input Format to @code{gperf} -* Output Format:: Output Format for Generated C Code with @code{gperf} - -Input Format to @code{gperf} - -* Declarations:: @code{struct} Declarations and C Code Inclusion. -* Keywords:: Format for Keyword Entries. -* Functions:: Including Additional C Functions. -@end menu - -@node Copying, Contributors, Top, Top -@unnumbered GNU GENERAL PUBLIC LICENSE -@center Version 1, February 1989 - -@display -Copyright @copyright{} 1989 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. -@end display - -@unnumberedsec Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our 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. The -General Public License applies to the Free Software Foundation's -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, 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 a 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 tell them 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. - - The precise terms and conditions for copying, distribution and -modification follow. - -@iftex -@unnumberedsec TERMS AND CONDITIONS -@end iftex -@ifinfo -@center TERMS AND CONDITIONS -@end ifinfo - -@enumerate -@item -This License Agreement 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 work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as ``you''. - -@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 -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - -@item -You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - -@itemize @bullet -@item -cause the modified files to carry prominent notices stating that -you changed the files and the date of any change; and - -@item -cause the whole of any work that you distribute or publish, that -in whole or in part contains the Program or any part thereof, either -with or without modifications, to be licensed at no charge to all -third parties under the terms of this General Public License (except -that you may choose to grant warranty protection to some or all -third parties, at your option). - -@item -If the modified program normally reads commands interactively when -run, you must cause it, when started running for such interactive use -in the simplest and most usual 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 General -Public License. - -@item -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. -@end itemize - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - -@item -You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - -@itemize @bullet -@item -accompany it with the complete corresponding machine-readable -source code, which must be distributed under the terms of -Paragraphs 1 and 2 above; or, - -@item -accompany it with a written offer, valid for at least three -years, to give any third party free (except for a nominal charge -for the cost of distribution) a complete machine-readable copy of the -corresponding source code, to be distributed under the terms of -Paragraphs 1 and 2 above; or, - -@item -accompany it with the information you received as to where the -corresponding source code may be obtained. (This alternative is -allowed only for noncommercial distribution and only if you -received the program in object code or executable form alone.) -@end itemize - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - -@item -You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - -@item -By copying, distributing or modifying 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. - -@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. - -@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 the 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 -the 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 -@unnumberedsec 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 humanity, 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) 19@var{yy} @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 1, 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 `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 a sample; alter the names: - -@example -Yoyodyne, Inc., hereby disclaims all copyright interest in the -program `Gnomovision' (a program to direct compilers to make passes -at assemblers) written by James Hacker. - -@var{signature of Ty Coon}, 1 April 1989 -Ty Coon, President of Vice -@end example - -That's all there is to it! - -@node Contributors, Motivation, Copying, Top -@unnumbered Contributors to GNU @code{gperf} Utility - -@itemize @bullet -@item -The GNU @code{gperf} perfect hash function generator utility was -originally written in GNU C++ by Douglas C. Schmidt. It is now also -available in a highly-portable ``old-style'' C version. The general -idea for the perfect hash function generator was inspired by Keith -Bostic's algorithm written in C, and distributed to net.sources around -1984. The current program is a heavily modified, enhanced, and extended -implementation of Keith's basic idea, created at the University of -California, Irvine. Bugs, patches, and suggestions should be reported -to schmidt at ics.uci.edu. - -@item -Special thanks is extended to Michael Tiemann and Doug Lea, for -providing a useful compiler, and for giving me a forum to exhibit my -creation. - -In addition, Adam de Boor and Nels Olson provided many tips and insights -that greatly helped improve the quality and functionality of @code{gperf}. -@end itemize - -@node Motivation, Search Structures, Contributors, Top -@chapter Introduction - -@code{gperf} is a perfect hash function generator written in C++. It -transforms an @emph{n} element user-specified keyword set @emph{W} into -a perfect hash function @emph{F}. @emph{F} uniquely maps keywords in -@emph{W} onto the range 0..@emph{k}, where @emph{k} >= @emph{n}. If -@emph{k = n} then @emph{F} is a @emph{minimal} perfect hash function. -@code{gperf} generates a 0..@emph{k} element static lookup table and a -pair of C functions. These functions determine whether a given -character string @emph{s} occurs in @emph{W}, using at most one probe -into the lookup table. - -@code{gperf} currently generates the reserved keyword recognizer for -lexical analyzers in several production and research compilers and -language processing tools, including GNU C, GNU C++, GNU Pascal, GNU -Modula 3, and GNU indent. Complete C++ source code for @code{gperf} is -available via anonymous ftp from ics.uci.edu. @code{gperf} also is -distributed along with the GNU libg++ library. A highly portable, -functionally equivalent K&R C version of @code{gperf} is archived in -comp.sources.unix, volume 20. Finally, a paper describing -@code{gperf}'s design and implementation in greater detail is available -in the Second USENIX C++ Conference proceedings. - -@node Search Structures, Description, Motivation, Top -@chapter Static search structures and GNU @code{gperf} - -A @dfn{static search structure} is an Abstract Data Type with certain -fundamental operations, @emph{e.g.}, @emph{initialize}, @emph{insert}, -and @emph{retrieve}. Conceptually, all insertions occur before any -retrievals. In practice, @code{gperf} generates a @code{static} array -containing search set keywords and any associated attributes specified -by the user. Thus, there is essentially no execution-time cost for the -insertions. It is a useful data structure for representing @emph{static -search sets}. Static search sets occur frequently in software system -applications. Typical static search sets include compiler reserved -words, assembler instruction opcodes, and built-in shell interpreter -commands. Search set members, called @dfn{keywords}, are inserted into -the structure only once, usually during program initialization, and are -not generally modified at run-time. - -Numerous static search structure implementations exist, @emph{e.g.}, -arrays, linked lists, binary search trees, digital search tries, and -hash tables. Different approaches offer trade-offs between space -utilization and search time efficiency. For example, an @emph{n} element -sorted array is space efficient, though the average-case time -complexity for retrieval operations using binary search is -proportional to log @emph{n}. Conversely, hash table implementations -often locate a table entry in constant time, but typically impose -additional memory overhead and exhibit poor worst case performance. - - -@emph{Minimal perfect hash functions} provide an optimal solution for a -particular class of static search sets. A minimal perfect hash -function is defined by two properties: - -@itemize @bullet -@item -It allows keyword recognition in a static search set using at most -@emph{one} probe into the hash table. This represents the ``perfect'' -property. -@item -The actual memory allocated to store the keywords is precisely large -enough for the keyword set, and @emph{no larger}. This is the -``minimal'' property. -@end itemize - -For most applications it is far easier to generate @emph{perfect} hash -functions than @emph{minimal perfect} hash functions. Moreover, -non-minimal perfect hash functions frequently execute faster than -minimal ones in practice. This phenomena occurs since searching a -sparse keyword table increases the probability of locating a ``null'' -entry, thereby reducing string comparisons. @code{gperf}'s default -behavior generates @emph{near-minimal} perfect hash functions for -keyword sets. However, @code{gperf} provides many options that permit -user control over the degree of minimality and perfection. - -Static search sets often exhibit relative stability over time. For -example, Ada's 63 reserved words have remained constant for nearly a -decade. It is therefore frequently worthwhile to expend concerted -effort building an optimal search structure @emph{once}, if it -subsequently receives heavy use multiple times. @code{gperf} removes -the drudgery associated with constructing time- and space-efficient -search structures by hand. It has proven a useful and practical tool -for serious programming projects. Output from @code{gperf} is currently -used in several production and research compilers, including GNU C, GNU -C++, GNU Pascal, and GNU Modula 3. The latter two compilers are not yet -part of the official GNU distribution. Each compiler utilizes -@code{gperf} to automatically generate static search structures that -efficiently identify their respective reserved keywords. - -@node Description, Options, Search Structures, Top -@chapter High-Level Description of GNU @code{gperf} - -@menu -* Input Format:: Input Format to @code{gperf} -* Output Format:: Output Format for Generated C Code with @code{gperf} -@end menu - -The perfect hash function generator @code{gperf} reads a set of -``keywords'' from a @dfn{keyfile} (or from the standard input by -default). It attempts to derive a perfect hashing function that -recognizes a member of the @dfn{static keyword set} with at most a -single probe into the lookup table. If @code{gperf} succeeds in -generating such a function it produces a pair of C source code routines -that perform hashing and table lookup recognition. All generated C code -is directed to the standard output. Command-line options described -below allow you to modify the input and output format to @code{gperf}. - -By default, @code{gperf} attempts to produce time-efficient code, with -less emphasis on efficient space utilization. However, several options -exist that permit trading-off execution time for storage space and vice -versa. In particular, expanding the generated table size produces a -sparse search structure, generally yielding faster searches. -Conversely, you can direct @code{gperf} to utilize a C @code{switch} -statement scheme that minimizes data space storage size. Furthermore, -using a C @code{switch} may actually speed up the keyword retrieval time -somewhat. Actual results depend on your C compiler, of course. - -In general, @code{gperf} assigns values to the characters it is using -for hashing until some set of values gives each keyword a unique value. -A helpful heuristic is that the larger the hash value range, the easier -it is for @code{gperf} to find and generate a perfect hash function. -Experimentation is the key to getting the most from @code{gperf}. - -@node Input Format, Output Format, Description, Description -@section Input Format to @code{gperf} - -You can control the input keyfile format by varying certain command-line -arguments, in particular the @samp{-t} option. The input's appearance -is similar to GNU utilities @code{flex} and @code{bison} (or UNIX -utilities @code{lex} and @code{yacc}). Here's an outline of the general -format: - -@example -@group -declarations -%% -keywords -%% -functions -@end group -@end example - -@emph{Unlike} @code{flex} or @code{bison}, all sections of @code{gperf}'s input -are optional. The following sections describe the input format for each -section. - -@menu -* Declarations:: @code{struct} Declarations and C Code Inclusion. -* Keywords:: Format for Keyword Entries. -* Functions:: Including Additional C Functions. -@end menu - -@node Declarations, Keywords, Input Format, Input Format -@subsection @code{struct} Declarations and C Code Inclusion - -The keyword input file optionally contains a section for including -arbitrary C declarations and definitions, as well as provisions for -providing a user-supplied @code{struct}. If the @samp{-t} option -@emph{is} enabled, you @emph{must} provide a C @code{struct} as the last -component in the declaration section from the keyfile file. The first -field in this struct must be a @code{char *} identifier called ``name,'' -although it is possible to modify this field's name with the @samp{-K} -option described below. - -Here is simple example, using months of the year and their attributes as -input: - -@example -@group -struct months @{ char *name; int number; int days; int leap_days; @}; -%% -january, 1, 31, 31 -february, 2, 28, 29 -march, 3, 31, 31 -april, 4, 30, 30 -may, 5, 31, 31 -june, 6, 30, 30 -july, 7, 31, 31 -august, 8, 31, 31 -september, 9, 30, 30 -october, 10, 31, 31 -november, 11, 30, 30 -december, 12, 31, 31 -@end group -@end example - -Separating the @code{struct} declaration from the list of key words and -other fields are a pair of consecutive percent signs, @code{%%}, -appearing left justified in the first column, as in the UNIX utility -@code{lex}. - -Using a syntax similar to GNU utilities @code{flex} and @code{bison}, it -is possible to directly include C source text and comments verbatim into -the generated output file. This is accomplished by enclosing the region -inside left-justified surrounding @code{%@{}, @code{%@}} pairs. Here is -an input fragment based on the previous example that illustrates this -feature: - -@example -@group -%@{ -#include <assert.h> -/* This section of code is inserted directly into the output. */ -int return_month_days (struct months *months, int is_leap_year); -%@} -struct months @{ char *name; int number; int days; int leap_days; @}; -%% -january, 1, 31, 31 -february, 2, 28, 29 -march, 3, 31, 31 -... -@end group -@end example - -It is possible to omit the declaration section entirely. In this case -the keyfile begins directly with the first keyword line, @emph{e.g.}: - -@example -@group -january, 1, 31, 31 -february, 2, 28, 29 -march, 3, 31, 31 -april, 4, 30, 30 -... -@end group -@end example - -@node Keywords, Functions, Declarations, Input Format -@subsection Format for Keyword Entries - -The second keyfile format section contains lines of keywords and any -associated attributes you might supply. A line beginning with @samp{#} -in the first column is considered a comment. Everything following the -@samp{#} is ignored, up to and including the following newline. - -The first field of each non-comment line is always the key itself. It -should be given as a simple name, @emph{i.e.}, without surrounding -string quotation marks, and be left-justified flush against the first -column. In this context, a ``field'' is considered to extend up to, but -not include, the first blank, comma, or newline. Here is a simple -example taken from a partial list of C reserved words: - -@example -@group -# These are a few C reserved words, see the c.@code{gperf} file -# for a complete list of ANSI C reserved words. -unsigned -sizeof -switch -signed -if -default -for -while -return -@end group -@end example - -Note that unlike @code{flex} or @code{bison} the first @code{%%} marker -may be elided if the declaration section is empty. - -Additional fields may optionally follow the leading keyword. Fields -should be separated by commas, and terminate at the end of line. What -these fields mean is entirely up to you; they are used to initialize the -elements of the user-defined @code{struct} provided by you in the -declaration section. If the @samp{-t} option is @emph{not} enabled -these fields are simply ignored. All previous examples except the last -one contain keyword attributes. - -@node Functions, , Keywords, Input Format -@subsection Including Additional C Functions - -The optional third section also corresponds closely with conventions -found in @code{flex} and @code{bison}. All text in this section, -starting at the final @code{%%} and extending to the end of the input -file, is included verbatim into the generated output file. Naturally, -it is your responsibility to ensure that the code contained in this -section is valid C. - -@node Output Format, , Input Format, Description -@section Output Format for Generated C Code with @code{gperf} - -Several options control how the generated C code appears on the standard -output. Two C function are generated. They are called @code{hash} and -@code{in_word_set}, although you may modify the name for -@code{in_word_set} with a command-line option. Both functions require -two arguments, a string, @code{char *} @var{str}, and a length -parameter, @code{int} @var{len}. Their default function prototypes are -as follows: - -@example -@group -static int hash (char *str, int len); -int in_word_set (char *str, int len); -@end group -@end example - -By default, the generated @code{hash} function returns an integer value -created by adding @var{len} to several user-specified @var{str} key -positions indexed into an @dfn{associated values} table stored in a -local static array. The associated values table is constructed -internally by @code{gperf} and later output as a static local C array called -@var{hash_table}; its meaning and properties are described below. -@xref{Implementation}. The relevant key positions are specified via the -@samp{-k} option when running @code{gperf}, as detailed in the @emph{Options} -section below. @xref{Options}. - -Two options, @samp{-g} (assume you are compiling with GNU C and its -@code{inline} feature) and @samp{-a} (assume ANSI C-style function -prototypes), alter the content of both the generated @code{hash} and -@code{in_word_set} routines. However, function @code{in_word_set} may -be modified more extensively, in response to your option settings. The -options that affect the @code{in_word_set} structure are: - -@itemize @bullet -@table @samp -@item -p -Have function @code{in_word_set} return a pointer rather than a boolean. - -@item -t -Make use of the user-defined @code{struct}. - -@item -S @var{total switch statements} -Generate 1 or more C @code{switch} statement rather than use a large, -(and potentially sparse) static array. Although the exact time and -space savings of this approach vary according to your C compiler's -degree of optimization, this method often results in smaller and faster -code. -@end table -@end itemize - -If the @samp{-t}, @samp{-S}, and @samp{-p} options are omitted the -default action is to generate a @code{char *} array containing the keys, -together with additional null strings used for padding the array. By -experimenting with the various input and output options, and timing the -resulting C code, you can determine the best option choices for -different keyword set characteristics. - -@node Options, Bugs, Description, Top -@chapter Options to the @code{gperf} Utility - -There are @emph{many} options to @code{gperf}. They were added to make -the program more convenient for use with real applications. ``On-line'' -help is readily available via the @samp{-h} option. Other options -include: - -@itemize @bullet -@table @samp -@item -a -Generate ANSI Standard C code using function prototypes. The default is -to use ``classic'' K&R C function declaration syntax. - -@item -c -Generates C code that uses the @code{strncmp} function to perform -string comparisons. The default action is to use @code{strcmp}. - -@item -C -Makes the contents of all generated lookup tables constant, @emph{i.e.}, -``readonly.'' Many compilers can generate more efficient code for this -by putting the tables in readonly memory. - -@item -d -Enables the debugging option. This produces verbose diagnostics to -``standard error'' when @code{gperf} is executing. It is useful both for -maintaining the program and for determining whether a given set of -options is actually speeding up the search for a solution. Some useful -information is dumped at the end of the program when the @samp{-d} -option is enabled. - -@item -D -Handle keywords whose key position sets hash to duplicate values. -Duplicate hash values occur for two reasons: - -@itemize @bullet -@item -Since @code{gperf} does not backtrack it is possible for it to process -all your input keywords without finding a unique mapping for each word. -However, frequently only a very small number of duplicates occur, and -the majority of keys still require one probe into the table. -@item -Sometimes a set of keys may have the same names, but possess different -attributes. With the -D option @code{gperf} treats all these keys as part of -an equivalence class and generates a perfect hash function with multiple -comparisons for duplicate keys. It is up to you to completely -disambiguate the keywords by modifying the generated C code. However, -@code{gperf} helps you out by organizing the output. -@end itemize - -Option @samp{-D} is extremely useful for certain large or highly -redundant keyword sets, @emph{i.e.}, assembler instruction opcodes. -Using this option usually means that the generated hash function is no -longer perfect. On the other hand, it permits @code{gperf} to work on -keyword sets that it otherwise could not handle. - -@item -e @var{keyword delimiter list} -Allows the user to provide a string containing delimiters used to -separate keywords from their attributes. The default is ",\n". This -option is essential if you want to use keywords that have embedded -commas or newlines. One useful trick is to use -e'TAB', where TAB is -the literal tab character. - -@item -E -Define constant values using an enum local to the lookup function rather -than with #defines. This also means that different lookup functions can -reside in the same file. Thanks to James Clark (jjc at ai.mit.edu). - -@item -f @var{iteration amount} -Generate the perfect hash function ``fast.'' This decreases @code{gperf}'s -running time at the cost of minimizing generated table-size. The -iteration amount represents the number of times to iterate when -resolving a collision. `0' means `iterate by the number of keywords. -This option is probably most useful when used in conjunction with options -@samp{-D} and/or @samp{-S} for @emph{large} keyword sets. - -@item -g -Assume a GNU compiler, @emph{e.g.}, @code{g++} or @code{gcc}. This -makes all generated routines use the ``inline'' keyword to remove the -cost of function calls. Note that @samp{-g} does @emph{not} imply -@samp{-a}, since other non-ANSI C compilers may have provisions for a -function @code{inline} feature. - -@item -G -Generate the static table of keywords as a static global variable, -rather than hiding it inside of the lookup function (which is the -default behavior). - -@item -h -Prints a short summary on the meaning of each program option. Aborts -further program execution. - -@item -H @var{hash function name} -Allows you to specify the name for the generated hash function. Default -name is `hash.' This option permits the use of two hash tables in the -same file. - -@item -i @var{initial value} -Provides an initial @var{value} for the associate values array. Default -is 0. Increasing the initial value helps inflate the final table size, -possibly leading to more time efficient keyword lookups. Note that this -option is not particularly useful when @samp{-S} is used. Also, -@samp{-i} is overriden when the @samp{-r} option is used. - -@item -j @var{jump value} -Affects the ``jump value,'' @emph{i.e.}, how far to advance the -associated character value upon collisions. @var{Jump value} is rounded -up to an odd number, the default is 5. If the @var{jump value} is 0 @code{gper -f} -jumps by random amounts. - -@item -k @var{keys} -Allows selection of the character key positions used in the keywords' -hash function. The allowable choices range between 1-126, inclusive. -The positions are separated by commas, @emph{e.g.}, @samp{-k 9,4,13,14}; -ranges may be used, @emph{e.g.}, @samp{-k 2-7}; and positions may occur -in any order. Furthermore, the meta-character '*' causes the generated -hash function to consider @strong{all} character positions in each key, -whereas '$' instructs the hash function to use the ``final character'' -of a key (this is the only way to use a character position greater than -126, incidentally). - -For instance, the option @samp{-k 1,2,4,6-10,'$'} generates a hash -function that considers positions 1,2,4,6,7,8,9,10, plus the last -character in each key (which may differ for each key, obviously). Keys -with length less than the indicated key positions work properly, since -selected key positions exceeding the key length are simply not -referenced in the hash function. - -@item -K @var{key name} -By default, the program assumes the structure component identifier for -the keyword is ``name.'' This option allows an arbitrary choice of -identifier for this component, although it still must occur as the first -field in your supplied @code{struct}. - -@item -l -Compare key lengths before trying a string comparison. This might cut -down on the number of string comparisons made during the lookup, since -keys with different lengths are never compared via @code{strcmp}. -However, using @samp{-l} might greatly increase the size of the -generated C code if the lookup table range is large (which implies that -the switch option @samp{-S} is not enabled), since the length table -contains as many elements as there are entries in the lookup table. - -@item -L @var{generated language name} -Instructs @code{gperf} to generate code in the language specified by the -option's argument. Languages handled are currently C++ and C. The -default is C. - -@item -n -Instructs the generator not to include the length of a keyword when -computing its hash value. This may save a few assembly instructions in -the generated lookup table. - -@item -N @var{lookup function name} -Allows you to specify the name for the generated lookup function. -Default name is `in_word_set.' This option permits completely automatic -generation of perfect hash functions, especially when multiple generated -hash functions are used in the same application. - -@item -o -Reorders the keywords by sorting the keywords so that frequently -occuring key position set components appear first. A second reordering -pass follows so that keys with ``already determined values'' are placed -towards the front of the keylist. This may decrease the time required -to generate a perfect hash function for many keyword sets, and also -produce more minimal perfect hash functions. The reason for this is -that the reordering helps prune the search time by handling inevitable -collisions early in the search process. On the other hand, if the -number of keywords is @emph{very} large using @samp{-o} may -@emph{increase} @code{gperf}'s execution time, since collisions will begin -earlier and continue throughout the remainder of keyword processing. -See Cichelli's paper from the January 1980 Communications of the ACM for -details. - -@item -p -Changes the return value of the generated function @code{in_word_set} -from boolean (@emph{i.e.}, 0 or 1), to either type ``pointer to -user-defined struct,'' (if the @samp{-t} option is enabled), or simply -to @code{char *}, if @samp{-t} is not enabled. This option is most -useful when the @samp{-t} option (allowing user-defined structs) is -used. For example, it is possible to automatically generate the GNU C -reserved word lookup routine with the options @samp{-p} and @samp{-t}. - -@item -r -Utilizes randomness to initialize the associated values table. This -frequently generates solutions faster than using deterministic -initialization (which starts all associated values at 0). Furthermore, -using the randomization option generally increases the size of the -table. If @code{gperf} has difficultly with a certain keyword set try using -@samp{-r} or @samp{-D}. - -@item -s @var{size-multiple} -Affects the size of the generated hash table. The numeric argument for -this option indicates ``how many times larger or smaller'' the maximum -associated value range should be, in relationship to the number of keys. -If the @var{size-multiple} is negative the maximum associated value is -calculated by @emph{dividing} it into the total number of keys. For -example, a value of 3 means ``allow the maximum associated value to be -about 3 times larger than the number of input keys.'' - -Conversely, a value of -3 means ``allow the maximum associated value to -be about 3 times smaller than the number of input keys.'' Negative -values are useful for limiting the overall size of the generated hash -table, though this usually increases the number of duplicate hash -values. - -If `generate switch' option @samp{-S} is @emph{not} enabled, the maximum -associated value influences the static array table size, and a larger -table should decrease the time required for an unsuccessful search, at -the expense of extra table space. - -The default value is 1, thus the default maximum associated value about -the same size as the number of keys (for efficiency, the maximum -associated value is always rounded up to a power of 2). The actual -table size may vary somewhat, since this technique is essentially a -heuristic. In particular, setting this value too high slows down -@code{gperf}'s runtime, since it must search through a much larger range -of values. Judicious use of the @samp{-f} option helps alleviate this -overhead, however. - -@item -S @var{total switch statements} -Causes the generated C code to use a @code{switch} statement scheme, -rather than an array lookup table. This can lead to a reduction in both -time and space requirements for some keyfiles. The argument to this -option determines how many @code{switch} statements are generated. A -value of 1 generates 1 @code{switch} containing all the elements, a -value of 2 generates 2 tables with 1/2 the elements in each -@code{switch}, etc. This is useful since many C compilers cannot -correctly generate code for large @code{switch} statements. This option -was inspired in part by Keith Bostic's original C program. - -@item -t -Allows you to include a @code{struct} type declaration for generated -code. Any text before a pair of consecutive %% is consider part of the -type declaration. Key words and additional fields may follow this, one -group of fields per line. A set of examples for generating perfect hash -tables and functions for Ada, C, and G++, Pascal, and Modula 2 and 3 -reserved words are distributed with this release. - -@item -T -Prevents the transfer of the type declaration to the output file. Use -this option if the type is already defined elsewhere. - -@item -v -Prints out the current version number. - -@item -Z @var{class name} -Allow user to specify name of generated C++ class. Default name is -@code{Perfect_Hash}. -@end table -@end itemize - -@node Bugs, Projects, Options, Top -@chapter Known Bugs and Limitations with @code{gperf} - -The following are some limitations with the current release of -@code{gperf}: - -@itemize @bullet -@item -The @code{gperf} utility is tuned to execute quickly, and works quickly -for small to medium size data sets (around 1000 keywords). It is -extremely useful for maintaining perfect hash functions for compiler -keyword sets. Several recent enhancements now enable @code{gperf} to -work efficiently on much larger keyword sets (over 15,000 keywords). -When processing large keyword sets it helps greatly to have over 8 megs -of RAM. - -However, since @code{gperf} does not backtrack no guaranteed solution -occurs on every run. On the other hand, it is usually easy to obtain a -solution by varying the option parameters. In particular, try the -@samp{-r} option, and also try changing the default arguments to the -@samp{-s} and @samp{-j} options. To @emph{guarantee} a solution, use -the @samp{-D} and @samp{-S} options, although the final results are not -likely to be a @emph{perfect} hash function anymore! Finally, use the -@samp{-f} option if you want @code{gperf} to generate the perfect hash -function @emph{fast}, with less emphasis on making it minimal. - -@item -The size of the generate static keyword array can get @emph{extremely} -large if the input keyword file is large or if the keywords are quite -similar. This tends to slow down the compilation of the generated C -code, and @emph{greatly} inflates the object code size. If this -situation occurs, consider using the @samp{-S} option to reduce data -size, potentially increasing keyword recognition time a negligible -amount. Since many C compilers cannot correctly generated code for -large switch statements it is important to qualify the @var{-S} option -with an appropriate numerical argument that controls the number of -switch statements generated. - -@item -The maximum number of key positions selected for a given key has an -arbitrary limit of 126. This restriction should be removed, and if -anyone considers this a problem write me and let me know so I can remove -the constraint. - -@item -The C++ source code only compiles correctly with GNU G++, version 1.36 -(and hopefully later versions). Porting to AT&T cfront would be -tedious, but possible (and desirable). There is also a K&R C version -available now. This should compile without change on most BSD systems, -but may require a bit of work to run on SYSV, since @code{gperf} uses -@var{alloca} in several places. Send mail to schmidt at ics.uci.edu for -information. -@end itemize - -@node Projects, Implementation, Bugs, Top -@chapter Things Still Left to Do - -It should be ``relatively'' easy to replace the current perfect hash -function algorithm with a more exhaustive approach; the perfect hash -module is essential independent from other program modules. Additional -worthwhile improvements include: - -@itemize @bullet -@item -Make the algorithm more robust. At present, the program halts with an -error diagnostic if it can't find a direct solution and the @samp{-D} -option is not enabled. A more comprehensive, albeit computationally -expensive, approach would employ backtracking or enable alternative -options and retry. It's not clear how helpful this would be, in -general, since most search sets are rather small in practice. - -@item -Another useful extension involves modifying the program to generate -``minimal'' perfect hash functions (under certain circumstances, the -current version can be rather extravagant in the generated table size). -Again, this is mostly of theoretical interest, since a sparse table -often produces faster lookups, and use of the @samp{-S} @code{switch} -option can minimize the data size, at the expense of slightly longer -lookups (note that the gcc compiler generally produces good code for -@code{switch} statements, reducing the need for more complex schemes). - -@item -In addition to improving the algorithm, it would also be useful to -generate a C++ class or Ada package as the code output, in addition to -the current C routines. -@end itemize - -@node Implementation, Bibliography, Projects, Top -@chapter Implementation Details of GNU @code{gperf} - -A paper describing the high-level description of the data structures and -algorithms used to implement @code{gperf} will soon be available. This -paper is useful not only from a maintenance and enhancement perspective, -but also because they demonstrate several clever and useful programming -techniques, @emph{e.g.}, `Iteration Number' boolean arrays, double -hashing, a ``safe'' and efficient method for reading arbitrarily long -input from a file, and a provably optimal algorithm for simultaneously -determining both the minimum and maximum elements in a list. - -@page - -@node Bibliography, , Implementation, Top -@chapter Bibliography - -[1] Chang, C.C.: @i{A Scheme for Constructing Ordered Minimal Perfect -Hashing Functions} Information Sciences 39(1986), 187-195. - -[2] Cichelli, Richard J. @i{Author's Response to ``On Cichelli's Minimal Perfec -t Hash -Functions Method''} Communications of the ACM, 23, 12(December 1980), 729. - -[3] Cichelli, Richard J. @i{Minimal Perfect Hash Functions Made Simple} -Communications of the ACM, 23, 1(January 1980), 17-19. - -[4] Cook, C. R. and Oldehoeft, R.R. @i{A Letter Oriented Minimal -Perfect Hashing Function} SIGPLAN Notices, 17, 9(September 1982), 18-27. - -[5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M. -@i{Practical Perfect Hashing} Computer Journal, 28, 1(January 1985), 54-58. - -[6] Jaeschke, G. @i{Reciprocal Hashing: A Method for Generating Minimal -Perfect Hashing Functions} Communications of the ACM, 24, 12(December -1981), 829-833. - -[7] Jaeschke, G. and Osterburg, G. @i{On Cichelli's Minimal Perfect -Hash Functions Method} Communications of the ACM, 23, 12(December 1980), -728-729. - -[8] Sager, Thomas J. @i{A Polynomial Time Generator for Minimal Perfect -Hash Functions} Communications of the ACM, 28, 5(December 1985), 523-532 - -[9] Schmidt, Douglas C. @i{GPERF: A Perfect Hash Function Generator} -Second USENIX C++ Conference Proceedings, April 1990. - -[10] Sebesta, R.W. and Taylor, M.A. @i{Minimal Perfect Hash Functions -for Reserved Word Lists} SIGPLAN Notices, 20, 12(September 1985), 47-53. - -[11] Sprugnoli, R. @i{Perfect Hashing Functions: A Single Probe -Retrieving Method for Static Sets} Communications of the ACM, 20 -11(November 1977), 841-850. - -[12] Stallman, Richard M. @i{Using and Porting GNU CC} Free Software Foundation, -1988. - -[13] Stroustrup, Bjarne @i{The C++ Programming Language.} Addison-Wesley, 1986. - -[14] Tiemann, Michael D. @i{User's Guide to GNU C++} Free Software -Foundation, 1989. - -@contents -@bye diff --git a/apps/gperf/src/Bool_Array.cpp b/apps/gperf/src/Bool_Array.cpp deleted file mode 100644 index f308c08c24c..00000000000 --- a/apps/gperf/src/Bool_Array.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* Fast lookup table abstraction implemented as an Iteration Number Array -// $Id$ - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "Bool_Array.h" - -// Prints out debugging diagnostics. - -Bool_Array::~Bool_Array (void) -{ - if (option[DEBUG]) - fprintf (stderr, "\ndumping boolean array information\n" - "size = %d\niteration number = %d\nend of array dump\n", - size, generation_number); -} - -Bool_Array::Bool_Array (void) - : storage_array (0), - generation_number (0), - size (0) -{ -} - -void -Bool_Array::init (STORAGE_TYPE *buffer, STORAGE_TYPE s) -{ - size = s; - generation_number = 1; - storage_array = buffer; - - memset (storage_array, 0, s * sizeof *storage_array); - - if (option[DEBUG]) - fprintf (stderr, "\nbool array size = %d, total bytes = %d\n", - size, size * sizeof *storage_array); -} - -int -Bool_Array::find (int index) -{ - if (storage_array[index] == generation_number) - return 1; - else - { - storage_array[index] = generation_number; - return 0; - } -} - -void -Bool_Array::reset (void) -{ - if (++generation_number == 0) - { - if (option[DEBUG]) - { - fprintf (stderr, "(re-initializing bool_array)..."); - fflush (stderr); - } - - generation_number = 1; - memset (storage_array, 0, size * sizeof *storage_array); - - if (option[DEBUG]) - { - fprintf (stderr, "done\n"); - fflush (stderr); - } - } -} - diff --git a/apps/gperf/src/Bool_Array.h b/apps/gperf/src/Bool_Array.h deleted file mode 100644 index 0a2757dbc8e..00000000000 --- a/apps/gperf/src/Bool_Array.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Simple lookup table abstraction implemented as an Generation Number Array. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/ - -/* Define and implement a simple boolean array abstraction, - uses an Generation Numbering implementation to save on initialization time. */ - -#ifndef bool_array_h -#define bool_array_h 1 - -#include "Options.h" - -#ifdef LO_CAL -/* If we are on a memory diet then we'll only make these use a limited - amount of storage space. */ -typedef u_short STORAGE_TYPE; -#else -typedef int STORAGE_TYPE; -#endif - -class Bool_Array -{ -public: - Bool_Array (void); - ~Bool_Array (void); - - void init (STORAGE_TYPE *buffer, STORAGE_TYPE s); - int find (int hash_value); - void reset (void); - -private: - STORAGE_TYPE *storage_array; - // Initialization of the index space. - - STORAGE_TYPE generation_number; - // Keep track of the current Generation. - - int size; - // Keep track of array size. -}; - - -#endif diff --git a/apps/gperf/src/Gen_Perf.cpp b/apps/gperf/src/Gen_Perf.cpp deleted file mode 100644 index 57418ccc047..00000000000 --- a/apps/gperf/src/Gen_Perf.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/* Provides high-level routines to manipulate the keywork list -// $Id$ - - structures the code generation output. - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "Vectors.h" -#include "Gen_Perf.h" - -/* Current release version. */ -extern char *version_string; - -/* Reads input keys, possibly applies the reordering heuristic, sets - the maximum associated value size (rounded up to the nearest power - of 2), may initialize the associated values array, and determines - the maximum hash table size. Note: using the random numbers is - often helpful, though not as deterministic, of course! */ - -Gen_Perf::Gen_Perf (void) -{ - int asso_value_max; - int non_linked_length; - - this->key_list.read_keys (); - if (option[ORDER]) - this->key_list.reorder (); - asso_value_max = option.get_asso_max (); - non_linked_length = this->key_list.keyword_list_length (); - num_done = 1; - fewest_collisions = 0; - if (asso_value_max == 0) - asso_value_max = non_linked_length; - else if (asso_value_max > 0) - asso_value_max *= non_linked_length; - else /* if (asso_value_max < 0) */ - asso_value_max = non_linked_length / -asso_value_max; - option.set_asso_max (ACE_POW (asso_value_max)); - - if (option[RANDOM]) - { - srand (time (0)); - - for (int i = 0; i < ALPHA_SIZE; i++) - Vectors::asso_values[i] = (rand () & asso_value_max - 1); - } - else - { - int asso_value = option.initial_value (); - - if (asso_value) /* Initialize array if user requests non-zero default. */ - for (int i = ALPHA_SIZE - 1; i >= 0; i--) - Vectors::asso_values[i] = asso_value & option.get_asso_max () - 1; - } - max_hash_value = this->key_list.max_key_length () + option.get_asso_max () * - option.get_max_keysig_size (); - - printf ("/* "); - if (option[C]) - printf ("C"); - else if (option[CPLUSPLUS]) - printf ("C++"); - printf (" code produced by gperf version %s */\n", version_string); - Options::print_options (); - - if (option[DEBUG]) - fprintf (stderr, "total non-linked keys = %d\nmaximum associated value is %d" - "\nmaximum size of generated hash table is %d\n", - non_linked_length, asso_value_max, max_hash_value); -} - -/* Merge two disjoint hash key multisets to form the ordered disjoint union of the sets. - (In a multiset, an element can occur multiple times). - Precondition: both set_1 and set_2 must be ordered. Returns the length - of the combined set. */ - -inline int -Gen_Perf::compute_disjoint_union (char *set_1, char *set_2, char *set_3) -{ - char *base = set_3; - - while (*set_1 && *set_2) - if (*set_1 == *set_2) - set_1++, set_2++; - else - { - *set_3 = *set_1 < *set_2 ? *set_1++ : *set_2++; - if (set_3 == base || *set_3 != *(set_3-1)) set_3++; - } - - while (*set_1) - { - *set_3 = *set_1++; - if (set_3 == base || *set_3 != *(set_3-1)) set_3++; - } - - while (*set_2) - { - *set_3 = *set_2++; - if (set_3 == base || *set_3 != *(set_3-1)) set_3++; - } - *set_3 = '\0'; - return set_3 - base; -} - -/* Sort the UNION_SET in increasing frequency of occurrence. - This speeds up later processing since we may assume the resulting - set (Set_3, in this case), is ordered. Uses insertion sort, since - the UNION_SET is typically short. */ - -inline void -Gen_Perf::sort_set (char *union_set, int len) -{ - int i, j; - - for (i = 0, j = len - 1; i < j; i++) - { - char curr, tmp; - - for (curr = i + 1, tmp = union_set[curr]; - curr > 0 && Vectors::occurrences[tmp] < Vectors::occurrences[union_set[curr-1]]; - curr--) - union_set[curr] = union_set[curr - 1]; - - union_set[curr] = tmp; - } -} - -/* Generate a key set's hash value. */ - -inline int -Gen_Perf::hash (List_Node *key_node) -{ - int sum = option[NOLENGTH] ? 0 : key_node->length; - - for (char *ptr = key_node->char_set; *ptr; ptr++) - sum += Vectors::asso_values[*ptr]; - - return key_node->hash_value = sum; -} - -/* Find out how character value change affects successfully hashed - items. Returns FALSE if no other hash values are affected, else - returns TRUE. Note that because Option.Get_Asso_Max is a power of - two we can guarantee that all legal Vectors::Asso_Values are visited without - repetition since Option.Get_Jump was forced to be an odd value! */ - -inline int -Gen_Perf::affects_prev (char c, List_Node *curr) -{ - int original_char = Vectors::asso_values[c]; - int total_iterations = !option[FAST] - ? option.get_asso_max () : option.get_iterations () ? option.get_iterations () : this->key_list.keyword_list_length (); - - /* Try all legal associated values. */ - - for (int i = total_iterations - 1; i >= 0; i--) - { - int collisions = 0; - - Vectors::asso_values[c] = Vectors::asso_values[c] + (option.get_jump () ? option.get_jump () : rand ()) - & option.get_asso_max () - 1; - - /* Iteration Number array is a win, O(1) intialization time! */ - this->char_search.reset (); - - /* See how this asso_value change affects previous keywords. If - it does better than before we'll take it! */ - - for (List_Node *ptr = this->key_list.head; - !this->char_search.find (hash (ptr)) || ++collisions < fewest_collisions; - ptr = ptr->next) - if (ptr == curr) - { - fewest_collisions = collisions; - if (option[DEBUG]) - fprintf (stderr, "- resolved after %d iterations", total_iterations - i); - return 0; - } - } - - /* Restore original values, no more tries. */ - Vectors::asso_values[c] = original_char; - /* If we're this far it's time to try the next character.... */ - return 1; -} - -/* Change a character value, try least-used characters first. */ - -void -Gen_Perf::change (List_Node *prior, List_Node *curr) -{ - static char *union_set; - - if (!union_set) - union_set = new char [2 * option.get_max_keysig_size () + 1]; - - if (option[DEBUG]) - { - fprintf (stderr, "collision on keyword #%d, prior = \"%s\", curr = \"%s\" hash = %d\n", - num_done, prior->key, curr->key, curr->hash_value); - fflush (stderr); - } - sort_set (union_set, compute_disjoint_union (prior->char_set, curr->char_set, union_set)); - - /* Try changing some values, if change doesn't alter other values continue normal action. */ - fewest_collisions++; - - for (char *temp = union_set; *temp; temp++) - if (!affects_prev (*temp, curr)) - { - if (option[DEBUG]) - { - fprintf (stderr, " by changing asso_value['%c'] (char #%d) to %d\n", - *temp, temp - union_set + 1, Vectors::asso_values[*temp]); - fflush (stderr); - } - return; /* Good, doesn't affect previous hash values, we'll take it. */ - } - - for (List_Node *ptr = this->key_list.head; ptr != curr; ptr = ptr->next) - hash (ptr); - - hash (curr); - - if (option[DEBUG]) - { - fprintf (stderr, "** collision not resolved after %d iterations, %d duplicates remain, continuing...\n", - !option[FAST] ? option.get_asso_max () : option.get_iterations () ? option.get_iterations () : this->key_list.keyword_list_length (), - fewest_collisions + this->key_list.total_duplicates); - fflush (stderr); - } -} - -/* Does the hard stuff.... - Initializes the Iteration Number array, and attempts to find a perfect - function that will hash all the key words without getting any - duplications. This is made much easier since we aren't attempting - to generate *minimum* functions, only perfect ones. - If we can't generate a perfect function in one pass *and* the user - hasn't enabled the DUP option, we'll inform the user to try the - randomization option, use -D, or choose alternative key positions. - The alternatives (e.g., back-tracking) are too time-consuming, i.e, - exponential in the number of keys. */ - -int -Gen_Perf::generate (void) -{ -#if LARGE_STACK_ARRAYS - STORAGE_TYPE buffer[max_hash_value + 1]; -#else - // Note: we don't use new, because that invokes a custom operator new. - STORAGE_TYPE *buffer - = (STORAGE_TYPE*) malloc (sizeof(STORAGE_TYPE) * (max_hash_value + 1)); - if (buffer == NULL) - abort (); -#endif - - this->char_search.init (buffer, max_hash_value + 1); - - List_Node *curr; - - for (curr = this->key_list.head; - curr; - curr = curr->next) - { - hash (curr); - - for (List_Node *ptr = this->key_list.head; - ptr != curr; - ptr = ptr->next) - if (ptr->hash_value == curr->hash_value) - { - change (ptr, curr); - break; - } - num_done++; - } - - /* Make one final check, just to make sure nothing weird happened.... */ - - this->char_search.reset (); - - for (curr = this->key_list.head; - curr; - curr = curr->next) - if (this->char_search.find (hash (curr))) - if (option[DUP]) /* Keep track of this number... */ - this->key_list.total_duplicates++; - else /* Yow, big problems. we're outta here! */ - { - ACE_ERROR ((LM_ERROR, "\nInternal error, duplicate value %d:\n" - "try options -D or -r, or use new key positions.\n\n", hash (curr))); -#if !LARGE_STACK_ARRAYS - free (buffer); -#endif - return 1; - } - - /* Sorts the key word list by hash value, and then outputs the list. - The generated hash table code is only output if the early stage of - processing turned out O.K. */ - - this->key_list.sort (); - this->key_list.output (); -#if !LARGE_STACK_ARRAYS - free (buffer); -#endif - return 0; -} - -/* Prints out some diagnostics upon completion. */ - -Gen_Perf::~Gen_Perf (void) -{ - if (option[DEBUG]) - { - fprintf (stderr, "\ndumping occurrence and associated values tables\n"); - - for (int i = 0; i < ALPHA_SIZE; i++) - if (Vectors::occurrences[i]) - fprintf (stderr, "Vectors::asso_values[%c] = %6d, Vectors::occurrences[%c] = %6d\n", - i, Vectors::asso_values[i], i, Vectors::occurrences[i]); - - fprintf (stderr, "end table dumping\n"); - - } -} - diff --git a/apps/gperf/src/Gen_Perf.h b/apps/gperf/src/Gen_Perf.h deleted file mode 100644 index 50d2ab95c0f..00000000000 --- a/apps/gperf/src/Gen_Perf.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Provides high-level routines to manipulate the keyword list - structures the code generation output. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#ifndef gen_perf_h -#define gen_perf_h 1 - -#include "Options.h" -#include "Key_List.h" -#include "Bool_Array.h" - -class Gen_Perf -{ -public: - Gen_Perf (void); - ~Gen_Perf (void); - int generate (void); - -private: - void change (List_Node *prior, List_Node *curr); - int affects_prev (char c, List_Node *curr); - static int hash (List_Node *key_node); - static int compute_disjoint_union (char *set_1, char *set_2, char *set_3); - static void sort_set (char *union_set, int len); - - int max_hash_value; - // Maximum possible hash value. - - int fewest_collisions; - // Records fewest # of collisions for asso value. - - int num_done; - // Number of keywords processed without a collision. - - Bool_Array char_search; - // Table that keeps track of key collisions. - - Key_List key_list; - // List of the keys we're trying to map into a perfect hash - // function. -}; -#endif diff --git a/apps/gperf/src/Hash_Table.cpp b/apps/gperf/src/Hash_Table.cpp deleted file mode 100644 index fa165715abc..00000000000 --- a/apps/gperf/src/Hash_Table.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* Hash table for checking keyword links. Implemented using double hashing. -// $Id$ - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "ace/ACE.h" -#include "Hash_Table.h" - -#define NIL(TYPE) (TYPE *)0 - -// The size of the hash table is always the smallest power of 2 >= the -// size indicated by the user. This allows several optimizations, -// including the use of double hashing and elimination of the mod -// instruction. Note that the size had better be larger than the -// number of items in the hash table, else there's trouble!!! Note -// that the memory for the hash table is allocated *outside* the -// intialization routine. This compromises information hiding -// somewhat, but greatly reduces memory fragmentation, since we can -// now use alloca! - -Hash_Table::Hash_Table (List_Node **table_ptr, int s) - : collisions (0), - size (s), - table (table_ptr) -{ - memset ((char *) table, 0, size * sizeof *table); -} - -Hash_Table::~Hash_Table (void) -{ - if (option[DEBUG]) - { - int field_width = option.get_max_keysig_size (); - - fprintf (stderr, "\ndumping the hash table\ntotal available table slots = %d, total bytes = %d, total collisions = %d\n" - "location, %*s, keyword\n", size, size * sizeof *table, collisions, field_width, "keysig"); - - for (int i = size - 1; i >= 0; i--) - if (table[i]) - fprintf (stderr, "%8d, %*s, %s\n", - i, field_width, table[i]->char_set, table[i]->key); - - fprintf (stderr, "\nend dumping hash table\n\n"); - } -} - -// If the ITEM is already in the hash table return the item found in -// the table. Otherwise inserts the ITEM, and returns FALSE. Uses -// double hashing. - -List_Node * -Hash_Table::operator() (List_Node *item, int ignore_length) -{ - unsigned hash_val = ACE::hash_pjw (item->char_set); - int probe = hash_val & size - 1; - int increment = (hash_val ^ item->length | 1) & size - 1; - - while (table[probe] - && (strcmp (table[probe]->char_set, item->char_set) - || (!ignore_length && table[probe]->length != item->length))) - { - collisions++; - probe = probe + increment & size - 1; - } - - return table[probe] ? table[probe] : (table[probe] = item, NIL (List_Node)); -} diff --git a/apps/gperf/src/Hash_Table.h b/apps/gperf/src/Hash_Table.h deleted file mode 100644 index 80cba1e9e34..00000000000 --- a/apps/gperf/src/Hash_Table.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Hash table used to check for duplicate keyword entries. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#ifndef hash_table_h -#define hash_table_h 1 - -#include "Options.h" -#include "List_Node.h" - -class Hash_Table -{ -public: - Hash_Table (List_Node **t, int s); - ~Hash_Table (void); - List_Node *operator () (List_Node *item, int ignore_length); - -private: - List_Node **table; - // Vector of pointers to linked lists of List_Node's. - - int size; - // Size of the vector. - - int collisions; - // Find out how well our double hashing is working! -}; -#endif diff --git a/apps/gperf/src/Iterator.cpp b/apps/gperf/src/Iterator.cpp deleted file mode 100644 index 94768115231..00000000000 --- a/apps/gperf/src/Iterator.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* Provides an Iterator for keyword characters. -// $Id$ - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "Iterator.h" - -// Constructor for Iterator. - -Iterator::Iterator (char *s, - int lo, - int hi, - int word_end, - int bad_val, - int key_end) - : end (key_end), - error_value (bad_val), - end_word (word_end), - str (s), - hi_bound (hi), - lo_bound (lo) -{ -} - -// Provide an Iterator, returning the ``next'' value from the list of -// valid values given in the constructor. - -int -Iterator::operator() (void) -{ - // Variables to record the Iterator's status when handling ranges, - // e.g., 3-12. - - static int size; - static int curr_value; - static int upper_bound; - - if (size) - { - if (++curr_value >= upper_bound) - size = 0; - return curr_value; - } - else - { - while (*str) - switch (*str) - { - default: return error_value; - case ',': str++; break; - case '$': str++; return end_word; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - for (curr_value = 0; isdigit (*str); str++) - curr_value = curr_value * 10 + *str - '0'; - - if (*str == '-') - { - - for (size = 1, upper_bound = 0; - isdigit (*++str); - upper_bound = upper_bound * 10 + *str - '0'); - - if (upper_bound <= curr_value || upper_bound > hi_bound) - return error_value; - } - return curr_value >= lo_bound && curr_value <= hi_bound - ? curr_value : error_value; - } - - return end; - } -} diff --git a/apps/gperf/src/Iterator.h b/apps/gperf/src/Iterator.h deleted file mode 100644 index d1fe416859d..00000000000 --- a/apps/gperf/src/Iterator.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Provides an Iterator for keyword characters. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* Provides an Iterator that expands and decodes a control string - containing digits and ranges, returning an integer every time the - generator function is called. This is used to decode the user's - key position requests. For example: "-k 1,2,5-10,$" will return 1, - 2, 5, 6, 7, 8, 9, 10, and 0 ( representing the abstract ``last - character of the key'' on successive calls to the member function - operator (). No errors are handled in these routines, they are - passed back to the calling routines via a user-supplied Error_Value */ - -#ifndef iterator_h -#define iterator_h 1 - -#include "Options.h" - -class Iterator -{ -public: - Iterator (char *s, int lo, int hi, int word_end, int bad_val, int key_end); - int operator () (void); - -private: - char *str; - // A pointer to the string provided by the user. - - int end; - // Value returned after last key is processed. - - int end_word; - // A value marking the abstract ``end of word'' (usually '$'). - - int error_value; - // Error value returned when input is syntactically erroneous. - - int hi_bound; - // Greatest possible value, inclusive. - - int lo_bound; - // Smallest possible value, inclusive. -}; - -#endif diff --git a/apps/gperf/src/Key_List.cpp b/apps/gperf/src/Key_List.cpp deleted file mode 100644 index c1009b3441c..00000000000 --- a/apps/gperf/src/Key_List.cpp +++ /dev/null @@ -1,1345 +0,0 @@ -/* Routines for building, ordering, and printing the keyword list. -// $Id$ - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "ace/Read_Buffer.h" -#include "Hash_Table.h" -#include "Vectors.h" -#include "Key_List.h" - -/* Make the hash table 10 times larger than the number of keyword entries. */ -static const int TABLE_MULTIPLE = 10; - -/* Default type for generated code. */ -static char *const default_array_type = "char *"; - -/* in_word_set return type, by default. */ -static char *const default_return_type = "char *"; - -/* How wide the printed field width must be to contain the maximum hash value. */ -static int field_width = 0; - -static int determined[ALPHA_SIZE]; - -/* Destructor dumps diagnostics during debugging. */ - -Key_List::~Key_List (void) -{ - if (option[DEBUG]) - { - fprintf (stderr, "\nDumping key list information:\ntotal non-static linked keywords = %d" - "\ntotal keywords = %d\ntotal duplicates = %d\nmaximum key length = %d\n", - list_len, total_keys, total_duplicates ? total_duplicates + 1 : 0, max_key_len); - dump (); - ACE_ERROR ((LM_ERROR, "End dumping list.\n\n")); - } -} - -/* Gathers the input stream into a buffer until one of two things occur: - - 1. We read a '%' followed by a '%' - 2. We read a '%' followed by a '}' - - The first symbolizes the beginning of the keyword list proper, - The second symbolizes the end of the C source code to be generated - verbatim in the output file. - - I assume that the keys are separated from the optional preceding struct - declaration by a consecutive % followed by either % or } starting in - the first column. The code below uses an expandible buffer to scan off - and return a pointer to all the code (if any) appearing before the delimiter. */ - -char * -Key_List::get_special_input (char delimiter) -{ - int size = 80; - char *buf = new char[size]; - int c, i; - - for (i = 0; (c = getchar ()) != EOF; i++) - { - if (c == '%') - { - if ((c = getchar ()) == delimiter) - { - - while ((c = getchar ()) != '\n') - ; /* discard newline */ - - if (i == 0) - return ""; - else - { - buf[delimiter == '%' && buf[i - 2] == ';' ? i - 2 : i - 1] = '\0'; - return buf; - } - } - else - buf[i++] = '%'; - } - else if (i >= size) /* Yikes, time to grow the buffer! */ - { - char *temp = new char[size *= 2]; - int j; - - for (j = 0; j < i; j++) - temp[j] = buf[j]; - - buf = temp; - } - buf[i] = c; - } - - return 0; /* Problem here. */ -} - -/* Stores any C text that must be included verbatim into the - generated code output. */ - -char * -Key_List::save_include_src (void) -{ - int c; - - if ((c = getchar ()) != '%') - ungetc (c, stdin); - else if ((c = getchar ()) != '{') - ACE_ERROR ((LM_ERROR, "internal error, %c != '{' on line %d in file %s%a", c, __LINE__, __FILE__, 1)); - else - return get_special_input ('}'); - return ""; -} - -/* Determines from the input file whether the user wants to build a table - from a user-defined struct, or whether the user is content to simply - use the default array of keys. */ - -char * -Key_List::get_array_type (void) -{ - return get_special_input ('%'); -} - -/* strcspn - find length of initial segment of S consisting entirely - ANSI string package, when GNU libc comes out I'll replace this...). */ - -inline int -Key_List::strcspn (const char *s, const char *reject) -{ - const char *scan; - const char *rej_scan; - int count = 0; - - for (scan = s; *scan; scan++) - { - - for (rej_scan = reject; *rej_scan; rej_scan++) - if (*scan == *rej_scan) - return count; - - count++; - } - - return count; -} - -/* Sets up the Return_Type, the Struct_Tag type and the Array_Type - based upon various user Options. */ - -void -Key_List::set_output_types (void) -{ - if (option[TYPE] && !(array_type = get_array_type ())) - return; /* Something's wrong, bug we'll catch it later on.... */ - else if (option[TYPE]) /* Yow, we've got a user-defined type... */ - { - int struct_tag_length = strcspn (array_type, "{\n\0"); - - if (option[POINTER]) /* And it must return a pointer... */ - { - return_type = new char[struct_tag_length + 2]; - strncpy (return_type, array_type, struct_tag_length); - return_type[struct_tag_length] = '*'; - return_type[struct_tag_length + 1] = '\0'; - } - - struct_tag = new char[struct_tag_length + 1]; - strncpy (struct_tag, array_type, struct_tag_length); - struct_tag[struct_tag_length] = '\0'; - } - else if (option[POINTER]) /* Return a char *. */ - return_type = default_array_type; -} - -/* Reads in all keys from standard input and creates a linked list pointed - to by Head. This list is then quickly checked for ``links,'' i.e., - unhashable elements possessing identical key sets and lengths. */ - -void -Key_List::read_keys (void) -{ - include_src = save_include_src (); - set_output_types (); - - ACE_Read_Buffer input (stdin); - - char *ptr = input.read ('\n'); - - if (ptr == 0) - // Oops, problem with the input file. - ACE_ERROR ((LM_ERROR, "No words in input file, did you forget to prepend %s" - " or use -t accidentally?\n%a", "%%", 1)); - - /* Read in all the keywords from the input file. */ - else - { - const char *delimiter = option.get_delimiter (); - List_Node *temp, *trail = 0; - - head = new List_Node (ptr, strcspn (ptr, delimiter)); - - for (temp = head; - (ptr = input.read ('\n')) && strcmp (ptr, "%%"); - temp = temp->next) - { - temp->next = new List_Node (ptr, strcspn (ptr, delimiter)); - total_keys++; - } - - /* See if any additional source code is included at end of this file. */ - if (ptr) - additional_code = 1; - - /* Hash table this number of times larger than keyword number. */ - int table_size = (list_len = total_keys) * TABLE_MULTIPLE; - -#if LARGE_STACK_ARRAYS - /* By allocating the memory here we save on dynamic allocation overhead. - Table must be a power of 2 for the hash function scheme to work. */ - List_Node *table[ACE_POW (table_size)]; -#else - // Note: we don't use new, because that invokes a custom operator new. - int malloc_size = ACE_POW (table_size) * sizeof(List_Node*); - if (malloc_size == 0) malloc_size = 1; - List_Node **table = (List_Node**)malloc(malloc_size); - if (table == NULL) - abort (); -#endif - - /* Make large hash table for efficiency. */ - Hash_Table found_link (table, table_size); - - /* Test whether there are any links and also set the maximum length of - an identifier in the keyword list. */ - - for (temp = head; temp; temp = temp->next) - { - List_Node *ptr = found_link (temp, option[NOLENGTH]); - - /* Check for links. We deal with these by building an equivalence class - of all duplicate values (i.e., links) so that only 1 keyword is - representative of the entire collection. This *greatly* simplifies - processing during later stages of the program. */ - - if (ptr) - { - total_duplicates++; - list_len--; - trail->next = temp->next; - temp->link = ptr->link; - ptr->link = temp; - - /* Complain if user hasn't enabled the duplicate option. */ - if (!option[DUP] || option[DEBUG]) - ACE_ERROR ((LM_ERROR, "Key link: \"%s\" = \"%s\", with key set \"%s\".\n", - temp->key, ptr->key, temp->char_set)); - } - else - trail = temp; - - /* Update minimum and maximum keyword length, if needed. */ - if (max_key_len < temp->length) - max_key_len = temp->length; - if (min_key_len > temp->length) - min_key_len = temp->length; - } - -#if !LARGE_STACK_ARRAYS - free (table); -#endif - - /* Exit program if links exists and option[DUP] not set, since we can't continue */ - if (total_duplicates) - ACE_ERROR ((LM_ERROR, option[DUP] - ? "%d input keys have identical hash values, examine output carefully...\n" - : "%d input keys have identical hash values,\ntry different key positions or use option -D.\n%a", total_duplicates, 1)); - if (option[ALLCHARS]) - option.set_keysig_size (max_key_len); - } -} - -/* Recursively merges two sorted lists together to form one sorted list. The - ordering criteria is by frequency of occurrence of elements in the key set - or by the hash value. This is a kludge, but permits nice sharing of - almost identical code without incurring the overhead of a function - call comparison. */ - -List_Node * -Key_List::merge (List_Node *list1, List_Node *list2) -{ - if (!list1) - return list2; - else if (!list2) - return list1; - else if (occurrence_sort && list1->occurrence < list2->occurrence - || hash_sort && list1->hash_value > list2->hash_value) - { - list2->next = merge (list2->next, list1); - return list2; - } - else - { - list1->next = merge (list1->next, list2); - return list1; - } -} - -/* Applies the merge sort algorithm to recursively sort the key list by - frequency of occurrence of elements in the key set. */ - -List_Node * -Key_List::merge_sort (List_Node *a_head) -{ - if (!a_head || !a_head->next) - return a_head; - else - { - List_Node *middle = a_head; - List_Node *temp = a_head->next->next; - - while (temp) - { - temp = temp->next; - middle = middle->next; - if (temp) - temp = temp->next; - } - - temp = middle->next; - middle->next = 0; - return merge (merge_sort (a_head), merge_sort (temp)); - } -} - -/* Returns the frequency of occurrence of elements in the key set. */ - -inline int -Key_List::get_occurrence (List_Node *ptr) -{ - int value = 0; - - for (char *temp = ptr->char_set; *temp; temp++) - value += Vectors::occurrences[*temp]; - - return value; -} - -/* Enables the index location of all key set elements that are now - determined. */ - -inline void -Key_List::set_determined (List_Node *ptr) -{ - for (char *temp = ptr->char_set; *temp; temp++) - determined[*temp] = 1; -} - -/* Returns TRUE if PTR's key set is already completely determined. */ - -inline int -Key_List::already_determined (List_Node *ptr) -{ - int is_determined = 1; - - for (char *temp = ptr->char_set; is_determined && *temp; temp++) - is_determined = determined[*temp]; - - return is_determined; -} - -/* Reorders the table by first sorting the list so that frequently occuring - keys appear first, and then the list is reorded so that keys whose values - are already determined will be placed towards the front of the list. This - helps prune the search time by handling inevitable collisions early in the - search process. See Cichelli's paper from Jan 1980 JACM for details.... */ - -void -Key_List::reorder (void) -{ - List_Node *ptr; - - for (ptr = head; ptr; ptr = ptr->next) - ptr->occurrence = get_occurrence (ptr); - - occurrence_sort = !(hash_sort = 0); /* Pretty gross, eh?! */ - - for (ptr = head = merge_sort (head); ptr->next; ptr = ptr->next) - { - set_determined (ptr); - - if (already_determined (ptr->next)) - continue; - else - { - List_Node *trail_ptr = ptr->next; - List_Node *run_ptr = trail_ptr->next; - - for (; run_ptr; run_ptr = trail_ptr->next) - { - - if (already_determined (run_ptr)) - { - trail_ptr->next = run_ptr->next; - run_ptr->next = ptr->next; - ptr = ptr->next = run_ptr; - } - else - trail_ptr = run_ptr; - } - } - } -} - -/* Outputs the maximum and minimum hash values. Since the - list is already sorted by hash value all we need to do is - find the final item! */ - -void -Key_List::output_min_max () -{ - List_Node *temp; - for (temp = head; temp->next; temp = temp->next) - ; - - min_hash_value = head->hash_value; - max_hash_value = temp->hash_value; - - if (!option[ENUM]) - printf ("\n#define TOTAL_KEYWORDS %d\n#define MIN_WORD_LENGTH %d" - "\n#define MAX_WORD_LENGTH %d\n#define MIN_HASH_VALUE %d" - "\n#define MAX_HASH_VALUE %d\n#define HASH_VALUE_RANGE %d" - "\n#define DUPLICATES %d\n\n", - total_keys, min_key_len, max_key_len, min_hash_value, - max_hash_value, max_hash_value - min_hash_value + 1, - total_duplicates ? total_duplicates + 1 : 0); - else if (option[GLOBAL]) - printf ("enum\n{\n" - " TOTAL_KEYWORDS = %d,\n" - " MIN_WORD_LENGTH = %d,\n" - " MAX_WORD_LENGTH = %d,\n" - " MIN_HASH_VALUE = %d,\n" - " MAX_HASH_VALUE = %d,\n" - " HASH_VALUE_RANGE = %d,\n" - " DUPLICATES = %d\n};\n\n", - total_keys, min_key_len, max_key_len, min_hash_value, - max_hash_value, max_hash_value - min_hash_value + 1, - total_duplicates ? total_duplicates + 1 : 0); -} - -/* Generates the output using a C switch. This trades increased - search time for decreased table space (potentially *much* less - space for sparse tables). It the user has specified their own - struct in the keyword file *and* they enable the POINTER option we - have extra work to do. The solution here is to maintain a local - static array of user defined struct's, as with the - Output_Lookup_Function. Then we use for switch statements to - perform either a strcmp or strncmp, returning 0 if the str fails to - match, and otherwise returning a pointer to appropriate index - location in the local static array. */ - -void -Key_List::output_switch (void) -{ - char *comp_buffer; - List_Node *curr = head; - int pointer_and_type_enabled = option[POINTER] && option[TYPE]; - int total_switches = option.get_total_switches (); - int switch_size = keyword_list_length () / total_switches; - - if (pointer_and_type_enabled) - { -#if defined (__GNUG__) - comp_buffer = (char *) alloca (strlen ("charmap[*str] == *resword->%s && !strncasecmp (str + 1, resword->%s + 1, len - 1)") - + 2 * strlen (option.get_key_name ()) + 1); -#else - comp_buffer = new char [strlen ("charmap[*str] == *resword->%s && !strncasecmp (str + 1, resword->%s + 1, len - 1)") - + 2 * strlen (option.get_key_name ()) + 1]; -#endif - if (option[COMP]) - sprintf (comp_buffer, "%s == *resword->%s && !%s (str + 1, resword->%s + 1, len - 1)", - option[STRCASECMP] ? "charmap[*str]" : "*str", option.get_key_name (), - option[STRCASECMP] ? "strncasecmp" : "strncmp", option.get_key_name ()); - else - sprintf (comp_buffer, "%s == *resword->%s && !%s (str + 1, resword->%s + 1)", - option[STRCASECMP] ? "charmap[*str]" : "*str", option.get_key_name (), - option[STRCASECMP] ? "strcasecmp" : "strcmp", option.get_key_name ()); - } - else - { - if (option[COMP]) - comp_buffer = option[STRCASECMP] - ? "charmap[*str] == *resword && !strncasecmp (str + 1, resword + 1, len - 1)" - : "*str == *resword && !strncmp (str + 1, resword + 1, len - 1)"; - else - comp_buffer = option[STRCASECMP] - ? "charmap[*str] == *resword && !strcasecmp (str + 1, resword + 1, len - 1)" - : "*str == *resword && !strcmp (str + 1, resword + 1, len - 1)"; - } - if (!option[OPTIMIZE]) - printf (" if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)\n {\n"); - printf (" register int key = %s (str, len);\n\n", option.get_hash_name ()); - if (!option[OPTIMIZE]) - printf (" if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)\n"); - - printf (" {\n"); - - /* Properly deal with user's who request multiple switch statements. */ - - while (curr) - { - List_Node *temp = curr; - int lowest_case_value = curr->hash_value; - int number_of_cases = 0; - - /* Figure out a good cut point to end this switch. */ - - for (; temp && ++number_of_cases < switch_size; temp = temp->next) - if (temp->next && temp->hash_value == temp->next->hash_value) - while (temp->next && temp->hash_value == temp->next->hash_value) - temp = temp->next; - - if (temp && total_switches != 1) - printf (" if (key <= %d)\n {\n", temp->hash_value); - else - printf (" {\n"); - - /* Output each keyword as part of a switch statement indexed by hash value. */ - - if (option[POINTER] || option[DUP]) - { - int i = 0; - - printf (" %s%s *resword; %s\n\n", - option[CONST] ? "const " : "", - pointer_and_type_enabled ? struct_tag : "char", - option[LENTABLE] && !option[DUP] ? "int key_len;" : ""); - if (total_switches == 1) - { - printf (" switch (key)\n {\n"); - lowest_case_value = 0; - } - else - printf (" switch (key - %d)\n {\n", lowest_case_value); - - for (temp = curr; temp && ++i <= number_of_cases; temp = temp->next) - { - printf (" case %*d:", field_width, temp->hash_value - lowest_case_value); - if (option[DEBUG]) - printf (" /* hash value = %4d, keyword = \"%s\" */", temp->hash_value, temp->key); - putchar ('\n'); - - /* Handle `natural links,' i.e., those that occur statically. */ - - if (temp->link) - { - List_Node *links; - - for (links = temp; links; links = links->link) - { - if (pointer_and_type_enabled) - printf (" resword = &wordlist[%d];\n", links->index); - else - printf (" resword = \"%s\";\n", links->key); - printf (" if (%s) return resword;\n", comp_buffer); - } - } - /* Handle unresolved duplicate hash values. These are guaranteed - to be adjacent since we sorted the keyword list by increasing - hash values. */ - if (temp->next && temp->hash_value == temp->next->hash_value) - { - - for ( ; temp->next && temp->hash_value == temp->next->hash_value; - temp = temp->next) - { - if (pointer_and_type_enabled) - printf (" resword = &wordlist[%d];\n", temp->index); - else - printf (" resword = \"%s\";\n", temp->key); - printf (" if (%s) return resword;\n", comp_buffer); - } - if (pointer_and_type_enabled) - printf (" resword = &wordlist[%d];\n", temp->index); - else - printf (" resword = \"%s\";\n", temp->key); - printf (" return %s ? resword : 0;\n", comp_buffer); - } - else if (temp->link) - printf (" return 0;\n"); - else - { - if (pointer_and_type_enabled) - printf (" resword = &wordlist[%d];", temp->index); - else - printf (" resword = \"%s\";", temp->key); - if (option[LENTABLE] && !option[DUP]) - printf (" key_len = %d;", temp->length); - printf (" break;\n"); - } - } - printf (" default: return 0;\n }\n"); - if (option[OPTIMIZE]) - printf (" return resword;\n"); - else - { - printf (option[LENTABLE] && !option[DUP] - ? " if (len == key_len && %s)\n return resword;\n" - : " if (%s)\n return resword;\n", comp_buffer); - printf (" return 0;\n"); - } - printf (" }\n"); - curr = temp; - } - else /* Nothing special required here. */ - { - int i = 0; - printf (" char *s;\n\n switch (key - %d)\n {\n", - lowest_case_value); - - for (temp = curr; temp && ++i <= number_of_cases; temp = temp->next) - if (option[LENTABLE]) - printf (" case %*d: if (len == %d) s = \"%s\"; else return 0; break;\n", - field_width, temp->hash_value - lowest_case_value, - temp->length, temp->key); - else - printf (" case %*d: s = \"%s\"; break;\n", - field_width, temp->hash_value - lowest_case_value, temp->key); - - printf (" default: return 0;\n }\n "); - if (option[COMP]) - printf ("return %s == *s && !%s;\n }\n", - option[STRCASECMP] ? "charmap[*str]" : "*str", - option[STRCASECMP] ? "strncasecmp (s + 1, str + 1, len - 1)" : "strcmp (s + 1, str + 1)"); - else - printf ("return %s == *s && !%s;\n }\n", - option[STRCASECMP] ? "charmap[*str]" : "*str", - option[STRCASECMP] ? "strcasecmp (s + 1, str + 1, len - 1)" : "strcmp (s + 1, str + 1)"); - curr = temp; - } - } - printf (" }\n %s\n}\n", option[OPTIMIZE] ? "" : "}\n return 0;"); -} - -/* Prints out a table of keyword lengths, for use with the - comparison code in generated function ``in_word_set.'' */ - -void -Key_List::output_keylength_table (void) -{ - const int max_column = 15; - int index = 0; - int column = 0; - char *indent = option[GLOBAL] ? "" : " "; - List_Node *temp; - - if (!option[DUP] && !option[SWITCH]) - { - printf ("\n%sstatic %sunsigned %s lengthtable[] =\n%s%s{\n ", - indent, option[CONST] ? "const " : "", - max_key_len <= UCHAR_MAX ? "char" : (max_key_len <= USHRT_MAX ? "short" : "long"), - indent, indent); - - for (temp = head; temp; temp = temp->next, index++) - { - - if (index < temp->hash_value) - for ( ; index < temp->hash_value; index++) - printf ("%3d,%s", 0, ++column % (max_column - 1) ? "" : "\n "); - - printf ("%3d,%s", temp->length, ++column % (max_column - 1 ) ? "" : "\n "); - } - - printf ("\n%s%s};\n", indent, indent); - } -} -/* Prints out the array containing the key words for the Gen_Perf - hash function. */ - -void -Key_List::output_keyword_table (void) -{ - char *l_brace = *head->rest ? "{" : ""; - char *r_brace = *head->rest ? "}," : ""; - char *indent = option[GLOBAL] ? "" : " "; - int index = 0; - List_Node *temp; - - printf ("%sstatic %s%swordlist[] =\n%s%s{\n", - indent, option[CONST] ? "const " : "", struct_tag, indent, indent); - - /* Skip over leading blank entries if there are no duplicates. */ - - if (0 < head->hash_value) - printf (" "); - for (int column = 1; index < head->hash_value; index++, column++) - printf ("%s\"\",%s %s", l_brace, r_brace, column % 9 ? "" : "\n "); - if (0 < head->hash_value && column % 10) - printf ("\n"); - - /* Generate an array of reserved words at appropriate locations. */ - - for (temp = head ; temp; temp = temp->next, index++) - { - temp->index = index; - - if (!option[SWITCH] && (total_duplicates == 0 || !option[DUP]) && index < temp->hash_value) - { - int column; - - printf (" "); - - for (column = 1; index < temp->hash_value; index++, column++) - printf ("%s\"\",%s %s", l_brace, r_brace, column % 9 ? "" : "\n "); - - if (column % 10) - printf ("\n"); - else - { - printf ("%s\"%s\", %s%s", l_brace, temp->key, temp->rest, r_brace); - if (option[DEBUG]) - printf (" /* hash value = %d, index = %d */", temp->hash_value, temp->index); - putchar ('\n'); - continue; - } - } - - printf (" %s\"%s\", %s%s", l_brace, temp->key, temp->rest, r_brace); - if (option[DEBUG]) - printf (" /* hash value = %d, index = %d */", temp->hash_value, temp->index); - putchar ('\n'); - - /* Deal with links specially. */ - if (temp->link) - for (List_Node *links = temp->link; links; links = links->link) - { - links->index = ++index; - printf (" %s\"%s\", %s%s", l_brace, links->key, links->rest, r_brace); - if (option[DEBUG]) - printf (" /* hash value = %d, index = %d */", links->hash_value, links->index); - putchar ('\n'); - } - } - printf ("%s%s};\n\n", indent, indent); -} - -/* Generates C code for the hash function that returns the - proper encoding for each key word. */ - -void -Key_List::output_hash_function (void) -{ - const int max_column = 10; - int count = max_hash_value; - - /* Calculate maximum number of digits required for MAX_HASH_VALUE. */ - - for (field_width = 2; (count /= 10) > 0; field_width++) - ; - - if (option[GNU]) - printf ("#ifdef __GNUC__\ninline\n#endif\n"); - - if (option[C]) - printf ("static "); - printf ("unsigned int\n"); - if (option[CPLUSPLUS]) - printf ("%s::", option.get_class_name ()); - - printf (option[ANSI] - ? "%s (register const char *str, register int len)\n{\n static %sunsigned %s asso_values[] =\n {" - : "%s (str, len)\n register char *str;\n register int unsigned len;\n{\n static %sunsigned %s asso_values[] =\n {", - option.get_hash_name (), option[CONST] ? "const " : "", - max_hash_value <= UCHAR_MAX ? "char" : (max_hash_value <= USHRT_MAX ? "short" : "int")); - - for (count = 0; count < ALPHA_SIZE; ++count) - { - if (!(count % max_column)) - printf ("\n "); - - printf ("%*d,", - field_width, - Vectors::occurrences[count] ? Vectors::asso_values[count] : max_hash_value + 1); - } - - /* Optimize special case of ``-k 1,$'' */ - if (option[DEFAULTCHARS]) - { - if (option[STRCASECMP]) - printf ("\n };\n return %sasso_values[charmap[str[len - 1]]] + asso_values[charmap[str[0]]];\n}\n\n", - option[NOLENGTH] ? "" : "len + "); - else - printf ("\n };\n return %sasso_values[str[len - 1]] + asso_values[str[0]];\n}\n\n", - option[NOLENGTH] ? "" : "len + "); - } - else - { - int key_pos; - - option.reset (); - - /* Get first (also highest) key position. */ - key_pos = option.get (); - - /* We can perform additional optimizations here. */ - if (!option[ALLCHARS] && key_pos <= min_key_len) - { - printf ("\n };\n return %s", option[NOLENGTH] ? "" : "len + "); - - for (; key_pos != WORD_END; ) - { - printf (option[STRCASECMP] ? "asso_values[charmap[str[%d]]]" : "asso_values[str[%d]]", key_pos - 1); - if ((key_pos = option.get ()) != EOS) - printf (" + "); - else - break; - } - - printf ("%s;\n}\n\n", key_pos == WORD_END - ? (option[STRCASECMP] ? "asso_values[charmap[str[len - 1]]]" : "asso_values[str[len - 1]]") - : ""); - } - - /* We've got to use the correct, but brute force, technique. */ - else - { - printf ("\n };\n register int hval = %s;\n\n switch (%s)\n {\n default:\n", - option[NOLENGTH] ? "0" : "len", option[NOLENGTH] ? "len" : "hval"); - - /* User wants *all* characters considered in hash. */ - if (option[ALLCHARS]) - { - int i; - - /* Break these options up for speed (gee, is this misplaced efficiency or what?! */ - if (option[STRCASECMP]) - - for (i = max_key_len; i > 0; i--) - printf (" case %d:\n hval += asso_values[charmap[str[%d]]];\n", i, i - 1); - - else - - for (i = max_key_len; i > 0; i--) - printf (" case %d:\n hval += asso_values[str[%d]];\n", i, i - 1); - - printf (" }\n return hval;\n}\n\n"); - } - else /* do the hard part... */ - { - count = key_pos + 1; - - do - { - - while (--count > key_pos) - printf (" case %d:\n", count); - - printf (option[STRCASECMP] - ? " case %d:\n hval += asso_values[charmap[str[%d]]];\n" - : " case %d:\n hval += asso_values[str[%d]];\n", - key_pos, key_pos - 1); - } - while ((key_pos = option.get ()) != EOS && key_pos != WORD_END); - - printf (" }\n return hval%s;\n}\n\n", - key_pos == WORD_END - ? (option[STRCASECMP] ? " + asso_values[charmap[str[len - 1]]]" : " + asso_values[str[len - 1]]") - : ""); - } - } - } -} - -/* Generates the large, sparse table that maps hash values into - the smaller, contiguous range of the keyword table. */ - -void -Key_List::output_lookup_array (void) -{ - if (total_duplicates > 0) - { - const int DEFAULT_VALUE = -1; - - struct duplicate_entry - { - int hash_value; /* Hash value for this particular duplicate set. */ - int index; /* Index into the main keyword storage array. */ - int count; /* Number of consecutive duplicates at this index. */ - }; -#if LARGE_STACK_ARRAYS - duplicate_entry duplicates[total_duplicates]; - int lookup_array[max_hash_value + 1]; -#else - // Note: we don't use new, because that invokes a custom operator new. - duplicate_entry *duplicates = (duplicate_entry*) - malloc (total_duplicates * sizeof(duplicate_entry)); - int *lookup_array = (int*)malloc(sizeof(int) * (max_hash_value + 1)); - if (duplicates == NULL || lookup_array == NULL) - abort(); -#endif - duplicate_entry *dup_ptr = duplicates; - int *lookup_ptr = lookup_array + max_hash_value + 1; - - while (lookup_ptr > lookup_array) - *--lookup_ptr = DEFAULT_VALUE; - - for (List_Node *temp = head; temp; temp = temp->next) - { - int hash_value = temp->hash_value; - lookup_array[hash_value] = temp->index; - if (option[DEBUG]) - fprintf (stderr, "keyword = %s, index = %d\n", temp->key, temp->index); - if (!temp->link && - (!temp->next || hash_value != temp->next->hash_value)) - continue; -#if LARGE_STACK_ARRAYS - *dup_ptr = (duplicate_entry) { hash_value, temp->index, 1 }; -#else - duplicate_entry _dups; - _dups.hash_value = hash_value; - _dups.index = temp->index; - _dups.count = 1; - *dup_ptr = _dups; -#endif - - for (List_Node *ptr = temp->link; ptr; ptr = ptr->link) - { - dup_ptr->count++; - if (option[DEBUG]) - fprintf (stderr, "static linked keyword = %s, index = %d\n", ptr->key, ptr->index); - } - - while (temp->next && hash_value == temp->next->hash_value) - { - temp = temp->next; - dup_ptr->count++; - if (option[DEBUG]) - fprintf (stderr, "dynamic linked keyword = %s, index = %d\n", temp->key, temp->index); - - for (List_Node *ptr = temp->link; ptr; ptr = ptr->link) - { - dup_ptr->count++; - if (option[DEBUG]) - fprintf (stderr, "static linked keyword = %s, index = %d\n", ptr->key, ptr->index); - } - } - dup_ptr++; - } - - while (--dup_ptr >= duplicates) - { - if (option[DEBUG]) - fprintf (stderr, "dup_ptr[%d]: hash_value = %d, index = %d, count = %d\n", - dup_ptr - duplicates, dup_ptr->hash_value, dup_ptr->index, dup_ptr->count); - - /* Start searching for available space towards the right part of the lookup array. */ - int i; - for (i = dup_ptr->hash_value; i < max_hash_value; i++) - if (lookup_array[i] == DEFAULT_VALUE && lookup_array[i + 1] == DEFAULT_VALUE) - { - lookup_array[i] = -dup_ptr->index; - lookup_array[i + 1] = -dup_ptr->count; - lookup_array[dup_ptr->hash_value] = max_hash_value + (i - dup_ptr->hash_value); - break; - } - - /* If we didn't find it to the right look to the left instead... */ - if (i == max_hash_value) - { - - for (i = dup_ptr->hash_value; i > 0; i--) - if (lookup_array[i] == DEFAULT_VALUE && lookup_array[i - 1] == DEFAULT_VALUE) - { - lookup_array[i - 1] = -dup_ptr->index; - lookup_array[i] = -dup_ptr->count; - lookup_array[dup_ptr->hash_value] = -(max_hash_value + (dup_ptr->hash_value - i + 1)); - break; - } - - /* We are in *big* trouble if this happens! */ - assert (i != 0); - } - } - - int max = INT_MIN; - lookup_ptr = lookup_array + max_hash_value + 1; - while (lookup_ptr > lookup_array) - { - int val = abs (*--lookup_ptr); - if (max < val) - max = val; - } - - char *indent = option[GLOBAL] ? "" : " "; - printf ("%sstatic %s%s lookup[] =\n%s%s{\n ", indent, option[CONST] ? "const " : "", - max <= SCHAR_MAX ? "char" : (max <= USHRT_MAX ? "short" : "int"), - indent, indent); - - int count = max; - - /* Calculate maximum number of digits required for MAX_HASH_VALUE. */ - - for (field_width = 2; (count /= 10) > 0; field_width++) - ; - - const int max_column = 15; - int column = 0; - - for (lookup_ptr = lookup_array; - lookup_ptr < lookup_array + max_hash_value + 1; - lookup_ptr++) - printf ("%*d,%s", field_width, *lookup_ptr, ++column % (max_column - 1) ? "" : "\n "); - - printf ("\n%s%s};\n\n", indent, indent); -#if !LARGE_STACK_ARRAYS - free (duplicates); - free (lookup_array); -#endif - } -} -/* Generates C code to perform the keyword lookup. */ - -void -Key_List::output_lookup_function (void) -{ - if (!option[OPTIMIZE]) - printf (" if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)\n {\n"); - printf (" register int key = %s (str, len);\n\n", option.get_hash_name ()); - if (!option[OPTIMIZE]) - printf (" if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE)\n"); - printf (" {\n"); - - if (option[DUP] && total_duplicates > 0) - { - printf (" register int index = lookup[key];\n\n" - " if (index >= 0 && index < MAX_HASH_VALUE)\n"); - if (option[OPTIMIZE]) - printf (" return %swordlist[index];\n", option[TYPE] && option[POINTER] ? "&" : ""); - else - { - printf (" {\n" - " register %schar *s = wordlist[index]", option[CONST] ? "const " : ""); - if (array_type != default_array_type) - printf (".%s", option.get_key_name ()); - - printf (";\n\n if (%s%s == *s && !%s)\n return %s;\n }\n", - option[LENTABLE] ? "len == lengthtable[key]\n && " : "", - option[STRCASECMP] ? "charmap[*str]" : "*str", - option[COMP] ? (option[STRCASECMP] ? "strncasecmp (str + 1, s + 1, len - 1)" : "strncmp (str + 1, s + 1, len - 1)") - : (option[STRCASECMP] ? "strcasecmp (str + 1, s + 1)" : "strcmp (str + 1, s + 1)"), - option[TYPE] && option[POINTER] ? "&wordlist[index]" : "s"); - printf (" else if (index < 0 && index >= -MAX_HASH_VALUE)\n" - " return 0;\n"); - } - printf (" else\n {\n" - " register int offset = key + index + (index > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE);\n" - " register %s%s*base = &wordlist[-lookup[offset]];\n" - " register %s%s*ptr = base + -lookup[offset + 1];\n\n" - " while (--ptr >= base)\n ", - option[CONST] ? "const " : "", struct_tag, - option[CONST] ? "const " : "", struct_tag); - if (array_type != default_array_type) - { - if (option[COMP]) - printf ("if (%s == *ptr->%s && !%s (str + 1, ptr->%s + 1, len - 1", - option[STRCASECMP] ? "charmap[*str]" : "*str", option.get_key_name (), - option[STRCASECMP] ? "strncasecmp" : "strncmp", option.get_key_name ()); - else - printf ("if (%s == *ptr->%s && !%s (str + 1, ptr->%s + 1", - option[STRCASECMP] ? "charmap[*str]" : "*str", option.get_key_name (), - option[STRCASECMP] ? "strcasecmp" : "strcmp", option.get_key_name ()); - } - else - printf (option[STRCASECMP] ? "if (charmap[*str] == **ptr && !%s" : "if (*str == **ptr && !%s", - option[COMP] - ? (option[STRCASECMP] ? "strncasecmp (str + 1, *ptr + 1, len - 1" : "strncmp (str + 1, *ptr + 1, len - 1") - : (option[STRCASECMP] ? "strcasecmp (str + 1, *ptr + 1" : "strcmp (str + 1, *ptr + 1")); - printf ("))\n return %sptr;" - "\n }\n }\n %s\n}\n", array_type == - default_array_type ? "*" : "", option[OPTIMIZE] ? "" : "}\n return 0;"); - } - else - { - if (option[OPTIMIZE]) - printf (" return %swordlist[key]", option[TYPE] && option[POINTER] ? "&" : ""); - else - { - printf (" register %schar *s = wordlist[key]", option[CONST] ? "const " : ""); - - if (array_type != default_array_type) - printf (".%s", option.get_key_name ()); - - printf (";\n\n if (%s%s == *s && !%s)\n return %s", - option[LENTABLE] ? "len == lengthtable[key]\n && " : "", - option[STRCASECMP] ? "charmap[*str]" : "*str", - option[COMP] - ? (option[STRCASECMP] ? "strncasecmp (str + 1, s + 1, len - 1)" : "strncmp (str + 1, s + 1, len - 1)") - : (option[STRCASECMP] ? "strcasecmp (str + 1, s + 1)" : "strcmp (str + 1, s + 1)"), - option[TYPE] && option[POINTER] ? "&wordlist[key]" : "s"); - } - printf (";\n }\n %s\n}\n", option[OPTIMIZE] ? "" : "}\n return 0;"); - } -} - -/* Output the table and the functions that map upper case into lower case! */ - -void -Key_List::output_strcasecmp (void) -{ - printf ("%s", - "/* This array is designed for mapping upper and lower case letter\n" - " * together for a case independent comparison. The mappings are\n" - " * based upon ascii character sequences.\n */" - "static char charmap[] = {\n" - " '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n" - " '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n" - " '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n" - " '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n" - " '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n" - " '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n" - " '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n" - " '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n" - " '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n" - " '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n" - " '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n" - " '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n" - " '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n" - " '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n" - " '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n" - " '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n" - " '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n" - " '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n" - " '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n" - " '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n" - " '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n" - " '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n" - " '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n" - " '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n" - " '\\300', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n" - " '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n" - " '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n" - " '\\370', '\\371', '\\372', '\\333', '\\334', '\\335', '\\336', '\\337',\n" - " '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n" - " '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n" - " '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n" - " '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377',\n};\n\nstatic int\n"); - if (option[COMP]) - { - printf ("%s", option[ANSI] - ? "strncasecmp (register char *s1, register char *s2, register int n)" - : "strncasecmp (s1, s2, n)\n register char *s1, *s2;\n register int n;"); - printf ("\n{\n register char *cm = charmap;\n\n while (--n >= 0 && cm[*s1] == cm[*s2++])\n" - " if (*s1++ == '\\0')\n return 0;\n" - "\n return n < 0 ? 0 : cm[*s1] - cm[*--s2];\n}\n\n"); - } - else - { - printf ("%s", option[ANSI] - ? "strcasecmp (register char *s1, register char *s2)" - : "strcasecmp (s1, s2)\n register char *s1, *s2;"); - printf ("\n{\n register char *cm = charmap;\n\n while (cm[*s1] == cm[*s2++])\n" - " if (*s1++ == '\\0')\n return 0;\n" - "\n return cm[*s1] - cm[*--s2];\n}\n\n"); - } -} - -/* Generates the hash function and the key word recognizer function - based upon the user's Options. */ - -void -Key_List::output (void) -{ - printf ("%s\n", include_src); - - if (option[TYPE] && !option[NOTYPE]) /* Output type declaration now, reference it later on.... */ - printf ("%s;\n", array_type); - - output_min_max (); - - if (option[STRCASECMP]) - output_strcasecmp (); - if (option[CPLUSPLUS]) - printf ("class %s\n{\nprivate:\n" - " static unsigned int hash (const char *str, int len);\npublic:\n" - " static %s%s%s (const char *str, int len);\n};\n\n", - option.get_class_name (), option[CONST] ? "const " : "", - return_type, option.get_function_name ()); - - output_hash_function (); - - if (option[GLOBAL]) - if (option[SWITCH]) - { - if (option[LENTABLE] && option[DUP]) - output_keylength_table (); - if (option[POINTER] && option[TYPE]) - output_keyword_table (); - } - else - { - if (option[LENTABLE]) - output_keylength_table (); - output_keyword_table (); - output_lookup_array (); - } - - if (option[GNU]) /* Use the inline keyword to remove function overhead. */ - printf ("#ifdef __GNUC__\ninline\n#endif\n"); - - printf ("%s%s\n", option[CONST] ? "const " : "", return_type); - if (option[CPLUSPLUS]) - printf ("%s::", option.get_class_name ()); - - printf (option[ANSI] - ? "%s (register const char *str, register int len)\n{\n" - : "%s (str, len)\n register char *str;\n register unsigned int len;\n{\n", - option.get_function_name ()); - - if (option[ENUM] && !option[GLOBAL]) - printf (" enum\n {\n" - " TOTAL_KEYWORDS = %d,\n" - " MIN_WORD_LENGTH = %d,\n" - " MAX_WORD_LENGTH = %d,\n" - " MIN_HASH_VALUE = %d,\n" - " MAX_HASH_VALUE = %d,\n" - " HASH_VALUE_RANGE = %d,\n" - " DUPLICATES = %d\n };\n\n", - total_keys, min_key_len, max_key_len, min_hash_value, - max_hash_value, max_hash_value - min_hash_value + 1, - total_duplicates ? total_duplicates + 1 : 0); - /* Use the switch in place of lookup table. */ - if (option[SWITCH]) - { - if (!option[GLOBAL]) - { - if (option[LENTABLE] && option[DUP]) - output_keylength_table (); - if (option[POINTER] && option[TYPE]) - output_keyword_table (); - } - output_switch (); - } - /* Use the lookup table, in place of switch. */ - else - { - if (!option[GLOBAL]) - { - if (option[LENTABLE]) - output_keylength_table (); - output_keyword_table (); - } - if (!option[GLOBAL]) - output_lookup_array (); - output_lookup_function (); - } - - if (additional_code) - { - for (;;) - { - int c = getchar (); - - if (c == EOF) - break; - else - putchar (c); - } - } - - fflush (stdout); -} - -/* Sorts the keys by hash value. */ - -void -Key_List::sort (void) -{ - hash_sort = 1; - occurrence_sort = 0; - - head = merge_sort (head); -} - -/* Dumps the key list to stderr stream. */ - -void -Key_List::dump () -{ - int field_width = option.get_max_keysig_size (); - - fprintf (stderr, "\nList contents are:\n(hash value, key length, index, %*s, keyword):\n", - field_width, "char_set"); - - for (List_Node *ptr = head; ptr; ptr = ptr->next) - fprintf (stderr, "%11d,%11d,%6d, %*s, %s\n", - ptr->hash_value, ptr->length, ptr->index, - field_width, ptr->char_set, ptr->key); -} - -/* Simple-minded constructor action here... */ - -Key_List::Key_List (void) -{ - total_keys = 1; - max_key_len = INT_MIN; - min_key_len = INT_MAX; - return_type = default_return_type; - array_type = struct_tag = default_array_type; - head = 0; - total_duplicates = 0; - additional_code = 0; -} - -/* Returns the length of entire key list. */ - -int -Key_List::keyword_list_length (void) -{ - return list_len; -} - -/* Returns length of longest key read. */ - -int -Key_List::max_key_length (void) -{ - return max_key_len; -} - diff --git a/apps/gperf/src/Key_List.h b/apps/gperf/src/Key_List.h deleted file mode 100644 index bad5e0a2ffa..00000000000 --- a/apps/gperf/src/Key_List.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Data and function member declarations for the keyword list class. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -// The key word list is a useful abstraction that keeps track of -// various pieces of information that enable that fast generation of -// the Gen_Perf.hash function. A Key_List is a singly-linked list of -// List_Nodes. - -#ifndef key_list_h -#define key_list_h 1 - -#include "Options.h" -#include "List_Node.h" - -class Key_List -{ -public: - Key_List (void); - ~Key_List (void); - int keyword_list_length (void); - int max_key_length (void); - void reorder (void); - void sort (void); - void read_keys (void); - void output (void); - - List_Node *head; - // Points to the head of the linked list. - - int total_duplicates; - // Total number of duplicate hash values. - -private: - static int get_occurrence (List_Node *ptr); - static int strcspn (const char *s, const char *reject); - static int already_determined (List_Node *ptr); - static void set_determined (List_Node *ptr); - void output_min_max (void); - void output_switch (void); - void output_keyword_table (void); - void output_keylength_table (void); - void output_hash_function (void); - void output_lookup_function (void); - void output_lookup_array (void); - void output_strcasecmp (void); - void set_output_types (void); - void dump (void); - char *get_array_type (void); - char *save_include_src (void); - char *get_special_input (char delimiter); - List_Node *merge (List_Node *list1, List_Node *list2); - List_Node *merge_sort (List_Node *head); - - char *array_type; - // Pointer to the type for word list. - - char *return_type; - // Pointer to return type for lookup function. - - char *struct_tag; - // Shorthand for user-defined struct tag type. - - char *include_src; - // C source code to be included verbatim. - - int max_key_len; - // Maximum length of the longest keyword. - - int min_key_len; - // Minimum length of the shortest keyword. - - int min_hash_value; - // Minimum hash value for all keywords. - - int max_hash_value; - // Maximum hash value for all keywords. - - int occurrence_sort; - // True if sorting by occurrence. - - int hash_sort; - // True if sorting by hash value. - - int additional_code; - // True if any additional C code is included. - - int list_len; - // Length of head's Key_List, not counting duplicates. - - int total_keys; - // Total number of keys, counting duplicates. -}; -#endif diff --git a/apps/gperf/src/List_Node.cpp b/apps/gperf/src/List_Node.cpp deleted file mode 100644 index 59643b97b17..00000000000 --- a/apps/gperf/src/List_Node.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* Creates and initializes a new list node. -// $Id$ - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "Vectors.h" -#include "List_Node.h" - -/* Defined as a macro in string.h on some systems, which causes - conflicts. */ -#undef index - -/* Sorts the key set alphabetically to speed up subsequent operations. - Uses insertion sort since the set is probably quite small. */ - -inline void -List_Node::set_sort (char *base, int len) -{ - int i, j; - - for (i = 0, j = len - 1; i < j; i++) - { - char curr, tmp; - - for (curr = i + 1, tmp = base[curr]; curr > 0 && tmp < base[curr-1]; curr--) - base[curr] = base[curr - 1]; - - base[curr] = tmp; - - } -} - -/* Initializes a List_Node. This requires obtaining memory for the - CHAR_SET initializing them using the information stored in the - KEY_POSITIONS array in Options, and checking for simple errors. - It's important to note that KEY and REST are both pointers to the - different offsets into the same block of dynamic memory pointed to - by parameter K. The data member REST is used to store any - additional fields of the input file (it is set to the "" string if - Option[TYPE] is not enabled). This is useful if the user wishes to - incorporate a lookup structure, rather than just an array of keys. - Finally, KEY_NUMBER contains a count of the total number of keys - seen so far. This is used to initialize the INDEX field to some - useful value. */ - -List_Node::List_Node (char *k, int len) - : key (k), - next (0), - index (0), - length (len), - link (0), - rest (option[TYPE] ? k + len + 1 : "") -{ - char *ptr = new char[(option[ALLCHARS] ? len : option.get_max_keysig_size ()) + 1]; - char_set = ptr; - k[len] = '\0'; /* Null terminate KEY to separate it from REST. */ - - /* Lower case if STRCASECMP option is enabled. */ - if (option[STRCASECMP]) - for (char *p = k; *p; p++) - if (isupper (*p)) - *p = tolower (*p); - - if (option[ALLCHARS]) /* Use all the character position in the KEY. */ - for (; *k; k++, ptr++) - ++Vectors::occurrences[*ptr = *k]; - else /* Only use those character positions specified by the user. */ - { - int i; - - /* Iterate thru the list of key_positions, initializing occurrences table - and char_set (via char * pointer ptr). */ - - for (option.reset (); (i = option.get ()) != EOS; ) - { - if (i == WORD_END) /* Special notation for last KEY position, i.e. '$'. */ - *ptr = key[len - 1]; - else if (i <= len) /* Within range of KEY length, so we'll keep it. */ - *ptr = key[i - 1]; - else /* Out of range of KEY length, so we'll just skip it. */ - continue; - ++Vectors::occurrences[*ptr++]; - } - - /* Didn't get any hits and user doesn't want to consider the - keylength, so there are essentially no usable hash positions! */ - if (ptr == char_set && option[NOLENGTH]) - ACE_ERROR ((LM_ERROR, "Can't hash keyword %s with chosen key positions.\n%a", key, 1)); - } - *ptr = '\0'; /* Terminate this bastard.... */ - /* Sort the KEY_SET items alphabetically. */ - set_sort (char_set, ptr - char_set); -} diff --git a/apps/gperf/src/List_Node.h b/apps/gperf/src/List_Node.h deleted file mode 100644 index 6b3e86ce694..00000000000 --- a/apps/gperf/src/List_Node.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Data and function members for defining values and operations of a list node. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#ifndef list_node_h -#define list_node_h 1 - -#include "Options.h" - -struct List_Node -{ - List_Node (char *key, int len); - static void set_sort (char *base, int len); - - List_Node *link; - // TRUE if key has an identical KEY_SET as another key. - - List_Node *next; - // Points to next element on the list. - - char *key; - // Each keyword string stored here. - - char *rest; - // Additional information for building hash function. - - char *char_set; - // Set of characters to hash, specified by user. - - int length; - // Length of the key. - - int hash_value; - // Hash value for the key. - - int occurrence; - // A metric for frequency of key set occurrences. - - int index; - // Position of this node relative to other nodes. -}; - -#endif diff --git a/apps/gperf/src/Makefile b/apps/gperf/src/Makefile deleted file mode 100644 index ca6221f7156..00000000000 --- a/apps/gperf/src/Makefile +++ /dev/null @@ -1,155 +0,0 @@ -#---------------------------------------------------------------------------- -# @(#)Makefile 1.1 10/18/96 -# -# Makefile for GPERF release -#---------------------------------------------------------------------------- - -BIN = gperf -LIB = libGperf.a - -FILES = new \ - Options \ - Iterator \ - Gen_Perf \ - Key_List \ - List_Node \ - Hash_Table \ - Bool_Array \ - Vectors \ - Version - -LSRC = $(addsuffix .cpp,$(FILES)) -LOBJ = $(addsuffix .o,$(FILES)) - -LDLIBS = -lGperf - -VLDLIBS = $(LDLIBS:%=%$(VAR)) - -BUILD = $(VLIB) $(VBIN) - -#---------------------------------------------------------------------------- -# Include macros and targets -#---------------------------------------------------------------------------- - -include $(WRAPPER_ROOT)/include/makeinclude/wrapper_macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/macros.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.common.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.nonested.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.lib.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.bin.GNU -include $(WRAPPER_ROOT)/include/makeinclude/rules.local.GNU - -# DO NOT DELETE THIS LINE -- g++dep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. - -.obj/new.o .shobj/new.so: new.cpp Options.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i -.obj/Options.o .shobj/Options.so: Options.cpp \ - $(WRAPPER_ROOT)/ace/Get_Opt.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - Options.h Iterator.h -.obj/Iterator.o .shobj/Iterator.so: Iterator.cpp Iterator.h Options.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i -.obj/Gen_Perf.o .shobj/Gen_Perf.so: Gen_Perf.cpp Gen_Perf.h Options.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - Key_List.h List_Node.h Bool_Array.h -.obj/Key_List.o .shobj/Key_List.so: Key_List.cpp \ - $(WRAPPER_ROOT)/ace/Read_Buffer.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - $(WRAPPER_ROOT)/ace/Malloc.h \ - $(WRAPPER_ROOT)/ace/Malloc_T.h \ - $(WRAPPER_ROOT)/ace/Synch.h \ - $(WRAPPER_ROOT)/ace/Synch_T.h \ - $(WRAPPER_ROOT)/ace/Memory_Pool.h \ - $(WRAPPER_ROOT)/ace/Event_Handler.h \ - $(WRAPPER_ROOT)/ace/Signal.h \ - $(WRAPPER_ROOT)/ace/Set.h \ - $(WRAPPER_ROOT)/ace/Mem_Map.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.h \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Simple.i \ - $(WRAPPER_ROOT)/ace/SV_Semaphore_Complex.i \ - $(WRAPPER_ROOT)/ace/Read_Buffer.i \ - Hash_Table.h Options.h List_Node.h Vectors.h Key_List.h -.obj/List_Node.o .shobj/List_Node.so: List_Node.cpp Vectors.h List_Node.h Options.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i -.obj/Hash_Table.o .shobj/Hash_Table.so: Hash_Table.cpp \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i \ - Hash_Table.h Options.h List_Node.h -.obj/Bool_Array.o .shobj/Bool_Array.so: Bool_Array.cpp Bool_Array.h Options.h \ - $(WRAPPER_ROOT)/ace/Log_Msg.h \ - $(WRAPPER_ROOT)/ace/Log_Record.h \ - $(WRAPPER_ROOT)/ace/ACE.h \ - $(WRAPPER_ROOT)/ace/OS.h \ - $(WRAPPER_ROOT)/ace/Time_Value.h \ - $(WRAPPER_ROOT)/ace/config.h \ - $(WRAPPER_ROOT)/ace/Trace.h \ - $(WRAPPER_ROOT)/ace/ACE.i \ - $(WRAPPER_ROOT)/ace/Log_Priority.h \ - $(WRAPPER_ROOT)/ace/Log_Record.i -.obj/Version.o .shobj/Version.so: Version.cpp - -# IF YOU PUT ANYTHING HERE IT WILL GO AWAY diff --git a/apps/gperf/src/Options.cpp b/apps/gperf/src/Options.cpp deleted file mode 100644 index 1aa819503e7..00000000000 --- a/apps/gperf/src/Options.cpp +++ /dev/null @@ -1,616 +0,0 @@ -/* Handles parsing the Options provided to the user. -// $Id$ - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "ace/Get_Opt.h" -#include "Options.h" -#include "Iterator.h" - -/* Global option coordinator for the entire program. */ -Options option; - -/* Current program version. */ -extern char *version_string; - -/* Size to jump on a collision. */ -static const int DEFAULT_JUMP_VALUE = 5; - -/* Default name for generated lookup function. */ -static const char *const DEFAULT_NAME = "in_word_set"; - -/* Default name for the key component. */ -static const char *const DEFAULT_KEY = "name"; - -/* Default name for the generated class. */ -static const char *const DEFAULT_CLASS_NAME = "Perfect_Hash"; - -/* Default name for generated hash function. */ -static const char *const DEFAULT_HASH_NAME = "hash"; - -/* Default delimiters that separate keywords from their attributes. */ -static const char *const DEFAULT_DELIMITERS = ",\n"; - -int Options::option_word; -int Options::total_switches; -int Options::total_keysig_size; -int Options::size; -int Options::key_pos; -int Options::jump; -int Options::initial_asso_value; -int Options::argument_count; -int Options::iterations; -char **Options::argument_vector; -const char *Options::function_name; -const char *Options::key_name; -const char *Options::class_name; -const char *Options::hash_name; -const char *Options::delimiters; -char Options::key_positions[MAX_KEY_POS]; - -/* Prints program usage to standard error stream. */ - -inline void -Options::usage (void) -{ - ACE_ERROR ((LM_ERROR, "Usage: %n [-acCdDef[num]gGhH<hashname>i<init>Ijk<keys>K<keyname>lL<language>nN<function name>oOprs<size>S<switches>tTvZ<class name>].\n" - "(type %n -h for help)\n")); -} - -/* Output command-line Options. */ - -void -Options::print_options (void) -{ - int i; - - printf ("/* Command-line: "); - - for (i = 0; i < argument_count; i++) - printf ("%s ", argument_vector[i]); - - printf (" */"); -} - -/* Sorts the key positions *IN REVERSE ORDER!!* - This makes further routines more efficient. Especially when generating code. - Uses a simple Insertion Sort since the set is probably ordered. - Returns 1 if there are no duplicates, 0 otherwise. */ - -inline int -Options::key_sort (char *base, int len) -{ - int i, j; - - for (i = 0, j = len - 1; i < j; i++) - { - int curr, tmp; - - for (curr = i + 1,tmp = base[curr]; curr > 0 && tmp >= base[curr - 1]; curr--) - if ((base[curr] = base[curr - 1]) == tmp) /* oh no, a duplicate!!! */ - return 0; - - base[curr] = tmp; - } - - return 1; -} - -/* Sets the default Options. */ - -Options::Options (void) -{ - key_positions[0] = WORD_START; - key_positions[1] = WORD_END; - key_positions[2] = EOS; - total_keysig_size = 2; - delimiters = DEFAULT_DELIMITERS; - jump = DEFAULT_JUMP_VALUE; - option_word = DEFAULTCHARS | C; - function_name = DEFAULT_NAME; - key_name = DEFAULT_KEY; - hash_name = DEFAULT_HASH_NAME; - class_name = DEFAULT_CLASS_NAME; - total_switches = size = 1; - initial_asso_value = iterations = 0; -} - -/* Dumps option status when debug is set. */ - -Options::~Options (void) -{ - if (option_word & DEBUG) - { - char *ptr; - - fprintf (stderr, "\ndumping Options:\nDEBUG is.......: %s\nORDER is.......: %s" - "\nANSI is........: %s\nTYPE is........: %s\nGNU is.........: %s" - "\nRANDOM is......: %s\nDEFAULTCHARS is: %s\nSWITCH is......: %s" - "\nPOINTER is.....: %s\nNOLENGTH is....: %s\nLENTABLE is....: %s" - "\nDUP is.........: %s\nFAST is........: %s\nCOMP is.....: %s" - "\nNOTYPE is......: %s\nGLOBAL is......: %s\nCONST is....: %s" - "\nCPLUSPLUS is...: %s\nC is...........: %s\nENUM is.....: %s" - "\nSTRCASECMP is...: %s\nOPTIMIZE is...........: %s" - "\niterations = %d\nlookup function name = %s\nhash function name = %s" - "\nkey name = %s\njump value = %d\nmax associcated value = %d" - "\ninitial associated value = %d\ndelimiters = %s\nnumber of switch statements = %d\n", - option_word & DEBUG ? "enabled" : "disabled", - option_word & ORDER ? "enabled" : "disabled", - option_word & ANSI ? "enabled" : "disabled", - option_word & TYPE ? "enabled" : "disabled", - option_word & GNU ? "enabled" : "disabled", - option_word & RANDOM ? "enabled" : "disabled", - option_word & DEFAULTCHARS ? "enabled" : "disabled", - option_word & SWITCH ? "enabled" : "disabled", - option_word & POINTER ? "enabled" : "disabled", - option_word & NOLENGTH ? "enabled" : "disabled", - option_word & LENTABLE ? "enabled" : "disabled", - option_word & DUP ? "enabled" : "disabled", - option_word & FAST ? "enabled" : "disabled", - option_word & COMP ? "enabled" : "disabled", - option_word & NOTYPE ? "enabled" : "disabled", - option_word & GLOBAL ? "enabled" : "disabled", - option_word & CONST ? "enabled" : "disabled", - option_word & CPLUSPLUS ? "enabled" : "disabled", - option_word & C ? "enabled" : "disabled", - option_word & ENUM ? "enabled" : "disabled", - option_word & STRCASECMP ? "enabled" : "disabled", - option_word & OPTIMIZE ? "enabled" : "disabled", - iterations, function_name, hash_name, key_name, jump, size - 1, - initial_asso_value, delimiters, total_switches); - if (option_word & ALLCHARS) - fprintf (stderr, "all characters are used in the hash function\n"); - - fprintf (stderr, "maximum keysig size = %d\nkey positions are: \n", - total_keysig_size); - - for (ptr = key_positions; *ptr != EOS; ptr++) - if (*ptr == WORD_END) - fprintf (stderr, "$\n"); - else - fprintf (stderr, "%d\n", *ptr); - - fprintf (stderr, "finished dumping Options\n"); - } -} - - -/* Parses the command line Options and sets appropriate flags in option_word. */ - -void -Options::operator() (int argc, char *argv[]) -{ - ACE_LOG_MSG->open (argv[0]); - - ACE_Get_Opt getopt (argc, argv, "adcCDe:Ef:gGhH:i:Ij:k:K:lL:nN:oOprs:S:tTvZ:"); - int option_char; - - argument_count = argc; - argument_vector = argv; - - while ((option_char = getopt ()) != -1) - { - switch (option_char) - { - case 'a': /* Generated coded uses the ANSI prototype format. */ - { - option_word |= ANSI; - break; - } - case 'c': /* Generate strncmp rather than strcmp. */ - { - option_word |= COMP; - break; - } - case 'C': /* Make the generated tables readonly (const). */ - { - option_word |= CONST; - break; - } - case 'd': /* Enable debugging option. */ - { - option_word |= DEBUG; - ACE_ERROR ((LM_ERROR, "Starting program %n, version %s, with debuggin on.\n", - version_string)); - break; - } - case 'D': /* Enable duplicate option. */ - { - option_word |= DUP; - break; - } - case 'e': /* Allows user to provide keyword/attribute separator */ - { - option.delimiters = getopt.optarg; - break; - } - case 'E': - { - option_word |= ENUM; - break; - } - case 'f': /* Generate the hash table ``fast.'' */ - { - option_word |= FAST; - if ((iterations = atoi (getopt.optarg)) < 0) - { - ACE_ERROR ((LM_ERROR, "iterations value must not be negative, assuming 0\n")); - iterations = 0; - } - break; - } - case 'g': /* Use the ``inline'' keyword for generated sub-routines. */ - { - option_word |= GNU; - break; - } - case 'G': /* Make the keyword table a global variable. */ - { - option_word |= GLOBAL; - break; - } - case 'h': /* Displays a list of helpful Options to the user. */ - { - ACE_ERROR ((LM_ERROR, - "-a\tGenerate ANSI standard C output code, i.e., function prototypes.\n" - "-c\tGenerate comparison code using strncmp rather than strcmp.\n" - "-C\tMake the contents of generated lookup tables constant, i.e., readonly.\n" - "-d\tEnables the debugging option (produces verbose output to the standard error).\n" - "-D\tHandle keywords that hash to duplicate values. This is useful\n" - "\tfor certain highly redundant keyword sets. It enables the -S option.\n" - "-e\tAllow user to provide a string containing delimiters used to separate\n" - "\tkeywords from their attributes. Default is \",\\n\"\n" - "-E\tDefine constant values using an enum local to the lookup function\n" - "\trather than with defines\n" - "-f\tGenerate the gen-perf.hash function ``fast.'' This decreases GPERF's\n" - "\trunning time at the cost of minimizing generated table-size.\n" - "\tThe numeric argument represents the number of times to iterate when\n" - "\tresolving a collision. `0' means ``iterate by the number of keywords.''\n" - "-g\tAssume a GNU compiler, e.g., g++ or gcc. This makes all generated\n" - "\troutines use the ``inline'' keyword to remove cost of function calls.\n" - "-G\tGenerate the static table of keywords as a static global variable,\n" - "\trather than hiding it inside of the lookup function (which is the\n" - "\tdefault behavior).\n" - "-h\tPrints this mesage.\n" - "-H\tAllow user to specify name of generated hash function. Default\n" - "\tis `hash'.\n" - "-i\tProvide an initial value for the associate values array. Default is 0.\n" - "-I\tGenerate comparison code using case insensitive string comparison, e.g.,\n" - "\tstrncasecmp or strcasecmp.\n" - "\tSetting this value larger helps inflate the size of the final table.\n" - "-j\tAffects the ``jump value,'' i.e., how far to advance the associated\n" - "\tcharacter value upon collisions. Must be an odd number, default is %d.\n" - "-k\tAllows selection of the key positions used in the hash function.\n" - "\tThe allowable choices range between 1-%d, inclusive. The positions\n" - "\tare separated by commas, ranges may be used, and key positions may\n" - "\toccur in any order. Also, the meta-character '*' causes the generated\n" - "\thash function to consider ALL key positions, and $ indicates the\n" - "\t``final character'' of a key, e.g., $,1,2,4,6-10.\n" - "-K\tAllow use to select name of the keyword component in the keyword structure.\n" - "-l\tCompare key lengths before trying a string comparison. This helps\n" - "\tcut down on the number of string comparisons made during the lookup.\n" - "-L\tGenerates code in the language specified by the option's argument. Languages\n" - "\thandled are currently C++ and C. The default is C.\n" - "-n\tDo not include the length of the keyword when computing the hash function\n" - "-N\tAllow user to specify name of generated lookup function. Default\n" - "\tname is `in_word_set.'\n" - "-o\tReorders input keys by frequency of occurrence of the key sets.\n" - "\tThis should decrease the search time dramatically.\n" - "-O\tOptimize the generated lookup function by assuming that all input keywords \n" - "\tare members of the keyset from the keyfile.\n" - "-p\tChanges the return value of the generated function ``in_word_set''\n" - "\tfrom its default boolean value (i.e., 0 or 1), to type ``pointer\n" - "\tto wordlist array'' This is most useful when the -t option, allowing\n" - "\tuser-defined structs, is used.\n" - "-r\tUtilizes randomness to initialize the associated values table.\n" - "-s\tAffects the size of the generated hash table. The numeric argument\n" - "\tfor this option indicates ``how many times larger or smaller'' the associated\n" - "\tvalue range should be, in relationship to the number of keys, e.g. a value of 3\n" - "\tmeans ``allow the maximum associated value to be about 3 times larger than the\n" - "\tnumber of input keys.'' Conversely, a value of -3 means ``make the maximum\n" - "\tassociated value about 3 times smaller than the number of input keys.\n" - "\tA larger table should decrease the time required for an unsuccessful search,\n" - "\tat the expense of extra table space. Default value is 1.\n" - "-S\tCauses the generated C code to use a switch statement scheme, rather\n" - "\tthan an array lookup table. This can lead to a reduction in both\n" - "\ttime and space requirements for some keyfiles. The argument to\n" - "\tthis option determines how many switch statements are generated.\n" - "\tA value of 1 generates 1 switch containing all the elements, a value of 2\n" - "\tgenerates 2 tables with 1/2 the elements in each table, etc. This\n" - "\tis useful since many C compilers cannot correctly generate code for\n" - "\tlarge switch statements.\n" - "-t\tAllows the user to include a structured type declaration for \n" - "\tgenerated code. Any text before %%%% is consider part of the type\n" - "\tdeclaration. Key words and additional fields may follow this, one\n" - "\tgroup of fields per line.\n" - "-T\tPrevents the transfer of the type declaration to the output file.\n" - "\tUse this option if the type is already defined elsewhere.\n" - "-v\tPrints out the current version number\n" - "-Z\tAllow user to specify name of generated C++ class. Default\n" - "\tname is `Perfect_Hash.'\n%e%a", DEFAULT_JUMP_VALUE, (MAX_KEY_POS - 1), usage, 1)); - } - case 'H': /* Sets the name for the hash function */ - { - hash_name = getopt.optarg; - break; - } - case 'i': /* Sets the initial value for the associated values array. */ - { - if ((initial_asso_value = atoi (getopt.optarg)) < 0) - ACE_ERROR ((LM_ERROR, "Initial value %d should be non-zero, ignoring and continuing.\n", initial_asso_value)); - if (option[RANDOM]) - ACE_ERROR ((LM_ERROR, "warning, -r option superceeds -i, ignoring -i option and continuing\n")); - break; - } - case 'I': - { - option_word |= STRCASECMP; - break; - } - case 'j': /* Sets the jump value, must be odd for later algorithms. */ - { - if ((jump = atoi (getopt.optarg)) < 0) - ACE_ERROR ((LM_ERROR, "Jump value %d must be a positive number.\n%e%a", jump, usage, 1)); - else if (jump && ACE_EVEN (jump)) - ACE_ERROR ((LM_ERROR, "Jump value %d should be odd, adding 1 and continuing...\n", jump++)); - break; - } - case 'k': /* Sets key positions used for hash function. */ - { - const int BAD_VALUE = -1; - int value; - Iterator expand (getopt.optarg, 1, MAX_KEY_POS - 1, WORD_END, BAD_VALUE, EOS); - - if (*getopt.optarg == '*') /* Use all the characters for hashing!!!! */ - option_word = (option_word & ~DEFAULTCHARS) | ALLCHARS; - else - { - char *l_key_pos; - - for (l_key_pos = key_positions; (value = expand ()) != EOS; l_key_pos++) - if (value == BAD_VALUE) - ACE_ERROR ((LM_ERROR, "Illegal key value or range, use 1,2,3-%d,'$' or '*'.\n%e%a", - MAX_KEY_POS - 1, usage, 1)); - else - *l_key_pos = value;; - - *l_key_pos = EOS; - - if (! (total_keysig_size = (l_key_pos - key_positions))) - ACE_ERROR ((LM_ERROR, "No keys selected.\n%e%a", usage, 1)); - else if (! key_sort (key_positions, total_keysig_size)) - ACE_ERROR ((LM_ERROR, "Duplicate keys selected\n%e%a", usage, 1)); - - if (total_keysig_size != 2 - || (key_positions[0] != 1 || key_positions[1] != WORD_END)) - option_word &= ~DEFAULTCHARS; - } - break; - } - case 'K': /* Make this the keyname for the keyword component field. */ - { - key_name = getopt.optarg; - break; - } - case 'l': /* Create length table to avoid extra string compares. */ - { - option_word |= LENTABLE; - break; - } - case 'L': /* Deal with different generated languages. */ - { - option_word &= ~C; - if (!strcmp (getopt.optarg, "C++")) - option_word |= (CPLUSPLUS | ANSI); - else if (!strcmp (getopt.optarg, "C")) - option_word |= C; - else - { - ACE_ERROR ((LM_ERROR, "unsupported language option %s, defaulting to C\n", getopt.optarg)); - option_word |= C; - } - break; - } - case 'n': /* Don't include the length when computing hash function. */ - { - option_word |= NOLENGTH; - break; - } - case 'N': /* Make generated lookup function name be optarg */ - { - function_name = getopt.optarg; - break; - } - case 'o': /* Order input by frequency of key set occurrence. */ - { - option_word |= ORDER; - break; - } - case 'O': - { - option_word |= OPTIMIZE; - break; - } - case 'p': /* Generated lookup function now a pointer instead of int. */ - { - option_word |= POINTER; - break; - } - case 'r': /* Utilize randomness to initialize the associated values table. */ - { - option_word |= RANDOM; - if (option.initial_asso_value != 0) - ACE_ERROR ((LM_ERROR, "warning, -r option superceeds -i, disabling -i option and continuing\n")); - break; - } - case 's': /* Range of associated values, determines size of final table. */ - { - if (abs (size = atoi (getopt.optarg)) > 50) - ACE_ERROR ((LM_ERROR, "%d is excessive, did you really mean this?! (type %n -h for help)\n", size)); - break; - } - case 'S': /* Generate switch statement output, rather than lookup table. */ - { - option_word |= SWITCH; - if ((option.total_switches = atoi (getopt.optarg)) <= 0) - ACE_ERROR ((LM_ERROR, "number of switches %s must be a positive number\n%e%a", getopt.optarg, usage, 1)); - break; - } - case 't': /* Enable the TYPE mode, allowing arbitrary user structures. */ - { - option_word |= TYPE; - break; - } - case 'T': /* Don't print structure definition. */ - { - option_word |= NOTYPE; - break; - } - case 'v': /* Print out the version and quit. */ - ACE_ERROR ((LM_ERROR, "%n: version %s\n%e\n%a", version_string, usage, 1)); - case 'Z': /* Set the class name. */ - { - class_name = getopt.optarg; - break; - } - default: - ACE_ERROR ((LM_ERROR, "%e%a", usage, 1)); - } - - } - - if (argv[getopt.optind] && ! freopen (argv[getopt.optind], "r", stdin)) - ACE_ERROR ((LM_ERROR, "Cannot open keyword file %p\n%e%a", argv[getopt.optind], usage, 1)); - - if (++getopt.optind < argc) - ACE_ERROR ((LM_ERROR, "Extra trailing arguments to %n.\n%e%a", usage, 1)); -} - -int -Options::operator[] (Option_Type option) /* True if option enable, else false. */ -{ - return option_word & option; -} - -void -Options::operator = (enum Option_Type opt) /* Enables option OPT. */ -{ - option_word |= opt; -} - -void -Options::operator != (enum Option_Type opt) /* Disables option OPT. */ -{ - option_word &= ~opt; -} - -void -Options::reset (void) /* Initializes the key Iterator. */ -{ - key_pos = 0; -} - -int -Options::get (void) /* Returns current key_position and advanced index. */ -{ - return key_positions[key_pos++]; -} - -void -Options::set_asso_max (int r) /* Sets the size of the table size. */ -{ - size = r; -} - -int -Options::get_asso_max (void) /* Returns the size of the table size. */ -{ - return size; -} - -int -Options::get_max_keysig_size (void) /* Returns total distinct key positions. */ -{ - return total_keysig_size; -} - -void -Options::set_keysig_size (int a_size) /* Sets total distinct key positions. */ -{ - total_keysig_size = a_size; -} - -int -Options::get_jump (void) /* Returns the jump value. */ -{ - return jump; -} - -const char * -Options::get_function_name (void) /* Returns the generated function name. */ -{ - return function_name; -} - -const char * -Options::get_key_name (void) /* Returns the keyword key name. */ -{ - return key_name; -} - -const char * -Options::get_hash_name (void) /* Returns the hash function name. */ -{ - return hash_name; -} - -const char * -Options::get_class_name (void) /* Returns the generated class name. */ -{ - return class_name; -} - -int -Options::initial_value (void) /* Returns the initial associated character value. */ -{ - return initial_asso_value; -} - -int -Options::get_iterations (void) /* Returns the iterations value. */ -{ - return iterations; -} - -const char * -Options::get_delimiter () /* Returns the string used to delimit keywords from other attributes. */ -{ - return delimiters; -} - -int -Options::get_total_switches () /* Gets the total number of switch statements to generate. */ -{ - return total_switches; -} - - - - diff --git a/apps/gperf/src/Options.h b/apps/gperf/src/Options.h deleted file mode 100644 index 22579aac4d4..00000000000 --- a/apps/gperf/src/Options.h +++ /dev/null @@ -1,140 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Handles parsing the Options provided to the user. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -/* This module provides a uniform interface to the various options - available to a user of the gperf hash function generator. In - addition to the run-time options, found in the Option_Type below, - there is also the hash table Size and the Keys to be used in the - hashing. The overall design of this module was an experiment in - using C++ classes as a mechanism to enhance centralization of - option and and error handling, which tend to get out of hand in a C - program. */ - -#ifndef options_h -#define options_h 1 - -#include "ace/Log_Msg.h" - -/* Enumerate the potential debugging Options. */ - -enum Option_Type -{ - DEBUG = 01, /* Enable debugging (prints diagnostics to stderr). */ - ORDER = 02, /* Apply ordering heuristic to speed-up search time. */ - ANSI = 04, /* Generate ANSI prototypes. */ - ALLCHARS = 010, /* Use all characters in hash function. */ - GNU = 020, /* Assume GNU extensions (primarily function inline). */ - TYPE = 040, /* Handle user-defined type structured keyword input. */ - RANDOM = 0100, /* Randomly initialize the associated values table. */ - DEFAULTCHARS = 0200, /* Make default char positions be 1,$ (end of keyword). */ - SWITCH = 0400, /* Generate switch output to save space. */ - POINTER = 01000, /* Have in_word_set function return pointer, not boolean. */ - NOLENGTH = 02000, /* Don't include keyword length in hash computations. */ - LENTABLE = 04000, /* Generate a length table for string comparison. */ - DUP = 010000, /* Handle duplicate hash values for keywords. */ - FAST = 020000, /* Generate the hash function ``fast.'' */ - NOTYPE = 040000, /* Don't include user-defined type definition in output -- it's already defined elsewhere. */ - COMP = 0100000, /* Generate strncmp rather than strcmp. */ - GLOBAL = 0200000, /* Make the keyword table a global variable. */ - CONST = 0400000, /* Make the generated tables readonly (const). */ - CPLUSPLUS = 01000000, /* Generate C++ code. */ - C = 02000000, /* Generate C code. */ - ENUM = 04000000, /* Use enum for constants. */ - STRCASECMP = 010000000, /* Use the case insensitive comparison. */ - OPTIMIZE = 020000000, /* Assume all input keywords are in the keyset. */ - ADA = 040000000 /* Generate Ada code. */ -}; - -/* Define some useful constants (these don't really belong here, but I'm - not sure where else to put them!). These should be consts, but g++ - doesn't seem to do the right thing with them at the moment... ;-( */ - -enum -{ - MAX_KEY_POS = 128 - 1, /* Max size of each word's key set. */ - WORD_START = 1, /* Signals the start of a word. */ - WORD_END = 0, /* Signals the end of a word. */ - EOS = MAX_KEY_POS /* Signals end of the key list. */ -}; - -/* Class manager for gperf program Options. */ - -class Options -{ -public: - Options (void); - ~Options (void); - int operator[] (Option_Type option); - void operator() (int argc, char *argv[]); - void operator= (enum Option_Type); - void operator!= (enum Option_Type); - static void print_options (void); - static void set_asso_max (int r); - static int get_asso_max (void); - static void reset (void); - static int get (void); - static int get_iterations (void); - static int get_max_keysig_size (void); - static void set_keysig_size (int); - static int get_jump (void); - static int initial_value (void); - static int get_total_switches (void); - static const char *get_function_name (void); - static const char *get_key_name (void); - static const char *get_class_name (void); - static const char *get_hash_name (void); - static const char *get_delimiter (void); - -private: - static int option_word; /* Holds the user-specified Options. */ - static int total_switches; /* Number of switch statements to generate. */ - static int total_keysig_size; /* Total number of distinct key_positions. */ - static int size; /* Range of the hash table. */ - static int key_pos; /* Tracks current key position for Iterator. */ - static int jump; /* Jump length when trying alternative values. */ - static int initial_asso_value; /* Initial value for asso_values table. */ - static int argument_count; /* Records count of command-line arguments. */ - static int iterations; /* Amount to iterate when a collision occurs. */ - static char **argument_vector; /* Stores a pointer to command-line vector. */ - static const char *function_name; /* Names used for generated lookup function. */ - static const char *key_name; /* Name used for keyword key. */ - static const char *class_name; /* Name used for generated C++ class. */ - static const char *hash_name; /* Name used for generated hash function. */ - static const char *delimiters; /* Separates keywords from other attributes. */ - static char key_positions[MAX_KEY_POS]; /* Contains user-specified key choices. */ - static int key_sort (char *base, int len); /* Sorts key positions in REVERSE order. */ - static void usage (void); /* Prints proper program usage. */ -}; - -/* Global option coordinator for the entire program. */ -extern Options option; - -/* Set to 1 if your want to stack-allocate some large arrays. */ -#ifndef LARGE_STACK_ARRAYS -#define LARGE_STACK_ARRAYS 0 -#endif - -#endif diff --git a/apps/gperf/src/Vectors.cpp b/apps/gperf/src/Vectors.cpp deleted file mode 100644 index 218ebc9aa64..00000000000 --- a/apps/gperf/src/Vectors.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* This may look like C code, but it is really -*- C++ -*- */ -// $Id$ - - -/* Static class data members that are shared between several classes via - inheritance. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "Vectors.h" - -// Counts occurrences of each key set character. -int Vectors::occurrences[ALPHA_SIZE]; - -// Value associated with each character. -int Vectors::asso_values[ALPHA_SIZE]; diff --git a/apps/gperf/src/Vectors.h b/apps/gperf/src/Vectors.h deleted file mode 100644 index c557c7afe56..00000000000 --- a/apps/gperf/src/Vectors.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ - -#include <stdio.h> - -/* This may look like C code, but it is really -*- C++ -*- */ - -/* Static class data members that are shared between several classes via - inheritance. - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#ifndef vectors_h -#define vectors_h 1 - -static const int ALPHA_SIZE = 128; - -struct Vectors -{ - static int occurrences[ALPHA_SIZE]; - // Counts occurrences of each key set character. - - static int asso_values[ALPHA_SIZE]; - // Value associated with each character. -}; - -#endif diff --git a/apps/gperf/src/Version.cpp b/apps/gperf/src/Version.cpp deleted file mode 100644 index b26c55e4124..00000000000 --- a/apps/gperf/src/Version.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* Current program version number. -// $Id$ - - - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, -USA. */ - -char *version_string = "2.6 (GNU C++ version)"; diff --git a/apps/gperf/src/gperf.cpp b/apps/gperf/src/gperf.cpp deleted file mode 100644 index cb8577f950d..00000000000 --- a/apps/gperf/src/gperf.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* Driver program for the Gen_Perf hash function generator Copyright -// $Id$ - - (C) 1989 Free Software Foundation, Inc. written by Douglas - C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -// Simple driver program for the Gen_Perf.hash function generator. -// All the hard work is done in class Gen_Perf and its class methods. - -#include "Options.h" -#include "Gen_Perf.h" - -int -main (int argc, char *argv[]) -{ - - struct tm *tm; - time_t clock; - - time (&clock); - tm = localtime (&clock); - printf ("/* starting time is %d:%02d:%02d */\n", tm->tm_hour, tm->tm_min, tm->tm_sec); - -#if defined(RLIMIT_STACK) && LARGE_STACK_ARRAYS - /* Get rid of any avoidable limit on stack size. */ - { - struct rlimit rlim; - - /* Set the stack limit huge so that alloca does not fail. */ - getrlimit (RLIMIT_STACK, &rlim); - rlim.rlim_cur = rlim.rlim_max; - setrlimit (RLIMIT_STACK, &rlim); - } -#endif /* RLIMIT_STACK */ - - /* Sets the Options. */ - option (argc, argv); - - // Initializes the key word list. - Gen_Perf table; - - // Generates and prints the Gen_Perf hash table. Don't use exit - // here, it skips the destructors. - int status = table.generate (); - - time (&clock); - tm = localtime (&clock); - printf ("/* ending time is %d:%02d:%02d */\n", tm->tm_hour, tm->tm_min, tm->tm_sec); - return status; -} diff --git a/apps/gperf/src/new.cpp b/apps/gperf/src/new.cpp deleted file mode 100644 index 25cb527a98a..00000000000 --- a/apps/gperf/src/new.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* Defines a buffered memory allocation abstraction that reduces calls to -// $Id$ - - malloc. - Copyright (C) 1989 Free Software Foundation, Inc. - written by Douglas C. Schmidt (schmidt@ics.uci.edu) - -This file is part of GNU GPERF. - -GNU GPERF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ - -#include "Options.h" - -/* Determine default alignment. If your C++ compiler does not like - this then try something like #define DEFAULT_ALIGNMENT 8. */ -struct fooalign {char x; double d;}; -const int ALIGNMENT = ((char *)&((struct fooalign *) 0)->d - (char *)0); - -/* Provide an abstraction that cuts down on the number of calls to NEW - by buffering the memory pool from which strings are allocated. */ - -void * -operator new (size_t size) -{ - static char *buf_start = 0; /* Large array used to reduce calls to NEW. */ - static char *buf_end = 0; /* Indicates end of BUF_START. */ - static int buf_size = 4 * BUFSIZ; /* Size of buffer pointed to by BUF_START. */ - char *temp; - - /* Align this on correct boundaries, just to be safe... */ - size = ((size + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT; - - /* If we are about to overflow our buffer we'll just grab another - chunk of memory. Since we never free the original memory it - doesn't matter that no one points to the beginning of that - chunk. Note we use a heuristic that grows the buffer either by - size of the request or by twice the previous size, whichever is - larger. */ - - if (buf_start + size >= buf_end) - { - buf_size *= 2; - if (buf_size < size) - buf_size = size; - if (buf_start = (char *)malloc (buf_size)) - buf_end = buf_start + buf_size; - else - ACE_ERROR ((LM_ERROR, "Virtual memory failed at %s, %s in function %s\n%a", __FILE__, __LINE__, "operator new", 1)); - } - - temp = buf_start; - buf_start += size; - return temp; -} - -/* We need this deletion operator in order to make the linker happy. */ - -void -operator delete (void *ptr) -{ - // We cannot call free here, as it doesn't match the mallocs. - // free ((char *) ptr); -} diff --git a/apps/gperf/tests/Makefile.in b/apps/gperf/tests/Makefile.in deleted file mode 100644 index f702fc804f2..00000000000 --- a/apps/gperf/tests/Makefile.in +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright (C) 1989, 1992, 1993 Free Software Foundation, Inc. -# written by Douglas C. Schmidt (schmidt@ics.uci.edu) -# -# This file is part of GNU GPERF. -# -# GNU GPERF is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 1, or (at your option) -# any later version. -# -# GNU GPERF 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 GPERF; see the file COPYING. If not, write to the Free -# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111, USA. - -srcdir = . - -#### package, host, target, and site dependent Makefile fragments come in here. -## - -GPERF = ../src/gperf - -check: - @echo "performing some tests of the perfect hash generator" - $(CC) -c $(CFLAGS) $(srcdir)/test.c - $(GPERF) -p -c -l -S1 -o $(srcdir)/c.gperf > cinset.c - $(CC) $(CFLAGS) -o cout cinset.c test.o - @echo "testing ANSI C reserved words, all items should be found in the set" - ./cout -v < $(srcdir)/c.gperf > c.out - -diff -b $(srcdir)/c.exp c.out - $(GPERF) -k1,4,'$$' $(srcdir)/ada.gperf > adainset.c -# double '$$' is only there since make gets confused; programn wants only 1 '$' - $(CC) $(CFLAGS) -o aout adainset.c test.o - @echo "testing Ada reserved words, all items should be found in the set" - ./aout -v < $(srcdir)/ada.gperf > ada-res.out - -diff -b $(srcdir)/ada-res.exp ada-res.out - $(GPERF) -p -D -k1,'$$' -s 2 -o $(srcdir)/adadefs.gperf > preinset.c - $(CC) $(CFLAGS) -o preout preinset.c test.o - @echo "testing Ada predefined words, all items should be found in the set" - ./preout -v < $(srcdir)/adadefs.gperf > ada-pred.out - -diff -b $(srcdir)/ada-pred.exp ada-pred.out - $(GPERF) -k1,2,'$$' -o $(srcdir)/modula3.gperf > m3inset.c - $(CC) $(CFLAGS) -o m3out m3inset.c test.o - @echo "testing Modula3 reserved words, all items should be found in the set" - ./m3out -v < $(srcdir)/modula3.gperf > modula.out - -diff -b $(srcdir)/modula.exp modula.out - $(GPERF) -o -S2 -p < $(srcdir)/pascal.gperf > pinset.c - $(CC) $(CFLAGS) -o pout pinset.c test.o - @echo "testing Pascal reserved words, all items should be found in the set" - ./pout -v < $(srcdir)/pascal.gperf > pascal.out - -diff -b $(srcdir)/pascal.exp pascal.out -# these next 5 are demos that show off the generated code - $(GPERF) -p -j1 -g -o -t -N is_reserved_word -k1,3,'$$' < $(srcdir)/c-parse.gperf > test-1.out - -diff -b $(srcdir)/test-1.exp test-1.out - $(GPERF) -n -k1-8 -l <$(srcdir)/modula2.gperf > test-2.out - -diff -b $(srcdir)/test-2.exp test-2.out - $(GPERF) -p -j 1 -o -a -C -g -t -k1,4,$$ < $(srcdir)/gplus.gperf > test-3.out - -diff -b $(srcdir)/test-3.exp test-3.out - $(GPERF) -D -p -t < $(srcdir)/c-parse.gperf > test-4.out - -diff -b $(srcdir)/test-4.exp test-4.out - $(GPERF) -g -o -j1 -t -p -N is_reserved_word < $(srcdir)/gpc.gperf > test-5.out - -diff -b $(srcdir)/test-5.exp test-5.out -# prints out the help message - -$(GPERF) -h > test-6.out 2>&1 || [ a = a ] - -diff -b $(srcdir)/test-6.exp test-6.out - @echo "only if, do, for, case, goto, else, while, and return should be found " - ./aout -v < $(srcdir)/c.gperf > test-7.out - -diff -b $(srcdir)/test-7.exp test-7.out diff --git a/apps/gperf/tests/ada-pred.exp b/apps/gperf/tests/ada-pred.exp deleted file mode 100644 index 33caaa32ea1..00000000000 --- a/apps/gperf/tests/ada-pred.exp +++ /dev/null @@ -1,54 +0,0 @@ -in word set boolean -in word set character -in word set constraint_error -in word set false -in word set float -in word set integer -in word set natural -in word set numeric_error -in word set positive -in word set program_error -in word set storage_error -in word set string -in word set tasking_error -in word set true -in word set address -in word set aft -in word set base -in word set callable -in word set constrained -in word set count -in word set delta -in word set digits -in word set emax -in word set epsilon -in word set first -in word set firstbit -in word set fore -in word set image -in word set large -in word set last -in word set lastbit -in word set length -in word set machine_emax -in word set machine_emin -in word set machine_mantissa -in word set machine_overflows -in word set machine_radix -in word set machine_rounds -in word set mantissa -in word set pos -in word set position -in word set pred -in word set range -in word set safe_emax -in word set safe_large -in word set safe_small -in word set size -in word set small -in word set storage_size -in word set succ -in word set terminated -in word set val -in word set value -in word set width diff --git a/apps/gperf/tests/ada-res.exp b/apps/gperf/tests/ada-res.exp deleted file mode 100644 index 8134fe861f5..00000000000 --- a/apps/gperf/tests/ada-res.exp +++ /dev/null @@ -1,63 +0,0 @@ -in word set else -in word set exit -in word set terminate -in word set type -in word set raise -in word set range -in word set reverse -in word set declare -in word set end -in word set record -in word set exception -in word set not -in word set then -in word set return -in word set separate -in word set select -in word set digits -in word set renames -in word set subtype -in word set elsif -in word set function -in word set for -in word set package -in word set procedure -in word set private -in word set while -in word set when -in word set new -in word set entry -in word set delay -in word set case -in word set constant -in word set at -in word set abort -in word set accept -in word set and -in word set delta -in word set access -in word set abs -in word set pragma -in word set array -in word set use -in word set out -in word set do -in word set others -in word set of -in word set or -in word set all -in word set limited -in word set loop -in word set null -in word set task -in word set in -in word set is -in word set if -in word set rem -in word set mod -in word set begin -in word set body -in word set xor -in word set goto -in word set generic -in word set with diff --git a/apps/gperf/tests/ada.gperf b/apps/gperf/tests/ada.gperf deleted file mode 100644 index 332bdc740ad..00000000000 --- a/apps/gperf/tests/ada.gperf +++ /dev/null @@ -1,63 +0,0 @@ -else -exit -terminate -type -raise -range -reverse -declare -end -record -exception -not -then -return -separate -select -digits -renames -subtype -elsif -function -for -package -procedure -private -while -when -new -entry -delay -case -constant -at -abort -accept -and -delta -access -abs -pragma -array -use -out -do -others -of -or -all -limited -loop -null -task -in -is -if -rem -mod -begin -body -xor -goto -generic -with diff --git a/apps/gperf/tests/adadefs.gperf b/apps/gperf/tests/adadefs.gperf deleted file mode 100644 index 875be69abc9..00000000000 --- a/apps/gperf/tests/adadefs.gperf +++ /dev/null @@ -1,54 +0,0 @@ -boolean -character -constraint_error -false -float -integer -natural -numeric_error -positive -program_error -storage_error -string -tasking_error -true -address -aft -base -callable -constrained -count -delta -digits -emax -epsilon -first -firstbit -fore -image -large -last -lastbit -length -machine_emax -machine_emin -machine_mantissa -machine_overflows -machine_radix -machine_rounds -mantissa -pos -position -pred -range -safe_emax -safe_large -safe_small -size -small -storage_size -succ -terminated -val -value -width diff --git a/apps/gperf/tests/c++.gperf b/apps/gperf/tests/c++.gperf deleted file mode 100644 index 650d32d0edd..00000000000 --- a/apps/gperf/tests/c++.gperf +++ /dev/null @@ -1,47 +0,0 @@ -asm -auto -break -case -catch -char -class -const -continue -default -delete -do -double -else -enum -extern -float -for -friend -goto -if -inline -int -long -new -operator -overload -private -protected -public -register -return -short -signed -sizeof -static -struct -switch -template -this -typedef -union -unsigned -virtual -void -volatile -while diff --git a/apps/gperf/tests/c-parse.gperf b/apps/gperf/tests/c-parse.gperf deleted file mode 100644 index feef59babb0..00000000000 --- a/apps/gperf/tests/c-parse.gperf +++ /dev/null @@ -1,56 +0,0 @@ -%{ -/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ -%} -struct resword { char *name; short token; enum rid rid; }; -%% -__alignof, ALIGNOF, NORID -__alignof__, ALIGNOF, NORID -__asm, ASM, NORID -__asm__, ASM, NORID -__attribute, ATTRIBUTE, NORID -__attribute__, ATTRIBUTE, NORID -__const, TYPE_QUAL, RID_CONST -__const__, TYPE_QUAL, RID_CONST -__inline, SCSPEC, RID_INLINE -__inline__, SCSPEC, RID_INLINE -__signed, TYPESPEC, RID_SIGNED -__signed__, TYPESPEC, RID_SIGNED -__typeof, TYPEOF, NORID -__typeof__, TYPEOF, NORID -__volatile, TYPE_QUAL, RID_VOLATILE -__volatile__, TYPE_QUAL, RID_VOLATILE -asm, ASM, NORID -auto, SCSPEC, RID_AUTO -break, BREAK, NORID -case, CASE, NORID -char, TYPESPEC, RID_CHAR -const, TYPE_QUAL, RID_CONST -continue, CONTINUE, NORID -default, DEFAULT, NORID -do, DO, NORID -double, TYPESPEC, RID_DOUBLE -else, ELSE, NORID -enum, ENUM, NORID -extern, SCSPEC, RID_EXTERN -float, TYPESPEC, RID_FLOAT -for, FOR, NORID -goto, GOTO, NORID -if, IF, NORID -inline, SCSPEC, RID_INLINE -int, TYPESPEC, RID_INT -long, TYPESPEC, RID_LONG -register, SCSPEC, RID_REGISTER -return, RETURN, NORID -short, TYPESPEC, RID_SHORT -signed, TYPESPEC, RID_SIGNED -sizeof, SIZEOF, NORID -static, SCSPEC, RID_STATIC -struct, STRUCT, NORID -switch, SWITCH, NORID -typedef, SCSPEC, RID_TYPEDEF -typeof, TYPEOF, NORID -union, UNION, NORID -unsigned, TYPESPEC, RID_UNSIGNED -void, TYPESPEC, RID_VOID -volatile, TYPE_QUAL, RID_VOLATILE -while, WHILE, NORID diff --git a/apps/gperf/tests/c.exp b/apps/gperf/tests/c.exp deleted file mode 100644 index 10c8b7f6116..00000000000 --- a/apps/gperf/tests/c.exp +++ /dev/null @@ -1,32 +0,0 @@ -in word set if -in word set do -in word set int -in word set for -in word set case -in word set char -in word set auto -in word set goto -in word set else -in word set long -in word set void -in word set enum -in word set float -in word set short -in word set union -in word set break -in word set while -in word set const -in word set double -in word set static -in word set extern -in word set struct -in word set return -in word set sizeof -in word set switch -in word set signed -in word set typedef -in word set default -in word set unsigned -in word set continue -in word set register -in word set volatile diff --git a/apps/gperf/tests/c.gperf b/apps/gperf/tests/c.gperf deleted file mode 100644 index 8672d6c25ed..00000000000 --- a/apps/gperf/tests/c.gperf +++ /dev/null @@ -1,32 +0,0 @@ -if -do -int -for -case -char -auto -goto -else -long -void -enum -float -short -union -break -while -const -double -static -extern -struct -return -sizeof -switch -signed -typedef -default -unsigned -continue -register -volatile diff --git a/apps/gperf/tests/configure.in b/apps/gperf/tests/configure.in deleted file mode 100644 index d93c7bb1840..00000000000 --- a/apps/gperf/tests/configure.in +++ /dev/null @@ -1,26 +0,0 @@ -# This file is a shell script fragment that supplies the information -# necessary to tailor a template configure script into the configure -# script appropriate for this directory. For more information, check -# any existing configure script. - -configdirs="" -srctrigger=c-parse.gperf -srcname="test perfect hash function generator" - -target_makefile_frag=../../target-mkfrag -package_makefile_frag=Make.pack - -# per-host: - -# per-target: - -TOLIBGXX=../../ -ALL='$(NOTHING)' -CHECK=check -MOSTLYCLEAN='*.o \#* core *inset.c output.* *.out aout cout m3out pout preout' - -(. ${srcdir}/../../config.shared) >${package_makefile_frag} - -# post-target: - -rm -f ${package_makefile_frag} diff --git a/apps/gperf/tests/gpc.gperf b/apps/gperf/tests/gpc.gperf deleted file mode 100644 index 8fb469e46bc..00000000000 --- a/apps/gperf/tests/gpc.gperf +++ /dev/null @@ -1,48 +0,0 @@ -%{ -/* ISO Pascal 7185 reserved words. - * - * For GNU Pascal compiler (GPC) by jtv@hut.fi - * - * run this through the Doug Schmidt's gperf program - * with command - * gperf -g -o -j1 -t -p -N is_reserved_word - * - */ -%} -struct resword { char *name; short token; short iclass;}; -%% -And, AND, PASCAL_ISO -Array, ARRAY, PASCAL_ISO -Begin, BEGIN_, PASCAL_ISO -Case, CASE, PASCAL_ISO -Const, CONST, PASCAL_ISO -Div, DIV, PASCAL_ISO -Do, DO, PASCAL_ISO -Downto, DOWNTO, PASCAL_ISO -Else, ELSE, PASCAL_ISO -End, END, PASCAL_ISO -File, FILE_, PASCAL_ISO -For, FOR, PASCAL_ISO -Function, FUNCTION, PASCAL_ISO -Goto, GOTO, PASCAL_ISO -If, IF, PASCAL_ISO -In, IN, PASCAL_ISO -Label, LABEL, PASCAL_ISO -Mod, MOD, PASCAL_ISO -Nil, NIL, PASCAL_ISO -Not, NOT, PASCAL_ISO -Of, OF, PASCAL_ISO -Or, OR, PASCAL_ISO -Packed, PACKED, PASCAL_ISO -Procedure, PROCEDURE, PASCAL_ISO -Program,PROGRAM,PASCAL_ISO -Record, RECORD, PASCAL_ISO -Repeat, REPEAT, PASCAL_ISO -Set, SET, PASCAL_ISO -Then, THEN, PASCAL_ISO -To, TO, PASCAL_ISO -Type, TYPE, PASCAL_ISO -Until, UNTIL, PASCAL_ISO -Var, VAR, PASCAL_ISO -While, WHILE, PASCAL_ISO -With, WITH, PASCAL_ISO diff --git a/apps/gperf/tests/gplus.gperf b/apps/gperf/tests/gplus.gperf deleted file mode 100644 index 4a93315be52..00000000000 --- a/apps/gperf/tests/gplus.gperf +++ /dev/null @@ -1,76 +0,0 @@ -%{ -/* Command-line: gperf -p -j1 -g -o -t -N is_reserved_word -k1,4,$ gplus.gperf */ -%} -struct resword { char *name; short token; enum rid rid;}; -%% -__alignof, ALIGNOF, NORID -__alignof__, ALIGNOF, NORID -__asm, ASM, NORID -__asm__, ASM, NORID -__attribute, ATTRIBUTE, NORID -__attribute__, ATTRIBUTE, NORID -__const, TYPE_QUAL, RID_CONST -__const__, TYPE_QUAL, RID_CONST -__inline, SCSPEC, RID_INLINE -__inline__, SCSPEC, RID_INLINE -__signed, TYPESPEC, RID_SIGNED -__signed__, TYPESPEC, RID_SIGNED -__typeof, TYPEOF, NORID -__typeof__, TYPEOF, NORID -__volatile, TYPE_QUAL, RID_VOLATILE -__volatile__, TYPE_QUAL, RID_VOLATILE -all, ALL, NORID /* Extension */, -except, EXCEPT, NORID /* Extension */, -exception, AGGR, RID_EXCEPTION /* Extension */, -raise, RAISE, NORID /* Extension */, -raises, RAISES, NORID /* Extension */, -reraise, RERAISE, NORID /* Extension */, -try, TRY, NORID /* Extension */, -asm, ASM, NORID, -auto, SCSPEC, RID_AUTO, -break, BREAK, NORID, -case, CASE, NORID, -catch, CATCH, NORID, -char, TYPESPEC, RID_CHAR, -class, AGGR, RID_CLASS, -const, TYPE_QUAL, RID_CONST, -continue, CONTINUE, NORID, -default, DEFAULT, NORID, -delete, DELETE, NORID, -do, DO, NORID, -double, TYPESPEC, RID_DOUBLE, -dynamic, DYNAMIC, NORID, -else, ELSE, NORID, -enum, ENUM, NORID, -extern, SCSPEC, RID_EXTERN, -float, TYPESPEC, RID_FLOAT, -for, FOR, NORID, -friend, SCSPEC, RID_FRIEND, -goto, GOTO, NORID, -if, IF, NORID, -inline, SCSPEC, RID_INLINE, -int, TYPESPEC, RID_INT, -long, TYPESPEC, RID_LONG, -new, NEW, NORID, -operator, OPERATOR, NORID, -overload, OVERLOAD, NORID, -private, PRIVATE, NORID, -protected, PROTECTED, NORID, -public, PUBLIC, NORID, -register, SCSPEC, RID_REGISTER, -return, RETURN, NORID, -short, TYPESPEC, RID_SHORT, -signed, TYPESPEC, RID_SIGNED, -sizeof, SIZEOF, NORID, -static, SCSPEC, RID_STATIC, -struct, AGGR, RID_RECORD, -switch, SWITCH, NORID, -this, THIS, NORID, -typedef, SCSPEC, RID_TYPEDEF, -typeof, TYPEOF, NORID, -union, AGGR, RID_UNION, -unsigned, TYPESPEC, RID_UNSIGNED, -virtual, SCSPEC, RID_VIRTUAL, -void, TYPESPEC, RID_VOID, -volatile, TYPE_QUAL, RID_VOLATILE, -while, WHILE, NORID, diff --git a/apps/gperf/tests/irc.gperf b/apps/gperf/tests/irc.gperf deleted file mode 100644 index afe53c59e7d..00000000000 --- a/apps/gperf/tests/irc.gperf +++ /dev/null @@ -1,63 +0,0 @@ -%{ -extern int m_text(), m_private(), m_who(), m_whois(), m_user(), m_list(); -extern int m_topic(), m_invite(), m_channel(), m_version(), m_quit(); -extern int m_server(), m_kill(), m_info(), m_links(), m_summon(), m_stats(); -extern int m_users(), m_nick(), m_error(), m_help(), m_whoreply(); -extern int m_squit(), m_restart(), m_away(), m_die(), m_connect(); -extern int m_ping(), m_pong(), m_oper(), m_pass(), m_wall(), m_trace(); -extern int m_time(), m_rehash(), m_names(), m_namreply(), m_admin(); -extern int m_linreply(), m_notice(), m_lusers(), m_voice(), m_grph(); -extern int m_xtra(), m_motd(); -%} -struct Message { - char *cmd; - int (* func)(); - int count; - int parameters; -}; -%% -NICK, m_nick, 0, 1 -MSG, m_text, 0, 1 -PRIVMSG, m_private, 0, 2 -WHO, m_who, 0, 1 -WHOIS, m_whois, 0, 4 -USER, m_user, 0, 4 -SERVER, m_server, 0, 2 -LIST, m_list, 0, 1 -TOPIC, m_topic, 0, 1 -INVITE, m_invite, 0, 2 -CHANNEL, m_channel, 0, 1 -VERSION, m_version, 0, 1 -QUIT, m_quit, 0, 2 -SQUIT, m_squit, 0, 2 -KILL, m_kill, 0, 2 -INFO, m_info, 0, 1 -LINKS, m_links, 0, 1 -SUMMON, m_summon, 0, 1 -STATS, m_stats, 0, 1 -USERS, m_users, 0, 1 -RESTART, m_restart, 0, 1 -WHOREPLY,m_whoreply, 0, 7 -HELP, m_help, 0, 2 -ERROR, m_error, 0, 1 -AWAY, m_away, 0, 1 -DIE, m_die, 0, 1 -CONNECT, m_connect, 0, 3 -PING, m_ping, 0, 2 -PONG, m_pong, 0, 3 -OPER, m_oper, 0, 3 -PASS, m_pass, 0, 2 -WALL, m_wall, 0, 1 -TIME, m_time, 0, 1 -REHASH, m_rehash, 0, 1 -NAMES, m_names, 0, 1 -NAMREPLY,m_namreply, 0, 3 -ADMIN, m_admin, 0, 1 -TRACE, m_trace, 0, 1 -LINREPLY,m_linreply, 0, 2 -NOTICE, m_notice, 0, 2 -LUSERS, m_lusers, 0, 1 -VOICE, m_voice, 0, 2 -GRPH, m_grph, 0, 2 -XTRA, m_xtra, 0, 2 -MOTD, m_motd, 0, 2 diff --git a/apps/gperf/tests/makeinfo.gperf b/apps/gperf/tests/makeinfo.gperf deleted file mode 100644 index 1488b8e38fb..00000000000 --- a/apps/gperf/tests/makeinfo.gperf +++ /dev/null @@ -1,116 +0,0 @@ -COMMAND; -%% -!, cm_force_sentence_end, false -', insert_self, false -*, cm_asterisk, false -., cm_force_sentence_end, false -:, cm_force_abbreviated_whitespace, false -?, cm_force_sentence_end, false -@, insert_self, false -TeX, cm_TeX, true -`, insert_self, false -appendix, cm_appendix, false -appendixsec, cm_appendixsec, false -appendixsubsec, cm_appendixsubsec, false -asis, cm_asis, true -b, cm_bold, true -br, cm_br, false -bullet, cm_bullet, true -bye, cm_bye, false -c, cm_comment, false -center, cm_center, false -chapter, cm_chapter, false -cindex, cm_cindex, false -cite, cm_cite, true -code, cm_code, true -comment, cm_comment, false -contents, do_nothing, false -copyright, cm_copyright, true -ctrl, cm_ctrl, true -defcodeindex, cm_defindex, false -defindex, cm_defindex, false -dfn, cm_dfn, true -display, cm_display, false -dots, cm_dots, true -emph, cm_emph, true -end, cm_end, false -enumerate, cm_enumerate, false -equiv, cm_equiv, true -error, cm_error, true -example, cm_example, false -exdent, cm_exdent, false -expansion, cm_expansion, true -file, cm_file, true -findex, cm_findex, false -format, cm_format, false -group, cm_group, false -i, cm_italic, true -iappendix, cm_appendix, false -iappendixsec, cm_appendixsec, false -iappendixsubsec, cm_appendixsubsec, false -ichapter, cm_chapter, false -ifinfo, cm_ifinfo, false -iftex, cm_iftex, false -ignore, cm_ignore, false -include, cm_include, false -inforef, cm_inforef, true -input, cm_include, false -isection, cm_section, false -isubsection, cm_subsection, false -isubsubsection, cm_subsubsection, false -item, cm_item, false -itemize, cm_itemize, false -itemx, cm_itemx, false -iunnumbered, cm_unnumbered, false -iunnumberedsec, cm_unnumberedsec, false -iunnumberedsubsec, cm_unnumberedsubsec, false -kbd, cm_kbd, true -key, cm_key, true -kindex, cm_kindex, false -lisp, cm_lisp, false -menu, cm_menu -minus, cm_minus, true -need, cm_need, false -node, cm_node, false -noindent, cm_noindent, false -page, do_nothing, false -pindex, cm_pindex, false -point, cm_point, true -print, cm_print, true -printindex, cm_printindex, false -pxref, cm_pxref, true -quotation, cm_quotation, false -r, cm_roman, true -ref, cm_xref, true -refill, cm_refill, false -result, cm_result, true -samp, cm_samp, true -sc, cm_sc, true -section, cm_section, false -setchapternewpage, cm_setchapternewpage, false -setfilename, cm_setfilename, false -settitle, cm_settitle, false -smallexample, cm_smallexample, false -sp, cm_sp, false -strong, cm_strong, true -subsection, cm_subsection, false -subsubsection, cm_subsubsection, false -summarycontents, do_nothing, false -syncodeindex, cm_synindex, false -synindex, cm_synindex, false -t, cm_title, true -table, cm_table, false -tex, cm_tex, false -tindex, cm_tindex, false -titlepage, cm_titlepage, false -unnumbered, cm_unnumbered, false -unnumberedsec, cm_unnumberedsec, false -unnumberedsubsec, cm_unnumberedsubsec, false -var, cm_var, true -vindex, cm_vindex, false -w, cm_w, true -xref, cm_xref, true -{, insert_self, false -}, insert_self, false -infoinclude, cm_infoinclude, false -footnote, cm_footnote, false diff --git a/apps/gperf/tests/modula.exp b/apps/gperf/tests/modula.exp deleted file mode 100644 index cef7d5acad8..00000000000 --- a/apps/gperf/tests/modula.exp +++ /dev/null @@ -1,106 +0,0 @@ -in word set AND -in word set ARRAY -in word set BEGIN -in word set BITS -in word set BY -in word set CASE -in word set CONST -in word set DIV -in word set DO -in word set ELSE -in word set ELSIF -in word set END -in word set EVAL -in word set EXCEPT -in word set EXCEPTION -in word set EXIT -in word set EXPORTS -in word set FINALLY -in word set FOR -in word set FROM -in word set IF -in word set IMPORT -in word set INTERFACE -in word set IN -in word set INLINE -in word set LOCK -in word set METHODS -in word set MOD -in word set MODULE -in word set NOT -in word set OBJECT -in word set OF -in word set OR -in word set PROCEDURE -in word set RAISES -in word set READONLY -in word set RECORD -in word set REF -in word set REPEAT -in word set RETURN -in word set SET -in word set THEN -in word set TO -in word set TRY -in word set TYPE -in word set TYPECASE -in word set UNSAFE -in word set UNTIL -in word set UNTRACED -in word set VALUE -in word set VAR -in word set WHILE -in word set WITH -in word set and -in word set array -in word set begin -in word set bits -in word set by -in word set case -in word set const -in word set div -in word set do -in word set else -in word set elsif -in word set end -in word set eval -in word set except -in word set exception -in word set exit -in word set exports -in word set finally -in word set for -in word set from -in word set if -in word set import -in word set interface -in word set in -in word set inline -in word set lock -in word set methods -in word set mod -in word set module -in word set not -in word set object -in word set of -in word set or -in word set procedure -in word set raises -in word set readonly -in word set record -in word set ref -in word set repeat -in word set return -in word set set -in word set then -in word set to -in word set try -in word set type -in word set typecase -in word set unsafe -in word set until -in word set untraced -in word set value -in word set var -in word set while -in word set with diff --git a/apps/gperf/tests/modula2.gperf b/apps/gperf/tests/modula2.gperf deleted file mode 100644 index 5ef9c753835..00000000000 --- a/apps/gperf/tests/modula2.gperf +++ /dev/null @@ -1,40 +0,0 @@ -AND -ARRAY -BEGIN -BY -CASE -CONST -DEFINITION -DIV -DO -ELSE -ELSIF -END -EXIT -EXPORT -FOR -FROM -IF -IMPLEMENTATION -IMPORT -IN -LOOP -MOD -MODULE -NOT -OF -OR -POINTER -PROCEDURE -QUALIFIED -RECORD -REPEAT -RETURN -SET -THEN -TO -TYPE -UNTIL -VAR -WHILE -WITH diff --git a/apps/gperf/tests/modula3.gperf b/apps/gperf/tests/modula3.gperf deleted file mode 100644 index d0243460d9b..00000000000 --- a/apps/gperf/tests/modula3.gperf +++ /dev/null @@ -1,106 +0,0 @@ -AND -ARRAY -BEGIN -BITS -BY -CASE -CONST -DIV -DO -ELSE -ELSIF -END -EVAL -EXCEPT -EXCEPTION -EXIT -EXPORTS -FINALLY -FOR -FROM -IF -IMPORT -INTERFACE -IN -INLINE -LOCK -METHODS -MOD -MODULE -NOT -OBJECT -OF -OR -PROCEDURE -RAISES -READONLY -RECORD -REF -REPEAT -RETURN -SET -THEN -TO -TRY -TYPE -TYPECASE -UNSAFE -UNTIL -UNTRACED -VALUE -VAR -WHILE -WITH -and -array -begin -bits -by -case -const -div -do -else -elsif -end -eval -except -exception -exit -exports -finally -for -from -if -import -interface -in -inline -lock -methods -mod -module -not -object -of -or -procedure -raises -readonly -record -ref -repeat -return -set -then -to -try -type -typecase -unsafe -until -untraced -value -var -while -with diff --git a/apps/gperf/tests/pascal.exp b/apps/gperf/tests/pascal.exp deleted file mode 100644 index 765e44c6a0f..00000000000 --- a/apps/gperf/tests/pascal.exp +++ /dev/null @@ -1,36 +0,0 @@ -in word set with -in word set array -in word set and -in word set function -in word set case -in word set var -in word set const -in word set until -in word set then -in word set set -in word set record -in word set program -in word set procedure -in word set or -in word set packed -in word set not -in word set nil -in word set label -in word set in -in word set repeat -in word set of -in word set goto -in word set forward -in word set for -in word set while -in word set file -in word set else -in word set downto -in word set do -in word set div -in word set to -in word set type -in word set end -in word set mod -in word set begin -in word set if diff --git a/apps/gperf/tests/pascal.gperf b/apps/gperf/tests/pascal.gperf deleted file mode 100644 index fed3fbb30ea..00000000000 --- a/apps/gperf/tests/pascal.gperf +++ /dev/null @@ -1,36 +0,0 @@ -with -array -and -function -case -var -const -until -then -set -record -program -procedure -or -packed -not -nil -label -in -repeat -of -goto -forward -for -while -file -else -downto -do -div -to -type -end -mod -begin -if diff --git a/apps/gperf/tests/test-1.exp b/apps/gperf/tests/test-1.exp deleted file mode 100644 index 5788cf7dfc3..00000000000 --- a/apps/gperf/tests/test-1.exp +++ /dev/null @@ -1,140 +0,0 @@ -/* C code produced by gperf version 2.5 (GNU C++ version) */ -/* Command-line: ../src/gperf -p -j1 -g -o -t -N is_reserved_word -k1,3,$ */ -/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ -struct resword { char *name; short token; enum rid rid; }; - -#define TOTAL_KEYWORDS 51 -#define MIN_WORD_LENGTH 2 -#define MAX_WORD_LENGTH 13 -#define MIN_HASH_VALUE 8 -#define MAX_HASH_VALUE 82 -/* maximum key range = 75, duplicates = 0 */ - -#ifdef __GNUC__ -inline -#endif -static unsigned int -hash (str, len) - register char *str; - register int unsigned len; -{ - static unsigned char asso_values[] = - { - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 0, 83, 1, 2, 34, - 19, 6, 11, 29, 0, 17, 83, 0, 23, 28, - 26, 30, 31, 83, 15, 1, 0, 28, 13, 4, - 83, 83, 5, 83, 83, 83, 83, 83, - }; - register int hval = len; - - switch (hval) - { - default: - case 3: - hval += asso_values[str[2]]; - case 2: - case 1: - hval += asso_values[str[0]]; - break; - } - return hval + asso_values[str[len - 1]]; -} - -#ifdef __GNUC__ -inline -#endif -struct resword * -is_reserved_word (str, len) - register char *str; - register unsigned int len; -{ - static struct resword wordlist[] = - { - {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, - {"__asm__", ASM, NORID}, - {"",}, - {"__typeof__", TYPEOF, NORID}, - {"__signed__", TYPESPEC, RID_SIGNED}, - {"__alignof__", ALIGNOF, NORID}, - {"break", BREAK, NORID}, - {"__attribute__", ATTRIBUTE, NORID}, - {"",}, {"",}, - {"else", ELSE, NORID}, - {"__attribute", ATTRIBUTE, NORID}, - {"__typeof", TYPEOF, NORID}, - {"int", TYPESPEC, RID_INT}, - {"__alignof", ALIGNOF, NORID}, - {"struct", STRUCT, NORID}, - {"sizeof", SIZEOF, NORID}, - {"switch", SWITCH, NORID}, - {"__volatile__", TYPE_QUAL, RID_VOLATILE}, - {"",}, - {"__inline__", SCSPEC, RID_INLINE}, - {"__signed", TYPESPEC, RID_SIGNED}, - {"__volatile", TYPE_QUAL, RID_VOLATILE}, - {"if", IF, NORID}, - {"__inline", SCSPEC, RID_INLINE}, - {"while", WHILE, NORID}, - {"",}, - {"__asm", ASM, NORID}, - {"auto", SCSPEC, RID_AUTO}, - {"short", TYPESPEC, RID_SHORT}, - {"default", DEFAULT, NORID}, - {"extern", SCSPEC, RID_EXTERN}, - {"",}, {"",}, - {"__const", TYPE_QUAL, RID_CONST}, - {"static", SCSPEC, RID_STATIC}, - {"__const__", TYPE_QUAL, RID_CONST}, - {"for", FOR, NORID}, - {"case", CASE, NORID}, - {"float", TYPESPEC, RID_FLOAT}, - {"return", RETURN, NORID}, - {"typeof", TYPEOF, NORID}, - {"typedef", SCSPEC, RID_TYPEDEF}, - {"volatile", TYPE_QUAL, RID_VOLATILE}, - {"do", DO, NORID}, - {"inline", SCSPEC, RID_INLINE}, - {"void", TYPESPEC, RID_VOID}, - {"char", TYPESPEC, RID_CHAR}, - {"signed", TYPESPEC, RID_SIGNED}, - {"unsigned", TYPESPEC, RID_UNSIGNED}, - {"",}, {"",}, - {"double", TYPESPEC, RID_DOUBLE}, - {"asm", ASM, NORID}, - {"",}, {"",}, - {"goto", GOTO, NORID}, - {"",}, - {"const", TYPE_QUAL, RID_CONST}, - {"enum", ENUM, NORID}, - {"register", SCSPEC, RID_REGISTER}, - {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, - {"continue", CONTINUE, NORID}, - {"",}, - {"union", UNION, NORID}, - {"",}, {"",}, {"",}, {"",}, {"",}, - {"long", TYPESPEC, RID_LONG}, - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register char *s = wordlist[key].name; - - if (*s == *str && !strcmp (str + 1, s + 1)) - return &wordlist[key]; - } - } - return 0; -} diff --git a/apps/gperf/tests/test-2.exp b/apps/gperf/tests/test-2.exp deleted file mode 100644 index f74124155eb..00000000000 --- a/apps/gperf/tests/test-2.exp +++ /dev/null @@ -1,183 +0,0 @@ -/* C code produced by gperf version 2.5 (GNU C++ version) */ -/* Command-line: ../src/gperf -n -k1-8 -l */ - -#define TOTAL_KEYWORDS 40 -#define MIN_WORD_LENGTH 2 -#define MAX_WORD_LENGTH 14 -#define MIN_HASH_VALUE 1 -#define MAX_HASH_VALUE 256 -/* maximum key range = 256, duplicates = 0 */ - -static unsigned int -hash (str, len) - register char *str; - register int unsigned len; -{ - static unsigned short asso_values[] = - { - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 25, 30, 35, 21, 0, - 30, 15, 30, 45, 257, 257, 0, 5, 45, 0, - 10, 0, 1, 20, 25, 15, 30, 40, 15, 5, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, - }; - register int hval = 0; - - switch (len) - { - default: - case 8: - hval += asso_values[str[7]]; - case 7: - hval += asso_values[str[6]]; - case 6: - hval += asso_values[str[5]]; - case 5: - hval += asso_values[str[4]]; - case 4: - hval += asso_values[str[3]]; - case 3: - hval += asso_values[str[2]]; - case 2: - hval += asso_values[str[1]]; - case 1: - hval += asso_values[str[0]]; - break; - } - return hval; -} - -char * -in_word_set (str, len) - register char *str; - register unsigned int len; -{ - - static unsigned char lengthtable[] = - { - 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 2, 3, 0, - 0, 0, 2, 3, 0, 0, 0, 2, 4, 0, 0, 0, 4, 6, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 3, 5, 6, 0, 0, 6, 0, 0, 0, 0, 3, 0, 0, 0, - 3, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 9, - 0, 4, 6, 6, 0, 0, 2, 3, 0, 0, 0, 5, 3, 0, - 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 7, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 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, - 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, 10, - }; - static char *wordlist[] = - { - "", - "OR", - "", "", "", "", "", "", "", "", - "LOOP", - "", "", "", "", "", "", "", "", "", - "ELSE", - "DO", - "", "", "", - "TO", - "MOD", - "", "", "", - "OF", - "FOR", - "", "", "", - "BY", - "FROM", - "", "", "", - "TYPE", - "MODULE", - "", "", "", - "SET", - "", "", "", "", "", - "EXPORT", - "", "", "", "", - "VAR", - "ARRAY", - "RECORD", - "", "", - "REPEAT", - "", "", "", "", - "END", - "", "", "", - "NOT", - "", "", "", "", - "IF", - "", "", "", "", - "CASE", - "", "", - "PROCEDURE", - "", - "EXIT", - "IMPORT", - "RETURN", - "", "", - "IN", - "AND", - "", "", "", - "ELSIF", - "DIV", - "", "", "", - "THEN", - "", "", "", "", "", "", "", "", "", - "IMPLEMENTATION", - "", "", "", "", - "WHILE", - "", "", "", "", "", "", "", "", "", - "CONST", - "POINTER", - "", "", "", - "UNTIL", - "", "", "", "", - "BEGIN", - "", "", "", "", - "WITH", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "QUALIFIED", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", - "", "", "", "", "", - "DEFINITION", - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register char *s = wordlist[key]; - - if (len == lengthtable[key] - && *s == *str && !strcmp (str + 1, s + 1)) - return s; - } - } - return 0; -} diff --git a/apps/gperf/tests/test-3.exp b/apps/gperf/tests/test-3.exp deleted file mode 100644 index 5e889020657..00000000000 --- a/apps/gperf/tests/test-3.exp +++ /dev/null @@ -1,169 +0,0 @@ -/* C code produced by gperf version 2.5 (GNU C++ version) */ -/* Command-line: ../src/gperf -p -j 1 -o -a -C -g -t -k1,4,$ */ -/* Command-line: gperf -p -j1 -g -o -t -N is_reserved_word -k1,4,$ gplus.gperf */ -struct resword { char *name; short token; enum rid rid;}; - -#define TOTAL_KEYWORDS 71 -#define MIN_WORD_LENGTH 2 -#define MAX_WORD_LENGTH 13 -#define MIN_HASH_VALUE 4 -#define MAX_HASH_VALUE 147 -/* maximum key range = 144, duplicates = 0 */ - -#ifdef __GNUC__ -inline -#endif -static unsigned int -hash (register const char *str, register int len) -{ - static const unsigned char asso_values[] = - { - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 0, 148, 19, 6, 27, - 37, 0, 12, 1, 15, 63, 148, 4, 0, 56, - 20, 15, 42, 148, 31, 5, 26, 39, 32, 10, - 148, 40, 148, 148, 148, 148, 148, 148, - }; - register int hval = len; - - switch (hval) - { - default: - case 4: - hval += asso_values[str[3]]; - case 3: - case 2: - case 1: - hval += asso_values[str[0]]; - break; - } - return hval + asso_values[str[len - 1]]; -} - -#ifdef __GNUC__ -inline -#endif -const struct resword * -in_word_set (register const char *str, register int len) -{ - static const struct resword wordlist[] = - { - {"",}, {"",}, {"",}, {"",}, - {"else", ELSE, NORID,}, - {"",}, - {"long", TYPESPEC, RID_LONG,}, - {"",}, {"",}, {"",}, {"",}, - {"__alignof__", ALIGNOF, NORID}, - {"__asm__", ASM, NORID}, - {"",}, {"",}, - {"while", WHILE, NORID,}, - {"",}, {"",}, {"",}, {"",}, {"",}, - {"__alignof", ALIGNOF, NORID}, - {"all", ALL, NORID /* Extension */,}, - {"sizeof", SIZEOF, NORID,}, - {"__const__", TYPE_QUAL, RID_CONST}, - {"__volatile", TYPE_QUAL, RID_VOLATILE}, - {"extern", SCSPEC, RID_EXTERN,}, - {"__volatile__", TYPE_QUAL, RID_VOLATILE}, - {"__inline", SCSPEC, RID_INLINE}, - {"exception", AGGR, RID_EXCEPTION /* Extension */,}, - {"__inline__", SCSPEC, RID_INLINE}, - {"case", CASE, NORID,}, - {"except", EXCEPT, NORID /* Extension */,}, - {"new", NEW, NORID,}, - {"break", BREAK, NORID,}, - {"goto", GOTO, NORID,}, - {"",}, - {"__attribute", ATTRIBUTE, NORID}, - {"",}, - {"__attribute__", ATTRIBUTE, NORID}, - {"this", THIS, NORID,}, - {"raise", RAISE, NORID /* Extension */,}, - {"class", AGGR, RID_CLASS,}, - {"delete", DELETE, NORID,}, - {"typeof", TYPEOF, NORID,}, - {"typedef", SCSPEC, RID_TYPEDEF,}, - {"for", FOR, NORID,}, - {"raises", RAISES, NORID /* Extension */,}, - {"__const", TYPE_QUAL, RID_CONST}, - {"double", TYPESPEC, RID_DOUBLE,}, - {"__typeof__", TYPEOF, NORID}, - {"",}, - {"switch", SWITCH, NORID,}, - {"auto", SCSPEC, RID_AUTO,}, - {"do", DO, NORID,}, - {"friend", SCSPEC, RID_FRIEND,}, - {"",}, - {"reraise", RERAISE, NORID /* Extension */,}, - {"",}, - {"volatile", TYPE_QUAL, RID_VOLATILE,}, - {"__typeof", TYPEOF, NORID}, - {"continue", CONTINUE, NORID,}, - {"float", TYPESPEC, RID_FLOAT,}, - {"const", TYPE_QUAL, RID_CONST,}, - {"static", SCSPEC, RID_STATIC,}, - {"virtual", SCSPEC, RID_VIRTUAL,}, - {"__asm", ASM, NORID}, - {"short", TYPESPEC, RID_SHORT,}, - {"signed", TYPESPEC, RID_SIGNED,}, - {"try", TRY, NORID /* Extension */,}, - {"",}, {"",}, {"",}, - {"__signed__", TYPESPEC, RID_SIGNED}, - {"catch", CATCH, NORID,}, - {"public", PUBLIC, NORID,}, - {"struct", AGGR, RID_RECORD,}, - {"if", IF, NORID,}, - {"asm", ASM, NORID,}, - {"union", AGGR, RID_UNION,}, - {"",}, - {"private", PRIVATE, NORID,}, - {"",}, {"",}, {"",}, - {"operator", OPERATOR, NORID,}, - {"",}, {"",}, {"",}, - {"default", DEFAULT, NORID,}, - {"dynamic", DYNAMIC, NORID,}, - {"overload", OVERLOAD, NORID,}, - {"int", TYPESPEC, RID_INT,}, - {"char", TYPESPEC, RID_CHAR,}, - {"",}, {"",}, - {"return", RETURN, NORID,}, - {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, - {"",}, {"",}, - {"__signed", TYPESPEC, RID_SIGNED}, - {"",}, - {"void", TYPESPEC, RID_VOID,}, - {"",}, {"",}, {"",}, - {"protected", PROTECTED, NORID,}, - {"",}, - {"enum", ENUM, NORID,}, - {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, - {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, - {"inline", SCSPEC, RID_INLINE,}, - {"register", SCSPEC, RID_REGISTER,}, - {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, - {"",}, {"",}, {"",}, {"",}, - {"unsigned", TYPESPEC, RID_UNSIGNED,}, - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register const char *s = wordlist[key].name; - - if (*s == *str && !strcmp (str + 1, s + 1)) - return &wordlist[key]; - } - } - return 0; -} diff --git a/apps/gperf/tests/test-4.exp b/apps/gperf/tests/test-4.exp deleted file mode 100644 index 5238bf94d98..00000000000 --- a/apps/gperf/tests/test-4.exp +++ /dev/null @@ -1,138 +0,0 @@ -/* C code produced by gperf version 2.5 (GNU C++ version) */ -/* Command-line: ../src/gperf -D -p -t */ -/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ -struct resword { char *name; short token; enum rid rid; }; - -#define TOTAL_KEYWORDS 51 -#define MIN_WORD_LENGTH 2 -#define MAX_WORD_LENGTH 13 -#define MIN_HASH_VALUE 4 -#define MAX_HASH_VALUE 82 -/* maximum key range = 79, duplicates = 2 */ - -static unsigned int -hash (str, len) - register char *str; - register int unsigned len; -{ - static unsigned char asso_values[] = - { - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 0, 83, 40, 20, 50, - 25, 10, 30, 0, 0, 50, 83, 0, 15, 0, - 35, 0, 83, 83, 20, 0, 10, 40, 5, 15, - 83, 83, 83, 83, 83, 83, 83, 83, - }; - return len + asso_values[str[len - 1]] + asso_values[str[0]]; -} - -struct resword * -in_word_set (str, len) - register char *str; - register unsigned int len; -{ - static struct resword wordlist[] = - { - {"",}, {"",}, {"",}, {"",}, - {"goto", GOTO, NORID}, - {"__asm", ASM, NORID}, - {"switch", SWITCH, NORID}, - {"__asm__", ASM, NORID}, - {"__const__", TYPE_QUAL, RID_CONST}, - {"__inline__", SCSPEC, RID_INLINE}, - {"__typeof__", TYPEOF, NORID}, - {"__signed__", TYPESPEC, RID_SIGNED}, - {"__alignof__", ALIGNOF, NORID}, - {"__volatile__", TYPE_QUAL, RID_VOLATILE}, - {"__attribute__", ATTRIBUTE, NORID}, - {"enum", ENUM, NORID}, - {"short", TYPESPEC, RID_SHORT}, - {"struct", STRUCT, NORID}, - {"__const", TYPE_QUAL, RID_CONST}, - {"__inline", SCSPEC, RID_INLINE}, - {"long", TYPESPEC, RID_LONG}, - {"__volatile", TYPE_QUAL, RID_VOLATILE}, - {"__attribute", ATTRIBUTE, NORID}, - {"volatile", TYPE_QUAL, RID_VOLATILE}, - {"else", ELSE, NORID}, - {"break", BREAK, NORID}, - {"do", DO, NORID}, - {"while", WHILE, NORID}, - {"signed", TYPESPEC, RID_SIGNED}, - {"__signed", TYPESPEC, RID_SIGNED}, - {"void", TYPESPEC, RID_VOID}, - {"sizeof", SIZEOF, NORID}, - {"__typeof", TYPEOF, NORID}, - {"__alignof", ALIGNOF, NORID}, - {"double", TYPESPEC, RID_DOUBLE}, - {"default", DEFAULT, NORID}, - {"asm", ASM, NORID}, - {"auto", SCSPEC, RID_AUTO}, - {"float", TYPESPEC, RID_FLOAT}, - {"typeof", TYPEOF, NORID}, - {"typedef", SCSPEC, RID_TYPEDEF}, - {"register", SCSPEC, RID_REGISTER}, - {"extern", SCSPEC, RID_EXTERN}, - {"for", FOR, NORID}, - {"static", SCSPEC, RID_STATIC}, - {"return", RETURN, NORID}, - {"int", TYPESPEC, RID_INT}, - {"case", CASE, NORID}, - {"const", TYPE_QUAL, RID_CONST}, - {"inline", SCSPEC, RID_INLINE}, - {"continue", CONTINUE, NORID}, - {"unsigned", TYPESPEC, RID_UNSIGNED}, - {"char", TYPESPEC, RID_CHAR}, - {"union", UNION, NORID}, - {"if", IF, NORID}, - }; - - static char lookup[] = - { - -1, -1, -1, -1, 4, 5, 6, 7, -1, 8, 100, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, 23, 24, 25, -1, 26, - -9, -3, 27, 28, -1, 29, 30, -1, 31, -1, 32, 33, -1, 34, - 35, 36, 37, 38, 39, 40, 41, -1, -1, 42, -1, 43, -1, -1, - 44, -1, -1, -1, -1, 45, -1, 46, 47, 48, 49, -1, 50, -1, - -1, -1, -1, 51, 52, -1, -1, -1, -1, -1, 53, -1, 54, - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register int index = lookup[key]; - - if (index >= 0 && index < MAX_HASH_VALUE) - { - register char *s = wordlist[index].name; - - if (*s == *str && !strcmp (str + 1, s + 1)) - return &wordlist[index]; - } - else if (index < 0 && index >= -MAX_HASH_VALUE) - return 0; - else - { - register int offset = key + index + (index > 0 ? -MAX_HASH_VALUE : MAX_HASH_VALUE); - register struct resword *base = &wordlist[-lookup[offset]]; - register struct resword *ptr = base + -lookup[offset + 1]; - - while (--ptr >= base) - if (*str == *ptr->name && !strcmp (str + 1, ptr->name + 1)) - return ptr; - } - } - } - return 0; -} diff --git a/apps/gperf/tests/test-5.exp b/apps/gperf/tests/test-5.exp deleted file mode 100644 index 101e2798d40..00000000000 --- a/apps/gperf/tests/test-5.exp +++ /dev/null @@ -1,111 +0,0 @@ -/* C code produced by gperf version 2.5 (GNU C++ version) */ -/* Command-line: ../src/gperf -g -o -j1 -t -p -N is_reserved_word */ -/* ISO Pascal 7185 reserved words. - * - * For GNU Pascal compiler (GPC) by jtv@hut.fi - * - * run this through the Doug Schmidt's gperf program - * with command - * gperf -g -o -j1 -t -p -N is_reserved_word - * - */ -struct resword { char *name; short token; short iclass;}; - -#define TOTAL_KEYWORDS 35 -#define MIN_WORD_LENGTH 2 -#define MAX_WORD_LENGTH 9 -#define MIN_HASH_VALUE 2 -#define MAX_HASH_VALUE 43 -/* maximum key range = 42, duplicates = 0 */ - -#ifdef __GNUC__ -inline -#endif -static unsigned int -hash (str, len) - register char *str; - register int unsigned len; -{ - static unsigned char asso_values[] = - { - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 18, 29, 14, 6, 7, - 10, 20, 44, 28, 44, 44, 28, 19, 22, 15, - 0, 44, 9, 23, 0, 23, 26, 2, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 0, 0, 13, 44, 30, 44, 44, 44, 0, 25, - 1, 0, 44, 44, 0, 44, 1, 44, 25, 44, - 44, 0, 44, 44, 44, 44, 44, 44, - }; - return len + asso_values[str[len - 1]] + asso_values[str[0]]; -} - -#ifdef __GNUC__ -inline -#endif -struct resword * -is_reserved_word (str, len) - register char *str; - register unsigned int len; -{ - static struct resword wordlist[] = - { - {"",}, {"",}, - {"To", TO, PASCAL_ISO}, - {"",}, - {"Type", TYPE, PASCAL_ISO}, - {"Then", THEN, PASCAL_ISO}, - {"Packed", PACKED, PASCAL_ISO}, - {"While", WHILE, PASCAL_ISO}, - {"Do", DO, PASCAL_ISO}, - {"Procedure", PROCEDURE, PASCAL_ISO}, - {"End", END, PASCAL_ISO}, - {"Else", ELSE, PASCAL_ISO}, - {"Downto", DOWNTO, PASCAL_ISO}, - {"For", FOR, PASCAL_ISO}, - {"File", FILE_, PASCAL_ISO}, - {"Record", RECORD, PASCAL_ISO}, - {"Repeat", REPEAT, PASCAL_ISO}, - {"Or", OR, PASCAL_ISO}, - {"Case", CASE, PASCAL_ISO}, - {"Function", FUNCTION, PASCAL_ISO}, - {"Const", CONST, PASCAL_ISO}, - {"And", AND, PASCAL_ISO}, - {"Mod", MOD, PASCAL_ISO}, - {"Array", ARRAY, PASCAL_ISO}, - {"Goto", GOTO, PASCAL_ISO}, - {"Nil", NIL, PASCAL_ISO}, - {"Not", NOT, PASCAL_ISO}, - {"Set", SET, PASCAL_ISO}, - {"Until", UNTIL, PASCAL_ISO}, - {"Var", VAR, PASCAL_ISO}, - {"Of", OF, PASCAL_ISO}, - {"In", IN, PASCAL_ISO}, - {"Program", PROGRAM,PASCAL_ISO}, - {"Label", LABEL, PASCAL_ISO}, - {"Div", DIV, PASCAL_ISO}, - {"Begin", BEGIN_, PASCAL_ISO}, - {"With", WITH, PASCAL_ISO}, - {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, - {"If", IF, PASCAL_ISO}, - }; - - if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) - { - register int key = hash (str, len); - - if (key <= MAX_HASH_VALUE && key >= 0) - { - register char *s = wordlist[key].name; - - if (*s == *str && !strcmp (str + 1, s + 1)) - return &wordlist[key]; - } - } - return 0; -} diff --git a/apps/gperf/tests/test-6.exp b/apps/gperf/tests/test-6.exp deleted file mode 100644 index eba6e3cac9a..00000000000 --- a/apps/gperf/tests/test-6.exp +++ /dev/null @@ -1,74 +0,0 @@ --a Generate ANSI standard C output code, i.e., function prototypes. --c Generate comparison code using strncmp rather than strcmp. --C Make the contents of generated lookup tables constant, i.e., readonly. --d Enables the debugging option (produces verbose output to the standard error). --D Handle keywords that hash to duplicate values. This is useful - for certain highly redundant keyword sets. It enables the -S option. --e Allow user to provide a string containing delimiters used to separate - keywords from their attributes. Default is ",\n" --E Define constant values using an enum local to the lookup function - rather than with defines --f Generate the gen-perf.hash function ``fast.'' This decreases GPERF's - running time at the cost of minimizing generated table-size. - The numeric argument represents the number of times to iterate when - resolving a collision. `0' means ``iterate by the number of keywords.'' --g Assume a GNU compiler, e.g., g++ or gcc. This makes all generated - routines use the ``inline'' keyword to remove cost of function calls. --G Generate the static table of keywords as a static global variable, - rather than hiding it inside of the lookup function (which is the - default behavior). --h Prints this mesage. --H Allow user to specify name of generated hash function. Default - is `hash'. --i Provide an initial value for the associate values array. Default is 0. - Setting this value larger helps inflate the size of the final table. --j Affects the ``jump value,'' i.e., how far to advance the associated - character value upon collisions. Must be an odd number, default is 5. --k Allows selection of the key positions used in the hash function. - The allowable choices range between 1-126, inclusive. The positions - are separated by commas, ranges may be used, and key positions may - occur in any order. Also, the meta-character '*' causes the generated - hash function to consider ALL key positions, and $ indicates the - ``final character'' of a key, e.g., $,1,2,4,6-10. --K Allow use to select name of the keyword component in the keyword structure. --l Compare key lengths before trying a string comparison. This helps - cut down on the number of string comparisons made during the lookup. --L Generates code in the language specified by the option's argument. Languages - handled are currently C++ and C. The default is C. --n Do not include the length of the keyword when computing the hash function --N Allow user to specify name of generated lookup function. Default - name is `in_word_set.' --o Reorders input keys by frequency of occurrence of the key sets. - This should decrease the search time dramatically. --p Changes the return value of the generated function ``in_word_set'' - from its default boolean value (i.e., 0 or 1), to type ``pointer - to wordlist array'' This is most useful when the -t option, allowing - user-defined structs, is used. --r Utilizes randomness to initialize the associated values table. --s Affects the size of the generated hash table. The numeric argument - for this option indicates ``how many times larger or smaller'' the associated - value range should be, in relationship to the number of keys, e.g. a value of 3 - means ``allow the maximum associated value to be about 3 times larger than the - number of input keys.'' Conversely, a value of -3 means ``make the maximum - associated value about 3 times smaller than the number of input keys. - A larger table should decrease the time required for an unsuccessful search, - at the expense of extra table space. Default value is 1. --S Causes the generated C code to use a switch statement scheme, rather - than an array lookup table. This can lead to a reduction in both - time and space requirements for some keyfiles. The argument to - this option determines how many switch statements are generated. - A value of 1 generates 1 switch containing all the elements, a value of 2 - generates 2 tables with 1/2 the elements in each table, etc. This - is useful since many C compilers cannot correctly generate code for - large switch statements. --t Allows the user to include a structured type declaration for - generated code. Any text before %% is consider part of the type - declaration. Key words and additional fields may follow this, one - group of fields per line. --T Prevents the transfer of the type declaration to the output file. - Use this option if the type is already defined elsewhere. --v Prints out the current version number --Z Allow user to specify name of generated C++ class. Default - name is `Perfect_Hash.' -Usage: ../src/gperf [-acCdDef[num]gGhH<hashname>i<init>jk<keys>K<keyname>lL<language>nN<function name>oprs<size>S<switches>tTvZ<class name>]. -(type ../src/gperf -h for help) diff --git a/apps/gperf/tests/test-7.exp b/apps/gperf/tests/test-7.exp deleted file mode 100644 index c5c942c10d1..00000000000 --- a/apps/gperf/tests/test-7.exp +++ /dev/null @@ -1,32 +0,0 @@ -in word set if -in word set do -NOT in word set int -in word set for -in word set case -NOT in word set char -NOT in word set auto -in word set goto -in word set else -NOT in word set long -NOT in word set void -NOT in word set enum -NOT in word set float -NOT in word set short -NOT in word set union -NOT in word set break -in word set while -NOT in word set const -NOT in word set double -NOT in word set static -NOT in word set extern -NOT in word set struct -in word set return -NOT in word set sizeof -NOT in word set switch -NOT in word set signed -NOT in word set typedef -NOT in word set default -NOT in word set unsigned -NOT in word set continue -NOT in word set register -NOT in word set volatile diff --git a/apps/gperf/tests/test.c b/apps/gperf/tests/test.c deleted file mode 100644 index 35d9015bba7..00000000000 --- a/apps/gperf/tests/test.c +++ /dev/null @@ -1,28 +0,0 @@ -/* -// @(#)test.c 1.1 10/18/96 - - Tests the generated perfect has function. - The -v option prints diagnostics as to whether a word is in - the set or not. Without -v the program is useful for timing. -*/ - -#include <stdio.h> - -#define MAX_LEN 80 - -int -main (argc, argv) - int argc; - char *argv[]; -{ - int verbose = argc > 1 ? 1 : 0; - char buf[MAX_LEN]; - - while (gets (buf)) - if (in_word_set (buf, strlen (buf)) && verbose) - printf ("in word set %s\n", buf); - else if (verbose) - printf ("NOT in word set %s\n", buf); - - return 0; -} |