text: // Copyright 2020 The Chromium OS Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include <cstdio>
  #include <string>
  
  #include "base/environment.h"
  
  #include "foomatic_shell/shell.h"
  
  namespace {
  
  // Description of the supported parameters.
  const char kDescription[] =
      "Supported parameters:\n  -c - execute the script given in the next "
      "parameter\n  -v - verbose mode\n  -e - this parameter is ignored.\n";
  
  // Prints a message |msg| to stderr and append to it the description of the
  // supported parameters.
  void PrintErrorMessage(const std::string& msg) {
    fprintf(stderr, "Incorrect parameters: %s.\n%s", msg.c_str(), kDescription);
  }
  
  }  // namespace
  
  int main(int argc, char** argv) {
    char* script = nullptr;
    bool verbose = false;
    bool verify = base::Environment::Create()->HasVar("FOOMATIC_VERIFY_MODE");
  
    // Parse the input parameters.
    for (int i = 1; i < argc; ++i) {
      const std::string parameter = argv[i];
      // Option -c is supposed to be followed by a script to execute.
      if (parameter == "-c") {
        if (script != nullptr) {
          PrintErrorMessage("No more than one -c parameter is allowed");
          return -1;
        }
        if (++i == argc) {
          PrintErrorMessage("No script after -c parameter");
          return -1;
        }
        script = argv[i];
        continue;
      }
      // Parameter -v means verbose mode.
      if (parameter == "-v") {
        verbose = true;
        continue;
      }
      // Parameter -e is ignored.
      if (parameter == "-e")
        continue;
      // Unknown parameter - exit with an error.
      PrintErrorMessage("Unknown parameter " + parameter);
      return -1;
    }
  
    // The parameter -c must be specified.
    if (script == nullptr) {
      PrintErrorMessage("Parameter -c must be set");
      return -1;
    }
  
    // Run in the standard mode (execute given script).
    if (strlen(script) > foomatic_shell::kMaxSourceSize) {
      PrintErrorMessage("The script provided with -c parameter is too large");
      return -1;
    }
    return (foomatic_shell::ExecuteShellScript(std::string(script), 1, verbose,
                                               verify));
  }
  