[net.micro.amiga] Print.c - prints files.

hardie@sask.UUCP (Peter Hardie ) (02/18/86)

Here's the C (Lattice 3.02) source for a program that prints files.
It's better than using the copy command but it does not work under
Workbench. It's not a spooler but at least you can start it up in
a CLI and forget about it until it's done.
Pete
ihnp4!sask!hardie

/************************** CUT HERE *********************************/
/* print ....   print files to the printer.device.
   print [-r | -nN] file [file [ file .....]  ]
   The -r option causes print to write the files using raw I/O which
   means that all characters go through exactly as in the file.
   (i.e. escape sequences are not translated etc.)
   If -r is not specified then the normal device is used and any escape
   sequences are assumed to be the standard ISO ones used by the driver
   (see include/devices/printer.h for a list of codes)
   The program adds a formfeed at the end of each file.
   If the -nN option is used then only one file should be specified
   and that file will be printed N times without the formfeed between each one. 
   This is useful for printing an address label umpty times.

BUGS: Yep. It does not look for a cancel signal so once started it goes
	until it's done or until a reboot, whichever occurs first.
	PUBLIC DOMAIN FREEBIE ..... just don't sell it turkey!
	Peter Hardie 
	ihnp4!sask!hardie
	Saskatoon, Sask, Canada.
*/
#include <libraries/dos.h>
#include <exec/io.h>
#include <devices/printer.h>
#include <devices/inputevent.h>
#include <lattice/fcntl.h>
struct IOStdReq *iorb,iob;
struct InputEvent *event,ev;
char buf[512];
char formfeed = '\014';
main(argc,argv)
char *argv[];
int argc;
{
   int ifd,rawwrite;
   int num;
   int repeat, count;
   event = &ev;
   iorb = &iob;
   OpenDevice("printer.device",1,iorb,0);
   if(iorb->io_Error) {
      printf("can't open printer.device\n");
      exit();
   }
   iorb->io_Message.mn_ReplyPort = CreatePort("printer_reply",0L);
   if(iorb->io_Message.mn_ReplyPort == NULL) {
      CloseDevice(iorb);
      printf("can't get a reply port\n");
      exit();
   }
   rawwrite = CMD_WRITE;
   repeat = 1;
   if(argc > 1) {
      while(argv[1][0] == '-') {
         argv++;
         argc--;
         switch(argv[0][1]) {
         case 'r':
            rawwrite = PRD_RAWWRITE;
            break;
         case 'n':
            repeat = atoi(&argv[0][2]);
            break;
         default:
            printf("unknown argument '%s'\n",argv[0]);
            usage();
            goto finish;
         }
      }
   }
   if((repeat > 1) && (argc != 2)) {
      printf("arg count: only one file can be repeated\n");
      goto finish;
   }

   while(argc > 1) {
      if((ifd = open(argv[1],O_RDONLY)) == 0) {
         printf("can't open %s\n",argv[1]);
         argc--;
         argv++;
         continue;
      }
      for(count = 0; count < repeat; count++) {
        while((num = read(ifd,&buf[0],512)) > 0) {
            iorb->io_Command = rawwrite;
            iorb->io_Length = num;
            iorb->io_Data = &buf[0];
            DoIO(iorb);
         }
         if(repeat > 1)lseek(ifd,0L,0);
      }
      iorb->io_Command = rawwrite;
      iorb->io_Length = 1;
      iorb->io_Data = &formfeed;
      DoIO(iorb);
      close(ifd);
      argc--;
      argv++;
   }
finish:
   CloseDevice(iorb);
}
usage()
{
   printf("Usage: print [-r | -nN] file [file .....]\n");
   printf("If -nN is specified then only one file should be given\n");
}

andy@amiga.UUCP (Andy Finkel) (02/19/86)

In article <332@sask.UUCP> hardie@sask.UUCP (Peter Hardie ) writes:
>Here's the C (Lattice 3.02) source for a program that prints files.
>It's better than using the copy command but it does not work under
>Workbench. It's not a spooler but at least you can start it up in
>a CLI and forget about it until it's done.
>Pete
>ihnp4!sask!hardie

