summaryrefslogtreecommitdiffstats
path: root/kpilot/conduits/docconduit/makedoc9.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kpilot/conduits/docconduit/makedoc9.cc')
-rw-r--r--kpilot/conduits/docconduit/makedoc9.cc405
1 files changed, 0 insertions, 405 deletions
diff --git a/kpilot/conduits/docconduit/makedoc9.cc b/kpilot/conduits/docconduit/makedoc9.cc
deleted file mode 100644
index 1f1c56ff..00000000
--- a/kpilot/conduits/docconduit/makedoc9.cc
+++ /dev/null
@@ -1,405 +0,0 @@
-// based on: MakeDoc, version 2
-// I only took the tBuf class from there and adapted it.
-//
-// Compresses text files into a format that is ready to export to a Pilot
-// and work with Rick Bram's PilotDOC reader.
-// Copyright (C) Reinhold Kainhofer, 2002
-// Copyrigth (C) Pat Beirne, 2000
-//
-// Original file (makedoc9.cpp) copyright by:
-// Copyright (C) Pat Beirne, 2000.
-// Distributable under the GNU General Public License Version 2 or later.
-//
-// ver 0.6 enforce 31 char limit on database names
-// ver 0.7 change header and record0 to structs
-// ver 2.0 added category control on the command line
-// changed extensions from .prc to .pdb
-
-/*
-** This program is free software; you can redistribute it and/or modify
-** it under the terms of the GNU General Public License as published by
-** the Free Software Foundation; either version 2 of the License, or
-** (at your option) any later version.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-**
-** You should have received a copy of the GNU General Public License
-** along with this program in a file called COPYING; if not, write to
-** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-** MA 02110-1301, USA.
-*/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <iostream>
-
-
-#include "makedoc9.h"
-
-
-
-//
-// Issue()
-//
-// action: handle the details of writing a single
-// character to the compressed stream
-//
-unsigned
- tBuf::Issue(byte src, int &bSpace)
-{
- unsigned int iDest = len;
- byte *dest = buf;
-
- // TODO: which of the if parts should really be included???
-#if 0
- // modified version of issue
- // just issue the char
- if (src >= 0x80 || src <= 8)
- dest[iDest++] = 1;
- dest[iDest++] = src;
-
-#else
- // if there is an outstanding space char, see if
- // we can squeeze it in with an ASCII char
- if (bSpace)
- {
- if (src >= 0x40 && src <= 0x7F)
- dest[iDest++] = src ^ 0x80;
- else
- {
- // couldn't squeeze it in, so issue the space char by itself
- // most chars go out simple, except the range 1...8,0x80...0xFF
- dest[iDest++] = ' ';
- if (src < 0x80 && (src == 0 || src > 8))
- dest[iDest++] = src;
- else
- dest[iDest++] = 1, dest[iDest++] = src;
- }
- // knock down the space flag
- bSpace = 0;
- }
- else
- {
- // check for a space char
- if (src == ' ')
- bSpace = 1;
- else
- {
- if (src < 0x80 && (src == 0 || src > 8))
- dest[iDest++] = src;
- else
- dest[iDest++] = 1, dest[iDest++] = src;
-
- }
- }
-#endif
- len = iDest;
- return iDest;
-}
-
-//
-// Compress
-//
-// params: none
-//
-// action: takes the given buffer,
-// and compresses
-// the original data down into a second buffer
-//
-// comment: This version make heavy use of walking pointers.
-//
-unsigned tBuf::Compress()
-{
- if (!buf)
- return 0;
- if (isCompressed) {
-// cout<<"Buffer is already compressed!"<<endl;
- return len;
-// } else {
-// cout<<" Compressing buffer!!!"<<endl;
- }
-
- unsigned int i;
-
- // run through the input buffer
- byte *pBuffer; // points to the input buffer
- byte *pHit; // points to a walking test hit; works upwards on successive matches
- byte *pPrevHit; // previous value of pHit; also, start of next test
- byte *pTestHead; // current test string
- byte *pTestTail; // current walking pointer; one past the current test buffer
- byte *pEnd; // 1 past the end of the input buffer
-
- pHit = pPrevHit = pTestHead = pBuffer = buf;
- pTestTail = pTestHead + 1;
- pEnd = buf + len; // should point to a 0!
-
- // make a dest buffer and reassign the local buffer
- buf = new byte[6000];
- len = 0; // used to walk through the output buffer
-
- // loop, absorbing one more char from the input buffer on each pass
- for (; pTestHead != pEnd; pTestTail++)
- {
- // if we already have 10 char match, don't bother scanning again for the 11th (wasted time)
- if (pTestTail - pTestHead != (1 << COUNT_BITS) + 3)
- {
- // scan in the previous data for a match
- // terminate the test string (and the matcher string, as well!) in a 0
- byte tmp = *pTestTail;
-
- *pTestTail = 0;
- pHit = (byte *) strstr((const char *) pPrevHit,
- (const char *) pTestHead);
- *pTestTail = tmp; // restore the char
- }
-
- // on a mismatch or end of buffer, issued codes
- if (pHit == pTestHead
- || pTestTail - pTestHead > (1 << COUNT_BITS) + 2
- || pTestTail == pEnd)
- {
- // issue the codes
- // first, check for short runs
- if (pTestTail - pTestHead < 4)
- {
- if (pTestHead[0] > 0x7F || pTestHead[0] <= 8)
- buf[len++] = 1;
- buf[len++] = pTestHead[0];
- pTestHead++;
- }
- // for longer runs, issue a run-code
- else
- {
- unsigned int dist = pTestHead - pPrevHit;
- unsigned int compound =
- (dist << COUNT_BITS) + pTestTail - pTestHead - 4;
-
-//if (dist>=(1<<DISP_BITS)) printf("\n!! error dist overflow");
-//if (pTestTail-pTestHead-4>7) printf("\n!! error len overflow");
-
- buf[len++] = 0x80 + (compound >> 8);
- buf[len++] = compound & 0xFF;
-//printf("\nissuing code for sequence len %d <%c%c%c>",pTestTail-pTestHead-1,pTestHead[0],pTestHead[1],pTestHead[2]);
-//printf("\n <%x%x>",pOut[-2],pOut[-1]);
- // and start again
- pTestHead = pTestTail - 1;
- }
- // start the search again
- pPrevHit = pBuffer;
- // within range
- if (pTestHead - pPrevHit > ((1 << DISP_BITS) - 1))
- pPrevHit = pTestHead - ((1 << DISP_BITS) - 1);
- }
- // got a match
- else
- {
- pPrevHit = pHit;
- }
- // when we get to the end of the buffer, don't inc past the end
- // this forces the residue chars out one at a time
- if (pTestTail == pEnd)
- pTestTail--;
- }
-
-
- // final scan to merge consecutive high chars together
- // and merge space chars
- unsigned int k;
-
- for (i = k = 0; i < len; i++, k++)
- {
- buf[k] = buf[i];
- // skip the run-length codes
- if (buf[k] >= 0x80 && buf[k] < 0xC0)
- buf[++k] = buf[++i];
- // if we hit a high char marker, look ahead for another
- // and merge multiples together
- else if (buf[k] == 1)
- {
- buf[k + 1] = buf[i + 1];
- while (i + 2 < len && buf[i + 2] == 1 && buf[k] < 8)
- {
- buf[k]++;
- buf[k + buf[k]] = buf[i + 3];
- i += 2;
- }
- k += buf[k];
- i++;
- }
- else if (buf[k] == ' ' && i < len - 1 && buf[i + 1] <= 0x7F
- && buf[i + 1] >= 0x40)
- buf[k] = 0x80 | buf[++i];
- }
-
- // delete original buffer
- delete[]pBuffer;
- len = k;
-
- isCompressed = true;
- return k;
-}
-
-/*
- Decompress
-
- params: none
-
- action: make a new buffer
- run through the source data
- check the 4 cases:
- 0,9...7F represent self
- 1...8 escape n chars
- 80...bf reference earlier run
- c0...ff space+ASCII
-
-*/
-unsigned tBuf::Decompress()
-{
- if (!buf)
- return 0;
- if (!isCompressed) {
-// cout<<"Buffer already uncompressed. Doing nothing"<<endl;
- return len;
-// } else {
-// cout<<"Decompressing buffer"<<endl;
- }
-
- // we "know" that all decompresses fit within 4096, right?
- byte *pOut = new byte[6000];
- byte *in_buf = buf;
- byte *out_buf = pOut;
-
- unsigned int i, j;
-
- for (j = i = 0; j < len;)
- {
- unsigned int c;
-
- // take a char from the input buffer
- c = in_buf[j++];
-
- // separate the char into zones: 0, 1...8, 9...0x7F, 0x80...0xBF, 0xC0...0xFF
-
- // codes 1...8 mean copy that many bytes; for accented chars & binary
- if (c > 0 && c < 9)
- while (c--)
- out_buf[i++] = in_buf[j++];
-
- // codes 0, 9...0x7F represent themselves
- else if (c < 0x80)
- out_buf[i++] = c;
-
- // codes 0xC0...0xFF represent "space + ascii char"
- else if (c >= 0xC0)
- out_buf[i++] = ' ', out_buf[i++] = c ^ 0x80;
-
- // codes 0x80...0xBf represent sequences
- else
- {
- int m, n;
-
- c <<= 8;
- c += in_buf[j++];
- m = (c & 0x3FFF) >> COUNT_BITS;
- n = c & ((1 << COUNT_BITS) - 1);
- n += 3;
- while (n--)
- {
- out_buf[i] = out_buf[i - m];
- i++;
- }
- }
- }
- out_buf[i++]='\0';
- out_buf[i++]='\0';
- delete[]buf;
- buf = pOut;
- len = i;
-
- isCompressed = false;
- return i;
-}
-
-unsigned tBuf::DuplicateCR()
-{
- if (!buf)
- return 0;
- byte *pBuf = new byte[2 * len];
-
- unsigned int k, j;
-
- for (j = k = 0; j < len; j++, k++)
- {
- pBuf[k] = buf[j];
- if (pBuf[k] == 0x0A)
- pBuf[k++] = 0x0D, pBuf[k] = 0x0A;
- }
- delete[]buf;
- buf = pBuf;
- len = k;
- return k;
-}
-
-
-
-// this nasty little beast removes really low ASCII and 0's
-// and handles the CR problem
-//
-// if a cr appears before a lf, then remove the cr
-// if a cr appears in isolation, change to a lf
-unsigned tBuf::RemoveBinary()
-{
- if (!buf)
- return 0;
- byte *in_buf = buf;
- byte *out_buf = new byte[len];
-
- unsigned int k, j;
-
- for (j = k = 0; j < len; j++, k++)
- {
- // copy each byte
- out_buf[k] = in_buf[j];
-
- // throw away really low ASCII
- if (( /*out_buf[k]>=0 && */ out_buf[k] < 9))
- k--;
-
- // for CR
- if (out_buf[k] == 0x0D)
- {
- // if next is LF, then drop it
- if (j < len - 1 && in_buf[j + 1] == 0x0A)
- k--;
- else // turn it into a LF
- out_buf[k] = 0x0A;
- }
- }
- delete[]buf;
- buf = out_buf;
- len = k;
- return k;
-}
-
-void tBuf::setText(const byte * text, unsigned txtlen, bool txtcomp)
-{
- if (buf)
- delete[]buf;
- buf = 0L;
-
- if (txtlen <= 0)
- txtlen = strlen((const char *) text);
- len = txtlen;
- buf = new byte[len];
-
- memcpy(buf, text, len*sizeof(char));
-// strncpy((char *) buf, (const char *) text, len);
- isCompressed = txtcomp;
-// cout<<"Setting text, compressed="<<txtcomp<<endl;
-}