Use dcp::compose rather than our own. compose
authorCarl Hetherington <cth@carlh.net>
Sat, 10 Jul 2021 00:05:56 +0000 (02:05 +0200)
committerCarl Hetherington <cth@carlh.net>
Sat, 10 Jul 2021 00:05:56 +0000 (02:05 +0200)
src/compose.hpp [deleted file]
src/dcp_reader.cc
src/exceptions.cc
src/ssa_reader.cc
src/stl_binary_reader.cc
src/stl_binary_tables.cc
src/stl_binary_writer.cc
src/stl_text_reader.cc
src/stl_util.cc
test/test.cc

diff --git a/src/compose.hpp b/src/compose.hpp
deleted file mode 100644 (file)
index bcddd43..0000000
+++ /dev/null
@@ -1,392 +0,0 @@
-/* -*- c-basic-offset: 2 -*-
- * Defines String::compose(fmt, arg...) for easy, i18n-friendly
- * composition of strings.
- *
- * Version 1.0.
- *
- * Copyright (c) 2002 Ole Laursen <olau@hardworking.dk>.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- */
-
-//
-// Basic usage is like
-//
-//   std::cout << String::compose("This is a %1x%2 matrix.", rows, cols);
-//
-// See http://www.cs.aau.dk/~olau/compose/ or the included README.compose for
-// more details.
-//
-
-#ifndef STRING_COMPOSE_H
-#define STRING_COMPOSE_H
-
-#include "locale_convert.h"
-#include <boost/filesystem.hpp>
-#include <string>
-#include <list>
-#include <map>
-#include <inttypes.h>
-#include <cstdio>
-
-namespace StringPrivate
-{
-  // the actual composition class - using string::compose is cleaner, so we
-  // hide it here
-  class Composition
-  {
-  public:
-    // initialize and prepare format string on the form "text %1 text %2 etc."
-    explicit Composition(std::string fmt);
-
-    // supply an replacement argument starting from %1
-    template <typename T>
-    Composition &arg(const T &obj);
-
-    // compose and return string
-    std::string str() const;
-
-  private:
-    std::string os;
-    int arg_no;
-
-    // we store the output as a list - when the output string is requested, the
-    // list is concatenated to a string; this way we can keep iterators into
-    // the list instead of into a string where they're possibly invalidated on
-    // inserting a specification string
-    typedef std::list<std::string> output_list;
-    output_list output;
-
-    // the initial parse of the format string fills in the specification map
-    // with positions for each of the various %?s
-    typedef std::multimap<int, output_list::iterator> specification_map;
-    specification_map specs;
-  };
-
-  // helper for converting spec string numbers
-  inline int char_to_int(char c)
-  {
-    switch (c) {
-    case '0': return 0;
-    case '1': return 1;
-    case '2': return 2;
-    case '3': return 3;
-    case '4': return 4;
-    case '5': return 5;
-    case '6': return 6;
-    case '7': return 7;
-    case '8': return 8;
-    case '9': return 9;
-    default: return -1000;
-    }
-  }
-
-  inline bool is_number(int n)
-  {
-    switch (n) {
-    case '0':
-    case '1':
-    case '2':
-    case '3':
-    case '4':
-    case '5':
-    case '6':
-    case '7':
-    case '8':
-    case '9':
-      return true;
-
-    default:
-      return false;
-    }
-  }
-
-  // implementation of class Composition
-  template <typename T>
-  inline Composition &Composition::arg(const T &obj)
-  {
-    os += sub::locale_convert<std::string>(obj);
-
-    if (!os.empty()) {         // manipulators don't produce output
-      for (specification_map::const_iterator i = specs.lower_bound(arg_no), end = specs.upper_bound(arg_no); i != end; ++i) {
-       output_list::iterator pos = i->second;
-       ++pos;
-
-       output.insert(pos, os);
-      }
-
-      os = "";
-      ++arg_no;
-    }
-
-    return *this;
-  }
-
-  inline Composition::Composition(std::string fmt)
-    : arg_no(1)
-  {
-    std::string::size_type b = 0, i = 0;
-
-    // fill in output with the strings between the %1 %2 %3 etc. and
-    // fill in specs with the positions
-    while (i < fmt.length()) {
-      if (fmt[i] == '%' && i + 1 < fmt.length()) {
-       if (fmt[i + 1] == '%') {        // catch %%
-         fmt.replace(i, 2, "%");
-         ++i;
-       }
-       else if (is_number(fmt[i + 1])) { // aha! a spec!
-         // save string
-         output.push_back(fmt.substr(b, i - b));
-
-         int n = 1;            // number of digits
-         int spec_no = 0;
-
-         do {
-           spec_no += char_to_int(fmt[i + n]);
-           spec_no *= 10;
-           ++n;
-         } while (i + n < fmt.length() && is_number(fmt[i + n]));
-
-         spec_no /= 10;
-         output_list::iterator pos = output.end();
-         --pos;                // safe since we have just inserted a string>
-
-         specs.insert(specification_map::value_type(spec_no, pos));
-
-         // jump over spec string
-         i += n;
-         b = i;
-       }
-       else
-         ++i;
-      }
-      else
-       ++i;
-    }
-
-    if (i - b > 0)             // add the rest of the string
-      output.push_back(fmt.substr(b, i - b));
-  }
-
-  inline std::string Composition::str() const
-  {
-    // assemble string
-    std::string str;
-
-    for (output_list::const_iterator i = output.begin(), end = output.end();
-        i != end; ++i)
-      str += *i;
-
-    return str;
-  }
-}
-
-// now for the real thing(s)
-namespace String
-{
-  // a series of functions which accept a format string on the form "text %1
-  // more %2 less %3" and a number of templated parameters and spits out the
-  // composited string
-  template <typename T1>
-  inline std::string compose(const std::string &fmt, const T1 &o1)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1);
-    return c.str();
-  }
-
-  template <typename T1, typename T2>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8, typename T9>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8, const T9 &o9)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8, typename T9, typename T10>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8, const T9 &o9,
-                            const T10 &o10)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
-      .arg(o10);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8, typename T9, typename T10,
-           typename T11>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8, const T9 &o9,
-                            const T10 &o10, const T11 &o11)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
-      .arg(o10).arg(o11);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8, typename T9, typename T10,
-           typename T11, typename T12>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8, const T9 &o9,
-                            const T10 &o10, const T11 &o11, const T12 &o12)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
-      .arg(o10).arg(o11).arg(o12);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8, typename T9, typename T10,
-           typename T11, typename T12, typename T13>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8, const T9 &o9,
-                            const T10 &o10, const T11 &o11, const T12 &o12,
-                            const T13 &o13)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
-      .arg(o10).arg(o11).arg(o12).arg(o13);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8, typename T9, typename T10,
-           typename T11, typename T12, typename T13, typename T14>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8, const T9 &o9,
-                            const T10 &o10, const T11 &o11, const T12 &o12,
-                            const T13 &o13, const T14 &o14)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
-      .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14);
-    return c.str();
-  }
-
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,
-           typename T6, typename T7, typename T8, typename T9, typename T10,
-           typename T11, typename T12, typename T13, typename T14,
-           typename T15>
-  inline std::string compose(const std::string &fmt,
-                            const T1 &o1, const T2 &o2, const T3 &o3,
-                            const T4 &o4, const T5 &o5, const T6 &o6,
-                            const T7 &o7, const T8 &o8, const T9 &o9,
-                            const T10 &o10, const T11 &o11, const T12 &o12,
-                            const T13 &o13, const T14 &o14, const T15 &o15)
-  {
-    StringPrivate::Composition c(fmt);
-    c.arg(o1).arg(o2).arg(o3).arg(o4).arg(o5).arg(o6).arg(o7).arg(o8).arg(o9)
-      .arg(o10).arg(o11).arg(o12).arg(o13).arg(o14).arg(o15);
-    return c.str();
-  }
-}
-
-
-#endif // STRING_COMPOSE_H
index 0c7a29a90aaa9d564f3f18932c00e305599fbd55..673771e873a2ef15c23c9522dfb23686c69fc5c7 100644 (file)
@@ -18,8 +18,8 @@
 */
 
 #include "dcp_reader.h"
