All pastes #1697866 Raw Edit

Return - esoteric programming la

public c v1 · immutable
#1697866 ·published 2009-12-02 06:20 UTC
rendered paste body
/*Return scripting language2009 Return*/#include <stdio.h>#include <stdlib.h>#include <time.h>#include <stdbool.h>void junk(void);void r_push(int val);int r_pop(void);#define STACK_SIZE 10#define random(a) rand()%aFILE *script;int PTR=0; //aktualnie odczytywany znakunsigned int *stack[STACK_SIZE];int MM=STACK_SIZE-1; //pozycja stosuint *R1; //akumulator (I/O)int R2=0; //rejestr działania (I/O)int J=0; //rejestr skoku (I)int CMP=0; //rejestr porównania (I)char RS=0; //stan rejestrówchar MD='k'; //tryb pracychar znk=0;	int main (int argc, char **argv){	printf("%u", &znk);	srand(time(NULL));    if(argc!=2)     {     puts("Return\n2009 Return\n\nUSAGE: return <scriptname>");     getchar();     return 0;    }    for(PTR=0; PTR < sizeof (*stack); PTR++) {        *stack[PTR]=0;      }    script=fopen(argv[1], "r");    if(fgetc(script)!='!') { puts("Co to za badziewie?! To nie jest skrypt!"); return 0;}    R1 = &znk;    while ((znk=fgetc(script))!=EOF) {        if(znk=='[')         {            RS=1; //odblokowanie R1            R1 =malloc(4); //ustalamy pozycje R1 w pamieci        }        if(znk=='r') {            MD=fgetc(script); //wybór trybu            if(RS==0 && (MD=='S' || MD=='R' || MD=='p' || MD=='t' || MD=='n' || MD==' ')) {                puts("Blad 1: Dla bezpieczenstwa tryb zostal zablokowany");                 return 0;              }        }        else {            switch(MD) {                case 'S': //przełączenie rejstru                     r_push(*R1);                     *R1=R2;                     R2=r_pop();                case 'R': //operacje arytmetyczne                     if(znk=='e') {                         *R1++;                        }                     else  {                         *R1--;                       }                     break;                case 'p': //pozycja                     if(znk=='q') { //przenieś (dosłownie :D) wartość do rej. skoku                         J=*R1;                         *R1=255; //wiem, jestem wredny - happy debugging                     }                     else { //zapamiętaj pozycję do rej. J                         J=ftell(script);                     }                case 't': //we/wy                     if(znk=='u') putchar(*R1); //wyśiwetlanie znaku                     else *R1=getchar();        //pobieranie znaku                     break;                                case 'w': //skoki                     if(znk=='=') fseek(script,J,SEEK_CUR); //skok względny o wartość J                     else if(znk=='*') fseek(script,J,SEEK_SET); //skok bezwzględny do J                     else fseek(script,-J,SEEK_CUR); //skok względny o wartość -J                     break;                case 'x': //porównanie                     if(znk=='4'){                         if(*R1==CMP) fseek(script,J,SEEK_SET); //skok bezwzględny, CMP                     }                     else if(znk=='3'){                         if(*R1==CMP) fseek(script,J,SEEK_CUR); //skok względny, CMP                     }                     else if(znk=='7'){                         if(*R1!=CMP) fseek(script,J,SEEK_SET); //skok bezwzględny, !=CMP                     }                     else {                         if(*R1!=CMP) fseek(script,J,SEEK_CUR); //skok względny, !=CMP                     }                     break;                case 'n': //stos                     if(znk=='o') { //push                         r_push(*R1);                         *R1=0; //utrudnienia przede wszystkim! :D                     }                     else { //pop                         *R1=r_pop();                     }                     if(MM < 0 || MM > STACK_SIZE) { //zabezpieczenie                           junk();                           puts("Stos sie rozjechal"); return 0;                     }                     break;                case 'k': //bezczynność, komentarz                     break;                case ' ': //ukryte ;)                     if(znk=='q') { //quine                         r_push(ftell(script));                         fseek(script,0,SEEK_SET);                         while ((znk=fgetc(script))!=EOF) {                             putc(znk,stdout);                         }                         fseek(script,r_pop(),SEEK_SET);                     }                     break;                   default: junk(); puts("Chyba nie ma takiego trybu: "); putc(MD,stdout); return 0;            }        }    }    fclose(script);    return 0;}void r_push(int val) {    *stack[MM]=val;     MM--; }int r_pop(void) {    MM++;    return *stack[MM]; }void junk(void) {    int i;    for(i=0; i < random(100) + 50; i++) {        putc(random(255-32)+32,stdout);    }    fputs("KvrWa!",stdout);    for(i=0; i < random(100) + 50; i++) {        putc(random(255-32)+32,stdout);    }}