1 /* main.c */
2 /*****************************************************************************
3 �ԣ�������У�������أԣ�
4
5 �Υ����Х�����������ؿ����ѥ���������
6 *****************************************************************************/
7
8 #include "xtr.h"
9
10 static uchar *dummy = "";
11
12 /* XTR Version */
13 #if UNIX
14 uchar *xtrver;
15 #else
16 uchar *xtrver = "XTR " XTR_VER;
17 #endif
18
19 static uchar *helpmsg[] = {
20 "������ Text Processor XTR %s Copyright (C) Murakami Sinyu, 1990-92 ������",
21 "",
22 " �ԡԡԥƥ����������ġ��롦�أԣҡաա�",
23 "���Ȥ���",
24 #if UNIX
25 " xtr �ڥ��ץ���� �ġ� ��-���ޥ�� �ġ� �����ϥե����� �ġ�",
26 "",
27 "�����ץ����",
28 " --ctype=EUC ��������ʸ�������ɤ�EUC-JAPAN�ˤ���.",
29 " --ctype=SJIS ��������ʸ�������ɤ�SJIS�ˤ���.",
30 " --tmpdir=�ǥ��쥯�ȥ�̾ ���ƥ�ݥ��ե���������ǥ��쥯�ȥ�����.",
31 #else
32 " xtr ��-���ޥ�� �ġ� �����ϥե����� �ġ� ��>���ϥե������",
33 #endif
34 "",
35 "�����ޥ��",
36 " e �������ߥ��ޥ�ɤ�ͭ���ˤ���.",
37 " w�ڣ��Ԥη��(72)�� ���������ǹԤ��ޤꤿ����.",
38 " f ���Ԥεͤ���ߤ�Ԥ�.",
39 " a ����·����Ԥ�. (����ζ����Ĵ�����ƹ�����·����)",
40 " aj ����·����Ԥ�. ��ȤΥƥ����Ȥ�;ʬ�ʶ����̵��.",
41 " sj �����ϥƥ����ȹ����;ʬ�ʶ����̵�뤹��.",
42 " ac ���������.",
43 " ar ��������.",
44 " ab ��ξü·���ʶ������֡˻���.",
45 " as ���²�ʸ�֥��ڡ����������.",
46 " ss ���²�ʸ�֥��ڡ���������.",
47 " al ������ζ��ڤ�˶���Ԥ������.",
48 " ai �������ȥ���ǥ�ȥ⡼��.",
49 " i����ǥ����(0) ������������������.",
50 " h�ڥ���ǥ����(2)�� ������Σ����ܰʹߤ����������������.",
51 " ip�ڥ���ǥ����(2)�� ������κǽ�ιԤ����������������.",
52 " ii �����ϥƥ����ȤΥ���ǥ�Ȥ�̵�뤹��.",
53 " il �����ϥƥ����Ȥζ���Ԥ�̵�뤹��.",
54 " l�ڶ���Կ�(1)�� ������Կ������˽��Ϥ���.",
55 " q��/ʸ����� ���ƹԤκ�¦�ˡ�> �ɤޤ��ϻ���ʸ�����ɽ��.",
56 " t�ڥ��ֳִ�(8)�� �����֤ڡ�����Ÿ������.",
57 " s�ڥ��ֳִ�(8)�� �����ڡ����֤��Ѵ����ƽ��Ϥ���.",
58 " sz ���ʤ�٤����ѥ��ڡ�������.",
59 " sh �����ѥ��ڡ�����Ⱦ�Ѥ��Ѵ�.",
60 " sn ����ü�Υ��ڡ�����̵�뤷�ʤ�.",
61 " pg�ڥڡ����ֹ�����(1)�� ���ڡ����դ��⡼��.",
62 " p�ڼ��Υڡ����ֹ�(1)�� �����ڡ���̿��.",
63 " n��ɬ�פʻĹԿ�(4)�� ���ڡ����λĹԿ�����ʤ���в��ڡ���.",
64 " sp�ڶ���Կ�(1)�� ������Խ���̿��.",
65 " ln�ڹ��ֹ�� ���ڡ�����ι��֤���������.",
66 " pl�Կ�(58) �����ڡ����ιԿ�����ʸ�Τߡˤ����.",
67 " ph/��/���/����/�إå��Կ�(3)�� ���ڡ����إå�����.",
68 " pf/��/���/����/�եå��Կ�(3)�� ���ڡ����եå�����. (- %%p -)",
69 " ps ���ڡ����إå����եå��Ԥη���ʤ�����.",
70 " pt�Կ�(1) ���ڡ����ξ�;���̤�Կ��ǻ��ꤹ��.",
71 " pb�Կ�(1) ���ڡ����β�;���̤�Կ��ǻ��ꤹ��.",
72 " po���(0) ��ʸ�����Τ��դ��뺸;��η������ꤹ��.",
73 " pp��/�۰������ϥڡ���/������λ�ڡ�����/�ڡ����ֳ֡� ���ڡ���������ʬ����.",
74 " px ���ڡ����դ������������Ԥ�ʤ�.",
75 " pn ���ץ�����楳���ɤ���Ϥ��ʤ�.",
76 " np �����ڡ��������ɤ���Ϥ��ʤ�.",
77 #if MSDOS || WINNT || __human68k__
78 " nr �����������ɤ���Ϥ��ʤ�.",
79 #if !__human68k__
80 " pj �����Σ�ʸ���Х���Ⱦ��ʸ���ˤ���.",
81 #endif
82 #endif
83 " pm ��ʸ������������ν����Ǽ�ư���.",
84 " pv�ֹ� ���ij���⡼������.",
85 " pw�ֹ� ��������⡼������.",
86 " r/��^��{�۸���ʸ�����}��$��/�ִ�ʸ����/�ڥ⡼�ɡġ� ���ƥ������ִ����.",
87 " rc ���ִ�������ꥢ.",
88 #if 0
89 " wl�ڣ��Ԥκ���Х��ȿ�(80)�� �����Ԥ˽��Ϥ���Х��ȿ�������.",
90 " wk�ڴ������եȥ����ɤΥХ��ȿ�(2)�� ��wl �Ǵ������եȥ������ղä���.",
91 #endif
92 " ko ���֤鲼����§�����ʤ�.",
93 " kn �����ѱѿ�����ǥ�ɥ�åפ��ʤ�.",
94 " kh ��Ⱦ�������ʸ���֤Ǥ��ʬ�䤹��.",
95 " kc ��Ⱦ�ѱѿ����ǥ�ɥ�åפ��ʤ�.",
96 " kz �����ѤǤ����Ǥ�����ʬ�䤷�ʤ�.",
97 " kk ����������Ǥ�����ʬ�䤷�ʤ�.",
98 " kx ����§�����ʤ�.",
99 " kf ���Եͤ�����˥��ڡ����������ʤ�.",
100 " ke ����ʸ���������⡼��.",
101 " kt��=ʸ���ġ�/ʸ���ġ� ����Ƭ��§ʸ�������.",
102 " kd��=ʸ���ġ�/ʸ���ġ� ���֤鲼���ػߤι�Ƭ��§ʸ�������.",
103 " km��=ʸ���ġ�/ʸ���ġ� ��������§ʸ�������.",
104 " ka��=ʸ���ġ�/ʸ���ġ� ���ѿ����Τ褦�˰�����ʸ�������.",
105 " ki��=ʸ���ġ�/ʸ���ġ� ���վ����ܵ�������.",
106 " ks��=ʸ���ġ�/ʸ���ġ� ����˶����������ѵ�������.",
107 " kp��=ʸ���ġ�/ʸ���ġ� �����˶����������ѵ�������.",
108 " hz/Ⱦ���� ��Ⱦ�ѡ������Ѵ��ơ��֥뽤��.",
109 " ch ������ʸ����Ⱦ�Ѥ��֤�������.",
110 " cz ��Ⱦ��ʸ�������Ѥ��֤�������.",
111 #if __human68k__
112 " m�ڣ����̤ιԿ�(29)�� �����Ϥ���̤Ǹ���Ȥ�, ���������ɽ��.",
113 #else
114 " m�ڣ����̤ιԿ�(22)�� �����Ϥ���̤Ǹ���Ȥ�, ���������ɽ��.",
115 #endif
116 " o��=�ե�����̾��.��ĥ�ҡ� �����ϥե��������.",
117 " nn ������̵���ǥե����뤬����뤳�ȤΤʤ��褦�ˤ���.",
118 #if MSDOS || WINNT
119 " nz �����ϥե�����κǸ�� ^Z ���դ��ʤ�.",
120 #endif
121 " nk ��������⡼��.",
122 " b ���Х��ʥ�⡼��.",
123 " - ���ѥ������ꥢ.",
124 " / ���¹Էв�ɽ���ʤ�.",
125 " @�ե�����̾ ���ե�����μ�����. (��ĥ�Ҿ�ά��.XTR)",
126 " [�� ] �������⡼�ɤε���������. (���Ū�����⡼�ɻ���)",
127 " $�ڹԿ��� ������Կ�����ϸ��Ȥ������⡼�ɤ��᤹.",
128 "",
129 "�������ߥ��ޥ�ɵ���",
130 " . (�ԥꥪ�ɤǻϤޤ��) �����ޥ�ɹ�.",
131 " ~. ���Ԥ����椫��Ǥ�褤���ޥ�ɹ�.",
132 " ~/ ������ǥ������.",
133 " ~>��~< ��������ʸ�����Ф�.",
134 " ~\\ ������������. (����ʸ��������̤��)",
135 " ~%% ����%%-�Ѵ��Ӥη�̤�ƥ����Ȥ���ᤳ��.",
136 " ~{��~} ���Ϥޤ줿�ϰϤǹ�ʬ��ʤɤ��ʤ�.",
137 " ~| ��������ʬ��.",
138 "",
139 "���Ķ��ѿ�",
140 " XTR �����Ĥ�Ȥ��������ޥ�ɤåȤ��Ƥ���.",
141 " XTRPATH �������ߥե����븡���ǥ��쥯�ȥ�����.",
142 #if UNIX
143 " TMPDIR ���ƥ�ݥ��ե���������ǥ��쥯�ȥ�����.",
144 #else
145 " TMP ���ƥ�ݥ��ե���������ǥ��쥯�ȥ�����.",
146 #endif
147 "",
148 "������¾",
149 " ������, ���ԡ�, �����ۤʤɤϼ�ͳ�˹ԤäƤ�������.",
150 " ���ܤ����ϥޥ˥奢�����������.",
151 " ¼�� ��ͺ (Murakami Sinyu)",
152 " QGA03215@niftyserve.or.jp"
153 #if UNIX
154 ,
155 "",
156 " Ported for HUMAN68K/UN*X",
157 " ���� ���� (Katsuyuki Okabe)",
158 " hgc02147@niftyserve.or.jp"
159 #endif
160 };
161
162 /**************************************************************************/
163
164 #if MSDOS
165 /* ��������Τ��� helpmsg ���ΰ�����ΰ��ž�Ѥ��롣 */
166 /* �������ʤ��ʤ顢��������������롣 */
167 #define HELPMSG_AS_WORKAREA
168
169 /* ��helpmsg[] ��ʸ�������������Ǥ��ꡢ�����Ǥ�Ϣ³�����ΰ�ˤ��뤳�Ȥ⡢
170 * �����ΰ褬������ǽ�Ǥ��뤳�Ȥ�ø���ϵ��ꤷ�Ƥ��ʤ���
171 */
172 #endif
173
174 /**************************************************************************/
175
176 /* emode == ON �ΤȤ����åȤ��� */
177 uchar esetcmd_s[] = "r/^.//.\
178 /~.//.\
179 /~%//%\
180 /~>//>\
181 /~<//<\
182 /~\\///\\/\
183 /~\\\\//\\\\\
184 /~|//|\
185 /~\\{//{\
186 /~\\}//}";
187 uchar *esetcmd = esetcmd_s;
188
189 /* emode == OFF �ΤȤ��ꥻ�åȤ��� */
190 uchar eclrcmd_s[] = "r/^.//-\
191 /~.//-\
192 /~%//-\
193 /~>//-\
194 /~<//-\
195 /~\\///-\
196 /~\\\\//-\
197 /~|//-\
198 /~\\{//-\
199 /~\\}//-";
200 uchar *eclrcmd = eclrcmd_s;
201
202 /* ��Ƭ��§ʸ�� */
203 uchar gtkinsoku_s[] = "\244\241,.;:\245)]}>\243\337\336!?\
204 \201\101\201\102\201\103\201\104\201\107\201\106\201\105\201\111\
205 \201\110\201\146\201\150\201\152\201\154\201\156\201\160\201\162\
206 \201\164\201\204\201\166\201\170\201\172";
207 /* ����,.;:��)]}>���ߎ�!?�������������������ǡɡˡ͡ϡѡӡա�ס١� */
208 uchar *gtkinsoku = gtkinsoku_s;
209
210 /* �֤鲼���ػߤι�Ƭ��§ʸ�� */
211 uchar gtkinsoku2_s[] = "";
212 uchar *gtkinsoku2 = gtkinsoku2_s;
213
214 /* ������§ʸ�� */
215 uchar gmkinsoku_s[] = "([{<\242\
216 \201\145\201\147\201\151\201\153\201\155\201\157\201\161\201\163\
217 \201\203\201\165\201\167\201\171";
218 /* ([{<���ơȡʡ̡ΡСҡԡ�֡ء� */
219 uchar *gmkinsoku = gmkinsoku_s;
220
221 /* ��·���Τ����˶��������Ƥ�褤ʸ�� */
222 uchar postspadjchrs_s[] = "\
223 \201\101\201\102\201\103\201\104\201\150\201\152\201\154\201\156\
224 \201\160\201\162\201\164\201\166\201\170\201\172";
225 /* ���������ɡˡ͡ϡѡӡաס١� */
226 uchar *postspadjchrs = postspadjchrs_s;
227
228 /* ��·���Τ������˶��������Ƥ�褤ʸ�� */
229 uchar prespadjchrs_s[] = "\
230 \201\147\201\151\201\153\201\155\201\157\201\161\201\163\201\165\
231 \201\167\201\171";
232 /* �ȡʡ̡ΡСҡԡ֡ء� */
233 uchar *prespadjchrs = prespadjchrs_s;
234
235 /* �ѿ����Τ褦�˰�����ʸ�� */
236 uchar alnum2_s[] = "";
237 uchar *alnum2 = alnum2_s;
238
239 uchar itemmark_s[] = "-*\245\
240 \201\105\201\210\201\226\201\230\201\231\201\232\201\233\201\234\
241 \201\235\201\236\201\237\201\240\201\241\201\242\201\243\201\244\
242 \201\245\201\246\201\346\201\364\201\365\201\366\201\367\
243 \207\100\207\101\207\102\207\103\207\104\207\105\207\106\207\107\
244 \207\110\207\111\207\112\207\113\207\114\207\115\207\116\207\117\
245 \207\120\207\121\207\122\207\123\
246 \207\124\207\125\207\126\207\127\207\130\207\131\207\132\207\133\
247 \207\134\207\135";
248 /* -*���������������������������������������������� */
249 /* ���������������������������������������� */
250 /* �������������������� */
251 uchar *itemmark = itemmark_s;
252
253 uchar quotestr_s[] = "> ";
254 uchar *quotestr = quotestr_s;
255
256 uchar phleft_s[] = "";
257 uchar phcenter_s[] = "";
258 uchar phright_s[] = "";
259 uchar pfleft_s[] = "";
260 uchar pfcenter_s[] = "- %p -";
261 uchar pfright_s[] = "";
262 uchar *phleft = phleft_s;
263 uchar *phcenter = phcenter_s;
264 uchar *phright = phright_s;
265 uchar *pfleft = pfleft_s;
266 uchar *pfcenter = pfcenter_s;
267 uchar *pfright = pfright_s;
268
269 uchar *newpfleft = pfleft_s;
270 uchar *newpfcenter = pfcenter_s;
271 uchar *newpfright = pfright_s;
272
273
274 /* �����⡼�ɥ��ꥢ���ޥ�ɣ� */
275 uchar *clrcmd1 = "w- f- a- sj- aj- ac- ar- ab- ai- af- as- "
276 "ss- al- h- ip- ii- il-";
277
278 /* �����⡼�ɥ��ꥢ���ޥ�ɣ� */
279 uchar *clrcmd2 = "r-";
280
281 /* �����⡼�ɡ��ѥ��� */
282 int emode = OFF; /* e �������ߥ��ޥ�ɽ������� */
283 int wrapmode = OFF; /* w ���������ǹԤ��ޤ� */
284 int width = 72;
285 int wlmode = OFF; /* wl ����ԤΥХ��ȿ��θ³���Ϳ���� */
286 int wlimit = 80;
287 int wkmode = OFF; /* wk ��KI/KO �����줿���ΥХ��ȿ������ */
288 int kikosize = 2; /* ��KI/KO �����ɤΥХ��ȿ� */
289 int fillmode = OFF; /* f ��������ʤ�Ԥ�Ĥʤ��� */
290 int normadjmode = OFF; /* a ������·�� */
291 int spadjlimit = 5;
292 int ajmode = OFF; /* aj �� */
293 int sjmode = OFF; /* sj ��;ʬ�ʥ����ڡ����å� */
294 int ssmode = OFF; /* ss ���²�ʸ�֥��ڡ����å� */
295 int centeradjmode = OFF; /* ac ������� */
296 int rightadjmode = OFF; /* ar ������ */
297 int bothadjmode = OFF; /* ab �����������ʶ�����ʬ�� */
298 int asmode = OFF; /* as ���²�ʸ�֥��ڡ���������� */
299 int almode = OFF; /* al ������ζ��ڤ�˶���Ԥ������ */
300 int aimode = OFF; /* ai �������ȥ���ǥ�Ȥ�Ԥ� */
301 int afmode = OFF; /* af ������ǥ���դ����줿�ƥ����Ⱥ����� */
302 int bindentmode = OFF; /* i �����ܥ���ǥ�Ȼ��� */
303 int indent = 0;
304 int ignoreindentmode = OFF; /* ii �����ϤΥ���ǥ�Ȥ�̵�뤹�� */
305 int ignorelinespmode = OFF; /* il �����Ϥζ���Ԥ�̵�뤹�� */
306 int hindentmode = OFF; /* h ��Hanging indent */
307 int hindent = 2;
308 int pindentmode = OFF; /* ip ��Indented Paragraph */
309 int pindent = 2;
310 int linespmode = OFF; /* l �����Ԥ��٤˶��Ԥ������ */
311 int splines = 1;
312 int quotemode = OFF; /* q ����¦�˻����ʸ�����ɽ�� */
313 int tabtospmode = OFF; /* t �����֤ڡ�����Ÿ������ */
314 int itabstop = 8;
315 int sptotabmode = OFF; /* s �����ڡ����֤ǽ��Ϥ��� */
316 int otabstop = 8;
317 int szmode = OFF; /* sz �����ڡ��������Ѷ���ǽ��Ϥ��� */
318 int shmode = OFF; /* sh �����ڡ�����Ⱦ�Ѷ���ǽ��Ϥ��� */
319 int skmode = OFF; /* sk �����֤����̤ʥ��ڡ������Ѵ� */
320 int alttabsp = 0xa0;
321 int snmode = OFF; /* sn ����ü���ڡ�����̵�뤷�ʤ� */
322 int rplmode = OFF; /* r ���ִ���� */
323 int remodeno = 2; /* re ���ִ��������ɽ���⡼�� */
324 int pagemode = OFF; /* p ���ڡ������դ��� */
325 uchar *pagebegin = ""; /* pp ���ڡ���������ʬ���� */
326 uchar *pageend = "";
327 int pagelines = 58; /* pl �����ڡ����ιԿ� */
328 int phlines = 3; /* ph ���ڡ����إå� */
329 int pflines = 3; /* pf ���ڡ����եå� */
330 int pagetopsp = 1; /* pt ���ڡ�����;�� */
331 int pagebtmmode = OFF; /* pb ���ڡ�����;�� */
332 int pagebtmsp = 1;
333 int pageoffset = 0; /* po ���ڡ�����;�� */
334 int pagestep = 1;
335 int absppmode = OFF;
336 int anktohwmode = OFF; /* pj �����ΣˤХ���Ⱦ��ʸ�����Ѵ� */
337 int vexpmodeno = 3; /* pv ���ij���⡼������ */
338 int wexpmodeno = 3; /* pw ��������⡼������ */
339 int sgr98mode = OFF; /* pc ��SGR(ESC[m)seq���;�ɤǼ�ưŪ��Ϣ�� */
340 int prkikomodeno = 3; /* ��KIKO�⡼�� */
341 int prhihomodeno = 3; /* ��HIHO�⡼�� */
342 int pmmode = OFF; /* pm ��ʸ������������ν���Ǽ�ư��� */
343 int nocntrlmode = OFF; /* pn �����楳���ɤ���Ϥ��ʤ� */
344 int noffmode = OFF; /* np �����ڡ��������ɤ���Ϥ��ʤ� */
345 #if NL_IS_CRLF
346 int nocrmode = OFF; /* nr �����������ɤ���Ϥ��ʤ� */
347 #else
348 int nocrmode = ON;
349 #endif
350 int oidasimode = OFF; /* ko ���ɤ��Ф���§�Τ� */
351 int kkmode = OFF; /* kk ���������ǹԤ��ڤ� */
352 int khmode = OFF; /* kh ��Ⱦ�ѤǤ����ʳ��ǹԤ��ޤ� */
353 int kzmode = OFF; /* kz �����ѤǤ����ʳ��ǤϹԤ��ޤ�ʤ� */
354 int knmode = OFF; /* kn �����ѱѿ�����ѿ����������ʤ� */
355 int kcmode = OFF; /* kc ��Ⱦ�ѱѿ�����ѿ����������ʤ� */
356 int kemode = OFF; /* ke ����ʸ�⡼�� */
357
358 int binarymode = OFF; /* b ���Х��ʥ�⡼�� */
359 int moremode = OFF; /* m ���ͣϣңť⡼�ɡ��ѥ����ϲ��̤ιԿ� */
360 #if __human68k__
361 int moresize = 29;
362 #else
363 int moresize = 22;
364 #endif
365 int mkbakmode = OFF; /* o ��̾�����Ѥ��ʤ�����ȤΤ� .BAK �˻Ĥ�*/
366 int ofilemode = OFF; /* o= ������Υե�����˽��� */
367 int chgextmode = OFF; /* o. ����ĥ�Ҥ��Ѥ����ե�����˽��� */
368 int delaymode = OFF; /* d ����ä���⡼�ɡ��ѥ������ٱ���� */
369 int delaytime = 10;
370
371 int debug = 0; /* dd ��debug mode */
372
373 int plaintextmode = OFF; /* px ��ñ�ʤ�ƥ����ȥե�����ˤ��� */
374
375 int hanzenconv = 0; /* cz��Ⱦ�Ѣ������Ѵ� */
376 int zenhanconv = 0; /* ch�����Ѣ�Ⱦ���Ѵ� */
377 /* ��� zenhanconv == -hanzenconv �������� */
378
379 int nountermlinemode = OFF; /* nn ������̵���ǥե����뤬�����ʤ��褦�� */
380 int noctrlzmode = OFF; /* nz ���Ǹ��EOF(^Z)����Ϥ��ʤ� */
381
382 int kxmode = OFF; /* kx ����§������Ԥ�ʤ� */
383 int kfmode = OFF; /* kf ���ͤ���ߤǶ��������ʤ� */
384 int jtexmode = OFF; /* kj �����ܸ�TeX�ߴ��Եͤ���� */
385
386 int zerolinefeedmode = OFF; /* z ��������ԥ⡼�� */
387
388 int nokanjimode = OFF; /* nk ��������⡼�� */
389
390 int noerrmode; /* nw ���ʤ�٤����顼��Ф��ʤ��⡼�� */
391
392 unsigned evalbufsize = EVALBUFSIZE; /* be : Eval Buffer size */
393
394 int silentmode = OFF; /* / ��silent mode */
395
396 int cmddot_char = 0; /* ���ޥ�ɹԤΥޡ��� */
397 int cmddot_mchar = 0xff; /* �ޥ��������ǻ��Ѥ��륳�ޥ�ɹԤΥޡ��� */
398
399
400 /* ������ */
401 int stdinmode; /* ɸ�����Ϥ������� */
402 uchar *ifilename; /* ���ߤ����ϥե�����̾ */
403 uchar *ifilename1; /* ���ϥե�����̾����ɽ */
404 FILE *ifp;
405 int stdoutmode; /* ɸ����Ϥؽ��� */
406 uchar *ofilename;
407 FILE *ofp;
408 uchar *bakfilename; /* .BAK �˥�͡��व�줿���ϥե�����̾ */
409
410
411 /* ���֥ե饰�� */
412
413 int solflag; /* ���ϥƥ����Ⱦ�ι�Ƭ�Ǥ��� */
414 int sol2flag; /* ���ϥƥ����Ⱦ�ι�Ƭ���ޤ������ɤ�Ǥ��ʤ� */
415
416 int newlineflag; /* �ޤ��Ԥ˲����Ƥ��ʤ� */
417 int madaindentflag; /* �ԤλϤᤫ��ޤ������ʸ���˽в�äƤ��ʤ����Ȥ� */
418 /* ��ʸ��������ǥ����ʬ�Dz�����뤿��� */
419 int inindentflag; /* ��ΤȻ��Ƥ뤬��������ζ���ʤɤǤ� ON �ˤʤ� */
420 /* �ʥ����ȥ���ǥ�ȡ����㥹�ƥ��ե����γ��ϰ��֡�*/
421 int linebreak; /* ������ǣ��Ԥη����ۤ��ƹԤ��ޤä��饫����ȥ��å� */
422 int lineoverflag; /* ���Ԥη���κ����ͤ�ۤ������ᡤ�饤��Хåե����ƽ���*/
423 int nonewlineflag; /* �饤��Хåե������Ƥ��Ǥ��Ф������ԤϤ��ʤ� */
424 int firstphmadaflag;/* �ǽ�Υڡ����Ǥޤ��إå����Ϥ��Ƥ��ʤ� */
425 int pageendflag; /* �ڡ��������äƤ��Ʋ��ڡ�����ɬ�� */
426 int pagecutflag; /* ���ڡ����ιԿ���ۤ���������ڡ������� */
427 int wlimitflag; /* ��ԤΥХ��ȿ��³��Τ���˹Ԥ��ޤ� */
428 int indentsetflag; /* ����ǥ�Ȱ��ַ��ꤺ�� */
429 int chrexpflag; /* ʸ�����Ф������~<, ~>�ˤ��� */
430
431 int textescapeflag = OFF; /* �ƥ����ȥ����������� (~\) �����ä� */
432
433 int intextflag; /* �ƥ����Ƚ����¹���Ǥ��� */
434 int includeflag; /* �ե������������Ǥ��� */
435 int inmtextflag; /* �ޥ���ƥ����ȼ¹��� */
436 int tmpincludeflag; /* �ƥ�ݥ��ե������������Ǥ��� */
437 int coninmode; /* ���Ϥ�������Ǥ��� */
438 int conoutmode; /* ���Ϥ�������Ǥ��� */
439 int prnoutmode; /* ���Ϥ��ץ�Ǥ��� */
440 int eotflag; /* �ƥ����Ȥν���� */
441 int resetmadaflag; /* �ץ�ꥻ�åȥ����ɤ�ޤ��Ф��Ƥ��ʤ� */
442 int vexpflag; /* �ij���ԤǤ��� */
443 int wexpflag; /* �Ԥ˲����礬�ޤޤ�Ƥ��� */
444 int printpagemadaflag; /* �������ϥڡ����ˤޤ���ã���Ƥ��ʤ����Ȥ� */
445 int printpageflag; /* ���ߥڡ��������������ΤǤ��뤳�Ȥ� */
446
447 int nevflag; /* No eval mode flag */
448
449 int errorflag = 0; /* ���顼�����ä����Ȥ� */
450
451 int spacelines = 0; /* ����Կ�����Ȥ��� */
452 int linespaced = 0; /* ����Խ��ϥ��ޥ�ɤΤ��ȤǤ��뤳�Ȥ� */
453
454 params_t *params = NULL; /* �����ѥ���������¸�ѥ����å��ꥹ�� */
455
456
457 int aindent = 0; /* �Ԥ��ޤä��Ȥ��Υ����ȥ���ǥ�Ȱ��� */
458 int bindent = 0; /* ����ǥ�Ȥδ����֡����ϥƥ����Ȥ�
459 �饤��Хåե��η���֤κ�ʬ�ˤʤ� */
460
461 uchar *bindentp; /* *lbv[bindent] �� */
462
463 int first_indent = 0; /* ����������ܤΥ���ǥ�� */
464
465 int nobreakpos = 0; /* wrapmode �� ON ���� OFF �ˤʤä����֤�Ͽ */
466
467 int wlrem; /* �Х��ȸ³� wlimit �ޤǤλĤ�Х��ȿ� */
468
469 int morecnt; /* �ͣϣңŤΤ���ιԥ����� */
470
471 unsigned ilineno = 1; /* ���Ϲԥ����� */
472 unsigned nlcount = 0; /* ���Ϥβ��Ԥ������ */
473 unsigned lineno = 1; /* �ԥ����� */
474 int pageno = 1; /* �ڡ����ֹ楫���� */
475 int abspageno = 1; /* ���Хڡ����ֹ楫����(�ƽ��������ʤ�) */
476 int pagestepcnt = 0; /* �ȤӤȤӥڡ��������ѥ����� */
477 int newpageno = -1; /* �ڡ����ֹ��������ѹ�����Ȥ��Τ��� */
478 int phpfchgflag = OFF; /* �ڡ����إå��եå����ѹ����Ƥ��뤳�Ȥ� */
479
480 unsigned cc = '\f'; /* ���߽������ʸ�� */
481 unsigned prevc = '\f'; /* ����ʸ�� */
482
483 unsigned indentchar; /* �����ȥ���ǥ�ȤΥ���ǥ�Ȥ˻Ȥ�����ʸ�� */
484
485
486 int pagewidth = 0; /* �Ϥ���� WritePage ���ƤФ줿�Ȥ��� width ���� */
487 /* ���Ȥǥإå����եå����֤��Ѥ�ʤ��褦�ˤ��� */
488
489 int pagehwmode = OFF; /* �Ϥ���� WritePage ���ƤФ줿�Ȥ����Х���Ⱦ��
490 ���Ѵ�����⡼�ɤʤ� ON �ˤ��ơ��ʹ����� */
491
492
493 /* �ִ������� */
494
495 rpl_t *rlist_top = NULL; /* �ִ��ꥹ�ȤΥȥå� */
496 rpl_t *srlist_top = NULL; /* �����ִ��ꥹ�ȤΥȥå� */
497
498 marg_t *margv; /* �ޥ����ޥ�ɰ����٥��� */
499 int margc = 0; /* �ޥ����ޥ�ɰ����ο� */
500 strdesc_t retvalue = {NULL, 0}; /* �Ǹ��ɾ�����������ͤ��ݻ����� */
501
502 int fargc = 0; /* �Ȥ߹��ߴؿ��ƤӽФ����ΰ����ο� */
503
504 var_t *varlist = NULL; /* �ѿ��ꥹ�� */
505 var_t *localvarlist = NULL; /* �������ѿ��ꥹ�� */
506 macro_t *macrolist = NULL; /* �ޥ���ꥹ�� */
507
508
509 /* ���楳���ɤ���� */
510 def_t *c_reset = NULL;
511 def_t *c_terminate = NULL;
512 def_t *c_newline = NULL;
513 def_t *c_newpage = NULL;
514 def_t *c_reset2 = NULL;
515 def_t *c_areset = NULL;
516 def_t *c_vreset = NULL;
517 def_t *c_qreset = NULL;
518 def_t *c_wreset = NULL;
519 def_t *c_hreset = NULL;
520 def_t *c_freset = NULL;
521 def_t *c_kicode = NULL;
522 def_t *c_kocode = NULL;
523 def_t *c_hicode = NULL;
524 def_t *c_hocode = NULL;
525 def_t *c_attr = NULL;
526 def_t *c_wide = NULL;
527 def_t *c_vexpand = NULL;
528 def_t *c_qexpand = NULL;
529 def_t *c_half = NULL;
530 def_t *c_font = NULL;
531
532 def_t *c_pagefont = NULL; /* �Ϥ���� WritePage ���ƤФ줿�Ȥ��� c_font ���� */
533 def_t *c_pagekicode = NULL; /* Ʊ���� c_kicode ���� */
534 def_t *c_pagekocode = NULL; /* Ʊ���� c_kocode ���� */
535
536
537 /* �����ץХåե� */
538 jmp_buf errorjb; /* ���顼�� long jump �Τ��� */
539
540 /* �Ķ��ѿ� */
541 uchar *xtrenv; /* �Ķ��ѿ� XTR ���� */
542 uchar *xtrpath; /* �Ķ��ѿ� XTRPATH ���� */
543 uchar *tmppath; /* �Ķ��ѿ� TMP ���� */
544
545 /* XTR ��ư�ѥ� */
546 uchar *xtrprog;
547
548 /* �Хåե��ط� */
549
550 uchar *lbuf; /* ���ϥƥ����Ȥ�������뤿��Υ饤��Хåե� */
551 uchar *lbv[LBVSIZE]; /* lbuf �ؤΥݥ��ؤ����� */
552 int x = 0; /* �奫����lbv[]�Υ���ǥå��� */
553
554 uchar *sbuf; /* �������ƥ����ȥХåե���GetChr/UngetChr�ѡ�*/
555 uchar *sbufp; /* sbuf �ؤΥݥ��� */
556 uchar *sbufbtm; /* sbuf ����ؤΥݥ��� */
557
558 uchar *ibuf; /* ����ʸ����Хåե���GetStr/UngetStrN�ѡ�*/
559 uchar *ibufp; /* ibuf�ؤΥݥ��� */
560
561 uchar *cbuf; /* ���楳���ɽ����Τ���ΥХåե� */
562 uchar *cbufp; /* cbuf �ؤΥݥ��� */
563 int clength = 0; /* ���楳���ɤ��ؿ���Ĺ�����֤�����Υ쥸���� */
564
565 #if __human68k__
566 int (*STRCMP)();
567 #endif
568
569
570 /****************************************************************************/
571
572 static void
Help(void)573 Help(void)
574 {
575 int i;
576
577 moremode = ON;
578 coninmode = OFF;
579 for (i = 0; i < sizeof(helpmsg)/sizeof(helpmsg[0]); i++) {
580 printf((char *)helpmsg[i], XTR_VER);
581 putchar('\n');
582 More();
583 }
584 }
585
586 /****************************************************************************/
587
588
589 #if UNIX
590 struct mblocale {
591 uchar *name;
592 int type;
593 };
594
595 static struct mblocale mblocales[] = {
596 { "ja_JP.EUC", MBTYPE_EUC },
597 { "ja_JP.ujis", MBTYPE_EUC },
598 { "ja_JP.SJIS", MBTYPE_SJIS },
599 { "ja_JP.mscode", MBTYPE_SJIS },
600 { "japan", MBTYPE_EUC },
601 { "Japan", MBTYPE_EUC },
602 { "japanese", MBTYPE_EUC },
603 { "Japanese", MBTYPE_EUC },
604 { NULL, -1 }
605 };
606
607 static int
search_mbtype(const uchar * s)608 search_mbtype(const uchar *s)
609 {
610 int i;
611
612 for (i = 0; mblocales[i].name != NULL; ++i)
613 if (strcmp((const char *)s, (char *)mblocales[i].name) == 0)
614 return mblocales[i].type;
615 return -1;
616 }
617
618 static void
set_mbtype(void)619 set_mbtype(void)
620 {
621 int xtr_ctype;
622 uchar *env;
623
624 xtr_ctype = -1;
625 if ((env = (uchar *)getenv("XTR_CTYPE")) != NULL) {
626 if (stricmp((char *)env, "euc") == 0)
627 xtr_ctype = MBTYPE_EUC;
628 else if (stricmp((char *)env, "sjis") == 0)
629 xtr_ctype = MBTYPE_SJIS;
630 else
631 xtr_ctype = search_mbtype(env);
632 }
633 if (xtr_ctype < 0) {
634 env = (uchar *)getenv("LC_CTYPE");
635 if (env == NULL)
636 env = (uchar *)getenv("LANG");
637 if (env != NULL)
638 xtr_ctype = search_mbtype(env);
639 }
640 if (xtr_ctype < 0)
641 xtr_ctype = strcmp("��", "\244\242") == 0 ? MBTYPE_EUC : MBTYPE_SJIS ;
642 mbinit(xtr_ctype);
643 }
644 #endif
645
646 static void
Initialize(void)647 Initialize(void)
648 {
649 #if __human68k__
650 extern char *_toslash();
651 extern long TwentyOneOptions();
652 int twon;
653 #define ISTWONCASE(f) ((f) & (1 << 30))
654 #endif
655 #if UNIX
656 set_mbtype();
657 #endif
658 #ifdef HELPMSG_AS_WORKAREA
659 #define WBuf_START (helpmsg[2])
660 #define WBuf_END (helpmsg[sizeof(helpmsg)/sizeof(helpmsg[0])-1])
661 /* ���� sbuf[] �� lbuf[] �� helpmsg[] ���ΰ� WBuf_START��WBuf_END �˺�� */
662 assert(WBuf_START != dummy);
663 assert(WBuf_END != dummy);
664 sbuf = WBuf_START;
665 assert(sbuf + SBUFSIZE + 2 < WBuf_END);
666 #else
667 sbuf = (uchar *)XMalloc(SBUFSIZE + 2);
668 #endif
669 cbuf = (uchar *)XMalloc(CBUFSIZE + 2);
670 lbuf = (uchar *)XMalloc(LBUFSIZE + 2);
671 ibuf = (uchar *)XMalloc(IBUFSIZE + 2);
672
673 sbufp = sbufbtm = sbuf + SBUFSIZE;
674 ibufp = ibuf;
675 cbufp = cbuf;
676 bindentp = lbuf;
677
678 xtrenv = (uchar *)getenv(XTR_ENV);
679 xtrpath = (uchar *)getenv(XTRPATH_ENV);
680 tmppath = (uchar *)getenv(TMPPATH_ENV);
681 #if __human68k__
682 if (tmppath == NULL)
683 tmppath = getenv("temp");
684 if (tmppath == NULL)
685 tmppath = getenv("TMP");
686 if (tmppath != NULL)
687 _toslash(tmppath);
688 twon = TwentyOneOptions();
689 if (twon == -1)
690 twon = 0;
691 STRCMP = ISTWONCASE(twon) ? strcmp : stricmp ;
692 #else
693 #if UNIX
694 if (tmppath == NULL)
695 tmppath = (uchar *)getenv("TMP");
696 if (tmppath == NULL)
697 tmppath = "/tmp";
698 #endif
699 #endif
700
701 InitCBreak();
702 }
703
704
705 void
Terminate(int exit_status)706 Terminate(int exit_status)
707 /* ����� */
708 {
709 if (exit_status == 0 && errorflag)
710 exit_status = 1;
711
712 WriteCntrl(c_terminate);
713 TermCBreak();
714 AllocEnd();
715 exit(exit_status);
716 }
717
718
719 /****************************************************************************/
720 /* �Ϥ��ޤ� */
721 /******************************** main **************************************/
722
723 static void LookStrVal ARGS((const uchar *str));
724 static int check_option ARGS((const uchar *str));
725
726 static int look_opt_flag; /* -c?? �Τ褦�ʥ��ץ����Τ��� */
727
728 void
main(int argc,uchar ** argv)729 main(int argc, uchar **argv)
730 {
731 int i;
732 int i0;
733 int firstflag;
734
735 xtrprog = argv[0];
736 #if __human68k__
737 {
738 char *p;
739 if ((p = strrchr(xtrprog, '.')) != NULL && stricmp(p, ".x") == 0)
740 *p = '\0';
741 }
742 #endif
743 #if UNIX
744 xtrver = alloca(6 + strlen(XTR_VER) + strlen(VERSION));
745 strcpy((char *)xtrver, "XTR ");
746 strcat((char *)xtrver, XTR_VER);
747 strcat((char *)xtrver, "-");
748 strcat((char *)xtrver, VERSION);
749 setbuf(stdin, (char *)NULL);
750 #endif
751
752 Initialize(); /* ����� */
753
754 morecnt = moresize;
755 stdoutmode = ON;
756 ofilename = "(output)";
757 ofp = stdout;
758 ifilename1 = ifilename = "(input)"; /* �����å� */
759 ifp = stdin;
760 SetInMode(ifp); /* ���ϥ�����쥯�ȥ����å� */
761 SetOutMode(ofp); /* ���ϥ�����쥯�ȥ����å� */
762 if (coninmode && argc < 2 || argc == 2 && strcmp((char *)argv[1], "-?") == 0) {
763 /* ���ϥ�����쥯��̵���ǥѥ���̵����
764 ���뤤�ϥѥ����� -? �Τߤʤ�ȣţ̣� */
765 Help();
766 Terminate(0);
767 }
768 stdinmode = !coninmode;
769 SetModeB(ofp, 1);
770
771 /* ���ޥ�ɰ��������ΰ� "-" ������С����ΰ��֤� */
772 for (i0 = argc - 1; i0 > 0 && !equ1(argv[i0], '-'); i0--) ;
773
774 /* �Ǹ�����ϥե�����̾�� */
775 for (i = argc - 1; i > i0 && !IsFileName(argv[i]); i--) ;
776 if (i == i0) { /* �ե�����̾����̵���ʤ� */
777 stdinmode = ON; /* ɸ�����Ϥ��� */
778 } else {
779 stdinmode = OFF;
780 ifilename1 = ifilename = argv[i];
781 }
782
783 printpagemadaflag = ON;
784 pagestepcnt = 0;
785 printpageflag = ON;
786 madaindentflag = ON;
787 resetmadaflag = ON;
788 firstphmadaflag = ON;
789 pageendflag = ON;
790 pagecutflag = OFF;
791 pageno = 1;
792 abspageno = 1;
793 lineno = 1;
794 eotflag = OFF;
795
796 /* ���ޥ�ɰ�����������̵���ǡ��Ķ��ѿ� XTR ������Ф������Ƥ�
797 ���ޥ����Ȥ��ƽ������� */
798 if (i0 == 0 && xtrenv != NULL)
799 Command(xtrenv);
800
801 firstflag = ON;
802 for (i = i0 + 1; i < argc; i++) {
803 eotflag = intextflag = OFF;
804 if (!IsFileName(argv[i])) {
805 #if UNIX
806 const uchar *arg, *p;
807
808 arg = p = (uchar *)XMalloc(strlen(argv[i]) * 2 + 1);
809 mb2sjisstring((char *)p, (char *)argv[i]);
810 if (check_option(p) != OK) {
811 #else
812 const uchar *p = argv[i];
813 #endif
814 while (*p == SWITCHAR)
815 p++;
816 if (*p == '?' || *p == '#') {
817 uchar *v = AEvalExprStr((int *)NULL, p+1);
818 if (*p == '?') {
819 look_opt_flag = 1;
820 LookStrVal(v);
821 }
822 XFree((voidstar)v);
823 } else {
824 look_opt_flag = 1;
825 SimpleCommand(p);
826 }
827 look_opt_flag = 0;
828 #if UNIX
829 }
830 XFree((voidstar)arg);
831 #endif
832 } else {
833 if (mkbakmode && argv[i] == ifilename1)
834 ifilename = bakfilename;
835 else
836 ifilename = argv[i];
837 if (!firstflag)
838 fclose(ifp);
839 if ((ifp = fopen((char *)ifilename, "r")) == NULL) {
840 Error("Can't open file: %s", ifilename);
841 }
842 SetInMode(ifp);
843
844 intextflag = ON;
845 Trans(); /* �ƥ������Ѵ��¹� */
846 Disp(1); /* �¹Էв�ɽ�� */
847 firstflag = OFF;
848 }
849 }
850 if (stdinmode) {
851 if (!coninmode) { /* ���Ϥ�������쥯�Ȥ���Ƥ���� */
852 ChgStdin(); /* stdin ������Ѥ��� */
853 }
854 intextflag = ON;
855 Trans(); /* �ƥ������Ѵ��¹� */
856 Disp(1); /* �¹Էв�ɽ�� */
857 }
858 /* ���������� */
859 eotflag = ON;
860 if (pagemode) { /* �ڡ����դ��⡼�ɤʤ� */
861 WritePage(); /* �Ǹ�Υڡ����եå������ */
862 }
863 #if MSDOS || WINNT
864 #if EOFCHAR != -1
865 if (!c_terminate && !pagemode && !noctrlzmode && !binarymode
866 && !conoutmode && !prnoutmode) {
867 /* ñ�ʤ�ƥ����ȥե���������� */
868 Write1(EOFCHAR); /* Ctrl-Z ���� */
869 }
870 #endif
871 #endif
872 Terminate(0);
873 }
874
875
876
877
878 /*************************** CheckOption *************************************/
879
880 #if UNIX
881 static int
check_option(const uchar * str)882 check_option(const uchar *str)
883 {
884 int result = OK;
885
886 if (strncmp((const char *)str, "--ctype=", 8) == 0) {
887 if (stricmp((const char *)str + 8, "euc") == 0) {
888 mbinit(MBTYPE_EUC);
889 } else if (stricmp((const char *)str + 8, "sjis") == 0) {
890 mbinit(MBTYPE_SJIS);
891 } else {
892 Message("unrecognized option `%s'\n", str);
893 result = ERR;
894 }
895 } else if (strncmp((const char *)str, "--tmpdir=", 9) == 0) {
896 #if __human68k__
897 extern char *_toslash();
898 tmppath = _toslash(DupStr(str + 9));
899 #else
900 tmppath = DupStr(str + 9);
901 #endif
902 } else
903 result = ERR;
904
905 return result;
906 }
907 #endif
908
909
910
911
912 /************************** SimpleCommand ************************************/
913
914 /* \-���������ץ�������ޤ�ʸ������ɤ� */
915 #define AReadStr(p) AReadString((int *)NULL, (p))
916
917 /* \-���������ץ�������ޤ�ʸ����� brkchr �μ����ޤ��ɤ� */
918 /* ��Ȥ�ʸ����ؤΥݥ��� p ���ɤ��ʬ�����ʤ���� */
919 #define AReadStrB(p, brkchr) AReadStringB((int *)NULL, (p), &(p), (brkchr))
920
921
922 static const uchar *cmdstr;
923
924 static void
UnkCmdErr(void)925 UnkCmdErr(void)
926 {
927 #if UNIX
928 uchar *mbs = (uchar *)alloca(strlen((char *)cmdstr) * 2 + 1);
929 sjis2mbstring((char *)mbs, (char *)cmdstr);
930 Error("Unknown command: %s", mbs);
931 #else
932 Error("Unknown command: %s", cmdstr);
933 #endif
934 }
935
936 static int
ParamErr(void)937 ParamErr(void)
938 {
939 #if UNIX
940 uchar *mbs = (uchar *)alloca(strlen((char *)cmdstr) * 2 + 1);
941 sjis2mbstring((char *)mbs, (char *)cmdstr);
942 Error("Invalid parameter: %s", mbs);
943 #else
944 Error("Invalid parameter: %s", cmdstr);
945 #endif
946 return 0; /* Never */
947 }
948
949 #define IsStrParam(p) (*(p) == '"' || *(p) == '/')
950
951 static void
LookStrVal(const uchar * str)952 LookStrVal(const uchar *str)
953 {
954 int len = strlen((const char *)str);
955
956 if (len == 0)
957 ClearRetValue();
958 else
959 SetRetValue(DupStr(str), len);
960
961 if (look_opt_flag) {
962 /* ��ư�����ͤ�ɽ������ */
963 fprintf(ofp, "%s\r\n", str);
964 stdinmode = OFF; /* �ե�����̾����̵���Ǥ�ɸ�����Ϥ�Ȥ�ʤ� */
965 }
966 }
967
968 static void
LookParamVal(int n)969 LookParamVal(int n)
970 {
971 uchar str[80];
972 WtNum(str, n);
973 LookStrVal(str);
974 }
975
976 #define SW_ON 255 /* �����å��Τߥ��åȤ������ ON ���� */
977
978 /* �⡼�ɥ����å��ȿ��ͥѥ����åȤ��� */
979 /* ���Ԥ����饨�顼�����åȤ��������å����ͤ��֤� */
980 #define SetSwNE(sw, n, nmin, nmax) FSetSwNE(p, &(sw), &(n), (nmin), (nmax))
981 static int
FSetSwNE(const uchar * p,int * swp,int * np,int nmin,int nmax)982 FSetSwNE(const uchar *p, int *swp, int *np, int nmin, int nmax)
983 /* p:
984 * '?'['?'] | [{'+'|'-'|'='}][<expr>][{'+'|'-'}]
985 */
986 {
987 uchar *buf = DupStr(CutSpace(p));
988 uchar *bp = buf;
989 assert(p != NULL);
990 assert(swp != NULL);
991 assert(np != NULL);
992
993 RTrimSpace(bp);
994
995 if (*bp == '?') {
996 int n = *++bp == '?' ? (++bp, *np) : *swp;
997 if (*bp)
998 ParamErr();
999 LookParamVal(n);
1000 } else {
1001 int numflg = 0; /* '+': plus / '-': minus / '=': direct */
1002 int swflg = 0; /* '+': ON / '-': OFF / 0: no touch */
1003 uchar *bp1;
1004
1005 bp1 = StrLast(bp);
1006 if (*bp1 == '+' || *bp1 == '-') {
1007 swflg = *bp1;
1008 *bp1 = '\0';
1009 RTrimSpace(bp);
1010 }
1011 if (*bp == '+' || *bp == '-') {
1012 numflg = *bp++;
1013 } else if (*bp == '=') {
1014 bp++;
1015 } else if (swflg == 0) {
1016 swflg = '+';
1017 }
1018 if (*CutSpace(bp) && !numflg)
1019 numflg = '=';
1020
1021 if (numflg) {
1022 int num = (int)EvalExprVal(bp, (const uchar **)&bp1, EXPR_MAX);
1023 if (*bp1)
1024 ParamErr();
1025 if (numflg == '+')
1026 *np += num;
1027 else if (numflg == '-')
1028 *np -= num;
1029 else
1030 *np = num;
1031
1032 if (*np < nmin)
1033 *np = nmin;
1034 else if (*np > nmax)
1035 *np = nmax;
1036 }
1037 if (swflg == '-')
1038 *swp = OFF;
1039 else if (swflg == '+' && (swp == np ? !numflg : !*swp))
1040 *swp = SW_ON;
1041 }
1042 XFree((voidstar)buf);
1043 return *swp;
1044 }
1045
1046 /* ����ͥѥ�����Ȥ�ʤ���� */
1047 /* +��- �ʳ��Υѥ���ͭ��ΤȤ��Ͽ����֤� */
1048 #define SetSwS(sw) FSetSwS(p, &sw)
1049 static int
FSetSwS(const uchar * p,int * swp)1050 FSetSwS(const uchar *p, int *swp)
1051 {
1052 if (!*p || *p == '?' || (*p == '+' || *p == '-') && !*SkipSpace(p+1)) {
1053 if (*p == '?') {
1054 int looksw = *++p == '?' ? (++p, FALSE) : TRUE;
1055 if (*p)
1056 ParamErr();
1057 if (looksw) {
1058 LookParamVal(*swp);
1059 return FALSE;
1060 } else {
1061 ClearRetValue();
1062 return TRUE;
1063 }
1064 } else {
1065 *swp = *p == '-' ? OFF : ON;
1066 return FALSE;
1067 }
1068 }
1069 if (*p == '/' || *p == '"')
1070 *swp = ON;
1071
1072 return TRUE;
1073 }
1074
1075 /* ���Ԥ����饨�顼�����åȤ��������å����ͤ��֤� */
1076 #define SetSwE(sw) FSetSwE(p, &sw)
1077 static int
FSetSwE(const uchar * p,int * swp)1078 FSetSwE(const uchar *p, int *swp)
1079 {
1080 return FSetSwNE(p, swp, swp, 0, UCHAR_MAX);
1081 }
1082
1083 /* ʸ����ѥ�������Ƭ�� '/' �� '=' �������. �̤�ʸ������Ƭ�ʤ饨�顼 */
1084 /* ��������'"' �� null �ʤ餽�Τޤޤˤ��� */
1085 #define ParamStr(p) FParamStr(&p)
1086 static uchar *
FParamStr(const uchar ** pp)1087 FParamStr(const uchar **pp)
1088 {
1089 if (!**pp || **pp == '"')
1090 ;
1091 else if (**pp == '/' || **pp == '=')
1092 ++*pp;
1093 else
1094 ParamErr();
1095 return (uchar *)*pp;
1096 }
1097
1098
1099 /* ʸ�����åȤåȡ��ɲ� */
1100 #define SetChrSet(cset) FSetChrSet(&cset, _Paste2(cset, _s), p)
1101 static void
FSetChrSet(uchar ** csetp,uchar * cset_s,const uchar * p)1102 FSetChrSet(uchar **csetp, uchar *cset_s, const uchar *p)
1103 {
1104 uchar *cset = *csetp;
1105
1106 if (!*p) {
1107 SReset(cset); /* �ǥե������ cset_s ���᤹ */
1108 } else if (*p == '?') {
1109 LookStrVal(cset); /* �����ͤ�ɽ�� */
1110 } else if (*p == '=') {
1111 SFree(cset);
1112 cset = AReadStr(p + 1); /* �֤����� */
1113 } else {
1114 uchar *addp = AReadStr(ParamStr(p));
1115 uchar *newp = (uchar *)XMalloc(strlen((char *)cset) + strlen((char *)addp) + 1);
1116 strcpy((char *)newp, (char *)cset);
1117 strcat((char *)newp, (char *)addp); /* �ɲ� */
1118 SFree(cset);
1119 cset = newp;
1120 }
1121 *csetp = cset;
1122 }
1123
1124 /* ʸ����å� */
1125 #define SetStr(str) FSetStr(&str, _Paste2(str, _s), p)
1126 static void
FSetStr(uchar ** strp,uchar * str_s,const uchar * p)1127 FSetStr(uchar **strp, uchar *str_s, const uchar *p)
1128 {
1129 uchar *str = *strp;
1130
1131 if (!*p) {
1132 SReset(str); /* �ǥե������ str_s ���᤹ */
1133 } else if (*p == '?') {
1134 LookStrVal(str); /* �����ͤ�ɽ�� */
1135 } else {
1136 SFree(str);
1137 str = AReadStr(ParamStr(p)); /* �֤����� */
1138 }
1139 *strp = str;
1140 }
1141
1142 static void
CheckPageBE1(const uchar * page)1143 CheckPageBE1(const uchar *page)
1144 {
1145 const uchar *p = page;
1146
1147 if (!*p) {
1148 return;
1149 } else if (isdigit(*p)) {
1150 while (*++p && isdigit(*p));
1151 if (!*p)
1152 return;
1153 } else if (!absppmode && islower(*p)) {
1154 if (!p[strspn((const char *)p, "ivxlcdm")])
1155 return;
1156 } else if (!absppmode && isupper(*p)) {
1157 if (!p[strspn((const char *)p, "IVXLCDM")])
1158 return;
1159 }
1160 Error("Page error: %s", page);
1161 }
1162
1163 static void
CheckPageBE(void)1164 CheckPageBE(void)
1165 /* pagebegin, pageend ���������ڡ����ֹ�ι�ʸ�������å� */
1166 {
1167 while (*pagebegin == '0' && *(pagebegin + 1))
1168 ++pagebegin;
1169 while (*pageend == '0' && *(pageend + 1))
1170 ++pageend;
1171 CheckPageBE1(pagebegin);
1172 CheckPageBE1(pageend);
1173 }
1174
1175
1176 static void
ChangeHanZenTable(const uchar * hanzens)1177 ChangeHanZenTable(const uchar *hanzens)
1178 {
1179 unsigned ank;
1180 unsigned zen;
1181 while (*hanzens) {
1182 ank = RdMoji(hanzens);
1183 zen = RdMoji(hanzens);
1184 if (ChangeANKtoZen(ank, zen) == 0)
1185 ParamErr();
1186 }
1187 }
1188
1189 static void
SetHanZen(const uchar * p)1190 SetHanZen(const uchar *p)
1191 {
1192 if (!*p) {
1193 ;
1194 } else if (*p == '?') {
1195 #define HZTBLSIZE (((0x7f-0x20)+(0xe0-0xa1)) * 3 + 1)
1196 uchar hztbl[HZTBLSIZE];
1197 uchar *tp = hztbl;
1198 unsigned c, c2;
1199 for (c = 0x20; c < 0xe0; c++) {
1200 if (c == 0x7f) c = 0xa1;
1201 *tp++ = c;
1202 c2 = ANKtoZen(c);
1203 tp += SetKanji(c2, tp);
1204 }
1205 *tp = '\0';
1206 assert(tp == hztbl + HZTBLSIZE - 1);
1207 LookStrVal(hztbl);
1208 } else {
1209 uchar *str = AReadStr(ParamStr(p));
1210 ChangeHanZenTable(str);
1211 XFree((voidstar)str);
1212 }
1213 }
1214
1215 static int
PrimitiveCommand(const uchar * cmd)1216 PrimitiveCommand(const uchar *cmd)
1217 {
1218 const uchar *p = cmd;
1219 const uchar *p1;
1220 int sw = 1;
1221 int num = -1;
1222
1223 if (!islower(*p) || (++p, islower(*p)) && (++p, islower(*p))) {
1224 /* �Ѿ�ʸ�����ޤ��ϣ�ʸ���ʳ��ϥץ�ߥƥ��֥��ޥ�ɤǤʤ� */
1225 return FALSE;
1226 }
1227 p1 = p;
1228
1229 switch ((p - cmd) > 1 ? MkMoji(*cmd, *(cmd+1)) : *cmd) {
1230 case 'w': /* w: Wrap mode */
1231 sw = wrapmode;
1232 SetSwNE(wrapmode, width, indent + 2, MAXWIDTH);
1233 if (wrapmode != sw && x <= width) {
1234 if (wrapmode)
1235 nobreakpos = 0;
1236 else
1237 nobreakpos = x; /* ON ���� OFF �ˤʤä�����֤� */
1238 }
1239 break;
1240 case2('w','l'): /* wl: Width byte count Limit */
1241 SetSwNE(wlmode, wlimit, 1, LBUFSIZE);
1242 break;
1243 case2('w','k'): /* wk: Width Kiko byte count mode */
1244 wlmode = SetSwNE(wkmode, kikosize, 0, LBUFSIZE);
1245 break;
1246 case 'f': /* f: line Fill mode */
1247 SetSwE(fillmode);
1248 break;
1249 case 'e': /* e: Enable intext commands */
1250 sw = emode;
1251 SetSwE(emode);
1252 if (sw != emode) {
1253 if (emode)
1254 Command(esetcmd); /* �����ߥ��ޥ�ɤ�������� */
1255 else
1256 Command(eclrcmd); /* ����ꥢ */
1257 }
1258 break;
1259 case2('e','s'): /* es: set e-set command str */
1260 SetStr(esetcmd);
1261 if (*p != '?') {
1262 Command(eclrcmd); /* ��������ꥢ */
1263 Command(esetcmd); /* �����˥��å� */
1264 }
1265 break;
1266 case2('e','c'): /* ec: set e-clear command str */
1267 SetStr(eclrcmd);
1268 break;
1269 case 'a': /* a: normal Adjusting mode */
1270 SetSwNE(normadjmode, spadjlimit, 0, UCHAR_MAX);
1271 break;
1272 case2('a','j'): /* aj: normal AdJusting mode */
1273 sjmode = normadjmode = SetSwE(ajmode);
1274 break;
1275 case2('a','c'): /* ac: Center adjusting mode */
1276 if (SetSwE(centeradjmode))
1277 rightadjmode = bothadjmode = OFF;
1278 break;
1279 case2('a','r'): /* ar: Right adjusting mode */
1280 if (SetSwE(rightadjmode))
1281 centeradjmode = bothadjmode = OFF;
1282 break;
1283 case2('a','b'): /* ab: Both adjusting mode */
1284 if (SetSwE(bothadjmode))
1285 centeradjmode = rightadjmode = OFF;
1286 break;
1287 case2('a','i'): /* ai: Auto Indent mode */
1288 SetSwE(aimode);
1289 break;
1290 case2('a','f'): /* af: Auto-indented text Fill */
1291 fillmode = aimode = SetSwE(afmode);
1292 break;
1293 case2('a','s'): /* as: Auto jpn-eng Space */
1294 SetSwE(asmode);
1295 break;
1296 case2('a','l'): /* al: Auto Line space */
1297 SetSwE(almode);
1298 break;
1299 case 'l': /* l: Line space */
1300 SetSwNE(linespmode, splines, 0, UCHAR_MAX);
1301 break;
1302 case2('l','n'): /* ln: Line Number */
1303 num = lineno;
1304 SetSwNE(sw, num, 0, pagelines);
1305 /* ���ڡ����������ʤȤ���� .ln-1 ������С����ڡ������ʤ��ʤ�
1306 �褦�ˤ��� */
1307 if (pageendflag && pagecutflag && ((long)lineno > pagelines)
1308 && (num <= pagelines)) {
1309 pageendflag = pagecutflag = OFF;
1310 }
1311 lineno = num;
1312 break;
1313 case 'i': /* i: Indent */
1314 SetSwNE(bindentmode, indent, 0, width - 2);
1315 break;
1316 case2('i','i'): /* ii: Ignore Indent mode */
1317 SetSwE(ignoreindentmode);
1318 break;
1319 case2('i','p'): /* ip: Paragraph indent */
1320 SetSwNE(pindentmode, pindent, 0, width - 2);
1321 break;
1322 case 'h': /* h: Hanging indent */
1323 SetSwNE(hindentmode, hindent, 0, width - 2);
1324 break;
1325 case 'q': /* q: Quote mode */
1326 if (SetSwS(quotemode))
1327 SetStr(quotestr);
1328 break;
1329 case 't': /* t: Tab to space */
1330 SetSwNE(tabtospmode, itabstop, 1, width - 2);
1331 break;
1332 case 's': /* s: Space to tab */
1333 SetSwNE(sptotabmode, otabstop, 1, width - 2);
1334 break;
1335 case2('s','z'): /* sz: output Zenkaku space */
1336 SetSwE(szmode);
1337 break;
1338 case2('s','h'): /* sh: output Hankaku space */
1339 SetSwE(shmode);
1340 break;
1341 case2('s','k'): /* sk: skmode */
1342 SetSwNE(skmode, alttabsp, 0, 255);
1343 break;
1344 case2('s','n'): /* sn: Space No ignore */
1345 SetSwE(snmode);
1346 break;
1347 case2('s','s'): /* ss: Skip jpn-eng Space */
1348 SetSwE(ssmode);
1349 break;
1350 case2('s','j'): /* sj: Space adJusting */
1351 SetSwE(sjmode);
1352 break;
1353 case2('s','p'): /* sp: Space Lines */
1354 num = 1;
1355 if (SetSwNE(sw, num, 0, UCHAR_MAX)) {
1356 num -= spacelines; /* ľ���˶���Ԥ����Ϥ���Ƥ��餽��ʬ����� */
1357 linespaced = 0;
1358 FreshLine();
1359 while (num-- > 0)
1360 NewLine();
1361 linespaced = 1;
1362 }
1363 break;
1364 case2('i','l'): /* il: Ignore Line space */
1365 SetSwE(ignorelinespmode);
1366 break;
1367 case 'r': /* r: Replace */
1368 if (SetSwS(rplmode)) {
1369 if (*p == '?')
1370 LookStrVal("");
1371 else
1372 DefineRplStr(ParamStr(p));
1373 }
1374 break;
1375 case2('r','e'): /* re: Replace Expression mode# */
1376 SetSwNE(sw, remodeno, 0, 3);
1377 break;
1378 case2('r', 'c'): /* rc: Replace Clear */
1379 num = 0;
1380 if (SetSwNE(sw, num, 0, 2)) {
1381 ResetRplList(&rlist_top); /* �ִ��ꥹ�Ȥꥢ */
1382 switch (num) {
1383 case 2:
1384 ResetRplList(&srlist_top);
1385 ResetCntrlLists(); /* ���楳��������٤ƥ��ꥢ */
1386 break;
1387 case 1: /* ñ�ʤ��ִ��ꥹ�ȥ��ꥢ */
1388 case 0:
1389 default:;
1390 }
1391 if (emode) /* �����ߥ��ޥ��ͭ���ʤ� */
1392 Command(esetcmd); /* �����ߥ��ޥ�ɤ������ľ�� */
1393 }
1394 break;
1395 case2('p','g'): /* pg: Paging mode */
1396 SetSwNE(pagemode, pageno, 0, SHRT_MAX);
1397 break;
1398 case 'p': /* p: Page */
1399 SetSwNE(pagemode, newpageno, 0, SHRT_MAX);
1400 if (pagemode && intextflag) {
1401 pagecutflag = OFF; /* �������ڡ����ǤϤʤ� */
1402 WritePage(); /* ���ڡ��������Ƥʤ�إå��Τ߽��� */
1403 /* ���β��ڡ����Τ������Ȥʤ�ʤˤ⤷�ʤ� */
1404 } else if (newpageno != -1){
1405 pageno = newpageno;
1406 newpageno = -1;
1407 }
1408 break;
1409 case2('p','p'): /* pp: Partial Print */
1410 if (isdigit(*p)) {
1411 absppmode = ON; /* pp ��ľ�夬�����ʤ����Хڡ������� */
1412 } else {
1413 ParamStr(p);
1414 absppmode = OFF;
1415 }
1416 pagebegin = AReadStrB(p, '/');
1417 if (!*p) {
1418 /* �⤷�����ϥڡ����λ��ꤷ���ʤ��ä��顢��λ�ڡ��� = ���ϥڡ��� */
1419 pageend = pagebegin;
1420 } else {
1421 ParamStr(p);
1422 pageend = AReadStrB(p, '/');
1423 ParamStr(p);
1424 }
1425 CheckPageBE();
1426 SetSwNE(pagemode, pagestep, 0, UCHAR_MAX);
1427 break;
1428 case2('p','h'): /* ph: Page Header */
1429 if (!*p || IsStrParam(p)) {
1430 SReset(phleft);
1431 SReset(phcenter);
1432 SReset(phright);
1433 if (*p) {
1434 ParamStr(p);
1435 phleft = AReadStrB(p, '/');
1436 ParamStr(p);
1437 phcenter = AReadStrB(p, '/');
1438 ParamStr(p);
1439 phright = AReadStrB(p, '/');
1440 ParamStr(p);
1441 }
1442 }
1443 SetSwNE(pagemode, phlines, 0, UCHAR_MAX);
1444 phpfchgflag = ON;
1445 break;
1446 case2('p','f'): /* pf: Page Footer */
1447 if (!*p || IsStrParam(p)) {
1448 if (newpfleft != pfleft && newpfleft != pfleft_s)
1449 XFree((voidstar)newpfleft);
1450 if (newpfcenter != pfcenter && newpfcenter != pfcenter_s)
1451 XFree((voidstar)newpfcenter);
1452 if (newpfright != pfright && newpfright != pfright_s)
1453 XFree((voidstar)newpfright);
1454 newpfleft = pfleft_s;
1455 newpfcenter = pfcenter_s;
1456 newpfright = pfright_s;
1457 if (*p) {
1458 ParamStr(p);
1459 newpfleft = AReadStrB(p, '/');
1460 ParamStr(p);
1461 newpfcenter = AReadStrB(p, '/');
1462 ParamStr(p);
1463 newpfright = AReadStrB(p, '/');
1464 ParamStr(p);
1465 }
1466 }
1467 SetSwNE(pagemode, pflines, 0, UCHAR_MAX);
1468 phpfchgflag = ON;
1469 break;
1470 case2('p','s'): /* ps: Page header/footer setting */
1471 if (SetSwE(pagemode))
1472 PageSetting();
1473 break;
1474 case2('p','l'): /* pl: Page Length */
1475 SetSwNE(sw, pagelines, 0, UCHAR_MAX);
1476 break;
1477 case2('p','t'): /* pt: Page Top space */
1478 SetSwNE(sw, pagetopsp, 0, UCHAR_MAX);
1479 break;
1480 case2('p','b'): /* pb: Page Botom space */
1481 SetSwNE(pagebtmmode, pagebtmsp, 0, UCHAR_MAX);
1482 break;
1483 case2('p','o'): /* po: Page Offset */
1484 SetSwNE(sw, pageoffset, 0, MAXWIDTH);
1485 break;
1486 case2('p','j'): /* pj: ANK to HW */
1487 #if MSDOS || WINNT
1488 SetSwE(anktohwmode);
1489 #endif
1490 break;
1491 case2('p','v'): /* pv: Vertical expand mode# */
1492 SetSwNE(sw, vexpmodeno, 0, 3);
1493 break;
1494 case2('p','w'): /* pw: Width expand mode# */
1495 SetSwNE(sw, wexpmodeno, 0, 3);
1496 break;
1497 case2('p','x'): /* px: Plain teXt output mode */
1498 SetSwE(plaintextmode);
1499 break;
1500 case2('p','m'): /* pm: */
1501 SetSwE(pmmode);
1502 break;
1503 case2('p','n'): /* pn: No cntrl output */
1504 SetSwE(nocntrlmode);
1505 break;
1506 case2('n','p'): /* np: No form feed output */
1507 SetSwE(noffmode);
1508 break;
1509 case2('n','r'): /* nr: No Return output */
1510 SetSwE(nocrmode);
1511 break;
1512 case2('p','c'): /* pc: for pc98 SGR seq */
1513 SetSwE(sgr98mode);
1514 break;
1515 case 'n': /* n: Need # lines */
1516 num = 4;
1517 if (SetSwNE(sw, num, 1, UCHAR_MAX)) {
1518 if (pagemode && pagelines && pagelines - (long)lineno + 1 < num) {
1519 /* �ĹԿ�������Կ��������ʤ���в��ڡ��� */
1520 pagecutflag = OFF; /* �������ڡ����ǤϤʤ� */
1521 WritePage();
1522 }
1523 }
1524 break;
1525 case 'o': /* o: Output file */
1526 if (SetSwS(mkbakmode)) {
1527 if (*p == '?') {
1528 LookStrVal("");
1529 } else {
1530 mkbakmode = stdoutmode = OFF;
1531 if (!(chgextmode = (*p == '.')) && *p != '=') {
1532 ParamErr();
1533 }
1534 SetOFile(++p);
1535 }
1536 } else if (*p != '?') {
1537 if (mkbakmode) {
1538 if (stdinmode)
1539 mkbakmode = OFF;
1540 else
1541 stdoutmode = OFF;
1542 if (mkbakmode)
1543 SetOFile(p);
1544 } else {
1545 stdoutmode = ON;
1546 ofp = stdout;
1547 }
1548 }
1549 break;
1550 case2('n','k'): /* nk: No Kanji mode */
1551 SetSwE(nokanjimode);
1552 break;
1553 case2('n','w'): /* nw: No Warning mode */
1554 SetSwE(noerrmode);
1555 break;
1556 case2('n','n'): /* nn: No Newlineless line */
1557 SetSwE(nountermlinemode);
1558 break;
1559 case 'b': /* b: Binary mode */
1560 SetSwE(binarymode);
1561 SetFModeB(binarymode); /* �ǥե�����Ȥ� binary file mode */
1562 SetModeB(ifp, binarymode); /* ifp ��Х��ʥ�⡼�ɤ� */
1563 break;
1564 case 'm': /* m: More mode */
1565 SetSwNE(moremode, moresize, 0, UCHAR_MAX);
1566 morecnt = moresize;
1567 break;
1568 case 'd': /* d: Delay mode */
1569 SetSwNE(delaymode, delaytime, 0, 1000);
1570 break;
1571 case2('k','o'): /* ko: Oidasi kinsoku only */
1572 SetSwE(oidasimode);
1573 break;
1574 case2('k','k'): /* kk: Kinsoku mode K */
1575 SetSwE(kkmode);
1576 break;
1577 case2('k','h'): /* kh: Kinsoku mode H */
1578 SetSwE(khmode);
1579 break;
1580 case2('k','z'): /* kz: Kinsoku mode Z */
1581 SetSwE(kzmode);
1582 break;
1583 case2('k','n'): /* kn: Kinsoku mode N */
1584 SetSwE(knmode);
1585 break;
1586 case2('k','c'): /* kc: Kinsoku mode C */
1587 SetSwE(kcmode);
1588 break;
1589 case2('k','e'): /* ke: for English text */
1590 SetSwE(kemode);
1591 break;
1592 case2('k','x'): /* kx: no kinsoku */
1593 SetSwE(kxmode);
1594 break;
1595 case2('k','f'): /* kf: fill whithout space */
1596 SetSwE(kfmode);
1597 break;
1598 case2('k','j'): /* kj: for japanese TeX text */
1599 SetSwE(jtexmode);
1600 break;
1601 case2('k','t'): /* kt: gyouTou kinsoku chars */
1602 SetChrSet(gtkinsoku);
1603 break;
1604 case2('k','d'): /* kd: gyoutou kinsoku 2 chars */
1605 SetChrSet(gtkinsoku2);
1606 break;
1607 case2('k','m'): /* km: gyouMatu kinsoku chars */
1608 SetChrSet(gmkinsoku);
1609 break;
1610 case2('k','a'): /* ka: Alphabetic chars */
1611 SetChrSet(alnum2);
1612 break;
1613 case2('k','i'): /* ki: Item mark chars */
1614 SetChrSet(itemmark);
1615 break;
1616 case2('k','s'): /* ks: post-Space adjustable chars */
1617 SetChrSet(postspadjchrs);
1618 break;
1619 case2('k','p'): /* kp: Pre-space adjustable chars */
1620 SetChrSet(prespadjchrs);
1621 break;
1622 case2('h','z'): /* hz: change Hankaku-Zenkaku table */
1623 SetHanZen(p);
1624 break;
1625 case2('c','h'): /* ch: Convert zenkaku to Hankaku */
1626 SetSwE(zenhanconv);
1627 if (*p != '?') {
1628 if (zenhanconv > 3)
1629 zenhanconv = 1;
1630 if (zenhanconv)
1631 rplmode = ON;
1632 hanzenconv = -zenhanconv;
1633 }
1634 break;
1635 case2('c','z'): /* cz: Convert hankaku to Zenkaku */
1636 SetSwE(hanzenconv);
1637 if (*p != '?') {
1638 if (hanzenconv > 3)
1639 hanzenconv = 1;
1640 if (hanzenconv)
1641 rplmode = ON;
1642 zenhanconv = -hanzenconv;
1643 }
1644 break;
1645 case2('n','z'): /* nz: No ctrl-Z */
1646 #if MSDOS || WINNT
1647 SetSwE(noctrlzmode);
1648 #endif
1649 break;
1650 case 'z': /* z: Zero line feed mode */
1651 SetSwE(zerolinefeedmode);
1652 break;
1653 case2('b','e'): /* be: Eval Buffer size */
1654 SetSwNE(sw, *(int *)&evalbufsize, 1, SHRT_MAX);
1655 break;
1656 case 'v': /* v: Verbatim */
1657 if (*p)
1658 ParamErr();
1659 Command("-");
1660 break;
1661
1662 case2('d','d'): /* dd : debug */
1663 SetSwNE(debug, debug, SHRT_MIN, SHRT_MAX);
1664 p = NULL;
1665 break;
1666
1667 default:
1668 return FALSE;
1669 }
1670
1671 if (*p1 != '?')
1672 ClearRetValue();
1673
1674 return TRUE;
1675 }
1676
1677
1678 void
SimpleCommand(const uchar * p)1679 SimpleCommand(const uchar *p)
1680 {
1681 assert(p != NULL);
1682
1683 cmdstr = p; /* ���顼ɽ���Ѥ˵��� */
1684
1685 if (!*p)
1686 return;
1687
1688 if (IsKSym1Str(p)) {
1689 if (PrimitiveCommand(p)) {
1690 /* �ץ�ߥƥ��֥��ޥ�� */
1691 look_opt_flag = 0;
1692 return;
1693 } else if (IsFuncArgStr(SkipKSym2(p))) {
1694 /* �ؿ��ƽФ����ޥ�� */
1695 look_opt_flag = 0;
1696 EvalReturnExpr(p, EXPR_PRIM);
1697 return;
1698 }
1699 }
1700
1701 look_opt_flag = 0;
1702
1703 switch(*p++) {
1704 case '=': /* = : output cntrl seq (direct) */
1705 case ':': /* : : output cntrl seq (symbol) */
1706 if (*cmdstr == '=') {
1707 clength = ReadString(cbuf, p);
1708 } else {
1709 uchar *sym = AReadStr(p);
1710 if (!RplStr(sym, 1)) {
1711 #if UNIX
1712 uchar *mbs = (uchar *)alloca(strlen((char *)p) * 2 + 1);
1713 sjis2mbstring((char *)mbs, (char *)p);
1714 Error("Undefined symbol: %s", mbs);
1715 #else
1716 Error("Undefined symbol: %s", p);
1717 #endif
1718 }
1719 XFree((voidstar)sym);
1720 }
1721 WriteNC(cbuf, clength);
1722 break;
1723 case '@': /* @ : include a file */
1724 if (*p == '=') {
1725 Include(p+1, 1);
1726 } else
1727 Include(p, 0);
1728 break;
1729 case '(': /* '(' <expr> ')' */
1730 case '{':
1731 case '"':
1732 EvalReturnExpr(p-1, EXPR_PRIM);
1733 break;
1734 case '/': /* / : silentmode */
1735 if (!(intextflag || includeflag)) {
1736 SetSwE(silentmode);
1737 }
1738 break;
1739 default:
1740 UnkCmdErr();
1741 }
1742 }
1743
1744
1745 /**************************************/
1746
1747 void
PushParam(int count)1748 PushParam(int count)
1749 /* ���ߤ������ѥ��������Ƥ��å�����¸���� */
1750 /* count �����ξ�硤���� count �Ԥ���Ϥ����� PopParam ���ƤФ��
1751 ��¸���줿���֤���������� */
1752 {
1753 params_t *ps;
1754
1755 ps = (params_t *)XMalloc(sizeof(params_t));
1756 ps->e_ = emode;
1757 ps->w_ = wrapmode;
1758 ps->f_ = fillmode;
1759 ps->a_ = normadjmode;
1760 ps->aj_ = ajmode;
1761 ps->ac_ = centeradjmode;
1762 ps->ar_ = rightadjmode;
1763 ps->ab_ = bothadjmode;
1764 ps->as_ = asmode;
1765 ps->ss_ = ssmode;
1766 ps->sj_ = sjmode;
1767 ps->al_ = almode;
1768 ps->ai_ = aimode;
1769 ps->af_ = afmode;
1770 ps->i_ = bindentmode;
1771 ps->h_ = hindentmode;
1772 ps->ip_ = pindentmode;
1773 ps->ii_ = ignoreindentmode;
1774 ps->il_ = ignorelinespmode;
1775 ps->l_ = linespmode;
1776 ps->q_ = quotemode;
1777 ps->t_ = tabtospmode;
1778 ps->s_ = sptotabmode;
1779 ps->sz_ = szmode;
1780 ps->sh_ = shmode;
1781 ps->sk_ = skmode;
1782 ps->sn_ = snmode;
1783 ps->pj_ = anktohwmode;
1784 ps->pm_ = pmmode;
1785 ps->r_ = rplmode;
1786 ps->ko_ = oidasimode;
1787 ps->kn_ = knmode;
1788 ps->kh_ = khmode;
1789 ps->kc_ = kcmode;
1790 ps->kz_ = kzmode;
1791 ps->kk_ = kkmode;
1792 ps->ke_ = kemode;
1793 ps->kx_ = kxmode;
1794 ps->kf_ = kfmode;
1795 ps->kj_ = jtexmode;
1796 ps->nk_ = nokanjimode;
1797 ps->z_ = zerolinefeedmode;
1798
1799 ps->w = width;
1800 ps->a = spadjlimit;
1801 ps->i = indent;
1802 ps->h = hindent;
1803 ps->ip = pindent;
1804 ps->l = splines;
1805 ps->t = itabstop;
1806 ps->s = otabstop;
1807 ps->sk = alttabsp;
1808
1809 ps->count = count;
1810 ps->prev = params;
1811 params = ps;
1812 }
1813
1814 void
PopParam(int countmode)1815 PopParam(int countmode)
1816 /* �����å�����¸����Ƥ��ѥ����ξ��֤��������� */
1817 /* countmode == -1 �ʤ饫�����դ��Ǥʤ������å��ξ��֤ޤǤ�ɤ� */
1818 /* countmode < -1 �ʤ餹�٤Ƥ�ɤ� */
1819 {
1820 params_t *ps = params;
1821
1822 if (ps == NULL) /* �����å��������ä��餹������ */
1823 return;
1824
1825 if (countmode >= 0 || countmode == ps->count || ps->prev == NULL) {
1826
1827 if (emode && !ps->e_)
1828 Command(eclrcmd);
1829 else if (!emode && ps->e_)
1830 Command(esetcmd);
1831
1832 if (ps->w_ != wrapmode && x <= ps->w) {
1833 if (!wrapmode)
1834 nobreakpos = 0;
1835 else
1836 nobreakpos = x; /* ON ���� OFF �ˤʤä�����֤� */
1837 }
1838
1839 emode = ps->e_;
1840 wrapmode = ps->w_;
1841 fillmode = ps->f_;
1842 normadjmode = ps->a_;
1843 ajmode = ps->aj_;
1844 centeradjmode = ps->ac_;
1845 rightadjmode = ps->ar_;
1846 bothadjmode = ps->ab_;
1847 asmode = ps->as_;
1848 ssmode = ps->ss_;
1849 sjmode = ps->sj_;
1850 almode = ps->al_;
1851 aimode = ps->ai_;
1852 afmode = ps->af_;
1853 bindentmode = ps->i_;
1854 hindentmode = ps->h_;
1855 pindentmode = ps->ip_;
1856 ignoreindentmode= ps->ii_;
1857 ignorelinespmode= ps->il_;
1858 linespmode = ps->l_;
1859 quotemode = ps->q_;
1860 tabtospmode = ps->t_;
1861 sptotabmode = ps->s_;
1862 szmode = ps->sz_;
1863 shmode = ps->sh_;
1864 skmode = ps->sk_;
1865 snmode = ps->sn_;
1866 anktohwmode = ps->pj_;
1867 pmmode = ps->pm_;
1868 rplmode = ps->r_;
1869 oidasimode = ps->ko_;
1870 knmode = ps->kn_;
1871 khmode = ps->kh_;
1872 kcmode = ps->kc_;
1873 kzmode = ps->kz_;
1874 kkmode = ps->kk_;
1875 kemode = ps->ke_;
1876 kxmode = ps->kx_;
1877 kfmode = ps->kf_;
1878 jtexmode = ps->kj_;
1879 nokanjimode = ps->nk_;
1880 zerolinefeedmode= ps->z_;
1881
1882 width = ps->w;
1883 spadjlimit = ps->a;
1884 indent = ps->i;
1885 hindent = ps->h;
1886 pindent = ps->ip;
1887 splines = ps->l;
1888 itabstop = ps->t;
1889 otabstop = ps->s;
1890 alttabsp = ps->sk;
1891
1892 params = ps->prev;
1893 XFree((voidstar)ps);
1894 } else {
1895 params = ps->prev;
1896 XFree((voidstar)ps);
1897 PopParam(countmode);
1898 }
1899 }
1900
1901
1902
1903 void
SetOFile(const uchar * name)1904 SetOFile(const uchar *name)
1905 {
1906 FILE *ofp0 = ofp;
1907
1908 if (chgextmode) {
1909 /* ��ĥ�һ���ʤ� */
1910 if (stdinmode)
1911 return;
1912
1913 ofilename = ChgExt(ifilename1, name);
1914 } else if (!mkbakmode) {
1915 ofilename = DupStr(name);
1916 }
1917 if (SameFile(ofilename, ifilename1))
1918 mkbakmode = ON;
1919
1920 fflush(ofp); /* ���ν��ϥ��ȥ��Хåե������Ƥ�Ϥ����� */
1921
1922 stdoutmode = OFF;
1923
1924 if ((chgextmode || mkbakmode) && !FileExists(ifilename1))
1925 Error("Can't open file: %s", ifilename1);
1926
1927 if (mkbakmode) {
1928 bakfilename = ChgExt(ifilename1, BAK_EXT);
1929 if (FileExists(bakfilename)) /* ����BAK�ե����뤬¸�ߤ��Ƥ���*/
1930 remove((char *)bakfilename); /* ������� */
1931 if (rename((char *)ifilename1, (char *)bakfilename)) {
1932 #if UNIX
1933 Error("Can't create .bak file: %s", bakfilename);
1934 #else
1935 Error("Can't create .BAK file: %s", bakfilename);
1936 #endif
1937 }
1938 ofilename = ifilename1;
1939 } else {
1940 ofilemode = ON;
1941 }
1942
1943 if ((ofp = fopen((char *)ofilename, WRITE_BINARY)) == NULL) {
1944 ofp = ofp0;
1945 Error("Can't create file: %s", ofilename);
1946 }
1947 SetOutMode(ofp);
1948 }
1949
1950
1951 void
Include(const uchar * fname,int abs_fname_flg)1952 Include(const uchar *fname, int abs_fname_flg)
1953 /* �ե����������� */
1954 /* �Ƶ�Ū�ʥե�����μ����ߤ��Ǥ��� */
1955 /* ���� abs_fname_flg �����ʤ顢�ե�����̾�� .XTR ��ĥ�Ҥ�
1956 �դ��ơ������ȥǥ��쥯�ȥ�ʳ��� XTRPATH �ǥ��쥯�ȥ��ͭ���ˤ��� */
1957 {
1958 uchar *ifilename0 = ifilename;
1959 FILE *ifp0 = ifp;
1960 unsigned ilineno0 = ilineno;
1961 unsigned nlcount0 = nlcount;
1962 int includeflag0 = includeflag;
1963 int inmtextflag0 = inmtextflag;
1964 uchar *sbufp0 = sbufp;
1965 uchar *sbufp2 = NULL; /* �������ƥ����ȥХåե����Ƥ���¸ */
1966 jmp_buf errorjb0;
1967 uchar *ifname;
1968
1969 memcpy(errorjb0, errorjb, sizeof(jmp_buf));
1970
1971 if (setjmp(errorjb) == 0) {
1972 if (!intextflag) {
1973 /* �ƥ����Ȥγ�����μ�������ξ�� */
1974 SetFModeB(0); /* �����ߤ�ɬ���ƥ����ȥե����� */
1975 Command(esetcmd); /* �����ߥ��ޥ��ͭ���ˤ��� */
1976 }
1977 if (abs_fname_flg || FNameExt(fname)) {
1978 ifname = DupStr(fname);
1979 } else {
1980 /* ��ĥ�Ҥ��դ��Ƥʤ��ʤ� */
1981 ifname = ChgExt(fname, XTR_EXT); /* ".XTR" ���դ��� */
1982 }
1983
1984 if ((ifp = fopen((char *)ifname, "r")) == NULL) {
1985 #if UNIX
1986 if (!abs_fname_flg && !FNameHasPath(ifname)) {
1987 uchar *ifname2;
1988 ifname2 = NULL;
1989 if (xtrpath && (ifname2 = PathFName(xtrpath, ifname)) != NULL)
1990 ifp = fopen((char *)ifname2, "r");
1991 #ifdef XTRPATH
1992 if (ifp == NULL) {
1993 ifname2 = (uchar *)XMalloc(strlen(XTRPATH) + strlen((char *)ifname) + 2);
1994 PathCat((uchar *)strcpy((char *)ifname2, XTRPATH), ifname);
1995 ifp = fopen((char *)ifname2, "r");
1996 }
1997 #endif
1998 if (ifp == NULL)
1999 Error("Can't open file: %s", ifname);
2000 if (ifname != fname)
2001 XFree((voidstar)ifname);
2002 ifname = ifname2;
2003 }
2004 #else /* !UNIX */
2005 if (!abs_fname_flg && xtrpath && !FNameHasPath(ifname)) {
2006 /* �ե����뤬�����ȥǥ��쥯�ȥ�ˤʤ� XTRPATH ��
2007 �������Ƥ�� */
2008 uchar *ifname2 = PathFName(xtrpath, ifname);
2009
2010 if (!ifname2 || (ifp = fopen(ifname2, "r")) == NULL) {
2011 Error("Can't open file: %s", ifname);
2012 }
2013 if (ifname != fname) XFree((voidstar)ifname);
2014 ifname = ifname2;
2015 }
2016 #endif /* !UNIX */
2017 else {
2018 Error("Can't open file: %s", ifname);
2019 }
2020 }
2021 if (sbufp != SBUFBTM) {
2022 /* �������ƥ����ȥХåե������Ǥʤ���� */
2023 sbufp2 = DupStrDiff(sbufp, SBUFBTM); /* ���ԡ����ä� */
2024 sbufp = SBUFBTM; /* ���ꥢ���� */
2025 }
2026 includeflag = ON;
2027 inmtextflag = OFF;
2028 SetInMode(ifp);
2029 ifilename = ifname;
2030 Trans(); /* �¹� */
2031 Disp(1); /* �¹Էв�ɽ�� */
2032 fclose(ifp);
2033 }
2034 ifilename = ifilename0;
2035 ifp = ifp0;
2036 SetInMode(ifp);
2037 ilineno = ilineno0;
2038 nlcount = nlcount0;
2039 includeflag = includeflag0;
2040 inmtextflag = inmtextflag0;
2041
2042 if (!includeflag)
2043 SetFModeB(binarymode);
2044 if (!emode && !includeflag)
2045 Command(eclrcmd);
2046
2047 if (sbufp2) {
2048 /* ���Υ������ƥ����ȥХåե����Ƥ���������Ƥ���ʤ� */
2049 sbufp = sbufp0;
2050 memcpy(sbufp, sbufp2, SBUFBTM - sbufp); /* �������� */
2051 XFree((voidstar)sbufp2);
2052 }
2053 /* ���Υ��顼�������᤹ */
2054 memcpy(errorjb, errorjb0, sizeof(jmp_buf));
2055 }
2056
2057 #if UNIX
2058 int
ismbchar(int c)2059 ismbchar(int c)
2060 {
2061 return IsKanji1(c);
2062 }
2063
2064 #if DIRECT_SH
2065 void
include_fd(int fd)2066 include_fd(int fd)
2067 {
2068 uchar *save_ifilename = ifilename;
2069 FILE *save_ifp = ifp;
2070 unsigned save_ilineno = ilineno;
2071 unsigned save_nlcount = nlcount;
2072 int save_includeflag = includeflag;
2073 int save_inmtextflag = inmtextflag;
2074 uchar *save_sbufp = sbufp;
2075 uchar *sbufp2 = NULL;
2076 jmp_buf save_errorjb;
2077
2078 memcpy(save_errorjb, errorjb, sizeof(jmp_buf));
2079
2080 if (setjmp(errorjb) == 0) {
2081 if (!intextflag) {
2082 SetFModeB(0);
2083 Command(esetcmd);
2084 }
2085 ifp = fdopen(fd, "r");
2086 if (sbufp != SBUFBTM) {
2087 sbufp2 = DupStrDiff(sbufp, SBUFBTM);
2088 sbufp = SBUFBTM;
2089 }
2090 includeflag = ON;
2091 inmtextflag = OFF;
2092 SetInMode(ifp);
2093 ifilename = "(pipe)";
2094 Trans();
2095 Disp(1);
2096 fclose(ifp);
2097 }
2098 ifilename = save_ifilename;
2099 ifp = save_ifp;
2100 SetInMode(ifp);
2101 ilineno = save_ilineno;
2102 nlcount = save_nlcount;
2103 includeflag = save_includeflag;
2104 inmtextflag = save_inmtextflag;
2105
2106 if (!includeflag)
2107 SetFModeB(binarymode);
2108 if (!emode && !includeflag)
2109 Command(eclrcmd);
2110
2111 if (sbufp2) {
2112 sbufp = save_sbufp;
2113 memcpy(sbufp, sbufp2, SBUFBTM - sbufp);
2114 XFree((voidstar)sbufp2);
2115 }
2116
2117 memcpy(errorjb, save_errorjb, sizeof(jmp_buf));
2118 }
2119 #endif /* DIRECT_SH */
2120 #endif /* UNIX */
2121
2122 /*
2123 * Local variables:
2124 * mode: c
2125 * c-indent-level: 4
2126 * c-continued-statement-offset: 4
2127 * c-brace-offset: -4
2128 * c-argdecl-indent: 4
2129 * c-label-offset: -4
2130 * tab-width: 4
2131 * tab-stop-list: (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80)
2132 * End:
2133 */
2134