diff options
author | wkj <devnull@localhost> | 2004-05-16 07:54:22 +0000 |
---|---|---|
committer | wkj <devnull@localhost> | 2004-05-16 07:54:22 +0000 |
commit | b855148c9b6d28fedfd083d037bcf246f1913d92 (patch) | |
tree | 0075eb6ea37427fa48b78cb937fabc04175cead1 /src/cmd/postscript/misc/laserbar.c | |
parent | 61f5c35c9465f0702739b41249a664d409f0482c (diff) | |
download | plan9port-b855148c9b6d28fedfd083d037bcf246f1913d92.tar.gz plan9port-b855148c9b6d28fedfd083d037bcf246f1913d92.tar.bz2 plan9port-b855148c9b6d28fedfd083d037bcf246f1913d92.zip |
Checkpoint.
Diffstat (limited to 'src/cmd/postscript/misc/laserbar.c')
-rw-r--r-- | src/cmd/postscript/misc/laserbar.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/cmd/postscript/misc/laserbar.c b/src/cmd/postscript/misc/laserbar.c new file mode 100644 index 00000000..2f61c277 --- /dev/null +++ b/src/cmd/postscript/misc/laserbar.c @@ -0,0 +1,166 @@ +/* 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; +} |