Brackets - the language of a BCC: generation
Welcome to []
.
The express purpose of this language is to provide MS Outlook with "Active Content" in
mail headers. The idea comes from the
habit of the members of the esolang news group to encode all their subjects in
square brackets and put them in the header, although it can be quite difficult
to do so when the subjects are still alive.
Features
- Can read the Subject: line from news files. In fact, it must read this line, because code cannot be placed anywhere else but the subject line of a news file.
- Gives spammers the chance of providing interactive spam. The world has been waiting for this !!!
- Uses only brackets as commands: []{}()<>, everything else is considered data
- The language model is, of course, reminisent of the great VAX assembler, the only assembler that can be sung.
Code model
The code model is very simple, and looks like a small assembler:
- MoveXtoY
({<<x]y)
- AddXtoY
({[<x]y)
- SubXFromY
({{<x]y)
- MultiplyXWithY
({}<x]y)
- DivideXWithY
([(<x]y)
- CompareXAndY
(]<<x]y)
- NandXToY
(}[<x]y)
- GotoLabelXIfNotEqual
(((<x)
- GotoLabelX
((<<x)
- DeclareLabelX
(([<x)
- PrintX
(({<x)
- ClearX
((}<x)
- NegateX
({(<x)
- ImmediateX
((<x>
- RegisterXIndirect
(<<x>
- RegisterXIndirectIncrement
([<x>
- RegisterXIndirectDecrement
({<x>
- GotoLabelXIfEqual
(}<x]
- RegisterX
(<x>
- DeclareDataX
[x}
Here is a typical [] code:
Subject: <>(()[Brackets])<()0)}())[)()0))(]])1)
<>>([)0)>[0]{(]()2)()))([)0))([])1)(]])2)
SDK
The [] source is a beauty to behold, if I may say so myself:
#include "precomp.h"
#include "gtools.h"
// The whole code is based on RESPECT.
#define D(x) char*x
#define E bool
#define F long
#define g return
#define G else
#define h false
#define H if
#define i true
#define I struct
#define j typedef
#define J for
#define k while
#define K *b[0].b
#define L PString
#define l ;
#define n ->
#define m a n a[
#define M R[11]
#define N (C*a){
#define o ==
#define O atoi
#define r(X,Y) E X N g(a n e=O(m 0]),(a n e>=0)&&(a n e<=13))?a n b=Y R[a n e],i:h l }
#define S(x) H(x) g h l
#define V(x) !a n f||!*a n f||!__(&a n f,&b[x],i)
#define X(y,z) E y N C b[2] l a n f=m 0] l S(V(0))a n f=m 1] l S(V(1))S(!b[1].b)S(!b[0].b)z l s(&b[0]) l U(s(&b[1]))}
#define v(x,y) X(x,*b[1].b y=K)
#define Q(x,y) E x N C b[1] l a n f=m 0] l S(V(0))S(!b[0].b)y l s(&b[0]) l U(s(&b[0]))}
#define q(x,y) E x N y l g i l }
#define U(x) x l g i l
I C l j E ( * c ) ( C * ) l I C { L a [ 2 ] l F * b , e l c d l D ( f ) l }
l F R [ 50000 ] l C t [ 931 ] l I T { D ( a ) l c b l } l T B [ ] l E _A( D
( * d ) , F _ , C * f ) { D ( b = * d ) l D ( c = B [ _ ] . a ) l D ( e = 0
) l f n e = 0 l k ( * c ) { H ( * c o 'x' ||* c o 'y' ) { H ( c [ 1 ] o * b
) { * b = 0 l f n a [ f n e++ ] = e l e = 0 l * b = c [ 1 ] l c +=2 l b++ l
} G { H ( ! e ) e = b l b++ l } } G S ( *c!=* b ) G c++ , b++ l } * d = b l
f n b = 0 l U ( f n d = B [ _ ] . b ) } E _k( C * a ) l E __( D ( * a ) , C
* c , E b ) { J ( F _ = 0 l B [ _ ] . a l _ ++) H ( _A( a , _ , c ) ) g ( b
||( c n d o _k) ) ? c n d ( c ) : i l g h l } E _z( C * a ) { U ( l ) }E _u
N U ( ( a n e = O ( m 0 ] ) , a n b = & a n e ) ) } r ( _y, & ) r ( _v, ( F
* ) ) r ( _x, ( F * ) ) r ( _w, ( F * ) ) E s ( C * a ) { H ( a n d o _x) R
[ a n e ] -=4 l H ( a n d o _w) R [ a n e ] +=4 l g i l } q ( _j, H (R[8737
] ) M = R [ 28361 + O ( m 0 ] ) ] ) q ( _h, H ( ! R [ 8737 ] ) M = R [28361
+ O ( m 0 ] ) ] ) q ( _i, M = R [ 28361 + O ( m 0 ] ) ] ) E _k( C * a ) { U
( R [ 28361 + O ( m 0 ] ) ] = M ) } Q ( _m, K = 0 ) Q ( _l, putchar ( K ) )
Q ( _n, K = ~ K ) E _a( C * a ) { C b [ 2 ] l a n f = m 0 ] l S ( V ( 0 ) )
a n f = m 1 ] l S ( V ( 1 ) ) S ( ! b [ 1 ] . b ) H ( b [ 0 ] . d o _z) { *
b [ 1 ] . b = ( F ) & ( R [13 + R [ 12] ] ) l J ( a n f = b [ 0 ] . a [ 0 ]
l * a n f l a n f++ ) R [ 13+ R [ 12] ++] = * a n f l R [ 13+ R [ 12] ++] =
0 l } G H ( b [ 0 ] . b ) * b [ 1 ] . b = K , s ( & b [ 0 ] ) l G g h l U (
s ( & b [ 1 ] ) ) } v ( _b, + ) v ( _c , - ) v ( _d, * ) v ( _e, / ) X ( _f
, R [ 8737] = ( * b [ 1 ] . b o K ) ) X ( _g, * b [ 1 ] . b = ~ ( * b [ 1 ]
. b ) &&~ ( K ) ) T B [ ] = { { "({<<x]y)", _a} , {"({[<x]y)", _b } , {
"({{<x]y)",_c},{"({}<x]y)",_d},{"([(<x]y)",_e}, {"(]<<x]y)",_f},{"(}[<x]y)",
_g},{"(((<x)",_h},{"((<<x)",_i},{"(([<x)",_k},{"(({<x)",_l},{"((}<x)",_m},{
"({(<x)",_n},{"((<x>",_u},{"(<<x>",_v},{"([<x>",_w},{"({<x>",_x},{"(}<x]",
_j},{"(<x>",_y},{"[x}",_z},{NULL,0}} l
int main( int argc, char* argv[] )
{
static char szSampleCode[] =
"({<<[Brackets!}](<0>)" // move "Brackets!",R0
"((}<(<1>)" // clear R1
"(([<1)" // declare label 1
"({<<([<0>](<2>)" // move.b (R0)+,R2
"(]<<(<1>](<2>)" // cmp.b r1,r2
"(}<0]" // if equal, goto label 0
"(({<(<2>)" // print.b R2
"((<<1)" // goto label 1
"(([<0)"; // declare label 0
D(a=szSampleCode) l C c l M = 0 l k(*a&&__(&a,&t[M++],h)) l
R[8736]=M l J(M=0 l M<R[8736] l M++) t[M].d(&t[M]) l
return 0;
} // main()
You can download the whole package here.