ftp.nice.ch/pub/next/unix/communication/zm_tip_modified.NI.bs.tar.gz#/zm_tip/xfer/zcurses.c

This is zcurses.c in view mode; [Download] [Up]

/*+-------------------------------------------------------------------------
	zcurses.c -- tip file transfer program curses interface
	wht%n4hgf@emory.mathcs.emory.edu

  000000000011111111112222222222333333333344444444445555555550
  012345678901234567890123456789012345678901234567890123456789
00.-[ prog+rev ]-- <dir> ------------------------------------.
01|  ZMODEM_6____  _40_____________________________________  |
02|  File ### of ###: _38__________________________________  |
03|  File position:  _8______ length: _8______  -rwxrwxrwx   |
04|  _55____________________________________________________ | transaction
05|  _55____________________________________________________ | last rx/tx hdr
06|  Comm I/O: rx _8______  tx _8______ bytes                |
07|  Baud rate: _5___ BINARY blklen: _____ comm mode: RAW-g  |
08|  Time:    started: __:__:__ this file: __:__:__ window:  |
09|  __:__:__ elapsed: __:__:__            __:__:__ ________ |
10|  Errors: this file: _3_ total: _4__ files skipped: _3_   |
11|  _55____________________________________________________ |  err str
12|  _55____________________________________________________ |  comment str
13|  _55____________________________________________________ |  remote info
14`----------------------------------------------------------'

  Defined functions:
	clear_area(win,row,col,len)
	clear_area_char(win,row,col,len,fillchar)
	get_elapsed_time(elapsed_seconds)
	get_tod(type,tod)
	mode_map(mode,mode_str)
	report_comm_baud_rate(baud_rate)
	report_error_count()
	report_file_byte_io(count)
	report_file_close()
	report_file_open_length(length)
	report_file_open_mode(file_mode)
	report_file_open_tod()
	report_file_rcv_started(filename,length,last_mod_time,file_mode)
	report_file_send_open(filename,filestat)
	report_init(title)
	report_last_rxhdr(rptstr,error_flag)
	report_last_txhdr(rptstr,error_flag)
	report_mode(mode)
	report_protocol_crc_type(str)
	report_protocol_type(str)
	report_rx_ind(status)
	report_rx_tx_count()
	report_rxblklen(blklen)
	report_rxpos(rxpos)
	report_str(rptstr,error_flag)
	report_top_line(topstr)
	report_transaction(str)
	report_tx_ind(status)
	report_txblklen(blklen)
	report_txpos(txpos)
	report_uninit(sig)
	report_window()
	report_xfer_mode(str)

------------------------------------------------------------------------*/
/*+:EDITS:*/
/*:05-21-1990-16:00-wht@tridom-adapt ecu xfer protocols for tipwht */

#include <curses.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include <signal.h>
#include <time.h>
#include <sys/timeb.h>

#include "zlint.h"
#if defined(__STDC__) || defined(__cplusplus)
# define P_A(s) s
#else
# define P_A(s) ()
#endif

void clear_area P_A((WINDOW *win, int row, int col, int len));
void clear_area_char P_A((WINDOW *win, int row, int col,
			 int len, int fillchar));
#undef P_A

long time();
extern char *tzname[];
struct tm *localtime();

#ifdef IBMPC
#define sTL		0xDA
#define sTR		0xBF
#define sBL		0xC0
#define sBR		0xD9
#define sLT		0xC3	/* left hand T */
#define sRT		0xB4	/* right hand T */
#define sVR		0xB3	/* vertical rule */
#define sHR		0xC4	/* horizontal rule */
#else
#define sTL		'.'
#define sTR		'.'
#define sBL		'`'
#define sBR		'\''
#define sLT		'+'
#define sRT		'+'
#define sVR		'|'
#define sHR		'-'
#endif

#define WIN_LINES	15
#define WIN_COLS	60
#define WIN_TOPY	2
#define WIN_LEFTX	8

extern char curr_dir[];
extern char s128[];
extern char *bottom_label;
extern int Filcnt;
extern int tipsz_flag;	/* tipsz == 1, tiprz == 0 */
extern int skip_count;
extern int npats;
extern long rxpos;
extern int log_packets;
extern long Txpos;
extern long Rxpos;

