/*===========================================[ WDIR98.C ]===============*/ /* */ /* ウィンドウによるファイル選択 */ /* ver 2.0 H4.7.31 by S.F */ /*======================================================================*/ #include /* このプログラムの使用時に CONFIG.SYS */ #include /* の中で最大ドライブ数が */ #include /* LASTDRIVE=B */ #include /* 等のように宣言されていない場合、ドラ */ #include /* イブ選択時に正しく表示されない場合が */ #include /* あります。(ファイル選択は可能です) */ #include "CONS98.H" #include "WIND98.H" #define FMAX 90 #define ERR -1 extern int mn_blnk; /* メニュー文字間隔 (add H3/06/21) */ extern int mn_mode; /* メニュー選択モード(add H3/12/9) */ static char sel_drv[3]=""; /* 選択を開始したいドライブ名 */ static char sel_dir[40]; /* 選択を開始したいディレクトリー名 */ static char sel_name[13]; /* 選択されたファイル名(拡張子付き)*/ static char mask_name[13]; /* ファイル選択マスク */ static char full_name[60]; /* 選択されたファイルの絶対名称 */ /* ファイル名および属性の読みだし */ int get_ffb( FNAME *fnm ) { static struct ffblk ffblk; int i,done,fmax,drvmax; FNAME *fnp; fnp = fnm; fmax = 0; if(*sel_dir=='\0'){ drvmax = setdisk(*sel_drv - 'A'); for(i=0;ia = 0x80; sprintf(fnp->n,"( %c: )",i+'A'); fnp++; fmax++; } } done = findfirst("*",&ffblk,0x10); while(!done){ if(!(!strcmp(ffblk.ff_name,".")||(ffblk.ff_attrib!=0x10))){ fnp->a = ffblk.ff_attrib; fnp->t = ffblk.ff_ftime; fnp->d = ffblk.ff_fdate; fnp->s = ffblk.ff_fsize; sprintf(fnp->n,"<%-12s>",ffblk.ff_name); fnp++; fmax++; } done = findnext(&ffblk); } done = findfirst(mask_name,&ffblk,0x20); while(!done){ fnp->a = ffblk.ff_attrib; fnp->t = ffblk.ff_ftime; fnp->d = ffblk.ff_fdate; fnp->s = ffblk.ff_fsize; sprintf(fnp->n," %-12s ",ffblk.ff_name); fnp++; fmax++; done = findnext(&ffblk); } return(fmax); } /* ファイル名の選択(ウィンドウ指定必要) */ int sel_fnam( WIN *wp, MENU *mnp, FNAME *fnm, FNAME **ffa ) { int n,i,sel,fmax; FNAME *fnp; getcurdir(0,sel_dir); sprintf(full_name,"%c:\\%s",*sel_drv,sel_dir); w_title ( wp ); fmax = get_ffb(fnm); mn_mode = 0; /* add H3/12/9, 指定名以外の選択禁止 */ sel = wm_sel(wp, mnp, fmax); if(sel!=NULL){ fnp = (FNAME *)(ffa[sel-1]); sscanf(fnp->n,"%*c%12s",sel_name); if(fnp->a == 0x10){ chdir(sel_name); sel = sel_fnam(wp, mnp, fnm, ffa); } else if(fnp->a == 0x80){ *sel_drv = fnp->n[5]; setdisk(*sel_drv - 'A'); sel = sel_fnam(wp, mnp, fnm, ffa ); } } return(sel); } /* ウィンドウによるファイル選択 */ int wget_fnam( char *fpath, /* 返されるファイル名用文字列変数 */ int w_l, int w_t, /* ウィンドウ左上の位置 */ int m_c, int m_r, /* ファイルリストの横、縦の数 */ char *drv, /* 選択を開始するドライブ名(ascのみ) */ char *dir, /* 選択を開始するパス名 */ char *nam , /* 選択ファイルのワイルド名 */ int m ) /* 返すファイル名の種類(m=0・full、*/ /* m=1・name.ext、m=2・nameのみ) */ { WIN *wp; static MENU mnu = { 5, 7, 15, -6, -7 }; FNAME *fnm, **ffa, *fnp; int home_drv; char home_dir[40]; int i,w_r,w_b,sel,err; err = 0; home_drv = getdisk(); getcurdir(0,home_dir); if((drv[1]!=':')||(sel_drv[0]==0)){ if(drv==NULL) sprintf(sel_drv,"%c:",home_drv+'A'); else sprintf(sel_drv,"%c:",toupper(*drv)); } if(dir==NULL) strcpy(sel_dir,home_dir); else strcpy(sel_dir,dir); if(nam==NULL) strcpy(mask_name,"*.*"); else strcpy(mask_name,nam); mnu.c = m_c; mnu.r = m_r; w_r = w_l + m_c*mnu.w + 1 + (m_c-1)*mn_blnk ; /* add H3/06/21 */ w_b = w_t + m_r + 1; setdisk( *sel_drv - 'A' ); chdir( sel_dir ); sprintf(full_name,"%c:\\%s",home_drv+'A',home_dir); if((wp = w_open(w_l,w_t,w_r,w_b,full_name,-5,-4,-7,1))==NULL){ printf("%d %d %d %d %d %d",w_l,w_t,w_r,w_b,m_c,mnu.w); err = -1; }else { if((fnm = (FNAME *)malloc(sizeof(FNAME)*FMAX))==NULL) err=-2; else{ if((ffa = (FNAME **)malloc(sizeof(FNAME *)*FMAX))==NULL) err=-3; else{ fnp = fnm; for(i=0;i