/* Reed-Solomon encoder * Copyright 2002, Phil Karn, KA9Q * May be used under the terms of the GNU Lesser General Public License (LGPL) */ #include <string.h> #ifdef FIXED #include "fixed.h" #elif defined(BIGSYM) #include "int.h" #else #include "char.h" #endif void ENCODE_RS( #ifdef FIXED data_t *data, data_t *bb,int pad){ #else void *p,data_t *data, data_t *bb){ struct rs *rs = (struct rs *)p; #endif int i, j; data_t feedback; #ifdef FIXED /* Check pad parameter for validity */ if(pad < 0 || pad >= NN) return; #endif memset(bb,0,NROOTS*sizeof(data_t)); for(i=0;i<NN-NROOTS-PAD;i++){ feedback = INDEX_OF[data[i] ^ bb[0]]; if(feedback != A0){ /* feedback term is non-zero */ #ifdef UNNORMALIZED /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must * always be for the polynomials constructed by init_rs() */ feedback = MODNN(NN - GENPOLY[NROOTS] + feedback); #endif for(j=1;j<NROOTS;j++) bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])]; } /* Shift */ memmove(&bb[0],&bb[1],sizeof(data_t)*(NROOTS-1)); if(feedback != A0) bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])]; else bb[NROOTS-1] = 0; } }