game-of-life.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. #include "include/ps-init.h"
  2. #include "include/ps-sdl2.h"
  3. #include "prescheme.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <time.h>
  8. struct sdl_window {};
  9. struct sdl_renderer {};
  10. struct sdl_event {};
  11. struct grid {
  12. long width;
  13. long height;
  14. long size;
  15. char *front_buffer;
  16. char *back_buffer;
  17. };
  18. static long handle_sdl_error(char *);
  19. long main(long, char **);
  20. static long handle_sdl_error(char *message_0X) {
  21. char *v_2X;
  22. FILE *out_1X;
  23. {
  24. out_1X = stderr;
  25. ps_write_string(message_0X, out_1X);
  26. ps_write_string(": ", out_1X);
  27. v_2X = SDL_GetError();
  28. ps_write_string(v_2X, out_1X);
  29. {
  30. long ignoreXX;
  31. PS_WRITE_CHAR(10, out_1X, ignoreXX)
  32. }
  33. return -1;
  34. }
  35. }
  36. long main(long argc_3X, char **argv_4X) {
  37. char arg3K0;
  38. long arg1K2;
  39. long arg1K1;
  40. long arg1K0;
  41. struct grid *arg0K0;
  42. long merged_arg1K2;
  43. long merged_arg1K1;
  44. struct grid *merged_arg0K0;
  45. #ifdef USE_DIRECT_THREADING
  46. void *grid_ref_return_address;
  47. #else
  48. int grid_ref_return_tag;
  49. #endif
  50. long grid_ref0_return_value;
  51. struct grid *grid_5X;
  52. long x_6X;
  53. long y_7X;
  54. long y_57X;
  55. long rem_56X;
  56. long m_55X;
  57. long x_54X;
  58. long rem_53X;
  59. long m_52X;
  60. long value_51X;
  61. long y_50X;
  62. long x_49X;
  63. long ix_48X;
  64. long live_neighbours_47X;
  65. long south_west_46X;
  66. long north_45X;
  67. long south_44X;
  68. long east_43X;
  69. long west_42X;
  70. long north_east_41X;
  71. long north_west_40X;
  72. long south_east_39X;
  73. long value_38X;
  74. long height_37X;
  75. long width_36X;
  76. char *tmp_35X;
  77. long y_34X;
  78. long x_33X;
  79. long ix_32X;
  80. long height_31X;
  81. long width_30X;
  82. long v_29X;
  83. long n_28X;
  84. char runningP_27X;
  85. long value_26X;
  86. long v_25X;
  87. char *tmp_24X;
  88. long y_23X;
  89. long x_22X;
  90. long ix_21X;
  91. long height_20X;
  92. long width_19X;
  93. struct grid *grid_18X;
  94. long result_17X;
  95. long result_16X;
  96. struct grid *grid_15X;
  97. long v_14X;
  98. struct sdl_event *event_13X;
  99. long result_12X;
  100. struct sdl_renderer *renderer_11X;
  101. long result_10X;
  102. struct sdl_window *window_9X;
  103. long n_8X;
  104. {
  105. n_8X = SDL_Init(SDL_INIT_VIDEO);
  106. if ((0 == n_8X)) {
  107. window_9X = PS_SDL_CreateWindow(
  108. "Conway's Game of Life", SDL_WINDOWPOS_CENTERED,
  109. SDL_WINDOWPOS_CENTERED, 1280, 800, SDL_WINDOW_SHOWN);
  110. if ((NULL == window_9X)) {
  111. result_10X = handle_sdl_error("Could not create window");
  112. arg1K0 = result_10X;
  113. goto L1161;
  114. } else {
  115. renderer_11X =
  116. PS_SDL_CreateRenderer(window_9X, -1, SDL_RENDERER_ACCELERATED);
  117. if ((NULL == renderer_11X)) {
  118. result_12X = handle_sdl_error("Could not create renderer");
  119. arg1K0 = result_12X;
  120. goto L1180;
  121. } else {
  122. event_13X = PS_SDL_CreateEvent();
  123. v_14X = time(0);
  124. srand(v_14X);
  125. grid_15X = (struct grid *)malloc(sizeof(struct grid));
  126. if ((NULL == grid_15X)) {
  127. arg0K0 = grid_15X;
  128. goto L1015;
  129. } else {
  130. grid_15X->width = 256;
  131. grid_15X->height = 160;
  132. grid_15X->size = 40960;
  133. grid_15X->front_buffer = ((char *)malloc(sizeof(char) * 40960));
  134. grid_15X->back_buffer = ((char *)malloc(sizeof(char) * 40960));
  135. arg0K0 = grid_15X;
  136. goto L1015;
  137. }
  138. }
  139. }
  140. } else {
  141. return handle_sdl_error("Could not initialize SDL");
  142. }
  143. }
  144. L1161 : {
  145. result_16X = arg1K0;
  146. SDL_Quit();
  147. return result_16X;
  148. }
  149. L1180 : {
  150. result_17X = arg1K0;
  151. PS_SDL_DestroyWindow(window_9X);
  152. arg1K0 = result_17X;
  153. goto L1161;
  154. }
  155. L1015 : {
  156. grid_18X = arg0K0;
  157. width_19X = grid_18X->width;
  158. height_20X = grid_18X->height;
  159. arg1K0 = 0;
  160. arg1K1 = 0;
  161. arg1K2 = 0;
  162. goto L1027;
  163. }
  164. L1027 : {
  165. ix_21X = arg1K0;
  166. x_22X = arg1K1;
  167. y_23X = arg1K2;
  168. if ((y_23X == height_20X)) {
  169. tmp_24X = grid_18X->front_buffer;
  170. grid_18X->front_buffer = (grid_18X->back_buffer);
  171. grid_18X->back_buffer = tmp_24X;
  172. arg3K0 = 1;
  173. goto L1056;
  174. } else {
  175. if ((x_22X == width_19X)) {
  176. arg1K0 = ix_21X;
  177. arg1K1 = 0;
  178. arg1K2 = (1 + y_23X);
  179. goto L1027;
  180. } else {
  181. v_25X = rand();
  182. value_26X = v_25X % 2;
  183. *((grid_18X->back_buffer) + ix_21X) = (((char)value_26X));
  184. arg1K0 = (1 + ix_21X);
  185. arg1K1 = (1 + x_22X);
  186. arg1K2 = y_23X;
  187. goto L1027;
  188. }
  189. }
  190. }
  191. L1056 : {
  192. runningP_27X = arg3K0;
  193. if (runningP_27X) {
  194. n_28X = PS_SDL_PollEvent(event_13X);
  195. if ((1 == n_28X)) {
  196. v_29X = PS_SDL_EventType(event_13X);
  197. if ((SDL_QUIT == v_29X)) {
  198. arg3K0 = 0;
  199. goto L1056;
  200. } else {
  201. arg3K0 = 1;
  202. goto L1056;
  203. }
  204. } else {
  205. width_30X = grid_18X->width;
  206. height_31X = grid_18X->height;
  207. arg1K0 = 0;
  208. arg1K1 = 0;
  209. arg1K2 = 0;
  210. goto L964;
  211. }
  212. } else {
  213. free((grid_18X->front_buffer));
  214. free((grid_18X->back_buffer));
  215. free(grid_18X);
  216. PS_SDL_DestroyEvent(event_13X);
  217. PS_SDL_DestroyRenderer(renderer_11X);
  218. arg1K0 = 0;
  219. goto L1180;
  220. }
  221. }
  222. L964 : {
  223. ix_32X = arg1K0;
  224. x_33X = arg1K1;
  225. y_34X = arg1K2;
  226. if ((y_34X == height_31X)) {
  227. tmp_35X = grid_18X->front_buffer;
  228. grid_18X->front_buffer = (grid_18X->back_buffer);
  229. grid_18X->back_buffer = tmp_35X;
  230. PS_SDL_SetRenderDrawColor(renderer_11X, 0, 0, 0, 255);
  231. PS_SDL_RenderClear(renderer_11X);
  232. PS_SDL_SetRenderDrawColor(renderer_11X, 255, 255, 255, 255);
  233. width_36X = grid_18X->width;
  234. height_37X = grid_18X->height;
  235. arg1K0 = 0;
  236. arg1K1 = 0;
  237. arg1K2 = 0;
  238. goto L791;
  239. } else {
  240. if ((x_33X == width_30X)) {
  241. arg1K0 = ix_32X;
  242. arg1K1 = 0;
  243. arg1K2 = (1 + y_34X);
  244. goto L964;
  245. } else {
  246. value_38X = ((unsigned char)(*((grid_18X->front_buffer) + ix_32X)));
  247. merged_arg0K0 = grid_18X;
  248. merged_arg1K1 = (1 + x_33X);
  249. merged_arg1K2 = (1 + y_34X);
  250. #ifdef USE_DIRECT_THREADING
  251. grid_ref_return_address = &&grid_ref_return_0;
  252. #else
  253. grid_ref_return_tag = 0;
  254. #endif
  255. goto grid_ref;
  256. grid_ref_return_0:
  257. south_east_39X = grid_ref0_return_value;
  258. merged_arg0K0 = grid_18X;
  259. merged_arg1K1 = (-1 + x_33X);
  260. merged_arg1K2 = (-1 + y_34X);
  261. #ifdef USE_DIRECT_THREADING
  262. grid_ref_return_address = &&grid_ref_return_1;
  263. #else
  264. grid_ref_return_tag = 1;
  265. #endif
  266. goto grid_ref;
  267. grid_ref_return_1:
  268. north_west_40X = grid_ref0_return_value;
  269. merged_arg0K0 = grid_18X;
  270. merged_arg1K1 = (1 + x_33X);
  271. merged_arg1K2 = (-1 + y_34X);
  272. #ifdef USE_DIRECT_THREADING
  273. grid_ref_return_address = &&grid_ref_return_2;
  274. #else
  275. grid_ref_return_tag = 2;
  276. #endif
  277. goto grid_ref;
  278. grid_ref_return_2:
  279. north_east_41X = grid_ref0_return_value;
  280. merged_arg0K0 = grid_18X;
  281. merged_arg1K1 = (-1 + x_33X);
  282. merged_arg1K2 = y_34X;
  283. #ifdef USE_DIRECT_THREADING
  284. grid_ref_return_address = &&grid_ref_return_3;
  285. #else
  286. grid_ref_return_tag = 3;
  287. #endif
  288. goto grid_ref;
  289. grid_ref_return_3:
  290. west_42X = grid_ref0_return_value;
  291. merged_arg0K0 = grid_18X;
  292. merged_arg1K1 = (1 + x_33X);
  293. merged_arg1K2 = y_34X;
  294. #ifdef USE_DIRECT_THREADING
  295. grid_ref_return_address = &&grid_ref_return_4;
  296. #else
  297. grid_ref_return_tag = 4;
  298. #endif
  299. goto grid_ref;
  300. grid_ref_return_4:
  301. east_43X = grid_ref0_return_value;
  302. merged_arg0K0 = grid_18X;
  303. merged_arg1K1 = x_33X;
  304. merged_arg1K2 = (1 + y_34X);
  305. #ifdef USE_DIRECT_THREADING
  306. grid_ref_return_address = &&grid_ref_return_5;
  307. #else
  308. grid_ref_return_tag = 5;
  309. #endif
  310. goto grid_ref;
  311. grid_ref_return_5:
  312. south_44X = grid_ref0_return_value;
  313. merged_arg0K0 = grid_18X;
  314. merged_arg1K1 = x_33X;
  315. merged_arg1K2 = (-1 + y_34X);
  316. #ifdef USE_DIRECT_THREADING
  317. grid_ref_return_address = &&grid_ref_return_6;
  318. #else
  319. grid_ref_return_tag = 6;
  320. #endif
  321. goto grid_ref;
  322. grid_ref_return_6:
  323. north_45X = grid_ref0_return_value;
  324. merged_arg0K0 = grid_18X;
  325. merged_arg1K1 = (-1 + x_33X);
  326. merged_arg1K2 = (1 + y_34X);
  327. #ifdef USE_DIRECT_THREADING
  328. grid_ref_return_address = &&grid_ref_return_7;
  329. #else
  330. grid_ref_return_tag = 7;
  331. #endif
  332. goto grid_ref;
  333. grid_ref_return_7:
  334. south_west_46X = grid_ref0_return_value;
  335. live_neighbours_47X =
  336. ((((((north_45X + south_44X) + east_43X) + west_42X) +
  337. north_east_41X) +
  338. north_west_40X) +
  339. south_east_39X) +
  340. south_west_46X;
  341. if ((1 == value_38X)) {
  342. if ((live_neighbours_47X < 2)) {
  343. arg1K0 = 0;
  344. goto L968;
  345. } else {
  346. if ((3 < live_neighbours_47X)) {
  347. arg1K0 = 0;
  348. goto L968;
  349. } else {
  350. arg1K0 = 1;
  351. goto L968;
  352. }
  353. }
  354. } else {
  355. if ((3 == live_neighbours_47X)) {
  356. arg1K0 = 1;
  357. goto L968;
  358. } else {
  359. arg1K0 = 0;
  360. goto L968;
  361. }
  362. }
  363. }
  364. }
  365. }
  366. L791 : {
  367. ix_48X = arg1K0;
  368. x_49X = arg1K1;
  369. y_50X = arg1K2;
  370. if ((y_50X == height_37X)) {
  371. PS_SDL_RenderPresent(renderer_11X);
  372. SDL_Delay(50);
  373. arg3K0 = 1;
  374. goto L1056;
  375. } else {
  376. if ((x_49X == width_36X)) {
  377. arg1K0 = ix_48X;
  378. arg1K1 = 0;
  379. arg1K2 = (1 + y_50X);
  380. goto L791;
  381. } else {
  382. if ((0 == (((unsigned char)(*((grid_18X->front_buffer) + ix_48X)))))) {
  383. goto L795;
  384. } else {
  385. PS_SDL_RenderFillRect(renderer_11X, (5 * x_49X), (5 * y_50X), 5, 5);
  386. goto L795;
  387. }
  388. }
  389. }
  390. }
  391. L968 : {
  392. value_51X = arg1K0;
  393. *((grid_18X->back_buffer) + ix_32X) = (((char)value_51X));
  394. arg1K0 = (1 + ix_32X);
  395. arg1K1 = (1 + x_33X);
  396. arg1K2 = y_34X;
  397. goto L964;
  398. }
  399. L795 : {
  400. arg1K0 = (1 + ix_48X);
  401. arg1K1 = (1 + x_49X);
  402. arg1K2 = y_50X;
  403. goto L791;
  404. }
  405. grid_ref : {
  406. grid_5X = merged_arg0K0;
  407. x_6X = merged_arg1K1;
  408. y_7X = merged_arg1K2;
  409. {
  410. m_52X = grid_5X->width;
  411. rem_53X = x_6X % m_52X;
  412. if ((rem_53X < 0)) {
  413. arg1K0 = (rem_53X + m_52X);
  414. goto L598;
  415. } else {
  416. arg1K0 = rem_53X;
  417. goto L598;
  418. }
  419. }
  420. L598 : {
  421. x_54X = arg1K0;
  422. m_55X = grid_5X->height;
  423. rem_56X = y_7X % m_55X;
  424. if ((rem_56X < 0)) {
  425. arg1K0 = (rem_56X + m_55X);
  426. goto L602;
  427. } else {
  428. arg1K0 = rem_56X;
  429. goto L602;
  430. }
  431. }
  432. L602 : {
  433. y_57X = arg1K0;
  434. grid_ref0_return_value = (((unsigned char)(*(
  435. (grid_5X->front_buffer) + (x_54X + (y_57X * (grid_5X->width)))))));
  436. #ifdef USE_DIRECT_THREADING
  437. goto *grid_ref_return_address;
  438. #else
  439. goto grid_ref_return;
  440. #endif
  441. }
  442. #ifndef USE_DIRECT_THREADING
  443. grid_ref_return:
  444. switch (grid_ref_return_tag) {
  445. case 0:
  446. goto grid_ref_return_0;
  447. case 1:
  448. goto grid_ref_return_1;
  449. case 2:
  450. goto grid_ref_return_2;
  451. case 3:
  452. goto grid_ref_return_3;
  453. case 4:
  454. goto grid_ref_return_4;
  455. case 5:
  456. goto grid_ref_return_5;
  457. case 6:
  458. goto grid_ref_return_6;
  459. default:
  460. goto grid_ref_return_7;
  461. }
  462. #endif
  463. }
  464. }