Автор Гілка: Пусті програми  (Прочитано 7993 раз)

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Пусті програми
« : 2006-10-05 16:07:26 »
#include <stdio.h>

int main(int argc,char**argv)
{
FILE*in , *out;
in=fopen(argv[1],"rb");
out=fopen(argv[2],"w");
while(!feof(in))
{
int k,i;
k=getc(in);
if(k<0)k+=256;
for(i=0;i<8;i++)
if(128&(k<<i))fprintf(out,"#");else fprintf(out," ");
fprintf(out,"\n");
}
fcloseall();
exit(0);
}
Діє з файлами типу *.cpi під досом та розпакованими *.psfu.gz (*.psfu) під лінуксом (злітає на ура, якщо файли не задані  ;) ) корисність - 0  ;D
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Пусті програми
« Відповідей #1 : 2006-10-05 17:03:01 »
Чого корисність нуль? Я на точно такого ж призначення утилітах вивчав flex/bison. А додатково наводив красу на свій консольний фонт. Тільки зробив у вигляді фільтра (тоді набагато менше мороки з відкриванням файлів) - на stdin йде бінарний файл, на stdout отримуємо читабельний (і редага... гм...) людиною текст. А потім - назад.
P.S. Ось добре, що в лінуксі нема досівських непорозумінь з CR/LF...
P.P.S. А psf є дві версії, у другій підтримуються фонти з шириною не 8, отже на ній - не діє :)

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Пусті програми
« Відповідей #2 : 2006-10-05 17:39:53 »
Я цю гидоту якраз під дос і писав :) До речі там конвеєра запустити не вдасться - тому в фільтрах нема потреби (і який дурень після цього його назве операційною системою  ::) ) колись була програмка спеціально для редагування шрифтів, але зараз в мене її нема (входила в пакет кейукр).
А прикольно було б перевести дос під koi8-u - ото б киричичні проги заглючили всі як одна  ;D треба було б писати перекодувальника спеціально для всіх прог  ;D
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Пусті програми
« Відповідей #3 : 2006-10-06 10:24:59 »
А ця гидота навіть працює:
#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"  (є якісь інші, але в них я не розбирався)
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Пусті програми
« Відповідей #4 : 2006-10-06 12:05:28 »
Я цю гидоту якраз під дос і писав :) До речі там конвеєра запустити не вдасться - тому в фільтрах нема потреби (і який дурень після цього його назве операційною системою  ::) ) колись була програмка спеціально для редагування шрифтів, але зараз в мене її нема (входила в пакет кейукр).
А прикольно було б перевести дос під koi8-u - ото б киричичні проги заглючили всі як одна  ;D треба було б писати перекодувальника спеціально для всіх прог  ;D

Для KOI8-R пам'ятаю був драйвер під DOS (шрифт + розкладка, базувався на keyrus) - я ним трохи навіть користувався. :-)
[Fedora Linux]

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Пусті програми
« Відповідей #5 : 2006-10-06 14:52:48 »
Якщо шматок *.psfu почепити до *.cpi - отримаємо koi8-U під дос :) 3 psfu втулити в 1 cpi - досить цікаво буде - от тільки розкладку проблемно переробляти - я до кінця в її суті так і не розібрався...
Втім тепер pc-dos жожна буде обізвати pc-dosinux.
« Змінено: 2006-10-06 15:14:09 від serg_ik »
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Пусті програми
« Відповідей #6 : 2006-10-07 00:08:39 »
...Тільки не під лінуксом: для нього нема бібліотеки для лазіння по терміналу типу борландівського "conio" (є якісь інші, але в них я не розбирався)
А тут і бібліотеки не треба :))
x=10 ; y=5 ; echo -en "\e[${y};${x}fHello, world" ; unset -v x y
або
#include <stdio.h>
int main ( void )
{
int x = 10;
int y = 5;
        printf ("\e[%u;%ufHello, world\n", y, x);
}
Виведе цей рядок за вказаними координатами. ;) Взагалі-то є ncurses, але у мене іще не було часу взятися за неї.
P.S. Повна зачистка екрану - "\e[2J"

zzandy

  • Гість
Re: Пусті програми
« Відповідей #7 : 2006-10-07 09:05:40 »
До слова про esc послідовності: VT100 ESC sequences.

Відсутній Паша

  • Кореспондент
  • ***
  • дописів: 142
  • Карма: +0/-0
  • хайо!
Re: Пусті програми
« Відповідей #8 : 2006-10-24 09:03:49 »
варіація на тему "пустих" програм.
Як вам рекурсивна функція main?
Цитата
#include<stdio.h>

int main(int argn,char* argv[])
{
        if (argn<=1){
                puts("bye");
                return 0;
        }
        printf("%s\n",argv[argn-1]);
        main(argn-1,argv);
}
Хоча це більше "безглузда" програма ніж "пуста". :)
debian

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Пусті програми
« Відповідей #9 : 2006-10-24 10:02:04 »
Цитата
Хоча це більше "безглузда" програма ніж "пуста". :)
Чого, якщо її записати так:
#include <stdio.h>
int main (int argc, char **argv)
{
        if ( argc > 1 ) {
                printf ("Bye, %s!\n", argv[1]);
                main (--argc, ++argv);
        } else
                puts ("See you later!");
}
gcc -pedantic -std=c99 -Wall -o ~/bye bye.c
echo '~/bye ${USER}' >> ~/.bash_logout
То вона навіть набирає якогось сенсу. :)
« Змінено: 2006-10-24 13:12:02 від ISBear »

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Пусті програми
« Відповідей #10 : 2006-10-24 12:51:00 »
"\n" в кінці рядочків додайте.

[Fedora Linux]

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Пусті програми
« Відповідей #11 : 2006-10-24 13:12:57 »
Дякую. Додав.

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Пусті програми
« Відповідей #12 : 2006-11-02 12:41:58 »
Мені більше подобаються цикли, ніж рекурсія.
До речі, рекурсію ніколи не використовував продовж усієї своєї безглуздої практики прогамування.
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній miwa

  • Літератор
  • ******
  • дописів: 1111
  • Карма: +0/-0
Re: Пусті програми
« Відповідей #13 : 2006-11-02 14:17:40 »
Хм. Вам не потрібно було проглядати всіх потомків визначеного предка в ієрархічній структурі?
Читайте документацію - вона кермує.

Відсутній Паша

  • Кореспондент
  • ***
  • дописів: 142
  • Карма: +0/-0
  • хайо!
Re: Пусті програми
« Відповідей #14 : 2006-11-03 10:18:09 »
Цитата
Усі люди на світі поділяються на два класи: тих хто поділяє усіх людей на два класи, і тих, хто цього не робить.
НЕ намайтеся це уявити -- зависните.
debian