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

📄 efaxmsg.c

📁 用于使用moden进行传真的源代码
💻 C
字号:
#include <ctype.h>		/* ANSI C */#include <errno.h>#include <stdio.h>#include <string.h>#include <stdarg.h> #include <time.h>#include <limits.h>#include "efaxmsg.h"#define MAXTSTAMP 80		/* maximum length of a time stamp */#if PIPE_BUF>8192#define MAXMSGBUF 4096		/* maximum status/error message bytes held */#else#define MAXMSGBUF PIPE_BUF/2#endif#define NLOG 2char *verb[NLOG] = { "ewin", "" } ;char *argv0 = "" ;int nxtoptind = 1 ;		/* for communication with nextopt() */char *nxtoptarg ;/* For systems without strerror(3) */#ifdef NO_STRERRORextern int sys_nerr;extern char *sys_errlist[];extern char *strerror( int i )       {  return ( i >= 0 && i < sys_nerr ) ? sys_errlist[i] : "Unknown Error" ;}#endif/* Print time stamp. */time_t tstamp ( time_t last, FILE *f ){  time_t now ;  char tbuf [ MAXTSTAMP ] ;  now = time ( 0 ) ;  strftime ( tbuf, MAXTSTAMP,  ( now - last > 600 ) ? "%c" : "%M:%S",	    localtime( &now ) ) ;  fputs ( tbuf, f ) ;  return now ;}/* Return string corresponding to character c. */char *cname ( uchar c ) {#define CNAMEFMT "<0x%02x>"#define CNAMELEN 6+1  static char *cnametab [ 256 ] = { /* character names */  "<NUL>","<SOH>","<STX>","<ETX>", "<EOT>","<ENQ>","<ACK>","<BEL>",  "<BS>", "<HT>", "<LF>", "<VT>",  "<FF>", "<CR>", "<SO>", "<SI>",   "<DLE>","<XON>","<DC2>","<XOFF>","<DC4>","<NAK>","<SYN>","<ETB>",  "<CAN>","<EM>", "<SUB>","<ESC>", "<FS>", "<GS>", "<RS>", "<US>" } ;  static char names[ (127-32)*2 + 129*(CNAMELEN) ] ;  char *p=names ;  static int i=0 ;      if ( ! i ) {    for ( i=32 ; i<256 ; i++ ) {      cnametab [ i ] = p ;      sprintf ( p, i<127 ? "%c" : CNAMEFMT, i ) ;      p += strlen ( p ) + 1 ;    }  }  return cnametab [ c ] ;} /* Print a message with a variable number of printf()-type   arguments if the first character appears in the global   verb[ose] string.  Other leading characters and digits do   additional actions: + allows the message to be continued on   the same line, '-' buffers the message instead of printing it,   E, and W expand into strings, S prints the error message for   the most recent system error, a digit sets the return value, a   space ends prefix but isn't printed.  Returns 0 if no prefix   digit. */enum  msgflags { E=0x01, W=0x02, S=0x04, NOFLSH=0x08, NOLF=0x10 } ;int msg ( char *fmt, ... ) {   static int init=0 ;  static FILE *logfile [ NLOG ] ;  static char msgbuf [ NLOG ] [ MAXMSGBUF ] ;  static time_t logtime [ NLOG ] = { 0, 0 } ;  static int atcol1 [ NLOG ] = { 1, 1 } ;    int err=0, i, flags=0 ;  char *p ;    va_list ap ;  va_start ( ap, fmt ) ;  if ( ! init ) {    logfile[0] = stderr ;    logfile[1] = stdout ;    for ( i=0 ; i<NLOG ; i++ )      setvbuf ( logfile[i], msgbuf[i], _IOFBF, MAXMSGBUF ) ;    cname ( 0 ) ;    init = 1 ;  }    for ( i=0 ; i<NLOG ; i++ ) {    for ( p=fmt ; *p ; p++ ) {      switch ( *p ) {      case ' ': p++ ; goto print ;      case 'E': flags |= E ; break ;      case 'W': flags |= W ; break ;      case 'S': flags |= S ; break ;      case '+': flags |= NOLF ; break ;      case '-': flags |= NOFLSH ; break ;      default: 	if ( isdigit ( *p ) ) {	  err = *p - '0' ; 	} else if ( ! isupper ( *p ) ) {	  goto print ;	}      }    }          print:    if ( strchr ( verb[i], tolower ( *fmt ) ) ) {            if ( atcol1[i] ) {	fprintf ( logfile[i], "%s: ", argv0 ) ;	logtime[i] = tstamp ( logtime[i], logfile[i] ) ; 	fputs ( ( flags & E ) ? " Error: " : 		( flags & W ) ? " Warning: " : 		" ",		logfile[i] ) ;      }      vfprintf( logfile[i], p, ap ) ;      if ( flags & S ) fprintf ( logfile[i], " %s", strerror ( errno ) ) ;      if ( ! ( flags & NOLF ) ) fputs ( "\n", logfile[i] ) ;      atcol1[i] = flags & NOLF ? 0 : 1 ;      if ( ! ( flags & NOFLSH ) ) fflush ( logfile[i] ) ;          }      }    va_end ( ap ) ;    return err ;}/* Simple (one option per argument) version of getopt(3). */int nextopt( int argc, char **argv, char *args ){  char *a, *p ;  if ( nxtoptind >= argc || *(a = argv[nxtoptind]) != '-' ) return -1 ;  nxtoptind++ ;  if ( ! *(a+1) || ( ( p = strchr ( args, *(a+1) ) ) == 0 ) )    return msg ( "Eunknown option (%s)", a ), '?' ;   if ( *(p+1) != ':' ) nxtoptarg = 0 ;  else    if ( *(a+2) ) nxtoptarg = a+2 ;    else      if ( nxtoptind >= argc ) return msg ( "Eno argument for (%s)", a ), '?' ;      else nxtoptarg = argv [ nxtoptind++ ] ;  return *(a+1) ;}

⌨️ 快捷键说明

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