www.pudn.com > 文件恢复及修补 C 语言源程序.zip > FABS.C


 
#define FABS_INIT "12345678901234567890123456789012345678901234567890" 
 
/*            F A B S    K E Y   L E N G T H 
              ============================== 
 
    Format is M\ 
 
    This function will get the length of the FABS key. 
    The following parameters are required : 
 
    1. The file number > 0 and < 7. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_key_len( file_num ) 
unsigned file_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "M", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/*  printf("FABS key len string is %s\n", cmd ) ;   */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Length", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_key_len */ 
 
call_fabs( command ) 
char *command ; 
{ int rec_num, key_adr, err=0 ; 
  extern int rec_fabs, key_fabs, err_fabs ; 
  char *cmnd ; 
 
  cmnd = "????" ;    /* initialize command pointer */ 
  rec_num = 0 ;      /* initialize record and address */ 
  key_adr = 0 ; 
/*  printf("FABS string is %s\n",command ) ; */ 
  callfb( command, strlen( command ), cmnd, &err, &rec_num, &key_adr ) ; 
  rec_fabs = rec_num ; 
  key_fabs = key_adr ; 
  return( err_fabs = err ) ; 
} 
 
/*    Check error code for not found. If not found return with a 
      1 to indicate not found error. Otherwise print message and 
      end program. 
*/ 
fabs_error( txt, cmd, err ) 
char *txt, *cmd ; 
int err ; 
{ 
   if ( ( err > 11 ) & ( err < 17 ) ) 
     return ; 
 
   switch ( err ) 
     { case 23 : 
       case 24 : 
       case 25 : 
       case 27 : printf( "\n\t\tFABS %s:Disk error is %d\n", txt, err ); 
                 printf( "\t\tFABS String was %s\n", cmd ) ; 
                 cputs( "\t\tPress any key to continue: " ) ; 
                 if ( !getch() ) getch() ;       /* get any key */ 
                 return ; 
     } 
 
   printf( "\n\t\tFABS %s:Fatal error is %d\n", txt, err ) ; 
   printf( "\t\tFABS String was %s\n", cmd ) ; 
   exit( 1 ) ; 
} 
 
 
add_num( num, adr, cmd, last ) 
unsigned num  ; 
int      adr  ; 
char    *cmd  ; 
int      last ; 
{ char wrk_stg[ 5 ] ; 
 
  stcu_d( wrk_stg, num, sizeof( wrk_stg) ) ; 
  return( fill_fabs( cmd, wrk_stg, adr, last ) ) ; 
} 
 
fill_fabs( to, from, start, end ) 
char *to, *from ; 
int  start,end ; 
{ int k = 0 ; 
  while ( to[ start++ ] = from [ k++ ] ) ; 
 
  if ( end ) 
    to[ start-1 ] = '\0' ;     /* EOS */ 
  else 
    to[ start-1 ] = '\\' ;     /* '\' */ 
 
  return( start ) ; 
}    /* end of fill_fabs */ 
 
fabs_get_key( file_num, key ) 
unsigned file_num ; 
char *key ; 
{ int key_adr ; 
  extern int key_fabs ; 
 
  key_adr = key_fabs ;            /* save key address */ 
  fabs_key_len( file_num ) ;      /* get key length */ 
/*  printf("Key address is %d\n", key_adr ); 
    printf("Key length is %d\n", rec_fabs ); 
*/ 
  callky( key, rec_fabs, key_adr ) ; 
 
} 
/*              F A B S    C R E A T E 
                ====================== 
 
    Format is C\\\<#keys>\\ 
 
    This function will create a file under fabs. The following 
    parameters are required : 
 
    1. The file name as [d:][.ext]. 
    2. The key length > 0 and < 101. 
    3. The number of primary keys for this file. 
    4. The key type ( I for integer or A for ASCII ). 
    5. The file number > 0 and < 7. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_create( fname, key_length, num_keys, key_type, file_num ) 
char fname[]; 
unsigned key_length ; 
unsigned num_keys ; 
char key_type ; 
unsigned file_num ; 
{ int err, adr ; 
  char wrk_stg[ 5 ] ; 
  char cmnd[ 4 ] ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "C", adr, 0 ) ; 
  adr = fill_fabs( cmd, fname, adr, 0 ) ; 
  adr = add_num( key_length, adr, cmd, 0 ) ; 
  adr = add_num( num_keys, adr, cmd, 0 ) ; 
  wrk_stg[ 0 ] = key_type ; 
  wrk_stg[ 1 ] = '\0' ; 
  adr = fill_fabs( cmd, wrk_stg,adr,0) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/* printf("FABS create string is %s\n", cmd ) ; */ 
 
   if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Create", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_create */ 