WINDOW	*win;
int (*original_sigint_handler)();
int (*original_sigquit_handler)();
int (*original_sigterm_handler)();
int curses_installed = 0;		/* curses not yet active */
int this_file_errors;
int total_errors;
int show_window = 0;
long current_seconds = 0;
long start_seconds = 0;
long this_file_start_seconds = 0;
long elapsed_seconds = 0;
unsigned long total_data_chars_xfered = 0L;
unsigned int zcurses_baud_rate = 0;
char s256[256];

#pragma CC_WRITABLE_STRINGS
char *win_template[] =
{
    /*00000000001111111111222222222233333333334444444444555555555 */
  /*01234567890123456789012345678901234567890123456789012345678  */
  /*.----------------------------------------------------------. */
    "                                                          ",  /* 1 */
    "  File ### of ###: _____________________________________  ",  /* 2 */
    "  File position:  ________ length: ________               ",  /* 3 */
    "                                                          ",  /* 4 */
    "  tx: ______________________  rx: ______________________  ",  /* 5 */
    "  Comm I/O: rx ________  tx ________ bytes                ",  /* 6 */
    "  Baud rate: _____ ______ blklen: _____ comm mode: ______ ",  /* 7 */
    "  Time:    started: __:__:__ this file: __:__:__          ",  /* 8 */
    "  __:__:__ elapsed: __:__:__            __:__:__          ",  /* 9 */
    "  Errors: this file: ___ total: ____ files skipped: ___   ",  /* 10 */
    "                                                          ",  /* 11 */
    "                                                          ",  /* 12 */
    "                                                          ",  /* 13 */
  /*`----------------------------------------------------------' */
    (char *)0
    };

/*+-----------------------------------------------------------------------
  char *get_elapsed_time(elapsed_seconds)
  hh:mm:ss returned
  static string address is returned
  ------------------------------------------------------------------------*/
char *get_elapsed_time(elapsed_seconds)
long elapsed_seconds;
{
    static char elapsed_time_str[10];
    long hh,mm,ss;
    
    hh = elapsed_seconds / 3600;
    elapsed_seconds -= hh * 3600;
    mm = elapsed_seconds / 60L;
    elapsed_seconds -= mm * 60L;
    ss = elapsed_seconds;
    
    sprintf(elapsed_time_str,"%02ld:%02ld:%02ld",hh,mm,ss);
    return(elapsed_time_str);
}	/* end of get_elapsed_time */

/*+-----------------------------------------------------------------------
  char *get_tod(type,tod)
  
  time of day types:
  0		hh:mm
  1		hh:mm:ss
  2		mm-dd-yyyy hh:mm
  
  static string address is returned
  if tod != (char *)0, time is returned there too
  ------------------------------------------------------------------------*/
char *
    get_tod(type,tod)
int type;
char *tod;
{
    long cur_time = 0;
    struct tm *lt;			/* local time */
    static char tod_str[32];
#if defined(M_SYS5)
    struct timeb tp;
#endif
    
    cur_time = time((long *)0);
    lt = localtime(&cur_time);
    
    switch(type)
    {
    case 0:
	sprintf(tod_str,"%02d:%02d",lt->tm_hour,lt->tm_min);
	break;
	
    default:
    case 1:
	sprintf(tod_str,"%02d:%02d:%02d",lt->tm_hour,lt->tm_min,lt->tm_sec);
	break;
	
    case 2:
	sprintf(tod_str,"%02d-%02d-%04d %02d:%02d",
		lt->tm_mon + 1,lt->tm_mday,lt->tm_year + 1900,
		lt->tm_hour,lt->tm_min);
	break;
    }
    
    if(tod != (char *)0)
	strcpy(tod,tod_str);
    
    return(tod_str);
}	/* end of get_tod */

/*+-----------------------------------------------------------------------
  mode_map(mode,mode_str)	build drwxrwxrwx string
  ------------------------------------------------------------------------*/
#if __STDC__
char *
mode_map (unsigned short mode, char *mode_str)
#else
char *
    mode_map(mode,mode_str)
