groff
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Groff] unicode support, part 14: unicode fonts


From: Bruno Haible
Subject: [Groff] unicode support, part 14: unicode fonts
Date: Tue, 21 Feb 2006 18:55:04 +0100
User-agent: KMail/1.5

Here comes the patch that makes it possible to process manual pages with
Unicode characters without declaring them first in advance. With this
patch, an average Japanese manual page can be processed, but shows the
following problems:
  1) Although the man page starts with

'\" t -*- coding: utf-8 -*-

     the groff driver is not intelligent enough to run preconv. I have to
     activate the -k option explicitly.
  2) A few "cannot adjust line" and "can't break line"  warnings.
  3) The output lines on devutf8 device are still too long, because groff
     doesn't know about the distinction between normal-width and double-width
     characters.
  4) When outputting to the devhtml device, some warnings appear:
       warning: can't find special character `u6D41'
     They appear to come from the first japanese character of each consecutive
     run of consecutive characters. They are harmless; the HTML output is fine.
I can work on 2) to 4) in future patches.


2006-02-20  Bruno Haible  <address@hidden>

        Introduce Unicode fonts.
        * font/devhtml/DESC.proto: Mark as unicode.
        * font/devhtml/R.proto: Remove all charset entries that are already
        in glyphuni.cpp.
        * font/devutf8/DESC.proto: Mark as unicode.
        * font/devutf8/R.proto: Remove all charset entries.
        * src/include/font.h (class font): New static field 'is_unicode'.
        Change order of fields.
        * src/libs/libgroff/font.cpp: Include unicode.h.
        (font::font): Update for changed order of fields.
        (font::contains, font::get_width, font::get_height, font::get_depth,
        font::get_italic_correction, font::get_left_italic_correction,
        font::get_subscript_correction, font::get_character_type,
        font::get_code, font::get_special_device_encoding): Handle both the
        explicitly enumerated glyphs and use general code for Unicode fonts.
        (font::load): Make the charset section optional when the font is
        declared unicode.
        (font::load_desc): Recognize the "unicode" attribute.
        * src/libs/libgroff/fontfile.cpp (font::is_unicode): New variable.
        

diff -r -c3 groff-20060217.orig/font/devhtml/DESC.proto 
groff-20060217/font/devhtml/DESC.proto
--- groff-20060217.orig/font/devhtml/DESC.proto 2004-10-08 09:08:08.000000000 
+0200
+++ groff-20060217/font/devhtml/DESC.proto      2006-02-20 01:23:30.000000000 
+0100
@@ -10,3 +10,4 @@
 prepro  pre-grohtml
 use_charnames_in_special
 pass_filenames
+unicode
diff -r -c3 groff-20060217.orig/font/devhtml/R.proto 
groff-20060217/font/devhtml/R.proto
--- groff-20060217.orig/font/devhtml/R.proto    2006-02-04 19:51:39.000000000 
+0100
+++ groff-20060217/font/devhtml/R.proto 2006-02-20 01:27:03.000000000 +0100
@@ -2,745 +2,7 @@
 internalname 0
 spacewidth 24
 charset
-!      24      0       0x0021
-"      24      0       0x0022
-dq     "
-#      24      0       0x0023
-sh     "
-$      24      0       0x0024
-Do     "
-%      24      0       0x0025
-&      24      0       0x0026
-aq     24      0       0x0027
-(      24      0       0x0028
-)      24      0       0x0029
-*      24      0       0x002A
-+      24      0       0x002B
-pl     "
-,      24      0       0x002C
 hy     24      0       0x002D
 -      "
