diff options
| -rw-r--r-- | cscript | 25 | ||||
| -rw-r--r-- | examples/wscript | 2 | ||||
| -rw-r--r-- | src/compose.hpp | 393 | ||||
| -rw-r--r-- | src/cpl.cc | 20 | ||||
| -rw-r--r-- | src/subtitle_asset.cc | 1 | ||||
| -rw-r--r-- | src/subtitle_asset.h | 11 | ||||
| -rw-r--r-- | test/rewrite_subs.cc | 1 | ||||
| -rw-r--r-- | test/wscript | 6 | ||||
| -rw-r--r-- | tools/wscript | 4 | ||||
| -rw-r--r-- | wscript | 2 |
10 files changed, 441 insertions, 24 deletions
@@ -1,17 +1,28 @@ import os -def build(env, target): - cmd = './waf configure --prefix=%s' % env.work_dir_cscript() +def dependencies(target): + if target.platform == 'windows': + return () + else: + # XXX: should be some versions in here + return (('libcxml', None), ('openjpeg-cdist', None)) + +def build(target): + cmd = './waf configure --prefix=%s' % target.work_dir_cscript() if target.platform == 'linux': - cmd += ' --static-libdcp --static-openjpeg' + cmd += ' --static' elif target.platform == 'windows': cmd += ' --target-windows' elif target.platform == 'osx': cmd += ' --osx' - env.command(cmd) - env.command('./waf build install') -def make_doxygen(env): + if target.debug: + cmd += ' --enable-debug' + + target.command(cmd) + target.command('./waf build install') + +def make_doxygen(target): os.makedirs('build/doc') - env.command('doxygen') + target.command('doxygen') return os.path.abspath('build/doc/html') diff --git a/examples/wscript b/examples/wscript index 46d3287b..05cca98f 100644 --- a/examples/wscript +++ b/examples/wscript @@ -2,7 +2,7 @@ def build(bld): obj = bld(features = 'cxx cxxprogram') obj.name = 'examples' obj.use = 'libdcp' - obj.uselib = 'OPENJPEG' + obj.uselib = 'OPENJPEG CXML' obj.source = 'make_dcp.cc' obj.target = 'make_dcp' obj.install_path = '' diff --git a/src/compose.hpp b/src/compose.hpp new file mode 100644 index 00000000..b3f410c8 --- /dev/null +++ b/src/compose.hpp @@ -0,0 +1,393 @@ +/* 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 <sstream> +#include <string> +#include <list> +#include <map> // for multimap + +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::ostringstream 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 << obj; + + std::string rep = os.str(); + + if (!rep.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, rep); + } + + os.str(std::string()); + //os.clear(); + ++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 @@ -28,6 +28,8 @@ #include "reel.h" #include "metadata.h" #include "encryption.h" +#include "exceptions.h" +#include "compose.hpp" using std::string; using std::stringstream; @@ -175,7 +177,7 @@ CPL::add_reel (shared_ptr<const Reel> reel) } void -CPL::write_xml (shared_ptr<Encryption> crypt, XMLMetadata const & metadata) const +CPL::write_xml (XMLMetadata const & metadata, shared_ptr<Encryption> crypt) const { boost::filesystem::path p; p /= _directory; @@ -279,17 +281,19 @@ CPL::equals (CPL const & other, EqualityOptions opt, boost::function<void (NoteT } if (_fps != other._fps) { - note (ERROR, "frames per second differ"); + note (ERROR, String::compose ("frames per second differ (%1 vs %2)", _fps, other._fps)); return false; } if (_length != other._length) { - note (ERROR, "lengths differ"); + stringstream s; + s << "lengths differ (" << _length << " cf " << other._length << ")"; + note (ERROR, String::compose ("lengths differ (%1 vs %2)", _length, other._length)); return false; } if (_reels.size() != other._reels.size()) { - note (ERROR, "reel counts differ"); + note (ERROR, String::compose ("reel counts differ (%1 vs %2)", _reels.size(), other._reels.size())); return false; } @@ -329,10 +333,10 @@ CPL::make_kdm ( authenticated_public->set_attribute("Id", "ID_AuthenticatedPublic"); xmlAddID (0, doc->cobj(), (const xmlChar *) "ID_AuthenticatedPublic", authenticated_public->get_attribute("Id")->cobj()); - authenticated_public->add_child("MessageId")->add_child_text("urn:uuid:" + make_uuid()); - authenticated_public->add_child("MessageType")->add_child_text("http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type"); - authenticated_public->add_child("AnnotationText")->add_child_text(Metadata::instance()->product_name); - authenticated_public->add_child("IssueDate")->add_child_text(Metadata::instance()->issue_date); + authenticated_public->add_child("MessageId")->add_child_text ("urn:uuid:" + make_uuid()); + authenticated_public->add_child("MessageType")->add_child_text ("http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type"); + authenticated_public->add_child("AnnotationText")->add_child_text (MXFMetadata::instance()->product_name); + authenticated_public->add_child("IssueDate")->add_child_text (MXFMetadata::instance()->issue_date); { xmlpp::Element* signer = authenticated_public->add_child("Signer"); diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc index 80cc1ea6..7f4d47d0 100644 --- a/src/subtitle_asset.cc +++ b/src/subtitle_asset.cc @@ -22,6 +22,7 @@ #include <boost/algorithm/string.hpp> #include <libxml++/nodes/element.h> #include "subtitle_asset.h" +#include "parse/subtitle.h" #include "util.h" #include "xml.h" diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h index 2da1ce7b..a76a3076 100644 --- a/src/subtitle_asset.h +++ b/src/subtitle_asset.h @@ -17,14 +17,21 @@ */ +#include <libcxml/cxml.h> #include "asset.h" -#include "xml.h" #include "dcp_time.h" -#include "parse/subtitle.h" namespace libdcp { +namespace parse +{ + class Font; + class Text; + class Subtitle; + class LoadFont; +} + class Subtitle { public: diff --git a/test/rewrite_subs.cc b/test/rewrite_subs.cc index adb9f6b4..8c055d9e 100644 --- a/test/rewrite_subs.cc +++ b/test/rewrite_subs.cc @@ -3,6 +3,7 @@ #include "cpl.h" #include "reel.h" #include "subtitle_asset.h" +#include "exceptions.h" using std::cout; using std::cerr; diff --git a/test/wscript b/test/wscript index d22875e9..2892bf9e 100644 --- a/test/wscript +++ b/test/wscript @@ -18,7 +18,7 @@ def configure(conf): def build(bld): obj = bld(features = 'cxx cxxprogram') obj.name = 'tests' - obj.uselib = 'BOOST_TEST OPENJPEG XMLSEC1' + obj.uselib = 'BOOST_TEST OPENJPEG CXML XMLSEC1' obj.use = 'libdcp' obj.source = 'tests.cc' obj.target = 'tests' @@ -26,7 +26,7 @@ def build(bld): obj = bld(features = 'cxx cxxprogram') obj.name = 'subs_in_out' - obj.uselib = 'BOOST_TEST OPENJPEG' + obj.uselib = 'BOOST_TEST OPENJPEG CXML' obj.use = 'libdcp' obj.source = 'subs_in_out.cc' obj.target = 'subs_in_out' @@ -34,7 +34,7 @@ def build(bld): obj = bld(features = 'cxx cxxprogram') obj.name = 'rewrite_subs' - obj.uselib = 'BOOST_TEST OPENJPEG' + obj.uselib = 'BOOST_TEST OPENJPEG CXML' obj.use = 'libdcp' obj.source = 'rewrite_subs.cc' obj.target = 'rewrite_subs' diff --git a/tools/wscript b/tools/wscript index a79b3c9d..e4a32534 100644 --- a/tools/wscript +++ b/tools/wscript @@ -1,13 +1,13 @@ def build(bld): obj = bld(features = 'cxx cxxprogram') obj.use = ['libdcp'] - obj.uselib = 'OPENJPEG' + obj.uselib = 'OPENJPEG CXML' obj.source = 'dcpdiff.cc' obj.target = 'dcpdiff' obj = bld(features = 'cxx cxxprogram') obj.use = ['libdcp'] - obj.uselib = 'OPENJPEG' + obj.uselib = 'OPENJPEG CXML' obj.source = 'dcpinfo.cc' obj.target = 'dcpinfo' @@ -2,7 +2,7 @@ import subprocess import os APPNAME = 'libdcp' -VERSION = '0.54pre' +VERSION = '0.55pre' def options(opt): opt.load('compiler_cxx') |
