summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacomi1999-04-12 17:18:34 +0000
committerjacomi1999-04-12 17:18:34 +0000
commitf6a815b6504e9c954b9d0af57a3de6ccb75b5321 (patch)
tree0e317b7410bc41fb42448e3452057e33aaf3c7d9
parent9d094feea77b5b43b22620050dfe37caf56d9dff (diff)
downloadivy-c-f6a815b6504e9c954b9d0af57a3de6ccb75b5321.zip
ivy-c-f6a815b6504e9c954b9d0af57a3de6ccb75b5321.tar.gz
ivy-c-f6a815b6504e9c954b9d0af57a3de6ccb75b5321.tar.bz2
ivy-c-f6a815b6504e9c954b9d0af57a3de6ccb75b5321.tar.xz
doc updated
-rw-r--r--doc/ivy-c-1.html114
-rw-r--r--doc/ivy-c-2.html38
-rw-r--r--doc/ivy-c-3.html199
-rw-r--r--doc/ivy-c-4.html28
-rw-r--r--doc/ivy-c-5.html178
-rw-r--r--doc/ivy-c-6.html23
-rw-r--r--doc/ivy-c.html68
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 &lt;stdlib.h>
+#include &lt;stdio.h>
+#include &lt;getopt.h>
+#include &lt;ivy.h>
+#include &lt;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>