-.      24      0       0x002E
-/      24      0       0x002F
-sl     "
-0      24      0       0x0030
-1      24      0       0x0031
-2      24      0       0x0032
-3      24      0       0x0033
-4      24      0       0x0034
-5      24      0       0x0035
-6      24      0       0x0036
-7      24      0       0x0037
-8      24      0       0x0038
-9      24      0       0x0039
-:      24      0       0x003A
-;      24      0       0x003B
-<      24      0       0x003C
-=      24      0       0x003D
-eq     "
->      24      0       0x003E
-?      24      0       0x003F
-@      24      0       0x0040
-at     "
-A      24      0       0x0041
-B      24      0       0x0042
-C      24      0       0x0043
-D      24      0       0x0044
-E      24      0       0x0045
-F      24      0       0x0046
-G      24      0       0x0047
-H      24      0       0x0048
-I      24      0       0x0049
-J      24      0       0x004A
-K      24      0       0x004B
-L      24      0       0x004C
-M      24      0       0x004D
-N      24      0       0x004E
-O      24      0       0x004F
-P      24      0       0x0050
-Q      24      0       0x0051
-R      24      0       0x0052
-S      24      0       0x0053
-T      24      0       0x0054
-U      24      0       0x0055
-V      24      0       0x0056
-W      24      0       0x0057
-X      24      0       0x0058
-Y      24      0       0x0059
-Z      24      0       0x005A
-[      24      0       0x005B
-lB     "
-\      24      0       0x005C
-rs     "
-]      24      0       0x005D
-rB     "
-^      24      0       0x005E
-a^     "
-ha     "
-_      24      0       0x005F
-ru     "
-ul     "
-\`     24      0       0x0060
-ga     "
-a      24      0       0x0061
-b      24      0       0x0062
-c      24      0       0x0063
-d      24      0       0x0064
-e      24      0       0x0065
-f      24      0       0x0066
-g      24      0       0x0067
-h      24      0       0x0068
-i      24      0       0x0069
-j      24      0       0x006A
-k      24      0       0x006B
-l      24      0       0x006C
-m      24      0       0x006D
-n      24      0       0x006E
-o      24      0       0x006F
-p      24      0       0x0070
-q      24      0       0x0071
-r      24      0       0x0072
-s      24      0       0x0073
-t      24      0       0x0074
-u      24      0       0x0075
-v      24      0       0x0076
-w      24      0       0x0077
-x      24      0       0x0078
-y      24      0       0x0079
-z      24      0       0x007A
-lC     24      0       0x007B
-{      "
-ba     24      0       0x007C
-or     "
-|      "
-rC     24      0       0x007D
-}      "
-a~     24      0       0x007E
-~      "
-ti     "
----    24      0       0x00A0
-r!     24      0       0x00A1
-ct     24      0       0x00A2
-Po     24      0       0x00A3
-Cs     24      0       0x00A4
-Ye     24      0       0x00A5
-bb     24      0       0x00A6
-sc     24      0       0x00A7
-ad     24      0       0x00A8
-co     24      0       0x00A9
-Of     24      0       0x00AA
-Fo     24      0       0x00AB
-no     24      0       0x00AC
-tno    "
-rg     24      0       0x00AE
-a-     24      0       0x00AF
-de     24      0       0x00B0
-+-     24      0       0x00B1
-t+-    "
-S2     24      0       0x00B2
-S3     24      0       0x00B3
-aa     24      0       0x00B4
-\'     "
-mc     24      0       0x00B5
-ps     24      0       0x00B6
-pc     24      0       0x00B7
-ac     24      0       0x00B8
-S1     24      0       0x00B9
-Om     24      0       0x00BA
-Fc     24      0       0x00BB
-14     24      0       0x00BC
-12     24      0       0x00BD
-34     24      0       0x00BE
-r?     24      0       0x00BF
-`A     24      0       0x00C0
-'A     24      0       0x00C1
-^A     24      0       0x00C2
-~A     24      0       0x00C3
-:A     24      0       0x00C4
-oA     24      0       0x00C5
-AE     24      0       0x00C6
-,C     24      0       0x00C7
-`E     24      0       0x00C8
-'E     24      0       0x00C9
-^E     24      0       0x00CA
-:E     24      0       0x00CB
-`I     24      0       0x00CC
-'I     24      0       0x00CD
-^I     24      0       0x00CE
-:I     24      0       0x00CF
--D     24      0       0x00D0
-~N     24      0       0x00D1
-`O     24      0       0x00D2
-'O     24      0       0x00D3
-^O     24      0       0x00D4
-~O     24      0       0x00D5
-:O     24      0       0x00D6
-mu     24      0       0x00D7
-tmu    "
-/O     24      0       0x00D8
-`U     24      0       0x00D9
-'U     24      0       0x00DA
-^U     24      0       0x00DB
-:U     24      0       0x00DC
-'Y     24      0       0x00DD
-TP     24      0       0x00DE
-ss     24      0       0x00DF
-`a     24      0       0x00E0
-'a     24      0       0x00E1
-^a     24      0       0x00E2
-~a     24      0       0x00E3
-:a     24      0       0x00E4
-oa     24      0       0x00E5
-ae     24      0       0x00E6
-,c     24      0       0x00E7
-`e     24      0       0x00E8
-'e     24      0       0x00E9
-^e     24      0       0x00EA
-:e     24      0       0x00EB
-`i     24      0       0x00EC
-'i     24      0       0x00ED
-^i     24      0       0x00EE
-:i     24      0       0x00EF
-Sd     24      0       0x00F0
-~n     24      0       0x00F1
-`o     24      0       0x00F2
-'o     24      0       0x00F3
-^o     24      0       0x00F4
-~o     24      0       0x00F5
-:o     24      0       0x00F6
-di     24      0       0x00F7
-tdi    "
-/o     24      0       0x00F8
-`u     24      0       0x00F9
-'u     24      0       0x00FA
-^u     24      0       0x00FB
-:u     24      0       0x00FC
-'y     24      0       0x00FD
-Tp     24      0       0x00FE
-:y     24      0       0x00FF
-u0041_0306     24      0       0x0102
-u0061_0306     24      0       0x0103
-u0041_0328     24      0       0x0104
-u0061_0328     24      0       0x0105
-'C     24      0       0x0106
-'c     24      0       0x0107
-u0043_030C     24      0       0x010C
-u0063_030C     24      0       0x010D
-u0044_030C     24      0       0x010E
-u0064_030C     24      0       0x010F
-u0110  24      0       0x0110
-u0111  24      0       0x0111
-u0045_0328     24      0       0x0118
-u0065_0328     24      0       0x0119
-u0045_030C     24      0       0x011A
-u0065_030C     24      0       0x011B
-u0047_0306     24      0       0x011E
-u0067_0306     24      0       0x011F
-u0049_0307     24      0       0x0130
-.i     24      0       0x0131
-IJ     24      0       0x0132
-ij     24      0       0x0133
-u004C_0301     24      0       0x0139
-u006C_0301     24      0       0x013A
-u004C_030C     24      0       0x013D
-u006C_030C     24      0       0x013E
-/L     24      0       0x0141
-/l     24      0       0x0142
-u004E_0301     24      0       0x0143
-u006E_0301     24      0       0x0144
-u004E_030C     24      0       0x0147
-u006E_030C     24      0       0x0148
-u004F_030B     24      0       0x0150
-u006F_030B     24      0       0x0151
-OE     24      0       0x0152
-oe     24      0       0x0153
-u0052_0301     24      0       0x0154
-u0072_0301     24      0       0x0155
-u0052_030C     24      0       0x0158
-u0072_030C     24      0       0x0159
-u0053_0301     24      0       0x015A
-u0073_0301     24      0       0x015B
-u0053_0327     24      0       0x015E
-u0073_0327     24      0       0x015F
-vS     24      0       0x0160
-vs     24      0       0x0161
-u0054_0327     24      0       0x0162
-u0074_0327     24      0       0x0163
-u0054_030C     24      0       0x0164
-u0074_030C     24      0       0x0165
-u0055_030A     24      0       0x016E
-u0075_030A     24      0       0x016F
-u0055_030B     24      0       0x0170
-u0075_030B     24      0       0x0171
-:Y     24      0       0x0178
-u005A_0301     24      0       0x0179
-u007A_0301     24      0       0x017A
-u005A_0307     24      0       0x017B
-u007A_0307     24      0       0x017C
-vZ     24      0       0x017D
-vz     24      0       0x017E
-Fn     24      0       0x0192
-ah     24      0       0x02C7
-ab     24      0       0x02D8
-a.     24      0       0x02D9
-ao     24      0       0x02DA
-ho     24      0       0x02DB
-a"     24      0       0x02DD
-*A     24      0       0x0391
-*B     24      0       0x0392
-*G     24      0       0x0393
-*D     24      0       0x0394
-*E     24      0       0x0395
-*Z     24      0       0x0396
-*Y     24      0       0x0397
-*H     24      0       0x0398
-*I     24      0       0x0399
-*K     24      0       0x039A
-*L     24      0       0x039B
-*M     24      0       0x039C
-*N     24      0       0x039D
-*C     24      0       0x039E
-*O     24      0       0x039F
-*P     24      0       0x03A0
-*R     24      0       0x03A1
-*S     24      0       0x03A3
-*T     24      0       0x03A4
-*U     24      0       0x03A5
-*F     24      0       0x03A6
-*X     24      0       0x03A7
-*Q     24      0       0x03A8
-*W     24      0       0x03A9
-*a     24      0       0x03B1
-*b     24      0       0x03B2
-*g     24      0       0x03B3
-*d     24      0       0x03B4
-*e     24      0       0x03B5
-*z     24      0       0x03B6
-*y     24      0       0x03B7
-*h     24      0       0x03B8
-*i     24      0       0x03B9
-*k     24      0       0x03BA
-*l     24      0       0x03BB
-*m     24      0       0x03BC
-*n     24      0       0x03BD
-*c     24      0       0x03BE
-*o     24      0       0x03BF
-*p     24      0       0x03C0
-*r     24      0       0x03C1
-ts     24      0       0x03C2
-*s     24      0       0x03C3
-*t     24      0       0x03C4
-*u     24      0       0x03C5
-+f     24      0       0x03C6
-*x     24      0       0x03C7
-*q     24      0       0x03C8
-*w     24      0       0x03C9
-+h     24      0       0x03D1
-*f     24      0       0x03D5
-+p     24      0       0x03D6
-+e     24      0       0x03F5
-u0415_0300     24      0       0x0400
-u0415_0308     24      0       0x0401
-u0402  24      0       0x0402
-u0413_0301     24      0       0x0403
-u0404  24      0       0x0404
-u0405  24      0       0x0405
-u0406  24      0       0x0406
-u0406_0308     24      0       0x0407
-u0408  24      0       0x0408
-u0409  24      0       0x0409
-u040A  24      0       0x040A
-u040B  24      0       0x040B
-u041A_0301     24      0       0x040C
-u0418_0300     24      0       0x040D
-u0423_0306     24      0       0x040E
-u040F  24      0       0x040F
-u0410  24      0       0x0410
-u0411  24      0       0x0411
-u0412  24      0       0x0412
-u0413  24      0       0x0413
-u0414  24      0       0x0414
-u0415  24      0       0x0415
-u0416  24      0       0x0416
-u0417  24      0       0x0417
-u0418  24      0       0x0418
-u0418_0306     24      0       0x0419
-u041A  24      0       0x041A
-u041B  24      0       0x041B
-u041C  24      0       0x041C
-u041D  24      0       0x041D
-u041E  24      0       0x041E
-u041F  24      0       0x041F
-u0420  24      0       0x0420
-u0421  24      0       0x0421
-u0422  24      0       0x0422
-u0423  24      0       0x0423
-u0424  24      0       0x0424
-u0425  24      0       0x0425
-u0426  24      0       0x0426
-u0427  24      0       0x0427
-u0428  24      0       0x0428
-u0429  24      0       0x0429
-u042A  24      0       0x042A
-u042B  24      0       0x042B
-u042C  24      0       0x042C
-u042D  24      0       0x042D
-u042E  24      0       0x042E
-u042F  24      0       0x042F
-u0430  24      0       0x0430
-u0431  24      0       0x0431
-u0432  24      0       0x0432
-u0433  24      0       0x0433
-u0434  24      0       0x0434
-u0435  24      0       0x0435
-u0436  24      0       0x0436
-u0437  24      0       0x0437
-u0438  24      0       0x0438
-u0438_0306     24      0       0x0439
-u043A  24      0       0x043A
-u043B  24      0       0x043B
-u043C  24      0       0x043C
-u043D  24      0       0x043D
-u043E  24      0       0x043E
-u043F  24      0       0x043F
-u0440  24      0       0x0440
-u0441  24      0       0x0441
-u0442  24      0       0x0442
-u0443  24      0       0x0443
-u0444  24      0       0x0444
-u0445  24      0       0x0445
-u0446  24      0       0x0446
-u0447  24      0       0x0447
-u0448  24      0       0x0448
-u0449  24      0       0x0449
-u044A  24      0       0x044A
-u044B  24      0       0x044B
-u044C  24      0       0x044C
-u044D  24      0       0x044D
-u044E  24      0       0x044E
-u044F  24      0       0x044F
-u0435_0300     24      0       0x0450
-u0435_0308     24      0       0x0451
-u0452  24      0       0x0452
-u0433_0301     24      0       0x0453
-u0454  24      0       0x0454
-u0455  24      0       0x0455
-u0456  24      0       0x0456
-u0456_0308     24      0       0x0457
-u0458  24      0       0x0458
-u0459  24      0       0x0459
-u045A  24      0       0x045A
-u045B  24      0       0x045B
-u043A_0301     24      0       0x045C
-u0438_0300     24      0       0x045D
-u0443_0306     24      0       0x045E
-u045F  24      0       0x045F
-u0460  24      0       0x0460
-u0461  24      0       0x0461
-u0462  24      0       0x0462
-u0463  24      0       0x0463
-u0464  24      0       0x0464
-u0465  24      0       0x0465
-u0466  24      0       0x0466
-u0467  24      0       0x0467
-u0468  24      0       0x0468
-u0469  24      0       0x0469
-u046A  24      0       0x046A
-u046B  24      0       0x046B
-u046C  24      0       0x046C
-u046D  24      0       0x046D
-u046E  24      0       0x046E
-u046F  24      0       0x046F
-u0470  24      0       0x0470
-u0471  24      0       0x0471
-u0472  24      0       0x0472
-u0473  24      0       0x0473
-u0474  24      0       0x0474
-u0475  24      0       0x0475
-u0474_030F     24      0       0x0476
-u0475_030F     24      0       0x0477
-u0478  24      0       0x0478
-u0479  24      0       0x0479
-u047A  24      0       0x047A
-u047B  24      0       0x047B
-u047C  24      0       0x047C
-u047D  24      0       0x047D
-u047E  24      0       0x047E
-u047F  24      0       0x047F
-u0480  24      0       0x0480
-u0481  24      0       0x0481
-u0482  24      0       0x0482
-u0483  0       0       0x0483
-u0484  0       0       0x0484
-u0485  0       0       0x0485
-u0486  0       0       0x0486
-u0488  0       0       0x0488
-u0489  0       0       0x0489
-u048A  24      0       0x048A
-u048B  24      0       0x048B
-u048C  24      0       0x048C
-u048D  24      0       0x048D
-u048E  24      0       0x048E
-u048F  24      0       0x048F
-u0490  24      0       0x0490
-u0491  24      0       0x0491
-u0492  24      0       0x0492
-u0493  24      0       0x0493
-u0494  24      0       0x0494
-u0495  24      0       0x0495
-u0496  24      0       0x0496
-u0497  24      0       0x0497
-u0498  24      0       0x0498
-u0499  24      0       0x0499
-u049A  24      0       0x049A
-u049B  24      0       0x049B
-u049C  24      0       0x049C
-u049D  24      0       0x049D
-u049E  24      0       0x049E
-u049F  24      0       0x049F
-u04A0  24      0       0x04A0
-u04A1  24      0       0x04A1
-u04A2  24      0       0x04A2
-u04A3  24      0       0x04A3
-u04A4  24      0       0x04A4
-u04A5  24      0       0x04A5
-u04A6  24      0       0x04A6
-u04A7  24      0       0x04A7
-u04A8  24      0       0x04A8
-u04A9  24      0       0x04A9
-u04AA  24      0       0x04AA
-u04AB  24      0       0x04AB
-u04AC  24      0       0x04AC
-u04AD  24      0       0x04AD
-u04AE  24      0       0x04AE
-u04AF  24      0       0x04AF
-u04B0  24      0       0x04B0
-u04B1  24      0       0x04B1
-u04B2  24      0       0x04B2
-u04B3  24      0       0x04B3
-u04B4  24      0       0x04B4
-u04B5  24      0       0x04B5
-u04B6  24      0       0x04B6
-u04B7  24      0       0x04B7
-u04B8  24      0       0x04B8
-u04B9  24      0       0x04B9
-u04BA  24      0       0x04BA
-u04BB  24      0       0x04BB
-u04BC  24      0       0x04BC
-u04BD  24      0       0x04BD
-u04BE  24      0       0x04BE
-u04BF  24      0       0x04BF
-u04C0  24      0       0x04C0
-u0416_0306     24      0       0x04C1
-u0436_0306     24      0       0x04C2
-u04C3  24      0       0x04C3
-u04C4  24      0       0x04C4
-u04C5  24      0       0x04C5
-u04C6  24      0       0x04C6
-u04C7  24      0       0x04C7
-u04C8  24      0       0x04C8
-u04C9  24      0       0x04C9
-u04CA  24      0       0x04CA
-u04CB  24      0       0x04CB
-u04CC  24      0       0x04CC
-u04CD  24      0       0x04CD
-u04CE  24      0       0x04CE
-u0410_0306     24      0       0x04D0
-u0430_0306     24      0       0x04D1
-u0410_0308     24      0       0x04D2
-u0430_0308     24      0       0x04D3
-u04D4  24      0       0x04D4
-u04D5  24      0       0x04D5
-u0415_0306     24      0       0x04D6
-u0435_0306     24      0       0x04D7
-u04D8  24      0       0x04D8
-u04D9  24      0       0x04D9
-u04D8_0308     24      0       0x04DA
-u04D9_0308     24      0       0x04DB
-u0416_0308     24      0       0x04DC
-u0436_0308     24      0       0x04DD
-u0417_0308     24      0       0x04DE
-u0437_0308     24      0       0x04DF
-u04E0  24      0       0x04E0
-u04E1  24      0       0x04E1
-u0418_0304     24      0       0x04E2
-u0438_0304     24      0       0x04E3
-u0418_0308     24      0       0x04E4
-u0438_0308     24      0       0x04E5
-u041E_0308     24      0       0x04E6
-u043E_0308     24      0       0x04E7
-u04E8  24      0       0x04E8
-u04E9  24      0       0x04E9
-u04E8_0308     24      0       0x04EA
-u04E9_0308     24      0       0x04EB
-u042D_0308     24      0       0x04EC
-u044D_0308     24      0       0x04ED
-u0423_0304     24      0       0x04EE
-u0443_0304     24      0       0x04EF
-u0423_0308     24      0       0x04F0
-u0443_0308     24      0       0x04F1
-u0423_030B     24      0       0x04F2
-u0443_030B     24      0       0x04F3
-u0427_0308     24      0       0x04F4
-u0447_0308     24      0       0x04F5
-u042B_0308     24      0       0x04F8
-u044B_0308     24      0       0x04F9
-u0500  24      0       0x0500
-u0501  24      0       0x0501
-u0502  24      0       0x0502
-u0503  24      0       0x0503
-u0504  24      0       0x0504
-u0505  24      0       0x0505
-u0506  24      0       0x0506
-u0507  24      0       0x0507
-u0508  24      0       0x0508
-u0509  24      0       0x0509
-u050A  24      0       0x050A
-u050B  24      0       0x050B
-u050C  24      0       0x050C
-u050D  24      0       0x050D
-u050E  24      0       0x050E
-u050F  24      0       0x050F
-en     24      0       0x2013
-em     24      0       0x2014
-`      24      0       0x2018
-oq     "
-'      24      0       0x2019
-cq     "
-bq     24      0       0x201A
-lq     24      0       0x201C
-rq     24      0       0x201D
-Bq     24      0       0x201E
-dg     24      0       0x2020
-dd     24      0       0x2021
-bu     24      0       0x2022
-%0     24      0       0x2030
-fm     24      0       0x2032
-sd     24      0       0x2033
-fo     24      0       0x2039
-fc     24      0       0x203A
-rn     24      0       0x203E
-f/     24      0       0x2044
-Eu     24      0       0x20AC
-eu     "
--h     24      0       0x210F
-hbar   "
-Im     24      0       0x2111
-wp     24      0       0x2118
-Re     24      0       0x211C
-tm     24      0       0x2122
-Ah     24      0       0x2135
-18     24      0       0x215B
-38     24      0       0x215C
-58     24      0       0x215D
-78     24      0       0x215E
-<-     24      0       0x2190
-ua     24      0       0x2191
-->     24      0       0x2192
-da     24      0       0x2193
-<>     24      0       0x2194
-va     24      0       0x2195
-CR     24      0       0x21B5
-lA     24      0       0x21D0
-uA     24      0       0x21D1
-rA     24      0       0x21D2
-dA     24      0       0x21D3
-hA     24      0       0x21D4
-vA     24      0       0x21D5
-fa     24      0       0x2200
-pd     24      0       0x2202
-te     24      0       0x2203
-es     24      0       0x2205
-gr     24      0       0x2207
-mo     24      0       0x2208
-nm     24      0       0x2209
-st     24      0       0x220B
-product        24      0       0x220F
-coproduct      24      0       0x2210
-sum    24      0       0x2211
-\-     24      0       0x2212
-mi     "
--+     24      0       0x2213
-**     24      0       0x2217
-sr     24      0       0x221A
-sqrt   "
-pt     24      0       0x221D
-if     24      0       0x221E
-/_     24      0       0x2220
-AN     24      0       0x2227
-OR     24      0       0x2228
-ca     24      0       0x2229
-cu     24      0       0x222A
-is     24      0       0x222B
-integral       "
-tf     24      0       0x2234
-3d     "
-ap     24      0       0x223C
-|=     24      0       0x2243
-=~     24      0       0x2245
-~~     24      0       0x2248
-~=     "
-!=     24      0       0x2260
-==     24      0       0x2261
-ne     24      0       0x2262
-<=     24      0       0x2264
->=     24      0       0x2265
-<<     24      0       0x226A
->>     24      0       0x226B
-sb     24      0       0x2282
-sp     24      0       0x2283
-nb     24      0       0x2284
-nc     24      0       0x2285
-ib     24      0       0x2286
-ip     24      0       0x2287
-c+     24      0       0x2295
-c*     24      0       0x2297
-pp     24      0       0x22A5
-md     24      0       0x22C5
-lc     24      0       0x2308
-rc     24      0       0x2309
-lf     24      0       0x230A
-rf     24      0       0x230B
 la     24      0       0x2329
 ra     24      0       0x232A
