[alt.sources] ecu - SCO XENIX V/{2,3}86 Extended CU part 29/47

wht@tridom.uucp (Warren Tucker) (10/11/89)

---- Cut Here and unpack ----
#!/bin/sh
# this is part 29 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file z/zcurses.c continued
#
CurArch=29
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file z/zcurses.c"
sed 's/^X//' << 'SHAR_EOF' >> z/zcurses.c
Xchar s50[50];
X
X	if(log_packets)
X	{
X		write(log_packets,"file: ",6);
X		write(log_packets,filename,strlen(filename));
X		write(log_packets,"\n",1);
X	}
X
X	/* filename */
X	if(strlen(filename) > 38)
X	{
X		strncpy(s50,filename,38);
X		s50[39] = 0;
X		cptr = s50;
X	}
X	else
X		cptr = filename;
X
X	clear_area(win,2,20,38);
X	waddstr(win,cptr);
X
X	/* file number */
X	clear_area(win,2,8,3);
X	sprintf(s50,"%3d",Filcnt);	/* rz uses as file number 1-n */
X	waddstr(win,s50);
X
X/* if remote sender provides a file count, display it */
X	if(npats)
X	{
X		clear_area(win,2,12,7);	/* clear "of ###" */
X		sprintf(s50,"of %3d:",npats);
X		waddstr(win,s50);
X	}
X
X	/* length */
X	report_file_open_length(length);
X
X	/* mode */
X	report_file_open_mode(file_mode);
X
X	/* time of start of this file */
X	report_file_open_tod();
X
X	this_file_errors = 0;
X	report_error_count();
X}	/* end of report_file_rcv_started */
X
X/*+-------------------------------------------------------------------------
X	report_file_close()
X--------------------------------------------------------------------------*/
Xvoid report_file_close()
X{
X	report_str("End of file",0);
X	wrefresh(win);
X
X}	/* end of report_file_close */
X
X/*+-------------------------------------------------------------------------
X	report_comm_baud_rate(baud_rate)
X
X baud rate: row 7 col 14 length 5
X--------------------------------------------------------------------------*/
Xreport_comm_baud_rate(baud_rate)
Xunsigned int baud_rate;
X{
X	char tstr8[8];
X
X	clear_area(win,7,14,5);
X	if(baud_rate == 0)
X		waddstr(win,"?");
X	else
X
X	{
X		sprintf(tstr8,"%5u",baud_rate);
X		waddstr(win,tstr8);
X	}
X	wrefresh(win);
X
X}	/* end of report_comm_baud_rate */
X
X/*+-------------------------------------------------------------------------
X	report_file_byte_io(count)
X--------------------------------------------------------------------------*/
Xreport_file_byte_io(count)
Xlong count;
X{
X
X	total_data_chars_xfered += (long)count;
X	if(total_data_chars_xfered)
X	{
X		sprintf(s128,"Total file bytes transferred: %lu",
X			total_data_chars_xfered);
X		report_str(s128,-1);
X	}
X
X}	/* end of report_file_byte_io */
X
X/* end of zcurses.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
echo "File z/zcurses.c is complete"
chmod 0644 z/zcurses.c || echo "restore of z/zcurses.c fails"
echo "x - extracting z/zdebug.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > z/zdebug.c &&
X/* CHK=0x7C8C */
X/* see zcurses.c report_lasthdr() */
X/*+:EDITS:*/
X/*:07-03-1989-22:58-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:51-wht-flush edits --- ecu 1.95 */
Xint header_debug = 0;
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 z/zdebug.c || echo "restore of z/zdebug.c fails"
echo "x - extracting z/zmodem.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > z/zmodem.h &&
X/* CHK=0x3C02 */
X/*+-------------------------------------------------------------------------
X	zmodem.h -- common include filefor ecurz/ecusz
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:58-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:51-wht-flush edits --- ecu 1.95 */
X
X#if defined(pyr)
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <sgtty.h>
X#define OS "BSD4.x"
X#if defined(LLITOUT)
X#include <strings.h>
X#endif
X#endif
X
X#if !defined(OS)
X#if !defined(M_XENIX)
X#define XENIX
X#endif
X#endif
X
X#if defined(M_XENIX)
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <termio.h>
X#include <sys/ioctl.h>
X#define OS "SYS III/V"
X#define MODE2OK
X#include <string.h>
X#endif
X
X#if defined(pyr)
X#if defined(TIOCSBRK)
X#define CANBREAK
X#endif
X#endif
X#if defined(M_XENIX)
X#define CANBREAK
X#endif
X
X#if !defined(READCHECK)
X#if defined(FIONREAD)
X#define READCHECK
X#endif
X#if defined(SV)
X#define READCHECK
X#endif
X#endif
X
X#define ACK 6
X#define CAN ('X'&037)
X#define CPMEOF 032
X#define ENQ 005
X#define EOT 4
X#define ERROR (-1)
X#define ERRORMAX 5
X#define FALSE 0
X#define NAK 025
X#define OK 0
X#define PATHLEN 257	/* ready for 4.2 bsd ? */
X#define RCDO (-3)
X#define SOH 1
X#define STX 2
X#define TIMEOUT (-2)
X#define TRUE 1
X#define UNIXFILE 0xF000	/* The S_IFMT file mask bit for stat */
X#define WANTCRC 0103	/* send C not NAK to get crc not checksum */
X
X#define WANTG 0107	/* Send G not NAK to get nonstop batch xmsn */
X#define WCEOT (-10)
X#define XOFF ('s'&037)
X#define XON ('q'&037)
X
X/*
X * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. 
X *  NOTE: First argument must be in range 0 to 255.
X *        Second argument is referenced twice.
X * 
X * Programmers may incorporate any or all code into their programs, 
X * giving proper credit within the source. Publication of the 
X * source routines is permitted so long as proper credit is given 
X * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, 
X * Omen Technology.
X */
X
X#define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ (cp))
X#define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF))
X
X
X#define ZPAD '*'	/* 052 Padding character begins frames */
X#define ZDLE 030	/* Ctrl-X Zmodem escape - `ala BISYNC DLE */
X#define ZDLEE (ZDLE^0100)	/* Escaped ZDLE as transmitted */
X#define ZBIN 'A'	/* Binary frame indicator */
X#define ZHEX 'B'	/* HEX frame indicator */
X#define ZBIN32 'C'	/* Binary frame with 32 bit FCS */
X
X/* Frame types (see array "frametypes" in zm.c) */
X#define ZRQINIT	0	/* Request receive init */
X#define ZRINIT	1	/* Receive init */
X#define ZSINIT 2	/* Send init sequence (optional) */
X#define ZACK 3		/* ACK to above */
X#define ZFILE 4		/* File name from sender */
X#define ZSKIP 5		/* To sender: skip this file */
X#define ZNAK 6		/* Last packet was garbled */
X#define ZABORT 7	/* Abort batch transfers */
X#define ZFIN 8		/* Finish session */
X#define ZRPOS 9		/* Resume data trans at this position */
X#define ZDATA 10	/* Data packet(s) follow */
X#define ZEOF 11		/* End of file */
X#define ZFERR 12	/* Fatal Read or Write error Detected */
X#define ZCRC 13		/* Request for file CRC and response */
X#define ZCHALLENGE 14	/* Receiver's Challenge */
X#define ZCOMPL 15	/* Request is complete */
X#define ZCAN 16		/* Other end canned session with CAN*5 */
X#define ZFREECNT 17	/* Request for free bytes on filesystem */
X#define ZCOMMAND 18	/* Command from sending program */
X#define ZSTDERR 19	/* Output to standard error, data follows */
X
X/* ZDLE sequences */
X#define ZCRCE 'h'	/* CRC next, frame ends, header packet follows */
X#define ZCRCG 'i'	/* CRC next, frame continues nonstop */
X#define ZCRCQ 'j'	/* CRC next, frame continues, ZACK expected */
X#define ZCRCW 'k'	/* CRC next, ZACK expected, end of frame */
X#define ZRUB0 'l'	/* Translate to rubout 0177 */
X#define ZRUB1 'm'	/* Translate to rubout 0377 */
X
X/* zdlread return values (internal) */
X/* -1 is general error, -2 is timeout */
X#define GOTOR 0400
X#define GOTCRCE (ZCRCE|GOTOR)	/* ZDLE-ZCRCE received */
X#define GOTCRCG (ZCRCG|GOTOR)	/* ZDLE-ZCRCG received */
X#define GOTCRCQ (ZCRCQ|GOTOR)	/* ZDLE-ZCRCQ received */
X#define GOTCRCW (ZCRCW|GOTOR)	/* ZDLE-ZCRCW received */
X#define GOTCAN	(GOTOR|030)	/* CAN*5 seen */
X
X/* Byte positions within header array */
X#define ZF0	3	/* First flags byte */
X#define ZF1	2
X#define ZF2	1
X#define ZF3	0
X#define ZP0	0	/* Low order 8 bits of position */
X#define ZP1	1
X#define ZP2	2
X#define ZP3	3	/* High order 8 bits of file position */
X
X/* Bit Masks for ZRINIT flags byte ZF0 */
X#define CANFDX	01	/* Rx can send and receive true FDX */
X#define CANOVIO	02	/* Rx can receive data during disk I/O */
X#define CANBRK	04	/* Rx can send a break signal */
X#define CANCRY	010	/* Receiver can decrypt */
X#define CANLZW	020	/* Receiver can uncompress */
X#define CANFC32	040	/* Receiver can use 32 bit Frame Check */
X#define ESCCTL 0100	/* Receiver expects ctl chars to be escaped */
X#define ESC8   0200	/* Receiver expects 8th bit to be escaped */
X
X/* Parameters for ZSINIT frame */
X#define ZATTNLEN 32	/* Max length of attention string */
X/* Bit Masks for ZSINIT flags byte ZF0 */
X#define TESCCTL 0100	/* Transmitter expects ctl chars to be escaped */
X#define TESC8   0200	/* Transmitter expects 8th bit to be escaped */
X
X/* Parameters for ZFILE frame */
X/* Conversion options one of these in ZF0 */
X#define ZCBIN	1	/* Binary transfer - inhibit conversion */
X#define ZCNL	2	/* Convert NL to local end of line convention */
X#define ZCRESUM	3	/* Resume interrupted file transfer */
X/* Management include options, one of these ored in ZF1 */
X#define ZMSKNOLOC	0200	/* Skip file if not present at rx */
X/* Management options, one of these ored in ZF1 */
X#define ZMMASK	037	/* Mask for the choices below */
X#define ZMNEWL	1	/* Transfer if source newer or longer */
X#define ZMCRC	2	/* Transfer if different file CRC or length */
X#define ZMAPND	3	/* Append contents to existing file (if any) */
X#define ZMCLOB	4	/* Replace existing file */
X#define ZMNEW	5	/* Transfer if source newer */
X	/* Number 5 is alive ... */
X#define ZMDIFF	6	/* Transfer if dates or lengths different */
X#define ZMPROT	7	/* Protect destination file */
X/* Transport options, one of these in ZF2 */
X#define ZTLZW	1	/* Lempel-Ziv compression */
X#define ZTCRYPT	2	/* Encryption */
X#define ZTRLE	3	/* Run Length encoding */
X/* Extended options for ZF3, bit encoded */
X#define ZXSPARS	64	/* Encoding for sparse file operations */
X
X/* Parameters for ZCOMMAND frame ZF0 (otherwise 0) */
X#define ZCACK1	1	/* Acknowledge, then do command */
X
X/* FTOFFSET is offset for frametypes array in ecuzm.c */
X#define FTOFFSET 3
X
Xlong rclhdr();
X
X#include "zlint.h"
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 z/zmodem.h || echo "restore of z/zmodem.h fails"
echo "x - extracting z/zlint.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > z/zlint.h &&
X/* CHK=0x6C74 */
X/*+-----------------------------------------------------------------------
X	zlint.h
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:58-wht------------- ecu 2.00 ---------------- */
X/*:06-27-1989-15:43-afterlint-creation */
X
X#ifndef BUILDING_LINT_ARGS
X#ifdef LINT_ARGS
X
X/* zcommon.c */
Xint mode(int );
Xint sendbrk(void);
Xint zmputs(char *);
Xvoid get_curr_dir(char *,int );
Xvoid get_home_dir(char *);
Xstatic  unsigned int getspeed(int );
X/* zcurses.c */
Xchar *get_elapsed_time(long );
Xchar *get_tod(int ,char *);
Xchar *mode_map(unsigned short ,char *);
Xint clear_area(struct _win_st *,int ,int ,int );
Xint clear_area_char(struct _win_st *,int ,int ,int ,char );
Xint report_comm_baud_rate(unsigned int );
Xint report_error_count(void);
Xint report_file_byte_io(long );
Xint report_file_open_length(long );
Xint report_file_open_mode(unsigned short );
Xint report_file_rcv_started(char *,long ,long ,unsigned short );
Xint report_protocol_crc_type(char *);
Xint report_protocol_type(char *);
Xint report_rx_tx_count(void);
Xint report_xfer_mode(char *);
Xvoid report_file_close(void);
Xvoid report_file_open_tod(void);
Xvoid report_file_send_open(char *,struct stat *);
Xvoid report_init(char *);
Xvoid report_last_rxhdr(char *,int );
Xvoid report_last_txhdr(char *,int );
Xvoid report_mode(int );
Xvoid report_rx_ind(int );
Xvoid report_rxblklen(int );
Xvoid report_rxpos(long );
Xvoid report_str(char *,int );
Xvoid report_top_line(char *);
Xvoid report_transaction(char *);
Xvoid report_tx_ind(int );
Xvoid report_txblklen(int );
Xvoid report_txpos(long );
Xvoid report_uninit(int );
X/* zdebug.c */
X/* zmodem.c */
Xint noxrd7(void);
Xint stohdr(long );
Xint zdlread(void);
Xint zgeth1(void);
Xint zgethdr(char *,int );
Xint zgethex(void);
Xint zputhex(int );
Xint zrbhdr(char *);
Xint zrbhdr32(char *);
Xint zrdat32(char *,int );
Xint zrdata(char *,int );
Xint zrhhdr(char *);
Xint zsbh32(char *,int );
Xint zsbhdr(int ,unsigned char *);
Xint zsda32(char *,int ,int );
Xint zsdata(unsigned char *,int ,int );
Xint zsendline(int );
Xint zshhdr(int ,unsigned char *);
Xlong rclhdr(char *);
X
X#else		/* compiler doesn't know about prototyping */
X
X/* zcommon.c */
Xvoid get_curr_dir();
Xvoid get_home_dir();
Xstatic  unsigned int getspeed();
X/* zcurses.c */
Xchar *get_elapsed_time();
Xchar *get_tod();
Xchar *mode_map();
Xvoid report_file_close();
Xvoid report_file_open_tod();
Xvoid report_file_send_open();
Xvoid report_init();
Xvoid report_last_rxhdr();
Xvoid report_last_txhdr();
Xvoid report_mode();
Xvoid report_rx_ind();
Xvoid report_rxblklen();
Xvoid report_rxpos();
Xvoid report_str();
Xvoid report_top_line();
Xvoid report_transaction();
Xvoid report_tx_ind();
Xvoid report_txblklen();
Xvoid report_txpos();
Xvoid report_uninit();
X/* zdebug.c */
X/* zmodem.c */
Xlong rclhdr();
X
X#endif /* LINT_ARGS */
X#endif /* BUILDING_LINT_ARGS */
X
X/* end of zlint.h */
SHAR_EOF
chmod 0644 z/zlint.h || echo "restore of z/zlint.h fails"
echo "x - extracting z/zcommon.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > z/zcommon.c &&
X/* CHK=0xF3D6 */
X/*+-------------------------------------------------------------------------
X	zcommon.c -  ecurz/ecusz common code
X	derived from public domain code by Chuck Forsburg
X	ecu adaptation Copyright 1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	cancel_transaction(0)
X	get_curr_dir(currdir,currdir_max)
X	get_home_dir(home_dir)
X	getspeed(code)
X	mode(new_mode)
X	rdchk(f)
X	rdchk(f)
X	sendbrk()
X	zmputs(str)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:58-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:51-wht-flush edits --- ecu 1.95 */
X
X#include <stdio.h>
X#include <signal.h>
X#include <setjmp.h>
X#include <ctype.h>
X#include "zmodem.h"
X
Xextern unsigned char vmin_count;
Xextern int Zmodem;
Xextern unsigned Baudrate;
Xextern int Twostop;		/* Use two stop bits */
X
X#if defined(LLITOUT)
Xlong Locmode;		/* Saved "local mode" for 4.x BSD "new driver" */
Xlong Locbit = LLITOUT;	/* Bit SUPPOSED to disable output translations */
X#endif
X
Xstruct 
X{
X	unsigned baudr;
X	int speedcode;
X} speeds[] = 
X{
X	110,	B110,
X	300,	B300,
X	600,	B600,
X	1200,	B1200,
X	2400,	B2400,
X	4800,	B4800,
X	9600,	B9600,
X	19200,	EXTA,
X	38400,	EXTB,
X	0,
X};
X
X/* crctab calculated by Mark G. Mendel,Network Systems Corporation */
Xunsigned short crctab[256] = 
X{
X	0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
X	0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
X	0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
X	0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
X	0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
X	0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
X	0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
X	0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
X	0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
X	0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
X	0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
X	0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
X	0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
X	0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
X	0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
X	0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
X	0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
X	0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
X	0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
X	0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
X	0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
X	0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
X	0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
X	0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
X	0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
X	0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
X	0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
X	0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
X	0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
X	0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
X	0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
X	0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
X};
X
X#if defined(WANT_UPDCRC_HERE)	/* wht -- moved to zmodem.h */
X/*
X * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. 
X *  NOTE: First srgument must be in range 0 to 255.
X *        Second argument is referenced twice.
X * 
X * Programmers may incorporate any or all code into their programs,
X * giving proper credit within the source. Publication of the 
X * source routines is permitted so long as proper credit is given 
X * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
X * Omen Technology.
X */
X
X#define updcrc(cp,crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp)
X#endif
X
X/*
X  First,the polynomial itself and its table of feedback terms.  The
X  polynomial is:
X
X  X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
X
X  Note that we take it "backwards" and put the highest-order term in the
X  lowest-order bit.  The X^32 term is "implied"; the LSB is the X^31
X  term,etc.  The X^0 term (usually shown as "+1") results in the MSB being
X  1.  Note that the usual hardware shift register implementation,which is
X  what we're using (we're merely optimizing it by doing eight-bit chunks at
X  a time) shifts bits into the lowest-order term.  In our
X  implementation,that means shifting towards the right.  Why do we do it
X  this way?  Because the calculated CRC must be transmitted in order from
X  highest-order term to lowest-order term.  UARTs transmit characters in
X  order from LSB to MSB.  By storing the CRC this way, we hand it to the
X  UART in the order low-byte to high-byte; the UART sends each low-bit to
X  hight-bit; and the result is transmission bit by bit from highest- to
X  lowest-order term without requiring any bit shuffling on our part.
X  Reception works similarly.
X
X  The feedback terms table consists of 256 32-bit entries.  Notes:   
X
X     The macro for using the table is UPDC32 is located in zmodem.h
X                                                                     
X     It might not be obvious,but the feedback terms simply represent the
X     results of eight shift/xor opera- tions for all combinations of data
X     and CRC register values.
X                                                                     
X     The values must be right-shifted by eight bits by the "UPDC32" logic;
X     the shift must be unsigned (bring in zeroes).  On some hardware you
X     could probably optimize the shift in assembler by using byte-swap
X     instructions.
X*/
X
Xlong cr3tab[] =		/* CRC polynomial 0xedb88320 */
X{
X	0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,0x9e6495a3,
X	0x0edb8832,0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd,0xe7b82d07,0x90bf1d91,
X	0x1db71064,0x6ab020f2,0xf3b97148,0x84be41de,0x1adad47d,0x6ddde4eb,0xf4d4b551,0x83d385c7,
X	0x136c9856,0x646ba8c0,0xfd62f97a,0x8a65c9ec,0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5,
X	0x3b6e20c8,0x4c69105e,0xd56041e4,0xa2677172,0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b,
X	0x35b5a8fa,0x42b2986c,0xdbbbc9d6,0xacbcf940,0x32d86ce3,0x45df5c75,0xdcd60dcf,0xabd13d59,
X	0x26d930ac,0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,0xcfba9599,0xb8bda50f,
X	0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab,0xb6662d3d,
X	0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f,0x9fbfe4a5,0xe8b8d433,
X	0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb,0x086d3d2d,0x91646c97,0xe6635c01,
X	0x6b6b51f4,0x1c6c6162,0x856530d8,0xf262004e,0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457,
X	0x65b0d9c6,0x12b7e950,0x8bbeb8ea,0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65,
X	0x4db26158,0x3ab551ce,0xa3bc0074,0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb,
X	0x4369e96a,0x346ed9fc,0xad678846,0xda60b8d0,0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9,
X	0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,0x206f85b3,0xb966d409,0xce61e49f,
X	0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81,0xb7bd5c3b,0xc0ba6cad,
X	0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739,0x9dd277af,0x04db2615,0x73dc1683,
X	0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8,0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1,
X	0xf00f9344,0x8708a3d2,0x1e01f268,0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7,
X	0xfed41b76,0x89d32be0,0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5,
X	0xd6d6a3e8,0xa1d1937e,0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b,
X	0xd80d2bda,0xaf0a1b4c,0x36034af6,0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef,0x4669be79,
X	0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,0xcc0c7795,0xbb0b4703,0x220216b9,0x5505262f,
X	0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7,0xb5d0cf31,0x2cd99e8b,0x5bdeae1d,
X	0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a,0x9c0906a9,0xeb0e363f,0x72076785,0x05005713,
X	0x95bf4a82,0xe2b87a14,0x7bb12bae,0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,0x0bdbdf21,
X	0x86d3d2d4,0xf1d4e242,0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777,
X	0x88085ae6,0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45,
X	0xa00ae278,0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d,0x3e6e77db,
X	0xaed16a4a,0xd9d65adc,0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5,0x47b2cf7f,0x30b5ffe9,
X	0xbdbdf21c,0xcabac28a,0x53b39330,0x24b4a3a6,0xbad03605,0xcdd70693,0x54de5729,0x23d967bf,
X	0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94,0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d
X};
X
X#if defined(FIONREAD)
X/*
X *  Return non 0 iff something to read from io descriptor f
X */
Xrdchk(f)
X{
X	static long lf;
X
X	ioctl(f,FIONREAD,&lf);
X	return((int) lf);
X}
X#endif
X
X#if defined(SV)
X#include <fcntl.h>
X
Xchar checked = '\0' ;
X/*
X * Nonblocking I/O is a bit different in System V,Release 2
X */
Xrdchk(f)
X{
X	int lf,savestat;
X
X	savestat = fcntl(f,F_GETFL) ;
X	fcntl(f,F_SETFL,savestat | O_NDELAY) ;
X	lf = read(f,&checked,1) ;
X	fcntl(f,F_SETFL,savestat) ;
X	return(lf) ;
X}
X#endif
X
X
Xstatic unsigned
Xgetspeed(code)
X{
X	register n;
X
X	for(n=0; speeds[n].baudr; ++n)
X		if(speeds[n].speedcode == code)
X			return(speeds[n].baudr);
X	return(38400);	/* Assume fifo if ioctl failed */
X}
X
X
X
X#if defined(ICANON)
Xstruct termio oldtty,tty;
X#else
Xstruct sgttyb oldtty,tty;
Xstruct tchars oldtch,tch;
X#endif
X
Xextern int iofd;		/* File descriptor for ioctls & reads */
X
X/*
X * mode(n)
X *  3: save old tty stat, set raw mode with flow control
X *  2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g
X *  1: save old tty stat, set raw mode 
X *  0: restore original tty mode
X */
Xmode(new_mode)
X{
X	static did0 = FALSE;
X	report_mode(new_mode);
X	switch(new_mode)
X	{
X#if defined(M_XENIX)
X	case 2:		/* Un-raw mode used by sz,sb when -g detected */
X		if(!did0)
X			(void) ioctl(iofd,TCGETA,&oldtty);
X		tty = oldtty;
X
X		tty.c_iflag = BRKINT|IXON;
X
X		tty.c_oflag = 0;	/* Transparent output */
X
X		tty.c_cflag &= ~PARENB;	/* Disable parity */
X		tty.c_cflag |= CS8;	/* Set character size = 8 */
X		if(Twostop)
X			tty.c_cflag |= CSTOPB;	/* Set two stop bits */
X
X
X#if defined(READCHECK)
X		tty.c_lflag = Zmodem ? 0 : ISIG;
X		tty.c_cc[VINTR] = Zmodem ? -1:030;	/* Interrupt char */
X#else
X		tty.c_lflag = ISIG;
X		tty.c_cc[VINTR] = Zmodem ? 03:030;	/* Interrupt char */
X#endif
X		tty.c_cc[VQUIT] = -1;			/* Quit char */
X#if defined(NFGVMIN)
X		tty.c_cc[VMIN] = 1;
X#else
X		tty.c_cc[VMIN] = 3;	 /* This many chars satisfies reads */
X#endif
X		tty.c_cc[VTIME] = 1;	/* or in this many tenths of seconds */
X
X		(void) ioctl(iofd,TCSETAW,&tty);
X		did0 = TRUE;
X		return(OK);
X	case 1:
X	case 3:
X		if(!did0)
X			(void) ioctl(iofd,TCGETA,&oldtty);
X		tty = oldtty;
X
X		tty.c_iflag = new_mode == 3 ? (IGNBRK | IXOFF) : IGNBRK;
X
X		/* No echo,crlf mapping,INTR,QUIT,delays,no erase/kill */
X		tty.c_lflag &= ~(ECHO | ICANON | ISIG);
X
X		tty.c_oflag = 0;	/* Transparent output */
X
X		tty.c_cflag &= ~PARENB;	/* Same baud rate,disable parity */
X		tty.c_cflag |= CS8;	/* Set character size = 8 */
X		if(Twostop)
X			tty.c_cflag |= CSTOPB;	/* Set two stop bits */
X#if defined(NFGVMIN)
X		tty.c_cc[VMIN] = 1; /* This many chars satisfies reads */
X#else
X		tty.c_cc[VMIN] = vmin_count; /* This many chars satisfies reads */
X#endif
X		tty.c_cc[VTIME] = 1;	/* or in this many tenths of seconds */
X		(void) ioctl(iofd,TCSETAW,&tty);
X		did0 = TRUE;
X		Baudrate = getspeed(tty.c_cflag & CBAUD);
X		report_comm_baud_rate(Baudrate);
X		return(OK);
X#endif
X#if defined(pyr)
X		/*
X	 *  NOTE: this should transmit all 8 bits and at the same time
X	 *   respond to XOFF/XON flow control.  If no FIONREAD or other
X	 *   READCHECK alternative,also must respond to INTRRUPT char
X	 *   This doesn't work with BSD4.  It should work with LLITOUT,
X	 *   but LLITOUT was broken on the machine I tried it on.
X	 */
X	case 2:		/* Un-raw mode used by sz,sb when -g detected */
X		if(!did0)
X		{
X			ioctl(iofd,TIOCEXCL,0);
X			ioctl(iofd,TIOCGETP,&oldtty);
X			ioctl(iofd,TIOCGETC,&oldtch);
X#if defined(LLITOUT)
X			ioctl(TIOCLGET,&Locmode);	/* Get "local mode" */
X#endif
X		}
X		tty = oldtty;
X		tch = oldtch;
X#if defined(READCHECK)
X		tch.t_intrc = Zmodem ? -1:030;	/* Interrupt char */
X#else
X		tch.t_intrc = Zmodem ? 03:030;	/* Interrupt char */
X#endif
X		tty.sg_flags |= (ODDP|EVENP|CBREAK);
X		tty.sg_flags &= ~(ALLDELAY|CRMOD|ECHO|LCASE);
X		ioctl(iofd,TIOCSETP,&tty);
X		ioctl(iofd,TIOCSETC,&tch);
X#if defined(LLITOUT)
X		ioctl(TIOCLBIS,&Locbit);
X#endif
X/* un-raw doesn't work w/o lit out *//*wht code was 99 */
X		cancel_transaction(0)
X		did0 = TRUE;
X		return(OK);
X	case 1:
X	case 3:
X		if(!did0)
X		{
X			ioctl(iofd,TIOCEXCL,0);
X			ioctl(iofd,TIOCGETP,&oldtty);
X			ioctl(iofd,TIOCGETC,&oldtch);
X#if defined(LLITOUT)
X			ioctl(TIOCLGET,&Locmode);	/* Get "local mode" */
X#endif
X		}
X		tty = oldtty;
X		tty.sg_flags |= RAW;
X		tty.sg_flags &= ~ECHO;
X		ioctl(iofd,TIOCSETP,&tty);
X		did0 = TRUE;
X		Baudrate = getspeed(tty.sg_ospeed);
X		report_comm_baud_rate(Baudrate);
X		return(OK);
X#endif
X	case 0:
X		if(!did0)
X			return(ERROR);
X#if defined(M_XENIX)
X		(void) ioctl(iofd,TCSBRK,1);	/* Wait for output to drain */
X		(void) ioctl(iofd,TCFLSH,1);	/* Flush input queue */
X		(void) ioctl(iofd,TCSETAW,&oldtty);	/* Restore modes */
X		(void) ioctl(iofd,TCXONC,1);	/* Restart output */
X#endif
X#if defined(pyr)
X		ioctl(iofd,TIOCSETP,&oldtty);
X		ioctl(iofd,TIOCSETC,&oldtch);
X		ioctl(iofd,TIOCNXCL,0);
X#if defined(LLITOUT)
X		ioctl(TIOCLSET,&Locmode);	/* Restore "local mode" */
X#endif
X#endif
X
X		return(OK);
X	default:
X		return(ERROR);
X	}
X}
X
X/*+-------------------------------------------------------------------------
X	sendbrk()
X--------------------------------------------------------------------------*/
Xsendbrk()
X{
X#if defined(pyr)
X	sleep(1);
X	ioctl(iofd,TIOCSBRK,0);
X	sleep(1);
X	ioctl(iofd,TIOCCBRK,0);
X#endif
X#if defined(M_XENIX)
X	ioctl(iofd,TCSBRK,0);
X#endif
X}	/* end of sendbrk */
X
X/*+-------------------------------------------------------------------------
X	get_curr_dir(currdir,currdir_max)
X--------------------------------------------------------------------------*/
Xvoid
Xget_curr_dir(currdir,currdir_max)
Xchar *currdir;
Xint currdir_max;
X{
X#if defined(pyr)
Xchar *getwd();
X	return((getwd(currdir) == (char *)0) ? -1 : 0);
X#endif
X
X#if defined(M_XENIX)
X	getcwd(currdir,currdir_max);
X#endif
X
X}	/* end of get_curr_dir */
X
X/*+-------------------------------------------------------------------------
X	zmputs(str) - send a string to the modem
X
Xprocessing for \336 (sleep 1 sec) and \335 (break signal)
X--------------------------------------------------------------------------*/
Xzmputs(str)
Xregister char *str;
X{
Xregister char strch;
X
X	while(strch = *str++)
X	{
X		switch(strch)
X		{
X		case '\336':
X			sleep(1);
X			continue;
X		case '\335':
X			sendbrk();
X			continue;
X		default:
X			sendline(strch);
X		}
X	}
X}	/* end of zmputs */
X
X/*+-----------------------------------------------------------------------
X	get_home_dir(buffer):  leave plenty of room for result!
X------------------------------------------------------------------------*/
Xvoid
Xget_home_dir(home_dir)
Xchar *home_dir;
X{
Xregister char *cptr;
Xchar *getenv();
X#if defined(pyr)
Xchar *getlogin();
X#endif
X
X	if((cptr = getenv("HOME")) == NULL)
X	{
X		strcpy(home_dir,"/usr/");
X#if defined(M_XENIX)
X		cuserid(&home_dir[strlen(home_dir)]);
X#endif
X#if defined(pyr)
X		cptr = getlogin();
X		strcpy(&home_dir[strlen(home_dir)],cptr);
X#endif
X#if ((defined(M_XENIX) | defined(pyr)) == 0)
SHAR_EOF
echo "End of part 29"
echo "File z/zcommon.c is continued in part 30"
echo "30" > s2_seq_.tmp
exit 0
-- 
-------------------------------------------------------------------
Warren Tucker, Tridom Corporation       ...!gatech!emory!tridom!wht 
Ker-au'-lo-phon.  An 8-foot partial flue-stop, having metal pipes
surmounted by adjustable rings, and with a hole bored near the top
of each pipe, producing a soft and "reedy" tone.