-#include "compose.hpp"
 #include "exceptions.h"
+#include <dcp/compose.h>
 #include <dcp/subtitle_string.h>
 #include <dcp/interop_subtitle_asset.h>
 #include <dcp/smpte_subtitle_asset.h>
@@ -66,7 +66,7 @@ DCPReader::DCPReader (boost::filesystem::path file)
        }
 
        if (!sc) {
-               throw DCPError(String::compose("Could not read subtitles (%1 / %2)", interop_error, smpte_error));
+               throw DCPError(dcp::compose("Could not read subtitles (%1 / %2)", interop_error, smpte_error));
        }
 
 
index 72198fcefffe0bbfe4689b38b84bfe39fc84c332..e6559db1e58586051d0e5f9ea909d3a96eeff84f 100644 (file)
 
 */
 
-#include "compose.hpp"
 #include "exceptions.h"
+#include <dcp/compose.h>
 
 using std::list;
 using std::string;
 using namespace sub;
 
 ProgrammingError::ProgrammingError (string file, int line)
-       : runtime_error (String::compose ("Programming error at %1:%2", file, line))
+       : runtime_error (dcp::compose ("Programming error at %1:%2", file, line))
 {
 
 }
index 4a9be0e28b0d4300aaa01b191cdfbb141103bc93..b6839fe99dd19b5c3719e78c87d147a83de000ca 100644 (file)
@@ -22,7 +22,7 @@
 #include "sub_assert.h"
 #include "raw_convert.h"
 #include "subtitle.h"
