diff options
author | Jan Vcelak <jvcelak@redhat.com> | 2011-01-21 17:13:25 +0100 |
---|---|---|
committer | Jan Vcelak <jvcelak@redhat.com> | 2011-01-21 17:13:25 +0100 |
commit | 965113abc11e988a3572a7adc3d6db0aed5b3f25 (patch) | |
tree | 51d9045dc557201d8998191c60be4cd034ed9e83 /groff-japanese-charclass.patch | |
parent | 59e4ee92703a8a243a3737a9ced81276203babe9 (diff) | |
download | groff-965113abc11e988a3572a7adc3d6db0aed5b3f25.tar.gz groff-965113abc11e988a3572a7adc3d6db0aed5b3f25.tar.xz groff-965113abc11e988a3572a7adc3d6db0aed5b3f25.zip |
rebase to 1.21
Diffstat (limited to 'groff-japanese-charclass.patch')
-rw-r--r-- | groff-japanese-charclass.patch | 859 |
1 files changed, 0 insertions, 859 deletions
diff --git a/groff-japanese-charclass.patch b/groff-japanese-charclass.patch deleted file mode 100644 index b295db6..0000000 --- a/groff-japanese-charclass.patch +++ /dev/null @@ -1,859 +0,0 @@ -Resolves: #596900 - -From 8855b7d5f80f7c7a667abd690da7e65e0a77ab97 Mon Sep 17 00:00:00 2001 -From: Daiki Ueno <ueno@unixuser.org> -Date: Thu, 5 Aug 2010 16:00:32 +0900 -Subject: [PATCH] Import Colin Watson's charclass branch with minor fixes. - -Changes from the branch: -- libgroff: make sure to return -1 from glyph_to_unicode() on error. -- tmac: add cflags to non-punct Japanese characters to ja.tmac. -- troff: skip "-" on parsing character ranges of the class request. -- troff: make class request parsing robuster. -- troff: suppress debug messages if DEBUGGING is not set. -- nroff: supply "-mja" to groff if running under Japanese locales. ---- - src/include/classes.h | 62 ++++++++++++ - src/include/font.h | 16 +++ - src/libs/libgroff/Makefile.sub | 2 + - src/libs/libgroff/classes.cpp | 48 ++++++++++ - src/libs/libgroff/font.cpp | 203 ++++++++++++++++++++++++++-------------- - src/roff/nroff/nroff.sh | 6 + - src/roff/troff/charinfo.h | 50 +++++++++-- - src/roff/troff/input.cpp | 138 +++++++++++++++++++++++++++ - tmac/Makefile.sub | 3 +- - tmac/ja.tmac | 49 ++++++++++ - 10 files changed, 499 insertions(+), 78 deletions(-) - create mode 100644 src/include/classes.h - create mode 100644 src/libs/libgroff/classes.cpp - create mode 100644 tmac/ja.tmac - -diff --git a/src/include/classes.h b/src/include/classes.h -new file mode 100644 -index 0000000..2f0e2bd ---- /dev/null -+++ b/src/include/classes.h -@@ -0,0 +1,62 @@ -+/* This file is in the public domain. */ -+ -+class charinfo; -+ -+class char_class -+{ -+ public: -+ virtual bool is_in_class(int c); -+ virtual int lookup_char(int c) = 0; -+ charinfo *get_charinfo(); -+ void set_charinfo(charinfo *); -+ protected: -+ private: -+ charinfo *ci; -+}; -+ -+class single_char_class : public char_class -+{ -+ public: -+ single_char_class(int c); -+ int lookup_char(int c); -+ protected: -+ private: -+ int ch; -+}; -+ -+class range_char_class : public char_class -+{ -+ public: -+ range_char_class(int low, int high); -+ int lookup_char(int c); -+ protected: -+ private: -+ int lo, hi; -+}; -+ -+class ref_char_class : public char_class -+{ -+ public: -+ ref_char_class(char_class *klass); -+ int lookup_char(int c); -+ char_class *get_class(); -+ protected: -+ private: -+ char_class *ref; -+}; -+ -+inline bool char_class::is_in_class(int c) -+{ -+ return lookup_char(c) == 0; -+} -+ -+inline charinfo *char_class::get_charinfo() -+{ -+ return ci; -+} -+ -+inline void char_class::set_charinfo(charinfo *cis) -+{ -+ ci = cis; -+} -+ -diff --git a/src/include/font.h b/src/include/font.h -index 944250b..4e9edc4 100644 ---- a/src/include/font.h -+++ b/src/include/font.h -@@ -18,6 +18,12 @@ for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -+#include <string> -+#include <map> -+#include <vector> -+ -+class char_class; -+ - // A function of this type can be registered to define the semantics of - // arbitrary commands in a font DESC file. - typedef void (*FONT_COMMAND_HANDLER)(const char *, // command -@@ -73,6 +79,9 @@ inline int glyph_to_number(glyph *); // Convert the given glyph back to - // a numbered character. - inline int glyph_to_index(glyph *); // Return the unique index that is - // associated with the given glyph. It is >= 0. -+extern int glyph_to_unicode(glyph *); // Convert the given glyph to its -+ // Unicode codepoint. Return -1 if it does not -+ // designate a Unicode character. - - inline int glyph_to_number(glyph *g) - { -@@ -267,6 +276,8 @@ public: - // upper1, ... lowerN, upperN, 0 }. - - private: -+ std::map<std::string, std::vector<char_class *> > class_map; -+ // A map of names to class objects. - unsigned ligatures; // Bit mask of available ligatures. Used by - // has_ligature(). - font_kern_list **kern_hash_table; // Hash table of kerning pairs. -@@ -308,6 +319,11 @@ private: - void extend_ch(); - void compact(); - -+ // These methods add glyphs to character classes. -+ void add_class(const char *, glyph *); -+ void add_class(const char *, glyph *, glyph *); -+ void add_class(const char *, const char *); -+ - void add_kern(glyph *, glyph *, int); // Add to the kerning table a - // kerning amount (arg3) between two given glyphs - // (arg1 and arg2). -diff --git a/src/libs/libgroff/Makefile.sub b/src/libs/libgroff/Makefile.sub -index ac83892..cb8c14e 100644 ---- a/src/libs/libgroff/Makefile.sub -+++ b/src/libs/libgroff/Makefile.sub -@@ -5,6 +5,7 @@ EXTRA_CFLAGS=-D__GETOPT_PREFIX=groff_ \ - OBJS=\ - assert.$(OBJEXT) \ - change_lf.$(OBJEXT) \ -+ classes.$(OBJEXT) \ - cmap.$(OBJEXT) \ - color.$(OBJEXT) \ - cset.$(OBJEXT) \ -@@ -55,6 +56,7 @@ OBJS=\ - CCSRCS=\ - $(srcdir)/assert.cpp \ - $(srcdir)/change_lf.cpp \ -+ $(srcdir)/classes.cpp \ - $(srcdir)/cmap.cpp \ - $(srcdir)/color.cpp \ - $(srcdir)/cset.cpp \ -diff --git a/src/libs/libgroff/classes.cpp b/src/libs/libgroff/classes.cpp -new file mode 100644 -index 0000000..eef1742 ---- /dev/null -+++ b/src/libs/libgroff/classes.cpp -@@ -0,0 +1,48 @@ -+/* This file is in the public domain. */ -+ -+#include "classes.h" -+ -+single_char_class::single_char_class(int c) : -+ ch(c) -+{ -+} -+ -+int single_char_class::lookup_char(int c) -+{ -+ if (c < ch) -+ return -1; -+ else if (c > ch) -+ return 1; -+ else -+ return 0; -+} -+ -+range_char_class::range_char_class(int low, int high) : -+ lo(low), hi(high) -+{ -+} -+ -+int range_char_class::lookup_char(int c) -+{ -+ if (c < lo) -+ return -1; -+ else if (c > hi) -+ return 1; -+ else -+ return 0; -+} -+ -+ref_char_class::ref_char_class(char_class *klass) : -+ ref(klass) -+{ -+} -+ -+int ref_char_class::lookup_char(int c) -+{ -+ return ref->lookup_char(c); -+} -+ -+char_class *ref_char_class::get_class() -+{ -+ return ref; -+} -diff --git a/src/libs/libgroff/font.cpp b/src/libs/libgroff/font.cpp -index d0b4a12..18e0a07 100644 ---- a/src/libs/libgroff/font.cpp -+++ b/src/libs/libgroff/font.cpp -@@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ - #include "font.h" - #include "unicode.h" - #include "paper.h" -+#include "classes.h" - - const char *const WS = " \t\n\r"; - -@@ -148,6 +149,49 @@ void text_file::error(const char *format, - } - - -+int glyph_to_unicode(glyph *g) -+{ -+ const char *nm = glyph_to_name(g); -+ if (nm != NULL) { -+ // ASCII character? -+ if (nm[0] == 'c' && nm[1] == 'h' && nm[2] == 'a' && nm[3] == 'r' -+ && (nm[4] >= '0' && nm[4] <= '9')) { -+ int n = (nm[4] - '0'); -+ if (nm[5] == '\0') -+ return n; -+ if (n > 0 && (nm[5] >= '0' && nm[5] <= '9')) { -+ n = 10*n + (nm[5] - '0'); -+ if (nm[6] == '\0') -+ return n; -+ if (nm[6] >= '0' && nm[6] <= '9') { -+ n = 10*n + (nm[6] - '0'); -+ if (nm[7] == '\0' && n < 128) -+ return n; -+ } -+ } -+ } -+ // Unicode character? -+ if (check_unicode_name(nm)) { -+ char *ignore; -+ return (int)strtol(nm + 1, &ignore, 16); -+ } -+ // If `nm' is a single letter `x', the glyph name is `\x'. -+ char buf[] = { '\\', '\0', '\0' }; -+ if (nm[1] == '\0') { -+ buf[1] = nm[0]; -+ nm = buf; -+ } -+ // groff glyphs that map to Unicode? -+ const char *unicode = glyph_name_to_unicode(nm); -+ if (unicode != NULL && strchr(unicode, '_') == NULL) { -+ char *ignore; -+ return (int)strtol(unicode, &ignore, 16); -+ } -+ } -+ return -1; -+} -+ -+ - /* font functions */ - - font::font(const char *s) -@@ -269,39 +313,10 @@ int font::contains(glyph *g) - return 1; - if (is_unicode) { - // Unicode font -- const char *nm = glyph_to_name(g); -- if (nm != NULL) { -- // ASCII character? -- if (nm[0] == 'c' && nm[1] == 'h' && nm[2] == 'a' && nm[3] == 'r' -- && (nm[4] >= '0' && nm[4] <= '9')) { -- int n = (nm[4] - '0'); -- if (nm[5] == '\0') -- return 1; -- if (n > 0 && (nm[5] >= '0' && nm[5] <= '9')) { -- n = 10*n + (nm[5] - '0'); -- if (nm[6] == '\0') -- return 1; -- if (nm[6] >= '0' && nm[6] <= '9') { -- n = 10*n + (nm[6] - '0'); -- if (nm[7] == '\0' && n < 128) -- return 1; -- } -- } -- } -- // Unicode character? -- if (check_unicode_name(nm)) -- return 1; -- // If `nm' is a single letter `x', the glyph name is `\x'. -- char buf[] = { '\\', '\0', '\0' }; -- if (nm[1] == '\0') { -- buf[1] = nm[0]; -- nm = buf; -- } -- // groff glyph name that maps to Unicode? -- const char *unicode = glyph_name_to_unicode(nm); -- if (unicode != NULL && strchr(unicode, '_') == NULL) -- return 1; -- } -+ // ASCII or Unicode character, or groff glyph name that maps to Unicode? -+ int uni = glyph_to_unicode(g); -+ if (uni >= 0) -+ return 1; - // Numbered character? - int n = glyph_to_number(g); - if (n >= 0) -@@ -554,43 +569,10 @@ int font::get_code(glyph *g) - } - if (is_unicode) { - // Unicode font -- const char *nm = glyph_to_name(g); -- if (nm != NULL) { -- // ASCII character? -- if (nm[0] == 'c' && nm[1] == 'h' && nm[2] == 'a' && nm[3] == 'r' -- && (nm[4] >= '0' && nm[4] <= '9')) { -- int n = (nm[4] - '0'); -- if (nm[5] == '\0') -- return n; -- if (n > 0 && (nm[5] >= '0' && nm[5] <= '9')) { -- n = 10*n + (nm[5] - '0'); -- if (nm[6] == '\0') -- return n; -- if (nm[6] >= '0' && nm[6] <= '9') { -- n = 10*n + (nm[6] - '0'); -- if (nm[7] == '\0' && n < 128) -- return n; -- } -- } -- } -- // Unicode character? -- if (check_unicode_name(nm)) { -- char *ignore; -- return (int)strtol(nm + 1, &ignore, 16); -- } -- // If `nm' is a single letter `x', the glyph name is `\x'. -- char buf[] = { '\\', '\0', '\0' }; -- if (nm[1] == '\0') { -- buf[1] = nm[0]; -- nm = buf; -- } -- // groff glyphs that map to Unicode? -- const char *unicode = glyph_name_to_unicode(nm); -- if (unicode != NULL && strchr(unicode, '_') == NULL) { -- char *ignore; -- return (int)strtol(unicode, &ignore, 16); -- } -- } -+ // ASCII or Unicode character, or groff glyph name that maps to Unicode? -+ int uni = glyph_to_unicode(g); -+ if (uni >= 0) -+ return uni; - // Numbered character? - int n = glyph_to_number(g); - if (n >= 0) -@@ -790,6 +772,38 @@ again: - return 0; - } - -+void font::add_class(const char *name, glyph *g) -+{ -+ int num = glyph_to_number(g); -+ -+ if (num == -1) -+ return; -+ -+ single_char_class *ref = new single_char_class(num); -+ class_map[name].push_back(ref); -+} -+ -+void font::add_class(const char *name, glyph *g1, glyph *g2) -+{ -+ int num1 = glyph_to_number(g1); -+ int num2 = glyph_to_number(g2); -+ -+ if ((num1 == -1) || (num2 == -1)) -+ return; -+ -+ range_char_class *ref = new range_char_class(num1, num2); -+ class_map[name].push_back(ref); -+} -+ -+void font::add_class(const char *name, const char *oname) -+{ -+ std::vector<char_class *> *vec = &class_map[oname]; -+ int nelems = vec->size(); -+ for (int i = 0; i < nelems; i++) { -+ class_map[name].push_back((*vec)[i]); -+ } -+} -+ - // If the font can't be found, then if not_found is non-NULL, it will be set - // to 1 otherwise a message will be printed. - -@@ -1020,6 +1034,55 @@ int font::load(int *not_found, int head_only) - return 0; - } - } -+ else if (strcmp(command, "classes") == 0) { -+ if (head_only) -+ return 1; -+ for (;;) { -+ if (!t.next()) { -+ command = 0; -+ break; -+ } -+ char *cname = strtok(t.buf, WS); -+ if (cname == 0) -+ continue; -+ char *equals = strtok(0, WS); -+ if (equals == 0) { -+ command = cname; -+ break; -+ } -+ p = strtok(0, WS); -+ if (p == 0) { -+ t.error("empty character classes not allowed"); -+ return 0; -+ } -+ glyph *g1 = 0, *g2 = 0; -+ while (p != 0) { -+ if ((g1 != 0) && (p[0] == '-')) { -+ p = strtok(0, WS); -+ if (p == 0) { -+ t.error("incomplete range in class definition"); -+ return 0; -+ } -+ g2 = name_to_glyph(p); -+ add_class(cname, g1, g2); -+ g1 = g2 = 0; -+ } -+ else if (g1 != 0) { -+ add_class(cname, g1); -+ g1 = 0; -+ } -+ if ((p[0] == '<') && (p[strlen(p)-1] == '>')) { -+ add_class(cname, p); -+ } -+ else if (p[0] != '-') { -+ g1 = name_to_glyph(p); -+ } -+ p = strtok(0, WS); -+ } -+ if (g1 != 0) -+ add_class(cname, g1); -+ } -+ } - else { - t.error("unrecognised command `%1' " - "after `kernpairs' or `charset' command", -diff --git a/src/roff/nroff/nroff.sh b/src/roff/nroff/nroff.sh -index d4bd8a0..22529f8 100644 ---- a/src/roff/nroff/nroff.sh -+++ b/src/roff/nroff/nroff.sh -@@ -125,6 +125,12 @@ case $T in - T=-T$Tloc ;; - esac - -+case "${LC_ALL-${LC_CTYPE-${LANG}}}" in -+ ja*) -+ opts="$opts -mja" -+ ;; -+esac -+ - # Set up the `GROFF_BIN_PATH' variable - # to be exported in the current `GROFF_RUNTIME' environment. - -diff --git a/src/roff/troff/charinfo.h b/src/roff/troff/charinfo.h -index 2c2c268..71cd84d 100644 ---- a/src/roff/troff/charinfo.h -+++ b/src/roff/troff/charinfo.h -@@ -18,6 +18,9 @@ for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -+#include <vector> -+#include <utility> -+ - class macro; - - class charinfo : glyph { -@@ -35,6 +38,9 @@ class charinfo : glyph { - char translate_input; // non-zero means that asciify_code is - // active for .asciify (set by .trin) - char_mode mode; -+ // Unicode character classes -+ std::vector<std::pair<int, int> > ranges; -+ std::vector<charinfo *> nested_classes; - public: - enum { // Values for the flags bitmask. See groff - // manual, description of the `.cflags' request. -@@ -66,6 +72,7 @@ public: - unsigned char get_hyphenation_code(); - unsigned char get_ascii_code(); - unsigned char get_asciify_code(); -+ int get_unicode_code(); - void set_hyphenation_code(unsigned char); - void set_ascii_code(unsigned char); - void set_asciify_code(unsigned char); -@@ -73,6 +80,7 @@ public: - int get_translation_input(); - charinfo *get_translation(int = 0); - void set_translation(charinfo *, int, int); -+ unsigned char get_flags(); - void set_flags(unsigned char); - void set_special_translation(int, int); - int get_special_translation(int = 0); -@@ -87,6 +95,13 @@ public: - int is_fallback(); - int is_special(); - symbol *get_symbol(); -+ void add_to_class(int); -+ void add_to_class(int, int); -+ void add_to_class(charinfo *); -+ bool is_class(); -+ bool contains(int); -+ bool contains(symbol); -+ bool contains(charinfo *); - }; - - charinfo *get_charinfo(symbol); -@@ -95,37 +110,37 @@ charinfo *get_charinfo_by_number(int); - - inline int charinfo::overlaps_horizontally() - { -- return flags & OVERLAPS_HORIZONTALLY; -+ return get_flags() & OVERLAPS_HORIZONTALLY; - } - - inline int charinfo::overlaps_vertically() - { -- return flags & OVERLAPS_VERTICALLY; -+ return get_flags() & OVERLAPS_VERTICALLY; - } - - inline int charinfo::can_break_before() - { -- return flags & BREAK_BEFORE; -+ return get_flags() & BREAK_BEFORE; - } - - inline int charinfo::can_break_after() - { -- return flags & BREAK_AFTER; -+ return get_flags() & BREAK_AFTER; - } - - inline int charinfo::ends_sentence() - { -- return flags & ENDS_SENTENCE; -+ return get_flags() & ENDS_SENTENCE; - } - - inline int charinfo::transparent() - { -- return flags & TRANSPARENT; -+ return get_flags() & TRANSPARENT; - } - - inline int charinfo::ignore_hcodes() - { -- return flags & IGNORE_HCODES; -+ return get_flags() & IGNORE_HCODES; - } - - inline int charinfo::numbered() -@@ -216,3 +231,24 @@ inline symbol *charinfo::get_symbol() - { - return( &nm ); - } -+ -+inline void charinfo::add_to_class(int c) -+{ -+ // TODO ranges cumbersome for single characters? -+ ranges.push_back(std::pair<int, int>(c, c)); -+} -+ -+inline void charinfo::add_to_class(int lo, int hi) -+{ -+ ranges.push_back(std::pair<int, int>(lo, hi)); -+} -+ -+inline void charinfo::add_to_class(charinfo *ci) -+{ -+ nested_classes.push_back(ci); -+} -+ -+inline bool charinfo::is_class() -+{ -+ return (!ranges.empty() || !nested_classes.empty()); -+} -diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp -index 5335c1c..88782b1 100644 ---- a/src/roff/troff/input.cpp -+++ b/src/roff/troff/input.cpp -@@ -6740,6 +6740,74 @@ void hyphenation_patterns_file_code() - skip_line(); - } - -+dictionary char_class_dictionary(501); -+ -+void define_class() -+{ -+ tok.skip(); -+ symbol nm = get_name(1); -+ if (nm.is_null()) { -+ skip_line(); -+ return; -+ } -+ charinfo *ci = get_charinfo(nm); -+ charinfo *child1 = 0, *child2 = 0; -+ while (!tok.newline() && !tok.eof()) { -+ tok.skip(); -+ if (child1 != 0 && tok.ch() == '-') { -+ tok.next(); -+ child2 = tok.get_char(1); -+ if (!child2) { -+ warning(WARN_MISSING, -+ "missing the end of character range in class `%1'", -+ nm.contents()); -+ skip_line(); -+ return; -+ } -+ if (child1->is_class() || child2->is_class()) { -+ warning(WARN_SYNTAX, -+ "nested character class is not allowed in range definition"); -+ skip_line(); -+ return; -+ } -+ ci->add_to_class(child1->get_unicode_code(), child2->get_unicode_code()); -+ child1 = child2 = 0; -+ } -+ else if (child1 != 0) { -+ if (child1->is_class()) { -+ ci->add_to_class(child1); -+ } -+ else { -+ ci->add_to_class(child1->get_unicode_code()); -+ } -+ child1 = 0; -+ } -+ child1 = tok.get_char(1); -+ tok.next(); -+ if (!child1) { -+ if (!tok.newline()) -+ skip_line(); -+ break; -+ } -+ } -+ if (child1 != 0) { -+ if (child1->is_class()) { -+ ci->add_to_class(child1); -+ } -+ else { -+ ci->add_to_class(child1->get_unicode_code()); -+ } -+ child1 = 0; -+ } -+ if (!ci->is_class()) { -+ warning(WARN_SYNTAX, -+ "empty class definition for `%1'", -+ nm.contents()); -+ return; -+ } -+ (void)char_class_dictionary.lookup(nm, ci); -+} -+ - charinfo *token::get_char(int required) - { - if (type == TOKEN_CHAR) -@@ -7817,6 +7885,7 @@ void init_input_requests() - init_request("cflags", char_flags); - init_request("char", define_character); - init_request("chop", chop_macro); -+ init_request("class", define_class); - init_request("close", close_request); - init_request("color", activate_color); - init_request("composite", composite_request); -@@ -8367,6 +8436,13 @@ charinfo::charinfo(symbol s) - number = -1; - } - -+int charinfo::get_unicode_code() -+{ -+ if (ascii_code != '\0') -+ return ascii_code; -+ return glyph_to_unicode(this); -+} -+ - void charinfo::set_hyphenation_code(unsigned char c) - { - hyphenation_code = c; -@@ -8388,6 +8464,25 @@ void charinfo::set_translation(charinfo *ci, int tt, int ti) - transparent_translate = tt; - } - -+// Get the union of all flags affecting this charinfo. -+unsigned char charinfo::get_flags() -+{ -+ unsigned char all_flags = flags; -+ dictionary_iterator iter(char_class_dictionary); -+ charinfo *cp; -+ symbol s; -+ while (iter.get(&s, (void **)&cp)) { -+ assert(!s.is_null()); -+ if (cp->contains(get_unicode_code())) { -+#if defined(DEBUGGING) -+ fprintf(stderr, "charinfo::get_flags %p %s %d\n", cp, cp->nm.contents(), cp->flags); -+#endif -+ all_flags |= cp->flags; -+ } -+ } -+ return all_flags; -+} -+ - void charinfo::set_special_translation(int c, int tt) - { - special_translation = c; -@@ -8432,6 +8527,49 @@ int charinfo::get_number() - return number; - } - -+bool charinfo::contains(int c) -+{ -+ std::vector<std::pair<int, int> >::const_iterator ranges_iter; -+ ranges_iter = ranges.begin(); -+ while (ranges_iter != ranges.end()) { -+ if (c >= ranges_iter->first && c <= ranges_iter->second) { -+#if defined(DEBUGGING) -+ fprintf(stderr, "charinfo::contains(%d)\n", c); -+#endif -+ return true; -+ } -+ ++ranges_iter; -+ } -+ -+ std::vector<charinfo *>::const_iterator nested_iter; -+ nested_iter = nested_classes.begin(); -+ while (nested_iter != nested_classes.end()) { -+ if ((*nested_iter)->contains(c)) -+ return true; -+ ++nested_iter; -+ } -+ -+ return false; -+} -+ -+bool charinfo::contains(symbol nm) -+{ -+ const char *unicode = glyph_name_to_unicode(nm.contents()); -+ if (unicode != NULL && strchr(unicode, '_') == NULL) { -+ char *ignore; -+ int c = (int)strtol(unicode, &ignore, 16); -+ return contains(c); -+ } -+ else -+ return false; -+} -+ -+bool charinfo::contains(charinfo *) -+{ -+ // TODO -+ return false; -+} -+ - symbol UNNAMED_SYMBOL("---"); - - // For numbered characters not between 0 and 255, we make a symbol out -diff --git a/tmac/Makefile.sub b/tmac/Makefile.sub -index ef4b577..5900010 100644 ---- a/tmac/Makefile.sub -+++ b/tmac/Makefile.sub -@@ -55,7 +55,8 @@ NORMALFILES=\ - fr.tmac hyphen.fr \ - sv.tmac hyphen.sv \ - de.tmac den.tmac hyphen.det hyphen.den hyphenex.det \ -- cs.tmac hyphen.cs hyphenex.cs -+ cs.tmac hyphen.cs hyphenex.cs \ -+ ja.tmac - - # These files are handled specially during installation and deinstallation. - SPECIALFILES=an.tmac s.tmac www.tmac -diff --git a/tmac/ja.tmac b/tmac/ja.tmac -new file mode 100644 -index 0000000..eed664b ---- /dev/null -+++ b/tmac/ja.tmac -@@ -0,0 +1,49 @@ -+.\" -*- mode: nroff; coding: utf-8; -*- -+.\" -+.\" Japanese localization for groff -+.\" -+.\" Copyright (C) 2009 Free Software Foundation, Inc. -+.\" Written by Fumitoshi UKAI <ukai@debian.or.jp> and -+.\" Colin Watson <cjwatson@debian.org> -+.\" -+.\" This file is part of groff. -+.\" -+.\" groff is free software; you can redistribute it and/or modify it under -+.\" the terms of the GNU General Public License as published by the Free -+.\" Software Foundation, either version 3 of the License, or -+.\" (at your option) any later version. -+.\" -+.\" groff 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 General Public License -+.\" for more details. -+.\" -+.\" You should have received a copy of the GNU General Public License -+.\" along with this program. If not, see <http://www.gnu.org/licenses/>. -+.\" -+.\" Please send comments to groff@gnu.org. -+. -+. -+.\" Locale string -+. -+.ds locale japanese\" -+. -+. -+.class [CJKprepunct] \ -+ , : ; > } \ -+ \[u3001] \[u3002] \[uFF0C] \[uFF0E] \[u30FB] \[uFF1A] \[uFF1B] \[uFF1F] \ -+ \[uFF01] \[uFF09] \[u3015] \[uFF3D] \[uFF5D] \[u300D] \[u300F] \[u3011] \ -+ \[u3041] \[u3043] \[u3045] \[u3047] \[u3049] \[u3063] \[u3083] \[u3085] \ -+ \[u3087] \[u30FC] \ -+ \[u30A1] \[u30A3] \[u30A5] \[u30A7] \[u30A9] \[u30C3] \[u30E3] \[u30E5] \ -+ \[u30E7] -+.class [CJKpostpunct] \ -+ \[uFF08] \[u3014] \[uFF3B] \[uFF5B] \[u300C] \[u300E] \[u3010] -+. -+.\" Hiragana, Katakana, and Kanji glyphs. -+.class [CJKnormal] \ -+ \[u3041]-\[u3096] \[u30A0]-\[u30FF] \[u4E00]-\[u9FFF] -+. -+.cflags 2 \C'[CJKprepunct]' -+.cflags 4 \C'[CJKpostpunct]' -+.cflags 66 \C'[CJKnormal]' --- -1.7.3.2 - |