fork download
  1. // 2dfbi, © Du-Ne, 2002
  2. // Enjoy! - Please Note: Give no second parameter for interpreting
  3. // Use --debug or --brainfuck for debugging
  4. #include <iostream>
  5. #include <fstream>
  6. #include <cstring>
  7. using namespace std;
  8.  
  9. //Editierbare Kosntanten
  10. #define maxc 10000
  11. #define maxx 200
  12. #define maxb 50000
  13. #define maxa 30000
  14.  
  15. //Interpreter Variablen
  16. #include <stdio.h>
  17. int p, r, q;
  18. char a[maxa], f[maxb], b, o, *s=f;
  19. int interpret(char *k);
  20.  
  21. // 2dbf -> bf Teil
  22. void wdh(char m_zeichen, int m_anzahl);
  23. int getdirection( int m_predirection,
  24. int m_posc, int m_posx);
  25. char field[maxc][maxx];
  26. char bffield[maxb];
  27. char result[11];
  28.  
  29. int main(int argc, char *argv[])
  30. {
  31.  
  32. if(argc==1)
  33. {
  34. cout<<endl
  35. <<"\t----------------------------------------------------"<<endl
  36. <<"\t|2dbfi - The origininal 2dbf interpreter by Du-Ne |"<<endl
  37. <<"\t|Presented by: www.legacy-project.de and www.gcf.de|"<<endl
  38. <<"\t----------------------------------------------------"<<endl<<
  39. endl<<"This program must be started with at least one parameter, the "<<
  40. endl<<"name of the file which is to interpret. If you give a second "<<
  41. endl<<"parameter like --debug, your source is converted and then "<<
  42. endl<<"shown in brainfuck for debugging purposes."<<endl<<"Syntax: "
  43. <<endl<<argv[0]<<" filename [--debug]";
  44. return 0;
  45. }
  46. ifstream in(argv[1]);
  47. if(!in){cout<<"file not found"<<endl; return 0;}
  48. int line = 0;
  49. int pos = 0;
  50. int c = 0;
  51. int x = 0;
  52. int z = 0;
  53. int find = 0;
  54. int pred = 0;
  55. bool dorun;
  56. dorun = true;
  57.  
  58. for(c=0; c<maxc; c++)
  59. {
  60. for(x=0; x<maxx; x++)
  61. {
  62. field[c][x]=char(32);
  63. }
  64. }
  65. for(find=0; find<maxb; find++)
  66. {
  67. bffield[find] = char(32);
  68. }
  69. find = 0;
  70.  
  71. while(!in.eof())
  72. {
  73. char ch;
  74. ch=in.get();
  75. if(ch==char(10))
  76. {
  77. line++;
  78. pos = 0;
  79. }else{
  80. field[line][pos] = ch;
  81. pos++;
  82. }
  83. };
  84. pos--;
  85. field[line][pos] = char(32); //Müll entfernen
  86.  
  87. //cout<<getdirection(dpre, dc, dx)<<endl; //DEBUG
  88. //cout<<field[dc][dx]<<endl; //DEBUG
  89.  
  90. c = 0;
  91. x = 0;
  92. pred = 0;
  93. int gotback;
  94. int gotdir;
  95. int gotcount;
  96. char giveout;
  97. find = 0;
  98. while(dorun)
  99. {
  100. gotback = getdirection(pred, c, x);
  101. gotdir = gotback / 10;
  102. gotcount = gotback % 10;
  103. switch(gotdir)
  104. {
  105. case 0: // Error
  106. cout<<endl<<"2dbf Layout Error at ["<<c+1<<"]["<<x+1
  107. <<"]... (Line|Letter)"
  108. <<endl
  109. <<"Debug Information: gotback = "<<gotback<<" gotdir = "
  110. <<gotdir<<" gotcount = "<<gotcount<<" pre-direction = "
  111. <<pred
  112. <<endl;
  113. return 0;
  114. break;
  115. case 9: // Ende
  116. if(argc>2)
  117. {
  118. return 0;
  119. }else{
  120. dorun = false;
  121. }
  122. break;
  123. case 1: // Nach Rechts
  124. x++;
  125. giveout = char(43); // +
  126. break;
  127. case 2: // Nach Links
  128. x--;
  129. giveout = char(45); // -
  130. break;
  131. case 3: // Nach Rechts-Unten
  132. x++;
  133. c++;
  134. giveout = char(62); // >
  135. break;
  136. case 4: // Nach Links-Unten
  137. x--;
  138. c++;
  139. giveout = char(60); // <
  140. break;
  141. case 5: // Nach Unten
  142. c++;
  143. giveout = char(91); // [
  144. break;
  145. case 6: // Nach Oben
  146. c--;
  147. giveout = char(93); // ]
  148. break;
  149. case 7: // Nach Rechts-Oben
  150. x++;
  151. c--;
  152. giveout = char(46); // .
  153. break;
  154. case 8: // Nach Links-Oben
  155. x--;
  156. c--;
  157. giveout = char(44); // ,
  158. break;
  159.  
  160.  
  161. }
  162.  
  163. z = 0;
  164. wdh(giveout, gotcount);
  165. while(true) //wdh schleife
  166. {
  167. if(result[z]==char(32)) break;
  168. if(argc>2)
  169. {
  170. cout<<result[z];
  171. }else{
  172. //cout<<"find: "<<find<<" ";
  173. bffield[find] = result[z];
  174. //cout<<"result: "<<result[z]<<" ";
  175. //cout<<"bffield: "<<bffield[find]<<endl;
  176. find++;
  177. }
  178. z++;
  179. }
  180.  
  181. pred = gotdir;
  182. //cout<<"x";
  183. }
  184. if(argc<3) interpret(bffield);
  185. //DEBUG: Output bffield
  186. //cout<<"Dedugging..."<<endl;
  187. //for(find=0; find<100; find++)
  188. //{
  189. // cout<<bffield[find];
  190. //}
  191.  
  192. return 0;
  193. }
  194.  
  195. int getdirection( int m_predirection,
  196. int m_posc, int m_posx)
  197. {
  198. int m_newdir = 0;
  199. int m_counter = 0;
  200. int m_c_dirs = 0;
  201. char m_betrchr;
  202. bool m_allowed[9];
  203. bool keepdir = false;
  204.  
  205. //allowed-array initialisieren in Abhängigkeit der predirection
  206. m_allowed[0] = false;
  207. m_allowed[1] = true;
  208. m_allowed[2] = true;
  209. m_allowed[3] = true;
  210. m_allowed[4] = true;
  211. m_allowed[5] = true;
  212. m_allowed[6] = true;
  213. m_allowed[7] = true;
  214. m_allowed[8] = true;
  215. switch(m_predirection)
  216. {
  217. case 0:
  218. m_allowed[0] = true;
  219. break;
  220. case 1:
  221. m_allowed[2] = false;
  222. break;
  223. case 2:
  224. m_allowed[1] = false;
  225. break;
  226. case 3:
  227. m_allowed[8] = false;
  228. break;
  229. case 8:
  230. m_allowed[3] = false;
  231. break;
  232. case 4:
  233. m_allowed[7] = false;
  234. break;
  235. case 7:
  236. m_allowed[4] = false;
  237. break;
  238. case 5:
  239. m_allowed[6] = false;
  240. break;
  241. case 6:
  242. m_allowed[5] = false;
  243. break;
  244. }
  245.  
  246. //Erlaubte Directions bestimmen
  247. if(m_posx==0)
  248. {
  249. m_allowed[2] = false;
  250. m_allowed[4] = false;
  251. m_allowed[8] = false;
  252. }
  253. if(m_posx==(maxx-1))
  254. {
  255. m_allowed[1] = false;
  256. m_allowed[3] = false;
  257. m_allowed[7] = false;
  258. }
  259. if(m_posc==0)
  260. {
  261. m_allowed[6] = false;
  262. m_allowed[7] = false;
  263. m_allowed[8] = false;
  264. }
  265. if(m_posc==(maxc-1))
  266. {
  267. m_allowed[5] = false;
  268. m_allowed[4] = false;
  269. m_allowed[3] = false;
  270. }
  271.  
  272. //Direction bestimmen
  273. if(m_allowed[1] && field[m_posc ][m_posx+1] != char(32) && !keepdir)
  274. {
  275. m_newdir = 1;
  276. m_betrchr = field[m_posc ][m_posx+1];
  277. m_c_dirs++;
  278. if(m_newdir == m_predirection){keepdir=true;}
  279. }
  280. if(m_allowed[2] && field[m_posc ][m_posx-1] != char(32) && !keepdir)
  281. {
  282. m_newdir = 2;
  283. m_betrchr = field[m_posc ][m_posx-1];
  284. m_c_dirs++;
  285. if(m_newdir == m_predirection){keepdir=true;}
  286. }
  287. if(m_allowed[3] && field[m_posc+1][m_posx+1] != char(32) && !keepdir)
  288. {
  289. m_newdir = 3;
  290. m_betrchr = field[m_posc+1][m_posx+1];
  291. m_c_dirs++;
  292. if(m_newdir == m_predirection){keepdir=true;}
  293. }
  294. if(m_allowed[4] && field[m_posc+1][m_posx-1] != char(32) && !keepdir)
  295. {
  296. m_newdir = 4;
  297. m_betrchr = field[m_posc+1][m_posx-1];
  298. m_c_dirs++;
  299. if(m_newdir == m_predirection){keepdir=true;}
  300. }
  301. if(m_allowed[5] && field[m_posc+1][m_posx ] != char(32) && !keepdir)
  302. {
  303. m_newdir = 5;
  304. m_betrchr = field[m_posc+1][m_posx ];
  305. m_c_dirs++;
  306. if(m_newdir == m_predirection){keepdir=true;}
  307. }
  308. if(m_allowed[6] && field[m_posc-1][m_posx ] != char(32) && !keepdir)
  309. {
  310. m_newdir = 6;
  311. m_betrchr = field[m_posc-1][m_posx ];
  312. m_c_dirs++;
  313. if(m_newdir == m_predirection){keepdir=true;}
  314. }
  315. if(m_allowed[7] && field[m_posc-1][m_posx+1] != char(32) && !keepdir)
  316. {
  317. m_newdir = 7;
  318. m_betrchr = field[m_posc-1][m_posx+1];
  319. m_c_dirs++;
  320. if(m_newdir == m_predirection){keepdir=true;}
  321. }
  322. if(m_allowed[8] && field[m_posc-1][m_posx-1] != char(32) && !keepdir)
  323. {
  324. m_newdir = 8;
  325. m_betrchr = field[m_posc-1][m_posx-1];
  326. m_c_dirs++;
  327. if(m_newdir == m_predirection){keepdir=true;}
  328. }
  329.  
  330.  
  331.  
  332.  
  333. //Anzahl bestimmen und Ausgeben
  334. m_counter = int(m_betrchr)-48;
  335.  
  336. //if(m_posx == 66 & m_posc == 76)
  337. //{
  338. // cout<<"Debug: couter: "<<m_counter<<" c_dir: "<<m_c_dirs<<
  339. // " keepdir: "<<keepdir<<" newdir: "<<m_newdir
  340. // <<endl;
  341. //}
  342.  
  343. if(m_c_dirs==1)
  344. {
  345. if((m_counter <10) && (m_counter >=0))
  346. {
  347. return (m_newdir * 10) + m_counter;
  348. }else{
  349. if(keepdir){return m_newdir * 10;} // Ausnahme bei Arm-Verlängerung
  350. return m_newdir * 10 + 1;
  351. }
  352. }else{
  353. if(m_c_dirs>1)
  354. {
  355. if((m_counter <10) && (m_counter >=0))
  356. {
  357. if(keepdir){return (m_newdir * 10) + m_counter;} else {return 0;}
  358. }else{ // 0 = Fehler
  359. if(keepdir){return (m_newdir * 10) ;} else {return 0;}
  360. }
  361. }else{
  362. return 90; // 90 = Ende
  363. }
  364. }
  365. }
  366.  
  367. void wdh(char m_zeichen, int m_anzahl)
  368. {
  369. int m_x = 0;
  370. int m_y = 0;
  371. char m_result[11] = " ";
  372. if(m_anzahl != 0)
  373. {
  374. for(m_x = 0; m_x < m_anzahl; m_x++)
  375. {
  376. //cout<<m_zeichen;
  377. m_result[m_x] = m_zeichen;
  378. m_y++;
  379. }
  380. }
  381. strncpy(result, m_result, 11);
  382. }
  383.  
  384. // INTERPRETER TEIL (taken from bfi)
  385. int interpret(char *k)
  386. {
  387. char *d;
  388.  
  389. r++;
  390. while( *k ) {
  391. switch(o=1,*k++) {
  392. case '<': p--; break;
  393. case '>': p++; break;
  394. case '+': a[p]++; break;
  395. case '-': a[p]--; break;
  396. case '.': putchar(a[p]); fflush(stdout); break;
  397. case ',': a[p]=getchar();fflush(stdout); break;
  398. case '[':
  399. for( b=1,d=k; b && *k; k++ )
  400. b+=*k=='[', b-=*k==']';
  401. if(!b) {
  402. k[-1]=0;
  403. while( a[p] )
  404. interpret(d);
  405. k[-1]=']';
  406. break;
  407. }
  408. case ']':
  409. puts("2dbf Syntax Error: Unbalanced brackets []"), exit(0);
  410. case '#':
  411. if(q>2)
  412. printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n%*s\n",
  413. *a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
  414. break;
  415. default: o=0;
  416. }
  417. if( p<0 || p>maxa)
  418. puts("2dbf Syntax Error: Array-Over/Underflow"), exit(0);
  419. }
  420. r--;
  421. return 0;
  422. }
  423.  
Success #stdin #stdout 0s 17328KB
stdin
Standard input is empty
stdout
	----------------------------------------------------
	|2dbfi - The origininal 2dbf interpreter by Du-Ne  |
	|Presented by: www.legacy-project.de and www.gcf.de|
	----------------------------------------------------

This program must be started with at least one parameter, the 
name of the file which is to interpret. If you give a second 
parameter like --debug, your source is converted and then 
shown in brainfuck for debugging purposes.
Syntax: 
./prog filename [--debug]