/*************************************************************************
**                          CPrint V1.23                                **
**                                                                      **
**                          Alexander Holler                            **
**                          Ifflandstr.13                               **
**                          6800 Mannheim 1                             **
**                                                                      **
**          Benutzung nur für nichtkommerzielle Zwecke erlaubt !        **
**          (Beispielprogramm für Druckerapplikationen)                 **
*************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <exec/types.h>
#include <functions.h>

#include <devices/printer.h>
#include <devices/prtbase.h>

#define TABL 8                      /* Tabulatorlänge */
#define FF 12                       /* Form Feed */

char CONDENSED [5] = { 27,'[','4','w','\0' };
char INIT      [4] = { 27,'#','1','\0' };

FILE *text,*drucker;
char *speicher=0;

main(argc,argv)
int argc;
char *argv[];
{
struct IODRPReq PReq;
struct PrinterData *PD;
register int i,j,k;
int achtu,tabla,zeilen,stringl,spalten,cl;
char ch;

    if(argc<2||!strcmp(argv[1],"?")||argc>3)
        ende(1);
    if (!OpenDevice("printer.device", 0L,(struct IORequest *)&PReq, 0L)) {
        PD = (struct PrinterData *)PReq.io_Device;
        switch(PD->pd_Preferences.PrintPitch) {
            case ELITE: spalten=160;break;
            case PICA:  spalten=137;break;
            case FINE:  spalten=200;break;
            default: spalten=160;break;
        }
        zeilen=PD->pd_Preferences.PaperLength;
        CloseDevice((struct IORequest *)&PReq);
    }
    else
        ende(2);
    if(spalten==200)
       ende(3);
    stringl=spalten/2+1;
    if(argc==3) {
      tabla=atoi(argv[2]);
      if (tabla>stringl-1)
          ende(4);
    }
    else
        tabla=TABL;
    if(!(speicher=malloc(zeilen*2*stringl)))
        ende(5);
    if(!(text=fopen(argv[1],"r")))
        ende(6);
    if(!(drucker=fopen("prt:","w")))
        ende(7);
    if(fputs(INIT,drucker))
        ende(8);
    if(fputs(CONDENSED,drucker))
        ende(8);
    while(!feof(text)) {
        for(i=achtu=0;i<zeilen*2 && !feof(text);i++) {   /* Seite einlesen */
            for(j=0;j<stringl-1;j++) {                    /* Zeile einlesen */
                ch = (char)fgetc(text);
                if (achtu && ch == '\n')
                    ch = (char)fgetc(text);
                achtu=0;
                if(ch==EOF || ch=='\n')
                    break;
                else {     /* Tab ersetzen */
                    if(ch=='\t') {      /* Tab ersetzen */
                        if(j<stringl-1)
                            speicher[i*stringl+(j++)]=' ';
                        for(;j%tabla && j<stringl-1;j++)
                            speicher[i*stringl+j]=' ';
                        j--;
                     }
                     else
                        if(ch==FF)   /* Form Feed */
                            break;
                        else
                            speicher[i*stringl+j]=ch;
                }
            }
            speicher[i*stringl+j]='\0';
            if(ch==FF)
                for(i++;i%zeilen;i++)
                    speicher[i*stringl]='\0';
            else
                if(j==stringl-1 && ch !='\n')
                    achtu=1;
                else
                    achtu=0;
        }
        j=i/2;
        for(i=0;i<j;i++) {
            if(fputs(speicher+i*stringl,drucker))
                ende(8);
            if((cl=strlen(speicher+i*stringl))<stringl-1)
            for(k=0;k<stringl-1-cl;k++)
                if(fputc(' ',drucker)!=' ')
                    ende(8);
            if(fputs(speicher+(j+i)*stringl,drucker))
                ende(8);
            if(fputc('\n',drucker)!='\n')
                ende(8);
        }
        if(fputc('\n',drucker)!='\n')
            ende(8);
        if(!feof(text))
            if(fputc(FF,drucker)!=FF)
                ende(8);
    }
    ende(0);
}


ende(fnr)
int fnr;
{
    switch(fnr) {
        case 1:
            puts("\nCPrint V1.23");
            puts("\nProgrammiert von Alexander Holler");
            puts("Benutzung für nichtkommerzielle Zwecke erlaubt (PD) !");
            puts("\nAufruf: CPrint Filename [Tabulatorlänge]");
            puts("Die Tabulatorlänge ist auf 8 voreingestellt\n");
            break;
        case 2:
            puts("Kann printer.device nicht öffnen !");
            break;
        case 3:
        puts("Einstellung FINE in den Preferences noch nicht unterstützt !");
            break;
        case 4:
            puts("Tabulatorlänge zu groß !");
            break;
        case 5:
            puts("Zu wenig Speicher !");
            break;
        case 6:
            puts("File nicht gefunden !");
            break;
        case 7:
            puts("Fehler beim Öffnen der Druckerschnittstelle !");
            break;
        case 8:
            puts("Irgend etwas stimmt mit dem Drucker nicht !");
            break;
        default:
            break;
    }
    if(drucker) {
        fputs(INIT,drucker);
        fclose(drucker);
    }
    if(text)
        fclose(text);
    if(speicher)
        free(speicher);
    exit(fnr);
}

