next up previous contents
Next: A.4 サーチアクセス関数用ソースファイル (srh2_srh.c) Up: 付 録A サーチアクセスプログラム Previous: A.2 ウインドウデザイン用ソースファイル (srh2.c)

A.3 コールバック関数用ソースファイル (srh2_cb.c)

 

オブジェクトを動作させたときに呼び出される関数についてのソースファイルである。

#include "/home/tsuge/xforms/FORMS/forms.h"
#include "srh2.h"

static int b_on;/* 検索中かどうかを判定するフラグ */
static char al_f[100];/* 終了アラームに使用するファイル名 */
char p_dir[100];/* srh2 を実行しているディレクトリ名 */

/* callbacks for form srh2 */
/* LOAD, RT-LOAD, PG-LOAD ボタンを押した時に呼び出される関数 */
void load(FL_OBJECT *ob, long data)
{
  /* fill-in code for callback */
  const char *fname;/* file selector により選択されたファイル名 */
  const char *fdir;/* file selector で選択したファイルがあるディレクトリ */
  char fn[50];/* fname からファイル名のみを抽出(ディレクトリの部分を削除) */
  char fnks[50];/* Result File, Passeage File に表示するファイル名 */
  char dir[10];/* file selector で表示するディレクトリの初期設定 */
  char pdr[100];
  /* Pattern File, Result File, Passage File の標準ディレクトリ */

  int fdf;
  /* file selector で選択したファイルを標準ディレクトリから
     選択したかどうかを判定するフラグ */

  int i,j;

  /* 検索中でない場合 STOP ボタンを動作可能にする */
  if(b_on==-1){
    fl_set_object_lcol(str,FL_BLACK);
    fl_activate_object(str);
  }
  /* LOAD, RT-ROAD, PG-LOAD のどのボタンが押されたかを判定 */
  switch(data){
  case 0: sprintf(dir,""); break;
  case 1: sprintf(dir,"srh"); break;
  case 2: sprintf(dir,"keika");
  }
  /* file selector によるファイル名の選択 */
  do{
    fname = fl_show_file_selector("File To Load",dir,"*.dat","");
    /* Cancel ボタンが押された場合は何もしない */
    if(fname==NULL) return;
    /* ファイル名を何も指定しなかった場合は警告表示し,
       もう一度 file selector を表示 */
    if(*fname == '\0')
      fl_show_alert("Sorry","No input file name!!","",0);
  }while(*fname=='\0');
  /* fname からディレクトリの部分を削除し,ファイル名のみを抽出する */
  j=0;
  for(i=0; *(fname+i)!='\0'; i++){
    if(*(fname+i)=='/'){j=0; continue;}
    fn[j]=*(fname+i); j++;
  }
  fn[j]='\0';
  /* Pattern File, Result File, Passage File の標準ディレクトリの設定 */
  switch(data){
  case 0: sprintf(pdr,"%s",p_dir); break;
  case 1: sprintf(pdr,"%s/srh",p_dir); break;
  case 2: sprintf(pdr,"%s/keika",p_dir);
  }
  /* file selector で選択したファイルが標準ディレクトリにあるかどうかを
     判定する */
  fdir=fl_get_directory();
  fdf=0;
  for(i=0; *(fdir+i)!='\0' || pdr[i]!='\0'; i++)
    if(*(fname+i)!=pdr[i]){
      fdf=-1; break;
    }
  /* Pattern File の表示 */
  if(data==0)
    if(fdf==-1)
      /* ディレクトリを含めたファイル名を表示 */
      fl_set_input(fl,fname);
    else
      /* ファイル名のみを表示(標準ディレクトリの場合) */
      fl_set_input(fl,fn);
  /* Result File の表示 */
  if(data!=2){
    switch(data){
    case 0: /* LOAD ボタンを押した場合,自動的にファイル名を選択 */
      sprintf(fnks,"srh/s_%s",fn); break;
    case 1: /* RT-LOAD ボタンを押して Result File を選択した場合 */
      if(fdf==-1)
        sprintf(fnks,"%s",fname);
      else
        sprintf(fnks,"srh/%s",fn);
    }
    fl_set_input(rfl,fnks);
  }
  /* Passage File の表示 */
  if(data!=1){
    switch(data){
    case 0: sprintf(fnks,"keika/k_%s",fn); break;
    case 2:
      if(fdf==-1)
        sprintf(fnks,"%s",fname);
      else
        sprintf(fnks,"keika/%s",fn);
    }
    fl_set_input(pfl,fnks);
  }
}
/* START ボタンを押した時に呼び出される関数 */
void start(FL_OBJECT *ob, long data)
{
  /* fill-in code for callback */
  char pa_f[100];/* 終了アラームを鳴らすコマンド */
  int i;

  /* START, EXIT, Clear ボタンを動作不能にし,ボタンを動作可能にする */
  fl_set_object_lcol(ob,FL_INACTIVE);
  fl_set_object_lcol(ext,FL_INACTIVE);
  fl_set_object_lcol(clr,FL_INACTIVE);
  fl_set_object_lcol(stp,FL_BLACK);
  fl_set_object_lcol(ps,FL_BLACK);
  fl_deactivate_object(ob);
  fl_deactivate_object(ext);
  fl_deactivate_object(clr);
  fl_activate_object(stp);
  fl_activate_object(ps);
  /* Searching ランプを点灯(黄)し,Failure ランプと回数表示を消す */
  fl_set_object_color(sing,FL_YELLOW,FL_COL1);
  fl_set_object_color(f_sg,FL_COL1,FL_COL1);
  fl_set_object_label(f_tm,"");
  /* 以上の設定を変更する */
  fl_check_forms();
  b_on=1;
  /* 検索実行 */
  search_main();
  /* Alarm Audio ボタンで音声ファイルを選択しているかどうかを判定し,
     コマンドを設定する */
  if(al_f[0]=='\0')
    sprintf(pa_f,"playaudio /usr/demo/SOUND/sounds/cuckoo.au &");
  else sprintf(pa_f,"playaudio %s &",al_f);
  /* 終了アラームを鳴らす */
  system(pa_f);
  b_on=-1;
  /* PAUSE ボタンを押されていない状態にする */
  fl_set_button(ps,0);
  /* START ボタン以外のボタンを検索前と同じ状態にする */
  fl_set_object_color(sing,FL_COL1,FL_COL1);
  fl_set_object_lcol(ext,FL_BLACK);
  fl_set_object_lcol(clr,FL_BLACK);
  fl_set_object_lcol(stp,FL_INACTIVE);
  fl_set_object_lcol(ps,FL_INACTIVE);
  fl_activate_object(ext);
  fl_activate_object(clr);
  fl_deactivate_object(stp);
  fl_deactivate_object(ps);
}

