( haroldking | 2020. 03. 26., cs - 21:17 )

Meggondoltam magamat. Nem jó dolog, ha a brainfuck progi végrehajtása a string„osztályom” része. Mi a fenének, ez a funkció ritkán kell... átpakoltam ezt inkább magába a libbe. Most így néz ki a brainfuck library kódja:

#include <stdlib.h>
// ........................................
#include "headers/upu_defines.h"
#include "headers/upu_branchprediction.h"
#include "headers/upu_daysofweeks.h"
#include "headers/upu_logol.h"
#include "headers/upu_upuu.h"
#include "headers/upu_strdescriptor.h"
#include "headers/upu_str.h"
#include "headers/upu_furor.h"
// **********************************************************************************************
void brainfuck(str s);
// **********************************************************************************************
void brf(struct furorpgm *f) {
str s;s=mem(64000+f->d[ELS+f->d[0].g-1].u[0].g);streq(&s,f->d[ELS+f->d[0].g-1].u);
brainfuck(s);free(s);
f->d[0].g--;
}
// **********************************************************************************************
// **********************************************************************************************
// ==================================================================================
void brainfuck(str s) {
if(s==NULL) {return;} if(s[0].g==0) {return;} if((s[1].g-s[0].g)==0) {return;}
usag length;length=sizeof(union upuu)*(s[1].g-s[0].g);
usag d;usag k;usag p;p=0;
usac *m;m = (usac *)&s[ELS+s[0].g];
usag i;for(i=0;i<length;i++) {m[i]=0;}
k=0;
while(k<s[0].g) {
switch(s[k+ELS].c[0]) {
default: k++;break;
case '<' : if(p==0)      {return;} else {p--;k++;} break;
case '>' : if(p>=length) {return;} else {p++;k++;} break;
case '+' : m[p]++;k++; break;
case '-' : m[p]--;k++; break;
case '.' : printf("%c",(char)m[p]);k++;break;
case ',' : m[p]=(usac)getchar();k++;break;
case '[' : if(m[p] > 0) {k++;} else {d=0;for(i=k+1;i<s[0].g;i++) {
           if(s[i+ELS].c[0]=='[') {d++;} else {
           if(s[i+ELS].c[0]==']') {if(d==0) {k=i+1;break;} else {d--;}}}
           } // for vége
           } // else vége
break;
case ']' : d=0; for(i=1;i<k;i++) {if(s[k-i+ELS].c[0]==']') {d++;} else {
                                  if(s[k-i+ELS].c[0]=='[') {if(d==0) {k=k-i;break;} else {d--;}}}
                                 } // for vége
break;
} // switch vége
} // while vége
}
// =======================================================================