-parenlefttp    24      0       0x239B
-parenleftex    24      0       0x239C
-parenleftbt    24      0       0x239D
-parenrighttp   24      0       0x239E
-parenrightex   24      0       0x239F
-parenrightbt   24      0       0x23A0
-bracketlefttp  24      0       0x23A1
-bracketleftex  24      0       0x23A2
-bracketleftbt  24      0       0x23A3
-bracketrighttp 24      0       0x23A4
-bracketrightex 24      0       0x23A5
-bracketrightbt 24      0       0x23A6
-lt     24      0       0x23A7
-bracelefttp    "
-lk     24      0       0x23A8
-braceleftmid   "
-lb     24      0       0x23A9
-braceleftbt    "
-bv     24      0       0x23AA
-braceex        "
-braceleftex    "
-bracerightex   "
-rt     24      0       0x23AB
-bracerighttp   "
-rk     24      0       0x23AC
-bracerightmid  "
-rb     24      0       0x23AD
-bracerightbt   "
-u23AE  24      0       0x23AE
-an     24      0       0x23AF
-br     24      0       0x2502
-sq     24      0       0x25A1
-lz     24      0       0x25CA
-ci     24      0       0x25CB
-lh     24      0       0x261C
-rh     24      0       0x261E
-SP     24      0       0x2660
-CL     24      0       0x2663
-HE     24      0       0x2665
-DI     24      0       0x2666
-OK     24      0       0x2713
diff -r -c3 groff-20060217.orig/font/devutf8/DESC.proto 
groff-20060217/font/devutf8/DESC.proto
--- groff-20060217.orig/font/devutf8/DESC.proto 2000-02-06 10:36:22.000000000 
+0100
+++ groff-20060217/font/devutf8/DESC.proto      2006-02-20 01:23:30.000000000 
+0100
@@ -6,3 +6,4 @@
 fonts 4 R I B BI
 tcommand
 postpro grotty
+unicode
diff -r -c3 groff-20060217.orig/font/devutf8/R.proto 
groff-20060217/font/devutf8/R.proto
--- groff-20060217.orig/font/devutf8/R.proto    2005-03-28 11:14:17.000000000 
+0200
+++ groff-20060217/font/devutf8/R.proto 2006-02-20 01:23:30.000000000 +0100
@@ -1,819 +1,3 @@
 name R
 internalname 0
 spacewidth 24
