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

📄 rfxtopcx.c

📁 一系列包含串口、Modem、收发传真、终端仿真等方面的编程例子
💻 C
📖 第 1 页 / 共 3 页
字号:
                  return(18);
              else
               /* 0000000 */
               return(SEVENOHS);
       }

struct header_s
	{
	unsigned char mfgr;
	unsigned char version;
	unsigned char encoding;
	unsigned char bppix;
	unsigned short xmin;
	unsigned short ymin;
	unsigned short xmax;
	unsigned short ymax;
	unsigned short hdpi;
	unsigned short vdpi;
	unsigned char cmap[48];
	unsigned char reserved;
	unsigned char nplanes;
	unsigned short bypl;
	unsigned short paltinf;
	unsigned short hscrnsz;
	unsigned short vscrnsz;
	unsigned char filler[54];
	};

int pcxfd, pagelines;
struct header_s header;

pcxwriteheader()
	{
	int i;
	header.mfgr=10;
	header.version=45;
	header.encoding=1;
	header.bppix=1;
	header.xmin=0;
	header.ymin=0;
	header.xmax=1727;
	header.ymax=pagelines-1;
	header.hdpi=200;
	header.vdpi=192;
	header.reserved=0;
	header.nplanes=1;
	header.bypl=216;
	header.paltinf=1;
	header.hscrnsz=0;
	header.vscrnsz=0;
	for(i=0;i<54;++i)
		header.filler[i]=0;
	lseek(pcxfd, (long)0, SEEK_SET);
	if(write(pcxfd, &header, 128)!=128)
		{
		printf("Error overwriting final pcx file header.\n");
		exit(9);
		}
	}

unsigned char fcfr[]="+FCFR\r\n\r\n";
unsigned char fhng[]="+FHNG";
unsigned char connect[]="CONNECT\r\n";

int scanfcfr()
	{
	int i, j, k;
	unsigned char c;
	i=j=k=0;
	while(read(rfxfd, &c, 1))
		{
		if(fcfr[i]==c)
			{
			i++;
			if(fcfr[i]=='\0')
				return(1);
			}
		else
			i=0;
		if(connect[k]==c)
			{
			k++;
			if(connect[k]=='\0')
				return(0);
			}
		else
			k=0;
		if(fhng[j]==c)
			{
			j++;
			if(fhng[j]=='\0')
				{
				printf("End of document. Exit code +FHNG");
				while(1)
					{
					if(!read(rfxfd, &c, 1))
						{
						printf("\nPremature end of file while seeking +FHNG code.\n");
						exit(6);
						}
					putchar(c);
					if(c=='\n')
						break;
					}
				exit(0);
				}
			}
		else
			j=0;
		}
	printf("Premature end of file while seeking +FCFR.\n");
	exit(5);
	}

int scanconnect()
	{
	int i;
	unsigned char c;
	i=0;
	while(read(rfxfd, &c, 1))
		{
		if(connect[i]==c)
			{
			i++;
			if(connect[i]=='\0')
				return(0);
			}
		else
			i=0;
		}
	printf("Premature end of file while seeking CONNECT.\n");
	exit(7);
	}

int rfxgets(str)
	unsigned char *str;
	{
	int i;
	i=0;
	while(read(rfxfd, &str[i], 1))
		if(str[i]=='\r')
			{
			str[i]='\0';
			return(i);
			}
		else
			i++;
	return(-1);
	}

unsigned char line[216];
int linenbits;

putwhite(n)
	int n;
	{
	int bytenum, i;
	if(n>(1728-linenbits))
		n=1728-linenbits;
	bytenum=linenbits/8; /* integer division */
	for(i=7-(linenbits%8);(i>=0)&&(n>0);i--,n--)
		{
		line[bytenum]|=1<<i;
		linenbits++;
		}
	bytenum=linenbits/8;
	i=n/8;
	if(n%8)
		i++;
	for(;i>0;--i)
		line[bytenum++]=0xff; /* We limited n above */
	linenbits+=n;
	}