unsigned short mode;
char *mode_str;
#endif
{
    register unsigned ftype = mode & S_IFMT;
    register char *rtn;
    static char result[12];
    
    rtn = (mode_str == (char *)0) ? result : mode_str;
    
    /*               drwxrwxrwx */
    /*               0123456789 */
    strcpy(rtn,"----------");
    
    switch(ftype)
    {
    case S_IFIFO:	*rtn = 'p'; break; /* FIFO (named pipe) */
    case S_IFDIR:	*rtn = 'd'; break; /* directory */
    case S_IFCHR:	*rtn = 'c'; break; /* character special */
    case S_IFBLK:	*rtn = 'b'; break; /* block special */
    case S_IFREG:	*rtn = '-'; break; /* regular */
	
#if defined(pyr) || defined(BSD4) || defined(NeXT)
    case S_IFLNK:	*rtn = 'l'; break; /* symbolic link */
    case S_IFSOCK:	*rtn = 's'; break; /* socket */
#endif
	
#if defined(M_SYS5)
    case S_IFNAM:				/* name space entry */
	if(mode & S_INSEM)			/* semaphore */
	{
	    *rtn = 's';
	    break;
	}
	if(mode & S_INSHD)			/* shared memory */
	{
	    *rtn = 'm';
	    break;
	}
#endif
	
    default:		*rtn = '?'; break;	/* ??? */
    }
    
    if(mode & 000400) *(rtn + 1) = 'r';
    if(mode & 000200) *(rtn + 2) = 'w';
    if(mode & 000100) *(rtn + 3) = 'x';
    if(mode & 004000) *(rtn + 3) = 's';
    if(mode & 000040) *(rtn + 4) = 'r';
    if(mode & 000020) *(rtn + 5) = 'w';
    if(mode & 000010) *(rtn + 6) = 'x';
    if(mode & 002000) *(rtn + 6) = 's';
    if(mode & 000004) *(rtn + 7) = 'r';
    if(mode & 000002) *(rtn + 8) = 'w';
    if(mode & 000001) *(rtn + 9) = 'x';
    if(mode & 001000) *(rtn + 9) = 't';
    
    return(rtn);
    
}	/* end of mode_map */

/*+-------------------------------------------------------------------------
  clear_area(win,row,col,len)
  --------------------------------------------------------------------------*/
void
clear_area(win,row,col,len)
WINDOW	*win;
int row;
int col;
int len;
{
    wmove(win,row,col);
    while(len-- > 0)
	waddch(win,' ');
    wmove(win,row,col);
    
}	/* end of clear_area */

/*+-------------------------------------------------------------------------
  clear_area_char(win,row,col,len,fillchar)
  --------------------------------------------------------------------------*/
void
clear_area_char(win,row,col,len,fillchar)
WINDOW	*win;
int row;
int col;
int len;
char fillchar;
{
    wmove(win,row,col);
    while(len-- > 0)
	waddch(win,fillchar);
    wmove(win,row,col);
    
}	/* end of clear_area_char */

/*+-------------------------------------------------------------------------
  report_top_line(topstr)
  top line: row 1 col 17 length 42
  --------------------------------------------------------------------------*/
void
    report_top_line(topstr)
char *topstr;
{
    char s42[42];
    clear_area(win,1,17,42);
    if(strlen(topstr) < 40)
	waddstr(win,topstr);
    else
    {
	strncpy(s42,topstr,40);
	s42[40] = 0;
	waddstr(win,s42);
    }
}	/* end of report_top_line */

/*+-------------------------------------------------------------------------
  report_xfer_mode(modestr)  BINARY/ASCII
  protocol xfer type: row 7 col 20 length 6
  --------------------------------------------------------------------------*/
void
report_xfer_mode(str)
char *str;
{
    char s10[10];
    
    if(strlen(str) > 6)
    {
	strncpy(s10,str,6);
	s10[7] = 0;
	str = s10;
    }
    clear_area(win,7,20,6);
    waddstr(win,str);
    wrefresh(win);
    
}	/* end of report_xfer_mode */

/*+-------------------------------------------------------------------------
  report_protocol_type(str)
  
  protocol type:  row 1 col 3 length 6 string
  --------------------------------------------------------------------------*/
void
report_protocol_type(str)
register char *str;
{
    char s10[10];
    
    if(strlen(str) > 6)
    {
	strncpy(s10,str,6);
	s10[7] = 0;
	str = s10;
    }
    clear_area(win,1,3,6);
    waddstr(win,str);
    wrefresh(win);
    
}	/* end of report_protocol_type */

