commit 89c86150c8b164f441a73f4991b2c339fd4aae7c Author: Scott Chacon Date: Mon May 24 16:44:36 2010 -0700 skeleton nif that runs diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..43a1b54 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +OTPROOT=/Users/schacon/otp_src_R13B03 +INCLUDES = -I$(OTPROOT)/erts/emulator/beam/ + +# OS X flags. +GCCFLAGS = -O3 -fPIC -bundle -flat_namespace -undefined suppress -fno-common -Wall -m32 + +# Linux Flags +#GCCFLAGS = -O3 -fPIC -shared -fno-common -Wall + +CFLAGS = $(GCCFLAGS) $(INCLUDES) +LDFLAGS = $(GCCFLAGS) $(LIBS) + +OBJECTS = geef.o + +DRIVER = geef.so +BEAM = geef.beam + +all: $(DRIVER) $(BEAM) + +clean: + rm -f *.o *.beam $(DRIVER) + +$(DRIVER): $(OBJECTS) + gcc -o $@ $^ $(LDFLAGS) + +$(BEAM): geef.erl + erlc $^ + diff --git a/geef.c b/geef.c new file mode 100644 index 0000000..1b96896 --- /dev/null +++ b/geef.c @@ -0,0 +1,44 @@ +#include "erl_nif.h" + +static int +load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info) +{ + return 0; +} + +static int +reload(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info) +{ + return 0; +} + +static int +upgrade(ErlNifEnv* env, void** priv, void** old_priv, + ERL_NIF_TERM load_info) +{ + return 0; +} + +static void +unload(ErlNifEnv* env, void* priv) +{ + return; +} + +static ERL_NIF_TERM +object_exists(ErlNifEnv* env, ERL_NIF_TERM a1) +{ + unsigned long val; + if(!enif_get_ulong(env, a1, &val)) { + return enif_make_badarg(env); + } else { + return enif_make_ulong(env, val*2); + } +} + +static ErlNifFunc geef_funcs[] = +{ + {"object_exists", 1, object_exists} +}; + +ERL_NIF_INIT(geef, geef_funcs, load, reload, upgrade, unload) diff --git a/geef.erl b/geef.erl new file mode 100644 index 0000000..f89bf03 --- /dev/null +++ b/geef.erl @@ -0,0 +1,11 @@ +-module(geef). +-export([start/0, object_exists/1]). + +start() -> + erlang:load_nif("geef", 0). + +object_exists(_Val) -> + nif_error(?LINE). + +nif_error(Line) -> + exit({nif_not_loaded,module,?MODULE,line,Line}). diff --git a/test b/test new file mode 100755 index 0000000..3fb7bed --- /dev/null +++ b/test @@ -0,0 +1,20 @@ +#!/Users/schacon/otp_src_R13B03/bin/escript +%% -*- erlang -*- +%%! debug verbose -noshell + +main([Object]) -> + try + geef:start(), + Test = geef:object_exists(4), + io:format("factorial ~s:~w~n", [Object, Test]) + catch + _:_ -> + usage() + end; +main(_) -> + usage(). + +usage() -> + io:format("usage: factorial integer\n"), + halt(1). +