kpilot
makedoc9.ccGo to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <stdio.h>
00037 #include <stdlib.h>
00038 #include <string.h>
00039
00040 #include <iostream>
00041
00042
00043 #include "makedoc9.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 unsigned
00054 tBuf::Issue(byte src, int &bSpace)
00055 {
00056 unsigned int iDest = len;
00057 byte *dest = buf;
00058
00059
00060 #if 0
00061
00062
00063 if (src >= 0x80 || src <= 8)
00064 dest[iDest++] = 1;
00065 dest[iDest++] = src;
00066
00067 #else
00068
00069
00070 if (bSpace)
00071 {
00072 if (src >= 0x40 && src <= 0x7F)
00073 dest[iDest++] = src ^ 0x80;
00074 else
00075 {
00076
00077
00078 dest[iDest++] = ' ';
00079 if (src < 0x80 && (src == 0 || src > 8))
00080 dest[iDest++] = src;
00081 else
00082 dest[iDest++] = 1, dest[iDest++] = src;
00083 }
00084
00085 bSpace = 0;
00086 }
00087 else
00088 {
00089
00090 if (src == ' ')
00091 bSpace = 1;
00092 else
00093 {
00094 if (src < 0x80 && (src == 0 || src > 8))
00095 dest[iDest++] = src;
00096 else
00097 dest[iDest++] = 1, dest[iDest++] = src;
00098
00099 }
00100 }
00101 #endif
00102 len = iDest;
00103 return iDest;
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 unsigned tBuf::Compress()
00118 {
00119 if (!buf)
00120 return 0;
00121 if (isCompressed) {
00122
00123 return len;
00124
00125
00126 }
00127
00128 unsigned int i;
00129
00130
00131 byte *pBuffer;
00132 byte *pHit;
00133 byte *pPrevHit;
00134 byte *pTestHead;
00135 byte *pTestTail;
00136 byte *pEnd;
00137
00138 pHit = pPrevHit = pTestHead = pBuffer = buf;
00139 pTestTail = pTestHead + 1;
00140 pEnd = buf + len;
00141
00142
00143 buf = new byte[6000];
00144 len = 0;
00145
00146
00147 for (; pTestHead != pEnd; pTestTail++)
00148 {
00149
00150 if (pTestTail - pTestHead != (1 << COUNT_BITS) + 3)
00151 {
00152
00153
00154 byte tmp = *pTestTail;
00155
00156 *pTestTail = 0;
00157 pHit = (byte *) strstr((const char *) pPrevHit,
00158 (const char *) pTestHead);
00159 *pTestTail = tmp;
00160 }
00161
00162
00163 if (pHit == pTestHead
00164 || pTestTail - pTestHead > (1 << COUNT_BITS) + 2
00165 || pTestTail == pEnd)
00166 {
00167
00168
00169 if (pTestTail - pTestHead < 4)
00170 {
00171 if (pTestHead[0] > 0x7F || pTestHead[0] <= 8)
00172 buf[len++] = 1;
00173 buf[len++] = pTestHead[0];
00174 pTestHead++;
00175 }
00176
00177 else
00178 {
00179 unsigned int dist = pTestHead - pPrevHit;
00180 unsigned int compound =
00181 (dist << COUNT_BITS) + pTestTail - pTestHead - 4;
00182
00183
00184
00185
00186 buf[len++] = 0x80 + (compound >> 8);
00187 buf[len++] = compound & 0xFF;
00188
00189
00190
00191 pTestHead = pTestTail - 1;
00192 }
00193
00194 pPrevHit = pBuffer;
00195
00196 if (pTestHead - pPrevHit > ((1 << DISP_BITS) - 1))
00197 pPrevHit = pTestHead - ((1 << DISP_BITS) - 1);
00198 }
00199
00200 else
00201 {
00202 pPrevHit = pHit;
00203 }
00204
00205
00206 if (pTestTail == pEnd)
00207 pTestTail--;
00208 }
00209
00210
00211
00212
00213 unsigned int k;
00214
00215 for (i = k = 0; i < len; i++, k++)
00216 {
00217 buf[k] = buf[i];
00218
00219 if (buf[k] >= 0x80 && buf[k] < 0xC0)
00220 buf[++k] = buf[++i];
00221
00222
00223 else if (buf[k] == 1)
00224 {
00225 buf[k + 1] = buf[i + 1];
00226 while (i + 2 < len && buf[i + 2] == 1 && buf[k] < 8)
00227 {
00228 buf[k]++;
00229 buf[k + buf[k]] = buf[i + 3];
00230 i += 2;
00231 }
00232 k += buf[k];
00233 i++;
00234 }
00235 else if (buf[k] == ' ' && i < len - 1 && buf[i + 1] <= 0x7F
00236 && buf[i + 1] >= 0x40)
00237 buf[k] = 0x80 | buf[++i];
00238 }
00239
00240
00241 delete[]pBuffer;
00242 len = k;
00243
00244 isCompressed = true;
00245 return k;
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 unsigned tBuf::Decompress()
00263 {
00264 if (!buf)
00265 return 0;
00266 if (!isCompressed) {
00267
00268 return len;
00269
00270
00271 }
00272
00273
00274 byte *pOut = new byte[6000];
00275 byte *in_buf = buf;
00276 byte *out_buf = pOut;
00277
00278 unsigned int i, j;
00279
00280 for (j = i = 0; j < len;)
00281 {
00282 unsigned int c;
00283
00284
00285 c = in_buf[j++];
00286
00287
00288
00289
00290 if (c > 0 && c < 9)
00291 while (c--)
00292 out_buf[i++] = in_buf[j++];
00293
00294
00295 else if (c < 0x80)
00296 out_buf[i++] = c;
00297
00298
00299 else if (c >= 0xC0)
00300 out_buf[i++] = ' ', out_buf[i++] = c ^ 0x80;
00301
00302
00303 else
00304 {
00305 int m, n;
00306
00307 c <<= 8;
00308 c += in_buf[j++];
00309 m = (c & 0x3FFF) >> COUNT_BITS;
00310 n = c & ((1 << COUNT_BITS) - 1);
00311 n += 3;
00312 while (n--)
00313 {
00314 out_buf[i] = out_buf[i - m];
00315 i++;
00316 }
00317 }
00318 }
00319 out_buf[i++]='\0';
00320 out_buf[i++]='\0';
00321 delete[]buf;
00322 buf = pOut;
00323 len = i;
00324
00325 isCompressed = false;
00326 return i;
00327 }
00328
00329 unsigned tBuf::DuplicateCR()
00330 {
00331 if (!buf)
00332 return 0;
00333 byte *pBuf = new byte[2 * len];
00334
00335 unsigned int k, j;
00336
00337 for (j = k = 0; j < len; j++, k++)
00338 {
00339 pBuf[k] = buf[j];
00340 if (pBuf[k] == 0x0A)
00341 pBuf[k++] = 0x0D, pBuf[k] = 0x0A;
00342 }
00343 delete[]buf;
00344 buf = pBuf;
00345 len = k;
00346 return k;
00347 }
00348
00349
00350
00351
00352
00353
00354
00355
00356 unsigned tBuf::RemoveBinary()
00357 {
00358 if (!buf)
00359 return 0;
00360 byte *in_buf = buf;
00361 byte *out_buf = new byte[len];
00362
00363 unsigned int k, j;
00364
00365 for (j = k = 0; j < len; j++, k++)
00366 {
00367
00368 out_buf[k] = in_buf[j];
00369
00370
00371 if (( out_buf[k] < 9))
00372 k--;
00373
00374
00375 if (out_buf[k] == 0x0D)
00376 {
00377
00378 if (j < len - 1 && in_buf[j + 1] == 0x0A)
00379 k--;
00380 else
00381 out_buf[k] = 0x0A;
00382 }
00383 }
00384 delete[]buf;
00385 buf = out_buf;
00386 len = k;
00387 return k;
00388 }
00389
00390 void tBuf::setText(const byte * text, unsigned txtlen, bool txtcomp)
00391 {
00392 if (buf)
00393 delete[]buf;
00394 buf = 0L;
00395
00396 if (txtlen <= 0)
00397 txtlen = strlen((const char *) text);
00398 len = txtlen;
00399 buf = new byte[len];
00400
00401 memcpy(buf, text, len*sizeof(char));
00402
00403 isCompressed = txtcomp;
00404
00405 }
|