xref: /plan9/sys/src/cmd/postscript/misc/laserbar.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1*219b2ee8SDavid du Colombier /* laserbar -- filter to print barcodes on postscript printer */
2*219b2ee8SDavid du Colombier 
3*219b2ee8SDavid du Colombier #define MAIN 1
4*219b2ee8SDavid du Colombier 
5*219b2ee8SDavid du Colombier #define	LABEL	01
6*219b2ee8SDavid du Colombier #define	NFLAG	02
7*219b2ee8SDavid du Colombier #define	SFLAG	04
8*219b2ee8SDavid du Colombier 
9*219b2ee8SDavid du Colombier #include <stdio.h>
10*219b2ee8SDavid du Colombier #include <ctype.h>
11*219b2ee8SDavid du Colombier 
12*219b2ee8SDavid du Colombier static int code39[256] = {
13*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
14*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15*219b2ee8SDavid du Colombier /*	sp    !     "     #     $     %     &     '	*/
16*219b2ee8SDavid du Colombier 	0304, 0,    0,    0,    0250, 0052, 0,    0,
17*219b2ee8SDavid du Colombier /*	(     )     *     +     ,     -     -     /	*/
18*219b2ee8SDavid du Colombier 	0,    0,    0224, 0212, 0,    0205, 0604, 0242,
19*219b2ee8SDavid du Colombier /*	0     1     2     3     4     5     6     7	*/
20*219b2ee8SDavid du Colombier 	0064, 0441, 0141, 0540, 0061, 0460, 0160, 0045,
21*219b2ee8SDavid du Colombier /*	8     9     :     ;     <     =     >     ?	*/
22*219b2ee8SDavid du Colombier 	0444, 0144, 0,    0,    0,    0,    0,    0,
23*219b2ee8SDavid du Colombier /*	@     A     B     C     D     E     F     G	*/
24*219b2ee8SDavid du Colombier 	0,    0411, 0111, 0510, 0031, 0430, 0130, 0015,
25*219b2ee8SDavid du Colombier /*	H     I     J     K     L     M     N     O	*/
26*219b2ee8SDavid du Colombier 	0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422,
27*219b2ee8SDavid du Colombier /*	P     Q     R     S     T     U     V     W	*/
28*219b2ee8SDavid du Colombier 	0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700,
29*219b2ee8SDavid du Colombier /*	X     Y     Z     [     \     ]     ^     _	*/
30*219b2ee8SDavid du Colombier 	0221, 0620, 0320, 0,    0,    0,    0,    0,
31*219b2ee8SDavid du Colombier /*	`     a     b     c     d     e     f     g	*/
32*219b2ee8SDavid du Colombier 	0,    0411, 0111, 0510, 0031, 0430, 0130, 0015,
33*219b2ee8SDavid du Colombier /*	h     i     j     k     l     m     n     o	*/
34*219b2ee8SDavid du Colombier 	0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422,
35*219b2ee8SDavid du Colombier /*	p     q     r     s     t     u     v     w	*/
36*219b2ee8SDavid du Colombier 	0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700,
37*219b2ee8SDavid du Colombier /*	x     y     z     {     |     }     ~     del	*/
38*219b2ee8SDavid du Colombier 	0221, 0620, 0320, 0,    0,    0,    0,    0,
39*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
46*219b2ee8SDavid du Colombier 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47*219b2ee8SDavid du Colombier };
48*219b2ee8SDavid du Colombier 
49*219b2ee8SDavid du Colombier static void barprt();
50*219b2ee8SDavid du Colombier void laserbar();
51*219b2ee8SDavid du Colombier 
52*219b2ee8SDavid du Colombier #ifdef MAIN
53*219b2ee8SDavid du Colombier 
main(argc,argv)54*219b2ee8SDavid du Colombier main(argc, argv)
55*219b2ee8SDavid du Colombier char **argv;
56*219b2ee8SDavid du Colombier {
57*219b2ee8SDavid du Colombier 	int c, flags = 0, error = 0;
58*219b2ee8SDavid du Colombier 	double rotate = 0, xoffset = 0, yoffset = 0, xscale = 1, yscale = 1;
59*219b2ee8SDavid du Colombier 	extern char *optarg;
60*219b2ee8SDavid du Colombier 	extern int optind;
61*219b2ee8SDavid du Colombier 	extern double atof();
62*219b2ee8SDavid du Colombier 	extern void exit();
63*219b2ee8SDavid du Colombier 
64*219b2ee8SDavid du Colombier 	while ((c = getopt(argc, argv, "r:x:y:X:Y:lns")) != EOF) {
65*219b2ee8SDavid du Colombier 		switch(c) {
66*219b2ee8SDavid du Colombier 		    case 'r':
67*219b2ee8SDavid du Colombier 			rotate = atof(optarg);
68*219b2ee8SDavid du Colombier 			break;
69*219b2ee8SDavid du Colombier 		    case 'x':
70*219b2ee8SDavid du Colombier 			xoffset = atof(optarg);
71*219b2ee8SDavid du Colombier 			break;
72*219b2ee8SDavid du Colombier 		    case 'y':
73*219b2ee8SDavid du Colombier 			yoffset = atof(optarg);
74*219b2ee8SDavid du Colombier 			break;
75*219b2ee8SDavid du Colombier 		    case 'X':
76*219b2ee8SDavid du Colombier 			xscale = atof(optarg);
77*219b2ee8SDavid du Colombier 			break;
78*219b2ee8SDavid du Colombier 		    case 'Y':
79*219b2ee8SDavid du Colombier 			yscale = atof(optarg);
80*219b2ee8SDavid du Colombier 			break;
81*219b2ee8SDavid du Colombier 		    case 'l':
82*219b2ee8SDavid du Colombier 			flags |= LABEL;
83*219b2ee8SDavid du Colombier 			break;
84*219b2ee8SDavid du Colombier 		    case 'n':
85*219b2ee8SDavid du Colombier 			flags |= NFLAG;
86*219b2ee8SDavid du Colombier 			break;
87*219b2ee8SDavid du Colombier 		    case 's':
88*219b2ee8SDavid du Colombier 			flags |= SFLAG;
89*219b2ee8SDavid du Colombier 			break;
90*219b2ee8SDavid du Colombier 		    case '?':
91*219b2ee8SDavid du Colombier 			++error;
92*219b2ee8SDavid du Colombier 		}
93*219b2ee8SDavid du Colombier 	}
94*219b2ee8SDavid du Colombier 	if ((argc - optind) != 1)
95*219b2ee8SDavid du Colombier 		++error;
96*219b2ee8SDavid du Colombier 	if (error) {
97*219b2ee8SDavid du Colombier 		(void) fprintf(stderr,
98*219b2ee8SDavid du Colombier "Usage: %s [-r rotate] [-x xoffset] [-y yoffset] [-X xscale] [-Y yscale] [-lns] string\n",
99*219b2ee8SDavid du Colombier 		    *argv);
100*219b2ee8SDavid du Colombier 		exit(1);
101*219b2ee8SDavid du Colombier 	}
102*219b2ee8SDavid du Colombier 	laserbar(stdout, argv[optind], rotate, xoffset, yoffset, xscale, yscale, flags);
103*219b2ee8SDavid du Colombier 	return 0;
104*219b2ee8SDavid du Colombier }
105*219b2ee8SDavid du Colombier 
106*219b2ee8SDavid du Colombier #endif MAIN
107*219b2ee8SDavid du Colombier 
108*219b2ee8SDavid du Colombier static int right = 0;
109*219b2ee8SDavid du Colombier 
110*219b2ee8SDavid du Colombier void
laserbar(fp,str,rotate,xoffset,yoffset,xscale,yscale,flags)111*219b2ee8SDavid du Colombier laserbar(fp, str, rotate, xoffset, yoffset, xscale, yscale, flags)
112*219b2ee8SDavid du Colombier FILE *fp;
113*219b2ee8SDavid du Colombier char *str;
114*219b2ee8SDavid du Colombier double rotate, xoffset, yoffset, xscale, yscale;
115*219b2ee8SDavid du Colombier int flags;
116*219b2ee8SDavid du Colombier {
117*219b2ee8SDavid du Colombier 	xoffset *= 72.;
118*219b2ee8SDavid du Colombier 	yoffset *= 72.;
119*219b2ee8SDavid du Colombier 	(void) fprintf(fp, "gsave %s\n", (flags & NFLAG) ? "newpath" : "");
120*219b2ee8SDavid du Colombier 	if (xoffset || yoffset)
121*219b2ee8SDavid du Colombier 		(void) fprintf(fp, "%f %f moveto\n", xoffset, yoffset);
122*219b2ee8SDavid du Colombier 	if (xscale != 1 || yscale != 1)
123*219b2ee8SDavid du Colombier 		(void) fprintf(fp, "%f %f scale\n", xscale, yscale);
124*219b2ee8SDavid du Colombier 	if (rotate)
125*219b2ee8SDavid du Colombier 		(void) fprintf(fp, "%f rotate\n", rotate);
126*219b2ee8SDavid du Colombier 	(void) fputs("/Helvetica findfont 16 scalefont setfont\n", fp);
127*219b2ee8SDavid du Colombier 	(void) fputs("/w { 0 rmoveto gsave 3 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp);
128*219b2ee8SDavid du Colombier 	(void) fputs("/n { 0 rmoveto gsave 1 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp);
129*219b2ee8SDavid du Colombier 	(void) fputs("/l { gsave 2 -88 rmoveto show grestore } def\n", fp);
130*219b2ee8SDavid du Colombier 	barprt(fp, '*', 0);
131*219b2ee8SDavid du Colombier 	while (*str)
132*219b2ee8SDavid du Colombier 		barprt(fp, *(str++), (flags & LABEL));
133*219b2ee8SDavid du Colombier 	barprt(fp, '*', 0);
134*219b2ee8SDavid du Colombier 	(void) fprintf(fp, "%sgrestore\n", (flags & SFLAG) ? "showpage " : "");
135*219b2ee8SDavid du Colombier 	right = 0;
136*219b2ee8SDavid du Colombier }
137*219b2ee8SDavid du Colombier 
138*219b2ee8SDavid du Colombier static void
barprt(fp,c,label)139*219b2ee8SDavid du Colombier barprt(fp, c, label)
140*219b2ee8SDavid du Colombier FILE *fp;
141*219b2ee8SDavid du Colombier int c, label;
142*219b2ee8SDavid du Colombier {
143*219b2ee8SDavid du Colombier 	int i, mask, bar, wide;
144*219b2ee8SDavid du Colombier 
145*219b2ee8SDavid du Colombier 	if (!(i = code39[c]))
146*219b2ee8SDavid du Colombier 		return;
147*219b2ee8SDavid du Colombier 	if (islower(c))
148*219b2ee8SDavid du Colombier 		c = toupper(c);
149*219b2ee8SDavid du Colombier 	if (label)
150*219b2ee8SDavid du Colombier 		(void) fprintf(fp, "(%c) l", c);
151*219b2ee8SDavid du Colombier 	else
152*219b2ee8SDavid du Colombier 		(void) fputs("     ", fp);
153*219b2ee8SDavid du Colombier 	for (bar = 1, mask = 0400; mask; bar = 1 - bar, mask >>= 1) {
154*219b2ee8SDavid du Colombier 		wide = mask & i;
155*219b2ee8SDavid du Colombier 		if (bar) {
156*219b2ee8SDavid du Colombier 			if (wide)
157*219b2ee8SDavid du Colombier 				++right;
158*219b2ee8SDavid du Colombier 			(void) fprintf(fp, " %d %s", right, wide ? "w" : "n");
159*219b2ee8SDavid du Colombier 			right = (wide ? 2 : 1);
160*219b2ee8SDavid du Colombier 		}
161*219b2ee8SDavid du Colombier 		else
162*219b2ee8SDavid du Colombier 			right += (wide ? 3 : 1);
163*219b2ee8SDavid du Colombier 	}
164*219b2ee8SDavid du Colombier 	(void) fputs("\n", fp);
165*219b2ee8SDavid du Colombier 	++right;
166*219b2ee8SDavid du Colombier }
167