#include <math.h> #include <stdio.h> #include <float.h> #include <limits.h> #include <stdlib.h> #include "rs.h" static void *rs; static int first=1; void rs_encode_(int *dgen, int *sent) // Encode JT65 data dgen[12], producing sent[63]. { int dat1[12]; int b[51]; int i; if(first) { // Initialize the JT65 codec rs=init_rs_int(6,0x43,3,1,51,0); first=0; } // Reverse data order for the Karn codec. for(i=0; i<12; i++) { dat1[i]=dgen[11-i]; } // Compute the parity symbols encode_rs_int(rs,dat1,b); // Move parity symbols and data into sent[] array, in reverse order. for (i = 0; i < 51; i++) sent[50-i] = b[i]; for (i = 0; i < 12; i++) sent[i+51] = dat1[11-i]; } void rs_decode_(int *recd0, int *era0, int *numera0, int *decoded, int *nerr) // Decode JT65 received data recd0[63], producing decoded[12]. // Erasures are indicated in era0[numera]. The number of corrected // errors is *nerr. If the data are uncorrectable, *nerr=-1 is returned. { int numera; int i; int era_pos[50]; int recd[63]; if(first) { rs=init_rs_int(6,0x43,3,1,51,0); first=0; } numera=*numera0; for(i=0; i<12; i++) recd[i]=recd0[62-i]; for(i=0; i<51; i++) recd[12+i]=recd0[50-i]; if(numera) for(i=0; i<numera; i++) era_pos[i]=era0[i]; *nerr=decode_rs_int(rs,recd,era_pos,numera); for(i=0; i<12; i++) decoded[i]=recd[11-i]; } void rs_encode__(int *dgen, int *sent) { rs_encode_(dgen, sent); } void rs_decode__(int *recd0, int *era0, int *numera0, int *decoded, int *nerr) { rs_decode_(recd0, era0, numera0, decoded, nerr); }