| 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;
|
| +}
|
|
|