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 "courgette/third_party/bsdiff.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/courgette.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "courgette/streams.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintHelp() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(stderr,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Usage:\n"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  courgette_minimal_tool <old-file-input> <patch-file-input>"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    " <new-file-output>\n"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\n");
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UsageProblem(const char* message) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(stderr, "%s\n", message);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintHelp();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit(1);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Problem(const char* message) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(stderr, "%s\n", message);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit(1);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int wmain(int argc, const wchar_t* argv[]) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main(int argc, const char* argv[]) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (argc != 4)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UsageProblem("bad args");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  courgette::Status status =
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      courgette::ApplyEnsemblePatch(argv[1], argv[2], argv[3]);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status != courgette::C_OK) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_READ_OPEN_ERROR) Problem("Can't open file.");
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_WRITE_OPEN_ERROR) Problem("Can't open file.");
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_READ_ERROR) Problem("Can't read from file.");
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status == courgette::C_WRITE_ERROR) Problem("Can't write to file.");
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Problem("patch failed.");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55