Initial Commit
This commit is contained in:
5
.dep.inc
Normal file
5
.dep.inc
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# This code depends on make tool being used
|
||||||
|
DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES}))
|
||||||
|
ifneq (${DEPFILES},)
|
||||||
|
include ${DEPFILES}
|
||||||
|
endif
|
||||||
27
.gitignore
vendored
Normal file
27
.gitignore
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Object files
|
||||||
|
*.o
|
||||||
|
*.ko
|
||||||
|
*.obj
|
||||||
|
*.elf
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
*.lib
|
||||||
|
*.a
|
||||||
|
|
||||||
|
# Shared objects (inc. Windows DLLs)
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.i*86
|
||||||
|
*.x86_64
|
||||||
|
*.hex
|
||||||
|
|
||||||
|
#Other
|
||||||
|
/dist
|
||||||
|
/build
|
||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "lib/mpc"]
|
||||||
|
path = lib/mpc
|
||||||
|
url = https://github.com/orangeduck/mpc.git
|
||||||
128
Makefile
Normal file
128
Makefile
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
#
|
||||||
|
# There exist several targets which are by default empty and which can be
|
||||||
|
# used for execution of your targets. These targets are usually executed
|
||||||
|
# before and after some main targets. They are:
|
||||||
|
#
|
||||||
|
# .build-pre: called before 'build' target
|
||||||
|
# .build-post: called after 'build' target
|
||||||
|
# .clean-pre: called before 'clean' target
|
||||||
|
# .clean-post: called after 'clean' target
|
||||||
|
# .clobber-pre: called before 'clobber' target
|
||||||
|
# .clobber-post: called after 'clobber' target
|
||||||
|
# .all-pre: called before 'all' target
|
||||||
|
# .all-post: called after 'all' target
|
||||||
|
# .help-pre: called before 'help' target
|
||||||
|
# .help-post: called after 'help' target
|
||||||
|
#
|
||||||
|
# Targets beginning with '.' are not intended to be called on their own.
|
||||||
|
#
|
||||||
|
# Main targets can be executed directly, and they are:
|
||||||
|
#
|
||||||
|
# build build a specific configuration
|
||||||
|
# clean remove built files from a configuration
|
||||||
|
# clobber remove all built files
|
||||||
|
# all build all configurations
|
||||||
|
# help print help mesage
|
||||||
|
#
|
||||||
|
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
|
||||||
|
# .help-impl are implemented in nbproject/makefile-impl.mk.
|
||||||
|
#
|
||||||
|
# Available make variables:
|
||||||
|
#
|
||||||
|
# CND_BASEDIR base directory for relative paths
|
||||||
|
# CND_DISTDIR default top distribution directory (build artifacts)
|
||||||
|
# CND_BUILDDIR default top build directory (object files, ...)
|
||||||
|
# CONF name of current configuration
|
||||||
|
# CND_PLATFORM_${CONF} platform name (current configuration)
|
||||||
|
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
|
||||||
|
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
|
||||||
|
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
|
||||||
|
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
|
||||||
|
# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
|
||||||
|
# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
|
||||||
|
#
|
||||||
|
# NOCDDL
|
||||||
|
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
MKDIR=mkdir
|
||||||
|
CP=cp
|
||||||
|
CCADMIN=CCadmin
|
||||||
|
|
||||||
|
|
||||||
|
# build
|
||||||
|
build: .build-post
|
||||||
|
|
||||||
|
.build-pre:
|
||||||
|
# Add your pre 'build' code here...
|
||||||
|
|
||||||
|
.build-post: .build-impl
|
||||||
|
# Add your post 'build' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# clean
|
||||||
|
clean: .clean-post
|
||||||
|
|
||||||
|
.clean-pre:
|
||||||
|
# Add your pre 'clean' code here...
|
||||||
|
|
||||||
|
.clean-post: .clean-impl
|
||||||
|
# Add your post 'clean' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# clobber
|
||||||
|
clobber: .clobber-post
|
||||||
|
|
||||||
|
.clobber-pre:
|
||||||
|
# Add your pre 'clobber' code here...
|
||||||
|
|
||||||
|
.clobber-post: .clobber-impl
|
||||||
|
# Add your post 'clobber' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# all
|
||||||
|
all: .all-post
|
||||||
|
|
||||||
|
.all-pre:
|
||||||
|
# Add your pre 'all' code here...
|
||||||
|
|
||||||
|
.all-post: .all-impl
|
||||||
|
# Add your post 'all' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# build tests
|
||||||
|
build-tests: .build-tests-post
|
||||||
|
|
||||||
|
.build-tests-pre:
|
||||||
|
# Add your pre 'build-tests' code here...
|
||||||
|
|
||||||
|
.build-tests-post: .build-tests-impl
|
||||||
|
# Add your post 'build-tests' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# run tests
|
||||||
|
test: .test-post
|
||||||
|
|
||||||
|
.test-pre: build-tests
|
||||||
|
# Add your pre 'test' code here...
|
||||||
|
|
||||||
|
.test-post: .test-impl
|
||||||
|
# Add your post 'test' code here...
|
||||||
|
|
||||||
|
|
||||||
|
# help
|
||||||
|
help: .help-post
|
||||||
|
|
||||||
|
.help-pre:
|
||||||
|
# Add your pre 'help' code here...
|
||||||
|
|
||||||
|
.help-post: .help-impl
|
||||||
|
# Add your post 'help' code here...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# include project implementation makefile
|
||||||
|
include nbproject/Makefile-impl.mk
|
||||||
|
|
||||||
|
# include project make variables
|
||||||
|
include nbproject/Makefile-variables.mk
|
||||||
184
functions.c
Normal file
184
functions.c
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
#include "lang.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
void lenv_add_builtin(lenv* env, char* sym, lbuiltin func) {
|
||||||
|
lval* symval = lval_sym(sym);
|
||||||
|
lval* funcval = lval_func(func, sym);
|
||||||
|
|
||||||
|
lenv_put(env, symval, funcval);
|
||||||
|
|
||||||
|
lval_delete(symval);
|
||||||
|
lval_delete(funcval);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lenv_add_builtin_funcs(lenv* env) {
|
||||||
|
//Math functions
|
||||||
|
lenv_add_builtin(env, "+", builtin_add);
|
||||||
|
lenv_add_builtin(env, "-", builtin_sub);
|
||||||
|
lenv_add_builtin(env, "/", builtin_div);
|
||||||
|
lenv_add_builtin(env, "*", builtin_mul);
|
||||||
|
lenv_add_builtin(env, "^", builtin_pow);
|
||||||
|
|
||||||
|
//List/Util functions
|
||||||
|
lenv_add_builtin(env, "list", builtin_list);
|
||||||
|
lenv_add_builtin(env, "eval", builtin_eval);
|
||||||
|
lenv_add_builtin(env, "join", builtin_join);
|
||||||
|
lenv_add_builtin(env, "head", builtin_head);
|
||||||
|
lenv_add_builtin(env, "tail", builtin_tail);
|
||||||
|
|
||||||
|
//ENV Functions
|
||||||
|
lenv_add_builtin(env, "def", builtin_def);
|
||||||
|
lenv_add_builtin(env, "listenv", builtin_listenv);
|
||||||
|
lenv_add_builtin(env, "exit", builtin_exit);
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* builtin_add(lenv* env, lval* val) {
|
||||||
|
return builtin_op(env, val, "+");
|
||||||
|
}
|
||||||
|
lval* builtin_sub(lenv* env, lval* val) {
|
||||||
|
return builtin_op(env, val, "-");
|
||||||
|
}
|
||||||
|
lval* builtin_div(lenv* env, lval* val) {
|
||||||
|
return builtin_op(env, val, "+");
|
||||||
|
}
|
||||||
|
lval* builtin_mul(lenv* env, lval* val) {
|
||||||
|
return builtin_op(env, val, "*");
|
||||||
|
}
|
||||||
|
lval* builtin_pow(lenv* env, lval* val){
|
||||||
|
return builtin_op(env, val, "^");
|
||||||
|
}
|
||||||
|
lval* builtin_op(lenv* env, lval* val, char* op) {
|
||||||
|
//Ensure numbers only
|
||||||
|
for(int i = 0; i < val->cell_count; i++) {
|
||||||
|
if (val->cell_list[i]->type != LVAL_NUM) {
|
||||||
|
lval_delete(val);
|
||||||
|
return lval_err(LERR_BAD_NUM);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get the first element
|
||||||
|
lval* x = lval_pop(val, 0);
|
||||||
|
|
||||||
|
if (strcmp(op, "-") == 0 && val->cell_count == 0) {
|
||||||
|
x->data.num = -x->data.num;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(val->cell_count > 0) {
|
||||||
|
//Get next to process
|
||||||
|
lval* y = lval_pop(val, 0);
|
||||||
|
|
||||||
|
if (strcmp(op, "+") == 0) { x->data.num += y->data.num; }
|
||||||
|
if (strcmp(op, "-") == 0) { x->data.num -= y->data.num; }
|
||||||
|
if (strcmp(op, "*") == 0) { x->data.num *= y->data.num; }
|
||||||
|
if (strcmp(op, "^") == 0) { x->data.num = pow(x->data.num,y->data.num); }
|
||||||
|
if (strcmp(op, "/") == 0) {
|
||||||
|
int zero = 0;
|
||||||
|
if (y->type == LVAL_NUM && fabs(y->data.num) <= DBL_EPSILON) {zero = 1;}
|
||||||
|
|
||||||
|
if (zero) {
|
||||||
|
lval_delete(x);
|
||||||
|
lval_delete(y);
|
||||||
|
x = lval_err(LERR_DIV_ZERO);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
x->data.num /= y->data.num;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval_delete(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
lval_delete(val);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* builtin_list(lenv* env, lval* val){
|
||||||
|
val->type = LVAL_Q_EXPR;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
lval* builtin_eval(lenv* env, lval* val){
|
||||||
|
LASSERT_ARG_COUNT("eval", val, val, 1);
|
||||||
|
LASSERT_TYPE("eval", val, val->cell_list[0], LVAL_Q_EXPR);
|
||||||
|
|
||||||
|
lval* x = lval_take(val, 0);
|
||||||
|
x->type = LVAL_S_EXPR;
|
||||||
|
return eval(env, x);
|
||||||
|
}
|
||||||
|
lval* builtin_join(lenv* env, lval* val){
|
||||||
|
LASSERT_MIN_ARG_COUNT("join", val, val, 1);
|
||||||
|
for(int i = 0; i < val->cell_count; i++) {
|
||||||
|
LASSERT_TYPE("join", val, val->cell_list[i], LVAL_Q_EXPR);
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* x = lval_pop(val,0);
|
||||||
|
|
||||||
|
while(val->cell_count > 0) {
|
||||||
|
x = lval_join(x, lval_pop(val, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
lval* builtin_head(lenv* env, lval* val){
|
||||||
|
LASSERT_ARG_COUNT("head",val , val, 1);
|
||||||
|
LASSERT_TYPE("head",val , val->cell_list[0], LVAL_Q_EXPR);
|
||||||
|
LASSERT_MIN_ARG_COUNT("head", val, val->cell_list[0], 1);
|
||||||
|
|
||||||
|
lval* x = lval_take(val, 0);
|
||||||
|
while(x->cell_count > 1) { lval_delete(lval_pop(x, 1)); }
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
lval* builtin_tail(lenv* env, lval* val){
|
||||||
|
LASSERT_ARG_COUNT("tail",val , val, 1);
|
||||||
|
LASSERT_TYPE("tail", val, val->cell_list[0], LVAL_Q_EXPR);
|
||||||
|
LASSERT_MIN_ARG_COUNT("tail", val, val->cell_list[0], 1);
|
||||||
|
|
||||||
|
lval* x = lval_take(val, 0);
|
||||||
|
lval_delete(lval_pop(x, 0));
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* builtin_def(lenv* env, lval* val) {
|
||||||
|
LASSERT_MIN_ARG_COUNT("def", val, val, 1);
|
||||||
|
LASSERT_TYPE("def", val, val->cell_list[0], LVAL_Q_EXPR);
|
||||||
|
|
||||||
|
lval* symbols = val->cell_list[0];
|
||||||
|
|
||||||
|
for(int i = 0; i < symbols->cell_count; i++) {
|
||||||
|
LASSERT_TYPE("def", val, symbols->cell_list[i], LVAL_SYM);
|
||||||
|
}
|
||||||
|
|
||||||
|
LASSERT(val, symbols->cell_count == val->cell_count -1,
|
||||||
|
LERR_OTHER, "def: incorrect number of definitions for symbols");
|
||||||
|
|
||||||
|
for(int i = 0; i < symbols->cell_count; i++) {
|
||||||
|
lenv_put(env, symbols->cell_list[i], val->cell_list[i+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
lval_delete(val);
|
||||||
|
return lval_s_expr();
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* builtin_listenv(lenv* env, lval* val) {
|
||||||
|
for(int i=0; i< env->count; i++) {
|
||||||
|
printf("%s: ", env->syms[i]->sym);
|
||||||
|
lval_println(env->syms[i]->lval);
|
||||||
|
}
|
||||||
|
lval_delete(val);
|
||||||
|
return lval_s_expr();
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* builtin_exit(lenv* env, lval* val) {
|
||||||
|
lval* args = lval_q_expr();
|
||||||
|
for(int i=0; i<val->cell_count; i++) {
|
||||||
|
lval_add(args, lval_copy(val->cell_list[i]));
|
||||||
|
}
|
||||||
|
lval* sym = lval_sym("exitcode");
|
||||||
|
lenv_put(env, sym, args);
|
||||||
|
lval_delete(args);
|
||||||
|
lval_delete(sym);
|
||||||
|
|
||||||
|
lval_delete(val);
|
||||||
|
return lval_exit();
|
||||||
|
}
|
||||||
46
functions.h
Normal file
46
functions.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* File: functions.h
|
||||||
|
* Author: sam
|
||||||
|
*
|
||||||
|
* Created on 18 May 2014, 22:41
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FUNCTIONS_H
|
||||||
|
#define FUNCTIONS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "lang.h"
|
||||||
|
|
||||||
|
void lenv_add_builtin(lenv* env, char* sym, lbuiltin func);
|
||||||
|
|
||||||
|
void lenv_add_builtin_funcs(lenv* env);
|
||||||
|
|
||||||
|
//Math functions
|
||||||
|
lval* builtin_add(lenv* env, lval* val);
|
||||||
|
lval* builtin_sub(lenv* env, lval* val);
|
||||||
|
lval* builtin_div(lenv* env, lval* val);
|
||||||
|
lval* builtin_mul(lenv* env, lval* val);
|
||||||
|
lval* builtin_pow(lenv* env, lval* val);
|
||||||
|
lval* builtin_op(lenv* env, lval* val, char* op);
|
||||||
|
|
||||||
|
//List/Util functions
|
||||||
|
lval* builtin_list(lenv* env, lval* val);
|
||||||
|
lval* builtin_eval(lenv* env, lval* val);
|
||||||
|
lval* builtin_join(lenv* env, lval* val);
|
||||||
|
lval* builtin_head(lenv* env, lval* val);
|
||||||
|
lval* builtin_tail(lenv* env, lval* val);
|
||||||
|
|
||||||
|
//ENV Functions
|
||||||
|
lval* builtin_def(lenv* env, lval* val);
|
||||||
|
lval* builtin_listenv(lenv* env, lval* val);
|
||||||
|
lval* builtin_exit(lenv* env, lval* val);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* FUNCTIONS_H */
|
||||||
|
|
||||||
121
lang.c
Normal file
121
lang.c
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
#include <float.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "mpc.h"
|
||||||
|
#include "lang.h"
|
||||||
|
|
||||||
|
mpc_ast_t* tokenize(char *input) {
|
||||||
|
|
||||||
|
mpc_parser_t* Number = mpc_new("number");
|
||||||
|
mpc_parser_t* Symbol = mpc_new("symbol");
|
||||||
|
mpc_parser_t* S_Expr = mpc_new("s_expr");
|
||||||
|
mpc_parser_t* Q_Expr = mpc_new("q_expr");
|
||||||
|
mpc_parser_t* Expr = mpc_new("expr");
|
||||||
|
mpc_parser_t* Lispy = mpc_new("lispy");
|
||||||
|
|
||||||
|
mpca_lang(MPCA_LANG_DEFAULT,
|
||||||
|
" \
|
||||||
|
number : /-?[0-9]+(\\.[0-9]+)?/ ; \
|
||||||
|
symbol : /[a-zA-Z0-9_+\\-*\\/\\\\=<>!&]+/ ; \
|
||||||
|
s_expr : '(' <expr>* ')' ; \
|
||||||
|
q_expr : '{' <expr>* '}' ; \
|
||||||
|
expr : <number> | <symbol> | <s_expr> | <q_expr> ; \
|
||||||
|
lispy : /^/ <expr>+ /$/ ; \
|
||||||
|
",
|
||||||
|
Number, Symbol, Expr, S_Expr, Q_Expr, Lispy);
|
||||||
|
|
||||||
|
mpc_result_t result;
|
||||||
|
int success = 1;
|
||||||
|
|
||||||
|
if (!mpc_parse("<stdin>", input,Lispy, &result)) {
|
||||||
|
success = 0;
|
||||||
|
mpc_err_print(result.error);
|
||||||
|
mpc_err_delete(result.error);
|
||||||
|
}
|
||||||
|
|
||||||
|
mpc_cleanup(6, Number, Symbol, S_Expr, Expr, Lispy, Q_Expr);
|
||||||
|
|
||||||
|
return success ? (mpc_ast_t*)result.output : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* parse(mpc_ast_t *t) {
|
||||||
|
if (strstr(t->tag, "number")) {
|
||||||
|
errno = 0;
|
||||||
|
double_t d = strtod(t->contents, NULL);
|
||||||
|
return errno != 0 ? lval_err_detail(LERR_BAD_NUM, strerror(errno)) : lval_num(d);
|
||||||
|
}
|
||||||
|
if (strstr(t->tag, "symbol")) {
|
||||||
|
return lval_sym(t->contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* result = NULL;
|
||||||
|
if (strcmp(t->tag, ">") == 0) { result = lval_s_expr(); }
|
||||||
|
if (result == NULL && strstr(t->tag, "s_expr")) { result = lval_s_expr(); }
|
||||||
|
if (result == NULL && strstr(t->tag, "q_expr")) { result = lval_q_expr(); }
|
||||||
|
|
||||||
|
for (int i = 0; i < t->children_num; i++) {
|
||||||
|
if (strcmp(t->children[i]->contents, "(") == 0) { continue; }
|
||||||
|
if (strcmp(t->children[i]->contents, ")") == 0) { continue; }
|
||||||
|
if (strcmp(t->children[i]->contents, "}") == 0) { continue; }
|
||||||
|
if (strcmp(t->children[i]->contents, "{") == 0) { continue; }
|
||||||
|
if (strcmp(t->children[i]->tag, "regex") == 0) { continue; }
|
||||||
|
result = lval_add(result, parse(t->children[i]));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* eval_s_expr(lenv* env, lval* val) {
|
||||||
|
|
||||||
|
//Eval children
|
||||||
|
for(int i = 0; i < val->cell_count; i++) {
|
||||||
|
val->cell_list[i] = eval(env, val->cell_list[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Check for errors or exit
|
||||||
|
for(int i = 0; i < val->cell_count; i++) {
|
||||||
|
if (val->cell_list[i]->type == LVAL_ERR) {
|
||||||
|
return lval_take(val, i);
|
||||||
|
}
|
||||||
|
if (val->cell_list[i]->type == LVAL_EXIT) {
|
||||||
|
lval* exit = lval_copy(val->cell_list[i]);
|
||||||
|
lval_delete(val);
|
||||||
|
return exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//empty
|
||||||
|
if (val->cell_count == 0) {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
//single
|
||||||
|
if (val->cell_count == 1) {
|
||||||
|
return lval_take(val, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Ensure first is symbol
|
||||||
|
lval* func = lval_pop(val, 0);
|
||||||
|
if (func->type != LVAL_FUNC) {
|
||||||
|
VAL_TYPE type = func->type;
|
||||||
|
lval_delete(func);
|
||||||
|
lval_delete(val);
|
||||||
|
return lval_err_detail(LERR_BAD_OP, "First element is not %s got %s", lval_str_name(LVAL_FUNC), lval_str_name(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Call builtin
|
||||||
|
lval* result = func->data.func.call(env, val);
|
||||||
|
lval_delete(func);
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
lval* eval(lenv* env, lval* val) {
|
||||||
|
if (val->type == LVAL_SYM) {
|
||||||
|
lval* x = lenv_get(env, val);
|
||||||
|
lval_delete(val);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
if (val->type == LVAL_S_EXPR) {
|
||||||
|
return eval_s_expr(env, val);
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
49
lang.h
Normal file
49
lang.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* File: lang.h
|
||||||
|
* Author: sam
|
||||||
|
*
|
||||||
|
* Created on 18 May 2014, 21:19
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LANG_H
|
||||||
|
#define LANG_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "mpc.h"
|
||||||
|
#include "lval.h"
|
||||||
|
#include "lenv.h"
|
||||||
|
#include "functions.h"
|
||||||
|
|
||||||
|
#define LASSERT(val, cond, errnum, errdetail, ...) \
|
||||||
|
if (!(cond)) { \
|
||||||
|
lval * err = lval_err_detail(errnum, errdetail, ##__VA_ARGS__); \
|
||||||
|
lval_delete(val); \
|
||||||
|
return err; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LASSERT_TYPE(name, val, subject, expectedType) \
|
||||||
|
LASSERT(val, subject->type == expectedType, \
|
||||||
|
LERR_SYNTAX, "%s Expected type %s got %s", name, lval_str_name(expectedType), lval_str_name(subject->type))
|
||||||
|
#define LASSERT_ARG_COUNT(name, val, subject, expectedNum) \
|
||||||
|
LASSERT(val, subject->cell_count == expectedNum, \
|
||||||
|
LERR_SYNTAX, "%s Expected %ld arguments got %ld", name, expectedNum, subject->cell_count )
|
||||||
|
#define LASSERT_MIN_ARG_COUNT(name, val, subject, expectedNum) \
|
||||||
|
LASSERT(val, subject->cell_count >= expectedNum, \
|
||||||
|
LERR_SYNTAX, "%s Expected %ld or more arguments got %ld", name, expectedNum, subject->cell_count )
|
||||||
|
|
||||||
|
mpc_ast_t* tokenize(char *input);
|
||||||
|
lval* parse(mpc_ast_t *t);
|
||||||
|
lval* eval_builtin_op(lval* val, char* op);
|
||||||
|
lval* eval_s_expr(lenv* env, lval* val);
|
||||||
|
lval* eval(lenv* env, lval* val);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LANG_H */
|
||||||
|
|
||||||
92
lenv.c
Normal file
92
lenv.c
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <bits/stdlib-bsearch.h>
|
||||||
|
|
||||||
|
#include "lang.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
lenv* lenv_new() {
|
||||||
|
lenv* env = calloc(1, sizeof(lenv));
|
||||||
|
env->count = 0;
|
||||||
|
env->syms = NULL;
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
void lenv_delete(lenv* env) {
|
||||||
|
for(int i = 0; i < env->count; i++) {
|
||||||
|
lval_delete(env->syms[i]->lval);
|
||||||
|
free(env->syms[i]->sym);
|
||||||
|
free(env->syms[i]);
|
||||||
|
}
|
||||||
|
free(env->syms);
|
||||||
|
free(env);
|
||||||
|
}
|
||||||
|
|
||||||
|
int lenv_compare_symtabs(const void *lhs, const void *rhs) {
|
||||||
|
const struct symtab* l = *(const struct symtab**)lhs;
|
||||||
|
const struct symtab* r = *(const struct symtab**)rhs;
|
||||||
|
|
||||||
|
return strcmp(l->sym, r->sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lenv_sort(lenv* env) {
|
||||||
|
qsort(env->syms, env->count, sizeof(symtab*), lenv_compare_symtabs);
|
||||||
|
}
|
||||||
|
|
||||||
|
symtab* lenv_search(lenv* env, char* sym) {
|
||||||
|
if (env->count == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
symtab* searchElem = symtab_new(sym, NULL);
|
||||||
|
|
||||||
|
symtab** searchComp = calloc(1, sizeof(symtab*));
|
||||||
|
searchComp[0] = searchElem;
|
||||||
|
|
||||||
|
symtab** result = bsearch(searchComp, env->syms, env->count, sizeof(symtab*), lenv_compare_symtabs);
|
||||||
|
|
||||||
|
free(searchComp);
|
||||||
|
symtab_delete(searchElem);
|
||||||
|
|
||||||
|
if (result == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return *result;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lenv_get(lenv* env, lval* sym) {
|
||||||
|
LASSERT(sym, sym->type == LVAL_SYM, LERR_BAD_OP, "Expected symbol");
|
||||||
|
|
||||||
|
symtab* result = lenv_search(env, sym->data.sym);
|
||||||
|
return result != NULL ? lval_copy(result->lval) : lval_err(LERR_BAD_SYM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lenv_put(lenv* env, lval* key, lval* val) {
|
||||||
|
symtab* result = lenv_search(env, key->data.sym);
|
||||||
|
if (result != NULL) {
|
||||||
|
lval_delete(result->lval);
|
||||||
|
result->lval = lval_copy(val);
|
||||||
|
|
||||||
|
lenv_sort(env);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
env->count ++;
|
||||||
|
|
||||||
|
env->syms = realloc(env->syms, sizeof(symtab*) * env->count);
|
||||||
|
|
||||||
|
env->syms[env->count-1] = symtab_new(key->data.sym, val);
|
||||||
|
|
||||||
|
lenv_sort(env);
|
||||||
|
}
|
||||||
|
|
||||||
|
symtab* symtab_new(char* sym, lval* lval) {
|
||||||
|
symtab* new = calloc(1, sizeof(symtab));
|
||||||
|
new->lval = lval == NULL ? NULL : lval_copy(lval);
|
||||||
|
new->sym = strdup(sym);
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
void symtab_delete(symtab* symtab) {
|
||||||
|
if (symtab->lval != NULL) {
|
||||||
|
lval_delete(symtab->lval);
|
||||||
|
}
|
||||||
|
free(symtab->sym);
|
||||||
|
free(symtab);
|
||||||
|
}
|
||||||
49
lenv.h
Normal file
49
lenv.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* File: lenv.h
|
||||||
|
* Author: sam
|
||||||
|
*
|
||||||
|
* Created on 18 May 2014, 21:36
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LENV_H
|
||||||
|
#define LENV_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct lenv;
|
||||||
|
typedef struct lenv lenv;
|
||||||
|
|
||||||
|
struct symtab;
|
||||||
|
typedef struct symtab symtab;
|
||||||
|
|
||||||
|
struct symtab {
|
||||||
|
char* sym;
|
||||||
|
lval* lval;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct lenv {
|
||||||
|
size_t count;
|
||||||
|
struct symtab** syms;
|
||||||
|
};
|
||||||
|
|
||||||
|
lenv* lenv_new();
|
||||||
|
void lenv_delete(lenv* env);
|
||||||
|
|
||||||
|
int lenv_compare_symtabs(const void *a, const void *b);
|
||||||
|
void lenv_sort(lenv* env);
|
||||||
|
symtab* lenv_search(lenv* env, char* sym);
|
||||||
|
|
||||||
|
lval* lenv_get(lenv* env, lval* sym);
|
||||||
|
void lenv_put(lenv* env, lval* key, lval* val);
|
||||||
|
|
||||||
|
symtab* symtab_new(char* sym, lval* lval);
|
||||||
|
void symtab_delete(symtab* symtab);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LENV_H */
|
||||||
|
|
||||||
1
lib/mpc
Submodule
1
lib/mpc
Submodule
Submodule lib/mpc added at 6af8360517
190
lval.c
Normal file
190
lval.c
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "lang.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
lval* lval_new(int type) {
|
||||||
|
lval* val = calloc(1,sizeof(lval));
|
||||||
|
val->type = type;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_num(double_t x) {
|
||||||
|
lval* val = lval_new(LVAL_NUM);
|
||||||
|
val->data.num = x;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_sym(char* x) {
|
||||||
|
lval* val = lval_new(LVAL_SYM);
|
||||||
|
val->data.sym = strdup(x);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_s_expr() {
|
||||||
|
lval* val = lval_new(LVAL_S_EXPR);
|
||||||
|
val->cell_count = 0;
|
||||||
|
val->cell_list = NULL;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_q_expr() {
|
||||||
|
lval* val = lval_new(LVAL_Q_EXPR);
|
||||||
|
val->cell_count = 0;
|
||||||
|
val->cell_list = NULL;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_func(lbuiltin func, char* name) {
|
||||||
|
lval* val = lval_new(LVAL_FUNC);
|
||||||
|
val->data.func.call = func;
|
||||||
|
val->data.func.name = strdup(name);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
lval* lval_exit() {
|
||||||
|
lval* val = lval_new(LVAL_EXIT);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_add(lval* val, lval* x) {
|
||||||
|
val->cell_count++;
|
||||||
|
val->cell_list = realloc(val->cell_list, sizeof(lval*)*val->cell_count);
|
||||||
|
val->cell_list[val->cell_count-1] = x;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_pop(lval* val, int index) {
|
||||||
|
//Get the item
|
||||||
|
lval* x = val->cell_list[index];
|
||||||
|
|
||||||
|
//Re-create the list ignoring the index we are extracting
|
||||||
|
lval** newList = NULL;
|
||||||
|
if (val->cell_count-1 > 0) {
|
||||||
|
newList = calloc(val->cell_count-1, sizeof(lval*));
|
||||||
|
int k = 0;
|
||||||
|
for(int i=0; i < val->cell_count; i++) {
|
||||||
|
if (i == index) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
newList[k++] = val->cell_list[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val->cell_count--;
|
||||||
|
free(val->cell_list);
|
||||||
|
val->cell_list = newList;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_take(lval* val, int i) {
|
||||||
|
lval* x = lval_pop(val, i);
|
||||||
|
lval_delete(val);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_join(lval* a, lval* b) {
|
||||||
|
while(b->cell_count > 0) {
|
||||||
|
lval_add(a, lval_pop(b,0));
|
||||||
|
}
|
||||||
|
lval_delete(b);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
void lval_delete(lval* val) {
|
||||||
|
switch(val->type) {
|
||||||
|
case LVAL_NUM: break;
|
||||||
|
case LVAL_EXIT: break;
|
||||||
|
case LVAL_FUNC: free(val->data.func.name); break;
|
||||||
|
|
||||||
|
case LVAL_SYM: free(val->data.sym); break;
|
||||||
|
case LVAL_ERR:
|
||||||
|
if (val->data.err.detail != NULL) {
|
||||||
|
free(val->data.err.detail);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LVAL_Q_EXPR:
|
||||||
|
case LVAL_S_EXPR:
|
||||||
|
for (int i = 0; i < val->cell_count; i++) {
|
||||||
|
lval_delete(val->cell_list[i]);
|
||||||
|
}
|
||||||
|
if (val->cell_count > 0) {
|
||||||
|
free(val->cell_list);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
free(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_copy(lval* current) {
|
||||||
|
lval* new = lval_new(current->type);
|
||||||
|
|
||||||
|
switch(current->type) {
|
||||||
|
case LVAL_FUNC:
|
||||||
|
new->data.func.call = current->data.func.call;
|
||||||
|
new->data.func.name = strdup(current->data.func.name);
|
||||||
|
break;
|
||||||
|
case LVAL_NUM: new->data.num = current->data.num; break;
|
||||||
|
case LVAL_EXIT: break;
|
||||||
|
|
||||||
|
case LVAL_SYM: new->data.sym = strdup(current->data.sym); break;
|
||||||
|
case LVAL_ERR:
|
||||||
|
new->data.err.num = current->data.err.num;
|
||||||
|
new->data.err.detail = current->data.err.detail == NULL ? NULL : strdup(current->data.err.detail);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LVAL_Q_EXPR:
|
||||||
|
case LVAL_S_EXPR:
|
||||||
|
new->cell_count = current->cell_count;
|
||||||
|
if (new->cell_count == 0) {
|
||||||
|
new->cell_list = NULL;
|
||||||
|
} else {
|
||||||
|
new->cell_list = calloc(new->cell_count, sizeof(lval*));
|
||||||
|
for(int i=0; i < new->cell_count; i++) {
|
||||||
|
new->cell_list[i] = lval_copy(current->cell_list[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_err(VAL_ERROR err){
|
||||||
|
return lval_err_detail(err, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
lval* lval_err_detail(VAL_ERROR err, char* format, ...){
|
||||||
|
lval* val = lval_new(LVAL_ERR);
|
||||||
|
val->data.err.num = err;
|
||||||
|
|
||||||
|
va_list va;
|
||||||
|
va_start(va, format);
|
||||||
|
|
||||||
|
val->data.err.detail = calloc(512, sizeof(char));
|
||||||
|
|
||||||
|
vsnprintf(val->data.err.detail, 511, format, va);
|
||||||
|
|
||||||
|
if (strlen(val->data.err.detail) == 0) {
|
||||||
|
free(val->data.err.detail);
|
||||||
|
val->data.err.detail = NULL;
|
||||||
|
} else {
|
||||||
|
val->data.err.detail = realloc(val->data.err.detail, strlen(val->data.err.detail)+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(va);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* lval_str_name(VAL_TYPE type) {
|
||||||
|
switch(type) {
|
||||||
|
case LVAL_ERR: return "Error";
|
||||||
|
case LVAL_FUNC: return "Function";
|
||||||
|
case LVAL_NUM: return "Numeric";
|
||||||
|
case LVAL_Q_EXPR: return "Q-Expression";
|
||||||
|
case LVAL_SYM: return "Symbol";
|
||||||
|
case LVAL_S_EXPR: return "S-Expression";
|
||||||
|
default: return "UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
72
lval.h
Normal file
72
lval.h
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* File: lval.h
|
||||||
|
* Author: sam
|
||||||
|
*
|
||||||
|
* Created on 18 May 2014, 21:22
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LVAL_H
|
||||||
|
#define LVAL_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct lval;
|
||||||
|
typedef struct lval lval;
|
||||||
|
|
||||||
|
#include "lenv.h"
|
||||||
|
|
||||||
|
enum VAL_TYPE { LVAL_ERR, LVAL_NUM, LVAL_SYM, LVAL_FUNC, LVAL_S_EXPR, LVAL_Q_EXPR, LVAL_EXIT };
|
||||||
|
enum VAL_ERROR { LERR_DIV_ZERO, LERR_BAD_OP, LERR_BAD_NUM, LERR_BAD_SYM, LERR_OTHER, LERR_SYNTAX };
|
||||||
|
typedef enum VAL_TYPE VAL_TYPE;
|
||||||
|
typedef enum VAL_ERROR VAL_ERROR;
|
||||||
|
|
||||||
|
typedef lval*(*lbuiltin)(lenv*, lval*);
|
||||||
|
|
||||||
|
typedef struct lval {
|
||||||
|
enum VAL_TYPE type;
|
||||||
|
union {
|
||||||
|
double_t num;
|
||||||
|
char* sym;
|
||||||
|
struct {
|
||||||
|
enum VAL_ERROR num;
|
||||||
|
char* detail;
|
||||||
|
} err;
|
||||||
|
struct {
|
||||||
|
char* name;
|
||||||
|
lbuiltin call;
|
||||||
|
} func;
|
||||||
|
} data;
|
||||||
|
|
||||||
|
int cell_count;
|
||||||
|
struct lval** cell_list;
|
||||||
|
|
||||||
|
} lval;
|
||||||
|
|
||||||
|
lval* lval_new(int type);
|
||||||
|
lval* lval_num(double_t x);
|
||||||
|
lval* lval_sym(char* x);
|
||||||
|
lval* lval_s_expr();
|
||||||
|
lval* lval_q_expr();
|
||||||
|
lval* lval_func(lbuiltin func, char* name);
|
||||||
|
lval* lval_exit();
|
||||||
|
|
||||||
|
lval* lval_add(lval* val, lval* x);
|
||||||
|
lval* lval_pop(lval* val, int i);
|
||||||
|
lval* lval_take(lval* val, int i);
|
||||||
|
lval* lval_join(lval* a, lval* b);
|
||||||
|
|
||||||
|
void lval_delete(lval* val);
|
||||||
|
lval* lval_copy(lval* current);
|
||||||
|
|
||||||
|
lval* lval_err(VAL_ERROR x);
|
||||||
|
lval* lval_err_detail(VAL_ERROR x, char* format, ...);
|
||||||
|
char* lval_str_name(VAL_TYPE type);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LVAL_H */
|
||||||
|
|
||||||
124
main.c
Normal file
124
main.c
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* File: main.c
|
||||||
|
* Author: sam
|
||||||
|
*
|
||||||
|
* Created on 17 May 2014, 11:49
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <editline/readline.h>
|
||||||
|
#include <editline/history.h>
|
||||||
|
|
||||||
|
#include "mpc.h"
|
||||||
|
#include "lang.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
|
||||||
|
printf("KLisp Version %s\n", VERSION);
|
||||||
|
|
||||||
|
//Init environment
|
||||||
|
lenv* env = lenv_new();
|
||||||
|
lenv_add_builtin_funcs(env);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
char *input = readline("> ");
|
||||||
|
if (NULL == input) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
add_history(input);
|
||||||
|
|
||||||
|
mpc_ast_t* ast_result = tokenize(input);
|
||||||
|
|
||||||
|
free(input);
|
||||||
|
|
||||||
|
if (ast_result != NULL) {
|
||||||
|
|
||||||
|
//Parse the ast
|
||||||
|
lval* result = parse(ast_result);
|
||||||
|
if (result == NULL) {
|
||||||
|
result = lval_err(LERR_OTHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Evaluate
|
||||||
|
result = eval(env, result);
|
||||||
|
|
||||||
|
int exit = 0;
|
||||||
|
if (result != NULL && result->type == LVAL_EXIT) {
|
||||||
|
exit = 1;
|
||||||
|
} else {
|
||||||
|
//print the result
|
||||||
|
lval_println(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Cleanup
|
||||||
|
lval_delete(result);
|
||||||
|
mpc_ast_delete(ast_result);
|
||||||
|
|
||||||
|
if (exit == 1) {
|
||||||
|
printf("Program Terminated: ");
|
||||||
|
|
||||||
|
lval* sym = lval_sym("exitcode");
|
||||||
|
lval* exitcode = lenv_get(env, sym);
|
||||||
|
lval_println(exitcode);
|
||||||
|
lval_delete(exitcode);
|
||||||
|
lval_delete(sym);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
lenv_delete(env);
|
||||||
|
|
||||||
|
return (EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lval_expr_print(lval* val, char* open, char* close) {
|
||||||
|
printf("%s", open);
|
||||||
|
|
||||||
|
for(int i = 0; i < val->cell_count ; i++) {
|
||||||
|
lval_print(val->cell_list[i]);
|
||||||
|
|
||||||
|
if (i != val->cell_count-1) {
|
||||||
|
putchar(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s", close);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lval_print(lval* val) {
|
||||||
|
switch(val->type) {
|
||||||
|
case LVAL_NUM: printf("%g", val->data.num); break;
|
||||||
|
case LVAL_SYM: printf("%s", val->data.sym); break;
|
||||||
|
case LVAL_S_EXPR: lval_expr_print(val, "(", ")"); break;
|
||||||
|
case LVAL_Q_EXPR: lval_expr_print(val, "{", "}"); break;
|
||||||
|
case LVAL_FUNC: printf("<%s>", val->data.func.name); break;
|
||||||
|
case LVAL_EXIT: printf("exit"); break;
|
||||||
|
case LVAL_ERR:
|
||||||
|
printf("Error: ");
|
||||||
|
switch(val->data.err.num) {
|
||||||
|
case LERR_DIV_ZERO: printf("Divide By Zero"); break;
|
||||||
|
case LERR_BAD_NUM: printf("Bad Number"); break;
|
||||||
|
case LERR_BAD_OP: printf("Invalid Operator"); break;
|
||||||
|
case LERR_BAD_SYM: printf("Unknown/Invalid Symbol"); break;
|
||||||
|
case LERR_OTHER: printf("Unknown Error"); break;
|
||||||
|
case LERR_SYNTAX: printf("Syntax Error"); break;
|
||||||
|
default: printf("Unknown Error"); break;
|
||||||
|
}
|
||||||
|
if (val->data.err.detail != NULL) {
|
||||||
|
printf(", %s", val->data.err.detail);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void lval_println(lval* val) {
|
||||||
|
lval_print(val);
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
28
main.h
Normal file
28
main.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* File: main.h
|
||||||
|
* Author: sam
|
||||||
|
*
|
||||||
|
* Created on 17 May 2014, 16:15
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAIN_H
|
||||||
|
#define MAIN_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define VERSION "0.1"
|
||||||
|
|
||||||
|
int main(int argc, char** argv);
|
||||||
|
|
||||||
|
void lval_expr_print(lval* val, char* open, char* close);
|
||||||
|
void lval_print(lval* val);
|
||||||
|
void lval_println(lval* val);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* MAIN_H */
|
||||||
|
|
||||||
120
nbproject/Makefile-Debug.mk
Normal file
120
nbproject/Makefile-Debug.mk
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#
|
||||||
|
# Generated Makefile - do not edit!
|
||||||
|
#
|
||||||
|
# Edit the Makefile in the project folder instead (../Makefile). Each target
|
||||||
|
# has a -pre and a -post target defined where you can add customized code.
|
||||||
|
#
|
||||||
|
# This makefile implements configuration specific macros and targets.
|
||||||
|
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
MKDIR=mkdir
|
||||||
|
CP=cp
|
||||||
|
GREP=grep
|
||||||
|
NM=nm
|
||||||
|
CCADMIN=CCadmin
|
||||||
|
RANLIB=ranlib
|
||||||
|
CC=gcc
|
||||||
|
CCC=g++
|
||||||
|
CXX=g++
|
||||||
|
FC=gfortran
|
||||||
|
AS=as
|
||||||
|
|
||||||
|
# Macros
|
||||||
|
CND_PLATFORM=GNU-Linux-x86
|
||||||
|
CND_DLIB_EXT=so
|
||||||
|
CND_CONF=Debug
|
||||||
|
CND_DISTDIR=dist
|
||||||
|
CND_BUILDDIR=build
|
||||||
|
|
||||||
|
# Include project Makefile
|
||||||
|
include Makefile
|
||||||
|
|
||||||
|
# Object Directory
|
||||||
|
OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
|
||||||
|
|
||||||
|
# Object Files
|
||||||
|
OBJECTFILES= \
|
||||||
|
${OBJECTDIR}/_ext/1360931409/mpc.o \
|
||||||
|
${OBJECTDIR}/functions.o \
|
||||||
|
${OBJECTDIR}/lang.o \
|
||||||
|
${OBJECTDIR}/lenv.o \
|
||||||
|
${OBJECTDIR}/lval.o \
|
||||||
|
${OBJECTDIR}/main.o \
|
||||||
|
${OBJECTDIR}/util.o
|
||||||
|
|
||||||
|
|
||||||
|
# C Compiler Flags
|
||||||
|
CFLAGS=-O0
|
||||||
|
|
||||||
|
# CC Compiler Flags
|
||||||
|
CCFLAGS=
|
||||||
|
CXXFLAGS=
|
||||||
|
|
||||||
|
# Fortran Compiler Flags
|
||||||
|
FFLAGS=
|
||||||
|
|
||||||
|
# Assembler Flags
|
||||||
|
ASFLAGS=
|
||||||
|
|
||||||
|
# Link Libraries and Options
|
||||||
|
LDLIBSOPTIONS=`pkg-config --libs libedit` -lm
|
||||||
|
|
||||||
|
# Build Targets
|
||||||
|
.build-conf: ${BUILD_SUBPROJECTS}
|
||||||
|
"${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp
|
||||||
|
|
||||||
|
${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp: ${OBJECTFILES}
|
||||||
|
${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
|
||||||
|
${LINK.c} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp ${OBJECTFILES} ${LDLIBSOPTIONS}
|
||||||
|
|
||||||
|
${OBJECTDIR}/_ext/1360931409/mpc.o: ../mpc/mpc.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}/_ext/1360931409
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -g -Wall -Ilib/mpc `pkg-config --cflags libedit` -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/1360931409/mpc.o ../mpc/mpc.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/functions.o: functions.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -g -Wall -Ilib/mpc `pkg-config --cflags libedit` -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/functions.o functions.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/lang.o: lang.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -g -Wall -Ilib/mpc `pkg-config --cflags libedit` -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lang.o lang.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/lenv.o: lenv.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -g -Wall -Ilib/mpc `pkg-config --cflags libedit` -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lenv.o lenv.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/lval.o: lval.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -g -Wall -Ilib/mpc `pkg-config --cflags libedit` -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lval.o lval.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/main.o: main.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -g -Wall -Ilib/mpc `pkg-config --cflags libedit` -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/util.o: util.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -g -Wall -Ilib/mpc `pkg-config --cflags libedit` -std=c99 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/util.o util.c
|
||||||
|
|
||||||
|
# Subprojects
|
||||||
|
.build-subprojects:
|
||||||
|
|
||||||
|
# Clean Targets
|
||||||
|
.clean-conf: ${CLEAN_SUBPROJECTS}
|
||||||
|
${RM} -r ${CND_BUILDDIR}/${CND_CONF}
|
||||||
|
${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp
|
||||||
|
|
||||||
|
# Subprojects
|
||||||
|
.clean-subprojects:
|
||||||
|
|
||||||
|
# Enable dependency checking
|
||||||
|
.dep.inc: .depcheck-impl
|
||||||
|
|
||||||
|
include .dep.inc
|
||||||
120
nbproject/Makefile-Release.mk
Normal file
120
nbproject/Makefile-Release.mk
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#
|
||||||
|
# Generated Makefile - do not edit!
|
||||||
|
#
|
||||||
|
# Edit the Makefile in the project folder instead (../Makefile). Each target
|
||||||
|
# has a -pre and a -post target defined where you can add customized code.
|
||||||
|
#
|
||||||
|
# This makefile implements configuration specific macros and targets.
|
||||||
|
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
MKDIR=mkdir
|
||||||
|
CP=cp
|
||||||
|
GREP=grep
|
||||||
|
NM=nm
|
||||||
|
CCADMIN=CCadmin
|
||||||
|
RANLIB=ranlib
|
||||||
|
CC=gcc
|
||||||
|
CCC=g++
|
||||||
|
CXX=g++
|
||||||
|
FC=gfortran
|
||||||
|
AS=as
|
||||||
|
|
||||||
|
# Macros
|
||||||
|
CND_PLATFORM=GNU-Linux-x86
|
||||||
|
CND_DLIB_EXT=so
|
||||||
|
CND_CONF=Release
|
||||||
|
CND_DISTDIR=dist
|
||||||
|
CND_BUILDDIR=build
|
||||||
|
|
||||||
|
# Include project Makefile
|
||||||
|
include Makefile
|
||||||
|
|
||||||
|
# Object Directory
|
||||||
|
OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
|
||||||
|
|
||||||
|
# Object Files
|
||||||
|
OBJECTFILES= \
|
||||||
|
${OBJECTDIR}/_ext/1360931409/mpc.o \
|
||||||
|
${OBJECTDIR}/functions.o \
|
||||||
|
${OBJECTDIR}/lang.o \
|
||||||
|
${OBJECTDIR}/lenv.o \
|
||||||
|
${OBJECTDIR}/lval.o \
|
||||||
|
${OBJECTDIR}/main.o \
|
||||||
|
${OBJECTDIR}/util.o
|
||||||
|
|
||||||
|
|
||||||
|
# C Compiler Flags
|
||||||
|
CFLAGS=
|
||||||
|
|
||||||
|
# CC Compiler Flags
|
||||||
|
CCFLAGS=
|
||||||
|
CXXFLAGS=
|
||||||
|
|
||||||
|
# Fortran Compiler Flags
|
||||||
|
FFLAGS=
|
||||||
|
|
||||||
|
# Assembler Flags
|
||||||
|
ASFLAGS=
|
||||||
|
|
||||||
|
# Link Libraries and Options
|
||||||
|
LDLIBSOPTIONS=
|
||||||
|
|
||||||
|
# Build Targets
|
||||||
|
.build-conf: ${BUILD_SUBPROJECTS}
|
||||||
|
"${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp
|
||||||
|
|
||||||
|
${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp: ${OBJECTFILES}
|
||||||
|
${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
|
||||||
|
${LINK.c} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp ${OBJECTFILES} ${LDLIBSOPTIONS}
|
||||||
|
|
||||||
|
${OBJECTDIR}/_ext/1360931409/mpc.o: ../mpc/mpc.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}/_ext/1360931409
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/1360931409/mpc.o ../mpc/mpc.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/functions.o: functions.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/functions.o functions.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/lang.o: lang.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lang.o lang.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/lenv.o: lenv.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lenv.o lenv.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/lval.o: lval.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/lval.o lval.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/main.o: main.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.c
|
||||||
|
|
||||||
|
${OBJECTDIR}/util.o: util.c
|
||||||
|
${MKDIR} -p ${OBJECTDIR}
|
||||||
|
${RM} "$@.d"
|
||||||
|
$(COMPILE.c) -O2 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/util.o util.c
|
||||||
|
|
||||||
|
# Subprojects
|
||||||
|
.build-subprojects:
|
||||||
|
|
||||||
|
# Clean Targets
|
||||||
|
.clean-conf: ${CLEAN_SUBPROJECTS}
|
||||||
|
${RM} -r ${CND_BUILDDIR}/${CND_CONF}
|
||||||
|
${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp
|
||||||
|
|
||||||
|
# Subprojects
|
||||||
|
.clean-subprojects:
|
||||||
|
|
||||||
|
# Enable dependency checking
|
||||||
|
.dep.inc: .depcheck-impl
|
||||||
|
|
||||||
|
include .dep.inc
|
||||||
133
nbproject/Makefile-impl.mk
Normal file
133
nbproject/Makefile-impl.mk
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
#
|
||||||
|
# Generated Makefile - do not edit!
|
||||||
|
#
|
||||||
|
# Edit the Makefile in the project folder instead (../Makefile). Each target
|
||||||
|
# has a pre- and a post- target defined where you can add customization code.
|
||||||
|
#
|
||||||
|
# This makefile implements macros and targets common to all configurations.
|
||||||
|
#
|
||||||
|
# NOCDDL
|
||||||
|
|
||||||
|
|
||||||
|
# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
|
||||||
|
# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
|
||||||
|
# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
|
||||||
|
# and .clean-reqprojects-conf unless SUB has the value 'no'
|
||||||
|
SUB_no=NO
|
||||||
|
SUBPROJECTS=${SUB_${SUB}}
|
||||||
|
BUILD_SUBPROJECTS_=.build-subprojects
|
||||||
|
BUILD_SUBPROJECTS_NO=
|
||||||
|
BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
|
||||||
|
CLEAN_SUBPROJECTS_=.clean-subprojects
|
||||||
|
CLEAN_SUBPROJECTS_NO=
|
||||||
|
CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
|
||||||
|
|
||||||
|
|
||||||
|
# Project Name
|
||||||
|
PROJECTNAME=KLisp
|
||||||
|
|
||||||
|
# Active Configuration
|
||||||
|
DEFAULTCONF=Debug
|
||||||
|
CONF=${DEFAULTCONF}
|
||||||
|
|
||||||
|
# All Configurations
|
||||||
|
ALLCONFS=Debug Release
|
||||||
|
|
||||||
|
|
||||||
|
# build
|
||||||
|
.build-impl: .build-pre .validate-impl .depcheck-impl
|
||||||
|
@#echo "=> Running $@... Configuration=$(CONF)"
|
||||||
|
"${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf
|
||||||
|
|
||||||
|
|
||||||
|
# clean
|
||||||
|
.clean-impl: .clean-pre .validate-impl .depcheck-impl
|
||||||
|
@#echo "=> Running $@... Configuration=$(CONF)"
|
||||||
|
"${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf
|
||||||
|
|
||||||
|
|
||||||
|
# clobber
|
||||||
|
.clobber-impl: .clobber-pre .depcheck-impl
|
||||||
|
@#echo "=> Running $@..."
|
||||||
|
for CONF in ${ALLCONFS}; \
|
||||||
|
do \
|
||||||
|
"${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
|
||||||
|
done
|
||||||
|
|
||||||
|
# all
|
||||||
|
.all-impl: .all-pre .depcheck-impl
|
||||||
|
@#echo "=> Running $@..."
|
||||||
|
for CONF in ${ALLCONFS}; \
|
||||||
|
do \
|
||||||
|
"${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \
|
||||||
|
done
|
||||||
|
|
||||||
|
# build tests
|
||||||
|
.build-tests-impl: .build-impl .build-tests-pre
|
||||||
|
@#echo "=> Running $@... Configuration=$(CONF)"
|
||||||
|
"${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf
|
||||||
|
|
||||||
|
# run tests
|
||||||
|
.test-impl: .build-tests-impl .test-pre
|
||||||
|
@#echo "=> Running $@... Configuration=$(CONF)"
|
||||||
|
"${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf
|
||||||
|
|
||||||
|
# dependency checking support
|
||||||
|
.depcheck-impl:
|
||||||
|
@echo "# This code depends on make tool being used" >.dep.inc
|
||||||
|
@if [ -n "${MAKE_VERSION}" ]; then \
|
||||||
|
echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES}))" >>.dep.inc; \
|
||||||
|
echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
|
||||||
|
echo "include \$${DEPFILES}" >>.dep.inc; \
|
||||||
|
echo "endif" >>.dep.inc; \
|
||||||
|
else \
|
||||||
|
echo ".KEEP_STATE:" >>.dep.inc; \
|
||||||
|
echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# configuration validation
|
||||||
|
.validate-impl:
|
||||||
|
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
|
||||||
|
then \
|
||||||
|
echo ""; \
|
||||||
|
echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
|
||||||
|
echo "See 'make help' for details."; \
|
||||||
|
echo "Current directory: " `pwd`; \
|
||||||
|
echo ""; \
|
||||||
|
fi
|
||||||
|
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
|
||||||
|
then \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# help
|
||||||
|
.help-impl: .help-pre
|
||||||
|
@echo "This makefile supports the following configurations:"
|
||||||
|
@echo " ${ALLCONFS}"
|
||||||
|
@echo ""
|
||||||
|
@echo "and the following targets:"
|
||||||
|
@echo " build (default target)"
|
||||||
|
@echo " clean"
|
||||||
|
@echo " clobber"
|
||||||
|
@echo " all"
|
||||||
|
@echo " help"
|
||||||
|
@echo ""
|
||||||
|
@echo "Makefile Usage:"
|
||||||
|
@echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
|
||||||
|
@echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
|
||||||
|
@echo " make [SUB=no] clobber"
|
||||||
|
@echo " make [SUB=no] all"
|
||||||
|
@echo " make help"
|
||||||
|
@echo ""
|
||||||
|
@echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
|
||||||
|
@echo " also build subprojects."
|
||||||
|
@echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
|
||||||
|
@echo " also clean subprojects."
|
||||||
|
@echo "Target 'clobber' will remove all built files from all configurations and,"
|
||||||
|
@echo " unless 'SUB=no', also from subprojects."
|
||||||
|
@echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
|
||||||
|
@echo " also build subprojects."
|
||||||
|
@echo "Target 'help' prints this message."
|
||||||
|
@echo ""
|
||||||
|
|
||||||
35
nbproject/Makefile-variables.mk
Normal file
35
nbproject/Makefile-variables.mk
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Generated - do not edit!
|
||||||
|
#
|
||||||
|
# NOCDDL
|
||||||
|
#
|
||||||
|
CND_BASEDIR=`pwd`
|
||||||
|
CND_BUILDDIR=build
|
||||||
|
CND_DISTDIR=dist
|
||||||
|
# Debug configuration
|
||||||
|
CND_PLATFORM_Debug=GNU-Linux-x86
|
||||||
|
CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux-x86
|
||||||
|
CND_ARTIFACT_NAME_Debug=klisp
|
||||||
|
CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux-x86/klisp
|
||||||
|
CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux-x86/package
|
||||||
|
CND_PACKAGE_NAME_Debug=klisp.tar
|
||||||
|
CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux-x86/package/klisp.tar
|
||||||
|
# Release configuration
|
||||||
|
CND_PLATFORM_Release=GNU-Linux-x86
|
||||||
|
CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux-x86
|
||||||
|
CND_ARTIFACT_NAME_Release=klisp
|
||||||
|
CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux-x86/klisp
|
||||||
|
CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux-x86/package
|
||||||
|
CND_PACKAGE_NAME_Release=klisp.tar
|
||||||
|
CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux-x86/package/klisp.tar
|
||||||
|
#
|
||||||
|
# include compiler specific variables
|
||||||
|
#
|
||||||
|
# dmake command
|
||||||
|
ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \
|
||||||
|
(mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)
|
||||||
|
#
|
||||||
|
# gmake command
|
||||||
|
.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk))
|
||||||
|
#
|
||||||
|
include nbproject/private/Makefile-variables.mk
|
||||||
76
nbproject/Package-Debug.bash
Normal file
76
nbproject/Package-Debug.bash
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generated - do not edit!
|
||||||
|
#
|
||||||
|
|
||||||
|
# Macros
|
||||||
|
TOP=`pwd`
|
||||||
|
CND_PLATFORM=GNU-Linux-x86
|
||||||
|
CND_CONF=Debug
|
||||||
|
CND_DISTDIR=dist
|
||||||
|
CND_BUILDDIR=build
|
||||||
|
CND_DLIB_EXT=so
|
||||||
|
NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
|
||||||
|
TMPDIRNAME=tmp-packaging
|
||||||
|
OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp
|
||||||
|
OUTPUT_BASENAME=klisp
|
||||||
|
PACKAGE_TOP_DIR=klisp/
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
function checkReturnCode
|
||||||
|
{
|
||||||
|
rc=$?
|
||||||
|
if [ $rc != 0 ]
|
||||||
|
then
|
||||||
|
exit $rc
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function makeDirectory
|
||||||
|
# $1 directory path
|
||||||
|
# $2 permission (optional)
|
||||||
|
{
|
||||||
|
mkdir -p "$1"
|
||||||
|
checkReturnCode
|
||||||
|
if [ "$2" != "" ]
|
||||||
|
then
|
||||||
|
chmod $2 "$1"
|
||||||
|
checkReturnCode
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function copyFileToTmpDir
|
||||||
|
# $1 from-file path
|
||||||
|
# $2 to-file path
|
||||||
|
# $3 permission
|
||||||
|
{
|
||||||
|
cp "$1" "$2"
|
||||||
|
checkReturnCode
|
||||||
|
if [ "$3" != "" ]
|
||||||
|
then
|
||||||
|
chmod $3 "$2"
|
||||||
|
checkReturnCode
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setup
|
||||||
|
cd "${TOP}"
|
||||||
|
mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
|
||||||
|
rm -rf ${NBTMPDIR}
|
||||||
|
mkdir -p ${NBTMPDIR}
|
||||||
|
|
||||||
|
# Copy files and create directories and links
|
||||||
|
cd "${TOP}"
|
||||||
|
makeDirectory "${NBTMPDIR}/klisp/bin"
|
||||||
|
copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
|
||||||
|
|
||||||
|
|
||||||
|
# Generate tar file
|
||||||
|
cd "${TOP}"
|
||||||
|
rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/klisp.tar
|
||||||
|
cd ${NBTMPDIR}
|
||||||
|
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/klisp.tar *
|
||||||
|
checkReturnCode
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
cd "${TOP}"
|
||||||
|
rm -rf ${NBTMPDIR}
|
||||||
76
nbproject/Package-Release.bash
Normal file
76
nbproject/Package-Release.bash
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generated - do not edit!
|
||||||
|
#
|
||||||
|
|
||||||
|
# Macros
|
||||||
|
TOP=`pwd`
|
||||||
|
CND_PLATFORM=GNU-Linux-x86
|
||||||
|
CND_CONF=Release
|
||||||
|
CND_DISTDIR=dist
|
||||||
|
CND_BUILDDIR=build
|
||||||
|
CND_DLIB_EXT=so
|
||||||
|
NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
|
||||||
|
TMPDIRNAME=tmp-packaging
|
||||||
|
OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/klisp
|
||||||
|
OUTPUT_BASENAME=klisp
|
||||||
|
PACKAGE_TOP_DIR=klisp/
|
||||||
|
|
||||||
|
# Functions
|
||||||
|
function checkReturnCode
|
||||||
|
{
|
||||||
|
rc=$?
|
||||||
|
if [ $rc != 0 ]
|
||||||
|
then
|
||||||
|
exit $rc
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function makeDirectory
|
||||||
|
# $1 directory path
|
||||||
|
# $2 permission (optional)
|
||||||
|
{
|
||||||
|
mkdir -p "$1"
|
||||||
|
checkReturnCode
|
||||||
|
if [ "$2" != "" ]
|
||||||
|
then
|
||||||
|
chmod $2 "$1"
|
||||||
|
checkReturnCode
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function copyFileToTmpDir
|
||||||
|
# $1 from-file path
|
||||||
|
# $2 to-file path
|
||||||
|
# $3 permission
|
||||||
|
{
|
||||||
|
cp "$1" "$2"
|
||||||
|
checkReturnCode
|
||||||
|
if [ "$3" != "" ]
|
||||||
|
then
|
||||||
|
chmod $3 "$2"
|
||||||
|
checkReturnCode
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setup
|
||||||
|
cd "${TOP}"
|
||||||
|
mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
|
||||||
|
rm -rf ${NBTMPDIR}
|
||||||
|
mkdir -p ${NBTMPDIR}
|
||||||
|
|
||||||
|
# Copy files and create directories and links
|
||||||
|
cd "${TOP}"
|
||||||
|
makeDirectory "${NBTMPDIR}/klisp/bin"
|
||||||
|
copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
|
||||||
|
|
||||||
|
|
||||||
|
# Generate tar file
|
||||||
|
cd "${TOP}"
|
||||||
|
rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/klisp.tar
|
||||||
|
cd ${NBTMPDIR}
|
||||||
|
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/klisp.tar *
|
||||||
|
checkReturnCode
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
cd "${TOP}"
|
||||||
|
rm -rf ${NBTMPDIR}
|
||||||
149
nbproject/configurations.xml
Normal file
149
nbproject/configurations.xml
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configurationDescriptor version="94">
|
||||||
|
<logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
|
||||||
|
<logicalFolder name="HeaderFiles"
|
||||||
|
displayName="Header Files"
|
||||||
|
projectFiles="true">
|
||||||
|
<itemPath>functions.h</itemPath>
|
||||||
|
<itemPath>lang.h</itemPath>
|
||||||
|
<itemPath>lenv.h</itemPath>
|
||||||
|
<itemPath>lval.h</itemPath>
|
||||||
|
<itemPath>main.h</itemPath>
|
||||||
|
<itemPath>../mpc/mpc.h</itemPath>
|
||||||
|
<itemPath>util.h</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="ResourceFiles"
|
||||||
|
displayName="Resource Files"
|
||||||
|
projectFiles="true">
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="SourceFiles"
|
||||||
|
displayName="Source Files"
|
||||||
|
projectFiles="true">
|
||||||
|
<itemPath>functions.c</itemPath>
|
||||||
|
<itemPath>lang.c</itemPath>
|
||||||
|
<itemPath>lenv.c</itemPath>
|
||||||
|
<itemPath>lval.c</itemPath>
|
||||||
|
<itemPath>main.c</itemPath>
|
||||||
|
<itemPath>../mpc/mpc.c</itemPath>
|
||||||
|
<itemPath>util.c</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="TestFiles"
|
||||||
|
displayName="Test Files"
|
||||||
|
projectFiles="false"
|
||||||
|
kind="TEST_LOGICAL_FOLDER">
|
||||||
|
</logicalFolder>
|
||||||
|
<logicalFolder name="ExternalFiles"
|
||||||
|
displayName="Important Files"
|
||||||
|
projectFiles="false"
|
||||||
|
kind="IMPORTANT_FILES_FOLDER">
|
||||||
|
<itemPath>Makefile</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
|
</logicalFolder>
|
||||||
|
<projectmakefile>Makefile</projectmakefile>
|
||||||
|
<confs>
|
||||||
|
<conf name="Debug" type="1">
|
||||||
|
<toolsSet>
|
||||||
|
<compilerSet>default</compilerSet>
|
||||||
|
<dependencyChecking>true</dependencyChecking>
|
||||||
|
<rebuildPropChanged>false</rebuildPropChanged>
|
||||||
|
</toolsSet>
|
||||||
|
<compileType>
|
||||||
|
<cTool>
|
||||||
|
<standard>3</standard>
|
||||||
|
<commandlineTool>gcc</commandlineTool>
|
||||||
|
<incDir>
|
||||||
|
<pElem>lib/mpc</pElem>
|
||||||
|
</incDir>
|
||||||
|
<commandLine>-O0</commandLine>
|
||||||
|
<warningLevel>2</warningLevel>
|
||||||
|
</cTool>
|
||||||
|
<asmTool>
|
||||||
|
<warningLevel>2</warningLevel>
|
||||||
|
</asmTool>
|
||||||
|
<linkerTool>
|
||||||
|
<linkerLibItems>
|
||||||
|
<linkerOptionItem>`pkg-config --libs libedit`</linkerOptionItem>
|
||||||
|
<linkerLibStdlibItem>Mathematics</linkerLibStdlibItem>
|
||||||
|
</linkerLibItems>
|
||||||
|
</linkerTool>
|
||||||
|
</compileType>
|
||||||
|
<item path="../mpc/mpc.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="../mpc/mpc.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="functions.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="functions.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lang.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lang.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lenv.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lenv.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lval.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lval.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="main.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="main.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="util.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="util.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
</conf>
|
||||||
|
<conf name="Release" type="1">
|
||||||
|
<toolsSet>
|
||||||
|
<compilerSet>default</compilerSet>
|
||||||
|
<dependencyChecking>true</dependencyChecking>
|
||||||
|
<rebuildPropChanged>false</rebuildPropChanged>
|
||||||
|
</toolsSet>
|
||||||
|
<compileType>
|
||||||
|
<cTool>
|
||||||
|
<developmentMode>5</developmentMode>
|
||||||
|
</cTool>
|
||||||
|
<ccTool>
|
||||||
|
<developmentMode>5</developmentMode>
|
||||||
|
</ccTool>
|
||||||
|
<fortranCompilerTool>
|
||||||
|
<developmentMode>5</developmentMode>
|
||||||
|
</fortranCompilerTool>
|
||||||
|
<asmTool>
|
||||||
|
<developmentMode>5</developmentMode>
|
||||||
|
</asmTool>
|
||||||
|
</compileType>
|
||||||
|
<item path="../mpc/mpc.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="../mpc/mpc.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="functions.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="functions.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lang.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lang.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lenv.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lenv.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lval.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="lval.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="main.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="main.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="util.c" ex="false" tool="0" flavor2="0">
|
||||||
|
</item>
|
||||||
|
<item path="util.h" ex="false" tool="3" flavor2="0">
|
||||||
|
</item>
|
||||||
|
</conf>
|
||||||
|
</confs>
|
||||||
|
</configurationDescriptor>
|
||||||
7
nbproject/private/Makefile-variables.mk
Normal file
7
nbproject/private/Makefile-variables.mk
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Generated - do not edit!
|
||||||
|
#
|
||||||
|
# NOCDDL
|
||||||
|
#
|
||||||
|
# Debug configuration
|
||||||
|
# Release configuration
|
||||||
72
nbproject/private/configurations.xml
Normal file
72
nbproject/private/configurations.xml
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configurationDescriptor version="94">
|
||||||
|
<projectmakefile>Makefile</projectmakefile>
|
||||||
|
<confs>
|
||||||
|
<conf name="Debug" type="1">
|
||||||
|
<toolsSet>
|
||||||
|
<developmentServer>localhost</developmentServer>
|
||||||
|
<platform>2</platform>
|
||||||
|
</toolsSet>
|
||||||
|
<dbx_gdbdebugger version="1">
|
||||||
|
<gdb_pathmaps>
|
||||||
|
</gdb_pathmaps>
|
||||||
|
<gdb_interceptlist>
|
||||||
|
<gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
|
||||||
|
</gdb_interceptlist>
|
||||||
|
<gdb_options>
|
||||||
|
<DebugOptions>
|
||||||
|
</DebugOptions>
|
||||||
|
</gdb_options>
|
||||||
|
<gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
|
||||||
|
</dbx_gdbdebugger>
|
||||||
|
<nativedebugger version="1">
|
||||||
|
<engine>gdb</engine>
|
||||||
|
</nativedebugger>
|
||||||
|
<runprofile version="9">
|
||||||
|
<runcommandpicklist>
|
||||||
|
<runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
|
||||||
|
</runcommandpicklist>
|
||||||
|
<runcommand>"${OUTPUT_PATH}"</runcommand>
|
||||||
|
<rundir></rundir>
|
||||||
|
<buildfirst>true</buildfirst>
|
||||||
|
<terminal-type>0</terminal-type>
|
||||||
|
<remove-instrumentation>0</remove-instrumentation>
|
||||||
|
<environment>
|
||||||
|
</environment>
|
||||||
|
</runprofile>
|
||||||
|
</conf>
|
||||||
|
<conf name="Release" type="1">
|
||||||
|
<toolsSet>
|
||||||
|
<developmentServer>localhost</developmentServer>
|
||||||
|
<platform>2</platform>
|
||||||
|
</toolsSet>
|
||||||
|
<dbx_gdbdebugger version="1">
|
||||||
|
<gdb_pathmaps>
|
||||||
|
</gdb_pathmaps>
|
||||||
|
<gdb_interceptlist>
|
||||||
|
<gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
|
||||||
|
</gdb_interceptlist>
|
||||||
|
<gdb_options>
|
||||||
|
<DebugOptions>
|
||||||
|
</DebugOptions>
|
||||||
|
</gdb_options>
|
||||||
|
<gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
|
||||||
|
</dbx_gdbdebugger>
|
||||||
|
<nativedebugger version="1">
|
||||||
|
<engine>gdb</engine>
|
||||||
|
</nativedebugger>
|
||||||
|
<runprofile version="9">
|
||||||
|
<runcommandpicklist>
|
||||||
|
<runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
|
||||||
|
</runcommandpicklist>
|
||||||
|
<runcommand>"${OUTPUT_PATH}"</runcommand>
|
||||||
|
<rundir></rundir>
|
||||||
|
<buildfirst>true</buildfirst>
|
||||||
|
<terminal-type>0</terminal-type>
|
||||||
|
<remove-instrumentation>0</remove-instrumentation>
|
||||||
|
<environment>
|
||||||
|
</environment>
|
||||||
|
</runprofile>
|
||||||
|
</conf>
|
||||||
|
</confs>
|
||||||
|
</configurationDescriptor>
|
||||||
40
nbproject/private/launcher.properties
Normal file
40
nbproject/private/launcher.properties
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Launchers File syntax:
|
||||||
|
#
|
||||||
|
# [Must-have property line]
|
||||||
|
# launcher1.runCommand=<Run Command>
|
||||||
|
# [Optional extra properties]
|
||||||
|
# launcher1.displayName=<Display Name, runCommand by default>
|
||||||
|
# launcher1.buildCommand=<Build Command, Build Command specified in project properties by default>
|
||||||
|
# launcher1.runDir=<Run Directory, ${PROJECT_DIR} by default>
|
||||||
|
# launcher1.symbolFiles=<Symbol Files loaded by debugger, ${OUTPUT_PATH} by default>
|
||||||
|
# launcher1.env.<Environment variable KEY>=<Environment variable VALUE>
|
||||||
|
# (If this value is quoted with ` it is handled as a native command which execution result will become the value)
|
||||||
|
# [Common launcher properties]
|
||||||
|
# common.runDir=<Run Directory>
|
||||||
|
# (This value is overwritten by a launcher specific runDir value if the latter exists)
|
||||||
|
# common.env.<Environment variable KEY>=<Environment variable VALUE>
|
||||||
|
# (Environment variables from common launcher are merged with launcher specific variables)
|
||||||
|
# common.symbolFiles=<Symbol Files loaded by debugger>
|
||||||
|
# (This value is overwritten by a launcher specific symbolFiles value if the latter exists)
|
||||||
|
#
|
||||||
|
# In runDir, symbolFiles and env fields you can use these macroses:
|
||||||
|
# ${PROJECT_DIR} - project directory absolute path
|
||||||
|
# ${OUTPUT_PATH} - linker output path (relative to project directory path)
|
||||||
|
# ${OUTPUT_BASENAME}- linker output filename
|
||||||
|
# ${TESTDIR} - test files directory (relative to project directory path)
|
||||||
|
# ${OBJECTDIR} - object files directory (relative to project directory path)
|
||||||
|
# ${CND_DISTDIR} - distribution directory (relative to project directory path)
|
||||||
|
# ${CND_BUILDDIR} - build directory (relative to project directory path)
|
||||||
|
# ${CND_PLATFORM} - platform name
|
||||||
|
# ${CND_CONF} - configuration name
|
||||||
|
# ${CND_DLIB_EXT} - dynamic library extension
|
||||||
|
#
|
||||||
|
# All the project launchers must be listed in the file!
|
||||||
|
#
|
||||||
|
# launcher1.runCommand=...
|
||||||
|
# launcher2.runCommand=...
|
||||||
|
# ...
|
||||||
|
# common.runDir=...
|
||||||
|
# common.env.KEY=VALUE
|
||||||
|
|
||||||
|
# launcher1.runCommand=<type your run command here>
|
||||||
21
nbproject/private/private.xml
Normal file
21
nbproject/private/private.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/make-project-private/1">
|
||||||
|
<activeConfTypeElem>1</activeConfTypeElem>
|
||||||
|
<activeConfIndexElem>0</activeConfIndexElem>
|
||||||
|
</data>
|
||||||
|
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
||||||
|
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||||
|
<group>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/lval.c</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/main.c</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/lval.h</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/lang.c</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/functions.c</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/main.h</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/functions.h</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/lang.h</file>
|
||||||
|
<file>file:/home/sam/NetBeansProjects/CppApplication_1/lenv.c</file>
|
||||||
|
</group>
|
||||||
|
</open-files>
|
||||||
|
</project-private>
|
||||||
28
nbproject/project.xml
Normal file
28
nbproject/project.xml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.cnd.makeproject</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/make-project/1">
|
||||||
|
<name>KLisp</name>
|
||||||
|
<c-extensions>c</c-extensions>
|
||||||
|
<cpp-extensions/>
|
||||||
|
<header-extensions>h</header-extensions>
|
||||||
|
<sourceEncoding>UTF-8</sourceEncoding>
|
||||||
|
<make-dep-projects/>
|
||||||
|
<sourceRootList/>
|
||||||
|
<confList>
|
||||||
|
<confElem>
|
||||||
|
<name>Debug</name>
|
||||||
|
<type>1</type>
|
||||||
|
</confElem>
|
||||||
|
<confElem>
|
||||||
|
<name>Release</name>
|
||||||
|
<type>1</type>
|
||||||
|
</confElem>
|
||||||
|
</confList>
|
||||||
|
<formatting>
|
||||||
|
<project-formatting-style>false</project-formatting-style>
|
||||||
|
</formatting>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
||||||
11
util.c
Normal file
11
util.c
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
char * strdup(char* s) {
|
||||||
|
char *d = calloc(1, strlen (s) + 1);
|
||||||
|
if (d == NULL) return NULL;
|
||||||
|
strcpy (d,s);
|
||||||
|
return d;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user