• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

oga's tools


Commit MetaInfo

Revisiona0a60f3501eaa4162136ac007223bd90a7fd4ed8 (tree)
Zeit2013-12-29 21:55:15
Autoroga <oga@mxg....>
Commiteroga

Log Message

add filer.c

Ändern Zusammenfassung

Diff

--- /dev/null
+++ b/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("%s%c\n",file[CALXY],dirf[CALXY]); /* リバース表示 */
415+ else
416+ printf("%s%c\n",file[CALXY],dirf[CALXY]); /* ノーマル表示 */
417+#else /* for H3050RX mjpterm */
418+ if (sw)
419+ printf("%s%c\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+}