Commits

Anthony Tuininga committed a835ff0

Last public release.

Comments (0)

Files changed (23)

+BSD Protection License
+February 2002
+
+Preamble
+--------
+
+The Berkeley Software Distribution ("BSD") license has proven very effective
+over the years at allowing for a wide spread of work throughout both
+commercial and non-commercial products.  For programmers whose primary
+intention is to improve the general quality of available software, it is
+arguable that there is no better license than the BSD license, as it
+permits improvements to be used wherever they will help, without idealogical
+or metallic constraint.
+
+This is of particular value to those who produce reference implementations
+of proposed standards: The case of TCP/IP clearly illustrates that freely
+and universally available implementations leads the rapid acceptance of
+standards -- often even being used instead of a de jure standard (eg, OSI
+network models).
+
+With the rapid proliferation of software licensed under the GNU General
+Public License, however, the continued success of this role is called into
+question.  Given that the inclusion of a few lines of "GPL-tainted" work
+into a larger body of work will result in restricted distribution -- and
+given that further work will likely build upon the "tainted" portions,
+making them difficult to remove at a future date -- there are inevitable
+circumstances where authors would, in order to protect their goal of
+providing for the widespread usage of their work, wish to guard against
+such "GPL-taint".
+
+In addition, one can imagine that companies which operate by producing and
+selling (possibly closed-source) code would wish to protect themselves
+against the rise of a GPL-licensed competitor.  While under existing
+licenses this would mean not releasing their code under any form of open
+license, if a license existed under which they could incorporate any
+improvements back into their own (commercial) products then they might be
+far more willing to provide for non-closed distribution.
+
+For the above reasons, we put forth this "BSD Protection License": A
+license designed to retain the freedom granted by the BSD license to use
+licensed works in a wide variety of settings, both non-commercial and
+commercial, while protecting the work from having future contributors
+restrict that freedom.
+
+The precise terms and conditions for copying, distribution, and
+modification follow.
+
+BSD PROTECTION LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION
+----------------------------------------------------------------
+
+0. Definitions.
+   a) "Program", below, refers to any program or work distributed under
+      the terms of this license.
+   b) A "work based on the Program", below, refers to either the Program
+      or any derivative work under copyright law.
+   c) "Modification", below, refers to the act of creating derivative works.
+   d) "You", below, refers to each licensee.
+
+1. Scope.
+   This license governs the copying, distribution, and modification of the
+   Program.  Other activities are outside the scope of this license; The
+   act of running the Program is not restricted, and the output from the
+   Program is covered only if its contents constitute a work based on the
+   Program.
+
+2. Verbatim copies.
+   You may copy and distribute verbatim copies of the Program as you
+   receive it, in any medium, provided that you conspicuously and
+   appropriately publish on each copy an appropriate copyright notice; keep
+   intact all the notices that refer to this License and to the absence of
+   any warranty; and give any other recipients of the Program a copy of this
+   License along with the Program.
+
+3. Modification and redistribution under closed license.
+   You may modify your copy or copies of the Program, and distribute
+   the resulting derivative works, provided that you meet the
+   following conditions:
+   a) The copyright notice and disclaimer on the Program must be reproduced
+      and included in the source code, documentation, and/or other materials
+      provided in a manner in which such notices are normally distributed.
+   b) The derivative work must be clearly identified as such, in order that
+      it may not be confused with the original work.
+   c) The license under which the derivative work is distributed must
+      expressly prohibit the distribution of further derivative works.
+
+4. Modification and redistribution under open license.
+   You may modify your copy or copies of the Program, and distribute
+   the resulting derivative works, provided that you meet the
+   following conditions:
+   a) The copyright notice and disclaimer on the Program must be reproduced
+      and included in the source code, documentation, and/or other materials
+      provided in a manner in which such notices are normally distributed.
+   b) You must clearly indicate the nature and date of any changes made
+      to the Program.  The full details need not necessarily be included in
+      the individual modified files, provided that each modified file is
+      clearly marked as such and instructions are included on where the
+      full details of the modifications may be found.
+   c) You must cause any work that you distribute or publish, that in whole
+      or in part contains or is derived from the Program or any part
+      thereof, to be licensed as a whole at no charge to all third
+      parties under the terms of this License.
+
+5. Implied acceptance.
+   You may not copy or distribute the Program or any derivative works except
+   as expressly provided under this license.  Consequently, any such action
+   will be taken as implied acceptance of the terms of this license.
+
+6. NO WARRANTY.
+   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+   THE COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+   REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING, BUT
+   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+   TORT, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGES.
+setup.py
+setup.cfg
+README.txt
+LICENSE.txt
+MANIFEST
+bsdiff.c
+html/about.html
+html/blank.png
+html/bsdiff.css
+html/bsdiff.html
+html/contents.html
+html/contents.png
+html/front.html
+html/index.html
+html/index.png
+html/module.html
+html/modules.png
+html/next.png
+html/node4.html
+html/previous.png
+html/pyfav.png
+html/up.png
+Metadata-Version: 1.0
+Name: cx_bsdiff
+Version: 1.1
+Summary: Python interface for bsdiff
+Home-page: http://www.computronix.com/utilities.shtml
+Author: Anthony Tuininga
+Author-email: anthony.tuininga@gmail.com
+License: See LICENSE.txt
+Description: Python interface for bsdiff
+Platform: UNKNOWN
+Open Source Python Utility - cx_bsdiff
+
+bsdiff is a very simple Python extension module that allows Python to perform
+the same tasks as the bsdiff utility available from
+http://www.daemonology.net/bsdiff.
+
+Please see the included documentation for additional information.
+
+//-----------------------------------------------------------------------------
+// bsdiff.c
+//   Shared library for use by Python. This is derived from bsdiff, the
+// standalone utility produced for BSD which can be found at
+// http://www.daemonology.net/bsdiff.
+//-----------------------------------------------------------------------------
+
+#include <Python.h>
+
+#define MIN(x,y) (((x)<(y)) ? (x) : (y))
+
+//-----------------------------------------------------------------------------
+// split()
+//-----------------------------------------------------------------------------
+static void split(
+    off_t *I,
+    off_t *V,
+    off_t start,
+    off_t len,
+    off_t h)
+{
+    off_t i, j, k, x, tmp, jj, kk;
+
+    if (len < 16) {
+        for (k = start; k < start + len; k += j) {
+            j = 1;
+            x = V[I[k] + h];
+            for (i = 1; k + i < start + len; i++) {
+                if (V[I[k + i] + h] < x) {
+                    x = V[I[k + i] + h];
+                    j = 0;
+                }
+                if (V[I[k + i] + h] == x) {
+                    tmp = I[k + j];
+                    I[k + j] = I[k + i];
+                    I[k + i] = tmp;
+                    j++;
+                }
+            }
+            for (i = 0; i < j; i++)
+                V[I[k +i ]] = k + j -1;
+            if (j == 1)
+                I[k] = -1;
+        }
+
+    } else {
+
+        jj = 0;
+        kk = 0;
+        x = V[I[start + len / 2] + h];
+	for (i = start; i < start + len; i++) {
+            if (V[I[i] + h] < x)
+                jj++;
+            if (V[I[i] + h] == x)
+                kk++;
+        }
+	jj += start;
+        kk += jj;
+
+        j = 0;
+        k = 0;
+        i = start;
+        while (i < jj) {
+            if (V[I[i] + h] < x) {
+                i++;
+            } else if (V[I[i] + h] == x) {
+                tmp = I[i];
+                I[i] = I[jj + j];
+                I[jj + j] = tmp;
+                j++;
+            } else {
+                tmp = I[i];
+                I[i] = I[kk + k];
+                I[kk + k] = tmp;
+                k++;
+            }
+        }
+
+        while (jj + j < kk) {
+            if (V[I[jj + j] + h] == x) {
+                j++;
+            } else {
+                tmp = I[jj + j];
+                I[jj + j] = I[kk + k];
+                I[kk + k] = tmp;
+                k++;
+            }
+        }
+
+        if (jj > start)
+            split(I, V, start, jj - start, h);
+
+        for (i = 0; i < kk - jj; i++)
+            V[I[jj + i]] = kk - 1;
+        if (jj == kk - 1)
+            I[jj] = -1;
+        if (start + len > kk)
+            split(I, V, kk, start + len - kk, h);
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+// qsufsort()
+//-----------------------------------------------------------------------------
+static void qsufsort(
+    off_t *I,
+    off_t *V,
+    unsigned char *old,
+    off_t oldsize)
+{
+    off_t buckets[256], i, h, len;
+
+    for (i = 0; i < 256; i++)
+        buckets[i] = 0;
+    for (i = 0; i < oldsize; i++)
+        buckets[old[i]]++;
+    for (i = 1; i < 256; i++)
+        buckets[i] += buckets[i - 1];
+    for (i = 255; i > 0; i--)
+        buckets[i] = buckets[i - 1];
+    buckets[0] = 0;
+
+    for (i = 0; i < oldsize; i++)
+        I[++buckets[old[i]]] = i;
+    I[0] = oldsize;
+    for (i = 0; i < oldsize; i++)
+        V[i] = buckets[old[i]];
+    V[oldsize] = 0;
+    for (i = 1; i < 256; i++)
+        if (buckets[i] == buckets[i - 1] + 1)
+            I[buckets[i]] = -1;
+    I[0]=-1;
+
+    for (h = 1; I[0] != -(oldsize + 1); h += h) {
+        len = 0;
+        for (i = 0; i < oldsize + 1;) {
+            if (I[i] < 0) {
+                len -= I[i];
+                i -= I[i];
+            } else {
+                if (len)
+                    I[i - len] =- len;
+                len = V[I[i]] + 1 - i;
+                split(I, V, i, len, h);
+                i += len;
+                len=0;
+            }
+        }
+        if (len)
+            I[i - len] =- len;
+    }
+
+    for (i = 0; i < oldsize + 1; i++)
+        I[V[i]] = i;
+}
+
+
+//-----------------------------------------------------------------------------
+// matchlen()
+//-----------------------------------------------------------------------------
+static off_t matchlen(
+    unsigned char *old,
+    off_t oldsize,
+    unsigned char *new,
+    off_t newsize)
+{
+    off_t i;
+
+    for (i = 0; (i < oldsize) && (i < newsize); i++)
+        if (old[i] != new[i])
+            break;
+    return i;
+}
+
+
+//-----------------------------------------------------------------------------
+// search()
+//-----------------------------------------------------------------------------
+static off_t search(
+    off_t *I,
+    unsigned char *old,
+    off_t oldsize,
+    unsigned char *new,
+    off_t newsize,
+    off_t st,
+    off_t en,
+    off_t *pos)
+{
+    off_t x, y;
+
+    if (en - st < 2) {
+        x = matchlen(old + I[st], oldsize - I[st], new, newsize);
+        y = matchlen(old + I[en], oldsize - I[en], new, newsize);
+
+        if (x > y) {
+            *pos = I[st];
+            return x;
+        } else {
+            *pos = I[en];
+            return y;
+        }
+    }
+
+    x = st + (en - st) / 2;
+    if (memcmp(old + I[x], new, MIN(oldsize - I[x], newsize)) < 0) {
+        return search(I, old, oldsize, new, newsize, x, en, pos);
+    } else {
+        return search(I, old, oldsize, new, newsize, st, x, pos);
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+// Diff()
+//   Performs a diff between the two data streams and returns a tuple
+// containing the control, diff and extra blocks that bsdiff produces.
+//-----------------------------------------------------------------------------
+static PyObject* Diff(
+    PyObject* self,			// passthrough argument
+    PyObject* args)			// arguments to function
+{
+    off_t lastscan, lastpos, lastoffset, oldscore, scsc, overlap, Ss, lens;
+    off_t *I, *V, dblen, eblen, scan, pos, len, s, Sf, lenf, Sb, lenb, i;
+    PyObject *controlTuples, *tuple, *results, *temp;
+    int origDataLength, newDataLength;
+    char *origData, *newData;
+    unsigned char *db, *eb;
+
+    // parse arguments
+    if (!PyArg_ParseTuple(args, "s#s#", &origData, &origDataLength, &newData,
+            &newDataLength))
+        return NULL;
+
+    // create the control tuple
+    controlTuples = PyList_New(0);
+    if (!controlTuples)
+        return NULL;
+
+    // perform sort on original data
+    I = PyMem_Malloc((origDataLength + 1) * sizeof(off_t));
+    if (!I) {
+        Py_DECREF(controlTuples);
+        return PyErr_NoMemory();
+    }
+    V = PyMem_Malloc((origDataLength + 1) * sizeof(off_t));
+    if (!V) {
+        Py_DECREF(controlTuples);
+        PyMem_Free(I);
+        return PyErr_NoMemory();
+    }
+    qsufsort(I, V, origData, origDataLength);
+    PyMem_Free(V);
+
+    // allocate memory for the diff and extra blocks
+    db = PyMem_Malloc(newDataLength + 1);
+    if (!db) {
+        Py_DECREF(controlTuples);
+        PyMem_Free(I);
+        return PyErr_NoMemory();
+    }
+    eb = PyMem_Malloc(newDataLength + 1);
+    if (!eb) {
+        Py_DECREF(controlTuples);
+        PyMem_Free(I);
+        PyMem_Free(db);
+        return PyErr_NoMemory();
+    }
+    dblen = 0;
+    eblen = 0;
+
+    // perform the diff
+    len = 0;
+    scan = 0;
+    lastscan = 0;
+    lastpos = 0;
+    lastoffset = 0;
+    while (scan < newDataLength) {
+        oldscore = 0;
+
+        for (scsc = scan += len; scan < newDataLength; scan++) {
+            len = search(I, origData, origDataLength, newData + scan,
+                    newDataLength - scan, 0, origDataLength, &pos);
+            for (; scsc < scan + len; scsc++)
+                if ((scsc + lastoffset < origDataLength) &&
+                        (origData[scsc + lastoffset] == newData[scsc]))
+                    oldscore++;
+            if (((len == oldscore) && (len != 0)) || (len > oldscore + 8))
+                break;
+            if((scan + lastoffset < origDataLength) &&
+                    (origData[scan + lastoffset] == newData[scan]))
+                oldscore--;
+        }
+
+        if ((len != oldscore) || (scan == newDataLength)) {
+            s = 0;
+            Sf = 0;
+            lenf = 0;
+            for (i = 0; (lastscan + i < scan) &&
+                    (lastpos + i < origDataLength);) {
+                if (origData[lastpos + i] == newData[lastscan + i])
+                    s++;
+                i++;
+                if (s * 2 - i > Sf * 2 - lenf) {
+                    Sf = s;
+                    lenf = i;
+                }
+            }
+
+            lenb = 0;
+            if (scan < newDataLength) {
+                s = 0;
+                Sb = 0;
+                for (i = 1; (scan >= lastscan + i) && (pos >= i); i++) {
+                    if (origData[pos - i] == newData[scan - i])
+                        s++;
+                    if (s * 2 - i > Sb * 2 - lenb) {
+                        Sb = s;
+                        lenb = i;
+                    }
+                }
+            }
+
+            if (lastscan + lenf > scan - lenb) {
+                overlap = (lastscan + lenf) - (scan - lenb);
+                s = 0;
+                Ss = 0;
+                lens = 0;
+                for (i = 0; i < overlap; i++) {
+                    if (newData[lastscan + lenf - overlap + i] ==
+                            origData[lastpos + lenf - overlap + i])
+                        s++;
+                    if (newData[scan - lenb + i]== origData[pos - lenb + i])
+                        s--;
+                    if (s > Ss) {
+                        Ss = s;
+                        lens = i + 1;
+                    }
+                }
+
+                lenf += lens - overlap;
+                lenb -= lens;
+            }
+
+            for (i = 0; i < lenf; i++)
+                db[dblen + i] = newData[lastscan + i] - origData[lastpos + i];
+            for (i = 0; i < (scan - lenb) - (lastscan + lenf); i++)
+                eb[eblen + i] = newData[lastscan + lenf + i];
+
+            dblen += lenf;
+            eblen += (scan - lenb) - (lastscan + lenf);
+
+            tuple = PyTuple_New(3);
+            if (!tuple) {
+                Py_DECREF(controlTuples);
+                PyMem_Free(I);
+                PyMem_Free(db);
+                PyMem_Free(eb);
+                return NULL;
+            }
+            PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(lenf));
+            PyTuple_SET_ITEM(tuple, 1,
+                    PyInt_FromLong((scan - lenb) - (lastscan + lenf)));
+            PyTuple_SET_ITEM(tuple, 2,
+                    PyInt_FromLong((pos - lenb) - (lastpos + lenf)));
+            if (PyList_Append(controlTuples, tuple) < 0) {
+                Py_DECREF(controlTuples);
+                Py_DECREF(tuple);
+                PyMem_Free(I);
+                PyMem_Free(db);
+                PyMem_Free(eb);
+                return NULL;
+            }
+            Py_DECREF(tuple);
+
+            lastscan = scan - lenb;
+            lastpos = pos - lenb;
+            lastoffset = pos - scan;
+        }
+    }
+
+    PyMem_Free(I);
+    results = PyTuple_New(3);
+    if (!results) {
+        PyMem_Free(db);
+        PyMem_Free(eb);
+        return NULL;
+    }
+    PyTuple_SET_ITEM(results, 0, controlTuples);
+    temp = PyString_FromStringAndSize(db, dblen);
+    PyMem_Free(db);
+    if (!temp) {
+        PyMem_Free(eb);
+        Py_DECREF(results);
+        return NULL;
+    }
+    PyTuple_SET_ITEM(results, 1, temp);
+    temp = PyString_FromStringAndSize(eb, eblen);
+    PyMem_Free(eb);
+    if (!temp) {
+        Py_DECREF(results);
+        return NULL;
+    }
+    PyTuple_SET_ITEM(results, 2, temp);
+
+    return results;
+}
+
+
+//-----------------------------------------------------------------------------
+// Patch()
+//   Takes the original data and the control, diff and extra blocks produced
+// by bsdiff and returns the new data.
+//-----------------------------------------------------------------------------
+static PyObject* Patch(
+    PyObject* self,			// passthrough argument
+    PyObject* args)			// arguments to function
+{
+    char *origData, *newData, *diffBlock, *extraBlock, *diffPtr, *extraPtr;
+    int origDataLength, newDataLength, diffBlockLength, extraBlockLength;
+    PyObject *controlTuples, *tuple, *results;
+    off_t oldpos, newpos, x, y, z;
+    int i, j, numTuples;
+
+    // parse arguments
+    if (!PyArg_ParseTuple(args, "s#iO!s#s#", &origData, &origDataLength,
+            &newDataLength, &PyList_Type, &controlTuples, &diffBlock,
+            &diffBlockLength, &extraBlock, &extraBlockLength))
+        return NULL;
+
+    // allocate the memory for the new data
+    newData = PyMem_Malloc(newDataLength + 1);
+    if (!newData)
+        return PyErr_NoMemory();
+
+    oldpos = 0;
+    newpos = 0;
+    diffPtr = diffBlock;
+    extraPtr = extraBlock;
+    numTuples = PyList_GET_SIZE(controlTuples);
+    for (i = 0; i < numTuples; i++) {
+        tuple = PyList_GET_ITEM(controlTuples, i);
+        if (!PyTuple_Check(tuple)) {
+            PyMem_Free(newData);
+            PyErr_SetString(PyExc_TypeError, "expecting tuple");
+            return NULL;
+        }
+        if (PyTuple_GET_SIZE(tuple) != 3) {
+            PyMem_Free(newData);
+            PyErr_SetString(PyExc_TypeError, "expecting tuple of size 3");
+            return NULL;
+        }
+        x = PyInt_AsLong(PyTuple_GET_ITEM(tuple, 0));
+        y = PyInt_AsLong(PyTuple_GET_ITEM(tuple, 1));
+        z = PyInt_AsLong(PyTuple_GET_ITEM(tuple, 2));
+        if (newpos + x > newDataLength ||
+                diffPtr + x > diffBlock + diffBlockLength ||
+                extraPtr + y > extraBlock + extraBlockLength) {
+            PyMem_Free(newData);
+            PyErr_SetString(PyExc_ValueError, "corrupt patch (overflow)");
+            return NULL;
+        }
+        memcpy(newData + newpos, diffPtr, x);
+        diffPtr += x;
+        for (j = 0; j < x; j++)
+            if ((oldpos + j >= 0) && (oldpos + j < origDataLength))
+                newData[newpos + j] += origData[oldpos + j];
+        newpos += x;
+        oldpos += x;
+        memcpy(newData + newpos, extraPtr, y);
+        extraPtr += y;
+        newpos += y;
+        oldpos += z;
+    }
+
+    // confirm that a valid patch was applied
+    if (newpos != newDataLength ||
+            diffPtr != diffBlock + diffBlockLength ||
+            extraPtr != extraBlock + extraBlockLength) {
+        PyMem_Free(newData);
+        PyErr_SetString(PyExc_ValueError, "corrupt patch (underflow)");
+        return NULL;
+    }
+
+    results = PyString_FromStringAndSize(newData, newDataLength);
+    PyMem_Free(newData);
+    return results;
+}
+
+
+//-----------------------------------------------------------------------------
+//   Declaration of methods supported by this module
+//-----------------------------------------------------------------------------
+static PyMethodDef g_ModuleMethods[] = {
+    { "Diff", Diff, METH_VARARGS },
+    { "Patch", Patch, METH_VARARGS },
+    { NULL, NULL }
+};
+
+//-----------------------------------------------------------------------------
+// initbsdiff()
+//   Initialization routine for the shared libary.
+//-----------------------------------------------------------------------------
+void initbsdiff(void)
+{
+    PyObject *module, *moduleDict;
+
+    // initialize module and retrieve the dictionary
+    module = Py_InitModule("bsdiff", g_ModuleMethods);
+    if (!module)
+        return;
+    moduleDict = PyModule_GetDict(module);
+    if (!moduleDict)
+        return;
+
+    // set version for easier support
+    if (PyDict_SetItemString(moduleDict, "version",
+            PyString_FromString("1.0")) < 0)
+        return;
+
+}
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<link rel="STYLESHEET" href="bsdiff.css" type='text/css' />
+<link rel="first" href="bsdiff.html" title='cx_Logging' />
+<link rel='contents' href='contents.html' title="Contents" />
+<link rel='last' href='about.html' title='About this document...' />
+<link rel='help' href='about.html' title='About this document...' />
+<link rel="prev" href="node4.html" />
+<link rel="parent" href="bsdiff.html" />
+<meta name='aesop' content='information' />
+<title>About this document ...</title>
+</head>
+<body>
+<DIV CLASS="navigation">
+<div id='top-navigation-panel' xml:id='top-navigation-panel'>
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="2. License"
+  href="node4.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><img src='next.png'
+  border='0' height='32'  alt='Next Page' width='32' /></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="node4.html">2. License</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+</div>
+<hr /></div>
+</DIV>
+<!--End of Navigation Panel-->
+
+<H1><A NAME="SECTION005000000000000000000">
+About this document ...</A>
+</H1>
+ <strong>cx_Logging</strong>,
+9 March 2005, Release 1.1
+<p> This document was generated using the <a
+    href="http://saftsack.fs.uni-bayreuth.de/~latex2ht/">
+    <strong>LaTeX</strong>2<tt>HTML</tt></a> translator.
+</p>
+
+<p> <a
+    href="http://saftsack.fs.uni-bayreuth.de/~latex2ht/">
+    <strong>LaTeX</strong>2<tt>HTML</tt></a> is Copyright &copy;
+  1993, 1994, 1995, 1996, 1997, <a
+    href="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos
+    Drakos</a>, Computer Based Learning Unit, University of
+  Leeds, and Copyright &copy; 1997, 1998, <a
+    href="http://www.maths.mq.edu.au/~ross/">Ross
+    Moore</a>, Mathematics Department, Macquarie University,
+  Sydney.
+</p>
+
+<p> The application of <a
+    href="http://saftsack.fs.uni-bayreuth.de/~latex2ht/">
+    <strong>LaTeX</strong>2<tt>HTML</tt></a> to the Python
+  documentation has been heavily tailored by Fred L. Drake,
+  Jr.  Original navigation icons were contributed by Christopher
+  Petrilli.
+</p>
+
+<DIV CLASS="navigation">
+<div class='online-navigation'>
+<p></p><hr />
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="2. License"
+  href="node4.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><img src='next.png'
+  border='0' height='32'  alt='Next Page' width='32' /></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="node4.html">2. License</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+</div>
+</div>
+<hr />
+<span class="release-info">Release 1.1, documentation updated on 9 March 2005.</span>
+</DIV>
+<!--End of Navigation Panel-->
+
+</BODY>
+</HTML>

html/blank.png

Added
New image
+/*
+ * The first part of this is the standard CSS generated by LaTeX2HTML,
+ * with the "empty" declarations removed.
+ */
+
+/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */
+.math                   { font-family: "Century Schoolbook", serif; }
+.math i                 { font-family: "Century Schoolbook", serif;
+                          font-weight: bold }
+.boldmath               { font-family: "Century Schoolbook", serif;
+                          font-weight: bold }
+
+/*
+ * Implement both fixed-size and relative sizes.
+ *
+ * I think these can be safely removed, as it doesn't appear that
+ * LaTeX2HTML ever generates these, even though these are carried
+ * over from the LaTeX2HTML stylesheet.
+ */
+small.xtiny             { font-size : xx-small; }
+small.tiny              { font-size : x-small; }
+small.scriptsize        { font-size : smaller; }
+small.footnotesize      { font-size : small; }
+big.xlarge              { font-size : large; }
+big.xxlarge             { font-size : x-large; }
+big.huge                { font-size : larger; }
+big.xhuge               { font-size : xx-large; }
+
+/*
+ * Document-specific styles come next;
+ * these are added for the Python documentation.
+ *
+ * Note that the size specifications for the H* elements are because
+ * Netscape on Solaris otherwise doesn't get it right; they all end up
+ * the normal text size.
+ */
+
+body                    { color: #000000;
+                          background-color: #ffffff; }
+
+a:link:active           { color: #ff0000; }
+a:link:hover            { background-color: #bbeeff; }
+a:visited:hover         { background-color: #bbeeff; }
+a:visited               { color: #551a8b; }
+a:link                  { color: #0000bb; }
+
+h1, h2, h3, h4, h5, h6  { font-family: avantgarde, sans-serif;
+                          font-weight: bold; }
+h1                      { font-size: 180%; }
+h2                      { font-size: 150%; }
+h3, h4                  { font-size: 120%; }
+
+/* These are section titles used in navigation links, so make sure we
+ * match the section header font here, even it not the weight.
+ */
+.sectref                { font-family: avantgarde, sans-serif; }
+/* And the label before the titles in navigation: */
+.navlabel               { font-size: 85%; }
+
+
+/* LaTeX2HTML insists on inserting <br> elements into headers which
+ * are marked with \label.  This little bit of CSS magic ensures that
+ * these elements don't cause spurious whitespace to be added.
+ */
+h1>br, h2>br, h3>br,
+h4>br, h5>br, h6>br     { display: none; }
+
+code, tt                { font-family: "lucida typewriter", lucidatypewriter,
+                                       monospace; }
+var                     { font-family: times, serif;
+                          font-style: italic;
+                          font-weight: normal; }
+
+.Unix                   { font-variant: small-caps; }
+
+.typelabel              { font-family: lucida, sans-serif; }
+
+.navigation td          { background-color: #99ccff;
+                          font-weight: bold;
+                          font-family: avantgarde, sans-serif;
+                          font-size: 110%; }
+
+div.warning             { background-color: #fffaf0;
+                          border: thin solid black;
+                          padding: 1em;
+                          margin-left: 2em;
+                          margin-right: 2em; }
+
+div.warning .label      { font-family: sans-serif;
+                          font-size: 110%;
+                          margin-right: 0.5em; }
+
+div.note                { background-color: #fffaf0;
+                          border: thin solid black;
+                          padding: 1em;
+                          margin-left: 2em;
+                          margin-right: 2em; }
+
+div.note .label         { margin-right: 0.5em;
+                          font-family: sans-serif; }
+
+address                 { font-size: 80%; }
+.release-info           { font-style: italic;
+                          font-size: 80%; }
+
+.titlegraphic           { vertical-align: top; }
+
+.verbatim pre           { color: #00008b;
+                          font-family: "lucida typewriter", lucidatypewriter,
+                                       monospace;
+                          font-size: 90%; }
+.verbatim               { margin-left: 2em; }
+.verbatim .footer       { padding: 0.05in;
+                          font-size: 85%;
+                          background-color: #99ccff;
+                          margin-right: 0.5in; }
+
+.grammar                { background-color: #99ccff;
+                          margin-right: 0.5in;
+                          padding: 0.05in; }
+.grammar-footer         { padding: 0.05in;
+                          font-size: 85%; }
+.grammartoken           { font-family: "lucida typewriter", lucidatypewriter,
+                                       monospace; }
+
+.productions                  { background-color: #bbeeff; }
+.productions a:active         { color: #ff0000; }
+.productions a:link:hover     { background-color: #99ccff; }
+.productions a:visited:hover  { background-color: #99ccff; }
+.productions a:visited        { color: #551a8b; }
+.productions a:link           { color: #0000bb; }
+.productions table            { vertical-align: baseline;
+                                empty-cells: show; }
+.productions > table td,
+.productions > table th       { padding: 2px; }
+.productions > table td:first-child,
+.productions > table td:last-child {
+                                font-family: "lucida typewriter",
+                                             lucidatypewriter,
+                                             monospace;
+                                }
+/* same as the second selector above, but expressed differently for Opera */
+.productions > table td:first-child + td + td {
+                                font-family: "lucida typewriter",
+                                             lucidatypewriter,
+                                             monospace;
+                                vertical-align: baseline;
+                                }
+.productions > table td:first-child + td {
+                                padding-left: 1em;
+                                padding-right: 1em;
+                                }
+.productions > table tr       { vertical-align: baseline; }
+
+.email                  { font-family: avantgarde, sans-serif; }
+.mailheader             { font-family: avantgarde, sans-serif; }
+.mimetype               { font-family: avantgarde, sans-serif; }
+.newsgroup              { font-family: avantgarde, sans-serif; }
+.url                    { font-family: avantgarde, sans-serif; }
+.file                   { font-family: avantgarde, sans-serif; }
+.guilabel               { font-family: avantgarde, sans-serif; }
+
+.realtable              { border-collapse: collapse;
+                          border-color: black;
+                          border-style: solid;
+                          border-width: 0px 0px 2px 0px;
+                          empty-cells: show;
+                          margin-left: auto;
+                          margin-right: auto;
+                          padding-left: 0.4em;
+                          padding-right: 0.4em;
+                          }
+.realtable tbody        { vertical-align: baseline; }
+.realtable tfoot        { display: table-footer-group; }
+.realtable thead        { background-color: #99ccff;
+                          border-width: 0px 0px 2px 1px;
+                          display: table-header-group;
+                          font-family: avantgarde, sans-serif;
+                          font-weight: bold;
+                          vertical-align: baseline;
+                          }
+.realtable thead :first-child {
+                          border-width: 0px 0px 2px 0px;
+                          }
+.realtable thead th     { border-width: 0px 0px 2px 1px }
+.realtable td,
+.realtable th           { border-color: black;
+                          border-style: solid;
+                          border-width: 0px 0px 1px 1px;
+                          padding-left: 0.4em;
+                          padding-right: 0.4em;
+                          }
+.realtable td:first-child,
+.realtable th:first-child {
+                          border-left-width: 0px;
+                          vertical-align: baseline;
+                          }
+.center                 { text-align: center; }
+.left                   { text-align: left; }
+.right                  { text-align: right; }
+
+.refcount-info          { font-style: italic; }
+.refcount-info .value   { font-weight: bold;
+                          color: #006600; }
+
+/*
+ * Some decoration for the "See also:" blocks, in part inspired by some of
+ * the styling on Lars Marius Garshol's XSA pages.
+ * (The blue in the navigation bars is #99CCFF.)
+ */
+.seealso                { background-color: #fffaf0;
+                          border: thin solid black;
+                          padding: 0pt 1em 4pt 1em; }
+
+.seealso > .heading     { font-size: 110%;
+                          font-weight: bold; }
+
+/*
+ * Class 'availability' is used for module availability statements at
+ * the top of modules.
+ */
+.availability .platform { font-weight: bold; }
+
+
+/*
+ * Additional styles for the distutils package.
+ */
+.du-command             { font-family: monospace; }
+.du-option              { font-family: avantgarde, sans-serif; }
+.du-filevar             { font-family: avantgarde, sans-serif;
+                          font-style: italic; }
+.du-xxx:before          { content: "** ";
+                          font-weight: bold; }
+.du-xxx:after           { content: " **";
+                          font-weight: bold; }
+
+
+/*
+ * Some specialization for printed output.
+ */
+@media print {
+  .online-navigation    { display: none; }
+  }
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<link rel="STYLESHEET" href="bsdiff.css" type='text/css' />
+<link rel="first" href="bsdiff.html" title='cx_Logging' />
+<link rel='contents' href='contents.html' title="Contents" />
+<link rel='last' href='about.html' title='About this document...' />
+<link rel='help' href='about.html' title='About this document...' />
+<link rel="next" href="front.html" />
+<meta name='aesop' content='information' />
+<title>cx_Logging</title>
+</head>
+<body>
+<DIV CLASS="navigation">
+<div id='top-navigation-panel' xml:id='top-navigation-panel'>
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><img src='previous.png'
+  border='0' height='32'  alt='Previous Page' width='32' /></td>
+<td class='online-navigation'><img src='up.png'
+  border='0' height='32'  alt='Up One Level' width='32' /></td>
+<td class='online-navigation'><a rel="next" title="Front Matter"
+  href="front.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="front.html">Front Matter</A>
+</div>
+<hr /></div>
+</DIV>
+<!--End of Navigation Panel-->
+<P>
+
+<div class="titlepage">
+<div class='center'>
+<h1>cx_Logging</h1>
+<p><b><font size="+2">Anthony Tuininga</font></b></p>
+<p>
+        <strong>Computronix</strong>
+<BR>
+Email: <span class="email">anthony.tuininga@gmail.com</span>
+</p>
+<p><strong>Release 1.1</strong><br />
+<strong>9 March 2005</strong></p>
+<p></p>
+</div>
+</div>
+
+<P>
+
+<p><br /></p><hr class='online-navigation' />
+
+<div class='online-navigation'>
+<!--Table of Child-Links-->
+<A NAME="CHILD_LINKS"></a>
+
+<UL CLASS="ChildLinks">
+<LI><A href="front.html">Front Matter</a>
+<LI><A href="contents.html">Contents</a>
+<LI><A href="module.html">1. Module Interface</a>
+<LI><A href="node4.html">2. License</a>
+<LI><A href="about.html">About this document ...</a>
+</ul>
+<!--End of Table of Child-Links-->
+</div>
+
+<DIV CLASS="navigation">
+<div class='online-navigation'>
+<p></p><hr />
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><img src='previous.png'
+  border='0' height='32'  alt='Previous Page' width='32' /></td>
+<td class='online-navigation'><img src='up.png'
+  border='0' height='32'  alt='Up One Level' width='32' /></td>
+<td class='online-navigation'><a rel="next" title="Front Matter"
+  href="front.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="front.html">Front Matter</A>
+</div>
+</div>
+<hr />
+<span class="release-info">Release 1.1, documentation updated on 9 March 2005.</span>
+</DIV>
+<!--End of Navigation Panel-->
+
+</BODY>
+</HTML>

html/contents.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<link rel="STYLESHEET" href="bsdiff.css" type='text/css' />
+<link rel="first" href="bsdiff.html" title='cx_Logging' />
+<link rel='contents' href='contents.html' title="Contents" />
+<link rel='last' href='about.html' title='About this document...' />
+<link rel='help' href='about.html' title='About this document...' />
+<link rel="next" href="module.html" />
+<link rel="prev" href="front.html" />
+<link rel="parent" href="bsdiff.html" />
+<link rel="next" href="module.html" />
+<meta name='aesop' content='information' />
+<title>Contents</title>
+</head>
+<body>
+<DIV CLASS="navigation">
+<div id='top-navigation-panel' xml:id='top-navigation-panel'>
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="Front Matter"
+  href="front.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="1. Module Interface"
+  href="module.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="front.html">Front Matter</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="module.html">1. Module Interface</A>
+</div>
+<hr /></div>
+</DIV>
+<!--End of Navigation Panel-->
+<BR><h2><A NAME="SECTION002000000000000000000">
+Contents</A>
+</h2>
+<!--Table of Contents-->
+
+<UL CLASS="TofC">
+<LI><A href="module.html">1. Module Interface</a>
+<LI><A href="node4.html">2. License</a>
+</ul>
+<!--End of Table of Contents-->
+<P>
+
+<DIV CLASS="navigation">
+<div class='online-navigation'>
+<p></p><hr />
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="Front Matter"
+  href="front.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="1. Module Interface"
+  href="module.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="front.html">Front Matter</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="module.html">1. Module Interface</A>
+</div>
+</div>
+<hr />
+<span class="release-info">Release 1.1, documentation updated on 9 March 2005.</span>
+</DIV>
+<!--End of Navigation Panel-->
+
+</BODY>
+</HTML>

html/contents.png

Added
New image
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<link rel="STYLESHEET" href="bsdiff.css" type='text/css' />
+<link rel="first" href="bsdiff.html" title='cx_Logging' />
+<link rel='contents' href='contents.html' title="Contents" />
+<link rel='last' href='about.html' title='About this document...' />
+<link rel='help' href='about.html' title='About this document...' />
+<link rel="next" href="contents.html" />
+<link rel="prev" href="bsdiff.html" />
+<link rel="parent" href="bsdiff.html" />
+<link rel="next" href="contents.html" />
+<meta name='aesop' content='information' />
+<title>Front Matter</title>
+</head>
+<body>
+<DIV CLASS="navigation">
+<div id='top-navigation-panel' xml:id='top-navigation-panel'>
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="cx_Logging"
+  href="bsdiff.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="Contents"
+  href="contents.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="contents.html">Contents</A>
+</div>
+<hr /></div>
+</DIV>
+<!--End of Navigation Panel-->
+
+<H1><A NAME="SECTION001000000000000000000"></A><A NAME="front"></A>
+<BR>
+Front Matter
+</H1>
+
+<P>
+Copyright &#169; 2003-2005 Computronix.
+All rights reserved.
+
+<P>
+See the end of this document for complete license and permissions
+information.
+
+<P>
+
+<H3>Abstract:</H3>
+<DIV CLASS="ABSTRACT">
+
+<P>
+bsdiff is a very simple Python extension module that allows Python to perform
+the same tasks as the bsdiff utility available from
+<a class="url" href="http://www.daemonology.net/bsdiff">http://www.daemonology.net/bsdiff</a>.
+
+<P>
+</DIV>
+<P>
+
+<P>
+
+<DIV CLASS="navigation">
+<div class='online-navigation'>
+<p></p><hr />
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="cx_Logging"
+  href="bsdiff.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="Contents"
+  href="contents.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="contents.html">Contents</A>
+</div>
+</div>
+<hr />
+<span class="release-info">Release 1.1, documentation updated on 9 March 2005.</span>
+</DIV>
+<!--End of Navigation Panel-->
+
+</BODY>
+</HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<link rel="STYLESHEET" href="bsdiff.css" type='text/css' />
+<link rel="first" href="bsdiff.html" title='cx_Logging' />
+<link rel='contents' href='contents.html' title="Contents" />
+<link rel='last' href='about.html' title='About this document...' />
+<link rel='help' href='about.html' title='About this document...' />
+<link rel="next" href="front.html" />
+<meta name='aesop' content='information' />
+<title>cx_Logging</title>
+</head>
+<body>
+<DIV CLASS="navigation">
+<div id='top-navigation-panel' xml:id='top-navigation-panel'>
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><img src='previous.png'
+  border='0' height='32'  alt='Previous Page' width='32' /></td>
+<td class='online-navigation'><img src='up.png'
+  border='0' height='32'  alt='Up One Level' width='32' /></td>
+<td class='online-navigation'><a rel="next" title="Front Matter"
+  href="front.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="front.html">Front Matter</A>
+</div>
+<hr /></div>
+</DIV>
+<!--End of Navigation Panel-->
+<P>
+
+<div class="titlepage">
+<div class='center'>
+<h1>cx_Logging</h1>
+<p><b><font size="+2">Anthony Tuininga</font></b></p>
+<p>
+        <strong>Computronix</strong>
+<BR>
+Email: <span class="email">anthony.tuininga@gmail.com</span>
+</p>
+<p><strong>Release 1.1</strong><br />
+<strong>9 March 2005</strong></p>
+<p></p>
+</div>
+</div>
+
+<P>
+
+<p><br /></p><hr class='online-navigation' />
+
+<div class='online-navigation'>
+<!--Table of Child-Links-->
+<A NAME="CHILD_LINKS"></a>
+
+<UL CLASS="ChildLinks">
+<LI><A href="front.html">Front Matter</a>
+<LI><A href="contents.html">Contents</a>
+<LI><A href="module.html">1. Module Interface</a>
+<LI><A href="node4.html">2. License</a>
+<LI><A href="about.html">About this document ...</a>
+</ul>
+<!--End of Table of Child-Links-->
+</div>
+
+<DIV CLASS="navigation">
+<div class='online-navigation'>
+<p></p><hr />
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><img src='previous.png'
+  border='0' height='32'  alt='Previous Page' width='32' /></td>
+<td class='online-navigation'><img src='up.png'
+  border='0' height='32'  alt='Up One Level' width='32' /></td>
+<td class='online-navigation'><a rel="next" title="Front Matter"
+  href="front.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="front.html">Front Matter</A>
+</div>
+</div>
+<hr />
+<span class="release-info">Release 1.1, documentation updated on 9 March 2005.</span>
+</DIV>
+<!--End of Navigation Panel-->
+
+</BODY>
+</HTML>

html/index.png

Added
New image
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<link rel="STYLESHEET" href="bsdiff.css" type='text/css' />
+<link rel="first" href="bsdiff.html" title='cx_Logging' />
+<link rel='contents' href='contents.html' title="Contents" />
+<link rel='last' href='about.html' title='About this document...' />
+<link rel='help' href='about.html' title='About this document...' />
+<link rel="next" href="node4.html" />
+<link rel="prev" href="contents.html" />
+<link rel="parent" href="bsdiff.html" />
+<link rel="next" href="node4.html" />
+<meta name='aesop' content='information' />
+<title>1. Module Interface</title>
+</head>
+<body>
+<DIV CLASS="navigation">
+<div id='top-navigation-panel' xml:id='top-navigation-panel'>
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="Contents"
+  href="contents.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="2. License"
+  href="node4.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="contents.html">Contents</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="node4.html">2. License</A>
+</div>
+<hr /></div>
+</DIV>
+<!--End of Navigation Panel-->
+
+<H1><A NAME="SECTION003000000000000000000"></A><A NAME="module"></A>
+<BR>
+1. Module Interface
+</H1>
+
+<P>
+<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
+  <td><nobr><b><tt id='l2h-1' xml:id='l2h-1' class="function">Diff</tt></b>(</nobr></td>
+  <td><var><var>origData</var>, <var>newData</var></var>)</td></tr></table></dt>
+<dd>
+  Perform a binary diff between the two pieces of data and return a tuple
+  consisting of the control tuples, diff block and extra block required to
+  reconstitute the new data.
+</dl>
+
+<P>
+<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
+  <td><nobr><b><tt id='l2h-2' xml:id='l2h-2' class="function">Patch</tt></b>(</nobr></td>
+  <td><var><var>origData</var>, <var>newDataLength</var>,
+      <var>controlTuples</var>, <var>diffBlock</var>, <var>extraBlock</var></var>)</td></tr></table></dt>
+<dd>
+  Return the new data given the original data, the length of the new data and
+  the output from the Diff method.
+</dl>
+
+<P>
+
+<DIV CLASS="navigation">
+<div class='online-navigation'>
+<p></p><hr />
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="Contents"
+  href="contents.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="2. License"
+  href="node4.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="contents.html">Contents</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="node4.html">2. License</A>
+</div>
+</div>
+<hr />
+<span class="release-info">Release 1.1, documentation updated on 9 March 2005.</span>
+</DIV>
+<!--End of Navigation Panel-->
+
+</BODY>
+</HTML>

html/modules.png

Added
New image

html/next.png

Added
New image
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<link rel="STYLESHEET" href="bsdiff.css" type='text/css' />
+<link rel="first" href="bsdiff.html" title='cx_Logging' />
+<link rel='contents' href='contents.html' title="Contents" />
+<link rel='last' href='about.html' title='About this document...' />
+<link rel='help' href='about.html' title='About this document...' />
+<link rel="next" href="about.html" />
+<link rel="prev" href="module.html" />
+<link rel="parent" href="bsdiff.html" />
+<link rel="next" href="about.html" />
+<meta name='aesop' content='information' />
+<title>2. License</title>
+</head>
+<body>
+<DIV CLASS="navigation">
+<div id='top-navigation-panel' xml:id='top-navigation-panel'>
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="1. Module Interface"
+  href="module.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="About this document ..."
+  href="about.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="module.html">1. Module Interface</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="about.html">About this document ...</A>
+</div>
+<hr /></div>
+</DIV>
+<!--End of Navigation Panel-->
+
+<H1><A NAME="SECTION004000000000000000000">
+2. License</A>
+</H1>
+
+<P>
+<DIV CLASS="centerline" ID="par127" ALIGN="CENTER">
+<strong>LICENSE AGREEMENT FOR CX_BSDIFF 1.1</strong></DIV>
+
+<P>
+Copyright &#169; 2003-2005, Computronix (Canada) Ltd., Edmonton, Alberta, Canada.
+All rights reserved.
+
+<P>
+See the accompanying file LICENSE.txt for details on the license.
+
+<P>
+Computronix (R) is a registered trademark of Computronix (Canada) Ltd.
+
+<P>
+
+<DIV CLASS="navigation">
+<div class='online-navigation'>
+<p></p><hr />
+<table align="center" width="100%" cellpadding="0" cellspacing="2">
+<tr>
+<td class='online-navigation'><a rel="prev" title="1. Module Interface"
+  href="module.html"><img src='previous.png'
+border='0' height='32'  alt='Previous Page' width='32' /></A></td>
+<td class='online-navigation'><a rel="parent" title="cx_Logging"
+  href="bsdiff.html"><img src='up.png'
+border='0' height='32'  alt='Up One Level' width='32' /></A></td>
+<td class='online-navigation'><a rel="next" title="About this document ..."
+  href="about.html"><img src='next.png'
+border='0' height='32'  alt='Next Page' width='32' /></A></td>
+<td align="center" width="100%">cx_Logging</td>
+<td class='online-navigation'><a rel="contents" title="Table of Contents"
+  href="contents.html"><img src='contents.png'
+border='0' height='32'  alt='Contents' width='32' /></A></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+<td class='online-navigation'><img src='blank.png'
+  border='0' height='32'  alt='' width='32' /></td>
+</tr></table>
+<div class='online-navigation'>
+<b class="navlabel">Previous:</b>
+<a class="sectref" rel="prev" href="module.html">1. Module Interface</A>
+<b class="navlabel">Up:</b>
+<a class="sectref" rel="parent" href="bsdiff.html">cx_Logging</A>
+<b class="navlabel">Next:</b>
+<a class="sectref" rel="next" href="about.html">About this document ...</A>
+</div>
+</div>
+<hr />
+<span class="release-info">Release 1.1, documentation updated on 9 March 2005.</span>
+</DIV>
+<!--End of Navigation Panel-->
+
+</BODY>
+</HTML>

html/previous.png

Added
New image

html/pyfav.png

Added
New image
Added
New image
+[bdist_rpm]
+doc_files = LICENSE.txt README.txt html
+
+"""Distutils script for bsdiff.
+
+Windows platforms:
+    python setup.py build --compiler=mingw32 install
+
+Unix platforms
+    python setup.py build install
+
+"""
+
+import sys
+
+from distutils.core import setup
+from distutils.extension import Extension
+from distutils import sysconfig
+
+# setup extra compilation and linking args
+extraLinkArgs = ["-s"]
+if sys.platform == "win32":
+    import win32api
+    extraLinkArgs.append("-Wl,--add-stdcall-alias")
+    extraLinkArgs.append(win32api.GetModuleFileName(sys.dllhandle))
+
+# define the list of files to be included as documentation for Windows
+dataFiles = None
+if sys.platform in ("win32", "cygwin"):
+    baseName = "cx_bsdiff-doc"
+    dataFiles = [ (baseName, [ "LICENSE.TXT", "README.TXT" ]) ]
+    allFiles = []
+    for fileName in open("MANIFEST").readlines():
+        allFiles.append(fileName.strip())
+    for dir in ["html"]:
+        files = []
+        for name in allFiles:
+            if name.startswith(dir):
+                files.append(name)
+        dataFiles.append( ("%s/%s" % (baseName, dir), files) )
+
+# setup the extension
+extension = Extension(
+        name = "bsdiff",
+        extra_link_args = extraLinkArgs,
+        sources = ["bsdiff.c"])
+
+# perform the setup
+setup(
+        name = "cx_bsdiff",
+        version = "1.1",
+        data_files = dataFiles,
+        description = "Python interface for bsdiff",
+        license = "See LICENSE.txt",
+        long_description = "Python interface for bsdiff",
+        author = "Anthony Tuininga",
+        author_email = "anthony.tuininga@gmail.com",
+        url = "http://www.computronix.com/utilities.shtml",
+        ext_modules = [extension])
+