Added RLCSA index option
[SXSI/TextCollection.git] / incbwt / utils / split_text.cpp
1 #include <cstdlib>
2 #include <fstream>
3 #include <iostream>
4 #include <sstream>
5
6 #include "../misc/definitions.h"
7 #include "../misc/utils.h"
8
9
10 using namespace CSA;
11
12
13 int
14 main(int argc, char** argv)
15 {
16   std::cout << "Text splitter" << std::endl;
17   if(argc < 3)
18   {
19     std::cout << "Usage: split_text file parts" << std::endl;
20     return 1;
21   }
22
23   std::string base_name = argv[1];
24   std::cout << "Input file: " << base_name << std::endl;
25   std::ifstream input_file(base_name.c_str(), std::ios_base::binary);
26   if(!input_file)
27   {
28     std::cerr << "Error opening input file!" << std::endl;
29     return 2;
30   }
31
32   usint parts = atoi(argv[2]);
33   usint size = fileSize(input_file);
34   usint part_size = (size + parts - 1) / parts;
35   std::cout << "Parts: " << parts << std::endl;
36   std::cout << "Part size: " << part_size << " bytes" << std::endl;
37   if(parts == 0 || part_size == 0)
38   {
39     std::cerr << "Invalid number of parts!" << std::endl;
40     return 3;
41   }
42   std::cout << std::endl;
43
44   char* buffer = new char[part_size + 1];
45   usint len = 0;
46   for(usint n = parts; n > 0; n /= 10) { len++; }
47
48   for(usint i = 1; i <= parts; i++)
49   {
50     usint llen = len;
51     for(usint num = i; num > 0; num /= 10) { llen--; }
52
53     std::ostringstream out;
54     out << base_name << "." << std::string(llen, '0') << i;
55     std::ofstream part_file(out.str().c_str(), std::ios_base::binary);
56     input_file.read(buffer, part_size);
57     usint n = input_file.gcount();
58     buffer[n] = 0;
59     part_file.write(buffer, n + 1);
60     part_file.close();
61   }
62
63   input_file.close();
64   return 0;
65 }