| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- * 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);
- }
|