| Index: third_party/ots/test/ot-sanitise.cc
 | 
| diff --git a/third_party/ots/test/ot-sanitise.cc b/third_party/ots/test/ot-sanitise.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..2d4526a1b4d79bdec9179126a3f7cd3dcfe87a22
 | 
| --- /dev/null
 | 
| +++ b/third_party/ots/test/ot-sanitise.cc
 | 
| @@ -0,0 +1,101 @@
 | 
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +// A very simple driver program while sanitises the file given as argv[1] and
 | 
| +// writes the sanitised version to stdout.
 | 
| +
 | 
| +#include <fcntl.h>
 | 
| +#include <sys/stat.h>
 | 
| +#if defined(_WIN32)
 | 
| +#include <io.h>
 | 
| +#else
 | 
| +#include <unistd.h>
 | 
| +#endif  // defined(_WIN32)
 | 
| +
 | 
| +#include <cstdarg>
 | 
| +#include <cstdio>
 | 
| +#include <cstdlib>
 | 
| +
 | 
| +#include "file-stream.h"
 | 
| +#include "opentype-sanitiser.h"
 | 
| +
 | 
| +#if defined(_WIN32)
 | 
| +#define ADDITIONAL_OPEN_FLAGS O_BINARY
 | 
| +#else
 | 
| +#define ADDITIONAL_OPEN_FLAGS 0
 | 
| +#endif
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +int Usage(const char *argv0) {
 | 
| +  std::fprintf(stderr, "Usage: %s ttf_file [dest_ttf_file]\n", argv0);
 | 
| +  return 1;
 | 
| +}
 | 
| +
 | 
| +class Context: public ots::OTSContext {
 | 
| + public:
 | 
| +  virtual void Message(int level, const char *format, ...) {
 | 
| +    va_list va;
 | 
| +
 | 
| +    if (level == 0)
 | 
| +      std::fprintf(stderr, "ERROR: ");
 | 
| +    else
 | 
| +      std::fprintf(stderr, "WARNING: ");
 | 
| +    va_start(va, format);
 | 
| +    std::vfprintf(stderr, format, va);
 | 
| +    std::fprintf(stderr, "\n");
 | 
| +    va_end(va);
 | 
| +  }
 | 
| +
 | 
| +  virtual ots::TableAction GetTableAction(uint32_t tag) {
 | 
| +#define TAG(a, b, c, d) ((a) << 24 | (b) << 16 | (c) << 8 | (d))
 | 
| +    switch (tag) {
 | 
| +      case TAG('S','i','l','f'):
 | 
| +      case TAG('S','i','l','l'):
 | 
| +      case TAG('G','l','o','c'):
 | 
| +      case TAG('G','l','a','t'):
 | 
| +      case TAG('F','e','a','t'):
 | 
| +        return ots::TABLE_ACTION_PASSTHRU;
 | 
| +      default:
 | 
| +        return ots::TABLE_ACTION_DEFAULT;
 | 
| +    }
 | 
| +#undef TAG
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +int main(int argc, char **argv) {
 | 
| +  if (argc < 2 || argc > 3) return Usage(argv[0]);
 | 
| +
 | 
| +  const int fd = ::open(argv[1], O_RDONLY | ADDITIONAL_OPEN_FLAGS);
 | 
| +  if (fd < 0) {
 | 
| +    ::perror("open");
 | 
| +    return 1;
 | 
| +  }
 | 
| +
 | 
| +  struct stat st;
 | 
| +  ::fstat(fd, &st);
 | 
| +
 | 
| +  uint8_t *data = new uint8_t[st.st_size];
 | 
| +  if (::read(fd, data, st.st_size) != st.st_size) {
 | 
| +    ::perror("read");
 | 
| +    return 1;
 | 
| +  }
 | 
| +  ::close(fd);
 | 
| +
 | 
| +  Context context;
 | 
| +
 | 
| +  FILE* out = NULL;
 | 
| +  if (argc == 3)
 | 
| +    out = fopen(argv[2], "wb");
 | 
| +
 | 
| +  ots::FILEStream output(out);
 | 
| +  const bool result = context.Process(&output, data, st.st_size);
 | 
| +
 | 
| +  if (!result) {
 | 
| +    std::fprintf(stderr, "Failed to sanitise file!\n");
 | 
| +  }
 | 
| +  return !result;
 | 
| +}
 | 
| 
 |