2023-02-07 05:34:06 -05:00

65 lines
1.4 KiB
C++

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