1c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen/*
2c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * Copyright (C) 2015 The Android Open Source Project
3c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen *
4c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * Licensed under the Apache License, Version 2.0 (the "License");
5c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * you may not use this file except in compliance with the License.
6c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * You may obtain a copy of the License at
7c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen *
8c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen *      http://www.apache.org/licenses/LICENSE-2.0
9c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen *
10c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * Unless required by applicable law or agreed to in writing, software
11c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * distributed under the License is distributed on an "AS IS" BASIS,
12c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * See the License for the specific language governing permissions and
14c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * limitations under the License.
15c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen */
16c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
17c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <new>
18c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <memory>
19c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <fstream>
20c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <iostream>
21c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <fec/io.h>
22c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
23c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanenusing namespace std;
24c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanenconst unsigned bufsize = 2 * 1024 * FEC_BLOCKSIZE;
25c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
26c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanenint main(int argc, char **argv)
27c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen{
28c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    if (argc != 3) {
29c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        cerr << "usage: " << argv[0] << " input output" << endl;
30c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        return 1;
31c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    }
32c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
33c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    unique_ptr<uint8_t[]> buffer(new (nothrow) uint8_t[bufsize]);
34c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
35c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    if (!buffer) {
36c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        cerr << "failed to allocate buffer" << endl;
37c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        return 1;
38c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    }
39c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
40c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    fec::io input(argv[1]);
41c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
42c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    if (!input) {
43c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        return 1;
44c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    }
45c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
46c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    ofstream output(argv[2], ios::binary | ios::trunc);
47c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
48c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    if (!output) {
49c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        cerr << "failed to open " << argv[2] << endl;
50c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        return 1;
51c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    }
52c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
53c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    ssize_t count;
54c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
55c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    do {
56c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        count = input.read(buffer.get(), bufsize);
57c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
58c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        if (count == -1) {
59c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen            return 1;
60c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        } else if (count > 0) {
61c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen            output.write(reinterpret_cast<const char *>(buffer.get()), count);
62c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
63c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen            if (!output) {
64c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen                cerr << "write" << endl;
65c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen                return 1;
66c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen            }
67c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen        }
68c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    } while (count > 0);
69c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen
70c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen    return 0;
71c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen}
72