/* printppm
 * This program converts a ppm-file and prints the result on a
 * Mitsubishi Videoprinter
 *
 * Source-code and executable are ©'93 by
 *           Stephan Feinen
 *           Im Steinfeld 1
 *           52076 Aachen
 *           Germany
 *
 * Please send comments, criticism and suggestions to:
 *           feinen@pool.informatik.rwth-aachen.de
 *
*/

#include <stdio.h>
#include <exec/exec.h>
#include <libraries/dos.h>
#define VERSION "1.2"
typedef unsigned char   char_type;
typedef struct FileInfoBlock   FileInfoBlock;
char_type magic_header[] = {"\100\066"};
  APTR    Lock(),Open(),AllocMem(),FreeMem();
  ULONG   Examine();
  UBYTE   para,col[3],pos;
  char    width[5],height[5],dummy,dum[3];
  char    *aktuell,*adr;
  FILE    *source,*dest;
  int     j,z,i;
  ULONG   laenge,length;
  APTR    MyLock;
  FileInfoBlock MyInfo;
  int     nomagic = 0;
  char    vers[10]=VERSION;
  char    version[25]="$VER: 1.2 (05.12.93)";
Usage()
{
fprintf(stderr,"Usage: printppm PPMFILE/A\n");
}

main( argc, argv )
  int argc; char **argv;
  {
  printf("printppm %s ©1993 Stephan Feinen\n",vers);
  if (argc != 2)
    {
    Usage();
    exit(1);
    }
  if (!(dest = fopen("par:","w"))) exit (puts("Printer not accessible!\n"));
  MyLock = Lock(argv[1],ACCESS_READ);
  if(!MyLock) exit(puts("Bad Name"));
  if(!Examine(MyLock,&MyInfo)) exit(puts("File Not Found"));
  laenge = MyInfo.fib_Size;
  UnLock(MyLock);
  printf("Dateilänge=%d\n",laenge);
  adr = AllocMem(laenge,MEMF_CLEAR);
  if(!adr) exit(puts("Out of Memory"));
  if(!(source = fopen(argv[1],"r"))) exit(printf("can't open %s\n",argv[1]));

                /* Check the magic number */
  fscanf(source,"%s",dum);
  if (strcmp("P6",dum))
    {
     FreeMem(adr,laenge);
     exit(fprintf(stderr, "%s: not a ppm-file\n",argv[1]));
    }
  fscanf(source,"%s",width);
  fscanf(source,"%s",height);
  fscanf(source,"%s",dum);
  fclose(source);
  if(!(source = Open(argv[1],MODE_OLDFILE)))
    {
    FreeMem(adr,laenge);
    exit(printf("%s not found\n",argv[1]));
    }
  Read(source,adr,laenge);
  Close(source);
  printf("Breite=%s ",width);
  printf("Höhe=%s\n",height);
  length=atoi(width)*atoi(height);
  printf("%d Pixels\n",length);
  fputc(27,dest);
  fputc(83,dest);
  fputc(0,dest);
  para=atoi(height) >> 8;
  fputc(para,dest);
  para=atoi(height) & 255;
  fputc(para,dest);
  fputc(75,dest);
  for(j=0; j<3; j++)
    {
    for(z = 0; z < length*3 ; z += 3)
      {
      aktuell=adr+j+z+15;
      fputc(*aktuell,dest);
      }
    }
  printf("%d bytes transfered\n",laenge);

  fclose(dest);
  FreeMem(adr,laenge);
  }
