bfup 0.1.1

Preprocessor for brainfuck-like languages
Documentation
# **bfup**

[![Crate][crate_img]][crate]

Preprocessor for brainfuck-like languages.

It allows the user, like every decent preprocessor should,
to obfuscate their code with weird macros and obtuse syntax,
even being able to arrange the output code in a rectangle of set width.
 
**bfup** is meant to be used primarily on top of [brainfuck][bf] or
languages with brainfuck-like syntaxes, as it operates mainly on
single, utf-8 encoded characters. It is possible to wholly configure
the recognized operators *(characters)* and the defined preprocessor
directives' prefixes.

## Usage

### Basic usage:

```text
bfup [OPTIONS]... [FILE]
```

The list of all available flags can be seen by
using the `--help` flag.

### Behavior

The program tries to preprocess the provided file,
outputting only characters *(to stdin by default)*
specified as operators *([brainfuck operators][bf_ops] by default)*.
By default, the output is also arranged in a rectangle.

### Configuring

Recognized operators, as well as every directive character
used by the parser can be configured with corresponding 
command-line options or read from a [RON][ron] config file.

## Syntax

The preprocessor recognizes 5 basic types of '*tokens*':

| Token                                                  | Preprocessed as                                                                          |
|--------------------------------------------------------|------------------------------------------------------------------------------------------|
| Operators                                              | copied directly to the output                                                            |
| *Tokens* enclosed by `(` `)`                           | groups the *tokens* and treats them as a single token.                                   |
| `#` followed by a *number*                             | multiplies the next token *number* times                                                 |
| `$` followed by any *character*, followed by a *token* | defines a macro that substitutes every subsequent occurrence of *character* with *token* |
| `\`                                                    | skips the next character                                                                 |

## Example

Code evaluating to a [brainfuck][bf] program
that prints `Hello World!` followed by a newline:
```
$z([-]) $p(.z)

$H(#72+p)
$e(#101+p)
$l(#108+p)
$o(#111+p)
$,(#44+p)
$ (#32+p)
$W(#87+p)
$r(#114+p)
$d(#100+p)
$!(#33+p)
$/(#10+p)

Hello, World!/
```

## Caveats

Be wary, that ***every character*** can be defined as a macro; you can overwrite operators, preprocessor directive prefixes and even 
whitespace characters. For example:
```
$+(-) $
< $$([[[-]]])
+++$
```
evaluates to:
```
<---([[[-]]])
```
In addition, macro definitions take the very first valid token they encounter, this means that:
```
$m($z$a+([-])aa)
mz
```
evaluates to:
```
++[-]
```

## Contributing

I appreciate any bug report/contribution/criticism.

[bf]:https://en.wikipedia.org/wiki/Brainfuck
[bf_ops]:https://en.wikipedia.org/wiki/Brainfuck#Commands
[ron]:https://docs.rs/ron/latest/ron/

[crate]:https://crates.io/crates/bfup
[crate_img]:https://img.shields.io/crates/v/bfup.svg?logo=rust