/*+-------------------------------------------------------------------------
  report_protocol_crc_type(str)
  
  protocol crc type:  row 1 col 9 length 6
  --------------------------------------------------------------------------*/
void
report_protocol_crc_type(str)
register char *str;
{
    char s8[8];
    
    if(strlen(str) > 6)
    {
	strncpy(s8,str,6);
	s8[7] = 0;
	str = s8;
    }
    clear_area(win,1,9,6);
    waddstr(win,str);
    wrefresh(win);
    
}	/* end of report_protocol_crc_type */

/*+-------------------------------------------------------------------------
  report_uninit(sig)
  --------------------------------------------------------------------------*/
void
    report_uninit(sig)
int sig;		/* if -1, called by normal code, else kill() value */
{
    float rate = 0.0;
    float eff = 0.0;
    
    if(curses_installed)
    {
	elapsed_seconds = current_seconds - start_seconds;
	if(elapsed_seconds)
	{
	    rate = (float)total_data_chars_xfered / (float)elapsed_seconds;
	    if(zcurses_baud_rate)
		eff  = 100 * (rate / ((float)zcurses_baud_rate / 10.0));
	}
	if(rate > 0.01)
	{
	    sprintf(s128,"Transfer rate ~= %.0f ch/sec (%.0f%%)",
		    rate,(eff > 0.5) ? eff : 0.0);
	    if(log_packets)
	    {
		write(log_packets,"info: ",6);
		write(log_packets,s128,strlen(s128));
		write(log_packets,"\n",1);
	    }
	    report_top_line(s128);
	}
	report_file_byte_io(0L);
	report_rx_tx_count();
	wmove(win,WIN_LINES - 1,WIN_COLS - 1);
	wrefresh(win);
	endwin();
	fprintf(stderr,"\r\n\r\n\r\n");
	fflush(stderr);
	curses_installed = 0;
    }
    
}	/* end of report_uninit */

/*+-------------------------------------------------------------------------
  report_init(title)
  "top line": row 1 col 11 len 21
  file quan:  row 2 col 15 len  3
  row 2 col 12 len  7 clear "of ###"
  start time: row 8 col 21 len  8
  "window:"   row 8 col 50 len  7
  --------------------------------------------------------------------------*/
void
    report_init(title)
char *title;
{
    register int itmp;
    register char *cptr;
    char buf[80];
    
    if(curses_installed)
	return;
    
    initscr();
    crmode();
    noecho();
    nonl();
    clear();
    curses_installed = 1;
    win = newwin(WIN_LINES,WIN_COLS,WIN_TOPY,WIN_LEFTX);
    box(win,sVR,sHR);
    wmove(win,0,0); waddch(win,sTL);
    wmove(win,win->_maxy - 1,0); waddch(win,sBL);
    wmove(win,win->_maxy - 1,win->_maxx - 1); waddch(win,sBR);
    wmove(win,0,win->_maxx - 1); waddch(win,sTR);
    wmove(win,0,2);
    wstandout(win);
    waddch(win,'[');
    waddch(win,' ');
    waddstr(win,title);
    waddch(win,' ');
    waddch(win,']');
    wstandend(win);
    waddch(win,sHR);
    waddch(win,sHR);
    waddch(win,' ');
    itmp = WIN_COLS - 2 - 7 - strlen(title);
    curr_dir[itmp] = 0;
    waddstr(win,curr_dir);
    waddch(win,' ');
    if(bottom_label)
    {
	strncpy(buf,bottom_label,WIN_COLS - 6);
	buf[WIN_COLS - 6] = 0;
	wmove(win,WIN_LINES - 1,2);
	waddch(win,' ');
	waddstr(win,buf);
	waddch(win,' ');
    }
    
    itmp = 0;
    while(1)
    {
	if(win_template[itmp] == (char *)0)
	    break;
	wmove(win,itmp + 1,1);
	waddstr(win,win_template[itmp++]);
    }
    if(tipsz_flag)
    {
	clear_area(win,2,15,3);
	sprintf(s128,"%3d",npats);
	waddstr(win,s128);
    }
    else	/* tiprz */
    {
	clear_area(win,2,11,8);	/* clear "of ###" */
	waddstr(win,":");
    }
    
    clear_area(win,1,11,21);
    report_error_count();
    clear_area(win,8,21,8);		/* starting time */
    waddstr(win,get_tod(1,(char *)0));
    start_seconds = time((long *)0);
    current_seconds = start_seconds;
    
    if(show_window)
    {
	wmove(win,8,50);
	waddstr(win,"window:");
	wmove(win,9,50);
	waddstr(win,"+0");
    }
    
    wrefresh(win);
    
}	/* end of report_init */