-charset
----    24      0       0x0000
----    24      0       0x0001
----    24      0       0x0002
----    24      0       0x0003
----    24      0       0x0004
----    24      0       0x0005
----    24      0       0x0006
----    24      0       0x0007
----    24      0       0x0008
----    24      0       0x0009
----    24      0       0x000A
----    24      0       0x000B
----    24      0       0x000C
----    24      0       0x000D
----    24      0       0x000E
----    24      0       0x000F
----    24      0       0x0010
----    24      0       0x0011
----    24      0       0x0012
----    24      0       0x0013
----    24      0       0x0014
----    24      0       0x0015
----    24      0       0x0016
----    24      0       0x0017
----    24      0       0x0018
----    24      0       0x0019
----    24      0       0x001A
----    24      0       0x001B
----    24      0       0x001C
----    24      0       0x001D
----    24      0       0x001E
----    24      0       0x001F
----    24      0       0x0020
-!      24      0       0x0021
-"      24      0       0x0022
-dq     "
-#      24      0       0x0023
-sh     "
-$      24      0       0x0024
-Do     "
-%      24      0       0x0025
-&      24      0       0x0026
-aq     24      0       0x0027
-(      24      0       0x0028
-)      24      0       0x0029
-*      24      0       0x002A
-+      24      0       0x002B
-pl     "
-,      24      0       0x002C
----    24      0       0x002D
-.      24      0       0x002E
-/      24      0       0x002F
-sl     "
-0      24      0       0x0030
-1      24      0       0x0031
-2      24      0       0x0032
-3      24      0       0x0033
-4      24      0       0x0034
-5      24      0       0x0035
-6      24      0       0x0036
-7      24      0       0x0037
-8      24      0       0x0038
-9      24      0       0x0039
-:      24      0       0x003A
-;      24      0       0x003B
-<      24      0       0x003C
-=      24      0       0x003D
-eq     "
->      24      0       0x003E
-?      24      0       0x003F
-@      24      0       0x0040
-at     "
-A      24      0       0x0041
-B      24      0       0x0042
-C      24      0       0x0043
-D      24      0       0x0044
-E      24      0       0x0045
-F      24      0       0x0046
-G      24      0       0x0047
-H      24      0       0x0048
-I      24      0       0x0049
-J      24      0       0x004A
-K      24      0       0x004B
-L      24      0       0x004C
-M      24      0       0x004D
-N      24      0       0x004E
-O      24      0       0x004F
-P      24      0       0x0050
-Q      24      0       0x0051
-R      24      0       0x0052
-S      24      0       0x0053
-T      24      0       0x0054
-U      24      0       0x0055
-V      24      0       0x0056
-W      24      0       0x0057
-X      24      0       0x0058
-Y      24      0       0x0059
-Z      24      0       0x005A
-[      24      0       0x005B
-lB     "
-\      24      0       0x005C
-rs     "
-]      24      0       0x005D
-rB     "
-a^     24      0       0x005E
-^      "
-ha     "
-_      24      0       0x005F
-ru     "
-ul     "
-\`     24      0       0x0060
-ga     "
-a      24      0       0x0061
-b      24      0       0x0062
-c      24      0       0x0063
-d      24      0       0x0064
-e      24      0       0x0065
-f      24      0       0x0066
-g      24      0       0x0067
-h      24      0       0x0068
-i      24      0       0x0069
-j      24      0       0x006A
-k      24      0       0x006B
-l      24      0       0x006C
-m      24      0       0x006D
-n      24      0       0x006E
-o      24      0       0x006F
-p      24      0       0x0070
-q      24      0       0x0071
-r      24      0       0x0072
-s      24      0       0x0073
-t      24      0       0x0074
-u      24      0       0x0075
-v      24      0       0x0076
-w      24      0       0x0077
-x      24      0       0x0078
-y      24      0       0x0079
-z      24      0       0x007A
-lC     24      0       0x007B
-{      "
-ba     24      0       0x007C
-or     "
-|      "
-rC     24      0       0x007D
-}      "
-a~     24      0       0x007E
-~      "
-ti     "
----    24      0       0x007F
----    24      0       0x0080
----    24      0       0x0081
----    24      0       0x0082
----    24      0       0x0083
----    24      0       0x0084
----    24      0       0x0085
----    24      0       0x0086
----    24      0       0x0087
----    24      0       0x0088
----    24      0       0x0089
----    24      0       0x008A
----    24      0       0x008B
----    24      0       0x008C
----    24      0       0x008D
----    24      0       0x008E
----    24      0       0x008F
----    24      0       0x0090
----    24      0       0x0091
----    24      0       0x0092
----    24      0       0x0093
----    24      0       0x0094
----    24      0       0x0095
----    24      0       0x0096
----    24      0       0x0097
----    24      0       0x0098
----    24      0       0x0099
----    24      0       0x009A
----    24      0       0x009B
----    24      0       0x009C
----    24      0       0x009D
----    24      0       0x009E
----    24      0       0x009F
----    24      0       0x00A0
-r!     24      0       0x00A1
-ct     24      0       0x00A2
-Po     24      0       0x00A3
-Cs     24      0       0x00A4
-Ye     24      0       0x00A5
-bb     24      0       0x00A6
-sc     24      0       0x00A7
-ad     24      0       0x00A8
-co     24      0       0x00A9
-Of     24      0       0x00AA
-Fo     24      0       0x00AB
-no     24      0       0x00AC
-tno    "
----    24      0       0x00AD
-rg     24      0       0x00AE
-a-     24      0       0x00AF
-de     24      0       0x00B0
-+-     24      0       0x00B1
-t+-    "
-S2     24      0       0x00B2
-S3     24      0       0x00B3
-aa     24      0       0x00B4
-\'     "
-mc     24      0       0x00B5
-ps     24      0       0x00B6
-pc     24      0       0x00B7
-ac     24      0       0x00B8
-S1     24      0       0x00B9
-Om     24      0       0x00BA
-Fc     24      0       0x00BB
-14     24      0       0x00BC
-12     24      0       0x00BD
-34     24      0       0x00BE
-r?     24      0       0x00BF
-`A     24      0       0x00C0
-'A     24      0       0x00C1
-^A     24      0       0x00C2
-~A     24      0       0x00C3
-:A     24      0       0x00C4
-oA     24      0       0x00C5
-AE     24      0       0x00C6
-,C     24      0       0x00C7
-`E     24      0       0x00C8
-'E     24      0       0x00C9
-^E     24      0       0x00CA
-:E     24      0       0x00CB
-`I     24      0       0x00CC
-'I     24      0       0x00CD
-^I     24      0       0x00CE
-:I     24      0       0x00CF
--D     24      0       0x00D0
-~N     24      0       0x00D1
-`O     24      0       0x00D2
-'O     24      0       0x00D3
-^O     24      0       0x00D4
-~O     24      0       0x00D5
-:O     24      0       0x00D6
-mu     24      0       0x00D7
-tmu    "
-/O     24      0       0x00D8
-`U     24      0       0x00D9
-'U     24      0       0x00DA
-^U     24      0       0x00DB
-:U     24      0       0x00DC
-'Y     24      0       0x00DD
-TP     24      0       0x00DE
-ss     24      0       0x00DF
-`a     24      0       0x00E0
-'a     24      0       0x00E1
-^a     24      0       0x00E2
-~a     24      0       0x00E3
-:a     24      0       0x00E4
-oa     24      0       0x00E5
-ae     24      0       0x00E6
-,c     24      0       0x00E7
-`e     24      0       0x00E8
-'e     24      0       0x00E9
-^e     24      0       0x00EA
-:e     24      0       0x00EB
-`i     24      0       0x00EC
-'i     24      0       0x00ED
-^i     24      0       0x00EE
-:i     24      0       0x00EF
-Sd     24      0       0x00F0
-~n     24      0       0x00F1
-`o     24      0       0x00F2
-'o     24      0       0x00F3
-^o     24      0       0x00F4
-~o     24      0       0x00F5
-:o     24      0       0x00F6
-di     24      0       0x00F7
-tdi    "
-/o     24      0       0x00F8
-`u     24      0       0x00F9
-'u     24      0       0x00FA
-^u     24      0       0x00FB
-:u     24      0       0x00FC
-'y     24      0       0x00FD
-Tp     24      0       0x00FE
-:y     24      0       0x00FF
-u0041_0306     24      0       0x0102
-u0061_0306     24      0       0x0103
-u0041_0328     24      0       0x0104
-u0061_0328     24      0       0x0105
-'C     24      0       0x0106
-'c     24      0       0x0107
-u0043_030C     24      0       0x010C
-u0063_030C     24      0       0x010D
-u0044_030C     24      0       0x010E
-u0064_030C     24      0       0x010F
-u0110  24      0       0x0110
-u0111  24      0       0x0111
-u0045_0328     24      0       0x0118
-u0065_0328     24      0       0x0119
-u0045_030C 24  0       0x011A
-u0065_030C     24      0       0x011B
-u0047_0306     24      0       0x011E
-u0067_0306     24      0       0x011F
-u0049_0307     24      0       0x0130
-.i     24      0       0x0131
-IJ     24      0       0x0132
-ij     24      0       0x0133
-u004C_0301     24      0       0x0139
-u006C_0301     24      0       0x013A
-u004C_030C     24      0       0x013D
-u006C_030C     24      0       0x013E
-/L     24      0       0x0141
-/l     24      0       0x0142
-u004E_0301     24      0       0x0143
-u006E_0301     24      0       0x0144
-u004E_030C     24      0       0x0147
-u006E_030C     24      0       0x0148
-u004F_030B     24      0       0x0150
-u006F_030B     24      0       0x0151
-OE     24      0       0x0152
-oe     24      0       0x0153
-u0052_0301     24      0       0x0154
-u0072_0301     24      0       0x0155
-u0052_030C     24      0       0x0158
-u0072_030C     24      0       0x0159
-u0053_0301     24      0       0x015A
-u0073_0301     24      0       0x015B
-u0053_0327     24      0       0x015E
-u0073_0327     24      0       0x015F
-vS     24      0       0x0160
-vs     24      0       0x0161
-u0054_0327     24      0       0x0162
-u0074_0327     24      0       0x0163
-u0054_030C     24      0       0x0164
-u0074_030C     24      0       0x0165
-u0055_030A     24      0       0x016E
-u0075_030A     24      0       0x016F
-u0055_030B     24      0       0x0170
-u0075_030B     24      0       0x0171
-:Y     24      0       0x0178
-u005A_0301     24      0       0x0179
-u007A_0301     24      0       0x017A
-u005A_0307     24      0       0x017B
-u007A_0307     24      0       0x017C
-vZ     24      0       0x017D
-vz     24      0       0x017E
-Fn     24      0       0x0192
-ah     24      0       0x02C7
-ab     24      0       0x02D8
-a.     24      0       0x02D9
-ao     24      0       0x02DA
-ho     24      0       0x02DB
-a"     24      0       0x02DD
-*A     24      0       0x0391
-*B     24      0       0x0392
-*G     24      0       0x0393
-*D     24      0       0x0394
-*E     24      0       0x0395
-*Z     24      0       0x0396
-*Y     24      0       0x0397
-*H     24      0       0x0398
-*I     24      0       0x0399
-*K     24      0       0x039A
-*L     24      0       0x039B
-*M     24      0       0x039C
-*N     24      0       0x039D
-*C     24      0       0x039E
-*O     24      0       0x039F
-*P     24      0       0x03A0
-*R     24      0       0x03A1
-*S     24      0       0x03A3
-*T     24      0       0x03A4
-*U     24      0       0x03A5
-*F     24      0       0x03A6
-*X     24      0       0x03A7
-*Q     24      0       0x03A8
-*W     24      0       0x03A9
-*a     24      0       0x03B1
-*b     24      0       0x03B2
-*g     24      0       0x03B3
-*d     24      0       0x03B4
-*e     24      0       0x03B5
-*z     24      0       0x03B6
-*y     24      0       0x03B7
-*h     24      0       0x03B8
-*i     24      0       0x03B9
-*k     24      0       0x03BA
-*l     24      0       0x03BB
-*m     24      0       0x03BC
-*n     24      0       0x03BD
-*c     24      0       0x03BE
-*o     24      0       0x03BF
-*p     24      0       0x03C0
-*r     24      0       0x03C1
-ts     24      0       0x03C2
-*s     24      0       0x03C3
-*t     24      0       0x03C4
-*u     24      0       0x03C5
-+f     24      0       0x03C6
-*x     24      0       0x03C7
-*q     24      0       0x03C8
-*w     24      0       0x03C9
-+h     24      0       0x03D1
-*f     24      0       0x03D5
-+p     24      0       0x03D6
-+e     24      0       0x03F5
-u0415_0300     24      0       0x0400
-u0415_0308     24      0       0x0401
-u0402  24      0       0x0402
-u0413_0301     24      0       0x0403
-u0404  24      0       0x0404
-u0405  24      0       0x0405
-u0406  24      0       0x0406
-u0406_0308     24      0       0x0407
-u0408  24      0       0x0408
-u0409  24      0       0x0409
-u040A  24      0       0x040A
-u040B  24      0       0x040B
-u041A_0301     24      0       0x040C
-u0418_0300     24      0       0x040D
-u0423_0306     24      0       0x040E
-u040F  24      0       0x040F
-u0410  24      0       0x0410
-u0411  24      0       0x0411
-u0412  24      0       0x0412
-u0413  24      0       0x0413
-u0414  24      0       0x0414
-u0415  24      0       0x0415
-u0416  24      0       0x0416
-u0417  24      0       0x0417
-u0418  24      0       0x0418
-u0418_0306     24      0       0x0419
-u041A  24      0       0x041A
-u041B  24      0       0x041B
-u041C  24      0       0x041C
-u041D  24      0       0x041D
-u041E  24      0       0x041E
-u041F  24      0       0x041F
-u0420  24      0       0x0420
-u0421  24      0       0x0421
-u0422  24      0       0x0422
-u0423  24      0       0x0423
-u0424  24      0       0x0424
-u0425  24      0       0x0425
-u0426  24      0       0x0426
-u0427  24      0       0x0427
-u0428  24      0       0x0428
-u0429  24      0       0x0429
-u042A  24      0       0x042A
-u042B  24      0       0x042B
-u042C  24      0       0x042C
-u042D  24      0       0x042D
-u042E  24      0       0x042E
-u042F  24      0       0x042F
-u0430  24      0       0x0430
-u0431  24      0       0x0431
-u0432  24      0       0x0432
-u0433  24      0       0x0433
-u0434  24      0       0x0434
-u0435  24      0       0x0435
-u0436  24      0       0x0436
-u0437  24      0       0x0437
-u0438  24      0       0x0438
-u0438_0306     24      0       0x0439
-u043A  24      0       0x043A
-u043B  24      0       0x043B
-u043C  24      0       0x043C
-u043D  24      0       0x043D
-u043E  24      0       0x043E
-u043F  24      0       0x043F
-u0440  24      0       0x0440
-u0441  24      0       0x0441
-u0442  24      0       0x0442
-u0443  24      0       0x0443
-u0444  24      0       0x0444
-u0445  24      0       0x0445
-u0446  24      0       0x0446
-u0447  24      0       0x0447
-u0448  24      0       0x0448
-u0449  24      0       0x0449
-u044A  24      0       0x044A
-u044B  24      0       0x044B
-u044C  24      0       0x044C
-u044D  24      0       0x044D
-u044E  24      0       0x044E
-u044F  24      0       0x044F
-u0435_0300     24      0       0x0450
-u0435_0308     24      0       0x0451
-u0452  24      0       0x0452
-u0433_0301     24      0       0x0453
-u0454  24      0       0x0454
-u0455  24      0       0x0455
-u0456  24      0       0x0456
-u0456_0308     24      0       0x0457
-u0458  24      0       0x0458
-u0459  24      0       0x0459
-u045A  24      0       0x045A
-u045B  24      0       0x045B
-u043A_0301     24      0       0x045C
-u0438_0300     24      0       0x045D
-u0443_0306     24      0       0x045E
-u045F  24      0       0x045F
-u0460  24      0       0x0460
-u0461  24      0       0x0461
-u0462  24      0       0x0462
-u0463  24      0       0x0463
-u0464  24      0       0x0464
-u0465  24      0       0x0465
-u0466  24      0       0x0466
-u0467  24      0       0x0467
-u0468  24      0       0x0468
-u0469  24      0       0x0469
-u046A  24      0       0x046A
-u046B  24      0       0x046B
-u046C  24      0       0x046C
-u046D  24      0       0x046D
-u046E  24      0       0x046E
-u046F  24      0       0x046F
-u0470  24      0       0x0470
-u0471  24      0       0x0471
-u0472  24      0       0x0472
-u0473  24      0       0x0473
-u0474  24      0       0x0474
-u0475  24      0       0x0475
-u0474_030F     24      0       0x0476
-u0475_030F     24      0       0x0477
-u0478  24      0       0x0478
-u0479  24      0       0x0479
-u047A  24      0       0x047A
-u047B  24      0       0x047B
-u047C  24      0       0x047C
-u047D  24      0       0x047D
-u047E  24      0       0x047E
-u047F  24      0       0x047F
-u0480  24      0       0x0480
-u0481  24      0       0x0481
-u0482  24      0       0x0482
-u0483  0       0       0x0483
-u0484  0       0       0x0484
-u0485  0       0       0x0485
-u0486  0       0       0x0486
-u0488  0       0       0x0488
-u0489  0       0       0x0489
-u048A  24      0       0x048A
-u048B  24      0       0x048B
-u048C  24      0       0x048C
-u048D  24      0       0x048D
-u048E  24      0       0x048E
-u048F  24      0       0x048F
-u0490  24      0       0x0490
-u0491  24      0       0x0491
-u0492  24      0       0x0492
-u0493  24      0       0x0493
-u0494  24      0       0x0494
-u0495  24      0       0x0495
-u0496  24      0       0x0496
-u0497  24      0       0x0497
-u0498  24      0       0x0498
-u0499  24      0       0x0499
-u049A  24      0       0x049A
-u049B  24      0       0x049B
-u049C  24      0       0x049C
-u049D  24      0       0x049D
-u049E  24      0       0x049E
-u049F  24      0       0x049F
-u04A0  24      0       0x04A0
-u04A1  24      0       0x04A1
-u04A2  24      0       0x04A2
-u04A3  24      0       0x04A3
-u04A4  24      0       0x04A4
-u04A5  24      0       0x04A5
-u04A6  24      0       0x04A6
-u04A7  24      0       0x04A7
-u04A8  24      0       0x04A8
-u04A9  24      0       0x04A9
-u04AA  24      0       0x04AA
-u04AB  24      0       0x04AB
-u04AC  24      0       0x04AC
-u04AD  24      0       0x04AD
-u04AE  24      0       0x04AE
-u04AF  24      0       0x04AF
-u04B0  24      0       0x04B0
-u04B1  24      0       0x04B1
-u04B2  24      0       0x04B2
-u04B3  24      0       0x04B3
-u04B4  24      0       0x04B4
-u04B5  24      0       0x04B5
-u04B6  24      0       0x04B6
-u04B7  24      0       0x04B7
-u04B8  24      0       0x04B8
-u04B9  24      0       0x04B9
-u04BA  24      0       0x04BA
-u04BB  24      0       0x04BB
-u04BC  24      0       0x04BC
-u04BD  24      0       0x04BD
-u04BE  24      0       0x04BE
-u04BF  24      0       0x04BF
-u04C0  24      0       0x04C0
-u0416_0306     24      0       0x04C1
-u0436_0306     24      0       0x04C2
-u04C3  24      0       0x04C3
-u04C4  24      0       0x04C4
-u04C5  24      0       0x04C5
-u04C6  24      0       0x04C6
-u04C7  24      0       0x04C7
-u04C8  24      0       0x04C8
-u04C9  24      0       0x04C9
-u04CA  24      0       0x04CA
-u04CB  24      0       0x04CB
-u04CC  24      0       0x04CC
-u04CD  24      0       0x04CD
-u04CE  24      0       0x04CE
-u0410_0306     24      0       0x04D0
-u0430_0306     24      0       0x04D1
-u0410_0308     24      0       0x04D2
-u0430_0308     24      0       0x04D3
-u04D4  24      0       0x04D4
-u04D5  24      0       0x04D5
-u0415_0306     24      0       0x04D6
-u0435_0306     24      0       0x04D7
-u04D8  24      0       0x04D8
-u04D9  24      0       0x04D9
-u04D8_0308     24      0       0x04DA
-u04D9_0308     24      0       0x04DB
-u0416_0308     24      0       0x04DC
-u0436_0308     24      0       0x04DD
-u0417_0308     24      0       0x04DE
-u0437_0308     24      0       0x04DF
-u04E0  24      0       0x04E0
-u04E1  24      0       0x04E1
-u0418_0304     24      0       0x04E2
-u0438_0304     24      0       0x04E3
-u0418_0308     24      0       0x04E4
-u0438_0308     24      0       0x04E5
-u041E_0308     24      0       0x04E6
-u043E_0308     24      0       0x04E7
-u04E8  24      0       0x04E8
-u04E9  24      0       0x04E9
-u04E8_0308     24      0       0x04EA
-u04E9_0308     24      0       0x04EB
-u042D_0308     24      0       0x04EC
-u044D_0308     24      0       0x04ED
-u0423_0304     24      0       0x04EE
-u0443_0304     24      0       0x04EF
-u0423_0308     24      0       0x04F0
-u0443_0308     24      0       0x04F1
-u0423_030B     24      0       0x04F2
-u0443_030B     24      0       0x04F3
-u0427_0308     24      0       0x04F4
-u0447_0308     24      0       0x04F5
-u042B_0308     24      0       0x04F8
-u044B_0308     24      0       0x04F9
-u0500  24      0       0x0500
-u0501  24      0       0x0501
-u0502  24      0       0x0502
-u0503  24      0       0x0503
-u0504  24      0       0x0504
-u0505  24      0       0x0505
-u0506  24      0       0x0506
-u0507  24      0       0x0507
-u0508  24      0       0x0508
-u0509  24      0       0x0509
-u050A  24      0       0x050A
-u050B  24      0       0x050B
-u050C  24      0       0x050C
-u050D  24      0       0x050D
-u050E  24      0       0x050E
-u050F  24      0       0x050F
--      24      0       0x2010
-hy     "
-en     24      0       0x2013
-em     24      0       0x2014
-`      24      0       0x2018
-oq     "
-'      24      0       0x2019
-cq     "
-bq     24      0       0x201A
-lq     24      0       0x201C
-rq     24      0       0x201D
-Bq     24      0       0x201E
-dg     24      0       0x2020
-dd     24      0       0x2021
-bu     24      0       0x2022
-%0     24      0       0x2030
-fm     24      0       0x2032
-sd     24      0       0x2033
-fo     24      0       0x2039
-fc     24      0       0x203A
-rn     24      0       0x203E
-f/     24      0       0x2044
-eu     24      0       0x20AC
-Eu     "
--h     24      0       0x210F
-hbar   "
-Im     24      0       0x2111
-wp     24      0       0x2118
-Re     24      0       0x211C
-tm     24      0       0x2122
-Ah     24      0       0x2135
-18     24      0       0x215B
-38     24      0       0x215C
-58     24      0       0x215D
-78     24      0       0x215E
-<-     24      0       0x2190
-ua     24      0       0x2191
-->     24      0       0x2192
-da     24      0       0x2193
-<>     24      0       0x2194
-va     24      0       0x2195
-CR     24      0       0x21B5
-lA     24      0       0x21D0
-uA     24      0       0x21D1
-rA     24      0       0x21D2
-dA     24      0       0x21D3
-hA     24      0       0x21D4
-vA     24      0       0x21D5
-fa     24      0       0x2200
-pd     24      0       0x2202
-te     24      0       0x2203
-es     24      0       0x2205
-gr     24      0       0x2207
-mo     24      0       0x2208
-nm     24      0       0x2209
-st     24      0       0x220B
-product        24      0       0x220F
-coproduct      24      0       0x2210
-sum    24      0       0x2211
-\-     24      0       0x2212
-mi     "
--+     24      0       0x2213
-**     24      0       0x2217
-sr     24      0       0x221A
-sqrt   "
-pt     24      0       0x221D
-if     24      0       0x221E
-/_     24      0       0x2220
-AN     24      0       0x2227
-OR     24      0       0x2228
-ca     24      0       0x2229
-cu     24      0       0x222A
-is     24      0       0x222B
-integral       "
-tf     24      0       0x2234
-3d     "
-ap     24      0       0x223C
-|=     24      0       0x2243
-=~     24      0       0x2245
-~~     24      0       0x2248
-~=     "
-!=     24      0       0x2260
-==     24      0       0x2261
-ne     24      0       0x2262
-<=     24      0       0x2264
->=     24      0       0x2265
-<<     24      0       0x226A
->>     24      0       0x226B
-sb     24      0       0x2282
-sp     24      0       0x2283
-nb     24      0       0x2284
-nc     24      0       0x2285
-ib     24      0       0x2286
-ip     24      0       0x2287
-c+     24      0       0x2295
-c*     24      0       0x2297
-pp     24      0       0x22A5
-md     24      0       0x22C5
-lc     24      0       0x2308
-rc     24      0       0x2309
-lf     24      0       0x230A
-rf     24      0       0x230B
-parenlefttp    24      0       0x239B
-parenleftex    24      0       0x239C
-parenleftbt    24      0       0x239D
-parenrighttp   24      0       0x239E
-parenrightex   24      0       0x239F
-parenrightbt   24      0       0x23A0
-bracketlefttp  24      0       0x23A1
-bracketleftex  24      0       0x23A2
-bracketleftbt  24      0       0x23A3
-bracketrighttp 24      0       0x23A4
-bracketrightex 24      0       0x23A5
-bracketrightbt 24      0       0x23A6
-lt     24      0       0x23A7
-bracelefttp    "
-lk     24      0       0x23A8
-braceleftmid   "
-lb     24      0       0x23A9
-braceleftbt    "
-bv     24      0       0x23AA
-braceex        "
-braceleftex    "
-bracerightex   "
-rt     24      0       0x23AB
-bracerighttp   "
-rk     24      0       0x23AC
-bracerightmid  "
-rb     24      0       0x23AD
-bracerightbt   "
-u23AE  24      0       0x23AE
-an     24      0       0x23AF
-br     24      0       0x2502
-sq     24      0       0x25A1
-lz     24      0       0x25CA
-ci     24      0       0x25CB
-lh     24      0       0x261C
-rh     24      0       0x261E
-SP     24      0       0x2660
-CL     24      0       0x2663
-HE     24      0       0x2665
-DI     24      0       0x2666
-OK     24      0       0x2713
-la     24      0       0x27E8
-ra     24      0       0x27E9
-ff     24      0       0xFB00
-fi     24      0       0xFB01
-fl     24      0       0xFB02
-Fi     24      0       0xFB03
-Fl     24      0       0xFB04
diff -r -c3 groff-20060217.orig/src/include/font.h 
groff-20060217/src/include/font.h
--- groff-20060217.orig/src/include/font.h      2006-02-19 14:36:53.000000000 
+0100
+++ groff-20060217/src/include/font.h   2006-02-20 22:13:53.000000000 +0100
@@ -248,6 +248,8 @@
                        // `pass_filenames' attribute.
   static int use_charnames_in_special; // Nonzero if the DESC file has the
                        // `use_charnames_in_special' attribute.
