Home | History | Annotate | Download | only in fec
      1 /* Reed-Solomon encoder
      2  * Copyright 2002, Phil Karn, KA9Q
      3  * May be used under the terms of the GNU Lesser General Public License (LGPL)
      4  */
      5 #include <string.h>
      6 
      7 #ifdef FIXED
      8 #include "fixed.h"
      9 #elif defined(BIGSYM)
     10 #include "int.h"
     11 #else
     12 #include "char.h"
     13 #endif
     14 
     15 void ENCODE_RS(
     16 #ifdef FIXED
     17 data_t *data, data_t *bb,int pad){
     18 #else
     19 void *p,data_t *data, data_t *bb){
     20   struct rs *rs = (struct rs *)p;
     21 #endif
     22   int i, j;
     23   data_t feedback;
     24 
     25 #ifdef FIXED
     26   /* Check pad parameter for validity */
     27   if(pad < 0 || pad >= NN)
     28     return;
     29 #endif
     30 
     31   memset(bb,0,NROOTS*sizeof(data_t));
     32 
     33   for(i=0;i<NN-NROOTS-PAD;i++){
     34     feedback = INDEX_OF[data[i] ^ bb[0]];
     35     if(feedback != A0){      /* feedback term is non-zero */
     36 #ifdef UNNORMALIZED
     37       /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
     38        * always be for the polynomials constructed by init_rs()
     39        */
     40       feedback = MODNN(NN - GENPOLY[NROOTS] + feedback);
     41 #endif
     42       for(j=1;j<NROOTS;j++)
     43 	bb[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])];
     44     }
     45     /* Shift */
     46     memmove(&bb[0],&bb[1],sizeof(data_t)*(NROOTS-1));
     47     if(feedback != A0)
     48       bb[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])];
     49     else
     50       bb[NROOTS-1] = 0;
     51   }
     52 }
     53