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

[mgp-users-jp 00681] [patch] %suffix command



梶山です。

MagicPoint 1.06a を使っています。

行頭に空白を空けるには %prefix コマンドを使いますが、行末に空白
を空けるコマンドが欲しいと思いましたので、%suffix というコマンド
を追加してみました。以下にパッチを添付しますので、興味のある方は
どうぞ。

%leftfill で本文を書くと画面の右側に空白が多くなり、すかすかして
さみしい気がします。そこで画面の右側に模様の入った画像を %bimage 
で表示してみたのですが、長い行は画面の右端で折り返しされるので、
文字と模様とが重なってしまいます。これを回避するうまい方法が思い
付かなかったので、%suffix コマンドを追加したというわけです。

%prefix と同様に、引数には空白文字から成る文字列を与えます。また、
%tab の引数として与えると、その行だけで有効になる点も %prefix と
同じです。

また、オリジナルの MagicPoint 1.06a では %tab で箇条書きにすると
行末に行頭の字下げ量の半分のスペースが空くようになっていますが、
これを %suffix コマンドで指定されたスペースを空けるように変更し
ました (したがってパッチの適用前と適用後とでは表示結果が異なるこ
とがあります)。

%suffix コマンドは %prefix の実装をそのまま模倣しただけの安易な
ものです。スペースの幅を計算する方法が分からなかったので、その
部分は特に ad hoc です。何か副作用があるかも知れませんので、いい
方法がありましたら教えて下さい (^^;

#こういうパッチの送り先はこちらでよろしいのでしょうか?

-- 
KAJIYAMA, Tamito <kajiyama@grad.sccs.chukyo-u.ac.jp>


mgp106a-suffix.patch
====================
KAJIYAMA, Tamito <kajiyama@grad.sccs.chukyo-u.ac.jp>
December 19, 1999

MagicPoint 1.06a に行末を空けるための %suffix コマンドを追加する。
引数には %prefix と同様に空白から成る文字列を指定する。


diff -ru magicpoint-1.06a.orig/draw.c magicpoint-1.06a/draw.c
--- magicpoint-1.06a.orig/draw.c	Wed Jul 28 18:55:07 1999
+++ magicpoint-1.06a/draw.c	Sun Dec 19 20:25:42 1999
@@ -598,10 +598,18 @@
 		state->curprefix = cp->ctc_value;
 		break;
 
+	case CTL_SUFFIX:
+		state->cursuffix = cp->ctc_value;
+		break;
+
 	case CTL_TABPREFIX:
 		state->tabprefix = cp->ctc_value;
 		break;
 
+	case CTL_TABSUFFIX:
+		state->tabsuffix = cp->ctc_value;
+		break;
+
 	case CTL_PREFIXPOS:
 	    {
 		char *p;
@@ -613,6 +621,23 @@
 		break;
 	    }
 
+	case CTL_SUFFIXPOS:
+	    {
+		char *p;
+		int linewidth;
+
+		p = (state->tabsuffix) ? state->tabsuffix : state->cursuffix;
+		if (!p) {
+			state->rightfillpos = 0;
+			break;
+		}
+		linewidth = state->linewidth;  /* save */
+		draw_line_output(state, p);
+		state->rightfillpos = state->linewidth - linewidth;
+		state->linewidth = linewidth;  /* restore */
+		break;
+	    }
+
 	case CTL_TEXT:
 		if (!cp->ctc_value)
 			break;
@@ -676,6 +701,7 @@
 		draw_line_end(state);
 		/* reset single-line oriented state */
 		state->tabprefix = NULL;
+		state->tabsuffix = NULL;
 		state->special = 0;
 		if (state->align == AL_LEFTFILL1) {
 			state->align = AL_LEFTFILL0;
@@ -1220,7 +1246,7 @@
 		state->linewidth += HORIZ_STEP(char_size[caching], char_len);
 	}
 
-	if (state->width - state->leftfillpos / 2 < state->linewidth
+	if (state->width - state->rightfillpos < state->linewidth
 #if 0
 	 && state->align == AL_LEFTFILL1
 #endif
diff -ru magicpoint-1.06a.orig/globals.c magicpoint-1.06a/globals.c
--- magicpoint-1.06a.orig/globals.c	Sun Jul  4 00:52:43 1999
+++ magicpoint-1.06a/globals.c	Sun Dec 19 19:36:40 1999
@@ -116,8 +116,11 @@
 /*CTL*/	{ CTL_GAP,		T_INT,	"gap", 3 },
 /*CTL*/	{ CTL_PAUSE,		T_SP,	"pause", 5 },
 /*CTL*/	{ CTL_PREFIX,		T_STR,	"prefix", 6 },
+/*CTL*/	{ CTL_SUFFIX,		T_STR,	"suffix", 6 },
 /*CTL*/	{ CTL_TABPREFIX,	T_STR,	"*tabprefix*", 11 },
+/*CTL*/	{ CTL_TABSUFFIX,	T_STR,	"*tabsuffix*", 11 },
 /*CTL*/	{ CTL_PREFIXPOS,	T_VOID,	"*prefixpos*", 11 },
+/*CTL*/	{ CTL_SUFFIXPOS,	T_VOID,	"*suffixpos*", 11 },
 /*CTL*/	{ CTL_AGAIN,		T_VOID,	"again", 5 },
 /*CTL*/	{ CTL_CCOLOR,		T_LONG,	"ccolor", 6 },
 /*CTL*/	{ CTL_BAR,		T_SP,	"bar", 3 },
diff -ru magicpoint-1.06a.orig/grammar.y magicpoint-1.06a/grammar.y
--- magicpoint-1.06a.orig/grammar.y	Tue Jun  8 16:08:40 1999
+++ magicpoint-1.06a/grammar.y	Sun Dec 19 18:55:51 1999
@@ -660,7 +660,7 @@
 %token KW_NOOP KW_DEFAULT KW_TAB KW_SIZE KW_FORE KW_BACK KW_LEFT KW_CENTER
 %token KW_RIGHT KW_SHRINK KW_LCUTIN KW_RCUTIN KW_CONT KW_NODEF KW_XFONT
 %token KW_VFONT KW_IMAGE KW_BIMAGE KW_PAGE KW_HGAP KW_VGAP KW_GAP KW_PAUSE
-%token KW_PREFIX KW_AGAIN KW_CCOLOR KW_BAR KW_INCLUDE KW_BGRAD KW_TEXT
+%token KW_PREFIX KW_SUFFIX KW_AGAIN KW_CCOLOR KW_BAR KW_INCLUDE KW_BGRAD KW_TEXT
 %token KW_LINESTART KW_LINEEND KW_MARK KW_SYSTEM KW_FILTER KW_ENDFILTER
 %token KW_QUALITY KW_ICON KW_LEFTFILL KW_XSYSTEM KW_VFCAP KW_TFONT KW_TFDIR
 %token KW_DEFFONT KW_FONT KW_TFONT0 KW_EMBED KW_ENDEMBED KW_NEWIMAGE
@@ -834,6 +834,13 @@
 			  }
 			}
 	| KW_PREFIX STR	{ $$ = gen_str(CTL_PREFIX, $2); }
+	| KW_SUFFIX ID	{ char *p;
+			  $$ = gen_str(CTL_SUFFIX, $2);
+			  for (p = $$->ctc_value; *p; p++) {
+				if (*p == '_') *p = ' ';
+			  }
+			}
+	| KW_SUFFIX STR	{ $$ = gen_str(CTL_SUFFIX, $2); }
 	| KW_NEWIMAGE args
 			{ $$ = gen_newimage($2); }
 	| KW_IMAGE STRorID WINSIZ
diff -ru magicpoint-1.06a.orig/mgp.h magicpoint-1.06a/mgp.h
--- magicpoint-1.06a.orig/mgp.h	Sun Jul  4 00:52:44 1999
+++ magicpoint-1.06a/mgp.h	Sun Dec 19 19:35:59 1999
@@ -364,10 +364,13 @@
 		 * PAGE    - doing page_control
 		 */
 	char *curprefix;
+	char *cursuffix;
 	char *tabprefix;
+	char *tabsuffix;
 	u_int align;
 	u_int special;
 	u_int leftfillpos;
+	u_int rightfillpos;
 
 	/*
 	 * state of the renderer
diff -ru magicpoint-1.06a.orig/parse.c magicpoint-1.06a/parse.c
--- magicpoint-1.06a.orig/parse.c	Sat Jun 26 22:05:07 1999
+++ magicpoint-1.06a/parse.c	Sun Dec 19 19:47:40 1999
@@ -721,10 +721,13 @@
 	}
 
 	/* CTL_PREFIX in tab_control should be CTL_TABPREFIX. */
+	/* CTL_SUFFIX in tab_control should be CTL_TABSUFFIX. */
 	for (l = 0; l < MAXTAB + MAXSTYLE; l++) {
 		for (cp = tab_control[l]; cp; cp = cp->ct_next) {
 			if (cp->ct_op == CTL_PREFIX)
 				cp->ct_op = CTL_TABPREFIX;
+			if (cp->ct_op == CTL_SUFFIX)
+				cp->ct_op = CTL_TABSUFFIX;
 		}
 	}
 }
