home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
355.lha
/
SuperRetLab
/
sretlab.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-12
|
15KB
|
670 lines
/*
* Super Return Label program
* by Joel Swank 12-11-88
*
*/
/********* INCLUDES ************************ */
#include <exec/types.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <stdio.h>
#include <errno.h>
/* external Text in abouthelp.c */
extern struct IntuiText prerrtxt ;
extern struct IntuiText prerrtxt2 ;
extern struct IntuiText badcoptxt ;
extern struct IntuiText oktxt ;
extern struct IntuiText parfailtxt ;
extern struct IntuiText prfailtxt ;
extern struct IntuiText cantxt ;
extern struct IntuiText retrytxt ;
/* Defines for setting/clearing GADGDISABLED flag */
#define OffGad(gad) (gad).Flags = gad.Flags | GADGDISABLED;
#define OnGad(gad) (gad).Flags = gad.Flags & ~(GADGDISABLED);
struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase *GfxBase = NULL;
struct Window *wG = NULL;
struct RastPort *rpG;
struct IntuiMessage *message; /* the message from the IDCMP */
struct Window *OpenWindow();
struct IntuiMessage *GetMsg();
struct MenuItem *ItemAddress();
void *OpenLibrary();
FILE *print;
/* get the PowerWindows 2.0 code */
#include "srwindow.h"
/* internal modes */
int lmode = 3 ; /* number of lines - 3,4,5 */
int cmode = 23 ; /* number of characters per line - 19,23 */
/* Amiga Printer escape sequences */
char eliteon[] = "\033[2w";
char eliteoff[] = "\033[1w";
char condensedon[] = "\033[4w";
char condensedoff[] = "\033[3w";
char lpi8on[] = "\033[0z";
char lpi6on[] = "\033[1z";
char boldon[] = "\033[1m";
char boldoff[] = "\033[22m";
char nlqon[] = "\033[2\"z";
char nlqoff[] = "\033[1\"z";
char doubon[] = "\033[6w";
char douboff[] = "\033[5w";
char italon[] = "\033[3m";
char italoff[] = "\033[23m";
char reset[] = "\033c";
/* Epson Printer escape sequences */
char Eeliteon[] = "\033M";
char Eeliteoff[] = "\033P";
char Econdensedon[] = "\033\017";
char Econdensedoff[] = "\033\022";
char Elpi8on[] = "\0330";
char Elpi6on[] = "\0332";
char Ereset[] = "\033@";
char Esuperon[] = "\033S0";
char Esuperoff[] = "\033T";
char Six72nds[] = "\033A\06";
char blanks[] = " "; /* blank stock for center() */
main()
{
UWORD code;
ULONG class;
APTR object;
/* Open the libraries */
IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", 0L);
if (IntuitionBase == NULL)
{
exit(99);
}
GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L);
if (GfxBase == NULL)
{
done(98);
}
/* Set up the Gadgets */
if (lmode == 3) OffGad(TextL4_Gad);
if (lmode == 3 || lmode == 4 ) OffGad(TextL5_Gad);
OffGad(Stop_Gad)
if (SubItem1.Flags & CHECKED) /* if Amiga */
{
OffGad(Line4_Gad)
OffGad(Line5_Gad)
}
wG = OpenWindow(&NewWindowStructure1); /* open the window */
if ( wG == NULL )
{
done(2);
}
rpG = wG->RPort; /* get a rastport pointer for the window */
SetMenuStrip(wG,&MenuList1); /* attach my Menu */
PrintIText(rpG,&IntuiTextList1,0L,0L); /* Print the text */
while(1)
{
WaitPort(wG->UserPort);
while( (message = (struct IntuiMessage *)
GetMsg(wG->UserPort) ) != NULL)
{
code = message->Code; /* MENUNUM */
object = message->IAddress; /* Gadget */
class = message->Class;
ReplyMsg(message);
switch (class)
{
case CLOSEWINDOW :
done(0);
case GADGETDOWN:
if (object == (APTR) &Char23_Gad ||
object == (APTR) &Char19_Gad)
{
do_chars(object);
break;
}
/* only change lines if Epson selected */
if (SubItem2.Flags & CHECKED)
if (object == (APTR) &Line3_Gad ||
object == (APTR) &Line4_Gad ||
object == (APTR) &Line5_Gad)
{
do_lines(object);
break;
}
break;
case GADGETUP:
if (object == (APTR) &Print_Gad)
{
do_print();
break;
}
break;
case MENUPICK:
if (code != MENUNULL) do_pick((USHORT)code);
break;
}
}
}
}
/*
* Cleanup and exit
*/
done(how)
int how;
{
if (wG) ClearMenuStrip(wG);
if (wG) CloseWindow(wG);
if (GfxBase != NULL) CloseLibrary(GfxBase);
if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
exit(how);
}
/*
* do_pick : handle chain of menu selections
*/
do_pick(menunum)
USHORT menunum;
{
struct MenuItem *item, *ItemAddress();
while (menunum != MENUNULL)
{
switch(MENUNUM(menunum))
{
case 0: /* Project */
switch(ITEMNUM(menunum))
{
case 2: /* Quit */
done(0);
case 1: /* About */
about();
break;
case 0: /* Help */
help();
break;
}
break;
case 1: /* Options */
switch(ITEMNUM(menunum))
{
case 1: /* Printer */
switch(SUBNUM(menunum))
{
case 0: /* Amiga */
/* remove all gadgets */
RemoveGList(wG,&TextL1_Gad,-1L);
/* disable 4-line & 5-line */
OffGad(Line4_Gad)
OffGad(Line5_Gad)
/* go to 3-line mode */
go_3();
/* add back gadgets and refresh screen */
redraw_scr();
break;
case 1: /* Epson */
/* remove all gadgets */
RemoveGList(wG,&TextL1_Gad,-1L);
/* enable 4-line & 5-line */
OnGad(Line4_Gad)
OnGad(Line5_Gad)
/* add back gadgets and refresh screen */
redraw_scr();
break;
}
break;
case 0: /* Centering */
switch(SUBNUM(menunum))
{
case 0: /* On */
center_on();
break;
case 1: /* Off */
center_off();
break;
}
break;
}
break;
default: /* What's this garbage ? */
menunum = MENUNULL;
} /* end switch MENUNUM */
item = ItemAddress(&MenuList1,(long) menunum);
menunum = item->NextSelect;
}
}
/*
* turn off cenetring
*/
center_off()
{
struct StringInfo *sptr;
/* remove all gadgets */
RemoveGList(wG,&TextL1_Gad,-1L);
TextL1_Gad.Activation &= ~(STRINGCENTER); /* centering off */
TextL2_Gad.Activation &= ~(STRINGCENTER);
TextL3_Gad.Activation &= ~(STRINGCENTER);
TextL4_Gad.Activation &= ~(STRINGCENTER);
TextL5_Gad.Activation &= ~(STRINGCENTER);
/* cleared because centered mode leaves them negative */
/* which screws up display */
sptr = (struct StringInfo *) TextL1_Gad.SpecialInfo;
sptr->DispPos = 0;
sptr = (struct StringInfo *) TextL2_Gad.SpecialInfo;
sptr->DispPos = 0;
sptr = (struct StringInfo *) TextL3_Gad.SpecialInfo;
sptr->DispPos = 0;
sptr = (struct StringInfo *) TextL4_Gad.SpecialInfo;
sptr->DispPos = 0;
sptr = (struct StringInfo *) TextL5_Gad.SpecialInfo;
sptr->DispPos = 0;
/* add back gadgets and refresh screen */
redraw_scr();
}
/*
* turn on cenetring
*/
center_on()
{
/* remove all gadgets */
RemoveGList(wG,&TextL1_Gad,-1L);
TextL1_Gad.Activation |= STRINGCENTER;
TextL2_Gad.Activation |= STRINGCENTER;
TextL3_Gad.Activation |= STRINGCENTER;
TextL4_Gad.Activation |= STRINGCENTER;
TextL5_Gad.Activation |= STRINGCENTER;
/* add back gadgets and refresh screen */
redraw_scr();
}
/*
* do some printing
*/
do_print()
{
register long copies;
ULONG class;
char l1[25], l2[25], l3[25], l4[25], l5[25];
struct IntuiMessage *message; /* the message from the IDCMP */
copies = atol(Copies_GadSIBuff);
if (copies == 0) copies = 1;
if (copies < 0)
{
AutoRequest(wG,&badcoptxt,0L,&oktxt,0L,0L,300L,75L);
return;
}
/* Open the printer */
if (SubItem2.Flags & CHECKED) /* if Epson selected , par: */
{
while ((print = fopen("par:","w")) == NULL)
{
if (AutoRequest(wG,&parfailtxt,&retrytxt,&cantxt,
0L,0L,300L,75L)) continue;
return;
}
}
else while ((print = fopen("prt:","w")) == NULL) /* Amiga, prt: */
{
if (AutoRequest(wG,&prfailtxt,&retrytxt,&cantxt,
0L,0L,300L,75L)) continue;
return;
}
off_gads();
pr_init(); /* init the printer */
/* do cenetring if requested */
if (SubItem3.Flags & CHECKED) /* if ON selected , center em */
{
center(l1,TextL1_GadSIBuff);
center(l2,TextL2_GadSIBuff);
center(l3,TextL3_GadSIBuff);
center(l4,TextL4_GadSIBuff);
center(l5,TextL5_GadSIBuff);
}
else { /* else just copy */
strcpy(l1,TextL1_GadSIBuff);
strcpy(l2,TextL2_GadSIBuff);
strcpy(l3,TextL3_GadSIBuff);
strcpy(l4,TextL4_GadSIBuff);
strcpy(l5,TextL5_GadSIBuff);
}
while (copies > 0)
{
if (lmode == 4) /* do first 3 lines at 7/72 line spacing */
fprintf(print,"\033A\07");
fprintf(print,"%-*s%-*s%-*s\n",cmode,l1,cmode,l1,cmode,l1);
fprintf(print,"%-*s%-*s%-*s\n",cmode,l2,cmode,l2,cmode,l2);
fprintf(print,"%-*s%-*s%-*s\n",cmode,l3,cmode,l3,cmode,l3);
/* do last line at 15/72 line spacing */
if (lmode == 4) fprintf(print,"\033A\017");
if (lmode == 4 || lmode == 5)
fprintf(print,"%-*s%-*s%-*s\n",cmode,l4,cmode,l4,cmode,l4);
if (lmode == 5)
fprintf(print,"%-*s%-*s%-*s\n",cmode,l5,cmode,l5,cmode,l5);
if (lmode != 4) fputs("\n",print);
if (ferror(print)) /* error on output file */
{
prerrtxt2.IText = (UBYTE *) sys_errlist[errno];
AutoRequest(wG,&prerrtxt,0L,&oktxt,0L,0L,300L,75L);
break; /* early exit */
}
copies--;
sprintf(Copies_GadSIBuff,"%ld",copies);
RefreshGList(&Copies_Gad,wG,NULL,1L);
Delay(20L); /* keeps us down to printer speed */
if ( (message = (struct IntuiMessage *)
GetMsg(wG->UserPort) ) != NULL)
{
class = message->Class;
ReplyMsg(message);
if (class == CLOSEWINDOW) { pr_rest(); done(0); } /* exit */
if (class == MENUPICK) continue; /* ignore menus */
break; /* else STOP */
}
}
pr_rest();
fclose(print);
on_gads();
}
/*
* init the printer
*/
pr_init()
{
if (SubItem2.Flags & CHECKED) /* if Epson selected */
{
if (lmode == 3) fputs(Elpi8on,print);
if (lmode == 5) fputs(Six72nds,print);
if (lmode == 5 || lmode == 4) fputs(Esuperon,print);
if (cmode == 23) fputs(Eeliteon,print);
fputs(Econdensedon,print);
}
else { /* use amiga codes */
if (lmode == 3) fputs(lpi8on,print);
if (cmode == 23) fputs(eliteon,print);
fputs(condensedon,print);
}
}
/*
* restore the printer
*/
pr_rest()
{
if (SubItem2.Flags & CHECKED) /* if Epson selected */
{
fputs(Elpi6on,print);
if (cmode == 23) fputs(Eeliteoff,print);
fputs(Econdensedoff,print);
if (lmode == 5 || lmode == 4) fputs(Esuperoff,print);
}
else { /* use amiga codes */
fputs(lpi6on,print);
if (cmode == 23) fputs(eliteoff,print);
fputs(condensedoff,print);
}
}
/*
* center a line
*/
center(line,buf)
char *line, *buf;
{
int l;
l = (cmode - strlen(buf))/2;
if (l > 0) strncpy(line,blanks,l);
else l=0;
line[l] = '\0';
strcat(line,buf);
}
/*
* turn back on gadgets after printing
*/
on_gads()
{
RemoveGList(wG,&TextL1_Gad,-1L); /* remove all gadgets */
OnGad(TextL1_Gad); /* enable all */
OnGad(TextL2_Gad);
OnGad(TextL3_Gad);
if (lmode == 4 || lmode == 5) OnGad(TextL4_Gad);
if (lmode == 5) OnGad(TextL5_Gad);
OnGad(Char23_Gad);
OnGad(Char19_Gad);
OnGad(Line3_Gad);
if (SubItem2.Flags & CHECKED) /* if Epson selected */
{
OnGad(Line4_Gad);
OnGad(Line5_Gad);
}
OnGad(Print_Gad);
OffGad(Stop_Gad); /* disable STOP */
redraw_scr(); /* add back gadgets and refresh screen */
SetMenuStrip(wG,&MenuList1); /* attach my Menu */
}
/*
* disable gadgets for printing
*/
off_gads()
{
ClearMenuStrip(wG); /* disable menus */
RemoveGList(wG,&TextL1_Gad,-1L); /* remove all Gadgets */
OffGad(TextL1_Gad); /* disable all but STOP and COPIES */
OffGad(TextL2_Gad);
OffGad(TextL3_Gad);
OffGad(TextL4_Gad);
OffGad(TextL5_Gad);
OffGad(Char23_Gad);
OffGad(Char19_Gad);
OffGad(Line3_Gad);
if (SubItem2.Flags & CHECKED) /* if Epson selected */
{
OffGad(Line4_Gad);
OffGad(Line5_Gad);
}
OffGad(Print_Gad);
OnGad(Stop_Gad); /* enable STOP */
redraw_scr(); /* add back gadgets and refresh screen */
}
/*
* Handle line gadget change
*/
do_lines(object)
APTR object;
{
struct Gadget *gad;
gad = (struct Gadget *) object;
RemoveGList(wG,&TextL1_Gad,-1L);
if (gad->Flags & SELECTED) /* it was on */
{
if (object == (APTR) &Line3_Gad) go_4();
if (object == (APTR) &Line4_Gad) go_5();
if (object == (APTR) &Line5_Gad) go_3();
}
else { /* it was off */
if (object == (APTR) &Line3_Gad) go_3();
if (object == (APTR) &Line4_Gad) go_4();
if (object == (APTR) &Line5_Gad) go_5();
}
redraw_scr();
}
/*
* To 3-line lmode
*/
go_3()
{
Line4_Gad.Flags = Line4_Gad.Flags & ~(SELECTED);
Line5_Gad.Flags = Line5_Gad.Flags & ~(SELECTED);
Line3_Gad.Flags = Line3_Gad.Flags | SELECTED;
OffGad(TextL4_Gad);
OffGad(TextL5_Gad);
lmode = 3;
}
/*
* To 4-line lmode
*/
go_4()
{
Line5_Gad.Flags = Line5_Gad.Flags & ~(SELECTED);
Line3_Gad.Flags = Line3_Gad.Flags & ~(SELECTED);
Line4_Gad.Flags = Line4_Gad.Flags | SELECTED;
OnGad(TextL4_Gad);
OffGad(TextL5_Gad);
lmode = 4;
}
/*
* To 5-line lmode
*/
go_5()
{
Line4_Gad.Flags = Line4_Gad.Flags & ~(SELECTED);
Line3_Gad.Flags = Line3_Gad.Flags & ~(SELECTED);
Line5_Gad.Flags = Line5_Gad.Flags | SELECTED;
OnGad(TextL4_Gad);
OnGad(TextL5_Gad);
lmode = 5;
}
/*
* Handle char gadget change
*/
do_chars(object)
APTR object;
{
struct Gadget *gad;
gad = (struct Gadget *) object;
RemoveGList(wG,&TextL1_Gad,-1L);
if (gad->Flags & SELECTED) /* it was on */
{ /* . . so turn it off and other one on */
if (object == (APTR) &Char23_Gad) go_19();
if (object == (APTR) &Char19_Gad) go_23();
}
else { /* it was off */
if (object == (APTR) &Char23_Gad) go_23();
if (object == (APTR) &Char19_Gad) go_19();
}
TextL1_GadSInfo.MaxChars = (SHORT) cmode+1;
TextL2_GadSInfo.MaxChars = (SHORT) cmode+1;
TextL3_GadSInfo.MaxChars = (SHORT) cmode+1;
TextL4_GadSInfo.MaxChars = (SHORT) cmode+1;
TextL5_GadSInfo.MaxChars = (SHORT) cmode+1;
redraw_scr();
}
/*
* To 19-character lmode
*/
go_19()
{
cmode = 19;
Char19_Gad.Flags = Char19_Gad.Flags | SELECTED;
Char23_Gad.Flags = Char23_Gad.Flags & ~(SELECTED);
TextL1_GadSIBuff[19] = '\0'; /* truncate buffers */
TextL2_GadSIBuff[19] = '\0';
TextL3_GadSIBuff[19] = '\0';
TextL4_GadSIBuff[19] = '\0';
TextL5_GadSIBuff[19] = '\0';
}
/*
* To 23-character lmode
*/
go_23()
{ /* . . so turn it on and other one off */
Char19_Gad.Flags = Char19_Gad.Flags & ~(SELECTED);
Char23_Gad.Flags = Char23_Gad.Flags | SELECTED;
cmode = 23;
}
/*
* Redraw Window
* Assumes Gadgets have been removed
*/
redraw_scr()
{
SetAPen(rpG,0L);
RectFill(rpG,2L,22L,(long)wG->Width-3,(long)wG->Height-2);
AddGList(wG,&TextL1_Gad,0L,-1L,NULL);
RefreshGList(&TextL1_Gad,wG,NULL,-1L);
PrintIText(rpG,&IntuiTextList1,0L,0L); /* Print the text */
}
_abort()
{
done(6);
}