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; //aktualnie odczytywany znakint main (int argc, char **argv){ srand(time(NULL)); //init rand if(argc!=2) //jezeli gostek nie poda pliku { puts("Return\n2009 Return\n\nUSAGE: return <scriptname>"); getchar(); return 0; } for(PTR=0; PTR < sizeof (stack); PTR++) { //czyszczenie stosu stack[PTR]=0; } script=fopen(argv[1], "r"); //otwieramy plik skryptu if(fgetc(script)!='!') { //sygnatura pliku to wykrzyknik puts("Co to za badziewie?! To nie jest skrypt!"); return 0; } while ((znk=fgetc(script))!=EOF) { //główna pętla programu if(znk=='r') { //wybór trybu MD=fgetc(script); //wybarny tryb (następny znak po 'r') if(MD=='[') { RS^=1; //odblokowanie R1 } else if(RS==0) { //jeśli nie odblokowaliśmy R1 to wychodzimy puts("Blad 1: Dla bezpieczenstwa tryb zostal zablokowany"); return 0; } } else { //nie zmieniamy trybu switch(MD) { //tryby 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); puts("\n"); 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); }}