|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.