📄 rfxtopcx.c
字号:
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 + -