📄 zm.c
字号:
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 + -