| /* laserbar -- filter to print barcodes on postscript printer */ | 
 |  | 
 | #define MAIN 1 | 
 |  | 
 | #define	LABEL	01 | 
 | #define	NFLAG	02 | 
 | #define	SFLAG	04 | 
 |  | 
 | #include <stdio.h> | 
 | #include <ctype.h> | 
 |  | 
 | static int code39[256] = { | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | /*	sp    !     "     #     $     %     &     '	*/ | 
 | 	0304, 0,    0,    0,    0250, 0052, 0,    0,    | 
 | /*	(     )     *     +     ,     -     -     /	*/ | 
 | 	0,    0,    0224, 0212, 0,    0205, 0604, 0242, | 
 | /*	0     1     2     3     4     5     6     7	*/ | 
 | 	0064, 0441, 0141, 0540, 0061, 0460, 0160, 0045, | 
 | /*	8     9     :     ;     <     =     >     ?	*/ | 
 | 	0444, 0144, 0,    0,    0,    0,    0,    0,    | 
 | /*	@     A     B     C     D     E     F     G	*/ | 
 | 	0,    0411, 0111, 0510, 0031, 0430, 0130, 0015, | 
 | /*	H     I     J     K     L     M     N     O	*/ | 
 | 	0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422, | 
 | /*	P     Q     R     S     T     U     V     W	*/ | 
 | 	0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700, | 
 | /*	X     Y     Z     [     \     ]     ^     _	*/ | 
 | 	0221, 0620, 0320, 0,    0,    0,    0,    0, | 
 | /*	`     a     b     c     d     e     f     g	*/ | 
 | 	0,    0411, 0111, 0510, 0031, 0430, 0130, 0015, | 
 | /*	h     i     j     k     l     m     n     o	*/ | 
 | 	0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422, | 
 | /*	p     q     r     s     t     u     v     w	*/ | 
 | 	0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700, | 
 | /*	x     y     z     {     |     }     ~     del	*/ | 
 | 	0221, 0620, 0320, 0,    0,    0,    0,    0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
 | 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 
 | }; | 
 |  | 
 | static void barprt(); | 
 | void laserbar(); | 
 |  | 
 | #ifdef MAIN | 
 |  | 
 | main(argc, argv) | 
 | char **argv; | 
 | { | 
 | 	int c, flags = 0, error = 0; | 
 | 	double rotate = 0, xoffset = 0, yoffset = 0, xscale = 1, yscale = 1; | 
 | 	extern char *optarg; | 
 | 	extern int optind; | 
 | 	extern double atof(); | 
 | 	extern void exit(); | 
 |  | 
 | 	while ((c = getopt(argc, argv, "r:x:y:X:Y:lns")) != EOF) { | 
 | 		switch(c) { | 
 | 		    case 'r': | 
 | 			rotate = atof(optarg); | 
 | 			break; | 
 | 		    case 'x': | 
 | 			xoffset = atof(optarg); | 
 | 			break; | 
 | 		    case 'y': | 
 | 			yoffset = atof(optarg); | 
 | 			break; | 
 | 		    case 'X': | 
 | 			xscale = atof(optarg); | 
 | 			break; | 
 | 		    case 'Y': | 
 | 			yscale = atof(optarg); | 
 | 			break; | 
 | 		    case 'l': | 
 | 			flags |= LABEL; | 
 | 			break; | 
 | 		    case 'n': | 
 | 			flags |= NFLAG; | 
 | 			break; | 
 | 		    case 's': | 
 | 			flags |= SFLAG; | 
 | 			break; | 
 | 		    case '?': | 
 | 			++error; | 
 | 		} | 
 | 	} | 
 | 	if ((argc - optind) != 1) | 
 | 		++error; | 
 | 	if (error) { | 
 | 		(void) fprintf(stderr, | 
 | "Usage: %s [-r rotate] [-x xoffset] [-y yoffset] [-X xscale] [-Y yscale] [-lns] string\n", | 
 | 		    *argv); | 
 | 		exit(1); | 
 | 	} | 
 | 	laserbar(stdout, argv[optind], rotate, xoffset, yoffset, xscale, yscale, flags); | 
 | 	return 0; | 
 | } | 
 |  | 
 | #endif /*MAIN*/ | 
 |  | 
 | static int right = 0; | 
 |  | 
 | void | 
 | laserbar(fp, str, rotate, xoffset, yoffset, xscale, yscale, flags) | 
 | FILE *fp; | 
 | char *str; | 
 | double rotate, xoffset, yoffset, xscale, yscale; | 
 | int flags; | 
 | { | 
 | 	xoffset *= 72.; | 
 | 	yoffset *= 72.; | 
 | 	(void) fprintf(fp, "gsave %s\n", (flags & NFLAG) ? "newpath" : ""); | 
 | 	if (xoffset || yoffset) | 
 | 		(void) fprintf(fp, "%f %f moveto\n", xoffset, yoffset); | 
 | 	if (xscale != 1 || yscale != 1) | 
 | 		(void) fprintf(fp, "%f %f scale\n", xscale, yscale); | 
 | 	if (rotate) | 
 | 		(void) fprintf(fp, "%f rotate\n", rotate); | 
 | 	(void) fputs("/Helvetica findfont 16 scalefont setfont\n", fp); | 
 | 	(void) fputs("/w { 0 rmoveto gsave 3 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp); | 
 | 	(void) fputs("/n { 0 rmoveto gsave 1 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp); | 
 | 	(void) fputs("/l { gsave 2 -88 rmoveto show grestore } def\n", fp); | 
 | 	barprt(fp, '*', 0); | 
 | 	while (*str) | 
 | 		barprt(fp, *(str++), (flags & LABEL)); | 
 | 	barprt(fp, '*', 0); | 
 | 	(void) fprintf(fp, "%sgrestore\n", (flags & SFLAG) ? "showpage " : ""); | 
 | 	right = 0; | 
 | } | 
 |  | 
 | static void | 
 | barprt(fp, c, label) | 
 | FILE *fp; | 
 | int c, label; | 
 | { | 
 | 	int i, mask, bar, wide; | 
 |  | 
 | 	if (!(i = code39[c])) | 
 | 		return; | 
 | 	if (islower(c)) | 
 | 		c = toupper(c); | 
 | 	if (label) | 
 | 		(void) fprintf(fp, "(%c) l", c); | 
 | 	else | 
 | 		(void) fputs("     ", fp); | 
 | 	for (bar = 1, mask = 0400; mask; bar = 1 - bar, mask >>= 1) { | 
 | 		wide = mask & i; | 
 | 		if (bar) { | 
 | 			if (wide) | 
 | 				++right; | 
 | 			(void) fprintf(fp, " %d %s", right, wide ? "w" : "n"); | 
 | 			right = (wide ? 2 : 1); | 
 | 		} | 
 | 		else | 
 | 			right += (wide ? 3 : 1); | 
 | 	} | 
 | 	(void) fputs("\n", fp); | 
 | 	++right; | 
 | } |