Not to take anything away from Pete, since its useful to try these things,
but here's another way to to it:

(from a CLI window)

run copy filename1 to prt: +
copy filename2 to prt: +
     .
     .
     .
copy filenamen to prt:

----------------------------

If you want formfeeds between files, put in an echo statement between files,
like:

echo > prt: "^L"
(control L is the formfeed)

to get the full, raw effect, copy to par: instead of prt:

You could also make it into a DOS execute file, with parameters.

				andy finkel
				Commodore(Amiga)

bruceb@amiga.UUCP (Bruce Barrett) (02/20/86)

In article <707@amiga.amiga.UUCP> andy@skipper.UUCP (Andy Finkel) writes:
>In article <332@sask.UUCP> hardie@sask.UUCP (Peter Hardie ) writes:
>>Here's the C (Lattice 3.02) source for a program that prints files.
>>It's better than using the copy command...
>>Pete
>>ihnp4!sask!hardie
>
>Not to take anything away from Pete, since its useful to try these things,
>but here's another way to to it:
>
>(from a CLI window)
>
>run copy filename1 to prt: +
>copy filename2 to prt: +
>     :
>copy filenamen to prt:
optional:
>echo > prt: "^L"
>(control L is the formfeed)
>
>to get the full, raw effect, copy to par: instead of prt:
>
>You could also make it into a DOS execute file, with parameters.
>
>				andy finkel
>				Commodore(Amiga)

Or........ even better(???) [different, at least] than Andy's solution...

You can use the "Join" command.  This makes handling multiple files even
easier (for the batch file).  Something like:
1)
	echo > :t/ff "^L"
	run join file1 :t/ff file2 :t/ff ... filen as prt:
	delete :t/ff
or 2)
	run join file1 file2 ... filen as prt:
or 3) and 4) use par: (or ser:) instead for "RawWrite".

==========PROBLEMS=============
You will please note the following problems with both Andy and my "solutions":
	1) No provision for the -nN option is made
	2) We assume (*Very* foolish us) that your printer is parallel.  OK
		so you can copy to SER: instead but this would require
		knowlege on the part of the person running/installing the
		execute file.  Not user friendly if you have 2 systems with
		2 different types of printers (like I do).
	3) Join will only handle 10 files (in this case that might be 5 files
		and 5 form-feeds) a definite limitation.
	4) Do NOT try using:
		run copy .... par:
		run copy .... par:
		run copy .... par:
	  as the 2nd and third copies may try to print before the first 
	  frees the printer.  They will just give up on the PRT: open error.

All and all I think Peter's program (although I have yet to use it) is 
quite useful in some cases.     Thanks Peter.

--Bruce Barrett (Commodore-Amiga)

hardie@sask.UUCP (Peter Hardie ) (02/22/86)

> In article <707@amiga.amiga.UUCP> andy@skipper.UUCP (Andy Finkel) writes:
a way of printing with CLI commands.

And Bruce Barrett shows another way and adds:
> All and all I think Peter's program (although I have yet to use it) is 
> quite useful in some cases.     Thanks Peter.
> --Bruce Barrett (Commodore-Amiga)

Thanks guys. As I commented to another Commodore-Amiga person, by mail,
the program isn't exactly a spooler and you can certainly do the same thing
with lots of command lines. But in my startup-sequence I open a newcli with
newcli con:400/10/240/50/cli
that hangs up in the top right corner of my screen. If I want to print something
I open that window and type, for example,
print mand.h mand.c mand1.c mand2.c mand3.c mand4.c
and then go back to the previous window wherein I am typing a reply to some
mail or reading this news over the phone line with my hacked up version
of the amigaterm program that was posted a while ago. And I can forget 
about the printer until it's done.
Actually, the program started as an exercise in opening, using and closing
a device and then evolved to the print program. It'll probably get worse as 
time goes by and I try to fiddle with the text justification and plotting
features on my printer.

Ciao
Pete Hardie
ihnp4!sask!hardie