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

📄 doc.c

📁 Fax and soft modem source code. - Slow modem You can use this code to build a soft modem function
💻 C
字号:
/*********************************************************
**********************************************************
	doc.c
**********************************************************
**********************************************************/
/* Modem for MIPS   AJF	  January 1995
   Send a document (T.4), in Group 3 format on stdin */

#include <stdio.h>

#include "modem.h"

#define MAXPAGES 50
#define VERSION	 1

static FILE *g3file;
static int pageptrs[MAXPAGES];	/* ptr to start of page in file */
static int pagebits[MAXPAGES];	/* num. of bits in each page	*/


global void initdoc()
  { g3file = tmpfile();
    if (g3file == NULL) giveup("can't create temporary file");
  }

global void readdoc()
  { /* Copy document from stdin to g3file */
    infomsg("Reading input...");
    int vsn, xres, yres;
    int ni = scanf("!<Group 3> %d %d %d\n", &vsn, &xres, &yres);
    unless (ni == 3 && vsn == VERSION && xres == 200 && (yres == 100 || yres == 200))
      giveup("input is not in Group 3 format");
    if (yres == 200) options |= opt_H;
    numpages = 0;
    int ch = getchar();
    while (ch >= 0 && numpages < MAXPAGES)
      { pageptrs[numpages] = ftell(g3file);
	int nbits = 0;
	/* Transfer one page from stdin to g3file */
	uint prevbits = ~0; int neols = 0;
	while (neols < 5)
	  { if (ch < 0) goto l; /* ignore (we hope, short) partial page */
	    uchar c = ch;
	    for (int j = 0; j < 8 && neols < 5; j++)
	      { prevbits = (prevbits << 1) | (c >> 7);
		c <<= 1; nbits++;
		/* 6 consecutive EOLs mark end of page; note that 2 consec. EOLs never occur in body of page */
		if ((prevbits & 0xffffff) == 0x001001) neols++;
	      }
	    putc(ch, g3file);
	    ch = getchar();
	  }
	pagebits[numpages++] = nbits-72;	/* don't count the RTC in the bit count */
      }
l:  if (ch >= 0) giveup("sorry, too many pages");
    if (fflush(g3file) != 0) giveup("write error on temp file");
  }

global void sendpage(int pn, int scanbits)
  { /* Copy one page from g3file to V.29 */
    if (options & opt_v) fprintf(stderr, ">>> Page %d\n", pn);
    if (pn < 1 || pn > numpages) giveup("bug: bad page page number: %d", pn);
    fseek(g3file, pageptrs[pn-1], 0);
    int nb = 0, lb = 0;
    uint prevbits = ~0;
    while (nb < pagebits[pn-1])
      { uchar c = getc(g3file);
	for (int j = 0; j < 8 && nb < pagebits[pn-1]; j++)
	  { int b = c >> 7;
	    prevbits = (prevbits << 1) | b;
	    if ((prevbits & 0xfff) == 0x001)	/* EOL */
	      { while (lb++ < scanbits) putbit(0);  /* pad scan line to achieve min. scan time */
		lb = 0;
	      }
	    putbit(b);
	    lb++; nb++; c <<= 1;
	  }
      }
    while (lb++ < scanbits) putbit(0);	/* pad final scan line */
    for (int i=0; i<6; i++)		/* send RTC */
      { for (int j=0; j<11; j++) putbit(0);
	putbit(1);
      }
    for (int i=0; i<50; i++) putbit(0); /* flush buffer */
  }

global void receivepage(int pn)
  { /* Copy one page from V.29 to g3file */
    if (options & opt_v) fprintf(stderr, "<<< Page %d\n", pn);
    if (pn < 1) giveup("bug: bad page page number: %d", pn);
    uint prevbits = ~0; int neols = 0;
    while (neols < 5)
      { uchar n; int nb = 0;
	while (nb < 8 && neols < 5)
	  { int b = getbit();
	    prevbits = (prevbits << 1) | b;
	    n = (n << 1) | b;
	    nb++;
	    /* 6 consecutive EOLs mark end of page; note that 2 consec. EOLs never occur in body of page */
	    if ((prevbits & 0xffffff) == 0x001001) neols++;
	  }
	while (nb < 8) { n <<= 1; nb++; }
	putc(n, g3file);
      }
    if (fflush(g3file) != 0) giveup("write error on temp file");
  }

global void writedoc()
  { /* Copy document from g3file to stdout */
    infomsg("Writing output...");
    printf("!<Group 3> %d %d %d\n", VERSION, 200, (options & opt_H) ? 200 : 100);
    rewind(g3file);
    int ch = getc(g3file);
    while (ch >= 0) { putchar(ch); ch = getc(g3file); }
    if (fflush(stdout) != 0) giveup("write error on stdout");
  }

⌨️ 快捷键说明

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