/*+-------------------------------------------------------------------------
  report_rx_ind(status)
  --------------------------------------------------------------------------*/
void
    report_rx_ind(status)
int status;
{
#if defined(M_SYS5)
    wmove(win,1,54);
    waddch(win,(status) ? 'R' : ' ');
    wmove(win,1,54);
    wrefresh(win);
#endif
}	/* end of report_rx_ind */

/*+-------------------------------------------------------------------------
  report_tx_ind(status)
  --------------------------------------------------------------------------*/
void
    report_tx_ind(status)
int status;
{
#if defined(M_SYS5)
    wmove(win,1,56);
    waddch(win,(status) ? 'T' : ' ');
    wmove(win,1,56);
    wrefresh(win);
#endif
}	/* end of report_tx_ind */

/*+-------------------------------------------------------------------------
  report_window() - if enable, show open widow size
  --------------------------------------------------------------------------*/
void
    report_window()
{
    if(show_window)
    {
	long ltmp;
	wmove(win,9,50);
	if((ltmp = (Txpos - Rxpos)) > 999999L)
	    waddstr(win,">+999999");
	else if(ltmp < -999999L)
	    ;
	else
	{
	    sprintf(s128,"%+-8ld",ltmp);
	    waddstr(win,s128);
	    if(log_packets)
	    {
		write(log_packets,"window: ",8);
		write(log_packets,s128,strlen(s128));
		write(log_packets,"\n",1);
	    }
	}
    }
}	/* end of report_window */

/*+-------------------------------------------------------------------------
  report_rx_tx_count()
  
  This procedure may be counted upon to perform wrefresh(win)
  
  rx char count:          row 6 col 16 len 8 unsigned long
  tx char count:          row 6 col 29 len 8 unsigned long
  session elapsed time:   row 9 col 21 len 8
  this file elapsed time: row 9 col 41 len 8
  current tod:            row 9 col  3 len 8
  window:                 row 9 col 50 len 8
  --------------------------------------------------------------------------*/
void
report_rx_tx_count()
{
    extern unsigned long rx_char_count;
    extern unsigned long tx_char_count;
    
    register char *cptr;
    
    sprintf(s128,"%8ld",rx_char_count);
    wmove(win,6,16);
    waddstr(win,s128);
    sprintf(s128,"%8ld",tx_char_count);
    wmove(win,6,29);
    waddstr(win,s128);
    
    /* now time of day */
    wmove(win,9,3);
    cptr = get_tod(1,(char *)0);
    waddstr(win,cptr);
    current_seconds = time((long *)0);
    elapsed_seconds = current_seconds - start_seconds;
    cptr = get_elapsed_time(elapsed_seconds);
    wmove(win,9,21);
    waddstr(win,cptr);
    if(this_file_start_seconds)
	elapsed_seconds = current_seconds - this_file_start_seconds;
    else
	elapsed_seconds = 0;
    cptr = get_elapsed_time(elapsed_seconds);
    wmove(win,9,41);
    waddstr(win,cptr);
    
    report_window();
    
    wrefresh(win);		/* calling procs expect this to occur always */
    
}	/* end of report_rx_tx_count */

/*+-------------------------------------------------------------------------
  report_mode(mode)
  
  comm mode row 7 col 52 length 6
  3: save old tty stat, set raw mode with flow control
  2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g
  1: save old tty stat, set raw mode 
  0: restore original tty mode
  --------------------------------------------------------------------------*/
void
    report_mode(mode)
int mode;
{
    char *cptr;
    char tmp[8];
    
    clear_area(win,7,52,6);
    switch(mode)
    {
    case 0:
	cptr = "NORMAL";
	break;
    case 1:
	cptr = "RAW";
	break;
    case 2:
	cptr = "RAW-g";
	break;
    case 3:
	cptr = "RAW-f";
	break;
    default:
	sprintf(tmp,"%5u",mode);
	cptr = tmp;
    }
    waddstr(win,cptr);
    wrefresh(win);
    if(log_packets)
    {
	write(log_packets,"mode: ",6);
	write(log_packets,cptr,strlen(cptr));
	write(log_packets,"\n",1);
    }
    
}	/* end of report_mode */