+  static int is_unicode; // Nonzero if the DESC file has the `unicode'
+                       // attribute.
   static const char *image_generator;  // The `image_generator' attribute
                        // given in the DESC file.
   static const char **font_name_table; // The `fonts' attribute given in
@@ -269,22 +271,24 @@
                        // Used by get_kern().
   int space_width;     // The normal width of a space.  Used by
                        // get_space_width().
+  int special;         // 1 if this font is special, 0 otherwise.  Used by
+                       // is_special().
+  char *name;          // The name of this font.  Used by get_name().
+  char *internalname;  // The `internalname' attribute of this font, or
+                       // NULL.  Used by get_internal_name().
+  double slant;                // The natural slant angle (in degrees) of this 
font.
   int *ch_index;       // Conversion table from font-independent character
                        // indices to indices for this particular font.
   int nindices;
   font_char_metric *ch;        // Metrics information for every character in 
this
-                       // font.  The indices of this array are
+                       // font (if !is_unicode) or for just some characters
+                       // (if is_unicode).  The indices of this array are
                        // font-specific, found as values in ch_index[].
   int ch_used;
   int ch_size;
-  int special;         // 1 if this font is special, 0 otherwise.  Used by
-                       // is_special().
-  char *name;          // The name of this font.  Used by get_name().
-  char *internalname;  // The `internalname' attribute of this font, or
-                       // NULL.  Used by get_internal_name().
-  double slant;                // The natural slant angle (in degrees) of this 
font.
   font_widths_cache *widths_cache;     // A cache of scaled character
                        // widths.  Used by the get_width() function.
