diff options
-rw-r--r-- | doc/ivy-c-1.html | 114 | ||||
-rw-r--r-- | doc/ivy-c-2.html | 38 | ||||
-rw-r--r-- | doc/ivy-c-3.html | 199 | ||||
-rw-r--r-- | doc/ivy-c-4.html | 28 | ||||
-rw-r--r-- | doc/ivy-c-5.html | 178 | ||||
-rw-r--r-- | doc/ivy-c-6.html | 23 | ||||
-rw-r--r-- | doc/ivy-c.html | 68 |
7 files changed, 648 insertions, 0 deletions
diff --git a/doc/ivy-c-1.html b/doc/ivy-c-1.html new file mode 100644 index 0000000..69e9dee --- /dev/null +++ b/doc/ivy-c-1.html @@ -0,0 +1,114 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<HTML> +<HEAD> + <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> + <TITLE>The Ivy C library guide: General information</TITLE> + <LINK HREF="ivy-c-2.html" REL=next> + + <LINK HREF="ivy-c.html#toc1" REL=contents> +</HEAD> +<BODY> +<A HREF="ivy-c-2.html">Next</A> +Previous +<A HREF="ivy-c.html#toc1">Contents</A> +<HR> +<H2><A NAME="s1">1. General information</A></H2> + +<H2><A NAME="ss1.1">1.1 What is Ivy?</A> +</H2> + +<P> +<P>Ivy is a software bus designed at CENA (France). A software bus is a system +that allows software applications to exchange information with the illusion of +broadcasting that information, selection being performed by the receiving +applications. Using a software bus is very similar to dealing with events in a +graphical toolkit: on one side, messages are emitted without caring about who +will handle them, and on the other side, one decide to handle the messages that +have a certain type or follow a certain pattern. Software buses are mainly aimed +at facilitating the rapid development of new agents, and at managing a dynamic +collection of agents on the bus: agents show up, emit messages and receive some, +then leave the bus without blocking the others. +<P> +<H3>Architecture and principles</H3> + +<P>As opposed to other software buses, Ivy does not depend on a centralised +server. Actually, Ivy is mostly a communication convention between processes, +implemented through a collection of libraries in several languages. +<P> +<P> +<P>From the programmer's point of view, Ivy is an information broadcasting +channel. The main functions are: +<P> +<UL> +<LI> connecting to a bus.<EM> Example: IvyInit (b, 2011)</EM></LI> +<LI> sending a message.<EM> Example: IvySend (b, "HELLO %s", world)</EM></LI> +<LI> bind a message pattern to a callback function.<EM> Example: IvyBind (b, "HELLO (.*)", cb)</EM></LI> +<LI> the main loop.<EM> Example : IvyLoop ()</EM></LI> +</UL> +<P>Ivy's +decentralised connection scheme probably incurs limitations in terms of how many +applications can be connected to an Ivy bus, but this simplifies management a +lot. Basically, an Ivy bus is just a set of applications that decide to +communicate together. The only conventions between these applications are: +<OL> +<LI> the use of the Ivy protocol (for obvious reasons)</LI> +<LI> a bus address, made of a broadcast port number (a bit like a citizen band +channel) and a set of networks addresses</LI> +</OL> + +When an application wants to connect to a bus, it sends a broadcast message on the +networks specified in the bus address, so that all applications present on those +networks and listening on the specified port number connect to it. It then +becomes part of the bus, and listens like the other ones. +<P>The messages are exchanged in text format, and bindings are based on regular +expressions with captures. If an application subscribes to +<CODE>HELLO (.*)</CODE> an if another application emits the message <CODE>HELLO WORLD</CODE>, a +callback will be called in the first application with <CODE>WORLD</CODE> as an argument. +<P> +<P> +<H3>Using Ivy</H3> + +<P>You can use Ivy through applications that have been provided to you. This is the +case for <CODE>ivyprobe</CODE>, an Ivy agent that allows you to examine the messages +exchanged on a given bus and to send messages on that bus. You can refer to the +web site <CODE>http:</CODE> for a list of available agents. However, what you will +usually want to do is to develop your own applications. In order to do that you +can use an Ivy connection kit, that is a library that implements Ivy. +<P> +<P> +<P>Libraries that implement Ivy are available in the following environments: +<UL> +<LI> in C on Unix and Windows platforms, with it own communication library</LI> +<LI> in C++ on Windows platforms</LI> +<LI> in C++ on Unix platforms, integrated with the Uch communication library</LI> +<LI> in C++ on Unix platforms, integrated with OpenInventor</LI> +<LI> in C++ on Macintosh</LI> +<LI> in Perl and in Perl/Tk</LI> +<LI> integrated with Object Caml on Unix platforms</LI> +<LI> in Scheme on Unix platforms</LI> +<LI> in Java</LI> +</UL> +<P> +<P>Connecting your application to an Ivy bus just consists in choosing the +appropriate library, add the appropriate message emission and reception calls to +your code, use the main loop provided in the library or make the necessary +integrations, and get your code running! +<P> +<H2><A NAME="ss1.2">1.2 The Ivy C library</A> +</H2> + +<P>The Ivy C library (aka Ivy-C or ivy-c) is a C library that allows you to connect +applications to an Ivy bus. You can use it to write applications in C or any +other language that supports C extensions. This guide documents how you can do +that. +<P>The Ivy C library is known to compile and work in WindowsNT and Linux +environments. It should be easy to use on most Posix environments. +<P>The Ivy C library was originally developed by François-Régis Colin at CENA. It +is maintained by the CENA-Toulouse team. +<P> +<HR> +<A HREF="ivy-c-2.html">Next</A> +Previous +<A HREF="ivy-c.html#toc1">Contents</A> +</BODY> +</HTML> diff --git a/doc/ivy-c-2.html b/doc/ivy-c-2.html new file mode 100644 index 0000000..f8221dd --- /dev/null +++ b/doc/ivy-c-2.html @@ -0,0 +1,38 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<HTML> +<HEAD> + <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> + <TITLE>The Ivy C library guide: Getting and installing the Ivy C library</TITLE> + <LINK HREF="ivy-c-3.html" REL=next> + <LINK HREF="ivy-c-1.html" REL=previous> + <LINK HREF="ivy-c.html#toc2" REL=contents> +</HEAD> +<BODY> +<A HREF="ivy-c-3.html">Next</A> +<A HREF="ivy-c-1.html">Previous</A> +<A HREF="ivy-c.html#toc2">Contents</A> +<HR> +<H2><A NAME="s2">2. Getting and installing the Ivy C library</A></H2> + +<P>You can get the latest versions of the Ivy C library from CENA (http://XXX) or +from one of the Fairway sites (for instance http://XXX). Depending whether you +use a supported distribution of Linux or not, you have the following options: +<P> +<H2><A NAME="ss2.1">2.1 Installing RedHat or Debian packages</A> +</H2> + +<P> +<P> +<H2><A NAME="ss2.2">2.2 Getting and compiling the sources</A> +</H2> + +<P> +<P> +<P> +<P> +<HR> +<A HREF="ivy-c-3.html">Next</A> +<A HREF="ivy-c-1.html">Previous</A> +<A HREF="ivy-c.html#toc2">Contents</A> +</BODY> +</HTML> diff --git a/doc/ivy-c-3.html b/doc/ivy-c-3.html new file mode 100644 index 0000000..8ff844c --- /dev/null +++ b/doc/ivy-c-3.html @@ -0,0 +1,199 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<HTML> +<HEAD> + <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> + <TITLE>The Ivy C library guide: Basic functions</TITLE> + <LINK HREF="ivy-c-4.html" REL=next> + <LINK HREF="ivy-c-2.html" REL=previous> + <LINK HREF="ivy-c.html#toc3" REL=contents> +</HEAD> +<BODY> +<A HREF="ivy-c-4.html">Next</A> +<A HREF="ivy-c-2.html">Previous</A> +<A HREF="ivy-c.html#toc3">Contents</A> +<HR> +<H2><A NAME="s3">3. Basic functions</A></H2> + +<H2><A NAME="ss3.1">3.1 Initialization and main loop</A> +</H2> + +<P>Initializing an Ivy agent with the Ivy C library is a two step process. First of +all, you should initialize the library by calling function <CODE>IvyInit</CODE>. Once +the library is initialized you can create timers and add subscriptions, but your +agent is still not connected to any bus. In order to connect, you should call +function <CODE>IvyStart</CODE>. In theory, initialization is then over. However in +practice, as for any asynchronous communication or interaction library, nothing +happens until your application has reached the main loop. +<P>The Ivy C library provides its own main loop: <CODE>IvyMainLoop</CODE>. You should use +it unless you already use a toolkit that provides its own main loop and you want +to use that one. If it is the case, please refer to section XX. Otherwise, just +call <CODE>IvyMainLoop</CODE>. From within the main loop, you can call <CODE>IvyStop</CODE> to +exit the loop. +<P>Here are more details on those functions: +<P> +<BLOCKQUOTE><CODE> +<PRE> +void IvyInit (const char* agentname, + const char* hello_msg, + IvyApplicationCallback app_cb, + void *app_data, + IvyDieCallback die_cb, + void *die_data); +</PRE> +</CODE></BLOCKQUOTE> + +initializes the library. blahblah +<P> +<BLOCKQUOTE><CODE> +<PRE> +void IvyStart (const char* bus); +</PRE> +</CODE></BLOCKQUOTE> + +connects your application to the bus specified in <CODE>bus</CODE>. The string provided +should follow the convention described in section XX. Example: <CODE>"127:2010"</CODE>. +<P> +<BLOCKQUOTE><CODE> +<PRE> +void IvyMainLoop (void (*hook) (void)); +</PRE> +</CODE></BLOCKQUOTE> + +makes your application enter the main loop in which it will handle asynchronous +communications and signals. +<P> +<BLOCKQUOTE><CODE> +<PRE> +void IvyStop (); +</PRE> +</CODE></BLOCKQUOTE> + +makes your application exit the main loop. +<P> +<P> +<H2><A NAME="ss3.2">3.2 Emitting messages</A> +</H2> + +<P>Emitting a message on an Ivy bus is much like printing a message on the standard +output. However, do not forget that your message will not be emitted if Ivy has +not been properly initialized and if you do not have a main loop of some sort +running. To emit a message, use <CODE>IvySendMsg</CODE>, which works like <CODE>printf</CODE>: +<P> +<BLOCKQUOTE><CODE> +<PRE> +void IvySendMsg (const char* format, ...); +</PRE> +</CODE></BLOCKQUOTE> + +sends a message on the bus. This function has exactly the same behaviour as +<CODE>printf</CODE>, <CODE>sprintf</CODE> or <CODE>fprintf</CODE>. +<P> +<P> +<H2><A NAME="ss3.3">3.3 Subscribing to messages</A> +</H2> + +<P>Subscribing to messages consists in binding a callback function to a message +pattern. Patterns are described by regular expressions with captures. When a +message matching the regular expression is detected on the bus, the callback +function is called. The captures (ie the bits of the message that match the +parts of regular expression delimited by brackets) are passed to the callback +function much like options are passed to <CODE>main</CODE>. Use function <CODE>IvyBindMsg</CODE> +to bind a callback to a pattern, and function <CODE>IvyUnbindMsg</CODE> to delete the +binding. +<BLOCKQUOTE><CODE> +<PRE> +MsgRcvPtr IvyBindMsg (MsgCallback cb, + void* data, + const char* regex_format, ...); +</PRE> +</CODE></BLOCKQUOTE> + +binds callback function <CODE>cb</CODE> to the regular expression specified by +<CODE>regex_format</CODE> and the optional following arguments. <CODE>regex_format</CODE> and +the following arguments are handled as in <CODE>printf</CODE>. +<P> +<BLOCKQUOTE><CODE> +<PRE> +void IvyUnbindMsg (MsgRcvPtr id); +</PRE> +</CODE></BLOCKQUOTE> + +deletes the binding specified by <CODE>id</CODE> +<P> +<P>In what precedes, <CODE>MsgRcvPtr</CODE> is an opaque type used to identify bindings, +<CODE>data</CODE> is a user pointer passed to the callback whenever it is called, and +<CODE>Msgcallback</CODE> is defined as follows: +<BLOCKQUOTE><CODE> +<PRE> +typedef void (*MsgCallback)(IvyClientPtr app, void *data, int argc, char **argv); +</PRE> +</CODE></BLOCKQUOTE> +<P> +<P> +<H2><A NAME="ss3.4">3.4 Example</A> +</H2> + +<P>The following application connects to an Ivy bus, translates messages <CODE>"Hi +[name]"</CODE> to <CODE>"Bonjour [name]"</CODE>, and quits on message <CODE>"Bye"</CODE>. +<BLOCKQUOTE><CODE> +<PRE> +#include <stdlib.h> +#include <stdio.h> +#include <getopt.h> +#include <ivy.h> +#include <ivyloop.h> + +/* callback associated to "Hi" messages */ +void HiCallback (IvyClientPtr app, void *data, int argc, char **argv) +{ + if (argc != 1) + fprintf (stderr, "wrong format!\n"); + else + IvySendMsg ("Bonjour %s", argv[0]); +} + +void ByeCallback (IvyClientPtr app, void *data, int argc, char **argv) +{ + IvyStop (); +} + +main (int argc, char**argv) +{ + /* handling of -b option */ + const char* bus = 0; + char c; + while (c = getopt (argc, argv, "b:") != EOF) { + switch (c) { + case 'b': + bus = optarg; + break; + } + } + + /* handling of environment variable */ + if (!bus) + bus = getenv ("IVYBUS"); + + /* initializations */ + IvyInit ("MagicTranslater", "Hello le monde", 0, 0, 0, 0); + IvyStart (bus); + + /* bindings */ + IvyBindMsg (HiCallback, 0, "^Hi (.*)"); + IvyBindMsg (ByeCallback, 0, "^Bye$"); + + /* main loop */ + IvyMainLoop (0); +} +</PRE> +</CODE></BLOCKQUOTE> +<P> +<P> +<P> +<P> +<HR> +<A HREF="ivy-c-4.html">Next</A> +<A HREF="ivy-c-2.html">Previous</A> +<A HREF="ivy-c.html#toc3">Contents</A> +</BODY> +</HTML> diff --git a/doc/ivy-c-4.html b/doc/ivy-c-4.html new file mode 100644 index 0000000..0acebd0 --- /dev/null +++ b/doc/ivy-c-4.html @@ -0,0 +1,28 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<HTML> +<HEAD> + <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> + <TITLE>The Ivy C library guide: Advanced functions</TITLE> + <LINK HREF="ivy-c-5.html" REL=next> + <LINK HREF="ivy-c-3.html" REL=previous> + <LINK HREF="ivy-c.html#toc4" REL=contents> +</HEAD> +<BODY> +<A HREF="ivy-c-5.html">Next</A> +<A HREF="ivy-c-3.html">Previous</A> +<A HREF="ivy-c.html#toc4">Contents</A> +<HR> +<H2><A NAME="s4">4. Advanced functions</A></H2> + +<H2><A NAME="ss4.1">4.1 Utilities</A> +</H2> + +<H2><A NAME="ss4.2">4.2 Direct messages</A> +</H2> + +<HR> +<A HREF="ivy-c-5.html">Next</A> +<A HREF="ivy-c-3.html">Previous</A> +<A HREF="ivy-c.html#toc4">Contents</A> +</BODY> +</HTML> diff --git a/doc/ivy-c-5.html b/doc/ivy-c-5.html new file mode 100644 index 0000000..53eaf19 --- /dev/null +++ b/doc/ivy-c-5.html @@ -0,0 +1,178 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<HTML> +<HEAD> + <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> + <TITLE>The Ivy C library guide: Managing timers and other channels</TITLE> + <LINK HREF="ivy-c-6.html" REL=next> + <LINK HREF="ivy-c-4.html" REL=previous> + <LINK HREF="ivy-c.html#toc5" REL=contents> +</HEAD> +<BODY> +<A HREF="ivy-c-6.html">Next</A> +<A HREF="ivy-c-4.html">Previous</A> +<A HREF="ivy-c.html#toc5">Contents</A> +<HR> +<H2><A NAME="s5">5. Managing timers and other channels</A></H2> + +<P> +<P>In your applications, you may need to manage other input/output channels than an +Ivy bus: a serial driver, the channels defined by a graphical toolkit, or simply +stdin and stdout. The same applies for timers. You can either manage those +channels or timers from the Ivy main loop, or instead use the main loop provided by +another library. +<P> +<H2><A NAME="ss5.1">5.1 Adding channels and timers to the Ivy main loop</A> +</H2> + +<H3>Channels</H3> + +<P>You can get a channel to be managed from the Ivy main loop by using functions +<CODE>IvyChannelSetUp</CODE> and <CODE>IvyChannelClose</CODE>. +<BLOCKQUOTE><CODE> +<PRE> +Channel IvyChannelSetUp (HANDLE fd, + void* data, + ChannelHandleDelete handle_delete, + ChannelHandleRead handle_read); +</PRE> +</CODE></BLOCKQUOTE> + +ensures that function <CODE>handle_read</CODE> is called whenever data is read on file +descriptor <CODE>fd</CODE>, and function <CODE>handle_delete</CODE> whenever <CODE>fd</CODE> is +closed, and +<P> +<BLOCKQUOTE><CODE> +<PRE> +void IvyChannelClose (Channel ch); +</PRE> +</CODE></BLOCKQUOTE> + +terminates the management of channel <CODE>ch</CODE>. +<P> +<P>In what precedes, <CODE>Channel</CODE> is an opaque type defined by the Ivy C library, <CODE>data</CODE> is a pointer that will be passed to functions <CODE>handle_read</CODE> +and <CODE>handle_delete</CODE>. It can be defined at will by users. +The types HANDLE, ChannelHandleDelete and +ChannelHandleRead are as follows: +<BLOCKQUOTE><CODE> +Unix: +<PRE> +typedef int HANDLE; +</PRE> + +Windows: +<PRE> +typedef SOCKET HANDLE; +</PRE> + +<PRE> +typedef void (*ChannelHandleDelete)(void *data); +typedef void (*ChannelHandleRead)(Channel ch, HANDLE fd, void* data); +</PRE> +</CODE></BLOCKQUOTE> +<P> +<P> +<H3>Timers</H3> + +<P>You can get a function to be repeatedly called by using function +<CODE>TimerRepeatAfter</CODE>: +<P> +<BLOCKQUOTE><CODE> +<PRE> +TimerId TimerRepeatAfter (int nbticks, long delay, TimerCb handle_timer, void* data); +</PRE> +</CODE></BLOCKQUOTE> + +ensures that function <CODE>handle_timer</CODE> is called <CODE>nbticks</CODE> times at +intervals of <CODE>delay</CODE> seconds, thus creating a timer. +<P> +<BLOCKQUOTE><CODE> +<PRE> +void TimerModify (TimerId id, long delay); +</PRE> +</CODE></BLOCKQUOTE> + +changes the delay used for timer <CODE>id</CODE>. +<P> +<BLOCKQUOTE><CODE> +<PRE> +void TimerRemove (TimerId id); +</PRE> +</CODE></BLOCKQUOTE> + +deletes timer <CODE>id</CODE>, thus stopping it. +<P>In what precedes, <CODE>data</CODE> is passed to <CODE>handle_timer</CODE> every time it is +called. <CODE>delay</CODE> is expressed in milliseconds. +If <CODE>nbticks</CODE> is set to <CODE>TIMER_LOOP</CODE>, then <CODE>handle_timer</CODE> will +be called forever. <CODE>TimerCb</CODE> is as follows: +<BLOCKQUOTE><CODE> +<PRE> +typedef void (*TimerCb)(TimerId id, void *data, unsigned long delta); +</PRE> +</CODE></BLOCKQUOTE> +<P> +<P> +<H2><A NAME="ss5.2">5.2 Adding Ivy to another main loop</A> +</H2> + +<H3>Functions to be provided</H3> + +<P>You can decide to use the main loop from another toolkit such as the X Toolkit +or the Tk toolkit. If you do that, you'll have to define three functions that +Ivy will use to get its own channels managed by the other toolkit. The three +following global variables should be defined: +<BLOCKQUOTE><CODE> +<PRE> +ChannelInit channel_init; +ChannelSetUp channel_setup; +ChannelClose channel_close; +</PRE> +</CODE></BLOCKQUOTE> +<P>They should point to functions that respectively: +<UL> +<LI> make the necessary global initializations before entering the main loop</LI> +<LI> initialize a channel and ensure that it is managed by the main loop</LI> +<LI> close a channel</LI> +</UL> +<P> +<P>The types <CODE>ChannelInit</CODE>, <CODE>ChannelSetUp</CODE> and <CODE>ChannelClose</CODE> are defined +as follows: +<P> +<BLOCKQUOTE><CODE> +<PRE> +typedef void (*ChannelInit)(void); +typedef Channel (*ChannelSetUp)( + HANDLE fd, + void *data, + ChannelHandleDelete handle_delete, + ChannelHandleRead handle_read); +typedef void (*ChannelClose)( Channel channel ); +</PRE> +</CODE></BLOCKQUOTE> +<P> +<P> +<H3>Type to be defined</H3> + +<P>In order to implement the three previous functions, you will need to define the +hidden type <CODE>struct _channel</CODE> (the type <CODE>Channel</CODE> is defined as <CODE>struct _channel*</CODE>). Use it to store the data provided by the other toolkit. +<P> +<H3>Overriding the Ivy main loop</H3> + +<P>In order to override the default definition of the three previous variables, you +will need: +<UL> +<LI> either to create a new library by replacing file <CODE>ivyloop.o</CODE> with the file +that contains your definitions</LI> +<LI> or ...</LI> +</UL> +<P> +<P> +<P> +<P> +<P> +<P> +<HR> +<A HREF="ivy-c-6.html">Next</A> +<A HREF="ivy-c-4.html">Previous</A> +<A HREF="ivy-c.html#toc5">Contents</A> +</BODY> +</HTML> diff --git a/doc/ivy-c-6.html b/doc/ivy-c-6.html new file mode 100644 index 0000000..94b9e6e --- /dev/null +++ b/doc/ivy-c-6.html @@ -0,0 +1,23 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<HTML> +<HEAD> + <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> + <TITLE>The Ivy C library guide: Conventions for writing applications</TITLE> + <LINK HREF="ivy-c-5.html" REL=previous> + <LINK HREF="ivy-c.html#toc6" REL=contents> +</HEAD> +<BODY> +Next +<A HREF="ivy-c-5.html">Previous</A> +<A HREF="ivy-c.html#toc6">Contents</A> +<HR> +<H2><A NAME="s6">6. Conventions for writing applications</A></H2> + +<P>... the environment variable <CODE>IVYBUS</CODE> ..., ... the option <CODE>-b</CODE> ... +<P> +<HR> +Next +<A HREF="ivy-c-5.html">Previous</A> +<A HREF="ivy-c.html#toc6">Contents</A> +</BODY> +</HTML> diff --git a/doc/ivy-c.html b/doc/ivy-c.html new file mode 100644 index 0000000..3296ce6 --- /dev/null +++ b/doc/ivy-c.html @@ -0,0 +1,68 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> +<HTML> +<HEAD> + <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.7"> + <TITLE>The Ivy C library guide</TITLE> + <LINK HREF="ivy-c-1.html" REL=next> + + +</HEAD> +<BODY> +<A HREF="ivy-c-1.html">Next</A> +Previous +Contents +<HR> +<H1>The Ivy C library guide</H1> + +<H2>Stéphane Chatty, <CODE>chatty@cena.dgac.fr</CODE></H2>1 April 1999 +<P><HR> +<EM>This document is a programmer's guide that describes how to use the Ivy C +library to connect applications to an Ivy bus. This guide describes version 3.0 +of the library.</EM> +<HR> +<P> +<H2><A NAME="toc1">1.</A> <A HREF="ivy-c-1.html">General information</A></H2> + +<UL> +<LI><A HREF="ivy-c-1.html#ss1.1">1.1 What is Ivy?</A> +<LI><A HREF="ivy-c-1.html#ss1.2">1.2 The Ivy C library</A> +</UL> +<P> +<H2><A NAME="toc2">2.</A> <A HREF="ivy-c-2.html">Getting and installing the Ivy C library</A></H2> + +<UL> +<LI><A HREF="ivy-c-2.html#ss2.1">2.1 Installing RedHat or Debian packages</A> +<LI><A HREF="ivy-c-2.html#ss2.2">2.2 Getting and compiling the sources</A> +</UL> +<P> +<H2><A NAME="toc3">3.</A> <A HREF="ivy-c-3.html">Basic functions</A></H2> + +<UL> +<LI><A HREF="ivy-c-3.html#ss3.1">3.1 Initialization and main loop</A> +<LI><A HREF="ivy-c-3.html#ss3.2">3.2 Emitting messages</A> +<LI><A HREF="ivy-c-3.html#ss3.3">3.3 Subscribing to messages</A> +<LI><A HREF="ivy-c-3.html#ss3.4">3.4 Example</A> +</UL> +<P> +<H2><A NAME="toc4">4.</A> <A HREF="ivy-c-4.html">Advanced functions</A></H2> + +<UL> +<LI><A HREF="ivy-c-4.html#ss4.1">4.1 Utilities</A> +<LI><A HREF="ivy-c-4.html#ss4.2">4.2 Direct messages</A> +</UL> +<P> +<H2><A NAME="toc5">5.</A> <A HREF="ivy-c-5.html">Managing timers and other channels</A></H2> + +<UL> +<LI><A HREF="ivy-c-5.html#ss5.1">5.1 Adding channels and timers to the Ivy main loop</A> +<LI><A HREF="ivy-c-5.html#ss5.2">5.2 Adding Ivy to another main loop</A> +</UL> +<P> +<H2><A NAME="toc6">6.</A> <A HREF="ivy-c-6.html">Conventions for writing applications</A></H2> + +<HR> +<A HREF="ivy-c-1.html">Next</A> +Previous +Contents +</BODY> +</HTML> |