/* 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;
}
