1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <inttypes.h>
18#include <errno.h>
19#include <sys/types.h>
20#include <sys/stat.h>
21#include <fcntl.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <unistd.h>
25#include <string.h>
26#include <fec.h>
27
28#define FEC_RSM 255
29#define FEC_ROOTS 16
30#define FEC_RSN (FEC_RSM - FEC_ROOTS)
31#define FEC_PARAMS(roots) \
32    8, 0x11d, 0, 1, (roots), 0
33
34int main()
35{
36    uint8_t data[FEC_RSM];
37    uint8_t dupl[FEC_RSM];
38    uint8_t corr[FEC_RSM];
39    int i, rc, neras, errors;
40    int erasures[FEC_RSM];
41    void *rs;
42
43    memset(data, 0x00, sizeof(data));
44    memset(corr, 0x00, sizeof(corr));
45
46    rs = init_rs_char(FEC_PARAMS(FEC_ROOTS));
47
48    if (!rs) {
49        perror("init_rs_char");
50        exit(1);
51    }
52
53    encode_rs_char(rs, data, &corr[FEC_RSN]);
54
55    for (neras = 1; neras <= FEC_ROOTS; ++neras) {
56        printf("%d errors\n", neras);
57
58        for (i = 0; i < neras; ++i) {
59            corr[i] = 0xFD;
60            erasures[i] = i;
61        }
62
63        memcpy(dupl, corr, sizeof(corr));
64
65        rc = decode_rs_char(rs, corr, NULL, 0);
66
67        printf("\tno erasures: %d\n", rc);
68
69        errors = 0;
70        for (i = 0; i < FEC_RSN; ++i) {
71            if (corr[i] != 0x00) {
72                printf("\t\terror at %d (%02x)\n", i, corr[i]);
73                ++errors;
74            }
75        }
76        printf("\t\t%d errors in output\n", errors);
77
78        rc = decode_rs_char(rs, dupl, erasures, neras);
79
80        printf("\terasures: %d\n", rc);
81
82        errors = 0;
83        for (i = 0; i < FEC_RSN; ++i) {
84            if (dupl[i] != 0x00) {
85                printf("\t\terror at %d (%02x)\n", i, dupl[i]);
86                ++errors;
87            }
88        }
89        printf("\t\t%d errors in output\n", errors);
90    }
91
92    exit(0);
93}
94