Skip to content

Commit

Permalink
Brainfuck complete
Browse files Browse the repository at this point in the history
  • Loading branch information
orangeduck committed Nov 10, 2012
1 parent b3dafd2 commit 887038e
Show file tree
Hide file tree
Showing 12 changed files with 1,130 additions and 92 deletions.
4 changes: 3 additions & 1 deletion MAIN.h
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
#include "PP.h"
#include "PP_BRAINFUCK.h"

PP_BRAINFUCK(STDIN)
3 changes: 3 additions & 0 deletions MAIN_TM.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#include "PP_TURING.h"

PP_TURING(T, Q)
1 change: 1 addition & 0 deletions PP.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
#include "PP_RECR.h"
#include "PP_LIST.h"
#include "PP_INT.h"
#include "PP_CHAR.h"

#endif
167 changes: 142 additions & 25 deletions PP_BRAINFUCK.h
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
135 changes: 135 additions & 0 deletions PP_CHAR.h
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
Loading

0 comments on commit 887038e

Please sign in to comment.