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