www.pudn.com > SmartFDISK.zip > bc.cc


/* Copyright (C) 1996,1997 Robert H”hne, see COPYING.RH for details */ 
/* This file is part of RHIDE. */ 
#include  
#if defined( DJGPP ) 
#include  
#include  
#endif 
#include  
#include  
#include  
#include  
 
#include  
#include  
 
unsigned short win_ver() 
{ 
#if defined( DJGPP ) 
  __dpmi_regs r; 
  r.x.ax = 0x160a; 
  __dpmi_int(0x2f,&r); 
  if (r.x.ax == 0) return r.x.bx; 
#endif 
  return 0; 
} 
 
#if defined( DJGPP ) 
int getcurdir(int drive, char *buffer) 
{ 
  if (!drive) getwd(buffer); 
  else 
  { 
    int d = getdisk(); 
    setdisk(drive-1); 
    getwd(buffer); 
    setdisk(d); 
  } 
  strcpy(buffer,buffer+3); 
  return 0; 
} 
#else 
int getcurdir(int , char *buffer) 
{ 
  getwd(buffer); 
  return 0; 
} 
#endif 
 
#if !defined( DJGPP ) || ( DJGPP < 2 ) 
 
extern "C" long __filelength(int fhandle) 
{ 
  long oldval; 
  long retval; 
  oldval = lseek(fhandle,0,1); 
  if (oldval == -1L) return -1L; 
  retval = lseek(fhandle,0,2); 
  if (retval == -1L) return -1L; 
  if (lseek(fhandle,oldval,0) == -1L) return -1L; 
  return retval; 
} 
 
#endif 
 
/* 
 * Expands a path into its directory and file components. 
 */ 
 
void expandPath(const char *path, char *dir, char *file) 
{ 
  char *tag = strrchr(path, '/'); 
 
  if (tag != NULL) 
  { 
    if (file) 
      strcpy(file, tag + 1); 
    if (dir) 
    { 
      strncpy(dir, path, tag - path + 1); 
      dir[tag - path + 1] = '\0'; 
    } 
  } 
  else 
  { 
    /* there is only the file name */ 
    if (file) 
      strcpy(file, path); 
    if (dir) 
      dir[0] = '\0'; 
  } 
} 
 
#ifdef __DJGPP__ 
#include  // for _fixpath 
#endif 
 
void fexpand( char *rpath ) 
{ 
  char path[PATH_MAX]; 
  _fixpath(rpath,path); 
  strcpy(rpath,path); 
} 
 
Boolean driveValid( char drive ) 
{ 
#ifdef __DJGPP__ 
  __dpmi_regs r; 
  r.x.ax = 0x1C00; 
  r.x.dx = toupper(drive) - 'A' + 1; 
  __dpmi_int(0x21,&r); 
  if (r.h.al != 0xFF) return True; 
#endif 
  return False; 
} 
 
Boolean isDir( const char *str ) 
{ 
  struct stat s; 
   
  if (stat(str, &s) == 0 && S_ISDIR(s.st_mode)) return True; 
  return False; 
} 
 
Boolean pathValid( const char *path ) 
{ 
  char dir[PATH_MAX]; 
  char name[PATH_MAX]; 
   
  expandPath(path, dir, name); 
#ifdef __DJGPP__ 
  if (strlen(dir) <= 3) 
    return driveValid(dir[0]); 
#endif 
  if (*dir && dir[strlen(dir)-1] == '/') strcat(dir, "."); 
  else strcat(dir, "/."); 
#ifdef __DJGPP__ 
  if (driveValid(dir[0]) == False) 
    return False; 
#endif 
  return isDir(dir); 
} 
 
Boolean validFileName( const char *fileName ) 
{ 
#ifdef __DJGPP__ 
  static const char * const illegalChars = ";,=+<>|\"[]/"; 
#else 
  static const char * const illegalChars = "<>|/\""; 
#endif 
  const char *slash = strrchr(fileName,'/'); 
  if (!slash) 
  { 
    if (strpbrk(fileName,illegalChars) != 0) 
      return False; 
    return True; 
  } 
  if (strpbrk(slash+1,illegalChars) != 0) 
    return False; 
  return pathValid(fileName); 
} 
 
void getCurDir( char *dir ) 
{ 
  getwd(dir); 
  if (dir[strlen(dir)-1] != '/') 
    strcat(dir,"/"); 
} 
 
Boolean isWild( const char *f ) 
{ 
    return Boolean( strpbrk( f, "?*" ) != 0 ); 
} 
 
#ifndef __DJGPP__ 
 
/*  
   Here now the very usefull function _fixpath() from DJGPP's 
   libc 'fixpath.c' 
   I have modified it to be used on unix systems (like linux). 
*/ 
 
/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */ 
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ 
 
__inline__ static int 
is_slash(int c) 
{ 
  return c == '/'; 
} 
 
__inline__ static int 
is_term(int c) 
{ 
  return c == '/' || c == '\0'; 
} 
 
/* Takes as input an arbitrary path.  Fixes up the path by: 
   1. Removing consecutive slashes 
   2. Removing trailing slashes 
   3. Making the path absolute if it wasn't already 
   4. Removing "." in the path 
   5. Removing ".." entries in the path (and the directory above them) 
 */ 
void 
_fixpath(const char *in, char *out) 
{ 
  const char	*ip = in; 
  char		*op = out; 
 
  /* Convert relative path to absolute */ 
  if (!is_slash(*ip)) 
  { 
    getcurdir(0,op); 
    op += strlen(op); 
  } 
 
  /* Step through the input path */ 
  while (*ip) 
  { 
    /* Skip input slashes */ 
    if (is_slash(*ip)) 
    { 
      ip++; 
      continue; 
    } 
 
    /* Skip "." and output nothing */ 
    if (*ip == '.' && is_term(*(ip + 1))) 
    { 
      ip++; 
      continue; 
    } 
 
    /* Skip ".." and remove previous output directory */ 
    if (*ip == '.' && *(ip + 1) == '.' && is_term(*(ip + 2))) 
    { 
      ip += 2; 
      /* Don't back up over root '/' */ 
      if (op > out ) 
      /* This requires "/" to follow drive spec */ 
	while (!is_slash(*--op)); 
      continue; 
    } 
 
    /* Copy path component from in to out */ 
    *op++ = '/'; 
    while (!is_term(*ip)) *op++ = *ip++; 
  } 
 
  /* If root directory, insert trailing slash */ 
  if (op == out) *op++ = '/'; 
 
  /* Null terminate the output */ 
  *op = '\0'; 
 
} 
 
/* 
  End of modified code from DJGPP's libc 'fixpath.c' 
*/ 
 
int __file_exists(const char *fname) 
{ 
  return (access(fname,R_OK) == 0); 
} 
 
#endif // __DJGPP__