All pastes #1701677 Raw Edit

Return - poprawka na infie

public c v1 · immutable
#1701677 ·published 2009-12-04 11:33 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; //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);    }}