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

📄 efaxlib.c.orig

📁 用于使用moden进行传真的源代码
💻 ORIG
📖 第 1 页 / 共 5 页
字号:
	if ( ( c = fgetc ( f->f ) ) == EOF )  {	  x = ( x << 15 ) | 1 ; shift += 15 ;  /* EOL pad at EOF */	  npad++ ;	} else {	  if ( reverse ) c = normalbits [ c & 0xff ] ;	  x = ( x <<  8 ) | c ; shift +=  8 ; 	}      }      t = tab + ( ( x >> shift ) & 0x1ff ) ;      tab = t->next ;      shift -= t->bits ;    } while ( ! t->code ) ;    if ( p < maxp ) *p++ = t->code ;  } while ( t->code != -1 ) ;  d->x = x ; d->shift = shift ; d->tab = tab ; /* save state */  if ( npad > 1 ) msg ("W EOF before RTC" ) ;  if ( p >= maxp ) msg ( "W run length buffer overflow" ) ;  /* combine make-up and terminating codes and remove +1 offset     in run lengths */  n = p - runs - 1 ;  for ( p = q = runs ; n-- > 0 ; )    if ( *p > 64 && n-- > 0 ) {      len += *q++ = p[0] + p[1] - 2 ;      p+=2 ;    } else {      len += *q++ = *p++ - 1 ;    }  n = q - runs ;    /* check for RTC and errors */  if ( len )    d->eolcnt = 0 ;  else    if ( ++(d->eolcnt) >= RTCEOL ) err = EOF ;  if ( c == EOF ) {    if ( ferror ( f->f ) ) {      err = -msg ("ES2error reading fax file:") ;    } else {       err = -2 ;    }  }  if ( pels ) *pels = len ;    return err ? err : n ;}/* Read a PCX compressed bit-map */int readpcx ( char *p, int len, IFILE *f ){  int err=0, n, c ;  while ( !err && len > 0 ) {    if ( ( c = fgetc ( f->f ) ) < 0 ) {      err = msg ( "ES2 PCX read failed" ) ;    } else {      if ( ( c & 0xc0 ) == 0xc0 ) {	/* a run count */   	n = c & 0x3f ;   	c = fgetc ( f->f ) ;   	if ( ( c = fgetc ( f->f ) ) < 0 ) {   	  err = msg ( "ES2 PCX read failed" ) ;   	} else {   	  memset ( p, c, n <= len ? n : len ) ;   	  p += n ;   	  len -= n ;   	}      } else {			/* bits 0 to 7 are image data */	*p++ = c ;	len-- ;      }    }  }  if ( len != 0 )    msg ( "W PCX run-length coding error" ) ;  return err ;}/* Read a scan line from the current page of IFILE f.  Stores   number of runs in runs and line width in pels if not null.   Pages ends at EOF. Text pages also end if a complete text line   would not fit or if the line contains a formfeed character.   PBM pages also end when all lines in the bitmap have been   read. Fax pages also end at RTC. Returns number of runs stored   or EOF at end of page. */int readline ( IFILE *f, short *runs, int *pels ){  int nr = 0, nb ;  uchar bits [ MAXBITS ] ;  if ( f->lines != 0 ) {	/* -1 allowed as well */    switch ( f->page->format ) {    case P_TEXT :      if ( f->txtlines <= 0 ) {	/* need another text line */	if ( fgets ( f->text, MAXLINELEN, f->f ) ) {	  f->txtlines = f->charh ;	  if ( strchr ( f->text, FF ) ) {	    f->lines = 0 ;	/* no more lines in this page */	    nr = EOF ;		/* don't return any */	  } 	} else {	  nr = EOF ;	}      }      if ( nr != EOF ) {	nr = texttorun ( (uchar*) f->text, f->font, f->charh - f->txtlines, 			f->charw, f->charh, f->lmargin,			runs, pels ) ;	f->txtlines-- ;      }       break ;    case P_RAW:    case P_PBM:      if ( fread ( bits, 1, f->page->w/8, f->f ) != f->page->w/8 ) {	nr = EOF ;      } else {	nr = bittorun ( bits, f->page->w/8, runs ) ;	if ( pels ) *pels = f->page->w ;      }      break ;    case P_FAX:      nr = readruns ( f, runs, pels ) ;      break ;          case P_PCX:      nb = ( ( f->page->w + 15 ) / 16 ) * 2 ;	/* round up */      if ( readpcx ( bits, nb, f ) != 0 ) {	nr = EOF ;      } else {   	nr = bittorun ( bits, nb, runs ) ;	if ( pels ) *pels = f->page->w ;      }      break ;          }  } else {    nr = EOF ;  }    if ( nr >= 0 && f->page->black_is_zero ) { /* invert */    nr = xinvert ( runs, nr ) ;  }  if ( nr >= 0 && f->lines > 0 ) f->lines-- ;    return nr ;}/* Deduce the file type by scanning buffer p of n bytes. */   int getformat ( uchar *p, int n ){  int format = 0 ;  /* figure out file type if not already set */  if ( ! format && n < 2 ) {    format = I_TEXT ;    msg ( "W only read %d byte(s) from input file, assuming text",  n ) ;  }   if ( ! format && ! p[0] && ! ( p[1] & 0xe0 ) ) {    format = I_FAX ;  }   if ( ! format && ! strncmp ( p, "P4", 2 ) ) {    format = I_PBM ;  }  if ( ! format && n >= 128 && p[0] == 0x0a &&        strchr ("\02\03\05", p[1] ) && p[2] <= 1 ) {    if ( p[65] != 1 ) {      msg ( "E can't read colour PCX" ) ;    } else {      format = p[2] ? I_PCX : I_PCX ;    }  }  if ( ! format && ! strncmp ( p, "%!", 2 ) ) {    msg ( "W Postscript input file will be treated as text" ) ;  }  if ( ! format && ( p[0] == 'M' || p[1] == 'I' ) && ( p[1] == p[0] ) ) {    format = I_TIFF ;  }    if ( ! format &&       ( p[0] == 0x3a && p[1] == 0xde && 	 p[2] == 0x68 && p[3] == 0xb1) ) {    format = I_DCX ;  }    if ( ! format &&  n ) { /* "90% printable" heuristic */    int i, nprint = 0 ;    for ( i=0 ; i<n ; i++ ) {      if ( isspace ( p[i] ) || isprint ( p[i] ) ) {	nprint++ ;      }    }    if ( ( nprint / (float) n ) > 0.90 ) {      format = I_TEXT ;    }  }  return format ;}/* initialize page descriptor */void page_init ( PAGE *p, char *fn ){  p->fname = fn ;  p->offset = 0 ;  p->w = DEFWIDTH ;  p->h = DEFHEIGHT ;  p->xres = DEFXRES ;  p->yres = DEFYRES ;  p->format = P_FAX ;  p->revbits = 0 ;  p->black_is_zero = 0 ;}void page_report ( PAGE *p, int fmt, int n ){  msg ( "F page %d : %s + %ld : %dx%d @ %.fx%.f dpi %s/%s", 	n, 	p->fname, p->offset, p->w, p->h, 	p->xres, p->yres, 	iformatname [fmt], pformatname [p->format] ) ;}	/* File handling for undefined file types */#define auto_first 0#define auto_next 0/* File handling for TIFF files */#define tiff_reset 0 /* Name of TIFF tag 'tag'. */char *tagname ( int tag ){  static struct tagnamestruct {  int code ;  char *name ; }   tagnames [] = {  { 256, "width" },  { 257, "length" },  { 258, "bits/sample" },  { 259, "compresssion(g3=3)" },  { 262, "photometric(0-min=white)" },  { 266, "fill order(msb2lsb=1)" },  { 273, "strip offsets" },  { 274, "orientation(1=normal)" },  { 277, "samples/pixel" },  { 278, "rows/strip" },  { 279, "strip byte counts" },  { 282, "xresolution" },  { 283, "yresolution" },  { 284, "storage(1=single plane)" },  { 292, "g3options" },  { 296, "resolution units(2=in,3=cm)" },  { 297, "page number" },  { 327, "clean fax(0=clean/1=regen/2=errors)" },  {0,0} },  *p ;    for ( p=tagnames ; p->code ; p++ )    if ( tag == p->code ) break ;  return p->code ? p->name :  "unknown tag" ;}/* Read 2- or 4-byte integers from a file and correct for file   endianness.  Returns 0 if OK, 1 on error. */int fread2 ( unsigned short *p, IFILE *f ){  int err=0 ;  uchar c[2] ;  err = fread ( c, 1, 2, f->f ) == 2 ? 0 : 1 ;    *p = f->bigend ?    c[0] << 8 | c[1] << 0 :    c[1] << 8 | c[0] << 0 ;      return err ;}int fread4 ( unsigned long *p, IFILE *f ){  int err=0 ;  uchar c[4] ;  err = fread ( c, 1, 4, f->f ) == 4 ? 0 : 1 ;    *p = f->bigend ?    c[0] << 24 | c[1] << 16 | c[2] << 8 | c[3] << 0 :    c[3] << 24 | c[2] << 16 | c[1] << 8 | c[0] << 0 ;      return err ;}/* Read a TIFF directory at current file offset, save image   format information and seek to next directory if any.  Returns   0 if OK, 2 on errors. */int tiff_next ( IFILE *f ){  int err=0 ;  unsigned short ntag, tag, type ;  unsigned long count, tv ;  double ftv ;  msg ( "F+ TIFF directory at %ld", ftell ( f->f ) ) ;  if ( fread2 ( &ntag, f ) ) {    err = msg ( "E2can't read TIFF tag count" ) ;  } else {    msg ( "F+  with %d tags", (int) ntag ) ;  }  for ( ; ! err && ntag > 0 ; ntag-- ) {    err = err || fread2 ( &tag, f ) ;    err = err || fread2 ( &type, f ) ;    err = err || fread4 ( &count, f ) ;    if ( type == 3 ) {		      /* left-aligned short */      unsigned short a, b ;      err = err || fread2 ( &a, f ) ;      err = err || fread2 ( &b, f ) ;      tv = a ;    } else {			      /* long or offset to data */      err = err || fread4 ( &tv, f ) ;    }    if ( type == 5 ) {		      /* float as ratio in directory data */      long a, b, where=0 ;      err = err || ( ( where = ftell ( f->f ) ) < 0 ) ;      err = err || fseek ( f->f, tv, SEEK_SET ) ;      err = err || fread4 ( &a, f ) ;      err = err || fread4 ( &b, f ) ;      err = err || fseek ( f->f, where, SEEK_SET ) ;      ftv = (float) a / ( b ? b : 1 ) ;    } else {       ftv = 0.0 ;    }    if ( err ) {      err = msg ( "ES2can't read TIFF tag" ) ;      continue ;    }    #ifdef TIFF_DEBUG    {      char *tagtype[] = { "none", "byte", "ascii", "short", "long", "ratio" } ;      msg ( "F  %3d %-5s tag %s %5ld (%3d:%s)", 	    count,	    type <= 5 ? tagtype[type] : "other",	    count > 1 ? "@" : "=",	    type == 5 ? (long) ftv : tv, tag, tagname(tag) ) ;     }#endif    switch ( tag ) {    case 256 :			/* width */      f->page->w = tv ;      break ;    case 257 :			/* height */      f->page->h = tv ;      break ;    case 259 :			/* compression: 1=none, 3=G3 */      if ( tv == 1 ) {	f->page->format = P_RAW ;      } else if ( tv == 3 ) {	f->page->format = P_FAX ;      } else {	err = msg ( "E2can only read TIFF/G3 or TIFF/uncompressed" ) ;      }      break ;    case 262 :			/* photometric interpretation */      f->page->black_is_zero = tv ;      break ;    case 266 :			/* fill order */      f->page->revbits = ( tv == 2 ? 1 : 0 ) ;      break ;    case 273 :			/* data offset */      if ( count != 1 )	err = msg ( "E2can't read multi-strip TIFF files" ) ;      else	f->page->offset = tv ;      break ;    case 282 :			/* x resolution */      f->page->xres = ftv ;      break ;    case 283 :			/* y resolution */      f->page->yres = ftv ;      break ;    case 292 :			/* T4 options: 1=2D, 2=uncompressed */      if ( tv & 0x1 )	err = msg ( "E2can't read 2D compressed TIFF-F file" ) ;      if ( tv & 0x2 )	err = msg ( "E2can't read uncompressed TIFF-F file" ) ;      break ;    case 296 :			/* units: 2=in, 3=cm */      if ( tv == 3 ) {	f->page->xres *= 2.54 ;	f->page->yres *= 2.54 ;      }      break ;    }  } /* end of tag reading loop */  if ( f->page->format == I_AUTO ) {    msg ( "W missing TIFF compression format, set to raw" ) ;    f->page->format = P_RAW ;  }    if ( ! err ) {    if ( fread4 ( &(f->next), f ) ) {      err = msg ( "E2can't read offset to next TIFF directory" ) ;    } else {      if ( f->next ) {	msg ( "F , next directory at %ld.", f->next ) ;	if ( fseek ( f->f, f->next, SEEK_SET ) )	  err = msg ( "ES2 seek to next TIFF directory failed" ) ;      } else {	msg ( "F , last image." ) ;      }    }  }  if ( ! f->page->offset )    err = msg ( "E2 missing offset to TIFF data" ) ;  return err ;}int tiff_first ( IFILE *f ){  short magic, version ;  fread ( (uchar*) &magic, 1, 2, f->f ) ;  f->bigend = ( *(uchar*) &magic == 'M' ) ? 1 : 0 ;

⌨️ 快捷键说明

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