/* EXIT ボタンを押した時に呼び出される関数 */
void exit_srh(FL_OBJECT *ob, long data)
{
  /* fill-in code for callback */
  /* 終了させる */
  exit(0);
}

/* SHOW, RT-SHOW, PG-SHOW ボタンを押した時に呼び出される関数 */
void show(FL_OBJECT *ob, long data)
{
  const char *fname;

  if(b_on==-1){
    fl_set_object_lcol(str,FL_BLACK);
    fl_activate_object(str);
  }
  /* SHOW, RT-SHOW, PG-SHOW ボタンの内どれが押されたかを判定し,
     ファイルの内容を表示するファイル名を fname へ入力 */
  switch(data){
  case 0: fname=fl_get_input(fl); break;
  case 1: fname=fl_get_input(rfl); break;
  case 2: fname=fl_get_input(pfl);
  }
  /* srh_b ウィンドウに表示するファイルの内容とファイル名を設定し,
     ウィンドウを開く */
  fl_load_browser(b_sw,fname);
  fl_set_input(inp,fname);
  fl_show_form(srh_b,FL_PLACE_CENTERFREE,FL_FULLBORDER,"srh_b");
}

/* srh_b ウィンドウの CLOSE ボタンを押した時に呼び出される関数 */
void close_b(FL_OBJECT *ob, long data)
{
  /* srh_b ウィンドウを閉じる */
  fl_hide_form(srh_b);
}

/* srh_b ウィンドウの LOAD, RELOAD ボタンを押した時に呼び出される関数 */
void load_b(FL_OBJECT *ob, long data)
{
  const char *fname,*g_dir;
  char dir[100];
  int i,dirf;

  if(b_on==-1){
    fl_set_object_lcol(str,FL_BLACK);
    fl_activate_object(str);
  }
  /* srh_b ウィンドウに表示されているファイル名を fname へ入力 */
  fname=fl_get_input(inp);
  /* LOAD ボタンを押した場合に実行 */
  if(data==0){
    /* 表示されているファイルのディレクトリを調べ,dir へ入力 */
    dirf=0;
    for(i=0; *(fname+i)!='\0'; i++){
      if((dir[i]=*(fname+i))=='/') dirf=i;
    }
    dir[dirf]='\0';
    /* dir に入力されたディレクトリのファイルを表示し,
       表示するファイルを選択 */
    do{
      fname = fl_show_file_selector("File To Load",dir,"*.dat","");
      if(fname==NULL) return;
      if(*fname == '\0')
        fl_show_alert("Sorry","No input file name!!","",0);
    }while(*fname=='\0');
    /* 選択したファイル名を表示 */
    fl_set_input(inp,fname);
  }
  /* 表示されているファイルの内容を表示 */
  fl_load_browser(b_sw,fname);
}

/* Clear ボタンを押した時に呼び出される関数 */
void f_clear(FL_OBJECT *ob, long data)
{
  if(b_on==-1){
    fl_set_object_lcol(str,FL_BLACK);
    fl_activate_object(str);
  }
  /* Failure ランプと回数表示を消す */
  fl_set_object_color(f_sg,FL_COL1,FL_COL1);
  fl_set_object_label(f_tm,"");
}

