1 /*
2  * Copyright (C) 1991,1992 NEC Corporation.
3  */
4 #ifndef lint
5 static char rcsid[] =
6 	"$Id: title.c,v 2.15 1994/04/19 10:17:10 uchida Exp $ (NEC)";
7 #endif
8 
9 #include <stdio.h>
10 #include "plain2.h"
11 /*
12  * �����Ϥ���Ƭ�ˤ��륿���ȥ����β���
13  */
14 #define	MAX_TITLE_LEN	64	/* �����ȥ�֥�å��κ���Կ�	*/
15 #define	MAX_ENTRY_LEN	16	/* �ƥ���ȥ�κ���Կ�		*/
16 /*
17  * �����ȥ�֥�å��Υ���ȥ����
18  */
19 #define TENT_TITLE		1
20 #define TENT_NUMBER		2
21 #define TENT_DATE		3
22 #define TENT_SHOZOKU		4
23 #define TENT_HAIFU		5
24 #define TENT_NAME		6
25 #define TENT_RENRAKU		7
26 
27 #ifdef	TITLE_SPECIAL
28 #define	TENT_SPECIAL1		1
29 #define	TENT_SPECIAL2		2
30 #define	TENT_SPECIAL3		3
31 #define	TENT_SPECIAL4		4
32 #define	TENT_SPECIAL5		5
33 #define	TENT_SPECIAL6		6
34 #define	TENT_SPECIAL7		7
35 #define	TENT_SPECIAL8		8
36 #define	TENT_SPECIAL9		9
37 #define	TENT_MAX		9	/* �̾�Υ���ȥ�Ϥ����ޤ�	*/
38 #else
39 #define	TENT_MAX		7	/* �̾�Υ���ȥ�Ϥ����ޤ�	*/
40 #endif
41 
42 /* ����ȥ���Τ���Υ���ȥ�	*/
43 #define TENT_STYLE		(TENT_MAX + 1)
44 #define TENT_OPTION		(TENT_MAX + 2)
45 #define TENT_COMMENT		(TENT_MAX + 3)
46 
47 char *titleElements[TENT_MAX+1][MAX_ENTRY_LEN];
48 struct	titleText{
49 	char	*body;
50 	int	kind;
51 	int	outlooks;
52 } htext[MAX_TITLE_LEN];
53 struct	titleKey {
54 	char	*pattern;
55 	short	kind;
56 #define	S_ALL		1
57 #define	S_FROMRIGHT	2
58 #define	S_FROMLEFT	3
59 #define	S_CONTROL	4
60 	short	outlooks;
61 	short	value;
62 #define	W_ANYWHERE	1
63 #define	W_BEGIN		2
64 	short	where;
65 } titleKeyTbl[] = {
66 #ifdef	NEC_CCS
67 	/*
68 	 * NEC C&C Common software dependent
69 	 */
70 	"a471",		TENT_STYLE,	S_CONTROL,	TITLE_A47_1, W_BEGIN,
71 	"A471",		TENT_STYLE,	S_CONTROL,	TITLE_A47_1, W_BEGIN,
72 	"shounin",	TENT_STYLE,	S_CONTROL,	TITLE_A47_1, W_BEGIN,
73 	"a47",		TENT_STYLE,	S_CONTROL,	TITLE_A47,   W_BEGIN,
74 	"A47",		TENT_STYLE,	S_CONTROL,	TITLE_A47,   W_BEGIN,
75 #endif
76 #ifdef	TITLE_SPECIAL
77 	"����1",	TENT_SPECIAL1,	S_FROMRIGHT,	0,	W_ANYWHERE,
78 	"����2",	TENT_SPECIAL2,	S_FROMRIGHT,	0,	W_ANYWHERE,
79 	"����3",	TENT_SPECIAL3,	S_FROMRIGHT,	0,	W_ANYWHERE,
80 	"����4",	TENT_SPECIAL4,	S_FROMRIGHT,	0,	W_ANYWHERE,
81 	"����5",	TENT_SPECIAL5,	S_FROMRIGHT,	0,	W_ANYWHERE,
82 	"����6",	TENT_SPECIAL6,	S_FROMRIGHT,	0,	W_ANYWHERE,
83 	"����7",	TENT_SPECIAL7,	S_FROMRIGHT,	0,	W_ANYWHERE,
84 	"����8",	TENT_SPECIAL8,	S_FROMRIGHT,	0,	W_ANYWHERE,
85 	"����9",	TENT_SPECIAL9,	S_FROMRIGHT,	0,	W_ANYWHERE,
86 #endif
87 	"comment",	TENT_COMMENT,	S_CONTROL,	0,	W_BEGIN,
88 	"option",	TENT_OPTION,	S_CONTROL,	0,	W_BEGIN,
89 	"��̾",		TENT_TITLE,	S_FROMRIGHT,	0,	W_ANYWHERE,
90 	"��",		TENT_TITLE,	S_ALL,		0,	W_ANYWHERE,
91 	"��",		TENT_TITLE,	S_ALL,		0,	W_ANYWHERE,
92 	"������",	TENT_HAIFU,	S_FROMRIGHT,	0,	W_ANYWHERE,
93 	"������",	TENT_HAIFU,	S_FROMRIGHT,	0,	W_ANYWHERE,
94 	"�ư�",		TENT_HAIFU,	S_ALL,		0,	W_ANYWHERE,
95 	"ô��",		TENT_NAME,	S_FROMRIGHT,	0,	W_ANYWHERE,
96 	"����",		TENT_NAME,	S_FROMRIGHT,	0,	W_ANYWHERE,
97 	"by",		TENT_NAME,	S_FROMRIGHT,	0,	W_ANYWHERE,
98 	"��°",		TENT_SHOZOKU,	S_FROMRIGHT,	0,	W_ANYWHERE,
99 	"����",		TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
100 	"��ȯ��",	TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
101 	"������",	TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
102 	"�����",	TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
103 	"������",	TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
104 /* Add Nide */
105 	"���",		TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
106 	"����",		TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
107 	"�ز�",		TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
108 	"���漼",	TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
109 /* Add Nide end */
110 	"ʸ���ֹ�",	TENT_NUMBER,	S_FROMRIGHT,	0,	W_ANYWHERE,
111 	"����",		TENT_DATE,	S_FROMRIGHT,	0,	W_ANYWHERE,
112 	"��",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
113 	"��",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
114 	"Ϣ����",	TENT_RENRAKU,	S_FROMRIGHT,	0,	W_ANYWHERE,
115 	"contact",	TENT_RENRAKU,	S_FROMRIGHT,	0,	W_ANYWHERE,
116 	"��",		TENT_HAIFU,	S_ALL,		0,	W_ANYWHERE,
117 	"��",		TENT_HAIFU,	S_ALL,		0,	W_ANYWHERE,
118 	"TEL",		TENT_RENRAKU,	S_ALL,		0,	W_ANYWHERE,
119 	"tel",		TENT_RENRAKU,	S_ALL,		0,	W_ANYWHERE,
120 	"Tel",		TENT_RENRAKU,	S_ALL,		0,	W_ANYWHERE,
121 	"90/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
122 	"91/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
123 	"92/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
124 	"93/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
125 	"94/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
126 	"95/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
127 	"96/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
128 	"97/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
129 	"98/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
130 	"99/",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
131 	"/90",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
132 	"/91",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
133 	"/92",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
134 	"/93",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
135 	"/94",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
136 	"/95",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
137 	"/96",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
138 	"/97",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
139 	"/98",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
140 	"/99",		TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
141 /* Add Nide */
142 	"2000/",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
143 	"2001/",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
144 	"2002/",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
145 	"2003/",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
146 	"2004/",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
147 	"/2000",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
148 	"/2001",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
149 	"/2002",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
150 	"/2003",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
151 	"/2004",	TENT_DATE,	S_ALL,		0,	W_ANYWHERE,
152 /* Add Nide end */
153 #ifdef	NEC_CCS
154 	"����",		TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
155 	"����",		TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
156 	"����",		TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
157 	"��輼",	TENT_SHOZOKU,	S_ALL,		0,	W_ANYWHERE,
158 	"��E",		TENT_NUMBER,	S_ALL,		0,	W_ANYWHERE,
159 	"��M",		TENT_NUMBER,	S_ALL,		0,	W_ANYWHERE,
160 #endif
161 };
162 /*
163  * ʸ�����ɤ줫�Υ���ȥ�˥ޥå����뤫Ĵ�٤�
164  */
keyWordMatch(str,kind,outlooks,val)165 keyWordMatch(str, kind, outlooks, val)
166 char	*str;
167 int	*kind;
168 int	*outlooks;
169 int	*val;
170 {
171 	int	i;
172 	char	*s;
173 	*kind = *outlooks = *val = 0;
174 	for (i=0; i<sizeof(titleKeyTbl)/sizeof(struct titleKey); i++) {
175 		for (s = str; *s != '\0'; s++){
176 			if (strncmp(titleKeyTbl[i].pattern, s,
177 				    strlen(titleKeyTbl[i].pattern)) == 0) {
178 				DBG2(8, "title Matched <%s>%s\n",
179 					titleKeyTbl[i].pattern, s);
180 				*kind     = titleKeyTbl[i].kind;
181 				*outlooks = titleKeyTbl[i].outlooks;
182 				*val      = titleKeyTbl[i].value;
183 				return;
184 			}
185 			if (titleKeyTbl[i].where == W_BEGIN)
186 				/* ���Υѥ�����ϹԤ���Ƭ����Ϥޤ�ʤ����
187 				 * �ʤ�ʤ�
188 				 */
189 				break;
190 		}
191 	}
192 }
193 /*
194  * �����ȥ�֥�å���̵ͭ��Ĵ�٤�
195  * �����ȥ�֥�å������ä���硤�����������֤����ʤ��ä�����
196  * ���Τޤ���Ƭ���֤�
197  */
getTitleBlock(begin,end)198 getTitleBlock(begin, end)
199 int	begin;
200 int	end;
201 {
202 	int	l, val;
203 	/* �֥�å���Ǻǽ�ζ��Ԥ�õ��		*/
204 	for (l = begin; l < end; l++)
205 		if (texts[l]->length == 0)
206 			break;
207 	end = l;
208 	if (end - begin > MAX_TITLE_LEN)
209 		/* �֥�å��Կ���Ĺ�᤮��Τǽ�������	*/
210 		return begin;
211 	for (l = begin; l < end; l++) {
212 		keyWordMatch(texts[l]->body + texts[l]->indent,
213 			     &(htext[l].kind), &(htext[l].outlooks),
214 			     &val);
215 		DBG3(3,"TITLE %d:%d = %d\n", htext[l].kind,
216 			htext[l].outlooks, val);
217 		if (htext[l].kind ==  TENT_STYLE){
218 			DBG1(3,"TITLE Control = %d\n", val);
219 			titleStyle = val;
220 		}
221 		else if (htext[l].kind ==  TENT_OPTION){
222 			char	*s;
223 			s = texts[l]->body + texts[l]->indent;
224 			DBG1(3,"TITLE Option = %s\n", s);
225 			while (*s != '\0' && *s != ' ')
226 				s++;
227 			if (optionLine(s)) {
228 				(void)fprintf(stderr,
229 					      "Illegal option in %s\n%s\n",
230 					      fname, s);
231 				exit(1);
232 			}
233 		}
234 		if (htext[l].kind != 0)
235 			switch (htext[l].outlooks) {
236 			    case S_ALL:
237 				/* �����Τ�Ȥ�	*/
238 				htext[l].body =
239 					texts[l]->body + texts[l]->indent;
240 				DBG2(6,"Title Hit %d %s\n", htext[l].kind,
241 					htext[l].body);
242 				break;
243 			    case S_FROMRIGHT:
244 				/* ��ü����ǽ�ζ���ޤǤ�Ȥ�	*/
245 				{
246 					char	*s, *single_sp;
247 					s =  texts[l]->body + texts[l]->length
248 						- 1;
249 					single_sp = s;
250 					while (s > texts[l]->body + texts[l]->indent) {
251 						if (*s != ' ')
252 							break;
253 						s--;
254 					}
255 					while (s > texts[l]->body + texts[l]->indent) {
256 						if (*s == ' ')
257 							single_sp = s;
258 						if (*s == ' '
259 						    && *(s - 1) == ' ')
260 							break;
261 						s--;
262 					}
263 					if (s == texts[l]->body + texts[l]->indent)
264 						s = single_sp;
265 					htext[l].body = ++s;
266 					DBG2(6, "Title Hit %d %s\n", htext[l].kind,
267 						htext[l].body);
268 					break;
269 				}
270 			    case S_FROMLEFT:
271 				/* ��ü����ǽ�ζ���ޤǤ�Ȥ�	*/
272 				fprintf(stderr, "PANIC(unknown title entry)\n");
273 				exit(2);
274 			    default:
275 				break;
276 			}
277 	}
278 	saveTitleBody(begin, end, TENT_HAIFU);
279 	saveTitleBody(begin, end, TENT_TITLE);
280 	saveTitleBody(begin, end, TENT_SHOZOKU);
281 	saveTitleBody(begin, end, TENT_NUMBER);
282 	saveTitleBody(begin, end, TENT_DATE);
283 	saveTitleBody(begin, end, TENT_NAME);
284 	saveTitleBody(begin, end, TENT_RENRAKU);
285 #ifdef	TITLE_SPECIAL
286 	saveTitleBody(begin, end, TENT_SPECIAL8);
287 	saveTitleBody(begin, end, TENT_SPECIAL9);
288 #endif
289 	for (l = begin; l < end; l++)
290 		if (htext[l].kind == 0) {
291 			titleStyle = 0;
292 			return begin;
293 		}
294 	return end;
295 }
296 /*
297  * �����ȥ뤫��ξü�γ�̤������
298  */
299 char	*
deleteParen(str)300 deleteParen(str)
301 char	*str;
302 {
303 	char	*s;
304 	if (strncmp(str,"��", 2) == 0) {
305 		for (s=str; *s!= '\0'; s++)
306 			if (strncmp(s,"��", 2) == 0) {
307 				*s = '\0';
308 				return str+2;
309 			}
310 	}
311 	if (strncmp(str,"��", 2) == 0) {
312 		for (s=str; *s!= '\0'; s++)
313 			if (strncmp(s,"��", 2) == 0) {
314 				*s = '\0';
315 				return str+2;
316 			}
317 	}
318 	return str;
319 }
320 /*
321  * �����ȥ�֥�å�����ȥꤴ�ȤΥ��ꥢ����¸����
322  */
saveTitleBody(begin,end,kind)323 saveTitleBody(begin, end, kind)
324 int	kind;
325 int	begin;
326 int	end;
327 {
328 	int	l, n;
329 	n = 0;
330 	for (l = begin; l < end; l++) {
331 		if (htext[l].kind == kind) {
332 			titleElements[kind][n] = strsave(htext[l].body);
333 			if (kind == TENT_TITLE) {
334 				titleElements[kind][n]
335 					= deleteParen(titleElements[kind][n]);
336 
337 			}
338 			if (n++ >= MAX_ENTRY_LEN)
339 				break;
340 		}
341 	}
342 	titleElements[kind][n] = NULL;
343 }
outputTitle()344 outputTitle()
345 {
346 	(*put->title)(titleStyle,
347 		      titleElements[TENT_HAIFU], titleElements[TENT_TITLE],
348 		      titleElements[TENT_SHOZOKU],titleElements[TENT_NUMBER],
349 		      titleElements[TENT_DATE],  titleElements[TENT_NAME],
350 		      titleElements[TENT_RENRAKU]
351 #ifdef	TITLE_SPECIAL
352 		      ,titleElements[TENT_SPECIAL8],
353 		      titleElements[TENT_SPECIAL9]
354 #endif
355 		      );
356 }
357