+
   static FONT_COMMAND_HANDLER unknown_desc_command_handler;    // A
                        // function defining the semantics of arbitrary
                        // commands in the DESC file.
diff -r -c3 groff-20060217.orig/src/libs/libgroff/font.cpp 
groff-20060217/src/libs/libgroff/font.cpp
--- groff-20060217.orig/src/libs/libgroff/font.cpp      2006-02-19 
14:36:53.000000000 +0100
+++ groff-20060217/src/libs/libgroff/font.cpp   2006-02-20 21:42:41.000000000 
+0100
@@ -30,6 +30,7 @@
 #include "error.h"
 #include "cset.h"
 #include "font.h"
+#include "unicode.h"
 #include "paper.h"
 
 const char *const WS = " \t\n\r";
@@ -151,8 +152,8 @@
 /* font functions */
 
 font::font(const char *s)
-: ligatures(0), kern_hash_table(0), space_width(0), ch_index(0), nindices(0),
-  ch(0), ch_used(0), ch_size(0), special(0), widths_cache(0)
+: ligatures(0), kern_hash_table(0), space_width(0), special(0),
+  ch_index(0), nindices(0), ch(0), ch_used(0), ch_size(0), widths_cache(0)
 {
   name = new char[strlen(s) + 1];
   strcpy(name, s);
@@ -249,7 +250,44 @@
 {
   int idx = glyph_to_index(g);
   assert(idx >= 0);
-  return idx < nindices && ch_index[idx] >= 0;
+  // Explicitly enumerated glyph?
+  if (idx < nindices && ch_index[idx] >= 0)
+    return 1;
+  if (is_unicode) {
+    // Unicode font
+    const char *name = glyph_to_name(g);
+    if (name != NULL) {
+      // Case 1: ASCII character.
+      if (name[0] == 'c' && name[1] == 'h' && name[2] == 'a' && name[3] == 'r'
+          && (name[4] >= '0' && name[4] <= '9')) {
+       int n = (name[4] - '0');
+       if (name[5] == '\0')
+         return 1;
+       if (n > 0 && (name[5] >= '0' && name[5] <= '9')) {
+         n = 10*n + (name[5] - '0');
+         if (name[6] == '\0')
+           return 1;
+         if (name[6] >= '0' && name[6] <= '9') {
+           n = 10*n + (name[6] - '0');
+           if (name[7] == '\0' && n < 128)
+             return 1;
+         }
+       }
+      }
+      // Case 2: Unicode character.
+      if (check_unicode_name(name))
+       return 1;
+      // Case 3: groff glyphs that map to Unicode.
+      const char *unicode = glyph_name_to_unicode(name);
+      if (unicode != NULL && strchr(unicode, '_') == NULL)
+       return 1;
+    }
+    // Case 99: Numbered character.
+    int n = glyph_to_number(g);
+    if (n >= 0)
+      return 1;
+  }
+  return 0;
 }
 
 int font::is_special()
@@ -274,68 +312,119 @@
 int font::get_width(glyph *g, int point_size)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices);
