--- /dev/null
+/*
+To build the snappytool binary:
+g++ main.cpp /usr/lib/libsnappy.a -o snappytool
+or, if you have built the C++ snappy library from source:
+g++ main.cpp /path/to/your/snappy/.libs/libsnappy.a -o snappytool
+after running "make" from your snappy checkout directory.
+*/
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "snappy.h"
+
+#define N 1000000
+
+char dst[N];
+char src[N];
+
+int main(int argc, char** argv) {
+ // Parse args.
+ if (argc != 2) {
+ fprintf(stderr, "exactly one of -d or -e must be given\n");
+ return 1;
+ }
+ bool decode = strcmp(argv[1], "-d") == 0;
+ bool encode = strcmp(argv[1], "-e") == 0;
+ if (decode == encode) {
+ fprintf(stderr, "exactly one of -d or -e must be given\n");
+ return 1;
+ }
+
+ // Read all of stdin into src[:s].
+ size_t s = 0;
+ while (1) {
+ if (s == N) {
+ fprintf(stderr, "input too large\n");
+ return 1;
+ }
+ ssize_t n = read(0, src+s, N-s);
+ if (n == 0) {
+ break;
+ }
+ if (n < 0) {
+ fprintf(stderr, "read error: %s\n", strerror(errno));
+ // TODO: handle EAGAIN, EINTR?
+ return 1;
+ }
+ s += n;
+ }
+
+ // Encode or decode src[:s] to dst[:d], and write to stdout.
+ size_t d = 0;
+ if (encode) {
+ if (N < snappy::MaxCompressedLength(s)) {
+ fprintf(stderr, "input too large after encoding\n");
+ return 1;
+ }
+ snappy::RawCompress(src, s, dst, &d);
+ } else {
+ if (!snappy::GetUncompressedLength(src, s, &d)) {
+ fprintf(stderr, "could not get uncompressed length\n");
+ return 1;
+ }
+ if (N < d) {
+ fprintf(stderr, "input too large after decoding\n");
+ return 1;
+ }
+ if (!snappy::RawUncompress(src, s, dst)) {
+ fprintf(stderr, "input was not valid Snappy-compressed data\n");
+ return 1;
+ }
+ }
+ write(1, dst, d);
+ return 0;
+}