csnake
.. image:: https://gitlab.com/andrejr/csnake/badges/master/pipeline.svg
:alt: pipeline status
:target: https://gitlab.com/andrejr/csnake/pipelines
.. image:: https://gitlab.com/andrejr/csnake/badges/master/coverage.svg
:alt: coverage report
:target: https://andrejr.gitlab.io/csnake/coverage/index.html
Csnake is a Python 3 package that helps you generate C code from Python.
Csnake provides you with a consistent and opinionated API that helps you
structure your C-generating Python code.
It does so by providing classes and functions for generating every C language
construct.
Probably the most important feature is the ability to initialize a value to
struct
and array initializers from Python dicts and lists (actually,
Map
\s and Collection
\s), nested arbitrarily.
Here's a taste:
.. code-block:: python
from csnake import CodeWriter, Variable, FormattedLiteral
import numpy as np
var = Variable(
"test",
primitive="struct whatever",
value={
"field1": [{"x": num, "y": 10 - num} for num in range(2)],
"field2": {"test": range(3), "field": np.arange(6).reshape(2, 3)},
"field3": FormattedLiteral([30, 31, 32], int_formatter=hex),
"field4": 8,
},
)
cw = CodeWriter()
cw.add_variable_initialization(var)
print(cw)
This yields:
.. code-block:: c
struct whatever test = {
.field1 = {
{
.x = 0,
.y = 10
},{
.x = 1,
.y = 9
}
},
.field2 = {
.test = {0, 1, 2},
.field = {
{0, 1, 2},
{3, 4, 5}
}
},
.field3 = {0x1e, 0x1f, 0x20},
.field4 = 8
};
As shown, numpy
arrays are supported as values (so are sympy
arrays),
and values can be formatted by arbitrary functions (here we're using hex
to
output ints as hex literals for member field3
).
Motivation
Csnake's varable generation was motivated by a common embedded development
task: inputting data into C code.
Csnake should be of help when generating C code for representing data like
bitmaps, fonts, statemachines, lookup tables - as arrays and structs.
It can also be used for loop unrolling, templating, ...
Csnake can be easily incorporated into a build system (Make, CMake,
Scons,...), and also goes along great with Jinja2 and
Ned Batchelder's cog <https://nedbatchelder.com/code/cog/>
_.
Documentation
Documentation (Sphinx) can be viewed on
GitLab pages for this package <https://andrejr.gitlab.io/csnake/>
_.
Examples
Csnake is used on several of my yet-to-be-released open source embedded
projects. I'll be adding those (and other) examples along the way.
Credits
Csnake is a major re-implementation (and improvement) of
C-Snake <https://github.com/SchrodingersGat/C-Snake>
_
by
Oliver <https://github.com/SchrodingersGat>
_
(original idea) and Andrej (variable initialization idea and implementation,
author of this package).
It's provided under the MIT license.
Changelog
The changelog can be found within the documentation,
here <https://andrejr.gitlab.io/csnake/changes.html>
_.