oga's tools
修订版 | a0a60f3501eaa4162136ac007223bd90a7fd4ed8 (tree) |
---|---|
时间 | 2013-12-29 21:55:15 |
作者 | oga <oga@mxg....> |
Commiter | oga |
add filer.c
@@ -0,0 +1,482 @@ | ||
1 | +/* | |
2 | + * filer[.x] : ファイルを選択し、環境変数 FILE_NAME にセットする。(X68000) | |
3 | + * 標準エラー出力に出力する (3050RX) | |
4 | + * | |
5 | + * X680x0 usage : filer [ <X> <Y> off_y [-aster] ] | |
6 | + * | |
7 | + * IN -aster : 漢字を*に変換する。 | |
8 | + * OUT (環境変数) | |
9 | + * FILE_NAME : 選択したファイル名 | |
10 | + * LOCATE_X,LOCATE_Y : カーソルX,Y位置 | |
11 | + * OFF_Y : ファイル選択時の表示ページ | |
12 | + * DEL_F : 削除要求フラグ | |
13 | + * VI_F : エディタ起動要求フラグ | |
14 | + * | |
15 | + * | |
16 | + * H3050R usage : filer [ <X> <Y> off_y ] | |
17 | + * | |
18 | + * IN off_y : 表示ページ(ファイルが多い場合) | |
19 | + * OUT (標準エラー出力) 1 2 3 4 5 6 7 | |
20 | + * FILENAME X Y CWD OFF_Y DEL_F VI_F | |
21 | + * CWD : カレントディレクトリ | |
22 | + * OFF_Y : ファイル選択時の表示ページ | |
23 | + * DEL_F : 削除要求フラグ | |
24 | + * VI_F : エディタ起動要求フラグ | |
25 | + * | |
26 | + * | |
27 | + * related files : cur.h, vvi[.bat] | |
28 | + * | |
29 | + * CAUTION : driveコマンドでドライブ名を入れ替えていると正常に動作しません。 | |
30 | + * | |
31 | + * 1994.04.20 V0.01 Initial Version. by おが★ | |
32 | + * 1994.04.26 V1.00 add readdir. | |
33 | + * 1994.05.07 V1.01 X,Y save support for X68000. | |
34 | + * 1994.05.07 V1.02 chdir support. | |
35 | + * 1994.05.08 V1.03 -aster support for X68000's vi. | |
36 | + * 1994.05.08 V1.04 ESC support. | |
37 | + * 1994.10.13 V1.10 TERM size and dir ind. support. | |
38 | + * 1994.10.21 V1.11 'D'(delete file) support. | |
39 | + * 1995.01.29 V1.12 X68K COLUMNS/LINES support. | |
40 | + * 1995.03.17 V1.13 cursor shift support. | |
41 | + * 1995.03.18 V1.14 add nocbreak() for eof="^@" | |
42 | + * 1995.04.10 V1.15 add endwin() for stty -echo | |
43 | + * 1995.05.14 V1.16 'v' force invoke editor suport. | |
44 | + * 1996.03.24 V1.17 port to Linux | |
45 | + * 2006.07.03 V1.18 check getenv() NULL | |
46 | + * | |
47 | + */ | |
48 | + | |
49 | +#include <stdio.h> | |
50 | +#include <string.h> | |
51 | +#include <stdlib.h> | |
52 | +#include <dirent.h> | |
53 | +#include "cur.h" | |
54 | +#include <sys/stat.h> | |
55 | + | |
56 | +#ifdef X68000 | |
57 | +#include <sys/dos.h> | |
58 | +#include <sys/iocs.h> | |
59 | +#include <unistd.h> | |
60 | +#else /* H3050RX */ | |
61 | +#include <curses.h> | |
62 | +#include <sys/param.h> | |
63 | +#endif | |
64 | + | |
65 | +#define FILE_LEN 20 | |
66 | +#define MAX_ENT 2000 | |
67 | +#define CALXY x*y_max+y+off_y*x_max*y_max | |
68 | + | |
69 | +int x_max = 0, y_max = 0, off_y = 0; | |
70 | + | |
71 | +char dirf[MAX_ENT]; | |
72 | + | |
73 | +main(a,b) | |
74 | +int a; | |
75 | +char *b[]; | |
76 | +{ | |
77 | + int c, i=0, j; | |
78 | + int x=0,y=0,cnt=0, f_aster=0, del_f = 0, vi_f = 0; | |
79 | + int env_x, env_y; | |
80 | + DIR *dirp; | |
81 | + int move_dir_f = 0; /* 94.11.02 for move dir */ | |
82 | + struct dirent *dp; | |
83 | + struct stat statbuf; | |
84 | + char *file[MAX_ENT]; | |
85 | +#ifdef X68000 | |
86 | + char buf[PATH_MAX+1]; | |
87 | +#else /* H3050RX */ | |
88 | + char buf[MAXPATHLEN+1]; | |
89 | +#endif | |
90 | + | |
91 | + if (a >= 3) { | |
92 | + x = atoi(b[1]); | |
93 | + y = atoi(b[2]); | |
94 | + } | |
95 | + | |
96 | + if (a >= 4) { | |
97 | + off_y = atoi(b[3]); | |
98 | + } | |
99 | + | |
100 | + if (a == 5) { | |
101 | + if (strcmp(b[4],"-aster") == 0) | |
102 | + f_aster = 1; | |
103 | + } | |
104 | + | |
105 | +#ifdef X68000 | |
106 | + if (_iocs_crtmod(-1) == 16) { | |
107 | + env_x = 100; /* 96 */ | |
108 | + env_y = 31; | |
109 | + x_max = env_x / FILE_LEN; | |
110 | + } else { | |
111 | + env_x = 64; | |
112 | + env_y = 31; | |
113 | + x_max = env_x / FILE_LEN; | |
114 | + if (x > x_max-1) x=x_max-1; | |
115 | + } | |
116 | + /* | |
117 | + if (i = atoi(getenv("COLUMNS"))) { | |
118 | + env_x = i; | |
119 | + x_max = env_x / FILE_LEN; | |
120 | + if (x > x_max-1) x=x_max-1; | |
121 | + } | |
122 | + if (i = atoi(getenv("LINES"))) { | |
123 | + env_y = i-1; | |
124 | + } | |
125 | + */ | |
126 | +#else | |
127 | + if (getenv("COLUMNS")) { | |
128 | + env_x = atoi(getenv("COLUMNS")); | |
129 | + } else { | |
130 | + env_x = 80; | |
131 | + } | |
132 | + if (getenv("LINES")) { | |
133 | + env_y = atoi(getenv("LINES")); | |
134 | + } else { | |
135 | + env_y = 24; | |
136 | + } | |
137 | + x_max = env_x / FILE_LEN; | |
138 | +#endif | |
139 | + | |
140 | + do { | |
141 | +#ifdef X68000 | |
142 | + cls(); | |
143 | + CUR_OFF; /* カーソルオフ */ | |
144 | +#else | |
145 | + initscr(); | |
146 | + /* nonl(); */ | |
147 | + cbreak(); | |
148 | + noecho(); | |
149 | + clear(); | |
150 | + refresh(); | |
151 | +#endif | |
152 | + | |
153 | + for (i=0; i<MAX_ENT; i++) { | |
154 | + file[i] = (char *)0; /* filename ptr */ | |
155 | + dirf[i] = 0; /* dir indicator */ | |
156 | + } | |
157 | + i=0; | |
158 | + dirp = opendir("."); | |
159 | + | |
160 | + while((dp=readdir(dirp)) !=NULL){ | |
161 | + file[i] = (char *)malloc(strlen(dp->d_name)+1); | |
162 | + strcpy(file[i],dp->d_name); | |
163 | + i++; | |
164 | + if (i >= MAX_ENT) { | |
165 | + printf("filer : エントリオーバーフロー "); | |
166 | + printf("(MAX is %d)\n",MAX_ENT); | |
167 | +#ifndef X68000 | |
168 | + sleep(1); | |
169 | +#endif | |
170 | + break; | |
171 | + } | |
172 | + } | |
173 | + closedir(dirp); | |
174 | + xsort(file,i); | |
175 | + | |
176 | + j=0; | |
177 | + while (file[j]) { | |
178 | + stat(file[j],&statbuf); | |
179 | +#if defined(X68000) || defined(LINUX) | |
180 | + if (statbuf.st_mode & S_IFDIR ) { | |
181 | +#else | |
182 | + if (statbuf.st_mode & _S_IFDIR ) { | |
183 | +#endif | |
184 | + dirf[j] = '/'; | |
185 | + } | |
186 | + j++; | |
187 | + } | |
188 | + | |
189 | + if (move_dir_f) /* 94.11.02 for move dir */ | |
190 | + off_y = 0; /* 94.10.25 for move dir */ | |
191 | + dispdir(buf); | |
192 | + | |
193 | + /* noecho(); */ | |
194 | + y_max = (i-1) / x_max + 1; | |
195 | + | |
196 | + if (y_max >= env_y - 2) { | |
197 | + y_max = env_y - 3; | |
198 | + } | |
199 | + | |
200 | + dispall(file); | |
201 | + if (y > y_max-1) y = y_max-1; | |
202 | + while (file[CALXY] == (char *)0) | |
203 | + --x; | |
204 | + disp(file,x,y,1); | |
205 | +#ifdef X68000 | |
206 | + while ((c = getch()) != 13) { /* } */ | |
207 | +#else /* H3050RX */ | |
208 | + while ((c = getch()) != '\n') { | |
209 | +#endif | |
210 | + switch(c) { | |
211 | + case 'j' : | |
212 | + case 'J' : | |
213 | + disp(file,x,y,0); | |
214 | + if (++y >= y_max) { | |
215 | + y -= y_max; | |
216 | + if (++x >= x_max) x -= x_max; | |
217 | + } | |
218 | + if (file[CALXY] == (char *)0) { | |
219 | + x = 0; | |
220 | + y = 0; | |
221 | + } | |
222 | + disp(file,x,y,1); | |
223 | + break; | |
224 | + case 'k' : | |
225 | + case 'K' : | |
226 | + disp(file,x,y,0); | |
227 | + if (--y < 0) { | |
228 | + y += y_max; | |
229 | + if (--x < 0) x += x_max; | |
230 | + } | |
231 | + while (file[CALXY] == (char *)0) { | |
232 | + if (--y < 0) { | |
233 | + y += y_max; | |
234 | + if (--x < 0) x += x_max; | |
235 | + } | |
236 | + } | |
237 | + disp(file,x,y,1); | |
238 | + break; | |
239 | + case 'h' : | |
240 | + case 'H' : | |
241 | + disp(file,x,y,0); | |
242 | + if (--x < 0) { | |
243 | + x += x_max; | |
244 | + if (--y < 0) y += y_max; | |
245 | + } | |
246 | + while (file[CALXY] == (char *)0) { | |
247 | + if (--x < 0) { | |
248 | + x += x_max; | |
249 | + if (--y < 0) y += y_max; | |
250 | + } | |
251 | + } | |
252 | + disp(file,x,y,1); | |
253 | + break; | |
254 | + case 'l' : | |
255 | + case 'L' : | |
256 | + disp(file,x,y,0); | |
257 | + if (++x >= x_max) { | |
258 | + x -= x_max; | |
259 | + if (++y >= y_max) y -= y_max; | |
260 | + } | |
261 | + if (file[CALXY] == (char *)0) { | |
262 | + x = 0; | |
263 | + if (++y >= y_max) y -= y_max; | |
264 | + if (file[CALXY] == (char *)0) y = 0; | |
265 | + } | |
266 | + disp(file,x,y,1); | |
267 | + break; | |
268 | + case 6 : /* ^F and ↓(X68000) */ | |
269 | +#ifndef X68000 | |
270 | + case 'B' : /* ↓ H3050R */ | |
271 | +#endif | |
272 | + ++off_y; | |
273 | + if (file[off_y*x_max*y_max] == (char *)0) { | |
274 | + --off_y; | |
275 | + } else { | |
276 | + /* 94.10.25 */ | |
277 | + if (file[CALXY] == (char *)0) { | |
278 | + x = y = 0; | |
279 | + } | |
280 | +#ifdef X68000 | |
281 | + cls(); | |
282 | +#else | |
283 | + clear(); | |
284 | + refresh(); | |
285 | +#endif | |
286 | + dispdir(buf); | |
287 | + dispall(file); | |
288 | + disp(file,x,y,1); | |
289 | + } | |
290 | + break; | |
291 | + case 2 : /* ^B */ | |
292 | +#ifdef X68000 | |
293 | + case 1 : /* ↑ X68000 */ | |
294 | +#else | |
295 | + case 'A' : /* ↑ H3050R */ | |
296 | +#endif | |
297 | + --off_y; | |
298 | + if (off_y < 0) { | |
299 | + off_y = 0; | |
300 | + } else { | |
301 | + /* 94.10.25 */ | |
302 | + if (file[CALXY] == (char *)0) { | |
303 | + x = y = 0; | |
304 | + } | |
305 | +#ifdef X68000 | |
306 | + cls(); | |
307 | +#else | |
308 | + clear(); | |
309 | + refresh(); | |
310 | +#endif | |
311 | + dispdir(buf); | |
312 | + dispall(file); | |
313 | + disp(file,x,y,1); | |
314 | + } | |
315 | + break; | |
316 | + case 'D' : /* D(delete) V1.11 */ | |
317 | + del_f = 1; | |
318 | + break; | |
319 | + case 'v' : /* v(invode editor) V1.16 */ | |
320 | + case 'V' : | |
321 | + vi_f = 1; | |
322 | + break; | |
323 | + case 27 : /* ESC */ | |
324 | + disp(file,x,y,0); | |
325 | + if (y_max == 1) { | |
326 | + x = 1; | |
327 | + y = 0; | |
328 | + } else { | |
329 | + x = 0; | |
330 | + y = 1; | |
331 | + } | |
332 | + if (off_y) { | |
333 | + off_y = 0; | |
334 | +#ifdef X68000 | |
335 | + cls(); | |
336 | +#else | |
337 | + clear(); | |
338 | + refresh(); | |
339 | +#endif | |
340 | + dispdir(buf); | |
341 | + dispall(file); | |
342 | + } | |
343 | + disp(file,x,y,1); | |
344 | + break; | |
345 | + case 'q' : | |
346 | + case 'Q' : | |
347 | + freex(file); | |
348 | +#ifdef X68000 | |
349 | + cls(); | |
350 | + CUR_ON; /* カーソルオン */ | |
351 | +#else | |
352 | + clear(); | |
353 | + nocbreak(); | |
354 | + refresh(); | |
355 | + endwin(); | |
356 | +#endif | |
357 | + exit(1); /* end vvi (no EXEC vi) */ | |
358 | + break; | |
359 | + } | |
360 | + if (del_f || vi_f) | |
361 | + break; | |
362 | + } | |
363 | + | |
364 | + move_dir_f = 1; /* 94.11.02 for move dir */ | |
365 | + | |
366 | + } while (chdir(file[CALXY]) == 0); /* ディレクトリならば移動する。 */ | |
367 | + | |
368 | +#ifdef X68000 | |
369 | + if (f_aster) { /* 漢字をアスタリスク一個に変換する */ | |
370 | + for (i=0; i<strlen(file[CALXY]); i++) { | |
371 | + if ((unsigned char) *(file[CALXY]+ i) > 127) { /* たぶん漢字 */ | |
372 | + *(file[CALXY]+ i) = '*'; | |
373 | + *(file[CALXY]+ i+1) = '\0'; | |
374 | + break; | |
375 | + } | |
376 | + } | |
377 | + } | |
378 | + _dos_setenv("FILE_NAME",0,file[CALXY]); /* 親の環境変数にファイル名をセット */ | |
379 | + sprintf(buf,"%d",x); /* X位置のセーブ */ | |
380 | + _dos_setenv("LOCATE_X",0,buf); | |
381 | + sprintf(buf,"%d",y); /* Y位置のセーブ */ | |
382 | + _dos_setenv("LOCATE_Y",0,buf); | |
383 | + sprintf(buf,"%d",off_y); /* カレントページ */ | |
384 | + _dos_setenv("OFF_Y",0,buf); | |
385 | + sprintf(buf,"%d",del_f); /* 削除フラグ */ | |
386 | + _dos_setenv("DEL_F",0,buf); | |
387 | + sprintf(buf,"%d",vi_f); /* エディタ起動フラグ */ | |
388 | + _dos_setenv("VI_F",0,buf); | |
389 | + CUR_ON; /* カーソルオン */ | |
390 | +#else | |
391 | + /* stderrにファイル名とX位置,Y位置,pwd, off_y, del_f を出力 */ | |
392 | + fprintf(stderr,"%s %d %d %s %d %d %d",file[CALXY],x,y,getcwd(buf,MAXPATHLEN+1),off_y, del_f,vi_f); | |
393 | + | |
394 | + sprintf(buf,"FILE_NAME=%s",file[CALXY]); /* <= あまり意味はない */ | |
395 | + putenv(buf); | |
396 | + sprintf(buf,"LOCATE_X=%d",x); /* X位置のセーブ */ | |
397 | + putenv(buf); | |
398 | + sprintf(buf,"LOCATE_Y=%d",y); /* Y位置のセーブ */ | |
399 | + putenv(buf); | |
400 | + nocbreak(); | |
401 | + endwin(); | |
402 | +#endif | |
403 | + freex(file); | |
404 | + exit(0); /* EXEC "vi" */ | |
405 | +} | |
406 | + | |
407 | +disp(file,x,y,sw) | |
408 | +char **file; | |
409 | +int x,y,sw; | |
410 | +{ | |
411 | + locate(x*FILE_LEN,y+3); | |
412 | +#ifdef X68000 | |
413 | + if (sw) | |
414 | + printf("[43m%s%c[33m\n",file[CALXY],dirf[CALXY]); /* リバース表示 */ | |
415 | + else | |
416 | + printf("[33m%s%c\n",file[CALXY],dirf[CALXY]); /* ノーマル表示 */ | |
417 | +#else /* for H3050RX mjpterm */ | |
418 | + if (sw) | |
419 | + printf("[7m%s%c[0m\n",file[CALXY],dirf[CALXY]); /* リバース表示 */ | |
420 | + | |
421 | + else | |
422 | + printf("%s%c\n",file[CALXY],dirf[CALXY]); /* ノーマル表示 */ | |
423 | +#endif | |
424 | + /* locate(x*FILE_LEN,y+3-1); */ | |
425 | + locate(0,0); | |
426 | + printf("\n"); | |
427 | +#ifdef LINUX | |
428 | + refresh(); | |
429 | +#endif | |
430 | + | |
431 | +} | |
432 | + | |
433 | +dispall(file) | |
434 | +char *file[]; | |
435 | +{ | |
436 | + int i,j; | |
437 | + | |
438 | + for (j=0; j<x_max ; j++) { | |
439 | + for (i=0; i<y_max ; i++) { | |
440 | + if (file[j*y_max+i]) | |
441 | + disp(file,j,i,0); | |
442 | + else | |
443 | + break; | |
444 | + } | |
445 | + } | |
446 | +} | |
447 | +freex(file) | |
448 | +char *file[]; | |
449 | +{ | |
450 | + int i=0; | |
451 | + while (file[i]) | |
452 | + free(file[i++]); | |
453 | + | |
454 | +} | |
455 | + | |
456 | +xsort(file,n) | |
457 | +char *file[]; | |
458 | +int n; | |
459 | +{ | |
460 | + char *wk; | |
461 | + int i,j; | |
462 | + | |
463 | + for (i=1;i<n;i++) { | |
464 | + for (j=0;j<n-1;j++) { | |
465 | + if (strcmp(file[j],file[j+1]) > 0 ) { | |
466 | + wk = file[j]; | |
467 | + file[j] = file[j+1]; | |
468 | + file[j+1] = wk; | |
469 | + } | |
470 | + } | |
471 | + } | |
472 | +} | |
473 | + | |
474 | +dispdir(buf) | |
475 | +char *buf; | |
476 | +{ | |
477 | +#ifdef X68000 | |
478 | + printf(" Current Directory : %s (No.%d)\n",getcwd(buf,PATH_MAX+1),off_y+1); | |
479 | +#else /* H3050RX */ | |
480 | + printf(" Current Directory : %s (No.%d)\n",getcwd(buf,MAXPATHLEN+1),off_y+1); | |
481 | +#endif | |
482 | +} |