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