/*+-------------------------------------------------------------------------
  report_rxblklen(blklen) 
  row 7 col 35 5 chars
  --------------------------------------------------------------------------*/
void
    report_rxblklen(blklen)
int blklen;
{
    char tmp[10];
    
    sprintf(tmp,"%5u",blklen);
    clear_area(win,7,35,5);
    waddstr(win,tmp);
    wrefresh(win);
}	/* end of report_rxblklen */

/*+-------------------------------------------------------------------------
  report_txblklen(blklen) 
  row 7 col 35 5 chars
  --------------------------------------------------------------------------*/
void
    report_txblklen(blklen)
int blklen;
{
    report_rxblklen(blklen);
}	/* end of report_txblklen */

/*+-------------------------------------------------------------------------
  report_rxpos(rxpos) row 3 col 19 len 8
  --------------------------------------------------------------------------*/
void
    report_rxpos(rxpos)
long rxpos;
{
    int i;
    char tmp[16];
    char rdchar;
    if(
#if defined(M_SYS5)
       rdchk(0)
#else
       !ioctl(0,FIONREAD,&i) && i
#endif
       )
    {
	read(0,&rdchar,1);
	rdchar &= 0x7f;
	if(rdchar == 0x0C || rdchar == 0x012)	/* ^L or ^R */
	{
	    touchwin(stdscr);
	    wrefresh(stdscr);
	    touchwin(win);
	    wrefresh(win);
	}
    }
    
    if((rxpos > 99999999L) || (rxpos < 0L))
	return;
    
    sprintf(tmp,"%8lu",rxpos);
    wmove(win,3,19);
    waddstr(win,tmp);
    wrefresh(win);
    report_rx_tx_count();	/* which will do a refresh */
}	/* end of report_rxpos */

/*+-------------------------------------------------------------------------
  report_txpos(txpos)
  --------------------------------------------------------------------------*/
void
    report_txpos(txpos)
long txpos;
{
    report_rxpos(txpos);
}	/* end of report_txpos */

/*+-------------------------------------------------------------------------
  report_error_count()
  DOES NOT PERFORM A REFRESH CYCLE
  
  this file: row 10 col 22 len 3
  total:     row 10 col 33 len 4
  skipped:   row 10 col 53 len 3
  --------------------------------------------------------------------------*/
void
report_error_count()
{
    char tmp[16];
    
    wmove(win,10,22);
    sprintf(tmp,"%3d",this_file_errors);
    if(this_file_errors)
	wstandout(win);
    waddstr(win,tmp);
    if(this_file_errors)
	wstandend(win);
    
    wmove(win,10,33);
    sprintf(tmp,"%4d",total_errors);
    if(total_errors)
	wstandout(win);
    waddstr(win,tmp);
    if(total_errors)
	wstandend(win);
    
    wmove(win,10,53);
    sprintf(tmp,"%3d",skip_count);
    waddstr(win,tmp);
    wrefresh(win);
    
}	/* end of report_error_count */

/*+-------------------------------------------------------------------------
  report_last_txhdr(rptstr,error_flag)
  5,7,22
  --------------------------------------------------------------------------*/
void
    report_last_txhdr(rptstr,error_flag)
register char *rptstr;
int error_flag;
{
    char s24[24];
    
    if(log_packets)
    {
	write(log_packets,"tx:   ",6);
	write(log_packets,rptstr,strlen(rptstr));
	write(log_packets,"\n",1);
    }
    
    if(strlen(rptstr) > 22)
    {
	strncpy(s24,rptstr,22);
	s24[23] = 0;
	rptstr = s24;
    }
    clear_area(win,5,7,22);
    waddstr(win,rptstr);
    
    if(error_flag)
    {
	++this_file_errors;
	++total_errors;
	report_error_count();
    }
    
}	/* end of report_last_txhdr */

/*+-------------------------------------------------------------------------
  report_last_rxhdr(rptstr,error_flag)
  5,35,22
  --------------------------------------------------------------------------*/
void
    report_last_rxhdr(rptstr,error_flag)
