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 
ENCODE_RS(data_t * data,data_t * bb,int pad)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