⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 laserbar.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* 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 MAINmain(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 MAINstatic 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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -