[JM:00481] Re: SIGNAL(7) の内容に関しまして

Back to archive index

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, "&plusmn;", NULL  }, /* plus minus */
     { V('R',' '), 1, "&#174;", NULL },
     { V('R','q'), 1, "&rdquo;", NULL  }, /* right double quote  */
+    { V('T','m'), 2, "&#153;", 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 */



linuxjm-discuss メーリングリストの案内
Back to archive index