]> pd.if.org Git - mmurtl/blob - msamples/print/print.c
autocommit for file dated 1995-02-09 15:59:26
[mmurtl] / msamples / print / print.c
1 /* A simple program that prints a single file, directly using\r
2    the Parallel Device Driver in MMURTL (Device No. 3 "LPT").\r
3    Print does perform some formatting, but it's crude.\r
4 \r
5         Print File, Version 1.0\r
6         Usage: Print Filename /1 /2 /4 /8 /F /D /B\r
7                 /1 /2 /4 /8 - Tab stop translation value\r
8                 /F  no FormFeed at end of file\r
9                 /D  Display file while printing\r
10                 /B  Binary print. NO translation, no FF\r
11 \r
12         To build Print.run, Use Makeit.bat in DOS, or use CM32 and DASM:\r
13         CM32 Print.C\r
14         DASM Print.ATF\r
15 */\r
16 \r
17 \r
18 #include <stdio.h>\r
19 #include <ctype.h>\r
20 #include <string.h>\r
21 #include <stdio.h>\r
22 #include <stdlib.h>\r
23 \r
24 #include "\OSSource\MDevDrv.h"\r
25 #include "\OSSource\MJob.h"\r
26 #include "\OSSource\MKbd.h"\r
27 #include "\OSSource\MTimer.h"\r
28 #include "\OSSource\MVid.h"\r
29 #include "\OSSource\Parallel.h"\r
30 \r
31 #define     FF            0x0C\r
32 #define     LF            0x0A\r
33 #define     CR            0x0D\r
34 #define     TAB           0x09\r
35 \r
36 unsigned long key;\r
37 \r
38 long tabstops = 4;\r
39 long NoFF = 0;\r
40 long fDisplay = 0;\r
41 long fBinary = 0;\r
42 long col = 0;\r
43 \r
44 char name[80];\r
45 FILE *f;\r
46 \r
47 struct statRecL lpt;\r
48 \r
49 /*****************************************************/\r
50 \r
51 void main(long argc, unsigned char *argv[])\r
52 {\r
53 long      erc, erck, i, cl;\r
54 unsigned char b, lastb;\r
55 char          fdone, *ptr;\r
56 \r
57         SetJobName("Printing", 8);\r
58 \r
59         name[0] = 0;\r
60 \r
61         for(i=1; i < argc; ++i)         /* start at arg 1 */\r
62         {\r
63                 ptr = argv[i];\r
64                 if (*ptr == '/')\r
65                 {\r
66                         ptr++;\r
67                         switch(*ptr)\r
68                     {\r
69                                 case '1' :                      /* Tab Translation Width */\r
70                                 case '2' :\r
71                                 case '4' :\r
72                                 case '8' :\r
73                                         tabstops = *ptr - 0x30;\r
74                                         break;\r
75                                 case 'F' :                      /* No FF at end of file */\r
76                                 case 'f' :\r
77                                         NoFF = 1;\r
78                                         break;\r
79                                 case 'D' :                      /* Display while printing */\r
80                                 case 'd' :\r
81                                         fDisplay = 1;\r
82                                         break;\r
83                                 case 'B' :                      /* BINARY - No translation at all! */\r
84                                 case 'b' :\r
85                                         fBinary = 1;\r
86                                         break;\r
87                                 default:\r
88                                         printf("Invalid switch");\r
89                                         exit(1);\r
90                                         break;\r
91                         }\r
92                 }\r
93                 else if(!name[0])\r
94                         strncpy (name, argv[i], 79);\r
95         }\r
96 \r
97         if (!name[0])\r
98         {\r
99                 /* Input file not explicitly named errors out */\r
100 \r
101                 printf("Print File, Version 1,0\r\n");\r
102                 printf("Usage: Filename /1 /2 /4 /8 /F /D /B\r\n");\r
103                 printf("/1 /2 /4 /8 - Tab stop translation value\r\n");\r
104                 printf("/F  no FormFeed at end of file\r\n");\r
105                 printf("/D  Display file while printing\r\n");\r
106                 printf("/B  Binary print. NO translation, no FF\r\n\n");\r
107                 printf("Error: Source filename required\r\n");\r
108                 exit(1);\r
109         }\r
110 \r
111         /* Get the 64 byte device status block which is specific to the\r
112            parallel device driver. The structure is defined in parallel.h\r
113            We do this just to see if it's a valid device.\r
114         */\r
115 \r
116         erc = DeviceStat(3, &lpt, 64, &i);\r
117 \r
118         if (erc)\r
119         {\r
120                 printf("Error getting LPT Device Status: %d\r\n", erc);\r
121                 ExitJob(erc);\r
122         }\r
123 \r
124         /* If device status went OK, we open the printer port */\r
125 \r
126                 /* device, dOpNum,   dLBA, dnBlocks, pData */\r
127         erc = DeviceOp(3,      CmdOpenL, 0,    0,        &i);\r
128 \r
129         if (erc)\r
130         {\r
131             printf("OpenLPT ERROR: %d \r\n", erc);\r
132             ExitJob(erc);\r
133         }\r
134 \r
135     printf("Printing %s ...\r\n", name);\r
136 \r
137     /* This is it... */\r
138 \r
139         f = fopen(name, "r");\r
140 \r
141         if (!f)\r
142         {\r
143                 /* device, dOpNum,   dLBA, dnBlocks, pData */\r
144                 erc = DeviceOp(3,  CmdCloseLU, 0,    0,        &i);\r
145                 printf("Can't open: %s\r\n", name);\r
146                 ExitJob(erc);\r
147          }\r
148 \r
149         col = 0;\r
150         i = 0;\r
151         b = 0;\r
152         fdone = 0;\r
153 \r
154         while ((!fdone) && (!erc))\r
155         {\r
156                 i++;\r
157                 cl = fgetc(f);\r
158                 lastb = b;\r
159                 b = (cl & 0xff);\r
160 \r
161                 if (cl == EOF)\r
162                 {\r
163                         fdone = 1;\r
164                 }\r
165                 else if (fBinary)\r
166                 {\r
167                         erc = DeviceOp(3, CmdWriteB, 0,  1, &lastb);\r
168                 }\r
169                 else\r
170                 {\r
171                         switch (b)\r
172                         {                       /* print/translate the char */\r
173                                 case CR:\r
174                                         erc = DeviceOp(3, CmdWriteB, 0,  1, &b);\r
175                                         break;\r
176                                 case LF:\r
177                                         if (lastb != CR)\r
178                                         {\r
179                                                 lastb = CR;\r
180                                                 erc = DeviceOp(3, CmdWriteB, 0,  1, &lastb);\r
181                                         }\r
182                                         erc = DeviceOp(3, CmdWriteB, 0,  1, &b);\r
183                                         if (fDisplay)\r
184                                                 printf("\r\n", lastb);\r
185                                         col = 0;  /* reset */\r
186                                         break;\r
187                                 case TAB:\r
188                                         do\r
189                                         {\r
190                                                 erc = DeviceOp(3, CmdWriteB, 0,  1, " ");\r
191                                                 col++;\r
192                                                 if (fDisplay)\r
193                                                         printf(" ");\r
194                                         } while (col % tabstops);\r
195                                         break;\r
196                                 default:\r
197                                         if (fDisplay)\r
198                                                 printf("%c", b);\r
199                                         col++;\r
200                                         erc = DeviceOp(3, CmdWriteB, 0,  1, &b);\r
201                                                 if (erc)\r
202                                                         printf("Error Writing Byte: %d\r\n", erc);\r
203                                         break;\r
204                         }\r
205                 }\r
206 \r
207                 if (i%100==0)           /* every 100 chars see if they want to abort */\r
208                 {\r
209                         erck = ReadKbd(&key, 0);\r
210                         /* no wait */\r
211                         if (!erck)\r
212                         {\r
213                                 if (key & 0xff == 0x1b)\r
214                                 {\r
215                                         fdone = 1;\r
216                                         erc = 4;\r
217                                 }\r
218                         }\r
219                 }\r
220         }\r
221 \r
222         if ((!fBinary) && (!NoFF))\r
223         {\r
224                 erc = DeviceOp(3, CmdWriteB, 0,  1, "\f");\r
225         }\r
226 \r
227         fclose(f);\r
228                          /* device, dOpNum, dLBA, dnBlocks, pData */\r
229         erc = DeviceOp(3,  CmdCloseL,   0,   0,        &i);\r
230         if (erc)\r
231                 printf("Can't close LPT. Error: %d\r\n", erc);\r
232         printf("Done\r\n");\r
233         ExitJob(erc);\r
234 \r
235 }\r