fix [-Wincompatible-pointer-types] warning
[awesomized/libmemcached] / src / bin / memcat.cc
index 9e2704af5b0aef0fbe11e6abf943745218c4c18a..3938bf134406b65384ca31d9157932dc55b6f74a 100644 (file)
@@ -1,6 +1,6 @@
 /*
     +--------------------------------------------------------------------+
-    | libmemcached - C/C++ Client Library for memcached                  |
+    | libmemcached-awesome - C/C++ Client Library for memcached          |
     +--------------------------------------------------------------------+
     | Redistribution and use in source and binary forms, with or without |
     | modification, are permitted under the terms of the BSD license.    |
@@ -9,7 +9,7 @@
     | the terms online at: https://opensource.org/licenses/BSD-3-Clause  |
     +--------------------------------------------------------------------+
     | Copyright (c) 2006-2014 Brian Aker   https://datadifferential.com/ |
-    | Copyright (c) 2020 Michael Wallner   <mike@php.net>                |
+    | Copyright (c) 2020-2021 Michael Wallner        https://awesome.co/ |
     +--------------------------------------------------------------------+
 */
 
@@ -37,12 +37,22 @@ memcached_return_t memcat(const client_options &opt, memcached_st *memc, const c
       *ref << "key: " << key << "\n";
     }
     if (opt.isset("flags")) {
-      *ref << "flags: " << flags << "\n";
+      if (verbose) {
+      *ref << "flags: ";
+      }
+      *ref << flags << "\n";
     }
     if (verbose) {
       *ref << "value: ";
     }
-    ref->write(val, len) << std::endl;
+
+    ref->write(val, len);
+
+    if (verbose || !opt.isset("file")) {
+      *ref << std::endl;
+    }
+
+    ref->flush();
   }
 
   if (val) {
@@ -52,13 +62,14 @@ memcached_return_t memcat(const client_options &opt, memcached_st *memc, const c
 }
 
 int main(int argc, char *argv[]) {
-  client_options opt{PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_DESCRIPTION, "key [ key ... ]"};
+  client_options opt{PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_DESCRIPTION, "key [key ...]"};
 
   for (const auto &def : opt.defaults) {
     opt.add(def);
   }
   opt.add("flags", 'F', no_argument, "Display key flags, too.");
-  opt.add("file", 'f', required_argument, "Output to file instead of standard output.");
+  opt.add("file", 'f', optional_argument, "Output to file instead of standard output."
+                                          "\n\t\t# NOTE: defaults to <key> if no argument was provided.");
 
   char **argp = nullptr;
   if (!opt.parse(argc, argv, &argp)) {
@@ -85,26 +96,18 @@ int main(int argc, char *argv[]) {
     exit(EXIT_FAILURE);
   }
 
+  auto file_flag = opt.isset("file");
+  auto file = opt.argof("file");
   auto exit_code = EXIT_SUCCESS;
   for (auto arg = argp; *arg; ++arg) {
     auto key = *arg;
     if (*key) {
+      if (!file && file_flag) {
+        file = key;
+      }
 
       std::ofstream fstream{};
-      std::ostream *ostream = check_ostream(opt, opt.argof("file"), fstream);
-
-      auto file = opt.argof("file");
-      if (file && *file) {
-        fstream.open(file, std::ios::binary | std::ios::out);
-        if (!fstream.is_open()) {
-          exit_code = EXIT_FAILURE;
-          if (!opt.isset("quiet")) {
-            std::cerr << "Failed to open " << file << " for writing.\n";
-          }
-          continue;
-        }
-        ostream = &fstream;
-      }
+      std::ostream *ostream = check_ostream(opt, file, fstream);
 
       if (!check_return(opt, memc, key, memcat(opt, &memc, key, ostream))) {
         exit_code = EXIT_FAILURE;