courgette_minimal_tool.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'courgette_minimal_tool' is not meant to be a serious command-line tool.  It
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has the minimum logic to apply a Courgette patch to a file.  The main purpose
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is to monitor the code size of the patcher.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/third_party/bsdiff.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/courgette.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/streams.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintHelp() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(stderr,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Usage:\n"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  courgette_minimal_tool <old-file-input> <patch-file-input>"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    " <new-file-output>\n"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\n");
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UsageProblem(const char* message) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(stderr, "%s\n", message);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintHelp();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit(1);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Problem(const char* message) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(stderr, "%s\n", message);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit(1);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int wmain(int argc, const wchar_t* argv[]) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, const char* argv[]) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (argc != 4)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UsageProblem("bad args");
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  courgette::Status status =
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      courgette::ApplyEnsemblePatch(argv[1], argv[2], argv[3]);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status != courgette::C_OK) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_READ_OPEN_ERROR) Problem("Can't open file.");
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_WRITE_OPEN_ERROR) Problem("Can't open file.");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_READ_ERROR) Problem("Can't read from file.");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_WRITE_ERROR) Problem("Can't write to file.");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Problem("patch failed.");
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57