aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/postscript/misc/laserbar.c
diff options
context:
space:
mode:
authorwkj <devnull@localhost>2004-05-16 07:54:22 +0000
committerwkj <devnull@localhost>2004-05-16 07:54:22 +0000
commitb855148c9b6d28fedfd083d037bcf246f1913d92 (patch)
tree0075eb6ea37427fa48b78cb937fabc04175cead1 /src/cmd/postscript/misc/laserbar.c
parent61f5c35c9465f0702739b41249a664d409f0482c (diff)
downloadplan9port-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.c166
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;
+}