putblack(n)
	int n;
	{
	int bytenum, i;
	if(n>(1728-linenbits))
		n=1728-linenbits;
	bytenum=linenbits/8; /* integer division */
	for(i=7-(linenbits%8);(i>=0)&&(n>0);i--,n--)
		{
		line[bytenum]&=~(1<<i);
		linenbits++;
		}
	bytenum=linenbits/8;
	i=n/8;
	if(n%8)
		i++;
	for(;i>0;--i)
		line[bytenum++]=0x00;
	linenbits+=n;
	}

pcxwriteline(times)
	int times;
	{
	unsigned char pcxline[432], hold;
	int pcxnbytes, i, nreps;
	if(!linenbits)
		return(0);
	if(linenbits<1728)
		putwhite(1728-linenbits);
	pcxnbytes=0;
	/* PCX Encode */
	hold=line[0];
	nreps=i=1;
	while(1)
		{
		if((i<216)&&(line[i]==hold)) /* Reading beyond item is OK*/
			nreps++;
		else
			{
			if((nreps==1)&&((hold&0xc0)!=0xc0))
				pcxline[pcxnbytes++]=hold;
			else
				{
				while(nreps)
					{
					if(nreps>63)
						{
						pcxline[pcxnbytes++]=63|0xc0;
						pcxline[pcxnbytes++]=hold;
						nreps-=63;
						}
					else
						{
						pcxline[pcxnbytes++]=nreps|0xc0;
						pcxline[pcxnbytes++]=hold;
						nreps=0;
						}
					}
				nreps=1; /* This is a little ahead */
				}
			}
		if(i<216)
			hold=line[i++];
		else
			break;
		}
	/* Write encoded line */
	for(i=0;i<times;i++)
		{
		if(write(pcxfd, pcxline, pcxnbytes)!=pcxnbytes)
			{
			printf("Error writing encoded line to file.\n");
			exit(8);
			}
		pagelines++;
		}
	}

abortpage()
	{
	unsigned char c;
	printf("Flushing page...\n");
	while(1)
		{
		if(!read(rfxfd, &c, 1))
			{
			printf("Premature end of file while flushing bad page.\n");
			exit(30);
			}
		if(c==0x10)
			{
			if(!read(rfxfd, &c, 1))
				{
				printf("Premature end of file while flushing bad page.\n");
				exit(30);
				}
			if(c==0x03)
				break;
			}
		}
	}


