]> git.cworth.org Git - apitrace/blob - cli/cli_repack.cpp
Merge branch 'directxtex'
[apitrace] / cli / cli_repack.cpp
1 /**************************************************************************
2  *
3  * Copyright 2011 Jose Fonseca
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26
27 #include <string.h>
28 #include <getopt.h>
29
30 #include <iostream>
31
32 #include "cli.hpp"
33
34 #include "trace_file.hpp"
35
36
37 static const char *synopsis = "Repack a trace file with Snappy compression.";
38
39 static void
40 usage(void)
41 {
42     std::cout
43         << "usage: apitrace repack <in-trace-file> <out-trace-file>\n"
44         << synopsis << "\n"
45         << "\n"
46         << "Snappy compression allows for faster replay and smaller memory footprint,\n"
47         << "at the expense of a slightly smaller compression ratio than zlib\n"
48         << "\n";
49 }
50
51 const static char *
52 shortOptions = "h";
53
54 const static struct option
55 longOptions[] = {
56     {"help", no_argument, 0, 'h'},
57     {0, 0, 0, 0}
58 };
59
60 static int
61 repack(const char *inFileName, const char *outFileName)
62 {
63     trace::File *inFile = trace::File::createForRead(inFileName);
64     if (!inFile) {
65         return 1;
66     }
67
68     trace::File *outFile = trace::File::createForWrite(outFileName);
69     if (!outFile) {
70         delete inFile;
71         return 1;
72     }
73
74     size_t size = 8192;
75     char *buf = new char[size];
76     size_t read;
77
78     while ((read = inFile->read(buf, size)) != 0) {
79         outFile->write(buf, read);
80     }
81
82     delete [] buf;
83     delete outFile;
84     delete inFile;
85
86     return 0;
87 }
88
89 static int
90 command(int argc, char *argv[])
91 {
92     int opt;
93     while ((opt = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != -1) {
94         switch (opt) {
95         case 'h':
96             usage();
97             return 0;
98         default:
99             std::cerr << "error: unexpected option `" << opt << "`\n";
100             usage();
101             return 1;
102         }
103     }
104
105     if (argc != optind + 2) {
106         std::cerr << "error: insufficient number of arguments\n";
107         usage();
108         return 1;
109     }
110
111     return repack(argv[optind], argv[optind + 1]);
112 }
113
114 const Command repack_command = {
115     "repack",
116     synopsis,
117     usage,
118     command
119 };