-#include "compose.hpp"
+#include <dcp/compose.h>
 #include <boost/algorithm/string.hpp>
 #include <boost/bind.hpp>
 #include <iostream>
@@ -54,13 +54,13 @@ h_colour (string s)
 {
        /* There are both BGR and ABGR versions of these colours */
        if ((s.length() != 8 && s.length() != 10) || s[0] != '&' || s[1] != 'H') {
-               throw SSAError(String::compose("Badly formatted colour tag %1", s));
+               throw SSAError(dcp::compose("Badly formatted colour tag %1", s));
        }
        int ir, ig, ib;
        /* XXX: ignoring alpha channel here; note that 00 is opaque and FF is transparent */
        int const off = s.length() == 10 ? 4 : 2;
        if (sscanf(s.c_str() + off, "%2x%2x%2x", &ib, &ig, &ir) < 3) {
-               throw SSAError(String::compose("Badly formatted colour tag %1", s));
+               throw SSAError(dcp::compose("Badly formatted colour tag %1", s));
        }
        return sub::Colour(ir / 255.0, ig / 255.0, ib / 255.0);
 }
@@ -253,7 +253,7 @@ SSAReader::parse_style (RawSubtitle& sub, string style, int play_res_x, int play
        } else if (boost::starts_with(style, "\\c")) {
                /* \c&Hbbggrr& */
                if (style.length() <= 2) {
-                       throw SSAError(String::compose("Badly formatted colour tag %1", style));
+                       throw SSAError(dcp::compose("Badly formatted colour tag %1", style));
                }
                sub.colour = h_colour (style.substr(2, style.length() - 3));
        }
index f441aec09a89a9f68d8ae5598e07c3219af950e9..43f51b8ccf5bdc3fd8440f7a54f87dacd741b544 100644 (file)
@@ -21,7 +21,7 @@
 #include "exceptions.h"
 #include "iso6937.h"
 #include "stl_util.h"
-#include "compose.hpp"
+#include <dcp/compose.h>
 #include <boost/lexical_cast.hpp>
 #include <boost/algorithm/string.hpp>
 #include <boost/locale.hpp>
@@ -100,7 +100,7 @@ public:
        {
                _in.read (reinterpret_cast<char *>(_buffer), size);
                if (_in.gcount() != size) {
-                       throw STLError (String::compose("Could not read %1 block from binary STL file", what));
+                       throw STLError (dcp::compose("Could not read %1 block from binary STL file", what));
                }
        }
 
@@ -121,7 +121,7 @@ public:
        {
                size_t const N = fread (_buffer, 1, size, _in);
                if (static_cast<int>(N) != size) {
-                       throw STLError (String::compose("Could not read %1 block from binary STL file", what));
+                       throw STLError (dcp::compose("Could not read %1 block from binary STL file", what));
                }
        }
 
index db623bf32e705783d791e6c86d3030774ee338c8..ae333e697afec521a6b7edf3587b4bc4ae8aa2e0 100644 (file)
@@ -20,7 +20,7 @@
 #include "stl_binary_tables.h"
 #include "exceptions.h"
 #include "sub_assert.h"
-#include "compose.hpp"
+#include <dcp/compose.h>
 
 using std::map;
 using std::string;