main(argc, argv)
	int argc;
	char **argv;
	{
	int dcsvr, dcswd, dcsdf, page, symbol, bitcount;
	int dopage, npelschk, gotfcfr;
	unsigned char c, str[128];
	printf("Copyright (C) 1992 Peter Edward Cann\n\n");
	if((argc!=2)&&(argc!=3))
		{
		printf("USAGE: rfx2pcx <rfx filename> [/debug]\n");
		exit(10);
		}
	if(argc==3)
		debug=1;
	else
		debug=0;
	if((rfxfd=open(argv[1], O_RDONLY|O_BINARY))==-1)
		{
		printf("Error opening %s for read.\n", argv[1]);
		exit(11);
		}
	while(1)
		{
		if(!read(rfxfd, &c, 1))
			{
			printf("Premature end of file while seeking initial doublequote.\n");
			exit(12);
			}
		if(c=='"')
			break;
		}
	printf("Sender ID: ");
	while(1)
		{
		if(!read(rfxfd, &c, 1))
			{
			printf("Premature end of file while seeking final doublequote.\n");
			exit(13);
			}
		if(c=='"')
			break;
		putchar(c);
		}
	putchar('\n');
	page=0;
	gotfcfr=0;
	while(1)
		{
		page++;
		if(scanfcfr()) /* Normal exit is in this function */
			{
			if(rfxgets(str)==-1)
				{
				printf("Premature end of file while seeking +FDCS.\n");
				exit(15);
				}
			if(sscanf(str, " +FDCS: %d,%*d,%d,%*d,%d,%*d,%*d,%*d",
				&dcsvr, &dcswd, &dcsdf)!=3)
				{
				printf("Error scanning +FDCS params.\n");
				exit(14);
				}
			else
				gotfcfr=1;
			if(dcsvr)
				printf("High vertical resolution.\n");
			else
				printf("Standard vertical resolution.\n");
			if(dcswd)
				{
				printf("Non-supported width!\n");
				exit(13);
				}
			if(dcsdf)
				{
				printf("Non-supported coding scheme (must be 1-D)!\n");
				exit(14);
				}
			scanconnect();
			gotfcfr=1;
			}
		if(!gotfcfr)
			{
			printf("Never got initial +FCFR; aborting.\n");
			exit(60);
			}
		bitmask=0;
		while(1)
			{
			printf("Enter filename for Page %d (include .PCX):\n--> ", page);
			gets(str);
			if((pcxfd=open(str, O_CREAT|O_BINARY|O_TRUNC|O_WRONLY, S_IWRITE))!=-1)
				break;
			else
				printf("Error opening file.\n");
			}
		/* Save a dummy block for PCX file header */
		if(write(pcxfd, str, 128)!=128)
			{
			printf("Error writing dummy header to file.\n");
			exit(20);
			}
		/* Translate */
		pagelines=0;
		while(getbit()); /* flush Panafax 1 bits */
		while(!getbit()); /* flush initial EOL */
		if(debug)
			printf(" = EOL\n");
		dopage=1;
		if(!setjmp(where)) /* returns -1 magically on DLE ETX */
			while(1)
				{
				/* loop over lines */
				linenbits=npelschk=0;
				while(1)
					{
					/* loop over symbols */
					symbol=getwhite();
					if(debug)
						{
						printf(" = %d White", symbol&0x0fff);
						if(symbol&MAKEUP)
							printf(" Makeup\n");
						else
							printf("\n");
						}
					bitcount=symbol&0x0fff;
					if(symbol&MAKEUP)
						{
						if(symbol==SEVENOHS)
							break;
						symbol=getwhite();
						if(debug)
							{
							printf(" = %d White", symbol&0x0fff);
							if(symbol&MAKEUP)
								printf(" Makeup\n");
							else
								printf("\n");
							}
						if(symbol&MAKEUP)
							{
							printf("Error: sequential makeups.\n");
							abortpage();
							dopage=0;
							break;
							}
						bitcount+=symbol&0x0fff;
						}
					npelschk+=bitcount;
					putwhite(bitcount);
					symbol=getblack();
					if(debug)
						{
						printf(" = %d Black", symbol&0x0fff);
						if(symbol&MAKEUP)
							printf(" Makeup\n");
						else
							printf("\n");
						}
					bitcount=symbol&0x0fff;
					if(symbol&MAKEUP)
						{
						if(symbol==SEVENOHS)
							break;
						symbol=getblack();
						if(debug)
							{
							printf(" = %d Black", symbol&0x0fff);
							if(symbol&MAKEUP)
								printf(" Makeup\n");
							else
								printf("\n");
							}
						if(symbol&MAKEUP)
							{
							printf("Error: sequential makeups.\n");
							abortpage();
							dopage=0;
							break;
							}
						bitcount+=symbol&0x0fff;
						}
					npelschk+=bitcount;
					putblack(bitcount);
					}
				if(!dopage)
					break;
				if(npelschk&&(npelschk!=1728))
					printf("Line %d bad; %d pels.\n", pagelines/(2-dcsvr), npelschk);
				pcxwriteline(2-dcsvr);
				while(!getbit());
				if(debug)
					printf(" = EOL\n");
				}
		else
			pcxwriteline(2-dcsvr);
		pcxwriteheader();
		close(pcxfd);
		printf("Page translate completed.\n");
		}
	}

⌨️ 快捷键说明

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