/*              F A B S    O P E N 
                ================== 
 
    Format is O\\ 
 
    This function will open a FABS file. The following 
    parameters are required : 
 
    1. The file name as [d:][.ext]. 
    2. The file number > 0 and < 7. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_open( fname, file_num ) 
char fname[]; 
unsigned file_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "O", adr, 0 ) ; 
  adr = fill_fabs( cmd, fname, adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/* printf("FABS open string is %s\n",*cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Open", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_open */ 
/*                 F A B S    C L O S E 
                   ==================== 
 
    Format is K\ 
 
    This function will close an open FABS file. The following 
    parameters are required : 
 
    1. The file number > 0 and < 7. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_close( file_num ) 
unsigned file_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "K", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/*  printf("FABS close string is %s\n", cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Close", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_close */ 
/*                  F A B S    I N S E R T 
                    ====================== 
 
    Format is I\\\..\ 
 
    This function will insert a record into a FABS file. The following 
    parameters are required : 
 
    1. The file number > 0 and < 7. 
    2. The keys seperated by '\'. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_insert( keys, file_num ) 
unsigned file_num ; 
char keys[]; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "I", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 0 ) ; 
  adr = fill_fabs( cmd, keys, adr, 1 ) ; 
 
/* printf("FABS insert string is %s\n",cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return ( fabs_error( "Insert", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_insert */ 
/*              F A B S    F I R S T 
                ==================== 
 
    Format is F\\ 
 
    This function will find the first record in a FABS file. 
    The following parameters are required : 
 
    1. The file number > 0 and < 7. 
    2. The key number. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_first( file_num, key_num ) 
unsigned file_num, key_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "F", adr, 0 ) ; 
  adr = add_num( key_num, adr, cmd, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/*  printf("FABS first string is %s\n", cmd ) ;   */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "First", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_first */ 
/*              F A B S    L A S T 
                ================== 
 
    Format is L\\ 
 
    This function will find the last record in a FABS file. 
    The following parameters are required : 
 
    1. The file number > 0 and < 7. 
    2. The key number. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_last( file_num, key_num ) 
unsigned file_num, key_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "L", adr, 0 ) ; 
  adr = add_num( key_num, adr, cmd, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/* printf("FABS last string is %s\n", cmd ) ; */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Last", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_last */ 
