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