laserbar.c (4499B)
1 /* laserbar -- filter to print barcodes on postscript printer */ 2 3 #define MAIN 1 4 5 #define LABEL 01 6 #define NFLAG 02 7 #define SFLAG 04 8 9 #include <stdio.h> 10 #include <ctype.h> 11 12 static int code39[256] = { 13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15 /* sp ! " # $ % & ' */ 16 0304, 0, 0, 0, 0250, 0052, 0, 0, 17 /* ( ) * + , - - / */ 18 0, 0, 0224, 0212, 0, 0205, 0604, 0242, 19 /* 0 1 2 3 4 5 6 7 */ 20 0064, 0441, 0141, 0540, 0061, 0460, 0160, 0045, 21 /* 8 9 : ; < = > ? */ 22 0444, 0144, 0, 0, 0, 0, 0, 0, 23 /* @ A B C D E F G */ 24 0, 0411, 0111, 0510, 0031, 0430, 0130, 0015, 25 /* H I J K L M N O */ 26 0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422, 27 /* P Q R S T U V W */ 28 0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700, 29 /* X Y Z [ \ ] ^ _ */ 30 0221, 0620, 0320, 0, 0, 0, 0, 0, 31 /* ` a b c d e f g */ 32 0, 0411, 0111, 0510, 0031, 0430, 0130, 0015, 33 /* h i j k l m n o */ 34 0414, 0114, 0034, 0403, 0103, 0502, 0023, 0422, 35 /* p q r s t u v w */ 36 0122, 0007, 0406, 0106, 0026, 0601, 0301, 0700, 37 /* x y z { | } ~ del */ 38 0221, 0620, 0320, 0, 0, 0, 0, 0, 39 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 47 }; 48 49 static void barprt(); 50 void laserbar(); 51 52 #ifdef MAIN 53 54 main(argc, argv) 55 char **argv; 56 { 57 int c, flags = 0, error = 0; 58 double rotate = 0, xoffset = 0, yoffset = 0, xscale = 1, yscale = 1; 59 extern char *optarg; 60 extern int optind; 61 extern double atof(); 62 extern void exit(); 63 64 while ((c = getopt(argc, argv, "r:x:y:X:Y:lns")) != EOF) { 65 switch(c) { 66 case 'r': 67 rotate = atof(optarg); 68 break; 69 case 'x': 70 xoffset = atof(optarg); 71 break; 72 case 'y': 73 yoffset = atof(optarg); 74 break; 75 case 'X': 76 xscale = atof(optarg); 77 break; 78 case 'Y': 79 yscale = atof(optarg); 80 break; 81 case 'l': 82 flags |= LABEL; 83 break; 84 case 'n': 85 flags |= NFLAG; 86 break; 87 case 's': 88 flags |= SFLAG; 89 break; 90 case '?': 91 ++error; 92 } 93 } 94 if ((argc - optind) != 1) 95 ++error; 96 if (error) { 97 (void) fprintf(stderr, 98 "Usage: %s [-r rotate] [-x xoffset] [-y yoffset] [-X xscale] [-Y yscale] [-lns] string\n", 99 *argv); 100 exit(1); 101 } 102 laserbar(stdout, argv[optind], rotate, xoffset, yoffset, xscale, yscale, flags); 103 return 0; 104 } 105 106 #endif /*MAIN*/ 107 108 static int right = 0; 109 110 void 111 laserbar(fp, str, rotate, xoffset, yoffset, xscale, yscale, flags) 112 FILE *fp; 113 char *str; 114 double rotate, xoffset, yoffset, xscale, yscale; 115 int flags; 116 { 117 xoffset *= 72.; 118 yoffset *= 72.; 119 (void) fprintf(fp, "gsave %s\n", (flags & NFLAG) ? "newpath" : ""); 120 if (xoffset || yoffset) 121 (void) fprintf(fp, "%f %f moveto\n", xoffset, yoffset); 122 if (xscale != 1 || yscale != 1) 123 (void) fprintf(fp, "%f %f scale\n", xscale, yscale); 124 if (rotate) 125 (void) fprintf(fp, "%f rotate\n", rotate); 126 (void) fputs("/Helvetica findfont 16 scalefont setfont\n", fp); 127 (void) fputs("/w { 0 rmoveto gsave 3 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp); 128 (void) fputs("/n { 0 rmoveto gsave 1 setlinewidth 0 -72 rlineto stroke grestore } def\n", fp); 129 (void) fputs("/l { gsave 2 -88 rmoveto show grestore } def\n", fp); 130 barprt(fp, '*', 0); 131 while (*str) 132 barprt(fp, *(str++), (flags & LABEL)); 133 barprt(fp, '*', 0); 134 (void) fprintf(fp, "%sgrestore\n", (flags & SFLAG) ? "showpage " : ""); 135 right = 0; 136 } 137 138 static void 139 barprt(fp, c, label) 140 FILE *fp; 141 int c, label; 142 { 143 int i, mask, bar, wide; 144 145 if (!(i = code39[c])) 146 return; 147 if (islower(c)) 148 c = toupper(c); 149 if (label) 150 (void) fprintf(fp, "(%c) l", c); 151 else 152 (void) fputs(" ", fp); 153 for (bar = 1, mask = 0400; mask; bar = 1 - bar, mask >>= 1) { 154 wide = mask & i; 155 if (bar) { 156 if (wide) 157 ++right; 158 (void) fprintf(fp, " %d %s", right, wide ? "w" : "n"); 159 right = (wide ? 2 : 1); 160 } 161 else 162 right += (wide ? 3 : 1); 163 } 164 (void) fputs("\n", fp); 165 ++right; 166 }