All Projects → metasepi → c2ats

metasepi / c2ats

Licence: GPL-3.0 license
generate ATS interface from C code

Programming Languages

ATS
13 projects

Projects that are alternatives of or similar to c2ats

okty
The simplest application to create and customize your docker projects
Stars: ✭ 48 (+152.63%)
Mutual labels:  generate
react-banner
A dynamic banner/header component.
Stars: ✭ 25 (+31.58%)
Mutual labels:  header
generative
A digital playground for experimenting with creative coding and WebGL
Stars: ✭ 50 (+163.16%)
Mutual labels:  generate
auto-commit-msg
A VS Code extension to generate a smart commit message based on file changes
Stars: ✭ 61 (+221.05%)
Mutual labels:  generate
42header.vim
Add and update the 42 comment header at the top of your files
Stars: ✭ 15 (-21.05%)
Mutual labels:  header
vscodefileheader
VSCode File Header
Stars: ✭ 17 (-10.53%)
Mutual labels:  header
rollup-plugin-generate-package-json
Generate package.json file with packages from your bundle using Rollup
Stars: ✭ 29 (+52.63%)
Mutual labels:  generate
http
Basic HTTP primitives which can be shared by servers and clients.
Stars: ✭ 75 (+294.74%)
Mutual labels:  header
pagination
Aplus Framework Pagination Library
Stars: ✭ 167 (+778.95%)
Mutual labels:  header
poop
Firefox extension that prevents sending Origin headers when they are least likely to be necessary, to protect your privacy.
Stars: ✭ 36 (+89.47%)
Mutual labels:  header
browserslist-generator
A library that makes generating and validating Browserslists a breeze!
Stars: ✭ 77 (+305.26%)
Mutual labels:  generate
readme-generator
Generate a readme from a template and package.json data. If you need something more comprehensive, I recommend using Verb.
Stars: ✭ 18 (-5.26%)
Mutual labels:  generate
cargo-scaffold
cargo scaffold lets you scaffold and generate projects described in a simple TOML file
Stars: ✭ 34 (+78.95%)
Mutual labels:  generate
test-data-generation
Test Data Generation
Stars: ✭ 35 (+84.21%)
Mutual labels:  generate
abstract-syntax-tree
A library for working with abstract syntax trees.
Stars: ✭ 77 (+305.26%)
Mutual labels:  generate
DTE
Generate C# class from database table
Stars: ✭ 26 (+36.84%)
Mutual labels:  generate
contextual
🌈 Generate your Ecto contexts using this macro and eliminate boilerplate
Stars: ✭ 18 (-5.26%)
Mutual labels:  generate
react-native-header-search-bar
Fully customizable header search bar for React Native
Stars: ✭ 101 (+431.58%)
Mutual labels:  header
get header
This function is similar to the get_headers function
Stars: ✭ 35 (+84.21%)
Mutual labels:  header
BitBruteForce-Wallet
No description or website provided.
Stars: ✭ 142 (+647.37%)
Mutual labels:  generate

c2ats - generate ATS interface from C code Build Status

What's this?

ATS is a statically typed programming language that unifies implementation with formal specification. It can powerfully capture invariant in program.

However, don't you feel frustration to use API of many C language libraries from ATS code? Don't you manually import such API into ATS code?

The c2ats is an utility to generate ATS's sats file importing from C language header, semi-automatically.

Requirements

We are testing this tool on Debian GNU/Linux.

Install

Checkout source code of the c2ats:

$ git clone https://github.com/metasepi/c2ats.git
$ cd c2ats

Then install it using stack:

$ cabal update
$ cabal install
$ which c2ats
/home/YourName/.cabal/bin/c2ats

Usage

Start from Hello World example. Create following fake C language header to use printf(3) function in C language:

$ vi example.h
#include <stdio.h>

Next, let the c2ats to generate ATS sats file from above header:

$ c2ats gen example.h > example.sats
$ wc -l example.sats
318 example.sats
$ grep _printf example.sats
fun fun_c2ats_printf: {l1:addr} (!ptr_v_1(char, l1) | ptr l1) -> int = "mac#printf"

The sats file has many ATS declarations generated from the C header. It includes a declaration of printf(3) which can be used as following in dats:

$ vi main.dats
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"

staload UN = "prelude/SATS/unsafe.sats"

staload "example.sats"

fun my_printf (s: string): void = {
  val p = string2ptr s
  val (pfat, fpfat | p) = $UN.ptr_vtake p
  val ret = fun_c2ats_printf (pfat | p)
  prval () = fpfat pfat
}

implement main0 () = {
  val s = "Hello, world!\n"
  val () = my_printf s
}
$ patscc main.dats
$ ./a.out
Hello, world!

Of course, above code is so messy. It's caused by assigning a bad signature to fun_c2ats_printf function. You can get better dats code, if modify sats file as following:

$ vi example.sats
--snip--
fun fun_c2ats_printf: (string) -> int = "mac#printf"
--snip--
$ vi main.dats
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"

staload UN = "prelude/SATS/unsafe.sats"

staload "example.sats"

implement main0 () = {
  val s = "Hello, world!\n"
  val _ = fun_c2ats_printf s
}
$ patscc main.dats
$ ./a.out
Hello, world!

Totally, the c2ats generates a scaffold (you may be familiar with Ruby on Rails) to build ATS application. Sometimes, it's useful to create application rapidly. However, such scaffold should be replaced with better signature until shipping your product.

The other examples are found at example directory.

See also

License

GPLv3 or later.

Copyright (c) 2016 Metasepi Team.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].