#include #include "erl_nif.h" #ifdef _WIN32 #define INLINE __inline #else #define INLINE inline #endif static ErlNifResourceType* ResType = NULL; ERL_NIF_TERM null; ERL_NIF_TERM ok; static int load(ErlNifEnv* env, void** priv, ERL_NIF_TERM load_info) { ErlNifResourceFlags flags = ERL_NIF_RT_CREATE | ERL_NIF_RT_TAKEOVER; ResType = enif_open_resource_type(env, NULL, "_nifArray_", NULL, flags, NULL); if(NULL == ResType) return -1; null = enif_make_atom(env, "null"); ok = enif_make_atom(env, "ok"); return 0; } static ERL_NIF_TERM new(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { uint32_t Size; if(!enif_get_uint(env, argv[0], &Size)) { return enif_make_badarg(env); } ErlNifBinary *ArrayPtr = (ErlNifBinary *) enif_alloc_resource(ResType, sizeof(ErlNifBinary)*Size); int i; for(i = 0; i < Size; i++){ ErlNifBinary nullBin; enif_term_to_binary(env, null, &nullBin); ArrayPtr[i] = nullBin; } ERL_NIF_TERM Res = enif_make_resource(env, ArrayPtr); enif_release_resource(ArrayPtr); return Res; } static ERL_NIF_TERM get(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { uint32_t Index; if(!enif_get_uint(env, argv[1], &Index)) { return enif_make_badarg(env); } ErlNifBinary *ArrayPtr; if (!enif_get_resource(env, argv[0], ResType, (void **)&ArrayPtr)){ return enif_make_badarg(env); } //enif_fprintf(stdout, "IMY************get %T \n", argv[1]); ERL_NIF_TERM Ret; enif_binary_to_term(env, ArrayPtr[Index].data, ArrayPtr[Index].size, &Ret, 0); return Ret; } static ERL_NIF_TERM put(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { //enif_fprintf(stdout, "IMY************put0001 %T \n", argv[1]); uint32_t Index; if(!enif_get_uint(env, argv[1], &Index)) { return enif_make_badarg(env); } //enif_fprintf(stdout, "IMY************put0002 %T %T \n", argv[1], argv[2]); ErlNifBinary Value; if(!enif_term_to_binary(env, argv[2], &Value)) return enif_make_badarg(env); ErlNifBinary *ArrayPtr; //enif_fprintf(stdout, "IMY************put0003 %T \n", argv[1]); if (!enif_get_resource(env, argv[0], ResType, (void **)&ArrayPtr)){ return enif_make_badarg(env); } //enif_fprintf(stdout, "IMY************put111 %T \n", argv[1]); ErlNifBinary OldValue = ArrayPtr[Index]; // enif_fprintf(stdout, "IMY************put222 %T %d \n", argv[1], Index); ArrayPtr[Index] = Value; //enif_fprintf(stdout, "IMY************put333 %T \n", argv[1]); enif_release_binary(&OldValue); //enif_fprintf(stdout, "IMY************put444 %T \n", argv[1]); return ok; } static ERL_NIF_TERM test(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary Value; if(!enif_term_to_binary(env, argv[0], &Value)) return enif_make_badarg(env); // enif_fprintf(stdout, "IMY************ %T", argv[0]); ERL_NIF_TERM Ret; enif_binary_to_term(env, Value.data, Value.size, &Ret, 0); enif_release_binary(&Value); return Ret; } static ErlNifFunc nifFuns[] = { {"new", 1, new}, {"get", 2, get}, {"put", 3, put}, {"test", 1, test}, }; ERL_NIF_INIT(nifArray, nifFuns, &load, NULL, NULL, NULL)