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

📄 zm.c

📁 Debian Linux下的通讯程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			c = ERROR;		/* **** FALL THRU TO **** */		case RCDO:			goto fifi;		default:			break;		case CAN:			if (--cancount <= 0) {				c = ZCAN; goto fifi;			}			goto again;		}	/* **** FALL THRU TO **** */	default:agn2:		if ( --n == 0) {			zperr("Garbage count exceeded");			return(ERROR);		}		if (eflag && ((c &= 0177) & 0140))			bttyout(c);		else if (eflag > 1)			bttyout(c);#ifdef UNIX		fflush(stderr);#endif		goto startover;	case ZPAD|0200:		/* This is what we want. */		Not8bit = c;	case ZPAD:		/* This is what we want. */		break;	}	cancount = 5;splat:	switch (c = noxrd7()) {	case ZPAD:		goto splat;	case RCDO:	case TIMEOUT:		goto fifi;	default:		goto agn2;	case ZDLE:		/* This is what we want. */		break;	}	switch (c = noxrd7()) {	case RCDO:	case TIMEOUT:		goto fifi;	case ZBIN:		Rxframeind = ZBIN;  Crc32 = FALSE;		c =  zrbhdr(hdr);		break;	case ZBIN32:		Crc32 = Rxframeind = ZBIN32;		c =  zrbhdr32(hdr);		break;	case ZHEX:		Rxframeind = ZHEX;  Crc32 = FALSE;		c =  zrhhdr(hdr);		break;	case CAN:		goto gotcan;	default:		goto agn2;	}	Rxpos = hdr[ZP3] & 0377;	Rxpos = (Rxpos<<8) + (hdr[ZP2] & 0377);	Rxpos = (Rxpos<<8) + (hdr[ZP1] & 0377);	Rxpos = (Rxpos<<8) + (hdr[ZP0] & 0377);fifi:	switch (c) {	case GOTCAN:		c = ZCAN;	/* **** FALL THRU TO **** */	case ZNAK:	case ZCAN:	case ERROR:	case TIMEOUT:	case RCDO:		zperr("Got %s", frametypes[c+FTOFFSET]);	/* **** FALL THRU TO **** */	default:		if (c >= -3 && c <= FRTYPES)			vfile("zgethdr: %s %lx", frametypes[c+FTOFFSET], Rxpos);		else			vfile("zgethdr: %d %lx", c, Rxpos);	}	return c;}/* Receive a binary style header (type and position) */zrbhdr(hdr)register char *hdr;{	register int c, n;	register unsigned short crc;	if ((c = zdlread()) & ~0377)		return c;	Rxtype = c;	crc = updcrc(c, 0);	for (n=4; --n >= 0; ++hdr) {		if ((c = zdlread()) & ~0377)			return c;		crc = updcrc(c, crc);		*hdr = c;	}	if ((c = zdlread()) & ~0377)		return c;	crc = updcrc(c, crc);	if ((c = zdlread()) & ~0377)		return c;	crc = updcrc(c, crc);	if (crc & 0xFFFF) {		zperr(badcrc); 		return ERROR;	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1;	return Rxtype;}/* Receive a binary style header (type and position) with 32 bit FCS */zrbhdr32(hdr)register char *hdr;{	register int c, n;	register unsigned long crc;	if ((c = zdlread()) & ~0377)		return c;	Rxtype = c;	crc = 0xFFFFFFFFL; crc = UPDC32(c, crc);#ifdef DEBUGZ	vfile("zrbhdr32 c=%X  crc=%lX", c, crc);#endif	for (n=4; --n >= 0; ++hdr) {		if ((c = zdlread()) & ~0377)			return c;		crc = UPDC32(c, crc);		*hdr = c;#ifdef DEBUGZ		vfile("zrbhdr32 c=%X  crc=%lX", c, crc);#endif	}	for (n=4; --n >= 0;) {		if ((c = zdlread()) & ~0377)			return c;		crc = UPDC32(c, crc);#ifdef DEBUGZ		vfile("zrbhdr32 c=%X  crc=%lX", c, crc);#endif	}	if (crc != 0xDEBB20E3) {		zperr(badcrc);		return ERROR;	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1;	return Rxtype;}/* Receive a hex style header (type and position) */zrhhdr(hdr)char *hdr;{	register int c;	register unsigned short crc;	register int n;	if ((c = zgethex()) < 0)		return c;	Rxtype = c;	crc = updcrc(c, 0);	for (n=4; --n >= 0; ++hdr) {		if ((c = zgethex()) < 0)			return c;		crc = updcrc(c, crc);		*hdr = c;	}	if ((c = zgethex()) < 0)		return c;	crc = updcrc(c, crc);	if ((c = zgethex()) < 0)		return c;	crc = updcrc(c, crc);	if (crc & 0xFFFF) {		zperr(badcrc); return ERROR;	}	switch ( c = readline(1)) {	case 0215:		Not8bit = c;		/* **** FALL THRU TO **** */	case 015:	 	/* Throw away possible cr/lf */		switch (c = readline(1)) {		case 012:			Not8bit |= c;		}	}#ifdef ZMODEM	Protocol = ZMODEM;#endif	Zmodem = 1; return Rxtype;}/* Send a byte as two hex digits */zputhex(c, pos)register int c;char *pos;{	static char	digits[]	= "0123456789abcdef";	if (Verbose>8)		vfile("zputhex: %02X", c);	pos[0]=digits[(c&0xF0)>>4];	pos[1]=digits[c&0x0F];}static voidzsendline_init(char *tab){	int i;	for (i=0;i<256;i++) {			if (i & 0140)			tab[i]=0;		else {			switch(i)			{			case ZDLE:			case 020:			case 021:			case 023:			case 0220:			case 0221:			case 0223:				tab[i]=1;				break;			case 015:			case 0215:				if (Zctlesc)					tab[i]=1;				else					tab[i]=2;				break;			default:				if (Zctlesc)					tab[i]=1;				else					tab[i]=0;			}		}	}}/* Decode two lower case hex digits into an 8 bit byte value */zgethex(){	register int c;	c = zgeth1();	if (Verbose>8)		vfile("zgethex: %02X", c);	return c;}zgeth1(){	register int c, n;	if ((c = noxrd7()) < 0)		return c;	n = c - '0';	if (n > 9)		n -= ('a' - ':');	if (n & ~0xF)		return ERROR;	if ((c = noxrd7()) < 0)		return c;	c -= '0';	if (c > 9)		c -= ('a' - ':');	if (c & ~0xF)		return ERROR;	c += (n<<4);	return c;}/* * Read a byte, checking for ZMODEM escape encoding *  including CAN*5 which represents a quick abort */zdlread(){	register int c;again:	/* Quick check for non control characters */	if ((c = READLINE_PF(Rxtimeout)) & 0140)		return c;	switch (c) {	case ZDLE:		break;	case 023:	case 0223:	case 021:	case 0221:		goto again;	default:		if (Zctlesc && !(c & 0140)) {			goto again;		}		return c;	}again2:	if ((c = READLINE_PF(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = READLINE_PF(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = READLINE_PF(Rxtimeout)) < 0)		return c;	if (c == CAN && (c = READLINE_PF(Rxtimeout)) < 0)		return c;	switch (c) {	case CAN:		return GOTCAN;	case ZCRCE:	case ZCRCG:	case ZCRCQ:	case ZCRCW:		return (c | GOTOR);	case ZRUB0:		return 0177;	case ZRUB1:		return 0377;	case 023:	case 0223:	case 021:	case 0221:		goto again2;	default:		if (Zctlesc && ! (c & 0140)) {			goto again2;		}		if ((c & 0140) ==  0100)			return (c ^ 0100);		break;	}	if (Verbose>1)		zperr("Bad escape sequence %x", c);	return ERROR;}/* * Read a character from the modem line with timeout. *  Eat parity, XON and XOFF characters. */noxrd7(){	register int c;	for (;;) {		if ((c = readline(Rxtimeout)) < 0)			return c;		switch (c &= 0177) {		case XON:		case XOFF:			continue;		default:			if (Zctlesc && !(c & 0140))				continue;		case '\r':		case '\n':		case ZDLE:			return c;		}	}}/* Store long integer pos in Txhdr */stohdr(pos)long pos;{	Txhdr[ZP0] = pos;	Txhdr[ZP1] = pos>>8;	Txhdr[ZP2] = pos>>16;	Txhdr[ZP3] = pos>>24;}/* Recover a long integer from a header */longrclhdr(hdr)register char *hdr;{	register long l;	l = (hdr[ZP3] & 0377);	l = (l << 8) | (hdr[ZP2] & 0377);	l = (l << 8) | (hdr[ZP1] & 0377);	l = (l << 8) | (hdr[ZP0] & 0377);	return l;}/* End of zm.c */

⌨️ 快捷键说明

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