/* srh_b ウィンドウの SAVE ボタンを押した時に呼び出される関数 */
void save_b(FL_OBJECT *ob, long data)
{
  const char *fname;
  char dir[100],fln[500],q[200],qq[50],sys[150];
  int i,dirf;
  int total_lines;
  FILE *f_sv;

  /* 表示されているファイル名を fname に入力 */
  fname=fl_get_input(inp);
 sentaku:
  /* 表示されているファイルがあるディレクトリを調べ,dir へ入力 */
  dirf=0;
  for(i=0; *(fname+i)!='\0'; i++){
    if((dir[i]=*(fname+i))=='/') dirf=i;
  }
  dir[dirf]='\0';
  /* 保存するファイルを選択し,そのファイル名を fname へ代入 */
  do{
    fname = fl_show_file_selector("File To Load",dir,"*.dat","");
    if(fname==NULL) return;
    if(*fname == '\0')
      fl_show_alert("Sorry","No input file name!!","",0);
  }while(*fname=='\0');
  /* 表示されているファイルの内容の行数を total_lines へ入力 */
  total_lines=fl_get_browser_maxline(b_sw);
  /* 選択したファイルが開けなかった場合に警告表示するための文字列 */
  sprintf(qq,"I don't write in this File!");
  /* fname のファイルが存在するかを調べる */
  if(fopen(fname,"r")!=NULL){
    /* fname のファイルが存在する場合,
       書き換えてもいいかを確認する */
    if(!fl_show_question("Do you really want to renew this file?",fname,""))
      /* No を選択した場合,ファイル名を選択しなおす */
      goto sentaku;
  }
  else{
    /* fname のファイルが存在しない場合,または開くことができない場合 */
    if((f_sv=fopen(fname,"w"))==NULL){
      /* fname のファイルが開けない場合 */
      fclose(f_sv);
      /* 指定したファイルがあるディレクトリを調べ,dir へ入力 */
        dirf=0;
      for(i=0; *(fname+i)!='\0'; i++){
        if((dir[i]=*(fname+i))=='/') dirf=i;
      }
      dir[dirf]='\0';
      /* dir に入力されているディレクトリを作るかどうかを選択 */
      sprintf(q,"Do you want to do 'mkdir %s'?",dir);
      if(fl_show_question(qq,fname,q)){
        /* dir に入力されているディレクトリを作成 */
        sprintf(sys,"mkdir %s",dir);
        system(sys);
      }
      else
        /* No を選択した場合,ファイル名を選択しなおす */
        goto sentaku;
    }
    else
      goto hozon;
    if((f_sv=fopen(fname,"w"))==NULL){
      /* まだファイルが開けない場合 */
      fclose(f_sv);
      /* dir に入力されているディレクトリに書き込み・実行許可を
         与えるかどうかを選択 */
      sprintf(q,"Do you want to do 'chmod u+wx %s'?",dir);
      if(fl_show_question("I failed to do 'mkdir'!",q,"")){
        sprintf(sys,"chmod u+wx %s",dir);
        system(sys);
        sprintf(qq,"I still don't write in this File!!");
      }
      else
        /* No を選択した場合,ファイル名を選択しなおす */
        goto sentaku;
    }
    else
      goto hozon;
  }
  if((f_sv=fopen(fname,"w"))==NULL){
    /* fname のファイルが開けない場合 */
    fclose(f_sv);
    sprintf(q,"Do you want to do 'chmod u+w %s'?",fname);
    /* fname のファイルに書き込み許可を与えるかどうかを選択 */
    if(fl_show_question(qq,fname,q)){
      /* fname のファイルに書き込み許可を与える */
      sprintf(sys,"chmod u+w %s",fname);
      system(sys);
    }
    else
      /* No を選択した場合,ファイル名を選択しなおす */
      goto sentaku;
    if((f_sv=fopen(fname,"w"))==NULL){
      /* なお,まだファイルが開けない場合,警告を出してから選択しなおす */
      fl_show_alert("Sorry","I failed to do 'chmod'!!","",0);
      goto sentaku;
    }
  }
 hozon:
  for(i=1; i<=total_lines; i++){
    sprintf(fln,"%s\n",fl_get_browser_line(b_sw,i));
    fprintf(f_sv,fln);
  }
  fclose(f_sv);
  /* ファイル名とそのファイルの内容を表示 */
  fl_set_input(inp,fname);
  fl_load_browser(b_sw,fname);
}

/* Alarm Audio ボタンが押された時に呼び出される関数 */
void alarm(FL_OBJECT *ob, long data)
{

  const char *fname;

  /* 終了アラー無に使用したい音声ファイルを選択し,fname へ入力 */
  do{
    fname = fl_show_file_selector("Alarm Audio File To Load",
                                  "/usr/demo/SOUND/sounds","*.au","");
    if(fname==NULL) return;
    if(*fname == '\0')
      fl_show_alert("Sorry","No input file name!!","",0);
  }while(*fname=='\0');
  /* fname に格納したファイル名を al_f へ入力 */
  sprintf(al_f,"%s",fname);
}

/* 上記以外のボタン等が押されたりした場合等に呼び出される関数 */
void nothing(FL_OBJECT *ob, long data)
{
  if(b_on==-1){
    fl_set_object_lcol(str,FL_BLACK);
    fl_activate_object(str);
  }
}



Deguchi Toshinori
1998年03月12日 (木) 16時16分01秒 JST