register char *rptstr;
int error_flag;
{
    char s24[24];
    extern int log_packets;
    
    if(log_packets)
    {
	write(log_packets,"rx:   ",6);
	write(log_packets,rptstr,strlen(rptstr));
	write(log_packets,"\n",1);
    }
    
    if(strlen(rptstr) > 22)
    {
	strncpy(s24,rptstr,22);
	s24[23] = 0;
	rptstr = s24;
    }
    clear_area(win,5,35,22);
    waddstr(win,rptstr);
    
    if(error_flag)
    {
	++this_file_errors;
	++total_errors;
	report_error_count();
    }
    report_window();
    
}	/* end of report_last_rxhdr */

/*+-------------------------------------------------------------------------
  report_str(rptstr,error_flag) row 11/12 col 3 len 55
  
  error_flag == 0 for status/progress message
  == 1 for bump error count, unless rptstr is null
  in which case, merely clear error string area
  == 2 write string on bottom line (not an error)
  == 3 write string on transaction line (not an error)
  == -1 use error line but do not bump error count
  --------------------------------------------------------------------------*/
void
    report_str(rptstr,error_flag)
register char *rptstr;
int error_flag;
{
    char s60[60];
    extern int log_packets;
    
    if(strlen(rptstr) > 55)
    {
	strncpy(s60,rptstr,55);
	s60[55] = 0;
	rptstr = s60;
    }
    
    switch(error_flag)
    {
    case 0:
	clear_area(win,12,3,55);
	break;
    case 1:
	++this_file_errors;
	++total_errors;
	report_error_count();
    case -1:
	clear_area(win,11,3,55);
	break;
    case 2:
	clear_area(win,13,3,55);
	break;
    case 3:
	clear_area(win,4,3,55);
	break;
    }
    
    waddstr(win,rptstr);
    wrefresh(win);
    
    if(log_packets)
    {
	write(log_packets,"info: ",6);
	write(log_packets,rptstr,strlen(rptstr));
	write(log_packets,"\n",1);
    }
    
}	/* end of report_str */

/*+-------------------------------------------------------------------------
  report_transaction()
  --------------------------------------------------------------------------*/
void
    report_transaction(str)
char *str;
{
    report_str(str,3);
}	/* end of report_transaction */

/*+-------------------------------------------------------------------------
  report_file_open_tod() -- time of start of this file
  
  this file open time: row 8 col 41 length 8
  --------------------------------------------------------------------------*/
void
    report_file_open_tod()
{
    clear_area(win,8,41,8);
    this_file_start_seconds = time((long *)0);
    waddstr(win,get_tod(1,(char *)0));
    wrefresh(win);
}	/* end of report_file_open_tod */

/*+-------------------------------------------------------------------------
  report_file_open_mode(file_mode)
  mode map: row 4 col 46 len 10
  --------------------------------------------------------------------------*/
void
#ifdef __STDC__
report_file_open_mode(unsigned short file_mode)
#else
report_file_open_mode(file_mode)
unsigned short file_mode;
#endif
{
    clear_area(win,3,46,10);
    waddstr(win,mode_map(file_mode,(char *)0));
    wrefresh(win);
}	/* end of report_file_open_mode */

/*+-------------------------------------------------------------------------
  report_file_open_length(long_length)
  length:   row 3 col 36 len  8
  --------------------------------------------------------------------------*/
void
report_file_open_length(length)
long length;
{
    clear_area(win,3,36,8);
    if(length <= 0)
	waddstr(win,"unknown");
    else
    {
	sprintf(s128,"%8lu",length);
	waddstr(win,s128);
    }
    wrefresh(win);
}	/* end of report_file_open_length */

/*+-------------------------------------------------------------------------
  report_file_send_open(filename,filestat)
  
  filename: row 2 col 20 len 38
  number:   row 2 col 8 len 3
  length:   row 3 col 36 len  8
  mode:     row 3 col 46 len 10
  time of start of this file: row 4 col 47 length 8 hh:mm:ss
  --------------------------------------------------------------------------*/
void
    report_file_send_open(filename,filestat)
char *filename;
struct stat *filestat;
{
    char s50[50];
    register char *cptr = filename;
    
    if(log_packets)
    {
	write(log_packets,"file: ",6);
	write(log_packets,filename,strlen(filename));
	write(log_packets,"\n",1);
    }
    
