-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b3dafd2
commit 887038e
Showing
12 changed files
with
1,130 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,3 @@ | ||
#include "PP.h" | ||
#include "PP_BRAINFUCK.h" | ||
|
||
PP_BRAINFUCK(STDIN) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
#include "PP_TURING.h" | ||
|
||
PP_TURING(T, Q) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,5 +7,6 @@ | |
#include "PP_RECR.h" | ||
#include "PP_LIST.h" | ||
#include "PP_INT.h" | ||
#include "PP_CHAR.h" | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,150 @@ | ||
#ifndef PP_BRAINFUCK_H | ||
#define PP_BRAINFUCK_H | ||
|
||
/* | ||
PP_BRAINFUCK - brainfuck in c preprocessor | ||
*/ | ||
|
||
#define PP_BF_INSTR(C) PP_JOIN(PP_BF_SYM_, C) | ||
|
||
#define PP_BF_INSTR_R 1 | ||
#define PP_BF_INSTR_L 2 | ||
#define PP_BF_INSTR_P 3 | ||
#define PP_BF_INSTR_M 4 | ||
#define PP_BF_INSTR_O 5 | ||
#define PP_BF_INSTR_F 6 | ||
#define PP_BF_INSTR_B 7 | ||
#define PP_BF_INSTR_$ 8 | ||
|
||
#define PP_BF_INSTR_1 R | ||
#define PP_BF_INSTR_2 L | ||
#define PP_BF_INSTR_3 P | ||
#define PP_BF_INSTR_4 M | ||
#define PP_BF_INSTR_5 O | ||
#define PP_BF_INSTR_6 F | ||
#define PP_BF_INSTR_7 B | ||
#define PP_BF_INSTR_8 $ | ||
#include "PP.h" | ||
|
||
/*! | ||
* PP_BRAINFUCK | ||
* ============ | ||
* | ||
* About | ||
* ----- | ||
* | ||
* Brainfuck in c preprocessor | ||
* | ||
* | ||
* Input | ||
* ----- | ||
* | ||
* To ensure valid preprocessor symbols | ||
* instructions are mapped to the following | ||
* characters, with input disabled. | ||
* | ||
* + `>` => `R` | ||
* + `<` => `L` | ||
* + `+` => `U` | ||
* + `-` => `D` | ||
* + `.` => `O` | ||
* + `[` => `F` | ||
* + `]` => `B` | ||
* | ||
* | ||
* Structure | ||
* --------- | ||
* | ||
* IP - Brainfuck instr index | ||
* DP - Brainfuck data index | ||
* IA - Brainfuck instr array | ||
* DA - Brainfuck data array | ||
* | ||
* X - (IP, DP, IA, DA) | ||
* | ||
*/ | ||
|
||
/* Check if blank symbol */ | ||
#define PP_IS_BLANK(X) PP_JOIN(PP_IS_BLANK_, X) | ||
#define PP_IS_BLANK_ 1 | ||
#define PP_IS_BLANK_R 0 | ||
#define PP_IS_BLANK_L 0 | ||
#define PP_IS_BLANK_U 0 | ||
#define PP_IS_BLANK_D 0 | ||
#define PP_IS_BLANK_O 0 | ||
#define PP_IS_BLANK_F 0 | ||
#define PP_IS_BLANK_B 0 | ||
|
||
/* Check if output symbol */ | ||
#define PP_IS_OUTPUT(X) PP_JOIN(PP_IS_OUTPUT_, X) | ||
#define PP_IS_OUTPUT_ 0 | ||
#define PP_IS_OUTPUT_R 0 | ||
#define PP_IS_OUTPUT_L 0 | ||
#define PP_IS_OUTPUT_U 0 | ||
#define PP_IS_OUTPUT_D 0 | ||
#define PP_IS_OUTPUT_O 1 | ||
#define PP_IS_OUTPUT_F 0 | ||
#define PP_IS_OUTPUT_B 0 | ||
|
||
/* Check if forward symbol */ | ||
#define PP_IS_FORWARD(X) PP_JOIN(PP_IS_FORWARD_, X) | ||
#define PP_IS_FORWARD_ 0 | ||
#define PP_IS_FORWARD_R 0 | ||
#define PP_IS_FORWARD_L 0 | ||
#define PP_IS_FORWARD_U 0 | ||
#define PP_IS_FORWARD_D 0 | ||
#define PP_IS_FORWARD_O 0 | ||
#define PP_IS_FORWARD_F 1 | ||
#define PP_IS_FORWARD_B 0 | ||
|
||
/* Check if backward symbol */ | ||
#define PP_IS_BACKWARD(X) PP_JOIN(PP_IS_BACKWARD_, X) | ||
#define PP_IS_BACKWARD_ 0 | ||
#define PP_IS_BACKWARD_R 0 | ||
#define PP_IS_BACKWARD_L 0 | ||
#define PP_IS_BACKWARD_U 0 | ||
#define PP_IS_BACKWARD_D 0 | ||
#define PP_IS_BACKWARD_O 0 | ||
#define PP_IS_BACKWARD_F 0 | ||
#define PP_IS_BACKWARD_B 1 | ||
|
||
/* Get individual parts */ | ||
#define PP_BF_IP(X) PP_FST(X) | ||
#define PP_BF_DP(X) PP_SND(X) | ||
#define PP_BF_IA(X) PP_TRD(X) | ||
#define PP_BF_DA(X) PP_FTH(X) | ||
#define PP_BF_INSTR($, X) PP_NTH($, PP_BF_IA(X), PP_BF_IP(X)) | ||
#define PP_BF_DATA($, X) PP_NTH($, PP_BF_DA(X), PP_BF_DP(X)) | ||
|
||
/* Inc/Dec Data Item */ | ||
#define PP_BF_DATA_FST($, X) PP_TAKE($, PP_BF_DA(X), PP_BF_DP(X)) | ||
#define PP_BF_DATA_SND($, X) PP_DROP($, PP_BF_DA(X), PP_INC(PP_BF_DP(X))) | ||
#define PP_BF_DATA_INCED($, X) ( PP_INC(PP_NTH($, PP_BF_DA(X), PP_BF_DP(X))) ) | ||
#define PP_BF_DATA_DECED($, X) ( PP_DEC(PP_NTH($, PP_BF_DA(X), PP_BF_DP(X))) ) | ||
|
||
#define PP_BF_DATA_INC($, X) PP_CONCAT( PP_BF_DATA_FST($, X) , PP_CONCAT( PP_BF_DATA_INCED($, X) , PP_BF_DATA_SND($, X) ) ) | ||
#define PP_BF_DATA_DEC($, X) PP_CONCAT( PP_BF_DATA_FST($, X) , PP_CONCAT( PP_BF_DATA_DECED($, X) , PP_BF_DATA_SND($, X) ) ) | ||
|
||
/* Jump Forward/Back */ | ||
|
||
// TODO: Make count braces | ||
#define PP_BF_JUMP_FWD_E_TRD(S, I) PP_IF_ELSE(PP_IS_FOWARD(S), PP_INC(I), PP_IF_ELSE(PP_IS_BACKWARD(S), PP_DEC(I), I) ) | ||
|
||
#define PP_BF_JUMP_FWD_C($, X) PP_NOT(PP_IS_BACKWARD(PP_HEAD(PP_FST(X)))) | ||
#define PP_BF_JUMP_FWD_M($, X) | ||
#define PP_BF_JUMP_FWD_U($, X) (PP_TAIL(PP_FST(X)), PP_INC(PP_SND(X))) | ||
#define PP_BF_JUMP_FWD_E($, X) PP_INC(PP_SND(X)) | ||
#define PP_BF_JUMP_FWD($, X) PP_JOIN(PP_RECR_D, $)(PP_INC($), PP_BF_JUMP_FWD_C, PP_BF_JUMP_FWD_M, PP_BF_JUMP_FWD_U, PP_BF_JUMP_FWD_E, (PP_DROP($, PP_BF_IA(X), PP_BF_IP(X)), PP_BF_IP(X) ) ) | ||
|
||
// TODO: Make count braces | ||
#define PP_BF_JUMP_BCK_C($, X) PP_NOT( PP_IS_FORWARD(PP_NTH($, PP_FST(X), PP_SND(X))) ) | ||
#define PP_BF_JUMP_BCK_M($, X) | ||
#define PP_BF_JUMP_BCK_U($, X) ( PP_FST(X), PP_DEC(PP_SND(X)) ) | ||
#define PP_BF_JUMP_BCK_E($, X) PP_INC(PP_SND(X)) | ||
#define PP_BF_JUMP_BCK($, X) PP_JOIN(PP_RECR_D, $)(PP_INC($), PP_BF_JUMP_BCK_C, PP_BF_JUMP_BCK_M, PP_BF_JUMP_BCK_U, PP_BF_JUMP_BCK_E, (PP_BF_IA(X), PP_BF_IP(X)) ) | ||
|
||
#define PP_BF_JUMP_F($, X) PP_IF_ELSE(PP_BOOL(PP_BF_DATA($, X)), PP_INC(PP_BF_IP(X)), PP_BF_JUMP_FWD($, X) ) | ||
#define PP_BF_JUMP_B($, X) PP_IF_ELSE(PP_BOOL(PP_BF_DATA($, X)), PP_BF_JUMP_BCK($, X) , PP_INC(PP_BF_IP(X)) ) | ||
|
||
/* Brainfuck Symbol Update */ | ||
#define PP_BF_UPDATE_SYM($, S, X) PP_JOIN(PP_BF_UPDATE_SYM_, S)($, X) | ||
#define PP_BF_UPDATE_SYM_R($, X) (PP_INC(PP_BF_IP(X)), PP_INC(PP_BF_DP(X)), PP_BF_IA(X), PP_BF_DA(X)) | ||
#define PP_BF_UPDATE_SYM_L($, X) (PP_INC(PP_BF_IP(X)), PP_DEC(PP_BF_DP(X)), PP_BF_IA(X), PP_BF_DA(X)) | ||
#define PP_BF_UPDATE_SYM_U($, X) (PP_INC(PP_BF_IP(X)), PP_BF_DP(X), PP_BF_IA(X), PP_BF_DATA_INC($, X)) | ||
#define PP_BF_UPDATE_SYM_D($, X) (PP_INC(PP_BF_IP(X)), PP_BF_DP(X), PP_BF_IA(X), PP_BF_DATA_DEC($, X)) | ||
#define PP_BF_UPDATE_SYM_O($, X) (PP_INC(PP_BF_IP(X)), PP_BF_DP(X), PP_BF_IA(X), PP_BF_DA(X)) | ||
#define PP_BF_UPDATE_SYM_F($, X) (PP_BF_JUMP_F($, X), PP_BF_DP(X), PP_BF_IA(X), PP_BF_DA(X)) | ||
#define PP_BF_UPDATE_SYM_B($, X) (PP_BF_JUMP_B($, X), PP_BF_DP(X), PP_BF_IA(X), PP_BF_DA(X)) | ||
#define PP_BF_UPDATE_SYM_($, X) X | ||
|
||
|
||
#define PP_BF_COND($, X) PP_NOT(PP_IS_BLANK(PP_BF_INSTR($, X))) | ||
#define PP_BF_MACRO($, X) PP_IF(PP_IS_OUTPUT(PP_BF_INSTR($, X)), PP_CHAR(PP_BF_DATA($, X))) | ||
#define PP_BF_UPDATE($, X) PP_BF_UPDATE_SYM($, PP_BF_INSTR($, X), X) | ||
#define PP_BF_FINALLY($, X) | ||
#define PP_BF_RECR($, X) PP_JOIN(PP_RECR_D, $)(PP_INC($), PP_BF_COND, PP_BF_MACRO, PP_BF_UPDATE, PP_BF_FINALLY, X) | ||
|
||
#define PP_BF_DATA_EMPTY() (0,0,0,0,0) | ||
|
||
/* Perform Brainfuck with input I */ | ||
#define PP_BRAINFUCK(I) PP_BF_RECR($0, (0, 0, I, PP_BF_DATA_EMPTY())) | ||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
#ifndef PP_CHAR_H | ||
#define PP_CHAR_H | ||
|
||
#define PP_CHAR(X) PP_JOIN(PP_CHAR_, X) | ||
#define PP_CHAR_0 [NUL] | ||
#define PP_CHAR_1 [SOH] | ||
#define PP_CHAR_2 [STX] | ||
#define PP_CHAR_3 [ETX] | ||
#define PP_CHAR_4 [EOT] | ||
#define PP_CHAR_5 [ENQ] | ||
#define PP_CHAR_6 [ACK] | ||
#define PP_CHAR_7 [BEL] | ||
#define PP_CHAR_8 [BS] | ||
#define PP_CHAR_9 | ||
#define PP_CHAR_10 \ | ||
|
||
#define PP_CHAR_11 [VT] | ||
#define PP_CHAR_12 [FF] | ||
#define PP_CHAR_13 [CR] | ||
#define PP_CHAR_14 [SO] | ||
#define PP_CHAR_15 [SI] | ||
#define PP_CHAR_16 [DLE] | ||
#define PP_CHAR_17 [DC1] | ||
#define PP_CHAR_18 [DC2] | ||
#define PP_CHAR_19 [DC3] | ||
#define PP_CHAR_20 [DC4] | ||
#define PP_CHAR_21 [NAK] | ||
#define PP_CHAR_22 [SYN] | ||
#define PP_CHAR_23 [ETB] | ||
#define PP_CHAR_24 [CAN] | ||
#define PP_CHAR_25 [EM] | ||
#define PP_CHAR_26 [SUB] | ||
#define PP_CHAR_27 [ESC] | ||
#define PP_CHAR_28 [FS] | ||
#define PP_CHAR_29 [GS] | ||
#define PP_CHAR_30 [RS] | ||
#define PP_CHAR_31 [US] | ||
#define PP_CHAR_32 | ||
#define PP_CHAR_33 ! | ||
#define PP_CHAR_34 [DQ] | ||
#define PP_CHAR_35 # | ||
#define PP_CHAR_36 $ | ||
#define PP_CHAR_37 % | ||
#define PP_CHAR_38 & | ||
#define PP_CHAR_39 [SQ] | ||
#define PP_CHAR_40 ( | ||
#define PP_CHAR_41 ) | ||
#define PP_CHAR_42 * | ||
#define PP_CHAR_43 + | ||
#define PP_CHAR_44 , | ||
#define PP_CHAR_45 - | ||
#define PP_CHAR_46 . | ||
#define PP_CHAR_47 / | ||
#define PP_CHAR_48 0 | ||
#define PP_CHAR_49 1 | ||
#define PP_CHAR_50 2 | ||
#define PP_CHAR_51 3 | ||
#define PP_CHAR_52 4 | ||
#define PP_CHAR_53 5 | ||
#define PP_CHAR_54 6 | ||
#define PP_CHAR_55 7 | ||
#define PP_CHAR_56 8 | ||
#define PP_CHAR_57 9 | ||
#define PP_CHAR_58 : | ||
#define PP_CHAR_59 ; | ||
#define PP_CHAR_60 < | ||
#define PP_CHAR_61 = | ||
#define PP_CHAR_62 > | ||
#define PP_CHAR_63 ? | ||
#define PP_CHAR_64 @ | ||
#define PP_CHAR_65 A | ||
#define PP_CHAR_66 B | ||
#define PP_CHAR_67 C | ||
#define PP_CHAR_68 D | ||
#define PP_CHAR_69 E | ||
#define PP_CHAR_70 F | ||
#define PP_CHAR_71 G | ||
#define PP_CHAR_72 H | ||
#define PP_CHAR_73 I | ||
#define PP_CHAR_74 J | ||
#define PP_CHAR_75 K | ||
#define PP_CHAR_76 L | ||
#define PP_CHAR_77 M | ||
#define PP_CHAR_78 N | ||
#define PP_CHAR_79 O | ||
#define PP_CHAR_80 P | ||
#define PP_CHAR_81 Q | ||
#define PP_CHAR_82 R | ||
#define PP_CHAR_83 S | ||
#define PP_CHAR_84 T | ||
#define PP_CHAR_85 U | ||
#define PP_CHAR_86 V | ||
#define PP_CHAR_87 W | ||
#define PP_CHAR_88 X | ||
#define PP_CHAR_89 Y | ||
#define PP_CHAR_90 Z | ||
#define PP_CHAR_91 [ | ||
#define PP_CHAR_92 \ | ||
#define PP_CHAR_93 ] | ||
#define PP_CHAR_94 ^ | ||
#define PP_CHAR_95 _ | ||
#define PP_CHAR_96 ` | ||
#define PP_CHAR_97 a | ||
#define PP_CHAR_98 b | ||
#define PP_CHAR_99 c | ||
#define PP_CHAR_100 d | ||
#define PP_CHAR_101 e | ||
#define PP_CHAR_102 f | ||
#define PP_CHAR_103 g | ||
#define PP_CHAR_104 h | ||
#define PP_CHAR_105 i | ||
#define PP_CHAR_106 j | ||
#define PP_CHAR_107 k | ||
#define PP_CHAR_108 l | ||
#define PP_CHAR_109 m | ||
#define PP_CHAR_110 n | ||
#define PP_CHAR_111 o | ||
#define PP_CHAR_112 p | ||
#define PP_CHAR_113 q | ||
#define PP_CHAR_114 r | ||
#define PP_CHAR_115 s | ||
#define PP_CHAR_116 t | ||
#define PP_CHAR_117 u | ||
#define PP_CHAR_118 v | ||
#define PP_CHAR_119 w | ||
#define PP_CHAR_120 x | ||
#define PP_CHAR_121 y | ||
#define PP_CHAR_122 z | ||
#define PP_CHAR_123 { | ||
#define PP_CHAR_124 | | ||
#define PP_CHAR_125 } | ||
#define PP_CHAR_126 ~ | ||
#define PP_CHAR_127 DEL | ||
|
||
#endif |
Oops, something went wrong.