?? zm.c
字號:
goto fifi; default: goto agn2; } 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) { c = GCOUNT; goto fifi; } goto startover; 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; } Rxhlen = 4; /* Set default length */ Rxframeind = c = noxrd7(); switch (c) { case ZVBIN32: if ((Rxhlen = c = zdlread()) < 0) goto fifi; if (c > ZMAXHLEN) goto agn2; Crc32r = 1; c = zrbhd32(hdr); break; case ZBIN32: if (Usevhdrs) goto agn2; Crc32r = 1; c = zrbhd32(hdr); break; case ZVBINR32: if ((Rxhlen = c = zdlread()) < 0) goto fifi; if (c > ZMAXHLEN) goto agn2; Crc32r = 2; c = zrbhd32(hdr); break; case ZBINR32: if (Usevhdrs) goto agn2; Crc32r = 2; c = zrbhd32(hdr); break; case RCDO: case TIMEOUT: goto fifi; case ZVBIN: if ((Rxhlen = c = zdlread()) < 0) goto fifi; if (c > ZMAXHLEN) goto agn2; Crc32r = 0; c = zrbhdr(hdr); break; case ZBIN: if (Usevhdrs) goto agn2; Crc32r = 0; c = zrbhdr(hdr); break; case ZVHEX: if ((Rxhlen = c = zgethex()) < 0) goto fifi; if (c > ZMAXHLEN) goto agn2; Crc32r = 0; c = zrhhdr(hdr); break; case ZHEX: if (Usevhdrs) goto agn2; Crc32r = 0; c = zrhhdr(hdr); break; case CAN: goto gotcan; default: goto agn2; } for (n = Rxhlen; ++n < ZMAXHLEN; ) /* Clear unused hdr bytes */ hdr[n] = 0; 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: case GCOUNT: zperr2("Got %s", frametypes[c+FTOFFSET]); /* **** FALL THRU TO **** */#ifndef DSZ default: if (c >= -4 && c <= FRTYPES) vfile("zgethdr: %c %d %s %lx", Rxframeind, Rxhlen, frametypes[c+FTOFFSET], Rxpos); else vfile("zgethdr: %c %d %lx", Rxframeind, c, Rxpos);#endif } /* Use variable length headers if we got one */ if (c >= 0 && c <= FRTYPES && Rxframeind & 040) Usevhdrs = 1; 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=Rxhlen; --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) { zperr1(badcrc); return ERROR; }#ifdef ZMODEM Protocol = ZMODEM;#endif Zmodem = 1; return Rxtype;}/* Receive a binary style header (type and position) with 32 bit FCS */zrbhd32(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("zrbhd32 c=%X crc=%lX", c, crc);#endif for (n=Rxhlen; --n >= 0; ++hdr) { if ((c = zdlread()) & ~0377) return c; crc = UPDC32(c, crc); *hdr = c;#ifdef DEBUGZ vfile("zrbhd32 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("zrbhd32 c=%X crc=%lX", c, crc);#endif } if (crc != 0xDEBB20E3) { zperr1(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=Rxhlen; --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) { zperr1(badcrc); return ERROR; } c = readline(Rxtimeout); if (c < 0) return c; c = readline(Rxtimeout);#ifdef ZMODEM Protocol = ZMODEM;#endif Zmodem = 1; if (c < 0) return c; return Rxtype;}/* Send a byte as two hex digits */zputhex(c)register int c;{ static char digits[] = "0123456789abcdef";#ifdef DEBUGZ if (Verbose>8) vfile("zputhex: %02X", c);#endif sendline(digits[(c&0xF0)>>4]); sendline(digits[(c)&0xF]);}/* * Send character c with ZMODEM escape sequence encoding. */zsendline(c)register c;{ switch (c &= 0377) { case 0377: lastsent = c; if (Zctlesc || Zsendmask[32]) { xsendline(ZDLE); c = ZRUB1; } xsendline(c); break; case ZDLE: xsendline(ZDLE); xsendline (lastsent = (c ^= 0100)); break; case 021: case 023: case 0221: case 0223: xsendline(ZDLE); c ^= 0100; xsendline(lastsent = c); break; default: if (((c & 0140) == 0) && (Zctlesc || Zsendmask[c & 037])) { xsendline(ZDLE); c ^= 0100; } xsendline(lastsent = c); }}/* Decode two lower case hex digits into an 8 bit byte value */zgethex(){ register int c; c = zgeth1();#ifdef DEBUGZ if (Verbose>8) vfile("zgethex: %02X", c);#endif 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(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(Rxtimeout)) < 0) return c; if (c == CAN && (c = readline(Rxtimeout)) < 0) return c; if (c == CAN && (c = readline(Rxtimeout)) < 0) return c; if (c == CAN && (c = readline(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) zperr2("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; } } /* NOTREACHED */}/* 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 + -