/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* 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; voidlaserbar(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 voidbarprt(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;}
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/* 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;
}