create regress_simple for JavaScript
[liba.git] / java / src / crc8.c
blob7477b20c73e90db52ee3019bbe1cf7b1e374968e
1 #include "a.h"
2 #include "a/crc.h"
3 #include "liba_crc8.h"
5 #undef L
6 #define L Java_liba_crc8
7 static struct
9 jmethodID New;
10 jfieldID ctx;
11 } L = {NULL, NULL};
13 JNIEXPORT void JNICALL Java_liba_crc8_clinit(JNIEnv *Env, jclass Cls)
15 jclass Nbb = (*Env)->FindClass(Env, "Ljava/nio/ByteBuffer;");
16 L.New = (*Env)->GetStaticMethodID(Env, Nbb, "allocateDirect", "(I)Ljava/nio/ByteBuffer;");
17 L.ctx = (*Env)->GetFieldID(Env, Cls, "ctx", "Ljava/nio/ByteBuffer;");
20 struct crc8
22 a_u8 table[0x100];
25 JNIEXPORT void JNICALL Java_liba_crc8_init(JNIEnv *Env, jobject Obj, jbyte poly, jboolean reversed)
27 jobject Ctx = (*Env)->CallObjectMethod(Env, Obj, L.New, (jint)sizeof(struct crc8));
28 struct crc8 *ctx = (struct crc8 *)(*Env)->GetDirectBufferAddress(Env, Ctx);
29 (*Env)->SetObjectField(Env, Obj, L.ctx, Ctx);
30 reversed ? a_crc8l_init(ctx->table, (a_u8)poly)
31 : a_crc8m_init(ctx->table, (a_u8)poly);
34 JNIEXPORT jbyteArray JNICALL Java_liba_crc8_table(JNIEnv *Env, jobject Obj)
36 jobject Ctx = (*Env)->GetObjectField(Env, Obj, L.ctx);
37 struct crc8 *ctx = (struct crc8 *)(*Env)->GetDirectBufferAddress(Env, Ctx);
38 jbyteArray table = (*Env)->NewByteArray(Env, A_LEN(ctx->table));
39 (*Env)->SetByteArrayRegion(Env, table, 0, A_LEN(ctx->table), (jbyte *)ctx->table);
40 return table;
43 JNIEXPORT jobject JNICALL Java_liba_crc8_gen(JNIEnv *Env, jobject Obj, jbyte poly, jboolean reversed)
45 jobject Ctx = (*Env)->GetObjectField(Env, Obj, L.ctx);
46 struct crc8 *ctx = (struct crc8 *)(*Env)->GetDirectBufferAddress(Env, Ctx);
47 reversed ? a_crc8l_init(ctx->table, (a_u8)poly)
48 : a_crc8m_init(ctx->table, (a_u8)poly);
49 return Obj;
52 JNIEXPORT jbyte JNICALL Java_liba_crc8_eval(JNIEnv *Env, jobject Obj, jbyteArray block, jbyte value)
54 jobject Ctx = (*Env)->GetObjectField(Env, Obj, L.ctx);
55 struct crc8 *ctx = (struct crc8 *)(*Env)->GetDirectBufferAddress(Env, Ctx);
56 jsize n = (*Env)->GetArrayLength(Env, block);
57 jbyte *p = (*Env)->GetByteArrayElements(Env, block, NULL);
58 value = (jbyte)a_crc8(ctx->table, p, (a_size)n, (a_u8)value);
59 (*Env)->ReleaseByteArrayElements(Env, block, p, JNI_ABORT);
60 return value;
63 JNIEXPORT jbyteArray JNICALL Java_liba_crc8_pack(JNIEnv *Env, jobject Obj, jbyteArray block, jbyte value)
65 jobject Ctx = (*Env)->GetObjectField(Env, Obj, L.ctx);
66 struct crc8 *ctx = (struct crc8 *)(*Env)->GetDirectBufferAddress(Env, Ctx);
67 jsize block_n = (*Env)->GetArrayLength(Env, block);
68 jbyteArray res = (*Env)->NewByteArray(Env, block_n + 1);
69 jbyte *block_p = (*Env)->GetByteArrayElements(Env, block, NULL);
70 value = (jbyte)a_crc8(ctx->table, block_p, (a_size)block_n, (a_u8)value);
71 (*Env)->SetByteArrayRegion(Env, res, 0, block_n, block_p);
72 (*Env)->ReleaseByteArrayElements(Env, block, block_p, JNI_ABORT);
73 (*Env)->SetByteArrayRegion(Env, res, block_n, 1, &value);
74 return res;