А ця гидота навіть працює:
#include <stdio.h>
#include <conio.h>
/*
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE
*stream);
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos); */
int interpreter(char *buf,size_t size,int maxx);
char* genBinStr(int ch)
{
int i;
static char str[9];
for(i=0;i<8;i++)
if(128&(ch<<i))str[i]='#';else str[i]=' ';
str[8]=0;
return str;
}
char* ldec8(long int in)
{
static char out[9];
long int j, ou;
ou = in;
for(j=7;j>=0;j--,ou/=10)
out[j]='0'+(ou%10);
out[8]=0;
return out;
}
int main(int argc,char**argv)
{
FILE*inp,*out;
size_t sFile;
int maxx;
char *mBuf;
inp=fopen(argv[1],"rb");
if(inp==0){printf("\nerror opening %s for reading\n",argv[1]);return 1;}
fseek(inp,0L,SEEK_END);
sFile=ftell(inp);
fseek(inp,0L,SEEK_SET);
mBuf=(char*)malloc(sFile);
fread(mBuf,1,sFile,inp);
fclose(inp);
printf("file size is %s bytes\n",ldec8(sFile));
clrscr();
gotoxy(9,8);printf("______________________");
gotoxy(9,16);printf("______________________");
gotoxy(9,24);printf("______________________");
if(argc>3)sscanf(argv[3],"%d",&maxx);else maxx=24;
if(interpreter(mBuf,sFile,maxx)==2)
{
out=fopen(argv[2],"wb");
fwrite(mBuf,1,sFile,out);
fclose(out);
}
free(mBuf);
exit(0);
return argc;
}
int interpreter(char *buf,size_t size,int maxx)
{
int control;
long int pos=0;
int xs=1,ys=1,i,k,increment=16;
while(control=getch())
{
switch(control)
{
case 'h'://left
xs--;if(xs==0)xs=1;
break;
case 'j'://up
ys--;if(ys==0){ys=1;pos--;
if(pos<0)pos=0;}
break;
case 'k'://down
ys++;if(ys>maxx){ys=maxx;pos++;
if(pos>(size-maxx+1))pos=maxx;}
break;
case 'l'://right
xs++;if(xs==9)xs=8;
break;
case 'a':
k=buf[pos+ys-1];
if(k<0)k+=256;
k^=(1<<(8-xs));
buf[pos+ys-1]=(unsigned char)k;
break;
case 'p'://down
pos+=increment;
if(pos>(size-maxx+1))pos=(size-maxx+1);
break;
case 'o'://up
pos-=increment;
if(pos<0)pos=0;
break;
case 'M':
clrscr();
printf("New increment: ");
scanf("%d",&increment);
clrscr();
for(i=increment;i<maxx;i+=increment)
{
gotoxy(9,i);printf("_____________________");
}
break;
case 'Q': return 1;
case 'S': return 2;
}
gotoxy(1,1);
for(i=0;i<maxx;i++)
{ int k;
k=buf[pos+i];
if(k<0)k+=256;
printf("%s\n",genBinStr(k));
}
gotoxy(xs,ys);
}
return 0;
}
... Тільки не під лінуксом: для нього нема бібліотеки для лазіння по терміналу типу борландівського "conio" (є якісь інші, але в них я не розбирався)