@@ -779,6 +782,8 @@
 	tmpstr[2]->ctc2_value2 = strdup("iso8859-1");
 	tmpstr[3] = ctlalloc1(CTL_NOOP);	/* CTL_TFONT */
 	tmpstr[3]->ctc_value = strdup("");
+	tmpstr[4] = ctlalloc1(CTL_SUFFIX);
+	tmpstr[4]->ctc_value = strdup("");
 	tmplong[0] = ctlalloc1(CTL_FORE);
 	get_color(DEFAULT_FORE, &tmplong[0]->ctl_value);
 	tmplong[1] = ctlalloc1(CTL_BACK);
@@ -853,6 +858,7 @@
 			     cp = cp->ct_next) {
 				switch (cp->ct_op) {
 				case CTL_PREFIX: tmpstr[0] = cp; break;
+				case CTL_SUFFIX: tmpstr[4] = cp; break;
 				case CTL_VFONT: tmpstr[1] = cp; break;
 				case CTL_TFONT: tmpstr[3] = cp; break;
 				case CTL_XFONT2:
@@ -1152,7 +1158,7 @@
 		}
 	}
 
-	/* find where to put PREFIX. */
+	/* find where to put PREFIX and SUFFIX. */
 	for (page = 1; page <= maxpage; page++) {
 		line = page_attribute[page].pg_linenum;
 		for (l = 0; l <= line; l++) {
@@ -1175,6 +1181,13 @@
 				continue;
 
 			cp2 = ctlalloc1(CTL_PREFIXPOS);
+			if (!cp2)
+				continue;
+
+			cp2->ct_next = cp->ct_next;
+			cp->ct_next = cp2;
+
+			cp2 = ctlalloc1(CTL_SUFFIXPOS);
 			if (!cp2)
 				continue;
 
diff -ru magicpoint-1.06a.orig/scanner.l magicpoint-1.06a/scanner.l
--- magicpoint-1.06a.orig/scanner.l	Mon Jun  7 02:55:19 1999
+++ magicpoint-1.06a/scanner.l	Sun Dec 19 18:55:57 1999
@@ -137,6 +137,7 @@
 (GAP|gap)		return KW_GAP;
 (PAUSE|pause)		return KW_PAUSE;
 (PREFIX|prefix)		return KW_PREFIX;
+(SUFFIX|suffix)		return KW_SUFFIX;
 (AGAIN|again)		return KW_AGAIN;
 (CCOLOR|ccolor)		return KW_CCOLOR;
 (BAR|bar)		return KW_BAR;