/*                 F A B S    N E X T 
                   ================== 
 
    Format is N\ 
 
    This function will find the next key in a FABS file. The following 
    parameters are required : 
 
    1. The file number > 0 and < 7. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_next( file_num ) 
unsigned file_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "N", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/*  printf("FABS next string is %s\n", cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Next", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_next */ 
/*                 F A B S    P R E V I O U S 
                   ========================== 
 
    Format is P\ 
 
    This function will find the previous key in a FABS file. 
    The following parameters are required : 
 
    1. The file number > 0 and < 7. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_previous( file_num ) 
unsigned file_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "P", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/* printf("FABS previous string is %s\n", cmd ) ;   */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Previous", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_previous */ 
/*                 F A B S    S E A R C H 
                   ====================== 
 
    Format is G\\\ 
 
    This function will search a FABS file for a key. The following 
    parameters are required : 
 
    1. The key number . 
    2. The file number > 0 and < 7. 
    3. The value of the key. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_search( key_num, file_num, key ) 
unsigned key_num, file_num ; 
char *key ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "S", adr, 0 ) ; 
  adr = add_num( key_num, adr, cmd, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 0 ) ; 
  adr = fill_fabs( cmd, key, adr, 1 ) ; 
 
/* printf("FABS search string is %s\n",cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Specific", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_search */ 
/*            F A B S    G E N E R I C    S E A R C H 
              ======================================= 
 
    Format is G\\\ 
 
    This function will search a FABS file for the first record equal to 
    greater than key. The following parameters are required : 
 
    1. The key number . 
    2. The file number > 0 and < 7. 
    3. The value of the key. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_generic( key_num, file_num, key ) 
unsigned key_num, file_num ; 
char *key ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "G", adr, 0 ) ; 
  adr = add_num( key_num, adr, cmd, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 0 ) ; 
  adr = fill_fabs( cmd, key, adr, 1 ) ; 
 
/* printf("FABS generic string is %s\n", cmd ) ;   */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Generic", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_generic */ 
/*                  F A B S    B U I L D   K E Y 
                    ============================ 
 
    Format is B\\\..\ 
 
    This function will insert a record into a FABS file without 
    updating the map file. A write map FABS call must be executed 
    after a series of build calls. The following parameters are 
    required : 
 
    1. The file number > 0 and < 7. 
    2. The keys seperated by '\'. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_build( keys, file_num ) 
unsigned file_num ; 
char keys[]; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  ad( keys, file_num ) 
unsigned file_num ; 
char keys[]; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "B", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 0 ) ; 
  adr = fill_fabs( cmd, keys, adr, 1 ) ; 
 
/* printf("FABS insert string is %s\n",cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return ( fabs_error( "Build", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_build */ 
/*                   F A B S    M A P 
                     ================ 
 
    Format is W\ 
 
    This function will write the map file. This function must be 
    executed after a series of build commands. The following 
    parameters are required : 
 
    1. The file number > 0 and < 7. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_map( file_num ) 
unsigned file_num ; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "W", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 1 ) ; 
 
/*  printf("FABS write string is %s\n", cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return( fabs_error( "Write", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_map */ 
/*                  F A B S    D E L E T E 
                    ====================== 
 
    Format is D\\\\\..\ 
 
    This function will delete a record from a FABS file. The following 
    parameters are required : 
 
    1. The file record number. 
    1. The search before delete flag. 
    1. The file number > 0 and < 7. 
    2. The keys seperated by '\'. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_delete( rec_num, SBDF, keys, file_num ) 
unsigned file_num ; 
unsigned rec_num ; 
char SBDF; 
char keys[]; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "D", adr, 0 ) ; 
  adr = add_num( rec_num, adr, cmd, 0 ) ; 
  if ( SBDF == 'N' ) 
    adr = fill_fabs( cmd, "N", adr, 0 ) ; 
  else 
    adr = fill_fabs( cmd, "Y", adr, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 0 ) ; 
  adr = fill_fabs( cmd, keys, adr, 1 ) ; 
 
/* printf("FABS delete string is %s\n",cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return ( fabs_error( "Delete", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_delete */ 
/*                  F A B S    R E P L A C E 
                    ======================== 
 
    Format is R\\\\\ 
 
    This function will replace a single key with another key using the 
    same record number and primary key number.The following 
    parameters are required : 
 
    1. The key number. 
    2. The record number to replace. 
    3. The file number > 0 and < 7. 
    4. The old key. 
    5. The new key. 
 
    The program aborts if a FABS error occures. 
 
*/ 
fabs_replace( key_num, rec_num,file_num, old_key, new_key ) 
unsigned key_num, rec_num, file_num ; 
char old_key[], new_key[]; 
{ int adr, err ; 
  char *cmd ; 
 
  cmd = FABS_INIT ; 
  adr = 0 ; 
  adr = fill_fabs( cmd, "R", adr, 0 ) ; 
  adr = add_num( key_num, adr, cmd, 0 ) ; 
  adr = add_num( rec_num, adr, cmd, 0 ) ; 
  adr = add_num( file_num, adr, cmd, 0 ) ; 
  adr = fill_fabs( cmd, old_key, adr, 0 ) ; 
  adr = fill_fabs( cmd, new_key, adr, 1 ) ; 
 
/* printf("FABS replace string is %s\n",cmd ) ;  */ 
 
  if ( err = call_fabs( cmd ) ) 
    return ( fabs_error( "Replace", cmd, err ) ) ; 
 
  return( err ) ; 
 
}  /* end of fabs_replace */