/* * rs.c * * Created on: Sep 14, 2017 * Author: root */ #include "rs.h" #include "stdlib.h" #include "string.h" void rs_encode(void *code, char *data[], int size) { int k = get_k(code); int n = get_n(code); for (int i = k; i < n; i++) { fec_encode(code, (void **)data, data[i], i, size); } return; } int rs_decode(void *code, char *data[], int size) { int k = get_k(code); int n = get_n(code); int index[n]; int count = 0; for (int i = 0; i < n; i++) { if (data[i] != 0) { index[count++] = i; } } if (count < k) return -1; for (int i = 0; i < n; i++) { if (i < count) data[i] = data[index[i]]; else data[i] = 0; } return fec_decode(code, (void **)data, index, size); } static void *(*table)[256] = 0; void *get_code(int k, int n) { if (table == 0) { table = (void *(*)[256])malloc(sizeof(void *) * 256 * 256); if (!table) { return table; } memset(table, 0, sizeof(void *) * 256 * 256); } if (table[k][n] == 0) { table[k][n] = fec_new(k, n); } return table[k][n]; } void rs_encode2(int k, int n, char *data[], int size) { void *code = get_code(k, n); rs_encode(code, data, size); } int rs_decode2(int k, int n, char *data[], int size) { void *code = get_code(k, n); return rs_decode(code, data, size); }