diff options
Diffstat (limited to 'src/m2400w.c')
-rw-r--r-- | src/m2400w.c | 1452 |
1 files changed, 1452 insertions, 0 deletions
diff --git a/src/m2400w.c b/src/m2400w.c new file mode 100644 index 0000000..4297358 --- /dev/null +++ b/src/m2400w.c @@ -0,0 +1,1452 @@ +/* + * m2400w converts the pbmraw or pksmraw output of ghostscript + * (www.ghostscript.com) into the format of the Minolta Magicolor + * 2400W Winprinter + * + * Copyright 2004 Leif Birkenfeld (leif@birkenfeld-home.de) + * 2005 Thomas Rohringer (thoroh@users.sourceforge.net) + * + * 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdio.h> +#include <math.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + +/* ---------------------------------------------------------------------- + other Variables + andere Variablen + ----------------------------------------------------------------------*/ + +FILE *in_stream, *out_stream; +/* FILE *cStream, *mStream, *yStream, *kStream; */ + +int verb = 0; /* verbose level */ +int MediaCode = 0; +int PaperCode = 4; +int ResXmul = 1; +int ResYmul = 1; +int colorMode = 0; +int thisSiteColorMode = 0; + +int saveToner = 0; +int useUCR = 0; + +int linesPerBlock; +unsigned char paperFormat; +unsigned char paperQuality; +unsigned short blocksPerPage; +unsigned short thisSiteBlocksPerPage; +unsigned int resBreite; +unsigned int resHoehe; + +int jobHeaderWritten = 0; +int headerCount = 0; /* zaehler fuer alle header */ +int siteInitHeaderCount = 0; /* zaehler fuer alle header */ +int reservedHeaderCountSH =0; /* reservierter HeaderCount fuer den Seitenheader da dieser erst spaeter verwendet wird */ + +long pix[4][3] = { /* pixel, ucr , tonerSave */ + {0, 0, 0}, /* cyan */ + {0, 0, 0}, /* magenta */ + {0, 0, 0}, /* yellow */ + {0, 0, 0}, /* schwarz */ +}; + +long cPix = 0; +long cPixSaved = 0; +long mPix = 0; +long mPixSaved = 0; +long yPix = 0; +long yPixSaved = 0; +long kPix = 0; +long kPixSaved = 0; + + +/* ---------------------------------------------------------- + Formateinstellungen +-------------------------------------------------------------- */ + +struct format +{ + char desc[32]; + int resX; + int resY; + int mediaWidth; + int mediaHeight; + int mediaMustBe; +}; + +struct format form[42] = { /* AENDERUNGEN */ +/* 0*/ {"no data\0", 0, 0, 0, 0, -1}, +/* 1*/ {"no data\0", 0, 0, 0, 0, -1}, +/* 2*/ {"no data\0", 0, 0, 0, 0, -1}, +/* 3*/ {"no data\0", 0, 0, 0, 0, -1}, +/* 4*/ {"A4\0", 4752, 6784, 0, 0, -1}, +/* 5*/ {"no data\0", 0, 0, 0, 0, -1}, +/* 6*/ {"B5 JIS\0", 4096, 5856, 0, 0, -1}, +/* 7*/ {"no data\0", 0, 0, 0, 0, -1}, +/* 8*/ {"A5\0", 3280,4736, 0, 0, -1}, +/* 9*/ {"no data\0", 0, 0, 0, 0, -1}, +/* a*/ {"no data\0", 0, 0, 0, 0, -1}, +/* b*/ {"no data\0", 0, 0, 0, 0, -1}, +/* c*/ {"no data\0", 0, 0, 0, 0, -1}, +/* d*/ {"no data\0", 0, 0, 0, 0, -1}, +/* e*/ {"no data\0", 0, 0, 0, 0, -1}, +/* f*/ {"no data\0", 0, 0, 0, 0, -1}, +/*10*/ {"no data\0", 0, 0, 0, 0, -1}, +/*11*/ {"no data\0", 0, 0, 0, 0, -1}, +/*12*/ {"Folio\0", 4752, 7584, 0, 0, -1}, +/*13*/ {"no data\0", 0, 0, 0, 0, -1}, +/*14*/ {"no data\0", 0, 0, 0, 0, -1}, +/*15*/ {"no data\0", 0, 0, 0, 0, -1}, +/*16*/ {"no data\0", 0, 0, 0, 0, -1}, +/*17*/ {"no data\0", 0, 0, 0, 0, -1}, +/*18*/ {"no data\0", 0, 0, 0, 0, -1}, +/*19*/ {"Legal\0", 4896, 8192, 0, 0, -1}, +/*1a*/ {"Government Legal\0", 4896, 7584, 0, 0, -1}, +/*1b*/ {"Letter\0", 4896, 6368, 0, 0, -1}, +/*1c*/ {"no data\0", 0, 0, 0, 0, -1}, +/*1d*/ {"no data\0", 0, 0, 0, 0, -1}, +/*1e*/ {"no data\0", 0, 0, 0, 0, -1}, +/*1f*/ {"Executive\0", 4144, 6080, 0, 0, -1}, +/*20*/ {"no data\0", 0, 0, 0, 0, -1}, +/*21*/ {"Statement\0", 3088,4896, 0, 0, -1}, +/*22*/ {"no data\0", 0, 0, 0, 0, -1}, +/*23*/ {"no data\0", 0, 0, 0, 0, -1}, +/*24*/ {"Kuvert Monarch\0", 2112, 4288, 0, 0, 3}, +/*25*/ {"Kuver #10\0", 2272, 5472, 0, 0, 3}, +/*26*/ {"Kuvert DL\0", 2384, 4992, 0, 0, 3}, +/*27*/ {"Kuvert C5\0", 3616, 5184, 0, 0, 3}, +/*28*/ {"Kuvert C6\0", 2480, 3616, 0, 0, 3}, +/*29*/ {"B5 ISO\0", 3952, 5696, 0, 0, 3}, +}; + +/* noch nicht eingebaute + +31;Letter Plus;4896;7408;216;322;8;926; +31;UK Quadro;4592;5792;203;254;8;724; +31;Druckerpapier;4592;7592;203;330;8;949; + +c0;Japan Postkarte;2152;3288;0;0;8;411; +*/ + + + +struct media +{ + char desc[32]; +}; + +struct media med[7] = { +/* 0*/ {"Normal (HQ)"}, +/* 1*/ {"Karton"}, +/* 2*/ {"Folie"}, +/* 3*/ {"Kuvert"}, +/* 4*/ {"Briefkopf"}, +/* 5*/ {"Postkarte"}, +/* 6*/ {"Etikette"}, +}; + + +/* ---------------------------------------------------------------------------- + + Headerstrukturen + + ---------------------------------------------------------------------------*/ + +unsigned char fileHeader[] = { 0x1B, 0x40, 0x00, 0x02, 0x00, 0xBF, 0x85, 0x10, 0xB1 }; + /* AENDERUNG 0x85 */ + /* char jobHeader[] ={0x1B,0x50,0x01,0x08,0x00,0xAF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24}; */ + +struct +{ + unsigned char jobHeaderT1[6]; + unsigned char res1; + unsigned char res2; + unsigned char jobHeaderT2[6]; + unsigned char prSum; +} +jobHeaderStc = +{ + { 0x1B, 0x50, 0x01, 0x08, 0x00, 0xAF}, + 0x01, 0x01, /* AENDERUNG letztes Byte 0x01 */ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + 0x00 +}; + +unsigned char *jobHeader = (unsigned char *)&jobHeaderStc; + + + +struct +{ + unsigned char seitenHeaderT1[2]; + unsigned char headerCount; + unsigned char seitenHeaderT2[3]; + unsigned char colorMode; + unsigned char seitenHeaderT2b[3]; + unsigned char breite1; + unsigned char breite2; + unsigned char seitenHeaderT3[2]; + unsigned char hoehe1; + unsigned char hoehe2; + unsigned char blocksPerPage1; + unsigned char seitenHeaderT4[1]; + unsigned char blocksPerPage2; + unsigned char seitenHeaderT5[2]; + unsigned char paperFormat; + unsigned char seitenHeaderT6[6]; + unsigned char paperQuality; + unsigned char seitenHeaderT7[5]; + unsigned char prSum; +} +seitenHeaderStc = +{ + { 0x1B, 0x51} , + 0x02, + { 0x1C, 0x00, 0xAE}, + 0x80, /* AENDERUNG 0x80 */ + { 0x01, 0x00, 0x00}, + 0x00, 0x00, + { 0x00, 0x00}, + 0x00, 0x00, 0x08, + { 0x00}, + 0x08, + { 0x00, 0x00}, + 0x04, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + 0x00, + { 0x00, 0x00, 0x00, 0x00, 0x00}, /* AENDERUNG 2. Byte 0x00 */ + 0x00 +}; + +unsigned char *seitenHeader = (unsigned char *) &seitenHeaderStc; + +struct +{ + unsigned char jobFooterT1[2]; + unsigned char headerCount; + unsigned char jobFooterT2[4]; + unsigned char prSum; +} +jobFooterStc = +{ + { 0x1B, 0x55}, + 0x02, + { 0x01, 0x00, 0xAA, 0x00}, + 0x00 +}; + +unsigned char *jobFooter = (unsigned char *) &jobFooterStc; + +struct +{ + unsigned char fileFooterT1[2]; + unsigned char headerCount; + unsigned char fileFooterT2[4]; + unsigned char prSum; +} +fileFooterStc = +{ + { 0x1B, 0x41}, + 0x00, + { 0x01, 0x00, 0xBE, 0x00}, + 0x00 +}; + +unsigned char *fileFooter = (unsigned char *) &fileFooterStc; + +struct +{ + unsigned char blockHeaderT1[2]; + unsigned char headerCount; + /* headerzaehler 0x?? */ + unsigned char blockHeaderT2[3]; + unsigned char blockLength1; + unsigned char blockLength2; + unsigned char blockLength3; + unsigned char blockLength4; + /* laenge des blocks in byte 0x??,0x??,0x??,0x?? */ + unsigned char tonerColor; + unsigned char blockCount; + /* bblockzaehler 0x?? */ + unsigned char linesPerBlock1; + unsigned char linesPerBlock2; + unsigned char prSum; + /* pruefsumme 0x?? */ +} +blockHeaderStc = +{ + { 0x1B, 0x52}, + 0x03, + { 0x08, 0x00, 0xAD}, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x03, 0x00 /* AENDERUNG 7. Byte 0x50 */ +}; + +unsigned char *blockHeader = (unsigned char *) &blockHeaderStc; + +/* ---------------------------------------------------------------------------*/ + +struct steuerFelder +{ + unsigned int bytesIn; + unsigned int linesOut; + unsigned int blocksOut; + + unsigned char *encBuffer; + unsigned long indexEncBuffer; + + unsigned int rleCount; + unsigned short lastByte; + + unsigned char *blockBuffer; + unsigned long indexBlockBuffer; + + unsigned char *pageOut; + unsigned long indexPageOut; + + unsigned char *lineBuffer; /* AENDERUNG 2 Zeilen hinzugefuegt */ + unsigned long indexLineBuffer; + +}; + + +struct steuerFelder stFeld[4] = { + {0, 0, 0, NULL, 0, 0, 0, NULL, 0, NULL, 0, NULL, 0}, /* AENDERUNG 2 Werte hinzugefuegt */ + {0, 0, 0, NULL, 0, 0, 0, NULL, 0, NULL, 0, NULL, 0}, + {0, 0, 0, NULL, 0, 0, 0, NULL, 0, NULL, 0, NULL, 0}, + {0, 0, 0, NULL, 0, 0, 0, NULL, 0, NULL, 0, NULL, 0} +}; + + + +/* ---------------------------------------------------------------------- + + Procedure Devision ;-) + + ----------------------------------------------------------------------*/ + + +void +Help (void) +{ + int ho; + + fprintf (stderr, + "\nm2300w Version 0.1_1 (2004-05-19), Copyright (C) 2004 Leif Birkenfeld\n" + "This Software comes with ABSOLUTELY NO WARRANTY\n" + "This is free software, and you are welcome to redistribute it under certain conditions.\n" + "See COPYING file for further information !\n\n" + "Usage: foo22300w -i xxxxx.pbm -o xxxxx.prn -c x\n" + "\n" + "Options:\n" + "-i inFile Filename to read from \n" + " Use \"-\" to read from stdin\n"); + fprintf (stderr, + "-o outfile Filename to write into file\n" + " Use \"-\" to write to stdout\n" + " (Using stdout sets -v 0)\n" + "-c mode B/W or Color Mode [no default]\n" + " 1 - Black and White\n" + " 2 - Color\n" + "-m media Media code: [%d]\n", MediaCode); + for (ho = 0; ho < 6; ho++) { + fprintf (stderr, + " %2d - %s\n", ho, med[ho].desc); + } + fprintf (stderr, "-p paper Paper code: [%d]\n", PaperCode); + + for (ho = 0; ho < 42; ho++) { + if (form[ho].resX != 0) { + fprintf (stderr, + " %2d - %s\n", ho, form[ho].desc); + } + } + + fprintf (stderr, + "-r x Resolution mode: [%d]\n" + " 1 - 600x600 dpi\n" + " 2 - 1200x600 dpi\n" + " 3 - 2400x600 dpi\n" + "-s Save Toner\n" + " Discards every second pixel in a\n", + ResXmul); + fprintf (stderr, + " chequerboard order to save 50 percent toner\n" + " It works fine for text and graphic, but\n" + " it dosn't for photos.\n" + "-v x Verbose level [%d]\n" + " Please write as first Option \n" + " More than 5 will be extrem !\n", + verb); + + exit (1); + + +} + +void +writeOut (FILE * ziel, void *vquelle, long length) +{ + int oByte; + char *quelle = vquelle; + + for (oByte = 0; oByte < length; oByte++) { + fputc (quelle[oByte], ziel); + } +} + +void +encodeToBlockBuffer (int colorID) +{ + int debu,z; + long rohBytes = stFeld[colorID].indexEncBuffer - stFeld[colorID].rleCount; + int rohByteCount = 0; + unsigned char rleOut[2]; + int rle64, rle1; + + if (verb > 5) + fprintf (stderr, + "--> Ausgabe von %.3i Bytes fuer colorID %i davon %.3i Rohbytes und %.3i mal %.2x RLE encoded am Ende.\n", + (int) stFeld[colorID].indexEncBuffer, (int) colorID, + (int) rohBytes, (int) stFeld[colorID].rleCount, + stFeld[colorID].lastByte); + if (verb > 5) { + int debu; + fprintf (stderr, "Daten fuer Encoder:\n"); + for (debu = 0; debu < stFeld[colorID].indexEncBuffer; debu++) { + fprintf (stderr, " %.2x", stFeld[colorID].encBuffer[debu]); + } + fprintf (stderr, "\n"); + } + /* rohbytes verarbeiten */ + /* 64er stufe */ + while ((rohBytes - (rohByteCount * 64)) >= 64) { + unsigned char rBOut[65]; + if (verb > 5) + fprintf (stderr, "Segment mit 64 Bytes ausgeben ..."); + /* header belegen (standardwert) */ + rBOut[0] = (char) (64 - 1); + memcpy (&rBOut[1], &stFeld[colorID].encBuffer[(rohByteCount * 64)], + 64); + memcpy (&stFeld[colorID]. + blockBuffer[stFeld[colorID].indexBlockBuffer], &rBOut[0], 65); + stFeld[colorID].indexBlockBuffer += 65; + rohByteCount++; + if (verb > 5) + fprintf (stderr, "OK\n"); + + if (verb > 5) { + fprintf (stderr, "Rohbytes:\n"); + for (debu = 0; debu < (65); debu++) { + fprintf (stderr, " %.2x", rBOut[debu]); + } + fprintf (stderr, "\n"); + } + + + } + if ((rohBytes - (rohByteCount * 64)) > 0) { + /* XXX */ + /* unsigned char rBOut[rohBytes - (64 * rohByteCount) + 1]; */ + unsigned char *rBOut = malloc(rohBytes - (64 * rohByteCount) + 1); + + /* einzelstufe */ + if (verb > 5) + fprintf (stderr, "Segment mit %i Bytes ausgeben ...", + (int) (rohBytes - (64 * rohByteCount))); + + /* header belegen */ + rBOut[0] = (char) ((rohBytes - (64 * rohByteCount)) - 1); + memcpy (&rBOut[1], &stFeld[colorID].encBuffer[(rohByteCount * 64)], + (rohBytes - (64 * rohByteCount))); + memcpy (&stFeld[colorID]. + blockBuffer[stFeld[colorID].indexBlockBuffer], &rBOut[0], + (rohBytes + 1 - (64 * rohByteCount))); + stFeld[colorID].indexBlockBuffer += + (rohBytes - (64 * rohByteCount) + 1); + if (verb > 5) + fprintf (stderr, "OK\n"); + + if (verb > 5) { + fprintf (stderr, "Rohbytes:\n"); + for (debu = 0; debu < (rohBytes - (64 * rohByteCount)); debu++) { + fprintf (stderr, " %.2x", rBOut[debu]); + } + fprintf (stderr, "\n"); + } + + /* XXX */ + free(rBOut); + } + + /* rle verarbeiten */ + + rle64 = floor ((double) (stFeld[colorID].rleCount) / 64); + rle1 = (stFeld[colorID].rleCount) - (rle64 * 64); + + if (rle64 > 63) { /* AENDERUNG hinzu */ + rleOut[0] = 224; + rleOut[1] = stFeld[colorID].lastByte; + for (z = 0; z < 2; z++) { + memcpy (&stFeld[colorID]. + blockBuffer[stFeld[colorID].indexBlockBuffer], &rleOut[0], 2); + stFeld[colorID].indexBlockBuffer += 2; + if (verb > 5) + fprintf (stderr, + "---->64er RLE Encoding: 2048 mal %.2x - codiert als: %.2x%.2x\n", + rleOut[1], rleOut[0], rleOut[1]); + if (verb > 5) { + fprintf (stderr, "64er RLE::\n"); + for (debu = 0; debu < (2); debu++) { + fprintf (stderr, " %.2x", rleOut[debu]); + } + fprintf (stderr, "\n"); + } + } + rle64 -= 64; + } + + if (rle64 > 0) { + rleOut[0] = 192 + rle64; + rleOut[1] = stFeld[colorID].lastByte; + memcpy (&stFeld[colorID]. + blockBuffer[stFeld[colorID].indexBlockBuffer], &rleOut[0], 2); + stFeld[colorID].indexBlockBuffer += 2; + + if (verb > 5) + fprintf (stderr, + "---->64er RLE Encoding: %i mal %.2x - codiert als: %.2x%.2x\n", + rle64, rleOut[1], rleOut[0], rleOut[1]); + if (verb > 5) { + fprintf (stderr, "64er RLE::\n"); + for (debu = 0; debu < (2); debu++) { + fprintf (stderr, " %.2x", rleOut[debu]); + } + fprintf (stderr, "\n"); + } + + + + } + if (rle1 > 0) { + rleOut[0] = 128 + rle1; + rleOut[1] = stFeld[colorID].lastByte; + memcpy (&stFeld[colorID]. + blockBuffer[stFeld[colorID].indexBlockBuffer], &rleOut[0], 2); + stFeld[colorID].indexBlockBuffer += 2; + if (verb > 5) + fprintf (stderr, + "---->1er RLE Encoding: %i mal %.2x - codiert als: %.2x%.2x\n", + rle1, rleOut[1], rleOut[0], rleOut[1]); + + if (verb > 5) { + fprintf (stderr, " 1er RLE::\n"); + for (debu = 0; debu < (2); debu++) { + fprintf (stderr, " %.2x", rleOut[debu]); + } + fprintf (stderr, "\n"); + } + + } + + + if (verb > 5) + fprintf (stderr, "--->RLE Encode for %i done.\n", colorID); + stFeld[colorID].indexEncBuffer = 0; +} + +void +doEncode (int inByte, int colorID) +{ + if (stFeld[colorID].bytesIn == 0) { + unsigned char dummyTable[1] = { 0x80 }; + stFeld[colorID].linesOut++; + /* jede Zeile beginnt mit einer Tabelle */ + /* die tabellenkompression wurde vorerst weggelassen deshalb eine leere tabelle */ + if (verb > 5) + fprintf (stderr, "Dummy Tabelle fuer neue Zeile %3i ausgeben .\n", + stFeld[colorID].linesOut); + memcpy (&stFeld[colorID]. + blockBuffer[stFeld[colorID].indexBlockBuffer], &dummyTable[0], + 1); + stFeld[colorID].indexBlockBuffer += 1; + + } + if (saveToner > 0) { + /* spar Toner indem es jedes 2te bit loescht. */ + /* die loeschung erfolgt pro zeile versetzt (schachbrettmuster) */ + if ((stFeld[colorID].bytesIn + 1) > (resBreite / 8)) { /* AENDERUNG */ + if (verb > 0) { + /* zaehlen der gesparten pixel */ + pix[colorID][2] += + ((inByte) & 0x01) + ((inByte >> 2) & 0x01) + + ((inByte >> 4) & 0x01) + ((inByte >> 6) & 0x01); + } + inByte = inByte & 0xaa; + } + else { + if (verb > 0) { + pix[colorID][2] += + ((inByte >> 1) & 0x01) + ((inByte >> 3) & 0x01) + + ((inByte >> 5) & 0x01) + ((inByte >> 7) & 0x01); + } + inByte = inByte & 0x55; + } + } + + if (inByte == stFeld[colorID].lastByte || stFeld[colorID].rleCount < 1) { + stFeld[colorID].rleCount++; /* zaehlen wie oft ein byte wiederholt wird */ + } + else { + if (stFeld[colorID].rleCount > 3) { /* rle ausgabe lohnt sich, deshalb ausgeben */ + encodeToBlockBuffer (colorID); + /* wenn sich das ausgeben nicht lohnt, werden die aufgelaufenen rles verworfen und als normale bytes gewertet */ + } + stFeld[colorID].rleCount = 0; + } + stFeld[colorID].lastByte = inByte; + + stFeld[colorID].bytesIn++; /* EingabeByte hochzaehlen und byyte auf den buffer legen */ + stFeld[colorID].encBuffer[stFeld[colorID].indexEncBuffer] = inByte; + stFeld[colorID].indexEncBuffer++; + + + if ((stFeld[colorID].bytesIn + 1) > (2 * (resBreite / 8))) { /* AENDERUNG 2* */ + /* eine zeile ist voll. den rest im buffer codieren */ + + encodeToBlockBuffer (colorID); + stFeld[colorID].bytesIn = 0; + stFeld[colorID].rleCount = 0; + /* wenn die anzahl der zeilen f|r einen block erreicht ist muss der blockheader generiert werden */ + /* dies kann erst jetzt geschehen, da die anzahl der im block befindlichen bytes im header steht */ + if (stFeld[colorID].linesOut >= (linesPerBlock / 2)) { /* AENDERUNG /2 */ + int psr; + stFeld[colorID].blocksOut++; + if (verb > 4) + fprintf (stderr, + "Blockheader fuer Block %i mit %5i Bytes generieren und Block raus kopieren...\n", + (int) stFeld[colorID].blocksOut, + (int) stFeld[colorID].indexBlockBuffer); + blockHeaderStc.blockLength1 = + (char) stFeld[colorID].indexBlockBuffer; + blockHeaderStc.blockLength2 = + (char) (stFeld[colorID].indexBlockBuffer >> 8); + blockHeaderStc.blockLength3 = + (char) (stFeld[colorID].indexBlockBuffer >> 16); + blockHeaderStc.blockLength4 = + (char) (stFeld[colorID].indexBlockBuffer >> 24); + blockHeaderStc.linesPerBlock1 = (char) (linesPerBlock); + blockHeaderStc.linesPerBlock2 = (char) (linesPerBlock >> 8); + /* die berechnung der headerCount muss sicherstellen das die reichenfolge stimmt */ + if (thisSiteColorMode == 0xf0) { + blockHeaderStc.headerCount = + siteInitHeaderCount + stFeld[colorID].blocksOut - 1 + + ((3 - colorID) * 8); + } + else { + blockHeaderStc.headerCount = + siteInitHeaderCount + stFeld[colorID].blocksOut - 1; + } + headerCount++; + if (verb > 4) + fprintf (stderr, + "BlockHeader.headerCount fuer colorID %i ist %i\n", + colorID, blockHeaderStc.headerCount); + blockHeaderStc.blockCount = stFeld[colorID].blocksOut; + blockHeaderStc.tonerColor = colorID; + + /* pruefsumme berechnen */ + blockHeaderStc.prSum = 0; + for (psr = 0; psr < 14; psr++) { + blockHeaderStc.prSum += blockHeader[psr]; + + } + memcpy (&stFeld[colorID].pageOut[stFeld[colorID].indexPageOut], + blockHeader, 15); + stFeld[colorID].indexPageOut += 15; + + if (verb > 4) { + int vR; + fprintf (stderr, "Blockheader: "); + for (vR = 0; vR < 15; vR++) { + fprintf (stderr, " %.2x", blockHeader[vR]); + } + fprintf (stderr, "\n"); + } + + + memcpy (&stFeld[colorID].pageOut[stFeld[colorID].indexPageOut], + &stFeld[colorID].blockBuffer[0], + stFeld[colorID].indexBlockBuffer); + stFeld[colorID].indexPageOut += stFeld[colorID].indexBlockBuffer; + + stFeld[colorID].linesOut = 0; + stFeld[colorID].indexBlockBuffer = 0; + } + + } + + +} + +void +prepDoEncode(int inByte, int colorID) /* AENDERUNG hinzu */ +{ + stFeld[colorID].lineBuffer[stFeld[colorID].indexLineBuffer] = inByte; + stFeld[colorID].indexLineBuffer += 1; + + if (stFeld[colorID].indexLineBuffer == (resBreite / 4)) { + int z; + for (z = 0; z < (resBreite / 8); z++) { + doEncode (stFeld[colorID].lineBuffer[z], colorID); + doEncode (stFeld[colorID].lineBuffer[z + (resBreite / 8)], colorID); + } + stFeld[colorID].indexLineBuffer = 0; + } + +} + +void +clearBuffer (int i) +{ +/* initialisiert die stucktur[i] */ + stFeld[i].bytesIn = 0; + stFeld[i].linesOut = 0; + stFeld[i].blocksOut = 0; + stFeld[i].indexEncBuffer = 0; + stFeld[i].rleCount = 0; + stFeld[i].lastByte = 0; + stFeld[i].indexBlockBuffer = 0; + stFeld[i].indexPageOut = 0; + stFeld[i].indexLineBuffer = 0; /* AENDERUNG Zeile hinzugefuegt */ +} + +void +writeJobHeader (void) +{ + long psr; + + writeOut (out_stream, &fileHeader[0], 9); + headerCount++; + + for (psr = 0; psr < 14; psr++) { + jobHeaderStc.prSum += jobHeader[psr]; + } + + writeOut (out_stream, &jobHeader[0], 15); + headerCount++; + if (verb > 1) + fprintf (stderr, "JobHeader written.\n"); +} + +void +writeSiteHeader (void) +{ + long psr; + + /* seitenHeader ausgeben */ + seitenHeaderStc.headerCount = reservedHeaderCountSH; + seitenHeaderStc.breite1 = (unsigned char) resBreite; + seitenHeaderStc.breite2 = (unsigned char) (resBreite >> 8); + seitenHeaderStc.hoehe1 = (unsigned char) resHoehe; + seitenHeaderStc.hoehe2 = (unsigned char) (resHoehe >> 8); + seitenHeaderStc.colorMode = thisSiteColorMode; + seitenHeaderStc.blocksPerPage1 = thisSiteBlocksPerPage; + seitenHeaderStc.blocksPerPage2 = thisSiteBlocksPerPage; + + seitenHeaderStc.paperFormat = PaperCode; + seitenHeaderStc.paperQuality = MediaCode; + + /* pruefsumme berechnen */ + seitenHeaderStc.prSum = 0x00; + for (psr = 0; psr < 34; psr++) { + seitenHeaderStc.prSum += seitenHeader[psr]; + } + writeOut (out_stream, &seitenHeader[0], 35); + + if (verb > 4) { + int vR; + fprintf (stderr, "Seitenheader: "); + for (vR = 0; vR < 35; vR++) { + fprintf (stderr, " %.2x", seitenHeader[vR]); + } + fprintf (stderr, "\n"); + } + +} + + +void +readPkmraw (void) /* AENDERUNG prepDoEncode statt doEncode */ +{ + + int c = 0; + + + int ccs = 0; + + /* die reichenfolge der farben in der eingabedatei ist verkehrt */ + /* die ausgabe erfolgt in der reihenfolge 3,2,1,0 */ + /* 3 - gelb , 2 - magenta , 1 - cyan , 0 - black */ + unsigned short colorKey[4] = { 1, 2, 3, 0 }; + + int readHeader; + char buffer[255]; + + + while ((fgets (buffer, 256, in_stream)) != NULL) { + int inpX = 0; + int inpY = 0; + int inpXBytes = 0; + unsigned char lastByteMask = 0; + + int shz, sbz; + int realLines, realPixBytes; + int leadLines, leadPixBytes; + int trailLines, trailPixBytes; + int xAdd, yAdd; + + if (verb > 2) { + fprintf (stderr, "gelesener Header: %s", buffer); + } + + /* grobe prueffung - geht eigentlich besser */ + if (buffer[0] != 'P' || buffer[1] != '4') { + if (verb > 0) { + fprintf (stderr, "Erwartet 'P4' but found >%s<\n", buffer); + } + exit (1); + } + + /* wenn die seite voll ist wird sie ausgegeben */ + /* eine blde art die farbseiten zu zaehlen - blocksperpage ist bei farbe 32 (was dann 4 farbseiten ergibt) */ + /* bei sw ist es 8, also nur eine farbseite */ + if (ccs >= (blocksPerPage / 8)) { + writeSiteHeader (); + if (verb > 1) + fprintf (stderr, "###Seitenheader geschrieben\n"); + + if (thisSiteColorMode == 0xf0) { + writeOut (out_stream, stFeld[3].pageOut, + stFeld[3].indexPageOut); + writeOut (out_stream, stFeld[2].pageOut, + stFeld[2].indexPageOut); + writeOut (out_stream, stFeld[1].pageOut, + stFeld[1].indexPageOut); + clearBuffer (1); + clearBuffer (2); + clearBuffer (3); + } + writeOut (out_stream, stFeld[0].pageOut, stFeld[0].indexPageOut); + clearBuffer (0); + + ccs = 0; + if (verb > 1) + fprintf (stderr, "###Seiteninhalt geschrieben\n"); + if (verb > 1) + fprintf (stderr, "Farbverteilung der Seite:\n" + "Yellow: %8d\n" + "Magenta: %8d\n" + "Cyan: %8d\n" + "Black: %8d\n" + , pix[0][0],pix[1][0],pix[2][0],pix[3][0]); + pix[0][0]=0; + pix[1][0]=0; + pix[2][0]=0; + pix[3][0]=0; + + + + } + /* vor der seite seitenheader nicht vergessen */ + if (ccs == 0) { + if (jobHeaderWritten != 1) { + writeJobHeader (); + jobHeaderWritten = 1; + } + reservedHeaderCountSH = headerCount++; + siteInitHeaderCount = headerCount; + thisSiteColorMode=colorMode; + thisSiteBlocksPerPage=blocksPerPage; + if (verb > 1) + fprintf (stderr, "Reservierter SeitenHeaderCount ist %2d\n", reservedHeaderCountSH ); + + } + if (verb > 1) + fprintf (stderr, "Beginne neue Farbe\n"); + + if(ccs>2) { + if(pix[0][0]==0 && pix[1][0]==0 && pix[2][0]==0) { + if (verb > 1) + fprintf (stderr, "--------------- Switch to Black and White !\n"); + + thisSiteColorMode=0x80; /* AENDERUNG 0x80 */ + thisSiteBlocksPerPage=0x08; + headerCount=headerCount-24; + siteInitHeaderCount = headerCount; + clearBuffer (1); + clearBuffer (2); + clearBuffer (3); + }else{ + if (verb > 1) + fprintf (stderr, "--------------- Seite bleibt in Farbe\n"); + } + + } + + /* weitere pbm header ueberlesen - koennte mann sptereigentlich auch auswerten */ + + for (readHeader = 0; readHeader < 1; readHeader++) { + if (fgets (buffer, 256, in_stream) != NULL) { + if (verb > 3) { + fprintf (stderr, "gelesener Header: %s", buffer); + } + if (buffer[0] == '#') { + if (verb > 3) + fprintf (stderr, "Zeile ist ein Kommentar und zaehlt nicht mit.\n"); /* diese Ausage muss noch geprueft werden ! */ + readHeader--; + } + else { + /* format auslesen */ + + inpX = atoi (strtok (buffer, " ")); + inpY = atoi (strtok (NULL, " ")); + inpXBytes = (int) ceil ((double) inpX / 8); + lastByteMask = 0xff << ((inpXBytes * 8) - inpX); + } + } + else { + if (verb > 0) { + fprintf (stderr, "Unexpected end of in-file !?\n"); + } + exit (1); + } + } + + + shz = 0; + sbz = 0; + /* hier werden jetzt die bytes gelesen */ + + realLines = 0; + realPixBytes = 0; + leadLines = 0; + leadPixBytes = 0; + trailLines = 0; + trailPixBytes = 0; + xAdd = 0; + yAdd = 0; + + if (resBreite <= inpX) { /* eingabe brreiter als druckbereich - clippen */ + realPixBytes = (resBreite / 8); + leadPixBytes = + (int) ceil (((double) inpXBytes - ((double) resBreite / 8)) / + 2); + trailPixBytes = + (int) floor (((double) inpXBytes - ((double) resBreite / 8)) / + 2); + if (verb > 5) + fprintf (stderr, + "Eingabeseite zu breit - clippe auf %i mit %i am Anfang und %i am Ende.\n", + realPixBytes, leadPixBytes, trailPixBytes); + } + else { /* hinzufuegen */ + realPixBytes = inpXBytes; + leadPixBytes = + (int) ceil ((((double) resBreite / 8) - (double) inpXBytes) / + 2); + trailPixBytes = + (int) floor ((((double) resBreite / 8) - (double) inpXBytes) / + 2); + xAdd = 1; + if (verb > 5) + fprintf (stderr, + "Eingabeseite zu schmal - addiere auf %i -> %i am Anfang und %i am Ende.\n", + realPixBytes, leadPixBytes, trailPixBytes); + } + + if (resHoehe <= inpY) { /* eingabe hoeher als druckbereich - clippen */ + realLines = resHoehe; + leadLines = + (int) ceil ((((double) inpY - (double) resHoehe) / 2)); + trailLines = + (int) floor ((((double) inpY - (double) resHoehe) / 2)); + if (verb > 5) + fprintf (stderr, + "Eingabeseite zu lang - clippe auf %i mit %i am Anfang und %i am Ende.\n", + realLines, leadLines, trailLines); + } + else { /* hinzufuegen */ + realLines = inpY; + leadLines = + (int) ceil ((((double) resHoehe - (double) inpY) / 2)); + trailLines = + (int) floor ((((double) resHoehe - (double) inpY) / 2)); + yAdd = 1; + if (verb > 5) + fprintf (stderr, + "Eingabeseite zu kurz - addiere auf %i -> %i am Anfang und %i am Ende.\n", + realLines, leadLines, trailLines); + } + + if (yAdd == 0) { + if (verb > 5) + fprintf (stderr, + "ueberlese %i zeilen mit je %i bytes am Anfang\n", + leadLines, inpXBytes); + for (shz = 0; shz < leadLines; shz++) { /* vorschleife fuer zu ueberlesende hohenzeilen */ + for (sbz = 0; sbz < inpXBytes; sbz++) { + if ((c = fgetc (in_stream)) != EOF) { + /* verwerfe das byte */ + } + else { + if (verb > 0) { + fprintf (stderr, "\nUps, unerwartetes Ende\n"); + } + exit (1); + } + } + } + + } + else { + if (verb > 5) + fprintf (stderr, + "erzeuge %i zeilen mit je %i bytes (0x00) am Anfang\n", + leadLines, (resBreite / 8)); + for (shz = 0; shz < leadLines; shz++) { /* vorschleife fuer fehlende hohenzeilen */ + for (sbz = 0; sbz < (resBreite / 8); sbz++) { + if (colorMode == 0xf0) { + prepDoEncode (0x00, colorKey[ccs]); + } + else { + prepDoEncode (0x00, colorKey[3]); + } + } + } + } + + for (shz = 0; shz < realLines; shz++) { + if (xAdd == 0) { + if (verb > 5) + fprintf (stderr, + "ueberlese %i bytes der Zeile am Anfang\n", + leadPixBytes); + for (sbz = 0; sbz < leadPixBytes; sbz++) { /* vorschleife fuer zu ueberlesende breiten pixel */ + if ((c = fgetc (in_stream)) != EOF) { + /* verwerfe das byte */ + } + else { + if (verb > 0) { + fprintf (stderr, "\nUps, unexpected End\n"); + } + exit (1); + } + } + } + else { + if (verb > 5) + fprintf (stderr, "erzeuge %i bytes mit 0x00 am Anfang\n", + leadPixBytes); + for (sbz = 0; sbz < leadPixBytes; sbz++) { + if (colorMode == 0xf0) { + prepDoEncode (0x00, colorKey[ccs]); + } + else { + prepDoEncode (0x00, colorKey[3]); + } + } + + } + + if (verb > 5) + fprintf (stderr, "verabreite normal %i bytes\n", + realPixBytes); + for (sbz = 0; sbz < realPixBytes; sbz++) { + if ((c = fgetc (in_stream)) != EOF) { + if ((sbz + 1) == realPixBytes) { + if (verb > 6) + fprintf (stderr, + "letzes Byte maskieren mit %.2x - aus %.2x wird ", + lastByteMask, c); + c = c & lastByteMask; /* das letzte byte muss bei ungeraden und zu kleinen eingaben maskiert werden */ + if (verb > 6) + fprintf (stderr, "%.2x\n", c); + } + if (colorMode == 0xf0) { + /* hier die pixel zaehlen um s/w seiten zu erkennen */ + if (c & 0x80) + pix[ccs][0]++; + if (c & 0x40) + pix[ccs][0]++; + if (c & 0x20) + pix[ccs][0]++; + if (c & 0x10) + pix[ccs][0]++; + if (c & 0x08) + pix[ccs][0]++; + if (c & 0x04) + pix[ccs][0]++; + if (c & 0x02) + pix[ccs][0]++; + if (c & 0x01) + pix[ccs][0]++; + prepDoEncode (c, colorKey[ccs]); + } + else { + prepDoEncode (c, colorKey[3]); + } + } + else { + if (verb > 0) { + fprintf (stderr, "\nUps, unexpected End\n"); + } + exit (1); + } + + } + + if (xAdd == 0) { + if (verb > 5) + fprintf (stderr, "ueberlese %i bytes der Zeile am Ende\n", + trailPixBytes); + for (sbz = 0; sbz < trailPixBytes; sbz++) { /* vorschleife fuer zu ueberlesende breiten pixel */ + if ((c = fgetc (in_stream)) != EOF) { + /* verwerfe das byte */ + } + else { + if (verb > 5) { + fprintf (stderr, "\nUps, unexpected End\n"); + } + exit (1); + } + } + } + else { + if (verb > 5) + fprintf (stderr, "erzeuge %i bytes mit 0x00 am Ende\n", + trailPixBytes); + for (sbz = 0; sbz < trailPixBytes; sbz++) { + if (colorMode == 0xf0) { + prepDoEncode (0x00, colorKey[ccs]); + } + else { + prepDoEncode (0x00, colorKey[3]); + } + } + + } + + } + + if (yAdd == 0) { + if (verb > 5) + fprintf (stderr, + "ueberlese %i zeilen mit je %i bytes am Ende\n", + trailLines, inpXBytes); + for (shz = 0; shz < trailLines; shz++) { /* endschleife fuer zu ueberlesende hohenzeilen */ + for (sbz = 0; sbz < inpXBytes; sbz++) { + if ((c = fgetc (in_stream)) != EOF) { + /* verwerfe das byte */ + } + else { + if (verb > 0) { + fprintf (stderr, "\nUps, unexpected End\n"); + } + exit (1); + } + } + } + + } + else { + if (verb > 5) + fprintf (stderr, + "erzeuge %i zeilen mit je %i bytes (0x00) am Ende\n", + trailLines, (resBreite / 8)); + for (shz = 0; shz < trailLines; shz++) { /* endschleife fuer fehlende hohenzeilen */ + for (sbz = 0; sbz < (resBreite / 8); sbz++) { + if (colorMode == 0xf0) { + prepDoEncode (c, colorKey[ccs]); + } + else { + prepDoEncode (c, colorKey[3]); + } + } + } + } + + + ccs++; + } + writeSiteHeader (); + if (verb > 1) + fprintf (stderr, "###Seitenheader geschrieben\n"); + + if (thisSiteColorMode == 0xf0) { + writeOut (out_stream, stFeld[3].pageOut, stFeld[3].indexPageOut); + writeOut (out_stream, stFeld[2].pageOut, stFeld[2].indexPageOut); + writeOut (out_stream, stFeld[1].pageOut, stFeld[1].indexPageOut); + } + writeOut (out_stream, stFeld[0].pageOut, stFeld[0].indexPageOut); + if (verb > 1) + fprintf (stderr, "###Seiteninhalt geschrieben\n"); + + if (verb > 1) + fprintf (stderr, "Farbverteilung der Seite:\n" + "Yellow: %8d\n" + "Magenta: %8d\n" + "Cyan: %8d\n" + "Black: %8d\n" + , pix[0][0],pix[1][0],pix[2][0],pix[3][0]); + + pix[0][0]=0; + pix[1][0]=0; + pix[2][0]=0; + pix[3][0]=0; + +} + + +int +main (int argc, char *argv[]) +{ + extern char *optarg; + char *inFile = NULL; + char *outFile = NULL; + int option; + int encBufferSize; + int blockBufferSize; + int pageOutSize; + int lineBufferSize; /* AENDERUNG hinzu */ + long psr; + +/* 1. parameter lesen */ + + while ((option = getopt (argc, argv, "v:hi:o:c:m:p:r:s")) >= 0) + switch (option) { + case 'h': + Help (); + return (0); + case 'i': + inFile = optarg; + break; + case 'o': + outFile = optarg; + if (strcmp (outFile, "-") == 0) + verb = 0; + break; + case 'c': + if (optarg[0] == '1') { + blocksPerPage = 0x08; + colorMode = 0x80; /* AENDERUNG 0x80 */ + } + else if (optarg[0] == '2') { + blocksPerPage = 0x20; + colorMode = 0xf0; + } + else { + if (verb > 0) + fprintf (stderr, "Wrong color Mode %s\n", optarg); + exit (1); + } + break; + case 'm': + MediaCode = atoi (optarg); + if (MediaCode > 6) { + if (verb > 0) + fprintf (stderr, "Wrong Media Code %d\n", MediaCode); + exit (1); + } + break; + case 'p': + PaperCode = atoi (optarg); + if (PaperCode > 41 || form[PaperCode].resX == 0) { + if (verb > 0) + fprintf (stderr, "Wrong Paper Code %d\n", PaperCode); + exit (1); + } + break; + case 'r': + ResXmul = atoi (optarg); + if (ResXmul == 1) { + if (verb > 1) + fprintf (stderr, "Aufloesung 600dpi\n"); + jobHeaderStc.res1 = 0x01; + jobHeaderStc.res2 = 0x00; /* AENDERUNG 0x00 */ + } + else if (ResXmul == 2) { + if (verb > 1) + fprintf (stderr, "Aufloesung 1200dpi\n"); + jobHeaderStc.res1 = 0x01; /* AENDERUNG 0x01 */ + jobHeaderStc.res2 = 0x01; /* AENDERUNG 0x01 */ + } + else if (ResXmul == 3) { /* AENDERUNG hinzu */ + if (verb > 1) + fprintf (stderr, "Aufloesung 2400dpi\n"); + jobHeaderStc.res1 = 0x01; + jobHeaderStc.res2 = 0x02; + ResXmul = 4; + } + else { + if (verb > 0) + fprintf (stderr, "Wrong Resolutin Mode !\n"); + exit (1); + } + break; + + case 'v': + verb = atoi (optarg); + /* commended out, since this disables debugging + -gfuer + if (outFile != NULL && strcmp (outFile, "-") == 0) + verb = 0; + */ + break; + case 's': + saveToner = 1; + break; + +/* case 'u' : //ucr ist now done by crd + useUCR=1; + break; +*/ + case '?': + Help (); + return (1); + } + if (inFile == NULL || outFile == NULL) { + Help (); + return (1); + } +/* 2. dateien oeffnen */ + + if (strcmp (inFile, "-") == 0) { + in_stream = stdin; + } + else { + if ((in_stream = fopen (inFile, "r")) == NULL) { + if (verb > 0) { + printf ("Fehler beim oeffnen der Eingabedatei\n"); + } + perror (""); + exit (1); + } + } + if (strcmp (outFile, "-") == 0) { + out_stream = stdout; + } + else { + if ((out_stream = fopen (outFile, "w")) == NULL) { + if (verb > 0) { + printf ("Fehler beim oeffnen der Zieldatei\n"); + } + perror (""); + exit (1); + } + } + + + + /* werte vorbereiten */ + resBreite = form[PaperCode].resX * ResXmul; + resHoehe = form[PaperCode].resY * ResYmul; + linesPerBlock = (form[PaperCode].resY / 8); + + + + /* speicher reservieren */ + + encBufferSize = (2 * (resBreite / 8)) + 150; /* enthaelt im allgemeinen nur eine zeile (kleine zugabe die gleichzeitig die header abdeckt ;-) */ /* AENDERUNG 2* */ + blockBufferSize = ((resBreite / 8) + 150) * linesPerBlock; /* einhaelt die zeilen mal anzahl zeilen pro block */ + pageOutSize = blockBufferSize * 8; /* enthaelt 8 bloecke */ + lineBufferSize = encBufferSize; /* AENDERUNG hinzu */ + + stFeld[0].encBuffer = malloc (encBufferSize); + stFeld[0].blockBuffer = malloc (blockBufferSize); + stFeld[0].pageOut = malloc (pageOutSize); + stFeld[0].lineBuffer = malloc (lineBufferSize); /* AENDERUNG hinzu */ + + if (colorMode == 0xf0) { + + stFeld[1].encBuffer = malloc (encBufferSize); + stFeld[1].blockBuffer = malloc (blockBufferSize); + stFeld[1].pageOut = malloc (pageOutSize); + stFeld[1].lineBuffer = malloc (lineBufferSize); /* AENDERUNG hinzu */ + + stFeld[2].encBuffer = malloc (encBufferSize); + stFeld[2].blockBuffer = malloc (blockBufferSize); + stFeld[2].pageOut = malloc (pageOutSize); + stFeld[2].lineBuffer = malloc (lineBufferSize); /* AENDERUNG hinzu */ + + stFeld[3].encBuffer = malloc (encBufferSize); + stFeld[3].blockBuffer = malloc (blockBufferSize); + stFeld[3].pageOut = malloc (pageOutSize); + stFeld[3].lineBuffer = malloc (lineBufferSize); /* AENDERUNG hinzu */ + } + + + + + + readPkmraw (); + /* readBit(); */ + + if (jobHeaderWritten == 1) { + /* footer ausgeben */ + jobFooterStc.headerCount = headerCount++; + /* pruefsumme berechnen */ + for (psr = 0; psr < 7; psr++) { + jobFooterStc.prSum += jobFooter[psr]; + } + writeOut (out_stream, &jobFooter[0], 8); + + fileFooterStc.headerCount = headerCount++; + /* pruefsumme berechnen */ + for (psr = 0; psr < 7; psr++) { + fileFooterStc.prSum += fileFooter[psr]; + } + writeOut (out_stream, &fileFooter[0], 8); + if (verb > 1) + fprintf (stderr, "JobFooter written.\n"); + } + + if (colorMode == 0xf0) { + free (stFeld[3].encBuffer); /* AENDERUNG 3 statt 0 */ + free (stFeld[3].blockBuffer); + free (stFeld[3].pageOut); + free (stFeld[3].lineBuffer); /* AENDERUNG hinzu */ + + free (stFeld[1].encBuffer); + free (stFeld[1].blockBuffer); + free (stFeld[1].pageOut); + free (stFeld[1].lineBuffer); /* AENDERUNG hinzu */ + + free (stFeld[2].encBuffer); + free (stFeld[2].blockBuffer); + free (stFeld[2].pageOut); + free (stFeld[2].lineBuffer); /* AENDERUNG hinzu */ + } + free (stFeld[0].encBuffer); /* AENDERUNG 0 statt 3 */ + free (stFeld[0].blockBuffer); + free (stFeld[0].pageOut); + free (stFeld[0].lineBuffer); /* AENDERUNG hinzu */ + + fclose (in_stream); + fclose (out_stream); + return (0); + +} |