rename __call__ to mf in cython.mf
[liba.git] / java / src / crc64.c
blob00a95442611ede521bb56e9c5ebc7c4741dc9683
1 #include "a.h"
2 #include "a/crc.h"
3 #include "liba_crc64.h"
5 #undef L
6 #define L Java_liba_crc64
7 static struct
9 jmethodID _new;
10 jfieldID ctx;
11 } L = {NULL, NULL};
13 struct crc64
15 a_u64 table[0x100];
16 a_u64 (*eval)(a_u64 const table[0x100], void const *pdata, a_size nbyte, a_u64 value);
19 JNIEXPORT void JNICALL Java_liba_crc64_clinit(JNIEnv *_env, jclass _cls)
21 jclass _nbb = (*_env)->FindClass(_env, "Ljava/nio/ByteBuffer;");
22 L._new = (*_env)->GetStaticMethodID(_env, _nbb, "allocateDirect", "(I)Ljava/nio/ByteBuffer;");
23 L.ctx = (*_env)->GetFieldID(_env, _cls, "ctx", "Ljava/nio/ByteBuffer;");
26 JNIEXPORT void JNICALL Java_liba_crc64_init(JNIEnv *_env, jobject _obj, jlong poly, jboolean reversed)
28 jobject _ctx = (*_env)->CallObjectMethod(_env, _obj, L._new, (jint)sizeof(struct crc64));
29 struct crc64 *ctx = (struct crc64 *)(*_env)->GetDirectBufferAddress(_env, _ctx);
30 (*_env)->SetObjectField(_env, _obj, L.ctx, _ctx);
31 if (reversed)
33 a_crc64l_init(ctx->table, (a_u64)poly);
34 ctx->eval = a_crc64l;
36 else
38 a_crc64m_init(ctx->table, (a_u64)poly);
39 ctx->eval = a_crc64m;
43 JNIEXPORT jlongArray JNICALL Java_liba_crc64_table(JNIEnv *_env, jobject _obj)
45 jobject _ctx = (*_env)->GetObjectField(_env, _obj, L.ctx);
46 struct crc64 *ctx = (struct crc64 *)(*_env)->GetDirectBufferAddress(_env, _ctx);
47 jlongArray table = (*_env)->NewLongArray(_env, A_LEN(ctx->table));
48 (*_env)->SetLongArrayRegion(_env, table, 0, A_LEN(ctx->table), (jlong *)ctx->table);
49 return table;
52 JNIEXPORT jobject JNICALL Java_liba_crc64_gen(JNIEnv *_env, jobject _obj, jlong poly, jboolean reversed)
54 jobject _ctx = (*_env)->GetObjectField(_env, _obj, L.ctx);
55 struct crc64 *ctx = (struct crc64 *)(*_env)->GetDirectBufferAddress(_env, _ctx);
56 if (reversed)
58 a_crc64l_init(ctx->table, (a_u64)poly);
59 ctx->eval = a_crc64l;
61 else
63 a_crc64m_init(ctx->table, (a_u64)poly);
64 ctx->eval = a_crc64m;
66 return _obj;
69 JNIEXPORT jlong JNICALL Java_liba_crc64_eval(JNIEnv *_env, jobject _obj, jbyteArray block, jlong value)
71 jobject _ctx = (*_env)->GetObjectField(_env, _obj, L.ctx);
72 struct crc64 *ctx = (struct crc64 *)(*_env)->GetDirectBufferAddress(_env, _ctx);
73 jsize n = (*_env)->GetArrayLength(_env, block);
74 jbyte *p = (*_env)->GetByteArrayElements(_env, block, NULL);
75 value = (jlong)ctx->eval(ctx->table, p, (a_size)n, (a_u64)value);
76 (*_env)->ReleaseByteArrayElements(_env, block, p, JNI_ABORT);
77 return value;
80 JNIEXPORT jbyteArray JNICALL Java_liba_crc64_pack(JNIEnv *_env, jobject _obj, jbyteArray block, jlong value)
82 jobject _ctx = (*_env)->GetObjectField(_env, _obj, L.ctx);
83 struct crc64 *ctx = (struct crc64 *)(*_env)->GetDirectBufferAddress(_env, _ctx);
84 jsize block_n = (*_env)->GetArrayLength(_env, block);
85 jbyteArray res = (*_env)->NewByteArray(_env, block_n + 8);
86 jbyte *block_p = (*_env)->GetByteArrayElements(_env, block, NULL);
87 value = (jlong)ctx->eval(ctx->table, block_p, (a_size)block_n, (a_u64)value);
88 ctx->eval == a_crc64m ? a_u64_setb(&value, (a_u64)value) : a_u64_setl(&value, (a_u64)value);
89 (*_env)->SetByteArrayRegion(_env, res, 0, block_n, block_p);
90 (*_env)->ReleaseByteArrayElements(_env, block, block_p, JNI_ABORT);
91 (*_env)->SetByteArrayRegion(_env, res, block_n, 8, (jbyte *)&value);
92 return res;