Note: this is preliminary (version 0.0.1) and will undergo serious changes, breaking in format etc. Open issues for suggestions, bug reports etc.
Native Interface Definition
NID is a subset of C/C++ and the concept is inspired by tolua++
tool for the LUA language. The idea is to write a simplified C/C++ header with additional attributes which should convey the higher-level purpose of the API.
This software provides a parser component written in Node.JS which parses .nid
files into a JSON structure.
Couple of rules
- Comments are stripped.
- No preprocessor but
#include <header>
will be parsed and shown in JSON. - Function and variable declarations are parsed.
- C++11 attributes are shown in JSON and can be used to improve the bindings.
Usage
As executable:
# npm install -g nid-parser
# nid input.nid
As dependency:
# npm install --save nid-parser
var nid = require('nid');nid.parse(fs.readFileSync('sample.nid').toString('utf8'));
Example (taken from tests)
#include <stdio.h>#include <math.h> FILE* stdin;FILE* stdout; int some_random_integer; namespace std { double sqrt(double x); float sqrtf(float x); long double sqrtl(long double x);} [[handle,free(fclose)]] FILE* fopen(const char* filename, const char* mode); size_t fread([[cast(char*)]] void* ptr, size_t size, size_t nmemb, [[handle]] FILE* stream); [[destructor]] int fclose(FILE* f); class Rect { Rect(int x, int y, int w, int h); [[get(x)]] int x(); [[set(x)]] void setX(int x); [[get(y)]] int y(); [[set(y)]] void setY(int y); [[get(width)]] int width(); [[set(width)]] void setWidth(int width); [[get(height)]] int height(); [[set(height)]] void setHeight(int height); int area(); static int sharedArea(Rect a, Rect b);};
{ "declarations": [ { "pragma": "#include <stdio.h>" }, { "pragma": "#include <math.h>" }, { "variable": { "type": "FILE", "pointer": "*", "attributes": {}, "name": "stdin" } }, { "variable": { "type": "FILE", "pointer": "*", "attributes": {}, "name": "stdout" } }, { "variable": { "type": "int", "name": "some_random_integer", "attributes": {} } }, { "namespace": { "name": "std", "declarations": [ { "function": { "type": "double", "name": "sqrt", "attributes": {}, "parameters": [ { "type": "double", "name": "x", "attributes": {} } ] } }, { "function": { "type": "float", "name": "sqrtf", "attributes": {}, "parameters": [ { "type": "float", "name": "x", "attributes": {} } ] } }, { "function": { "type": "double long", "name": "sqrtl", "attributes": {}, "parameters": [ { "type": "double long", "name": "x", "attributes": {} } ] } } ] } }, { "variable": { "type": "FILE", "pointer": "*", "attributes": { "handle": true, "free": "fclose" }, "name": "fopen", "parameters": [ { "type": "const char", "pointer": "*", "attributes": {}, "name": "filename" }, { "type": "const char", "pointer": "*", "attributes": {}, "name": "mode" } ] } }, { "function": { "type": "size_t", "name": "fread", "attributes": {}, "parameters": [ { "type": "void", "pointer": "*", "attributes": { "cast": "char*" }, "name": "ptr" }, { "type": "size_t", "name": "size", "attributes": {} }, { "type": "size_t", "name": "nmemb", "attributes": {} }, { "type": "FILE", "pointer": "*", "attributes": { "handle": true }, "name": "stream" } ] } }, { "function": { "type": "int", "name": "fclose", "attributes": { "destructor": true }, "parameters": [ { "type": "FILE", "pointer": "*", "attributes": {}, "name": "f" } ] } }, { "class": { "name": "Rect", "declarations": [ { "constructor": { "name": "Rect", "attributes": {}, "parameters": [ { "type": "int", "name": "x", "attributes": {} }, { "type": "int", "name": "y", "attributes": {} }, { "type": "int", "name": "w", "attributes": {} }, { "type": "int", "name": "h", "attributes": {} } ] } }, { "function": { "type": "int", "name": "x", "attributes": { "get": "x" }, "parameters": [] } }, { "function": { "type": "void", "name": "setX", "attributes": { "set": "x" }, "parameters": [ { "type": "int", "name": "x", "attributes": {} } ] } }, { "function": { "type": "int", "name": "y", "attributes": { "get": "y" }, "parameters": [] } }, { "function": { "type": "void", "name": "setY", "attributes": { "set": "y" }, "parameters": [ { "type": "int", "name": "y", "attributes": {} } ] } }, { "function": { "type": "int", "name": "width", "attributes": { "get": "width" }, "parameters": [] } }, { "function": { "type": "void", "name": "setWidth", "attributes": { "set": "width" }, "parameters": [ { "type": "int", "name": "width", "attributes": {} } ] } }, { "function": { "type": "int", "name": "height", "attributes": { "get": "height" }, "parameters": [] } }, { "function": { "type": "void", "name": "setHeight", "attributes": { "set": "height" }, "parameters": [ { "type": "int", "name": "height", "attributes": {} } ] } }, { "function": { "type": "int", "name": "area", "attributes": {}, "parameters": [] } }, { "function": { "type": "int static", "name": "sharedArea", "attributes": {}, "parameters": [ { "type": "Rect", "name": "a", "attributes": {} }, { "type": "Rect", "name": "b", "attributes": {} } ] } } ] } } ]}