alec

Abstraction Layer for Escape Codes
git clone git://git.dimitrijedobrota.com/alec.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

commit b02e0ba34e3a27238bfa660bedf1e87fb6313f15
parent 15a08272ab5daa5b79e57b254e06957053603d57
author Dimitrije Dobrota < mail@dimitrijedobrota.com >
date Sat, 7 Jun 2025 17:24:57 +0200

Version 0.2

Diffstat:
M README.md | ++++++++++ ------------------------------------------------------------------------
M vcpkg-configuration.json | + -

2 files changed, 13 insertions(+), 99 deletions(-)


diff --git a/ README.md b/ README.md

@@ -9,22 +9,11 @@ of ANSI Escape Codes from C++ project. It exports a set of template variables

to be used when the content is known at compile time, as well as a set of
functions to be used at run-time.

Since there are two set of functionalities I noticed a twofold code duplication
so I decided to add a preprocessing step that turns a bison-like config file
into the desired header, based on the set of simple rules. This step was not
100% necessary, and might be an overkill, but I wanted to experiment with this
concept for a while and now I have got the change.

Generator code shown here is written in flex and bison and can be easily
adapted for other use cases.


## Dependencies

* CMake 3.14 or latter
* Compiler with C++20 support (tested on clang version 16.0.5)
* Flex 2.6.4
* Bison 3.8.2


## Building and installing

@@ -40,7 +29,7 @@ Everything that this library provide is found in `alec` namespace.

Functions have names shown in the table below, whilst templates have suffix _v
and don't need to be called.

#### Available functions with short explanation
### Available functions with short explanation

| Name | parameters | Description |
|-------------------|---------------------|---------------------------------------------------|

@@ -78,29 +67,16 @@ and don't need to be called.

| paste_disable | | Turn off bracketed paste mode |


#### Enumeration

##### Ctrl

* BELL: Terminal bell
* BS: Backspace
* HT: Horizontal TAB
* LF: Linefeed (newline)
* VT: Vertical TAB
* FF: Formfeed
* CR: Carriage return
* ESC: Escape character
* DEL: Delete character
### Enumeration


##### Motion
#### Motion

* END: erase from cursor until end of screen/line
* BEGIN: erase from cursor to beginning of screen/line
* WHOLE: erase entire screen/line


##### Color
#### Color

* BLACK
* RED

@@ -113,7 +89,7 @@ and don't need to be called.

* DEFAULT


##### Decor
#### Decor

* RESET
* BOLD

@@ -126,81 +102,19 @@ and don't need to be called.

* STRIKE


## Configuration

Configuration file `alec.rules.hpp` is used to customize the output of
`alec.hpp` file. Similarly to Flex and Bison, configuration files needs to have
3 sections separated by `/*%%*/`: prologue, grammar and epilogue. Prologue and
epilogue are copied as-is to the output file whilst the grammar section
contains rules for generating template and function code.

* Rules can be separated by an arbitrary number of blank lines.
* Everything can have arbitrary indentation that is not carried to the resulting file.
* There could be C-style comments that are copied to the resulting file.

Each rule consists of 4 lines:
1. Name: name of the generated function, must be valid C++ name
2. Parameters: list of `type name` pairs separated by a comma
3. Constraints: list of constraint functions separated by a comma
4. Rules: list of chars and ints (or expressions producing them) separated by a
comma, or a single string literal

> You *must* use `|` character in place of empty list rule

### Constraints

* All constraints used in code generation must be defined in the prologue
* Every constraint listed will be applied to all of the arguments one by one.
* Every constraint has to have a function and template concept variant with the
same name, but suffix _v for the template one.
* Function constraints are translated into asserts, whilst template ones are used
in requires clause of the teconceptmplate.

### Examples

```c++
// begining of a header file

// tamplate constraint
template <int n>
concept limit_pos_v = n >= 0;

// function constraint
static inline bool limit_pos(int n) { return n >= 0; };

/*%%*//*

// comment that goes into output
decor_reset
Decor decor
|
(int)decor + 20, 'm'

screen_mode_set
int mode
limit_pos
'=', mode, 'h'

paste_enable
|
|
"?2004h"

*//*%%*/
## Contributing

// ending of a header file
```
See the [`CONTRIBUTING`](CONTRIBUTING.md) document.


## Version History

* 0.2
* Drop generation phase
* Modernize codebase
* Basic user input facilities
* 0.1
* Initial Release


## Contributing

See the [`CONTRIBUTING`](CONTRIBUTING.md) document.
* Initial development


## License

diff --git a/ vcpkg-configuration.json b/ vcpkg-configuration.json

@@ -8,7 +8,7 @@

{
"kind": "git",
"repository": "git://git.dimitrijedobrota.com/vcpkg-registry.git",
"baseline": "487d7c36bb87d45fb7f98f5bd6c7dd0bed9b8c08",
"baseline": "786b64a20fb1154200a454b8a3d12e318fcd117e",
"packages": [ "based" ]
}
]