-  int i = ch_index[idx];
-  assert(i >= 0);
-
-  if (point_size == unitwidth || font::unscaled_charwidths)
-    return ch[i].width;
-
-  if (!widths_cache)
-    widths_cache = new font_widths_cache(point_size, ch_size);
-  else if (widths_cache->point_size != point_size) {
-    font_widths_cache **p;
-    for (p = &widths_cache; *p; p = &(*p)->next)
-      if ((*p)->point_size == point_size)
-       break;
-    if (*p) {
-      font_widths_cache *tem = *p;
-      *p = (*p)->next;
-      tem->next = widths_cache;
-      widths_cache = tem;
-    }
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    int i = ch_index[idx];
+
+    if (point_size == unitwidth || font::unscaled_charwidths)
+      return ch[i].width;
+
+    if (!widths_cache)
+      widths_cache = new font_widths_cache(point_size, ch_size);
+    else if (widths_cache->point_size != point_size) {
+      font_widths_cache **p;
+      for (p = &widths_cache; *p; p = &(*p)->next)
+       if ((*p)->point_size == point_size)
+         break;
+      if (*p) {
+       font_widths_cache *tem = *p;
+       *p = (*p)->next;
+       tem->next = widths_cache;
+       widths_cache = tem;
+      }
+      else
+       widths_cache = new font_widths_cache(point_size, ch_size, widths_cache);
+    }
+    int &w = widths_cache->width[i];
+    if (w < 0)
+      w = scale(ch[i].width, point_size);
+    return w;
+  }
+  if (is_unicode) {
+    // Unicode font
+    int width = 24; // value found in the original font files
+    if (point_size == unitwidth || font::unscaled_charwidths)
+      return width;
     else
-      widths_cache = new font_widths_cache(point_size, ch_size, widths_cache);
+      return scale(width, point_size);
   }
-  int &w = widths_cache->width[i];
-  if (w < 0)
-    w = scale(ch[i].width, point_size);
-  return w;
+  abort();
 }
 
 int font::get_height(glyph *g, int point_size)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return scale(ch[ch_index[idx]].height, point_size);
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return scale(ch[ch_index[idx]].height, point_size);
+  }
+  if (is_unicode) {
+    // Unicode font
+    return 0; // value found in the original font files
+  }
+  abort();
 }
 
 int font::get_depth(glyph *g, int point_size)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return scale(ch[ch_index[idx]].depth, point_size);
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return scale(ch[ch_index[idx]].depth, point_size);
+  }
+  if (is_unicode) {
+    // Unicode font
+    return 0; // value found in the original font files
+  }
+  abort();
 }
 
 int font::get_italic_correction(glyph *g, int point_size)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return scale(ch[ch_index[idx]].italic_correction, point_size);
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return scale(ch[ch_index[idx]].italic_correction, point_size);
+  }
+  if (is_unicode) {
+    // Unicode font
+    return 0; // value found in the original font files
+  }
+  abort();
 }
 
 int font::get_left_italic_correction(glyph *g, int point_size)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return scale(ch[ch_index[idx]].pre_math_space, point_size);
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return scale(ch[ch_index[idx]].pre_math_space, point_size);
+  }
+  if (is_unicode) {
+    // Unicode font
+    return 0; // value found in the original font files
+  }
+  abort();
 }
 
 int font::get_subscript_correction(glyph *g, int point_size)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return scale(ch[ch_index[idx]].subscript_correction, point_size);
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return scale(ch[ch_index[idx]].subscript_correction, point_size);
+  }
+  if (is_unicode) {
+    // Unicode font
+    return 0; // value found in the original font files
+  }
+  abort();
 }
 
 int font::get_space_width(int point_size)
@@ -385,15 +474,66 @@
 int font::get_character_type(glyph *g)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return ch[ch_index[idx]].type;
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return ch[ch_index[idx]].type;
+  }
+  if (is_unicode) {
+    // Unicode font
+    return 0; // value found in the original font files
+  }
+  abort();
 }
 
 int font::get_code(glyph *g)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return ch[ch_index[idx]].code;
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return ch[ch_index[idx]].code;
+  }
+  if (is_unicode) {
+    // Unicode font
+    const char *name = glyph_to_name(g);
+    if (name != NULL) {
+      // Case 1: ASCII character.
+      if (name[0] == 'c' && name[1] == 'h' && name[2] == 'a' && name[3] == 'r'
+          && (name[4] >= '0' && name[4] <= '9')) {
+       int n = (name[4] - '0');
+       if (name[5] == '\0')
+         return n;
+       if (n > 0 && (name[5] >= '0' && name[5] <= '9')) {
+         n = 10*n + (name[5] - '0');
+         if (name[6] == '\0')
+           return n;
+         if (name[6] >= '0' && name[6] <= '9') {
+           n = 10*n + (name[6] - '0');
+           if (name[7] == '\0' && n < 128)
+             return n;
+         }
+       }
+      }
+      // Case 2: Unicode character.
+      if (check_unicode_name(name)) {
+       char *ignore;
+       return (int)strtol(name+1, &ignore, 16);
+      }
+      // Case 3: groff glyphs that map to Unicode.
+      const char *unicode = glyph_name_to_unicode(name);
+      if (unicode != NULL && strchr(unicode, '_') == NULL) {
+       char *ignore;
+       return (int)strtol(unicode, &ignore, 16);
+      }
+    }
+    // Case 99: Numbered character.
+    int n = glyph_to_number(g);
+    if (n >= 0)
+      return n;
+  }
+  // The caller must check contains(g) before calling get_code(g).
+  abort();
 }
 
 const char *font::get_name()
@@ -409,8 +549,16 @@
 const char *font::get_special_device_encoding(glyph *g)
 {
   int idx = glyph_to_index(g);
-  assert(idx >= 0 && idx < nindices && ch_index[idx] >= 0);
-  return ch[ch_index[idx]].special_device_coding;
+  assert(idx >= 0);
+  if (idx < nindices && ch_index[idx] >= 0) {
+    // Explicitly enumerated glyph
+    return ch[ch_index[idx]].special_device_coding;
+  }
+  if (is_unicode) {
+    // Unicode font
+    return NULL;
+  }
+  abort();
 }
 
 const char *font::get_image_generator()
