|
|
- #include <stdint.h>
- #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)
|