@@ -39,7 +39,7 @@ file_to_enum (F k, map<F, STLBinaryCode<E> > m, string name)
 {
        typename map<F, STLBinaryCode<E> >::const_iterator i = m.find (k);
        if (i == m.end ()) {
-               throw STLError (String::compose ("Unknown %1 %2 in binary STL file", name, k));
+               throw STLError (dcp::compose ("Unknown %1 %2 in binary STL file", name, k));
        }
 
        return i->second.value;
index 1b1d52f99226f4c75e81cb46f1e6cfcfc7682dd0..8cc59d1b44ba70ea805f17e45ecc2f55c7cf639e 100644 (file)
@@ -25,8 +25,8 @@
 #include "subtitle.h"
 #include "iso6937.h"
 #include "stl_util.h"
-#include "compose.hpp"
 #include "sub_assert.h"
+#include <dcp/compose.h>
 #include <boost/locale.hpp>
 #include <boost/algorithm/string.hpp>
 #include <cmath>
index f08a438fb8dba8974bea75d33cbf7def16487588..4859823bd5c8968c06117670e8891b98f252ba05 100644 (file)
@@ -18,7 +18,7 @@
 */
 
 #include "stl_text_reader.h"
-#include "compose.hpp"
+#include <dcp/compose.h>
 #include <boost/algorithm/string.hpp>
 #include <boost/lexical_cast.hpp>
 #include <vector>
@@ -69,7 +69,7 @@ STLTextReader::STLTextReader (istream& in)
 
                                set (name, value);
                        } else {
-                               warn (String::compose ("Unrecognised line %1", line));
+                               warn (dcp::compose ("Unrecognised line %1", line));
                        }
                } else {
                        /* "Normal" lines */
@@ -80,7 +80,7 @@ STLTextReader::STLTextReader (istream& in)
                        }
 
                        if (divider[0] == string::npos || divider[1] == string::npos || divider[0] <= 1 || divider[1] >= line.length() - 1) {
-                               warn (String::compose ("Unrecognised line %1", line));
+                               warn (dcp::compose ("Unrecognised line %1", line));
                                continue;
                        }
 
@@ -93,7 +93,7 @@ STLTextReader::STLTextReader (istream& in)
                        optional<Time> to = time (to_string);
 
                        if (!from || !to) {
-                               warn (String::compose ("Unrecognised line %1", line));
+                               warn (dcp::compose ("Unrecognised line %1", line));
                                continue;
                        }
 
@@ -138,7 +138,7 @@ STLTextReader::time (string t) const
        vector<string> b;
        split (b, t, is_any_of (":"));
        if (b.size() != 4) {
-               warn (String::compose ("Unrecognised time %1", t));
+               warn (dcp::compose ("Unrecognised time %1", t));
                return optional<Time> ();
        }
 
index 16d8a63a892adb019ee7612353d382da7d697d09..f681b196ded157c1a51cee902796e743dcfdc785 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "stl_util.h"
 #include "exceptions.h"
-#include "compose.hpp"
+#include <dcp/compose.h>
 #include <string>
 #include <cmath>
 
@@ -62,5 +62,5 @@ sub::stl_dfc_to_frame_rate (string s)
                return 30;
        }
 
-       throw STLError (String::compose ("Unknown disk format code %1 in binary STL file", s));
+       throw STLError (dcp::compose ("Unknown disk format code %1 in binary STL file", s));
 }
index bc2acda81e4e8a786cc0be1db2b29c0f8117b8c5..d4075ed022502bed6ea65200c2c9d53a47ee62fb 100644 (file)
@@ -20,7 +20,7 @@
 #define BOOST_TEST_DYN_LINK
 #define BOOST_TEST_MODULE libsub_test
 #include "iso6937_tables.h"
-#include "compose.hpp"
+#include <dcp/compose.h>
 #include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
 #include <fstream>
@@ -106,7 +106,7 @@ check_file (boost::filesystem::path ref, boost::filesystem::path check)
                BOOST_CHECK_EQUAL (r, this_time);
 
                for (uintmax_t i = 0; i < this_time; ++i) {
-                       string const s = String::compose (
+                       string const s = dcp::compose (
                                "Files differ at offset %1; reference is %2, check is %3", (offset + i), ((int) ref_buffer[i]), ((int) check_buffer[i])
                                );
                        BOOST_CHECK_MESSAGE (ref_buffer[i] == check_buffer[i], s);