R4000 2.2
tati****@kc5*****
2011年 10月 28日 (金) 15:32:20 JST
こんにちは、立花@鎌ヶ谷市です。 In <20111****@kc5*****>, at Date: Wed, 26 Oct 2011 04:46:30 +0900 (JST), on Subject: [JM:00478] Re: SIGNAL(7) の内容に関しまして , "R4000 2.2" <tati****@kc5*****> writes: | | 方向性を変えて、ディストリビューション独自のパッチを調査してみたところ、 | | 最初に見た Debian の man2html で関係ありそうな箇所を発見しました。 | | パッチの内容を確認したところ、その通りのようです。 | | ------------------------------------------------------------ | | man2html (1.6e-2) unstable; urgency=low | | * 028-man2html-segfault (new): fix segfault when viewing groff(7) page. | | ------------------------------------------------------------ | | # ご興味があれば apt-get source man2html でソースを取得して、 | | # man2html-1.6g/debian/patches/028-man2html-segfault.patch を参照下さい。 | | # これだと思います。 | | 手元は Plamo で apt とか無いので、Googleってとってきて見ました。 | どうもオリジナルソースにない部分への変更があるなぁ、とこれまた | Googleって man2html_1.6g-5.debian.tar.gz をとってきてみると、 | いやあ盛大に patch があたってますねぇ。 手元の man-1.6g に全部当てて、その上で元木さんの修正や自分の修正を 加えて試してみました。 grolbp.1 groff_tmac.5 groff.7 man.7 roff.7 signal.7 suffixes.7 全て期待どおりになったようです。 Debian のパッチが当たった上へのパッチファイルを作ってみましたので、 添付します。 034-JM1.patch … strdef.c への (Tm への対応 035-JM2.patch … man2html.c への signal.7, suffixes.7 への対応 036-JM3.patch … man2html.c への grolbp.1 への対応 -- tati****@kc5***** 立花 晃@鎌ヶ谷市 -------------- next part -------------- diff -ruN man-1.6g-2/man2html/strdefs.c.orig man-1.6g-2/man2html/strdefs.c --- man-1.6g-2/man2html/strdefs.c.orig 2011-10-28 14:38:43.000000000 +0900 +++ man-1.6g-2/man2html/strdefs.c 2011-10-28 14:39:41.000000000 +0900 @@ -44,6 +44,7 @@ { V('P','m'), 1, "±", NULL }, /* plus minus */ { V('R',' '), 1, "®", NULL }, { V('R','q'), 1, "”", NULL }, /* right double quote */ + { V('T','m'), 2, "™", NULL }, { V('a','a'), 1, "'", NULL }, /* accute accent */ { V('g','a'), 1, "`", NULL }, /* grave accent */ { V('l','q'), 2, "``", NULL }, -------------- next part -------------- diff -ruN man-1.6g-2/man2html/man2html.c.orig man-1.6g-2/man2html/man2html.c --- man-1.6g-2/man2html/man2html.c.orig 2011-10-28 14:42:28.000000000 +0900 +++ man-1.6g-2/man2html/man2html.c 2011-10-28 15:00:24.000000000 +0900 @@ -958,7 +958,7 @@ *maxcol=0; currow=layout; while (currow) { - curfield=layout->first; + curfield=currow->first; i=0; while (curfield) { i++; @@ -999,6 +999,21 @@ } } +/* Check if the specified row contain at least one data item. + 1: has data item + 0: no data item + */ +static int +row_has_data(TABLEROW *currow) { + TABLEITEM *curfield; + curfield = currow->first; + while (curfield) { + if (curfield->align != '_') return 1; + curfield = curfield->next; + } + return 0; +} + char itemreset[20]="\\fR\\s0"; static char * @@ -1083,7 +1098,9 @@ } while (curfield && curfield->align=='S'); } if (c[1]=='\n') { - currow=next_row(currow); + do { + currow=next_row(currow); + } while (!row_has_data(currow)); curfield=currow->first; } c=c+2; @@ -1106,7 +1123,9 @@ } else if (g) free(g); if (c[-1]=='\n') { - currow=next_row(currow); + do { + currow=next_row(currow); + } while (!row_has_data(currow)); curfield=currow->first; } } else if (*c=='.' && c[1]=='T' && c[2]=='&' && c[-1]=='\n') { @@ -1119,7 +1138,9 @@ hr->prev=currow; currow->next=hr; currow=hr; - next_row(currow); + do { + currow=next_row(currow); + } while (!row_has_data(currow)); curfield=currow->first; } else if (*c=='.' && c[1]=='T' && c[2]=='E' && c[-1]=='\n') { finished=1; @@ -1148,6 +1169,9 @@ h=h+3; } else { g=NULL; + /* skip leading spaces to ignore unnecessary <BR> */ + while (*h==' ') + h++; h=scan_troff(h,1,&g); scan_troff(itemreset,0,&g); if (curfield) { @@ -1160,7 +1184,9 @@ if (i) *c=itemsep; c=h; if (c[-1]=='\n') { - currow=next_row(currow); + do { + currow=next_row(currow); + } while (!row_has_data(currow)); curfield=currow->first; } } -------------- next part -------------- diff -ruN man-1.6g-2/man2html/man2html.c.orig man-1.6g-2/man2html/man2html.c --- man-1.6g-2/man2html/man2html.c.orig 2011-10-28 15:12:20.000000000 +0900 +++ man-1.6g-2/man2html/man2html.c 2011-10-28 15:15:03.000000000 +0900 @@ -868,6 +868,7 @@ } char *scan_expression(char *c, int *result); +char itemsep='\t'; static char *scan_format(char *c, TABLEROW **result, int *maxcol) { @@ -941,13 +942,18 @@ curfield->space=i; break; case ',': case '\n': - currow->next=(TABLEROW*)xmalloc(sizeof(TABLEROW)); - currow->next->prev=currow; - currow=currow->next; - currow->next=NULL; - curfield=currow->first=(TABLEITEM*)xmalloc(sizeof(TABLEITEM)); - *curfield=emptyfield; c++; + while (*c==',' || *c=='\n' || *c=='\t' || *c==itemsep) { + c++; + } + if ( *c != '.' ) { + currow->next=(TABLEROW*)xmalloc(sizeof(TABLEROW)); + currow->next->prev=currow; + currow=currow->next; + currow->next=NULL; + curfield=currow->first=(TABLEITEM*)xmalloc(sizeof(TABLEITEM)); + *curfield=emptyfield; + } break; default: c++; @@ -1023,7 +1029,6 @@ int center=0, expand=0, box=0, border=0, linesize=1; int i,j,maxcol=0, finished=0; int oldfont, oldsize,oldfillout; - char itemsep='\t'; TABLEROW *layout=NULL, *currow; TABLEITEM *curfield; while (*c++!='\n'); /* skip TS */