@@ -598,8 +746,8 @@
   char *p;
   for (;;) {
     if (!t.next()) {
-      t.error("missing charset command");
-      return 0;
+      p = 0;
+      break;
     }
     p = strtok(t.buf, WS);
     if (strcmp(p, "name") == 0) {
@@ -665,147 +813,154 @@
   }
   if (head_only)
     return 1;
-  char *command = p;
   int had_charset = 0;
-  t.skip_comments = 0;
-  while (command) {
-    if (strcmp(command, "kernpairs") == 0) {
-      for (;;) {
-       if (!t.next()) {
-         command = 0;
-         break;
-       }
-       char *c1 = strtok(t.buf, WS);
-       if (c1 == 0)
-         continue;
-       char *c2 = strtok(0, WS);
-       if (c2 == 0) {
-         command = c1;
-         break;
-       }
-       p = strtok(0, WS);
-       if (p == 0) {
-         t.error("missing kern amount");
-         return 0;
-       }
-       int n;
-       if (sscanf(p, "%d", &n) != 1) {
-         t.error("bad kern amount `%1'", p);
-         return 0;
-       }
-       glyph *g1 = name_to_glyph(c1);
-       glyph *g2 = name_to_glyph(c2);
-       add_kern(g1, g2, n);
-      }
+  if (p == 0) {
+    if (!is_unicode) {
+      t.error("missing charset command");
+      return 0;
     }
-    else if (strcmp(command, "charset") == 0) {
-      had_charset = 1;
-      glyph *last_glyph = NULL;
-      for (;;) {
-       if (!t.next()) {
-         command = 0;
-         break;
-       }
-       char *nm = strtok(t.buf, WS);
-       if (nm == 0)
-         continue;                     // I dont think this should happen
-       p = strtok(0, WS);
-       if (p == 0) {
-         command = nm;
-         break;
-       }
-       if (p[0] == '"') {
-         if (last_glyph == NULL) {
-           t.error("first charset entry is duplicate");
-           return 0;
-         }
-         if (strcmp(nm, "---") == 0) {
-           t.error("unnamed character cannot be duplicate");
-           return 0;
+  } else {
+    char *command = p;
+    t.skip_comments = 0;
+    while (command) {
+      if (strcmp(command, "kernpairs") == 0) {
+       for (;;) {
+         if (!t.next()) {
+           command = 0;
+           break;
          }
-         glyph *g = name_to_glyph(nm);
-         copy_entry(g, last_glyph);
-       }
-       else {
-         font_char_metric metric;
-         metric.height = 0;
-         metric.depth = 0;
-         metric.pre_math_space = 0;
-         metric.italic_correction = 0;
-         metric.subscript_correction = 0;
-         int nparms = sscanf(p, "%d,%d,%d,%d,%d,%d",
-                             &metric.width, &metric.height, &metric.depth,
-                             &metric.italic_correction,
-                             &metric.pre_math_space,
-                             &metric.subscript_correction);
-         if (nparms < 1) {
-           t.error("bad width for `%1'", nm);
-           return 0;
+         char *c1 = strtok(t.buf, WS);
+         if (c1 == 0)
+           continue;
+         char *c2 = strtok(0, WS);
+         if (c2 == 0) {
+           command = c1;
+           break;
          }
          p = strtok(0, WS);
          if (p == 0) {
-           t.error("missing character type for `%1'", nm);
+           t.error("missing kern amount");
            return 0;
          }
-         int type;
-         if (sscanf(p, "%d", &type) != 1) {
-           t.error("bad character type for `%1'", nm);
+         int n;
+         if (sscanf(p, "%d", &n) != 1) {
+           t.error("bad kern amount `%1'", p);
            return 0;
          }
-         if (type < 0 || type > 255) {
-           t.error("character type `%1' out of range", type);
-           return 0;
+         glyph *g1 = name_to_glyph(c1);
+         glyph *g2 = name_to_glyph(c2);
+         add_kern(g1, g2, n);
+       }
+      }
+      else if (strcmp(command, "charset") == 0) {
+       had_charset = 1;
+       glyph *last_glyph = NULL;
+       for (;;) {
+         if (!t.next()) {
+           command = 0;
+           break;
          }
-         metric.type = type;
+         char *nm = strtok(t.buf, WS);
+         if (nm == 0)
+           continue;                   // I dont think this should happen
          p = strtok(0, WS);
          if (p == 0) {
-           t.error("missing code for `%1'", nm);
-           return 0;
-         }
-         char *ptr;
-         metric.code = (int)strtol(p, &ptr, 0);
-         if (metric.code == 0 && ptr == p) {
-           t.error("bad code `%1' for character `%2'", p, nm);
-           return 0;
-         }
-         p = strtok(0, WS);
-         if ((p == NULL) || (strcmp(p, "--") == 0)) {
-           metric.special_device_coding = NULL;
-         }
-         else {
-           char *nam = new char[strlen(p) + 1];
-           strcpy(nam, p);
-           metric.special_device_coding = nam;
+           command = nm;
+           break;
          }
-         if (strcmp(nm, "---") == 0) {
-           last_glyph = number_to_glyph(metric.code);
-           add_entry(last_glyph, metric);
+         if (p[0] == '"') {
+           if (last_glyph == NULL) {
+             t.error("first charset entry is duplicate");
+             return 0;
+           }
+           if (strcmp(nm, "---") == 0) {
+             t.error("unnamed character cannot be duplicate");
+             return 0;
+           }
+           glyph *g = name_to_glyph(nm);
+           copy_entry(g, last_glyph);
          }
          else {
-           last_glyph = name_to_glyph(nm);
-           add_entry(last_glyph, metric);
-           copy_entry(number_to_glyph(metric.code), last_glyph);
+           font_char_metric metric;
+           metric.height = 0;
+           metric.depth = 0;
+           metric.pre_math_space = 0;
+           metric.italic_correction = 0;
+           metric.subscript_correction = 0;
+           int nparms = sscanf(p, "%d,%d,%d,%d,%d,%d",
+                               &metric.width, &metric.height, &metric.depth,
+                               &metric.italic_correction,
+                               &metric.pre_math_space,
+                               &metric.subscript_correction);
+           if (nparms < 1) {
+             t.error("bad width for `%1'", nm);
+             return 0;
+           }
+           p = strtok(0, WS);
+           if (p == 0) {
+             t.error("missing character type for `%1'", nm);
+             return 0;
+           }
+           int type;
+           if (sscanf(p, "%d", &type) != 1) {
+             t.error("bad character type for `%1'", nm);
+             return 0;
+           }
+           if (type < 0 || type > 255) {
+             t.error("character type `%1' out of range", type);
+             return 0;
+           }
+           metric.type = type;
+           p = strtok(0, WS);
+           if (p == 0) {
+             t.error("missing code for `%1'", nm);
+             return 0;
+           }
+           char *ptr;
+           metric.code = (int)strtol(p, &ptr, 0);
+           if (metric.code == 0 && ptr == p) {
+             t.error("bad code `%1' for character `%2'", p, nm);
+             return 0;
+           }
+           p = strtok(0, WS);
+           if ((p == NULL) || (strcmp(p, "--") == 0)) {
+             metric.special_device_coding = NULL;
+           }
+           else {
+             char *nam = new char[strlen(p) + 1];
+             strcpy(nam, p);
+             metric.special_device_coding = nam;
+           }
+           if (strcmp(nm, "---") == 0) {
+             last_glyph = number_to_glyph(metric.code);
+             add_entry(last_glyph, metric);
+           }
+           else {
+             last_glyph = name_to_glyph(nm);
+             add_entry(last_glyph, metric);
+             copy_entry(number_to_glyph(metric.code), last_glyph);
+           }
          }
        }
+       if (last_glyph == NULL) {
+         t.error("I didn't seem to find any characters");
+         return 0;
+       }
       }
-      if (last_glyph == NULL) {
-       t.error("I didn't seem to find any characters");
+      else {
+       t.error("unrecognised command `%1' after `kernpairs' or `charset' 
command",
+               command);
        return 0;
       }
     }
-    else {
-      t.error("unrecognised command `%1' after `kernpairs' or `charset' 
command",
-             command);
-      return 0;
-    }
+    compact();
   }
-  if (!had_charset) {
+  if (!is_unicode && !had_charset) {
     t.error("missing charset command");
     return 0;
   }
   if (space_width == 0)
     space_width = scale_round(unitwidth, res, 72*3*sizescale);
-  compact();
   return 1;
 }
 
@@ -995,6 +1150,8 @@
       tcommand = 1;
     else if (strcmp("use_charnames_in_special", p) == 0)
       use_charnames_in_special = 1;
+    else if (strcmp("unicode", p) == 0)
+      is_unicode = 1;
     else if (strcmp("image_generator", p) == 0) {
       p = strtok(0, WS);
       if (!p) {
diff -r -c3 groff-20060217.orig/src/libs/libgroff/fontfile.cpp 
groff-20060217/src/libs/libgroff/fontfile.cpp
--- groff-20060217.orig/src/libs/libgroff/fontfile.cpp  2005-07-07 
13:16:42.000000000 +0200
+++ groff-20060217/src/libs/libgroff/fontfile.cpp       2006-02-20 
01:23:30.000000000 +0100
@@ -1,5 +1,5 @@
 // -*- C++ -*-
-/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2004
+/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2004, 2006
    Free Software Foundation, Inc.
      Written by James Clark (address@hidden)
 
@@ -47,6 +47,7 @@
 int font::pass_filenames = 0;
 int font::unscaled_charwidths = 0;
 int font::use_charnames_in_special = 0;
+int font::is_unicode = 0;
 const char *font::image_generator = NULL;
 const char **font::font_name_table = 0;
 int *font::sizes = 0;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]