    /* number */
    clear_area(win,2,8,3);
    sprintf(s50,"%3d",Filcnt);
    waddstr(win,s50);
    
    /* filename */
    if(strlen(filename) > 38)
    {
	strncpy(s50,filename,38);
	s50[39] = 0;
	cptr = s50;
    }
    clear_area(win,2,20,38);
    waddstr(win,cptr);
    
    /* length */
    report_file_open_length(filestat->st_size);
    
    /* mode */
    report_file_open_mode(filestat->st_mode);
    
    /* time of start of this file */
    report_file_open_tod();
    
    this_file_errors = 0;
    report_error_count();
}	/* end of report_file_send_open */

/*+-------------------------------------------------------------------------
  report_file_rcv_started(filename,length,last_mod_time,file_mode)
  
  filenumber: row 2 col  8 len  3
  row 2 col 12 len  7 clear "of ###"
  filename:   row 2 col 20 len 38
  --------------------------------------------------------------------------*/
void
#ifdef __STDC__
report_file_rcv_started(char *filename, long length,
			long last_mod_time, unsigned short file_mode)
#else
report_file_rcv_started(filename,length,last_mod_time,file_mode)
char *filename;
long length;					/* if < 0, "UNKNOWN" */
long last_mod_time;			/* not currently displayed */
unsigned short file_mode;		/* UNIX file modifier or zero */
#endif
{
    register char *cptr;
    char s50[50];
    
    if(log_packets)
    {
	write(log_packets,"file: ",6);
	write(log_packets,filename,strlen(filename));
	write(log_packets,"\n",1);
    }
    
    /* filename */
    if(strlen(filename) > 38)
    {
	strncpy(s50,filename,38);
	s50[39] = 0;
	cptr = s50;
    }
    else
	cptr = filename;
    
    clear_area(win,2,20,38);
    waddstr(win,cptr);
    
    /* file number */
    clear_area(win,2,8,3);
    sprintf(s50,"%3d",Filcnt);	/* rz uses as file number 1-n */
    waddstr(win,s50);
    
    /* if remote sender provides a file count, display it */
    if(npats)
    {
	clear_area(win,2,12,7);	/* clear "of ###" */
	sprintf(s50,"of %3d:",npats);
	waddstr(win,s50);
    }
    
    /* length */
    report_file_open_length(length);
    
    /* mode */
    report_file_open_mode(file_mode);
    
    /* time of start of this file */
    report_file_open_tod();
    
    this_file_errors = 0;
    report_error_count();
}	/* end of report_file_rcv_started */

/*+-------------------------------------------------------------------------
  report_file_close()
  --------------------------------------------------------------------------*/
void report_file_close()
{
    if(show_window)
    {
	clear_area(win,9,50,8);
	waddstr(win,"+0");
	Txpos = 0;
	Rxpos = 0;
    }
    
    report_str("End of file",0);
    wrefresh(win);
    this_file_start_seconds = 0;
    
}	/* end of report_file_close */

/*+-------------------------------------------------------------------------
  report_comm_baud_rate(baud_rate)
  
  baud rate: row 7 col 14 length 5
  --------------------------------------------------------------------------*/
void
report_comm_baud_rate(baud_rate)
unsigned int baud_rate;
{
    char tstr8[8];
    
    zcurses_baud_rate = baud_rate;
    clear_area(win,7,14,5);
    if(baud_rate == 0)
	waddstr(win,"?");
    else
	
    {
	sprintf(tstr8,"%5u",baud_rate);
	waddstr(win,tstr8);
    }
    wrefresh(win);
    
}	/* end of report_comm_baud_rate */

/*+-------------------------------------------------------------------------
  report_file_byte_io(count)
  --------------------------------------------------------------------------*/
void
report_file_byte_io(count)
long count;
{
    
    total_data_chars_xfered += (long)count;
    if(total_data_chars_xfered)
    {
	sprintf(s128,"Total file bytes transferred: %lu",
		total_data_chars_xfered);
	report_str(s128,-1);
    }
    
}	/* end of report_file_byte_io */

#pragma CC_NON_WRITABLE_STRINGS
/* end of zcurses.c */
/* vi: set tabstop=4 shiftwidth=4: */

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.