home *** CD-ROM | disk | FTP | other *** search
- /*
- File Name: sendps.c
-
- Description: PostScript communication MPW Tool
- Author: Amanda Walker
- */
-
- #include <stdio.h>
- #include <setjmp.h>
- #include <signal.h>
- #include <Resources.h>
- #include <Memory.h>
- #include <CursorCtl.h>
- #include <ErrMgr.h>
- #include <PrintTraps.h>
-
- Handle PAP = 0L;
-
- Handle PAPLoad()
- {
- static Handle entity;
- short i;
-
- if (PAP) return entity; /* already loaded */
- PrOpen();
- if (!(PAP = GetResource('PDEF' ,10))) {
- PrClose();
- return 0L;
- }
- HLock(PAP);
- DetachResource(PAP);
- entity = GetResource('PAPA', 0xE000);
- HLock(entity);
- DetachResource(entity);
- PrClose();
- return entity;
- }
-
- pascal short _PAPOpen(short *refNum, Ptr PrinterName, short FlowQuantum,
- Ptr StatusBuff, short *CompState, Ptr coderesource)
- = { 0x205F, 0x4E90 };
-
- short PAPOpen(refNum, PrinterName, FlowQuantum, StatusBuff, CompState)
- short *refNum;
- Ptr PrinterName;
- short FlowQuantum;
- Ptr StatusBuff;
- short *CompState;
- {
- return _PAPOpen(refNum, PrinterName, FlowQuantum,
- StatusBuff, CompState, *PAP);
- }
-
- pascal short _PAPRead(short refNum, Ptr ReadBuff, short *DataSize, short *eof,
- short *CompState, Ptr coderesource)
- = { 0x205F, 0x4E90 };
-
- short PAPRead(refNum, ReadBuff, DataSize, eof, CompState)
- short refNum;
- Ptr ReadBuff;
- short *DataSize;
- short *eof;
- short *CompState;
- {
- return _PAPRead(refNum, ReadBuff, DataSize, eof, CompState, *PAP+4);
- }
-
- pascal short _PAPWrite(short refNum, Ptr ReadBuff, short DataSize, short eof,
- short *CompState, Ptr coderesource)
- = { 0x205F, 0x4E90 };
-
- short PAPWrite(refNum, WriteBuff, DataSize, eof, CompState)
- short refNum;
- Ptr WriteBuff;
- short DataSize;
- short eof;
- short *CompState;
- {
- return _PAPWrite(refNum, WriteBuff, DataSize, eof, CompState, *PAP+8);
- }
-
- pascal short _PAPStatus(Ptr PrinterName, Ptr StatusBuff, Ptr coderesource)
- = { 0x205F, 0x4E90 };
-
- short PAPStatus(PrinterName, StatusBuff)
- Ptr PrinterName;
- Ptr StatusBuff;
- {
- return _PAPStatus(PrinterName, StatusBuff, *PAP+12);
- }
-
- pascal short _PAPClose(short refNum, Ptr coderesource)
- = { 0x205F, 0x4E90 };
-
- short PAPClose(refNum)
- short refNum;
- {
- return _PAPClose(refNum, *PAP+16);
- }
-
-
- pascal short _PAPUnload(Ptr coderesource)
- = { 0x205F, 0x4E90 };
-
- short PAPUnload()
- {
- short res;
-
- res = _PAPUnload(*PAP+20);
- DisposHandle(PAP);
- PAP = 0L;
- return res;
- }
-
- volatile short interrupted;
-
- void catchInterrupt()
- {
- interrupted = 1;
- signal(SIGINT, (void *) catchInterrupt);
- }
-
- main(int argc, char **argv)
- {
- Handle lwname;
- int fd, i;
- char wbuffer[4096], rbuffer[4096], status[2048];
- short rcnt, wcnt, reof;
- short wstate, rstate;
- char msg[256];
- short refNum;
-
- if (argc != 2) {
- fprintf(stderr, "### usage: %s filename\n", argv[0]);
- exit(1);
- }
- lwname = PAPLoad();
- if (!lwname) {
- fprintf(stderr, "### %s: can't find name of printer\n", argv[0]);
- exit(1);
- }
- fd = open(argv[1], 0);
- if (fd < 0) {
- fprintf(stderr, "### %s: can't open '%s' for reading\n",
- argv[0], argv[1]);
- exit(1);
- }
-
- InitCursorCtl(NULL);
- Show_Cursor(WATCH_CURSOR);
- interrupted = 0;
- signal(SIGINT, (void *) catchInterrupt);
-
- i = PAPOpen(&refNum, (Ptr) *lwname, 8, &status, &wstate);
- if (i) {
- fprintf(stderr, "### %s: %s\n", argv[0], GetSysErrText(i, msg));
- PAPUnload();
- exit(1);
- }
- while (wstate > 0);
- if (wstate) {
- fprintf(stderr, "### %s: %s\n", argv[0], GetSysErrText(wstate, msg));
- PAPClose(refNum);
- PAPUnload();
- exit(1);
- }
- if (interrupted) {
- fprintf(stderr, "### %s: interrupted\n", argv[0]);
- PAPClose(refNum);
- PAPUnload();
- exit(1);
- }
- rcnt = sizeof(rbuffer);
- reof = 0;
- PAPRead(refNum, (Ptr) rbuffer, &rcnt, &reof, &rstate) ;
- while (i = read(fd, (Ptr) wbuffer, sizeof(wbuffer))) {
- wcnt = i;
- RotateCursor(32);
- PAPWrite(refNum, (Ptr) wbuffer, wcnt, 0, &wstate);
- while (wstate > 0) {
- if (rstate == 0) {
- for (i = 0; i < rcnt; i++)
- if (rbuffer[i] != '\012') putchar(rbuffer[i]);
- fflush(stdout);
- rcnt = sizeof(rbuffer);
- reof = 0;
- RotateCursor(-32);
- PAPRead(refNum, (Ptr) rbuffer, &rcnt, &reof, &rstate);
- } else if (rstate < 0) {
- fprintf(stderr, "### %s: %s\n", argv[0],
- GetSysErrText(rstate, msg));
- PAPClose(refNum);
- PAPUnload();
- exit(1);
- }
- if (interrupted) {
- fprintf(stderr, "### %s: interrupted\n", argv[0]);
- PAPClose(refNum);
- PAPUnload();
- exit(1);
- }
- }
- if (wstate < 0) {
- fprintf(stderr, "### %s: %s\n", argv[0],
- GetSysErrText(wstate, msg));
- PAPClose(refNum);
- PAPUnload();
- exit(1);
- }
- }
- RotateCursor(32);
- PAPWrite(refNum, (Ptr) "", 0, 1, &wstate);
- for (;;) {
- if (rstate == 0) {
- for (i = 0; i < rcnt; i++)
- /* translate PS newlines to Mac newlines... */
- if (rbuffer[i] != '\012')
- putchar(rbuffer[i]);
- else
- putchar('\015');
- fflush(stdout);
- if (reof) break;
- rcnt = sizeof(rbuffer);
- reof = 0;
- RotateCursor(-32);
- PAPRead(refNum, (Ptr) rbuffer, &rcnt, &reof, &rstate);
- } else if (rstate < 0) {
- fprintf(stderr, "### %s: %s\n", argv[0],
- GetSysErrText(rstate, msg));
- PAPClose(refNum);
- PAPUnload();
- exit(1);
- }
- if (interrupted) {
- fprintf(stderr, "### %s: interrupted\n", argv[0]);
- PAPClose(refNum);
- PAPUnload();
- exit(1);
- }
- }
- PAPClose(refNum);
- PAPUnload();
- }
-
-