cgma
CubitFileUtil Class Reference

#include <CubitFileUtil.hpp>

List of all members.

Public Member Functions

 CubitFileUtil ()
 ~CubitFileUtil ()

Static Public Member Functions

static const char * separator ()
static bool is_directory (const CubitString &path)
static bool path_exists (const CubitString &path)
static bool is_executable (const CubitString &path)
static bool is_absolute (const CubitString &path)
static int file_info (const CubitString &path, off_t &size, time_t &modification_time, int &mode)
static CubitString find_home_path (const CubitString &which_user="")
 Find the users home directory independent of OS.
static CubitStatus get_current_working_directory (CubitString &wd)
 Get/Set current working directory.
static CubitStatus set_current_working_directory (const CubitString &wd)
static CubitString add_name_to_path (const CubitString &path, const CubitString &name)
static CubitStatus create_directory (const CubitString &wd)
static CubitStatus remove_file (const CubitString &file)
 remove a file or directory
static CubitStatus rename_file (const CubitString &old_file, const CubitString &new_file)
 rename a file
static CubitStatus get_full_path_str (const CubitString &part, CubitString &full_path)
static CubitString make_path_platform_compatible (const CubitString &path)
static CubitString get_nice_filename (const CubitString &path)
static void split_path (const CubitString &path, CubitString &dirpart, CubitString &filepart)
static int get_next_filenumber (const CubitString &filepattern, int &num_matches, int &first_match)
static CubitString get_file_extension (const CubitString &file, bool remove_version=false)
static CubitString list_matching_files (const char *path, const char *file, std::vector< std::string > suffixes, CubitString &line)
 list the files that match for tab completion
static int complete_filename (CubitString &line, int &num_additional_chars, bool &found_quote)
 Do filename completion.

Static Private Member Functions

static CubitBoolean all_chars_are (char ch, const char *str)
static CubitBoolean is_int_number (const char *str)
static CubitBoolean contains_char (char ch, const char *str)

Detailed Description

Definition at line 13 of file CubitFileUtil.hpp.


Constructor & Destructor Documentation


Member Function Documentation

CubitString CubitFileUtil::add_name_to_path ( const CubitString path,
const CubitString name 
) [static]

Given a path append the name onto the path correctly

Parameters:
path,alsocontains the returned value
name

Definition at line 104 of file CubitFileUtil.cpp.

{
  CubitString result = path;
  // Add a slash at the end of the path, if not already there
  int path_len = result.length();
  if( result.c_str()[path_len-1] != DIR_SEP_CHAR )
  {
    result += DIR_SEP_STR;
  }
  // append the name to the end of the path
  result += name;
      
  return result;
}
CubitBoolean CubitFileUtil::all_chars_are ( char  ch,
const char *  str 
) [static, private]

Definition at line 348 of file CubitFileUtil.cpp.

{
  while( *str )
    if( *str++ != ch )
      return CUBIT_FALSE;
    return CUBIT_TRUE;
}
int CubitFileUtil::complete_filename ( CubitString line,
int &  num_additional_chars,
bool &  found_quote 
) [static]

Do filename completion.

Definition at line 510 of file CubitFileUtil.cpp.

{
  // save the original length
  num_additional_chars = line.length();
  char* buffer = (char*) line.c_str();

  char *ptr_from;
  if ( (ptr_from = strrchr(buffer, '\'')) == NULL &&
       (ptr_from = strrchr(buffer, '\"')) == NULL)
  {
    return -1;
  }
  
  ptr_from++; // skip past the single/double quote
  
    // Separate the directory portion from the filename portion (if any)
  char *file;
  char *path;

#ifndef _WIN32
  if ((file = strrchr(ptr_from, '/')) == NULL) // No path
  {
    path = strdup(".");
    file = strdup(ptr_from);
  }
  else if (file == ptr_from)
  {
    path = strdup("/");
    file = strdup(ptr_from + 1);
  }
  else
  {
    path = strdup(ptr_from);
    char *end = strrchr(path, '/');
    *end = '\0';
    ++file;
    file = strdup(file);

    if ( *path == '~' )
    {
      const char *home = getenv("HOME");
      if( !home )
      {
        struct passwd* userdata = getpwuid( getuid() );
        if( userdata )
          home = userdata->pw_dir;
      }
      char *after_tilde = path;
      after_tilde++;
      std::string new_path = home;
      new_path += after_tilde;
      free(path);
      path = strdup( new_path.c_str() );
    }

  }
#else
  file = strrchr(ptr_from, '\\');
  bool slash = 0;
  if(file == NULL)
  {
    slash = 1;
    file = strrchr(ptr_from, '/');
  }
  if(file == NULL)
//   if ((file = strrchr(ptr_from, '\\')) == NULL
//       && file = strrchr(ptr_from, '/') == NULL) // No path
  {
    path = strdup(".");
    file = strdup(ptr_from);
  }
  else if (file == ptr_from)
  {
    path = strdup("\\");
    file = strdup(ptr_from + 1);
  }
  else
  {
    path = strdup(ptr_from);
    char *end;
    if(slash)
       end = strrchr(path, '/');
    else
       end = strrchr(path, '\\');
    
    *end = '\0';
    ++file;
    file = strdup(file);
  }
#endif  
    // Determine what type of files to match (suffix_strings)
    // Need to lowercase keyword and identifier.....
  char *tmp_str = strdup(buffer);
  char *keyword = strtok(tmp_str, " \t");
  CubitUtil::convert_string_to_lowercase(keyword);
  int lenkey = strlen(keyword);
  std::vector<std::string> suffix_strings;
  
  if ((strncmp("import", keyword, lenkey) == 0) ||
      (strncmp("export", keyword, lenkey) == 0))
  {
    char *identifier = strtok(NULL, " \t");
    CubitUtil::convert_string_to_lowercase(identifier);
    int lenid  = strlen(identifier);

      //Let's set up a vector of strings
    std::vector<std::string> acis_strings, cubfile_strings,iges_strings,
       catia_strings,proe_strings,step_strings,fastq_strings, mesh_strings,
        facet_strings, avs_strings, stl_strings, ideas_strings, abaqus_strings,
        nastran_strings, presto_strings;

    iges_strings.push_back(".igs");
    iges_strings.push_back(".iges");


#ifdef GRANITE  
    proe_strings.push_back(".prt");
    proe_strings.push_back(".asm");
    proe_strings.push_back(".prt.");
    proe_strings.push_back(".asm.");
    proe_strings.push_back(".g");
#endif  
#ifdef CATIA
    catia_strings.push_back(".catpart");
    catia_strings.push_back(".catproduct");
    catia_strings.push_back(".ncgm");    
#endif  

    step_strings.push_back(".stp");
    step_strings.push_back(".step");

    fastq_strings.push_back(".fsq");

    mesh_strings.push_back(".g");
    mesh_strings.push_back(".e");
    mesh_strings.push_back(".exo");
    mesh_strings.push_back(".exoII");
    mesh_strings.push_back(".gen");

    facet_strings.push_back(".facets");
    facet_strings.push_back(".facet");
    facet_strings.push_back(".fac");
    facet_strings.push_back(".off");
    facet_strings.push_back(".OFF");
    
    avs_strings.push_back(".avs");

    stl_strings.push_back(".stl");

    ideas_strings.push_back(".unv");

    abaqus_strings.push_back(".inp");

    nastran_strings.push_back(".bdf");

    presto_strings.push_back(".i");
    
    if (strncmp("iges", identifier, lenid) == 0)
    {
      suffix_strings.assign(iges_strings.begin(), iges_strings.end());
    }
    

#ifdef CATIA
    else if (strncmp("catia", identifier, lenid) == 0)
    {
      suffix_strings.assign(catia_strings.begin(), catia_strings.end());
    }
#endif

#ifdef GRANITE  
    else if (strncmp("proe", identifier, lenid) == 0)
    {
      suffix_strings.assign(proe_strings.begin(), proe_strings.end());
    }
#endif  
     else if (strncmp("step", identifier, lenid) == 0)
    {
      suffix_strings.assign(step_strings.begin(), step_strings.end());
    }
    else if (strncmp("fastq", identifier, lenid) == 0)
    {
      suffix_strings.assign(fastq_strings.begin(), fastq_strings.end());
    }
    else if ( strncmp("mesh", identifier, lenid) == 0 ||
              strncmp("free", identifier, lenid) == 0 )
    {
      suffix_strings.assign(mesh_strings.begin(), mesh_strings.end());
    }
    else if (strncmp("facets", identifier, lenid) == 0)
    {
      suffix_strings.assign(facet_strings.begin(), facet_strings.end());
    }
    else if (strncmp("avs", identifier, lenid) == 0)
    {
      suffix_strings.assign(avs_strings.begin(), avs_strings.end());
    }
    else if (strncmp("stl", identifier, lenid) == 0)
    {
      suffix_strings.assign(stl_strings.begin(), stl_strings.end());
    }
    else if (strncmp("ideas", identifier, lenid) == 0)
    {
      suffix_strings.assign(ideas_strings.begin(), ideas_strings.end());
    }
    else if (strncmp("abaqus", identifier, lenid) == 0)
    {
      suffix_strings.assign(abaqus_strings.begin(), abaqus_strings.end());
    }
    else if (strncmp("nastran", identifier, lenid) == 0)
    {
      suffix_strings.assign(nastran_strings.begin(), nastran_strings.end());
    }
    else if (strncmp("presto", identifier, lenid) == 0)
    {
      suffix_strings.assign(presto_strings.begin(), presto_strings.end());
    }
    else //user didn't specify anything, so let's add them all
    {
      suffix_strings.assign(acis_strings.begin(),acis_strings.end());
      suffix_strings.insert(suffix_strings.end(),cubfile_strings.begin(), cubfile_strings.end());
      suffix_strings.insert(suffix_strings.end(),iges_strings.begin(), iges_strings.end());


#ifdef CATIA
      suffix_strings.insert(suffix_strings.end(),catia_strings.begin(), catia_strings.end());
#endif 

#ifdef GRANITE  
      suffix_strings.insert(suffix_strings.end(),proe_strings.begin(), proe_strings.end());
#endif  
      suffix_strings.insert(suffix_strings.end(),step_strings.begin(), step_strings.end());
      suffix_strings.insert(suffix_strings.end(),fastq_strings.begin(), fastq_strings.end());
      suffix_strings.insert(suffix_strings.end(),mesh_strings.begin(), mesh_strings.end());
      suffix_strings.insert(suffix_strings.end(),facet_strings.begin(), facet_strings.end());
      suffix_strings.insert(suffix_strings.end(),avs_strings.begin(), avs_strings.end());
      suffix_strings.insert(suffix_strings.end(),stl_strings.begin(), stl_strings.end());
      suffix_strings.insert(suffix_strings.end(),ideas_strings.begin(), ideas_strings.end());
      suffix_strings.insert(suffix_strings.end(),abaqus_strings.begin(), abaqus_strings.end());
      suffix_strings.insert(suffix_strings.end(),nastran_strings.begin(), nastran_strings.end());
    }
  }
  else if (strncmp("open", keyword, lenkey) == 0)
  {
    suffix_strings.push_back(".cub");  // Not an actual suffix, just an indicator
  }
  else if (strncmp("playback", keyword, lenkey) == 0 ||
           strncmp("record", keyword, lenkey) == 0)
  {
    suffix_strings.push_back(".jou");
    suffix_strings.push_back(".test");
    suffix_strings.push_back(".cubit");
  }
  else if (strncmp("hardcopy", keyword, lenkey) == 0)
  {
    suffix_strings.push_back(".ps");
  }
  else if (strncmp("cd", keyword, lenkey) == 0)
  {
    suffix_strings.push_back("/");  // Not an actual suffix, just an indicator
  }
  else
  {
    suffix_strings.push_back("\0");
  }
    
  free(tmp_str);
  
  CubitString tmp_line(buffer);
  CubitString match = CubitFileUtil::list_matching_files(path, file, suffix_strings, tmp_line);
  
  if (match.length())
  {
    int file_length = strlen(file);
    match = match.c_str() + file_length;
    tmp_line += match;
    if (tmp_line.find("\'") != CubitString::npos)
        tmp_line += "\'";
    else if (tmp_line.find("\"") != CubitString::npos)
      tmp_line += "\" ";
    else
    {
      PRINT_ERROR("INTERNAL ERROR: CubitFileUtil::complete_file -- Could not find "
                  "quote type.");
      tmp_line += "\' ";
    }
    //gl_in_quoted_string = !gl_in_quoted_string;
    //gl_fixup(gl_pos, gl_pos+additional_char);
    found_quote = !found_quote;
  }
  line = tmp_line;
  free(path);
  free(file);
  //gl_redraw();
  num_additional_chars = line.length() - num_additional_chars;
  
  return 1;
}
CubitBoolean CubitFileUtil::contains_char ( char  ch,
const char *  str 
) [static, private]

Definition at line 366 of file CubitFileUtil.cpp.

{
  while( *str )
    if( *str++ == ch )
      return CUBIT_TRUE;
    return CUBIT_FALSE;
}

Definition at line 148 of file CubitFileUtil.cpp.

{
  // Create the directory
#ifdef _WIN32
  if (_wmkdir(CubitString::toUtf16(wd).c_str()) == -1)
  {  
    PRINT_WARNING( "Unable to create new directory\n" );
    return CUBIT_FAILURE;
  }
#else    
  if (mkdir(wd.c_str(), 0777) == -1)
  {  
    PRINT_WARNING( "Unable to create new directory\n" );
    return CUBIT_FAILURE;
  }
#endif    
  return CUBIT_SUCCESS;
}
int CubitFileUtil::file_info ( const CubitString path,
off_t &  size,
time_t &  modification_time,
int &  mode 
) [static]

Definition at line 486 of file CubitFileUtil.cpp.

{
#ifdef _WIN32
  // remove trailing separators
  CubitString mypath = path;
  if(mypath.length() >= 1 && mypath.get_at(mypath.length()-1) == DIR_SEP_CHAR)
    mypath = mypath.substr(0, mypath.length()-1);
  struct _stati64 file_info;
  int stat_result = _wstati64( CubitString::toUtf16(mypath).c_str(), &file_info );
#else
  struct stat file_info;
  int stat_result = lstat( path.c_str(), &file_info );
#endif

  if(stat_result == 0)
  {
    size = file_info.st_size;
    time = file_info.st_mtime;
    mode = file_info.st_mode;
    return 0;
  }
  return errno ? errno : ENOENT;
}
CubitString CubitFileUtil::find_home_path ( const CubitString which_user = "") [static]

Find the users home directory independent of OS.

Definition at line 119 of file CubitFileUtil.cpp.

{
  CubitString home_dir;

#ifdef _WIN32
  home_dir = CubitUtil::getenv("USERPROFILE");
#else
  if(which_user.length() == 0)
  {
    home_dir = CubitUtil::getenv("HOME");
    if( home_dir.length() == 0 )
    {
      struct passwd* userdata = getpwuid( getuid() );
      if( userdata )
        home_dir = userdata->pw_dir;
    }
  }
  else
  {
    struct passwd* userdata = getpwnam( which_user.c_str() );
    if(userdata)
      home_dir = userdata->pw_dir;
  }
#endif

  return home_dir;
}

Get/Set current working directory.

Definition at line 51 of file CubitFileUtil.cpp.

{
#ifdef _WIN32
  wchar_t* buffer = _wgetcwd( NULL, 0 );
#else
  char* buffer = getcwd( NULL, 0 );
#endif
  if (!buffer)
  {
    PRINT_WARNING( "Unable to get new working directory\n" );
    return CUBIT_FAILURE;
  }
  else
  {
    // convert to string
#ifdef _WIN32
    wd = CubitString::toUtf8(buffer);
#else
    wd = buffer;
#endif

    // Add a slash at the end, if not already there
    int wd_len = wd.length();
    if( wd.c_str()[wd_len-1] != DIR_SEP_CHAR )
    {
      wd += DIR_SEP_STR;

      free(buffer);
    }

// TODO: need to figure out the right way to do this. This assumes
// variables of length PATH_MAX which is bad!
//#ifdef _WIN32
//    // Make sure format is compatible with full path format
//    CubitString full_path_str;
//    if( get_full_path_str( wd, full_path_str ) == CUBIT_SUCCESS )
//      strcpy( wd, full_path_str.c_str() );
//#endif

    return CUBIT_SUCCESS;
  }
}
CubitString CubitFileUtil::get_file_extension ( const CubitString file,
bool  remove_version = false 
) [static]

Definition at line 315 of file CubitFileUtil.cpp.

{
  size_t dot_pos = file.find_last('.');
  size_t dot_pos2 = 0;

  if ( dot_pos == CubitString::npos )
    return "";

  if(remove_version)
  {
      dot_pos2 = file.find_last('.',dot_pos);
    if ( dot_pos2 == CubitString::npos )
          remove_version = false;
      else if(!is_int_number( file.substr(dot_pos+1).c_str() ))
          remove_version = false;
  }

  CubitString extension;
  if(!remove_version)
      extension = file.substr(dot_pos);
  else
      extension = file.substr(dot_pos2,dot_pos-dot_pos2);
  
  for ( size_t i = 0; i < extension.length(); i++ )
    extension.put_at(i, tolower( extension.get_at(i) ) );
    
  return extension;
  
}  //  get_file_extension()
CubitStatus CubitFileUtil::get_full_path_str ( const CubitString part,
CubitString full_path 
) [static]

Definition at line 189 of file CubitFileUtil.cpp.

{
  CubitString my_part = CubitFileUtil::make_path_platform_compatible(part);

#ifdef _WIN32

  wchar_t* full = _wfullpath(NULL, CubitString::toUtf16(my_part).c_str(), 0);
  if(!full)
  {
    PRINT_ERROR( "problem getting full path to %s\n", part.c_str() );
    return CUBIT_FAILURE;
  }
  full_path_str = CubitString::toUtf8(full);
  free(full);
  
#else

  // we loop removing parts until realpath can resolve an existing path,
  // then add the non-existing parts back on.

  std::vector<CubitString> split_parts;
  CubitString trypart = part;

  if(!CubitFileUtil::is_absolute(trypart))
  {
    CubitString cwd;
    CubitFileUtil::get_current_working_directory(cwd);
    trypart = CubitFileUtil::add_name_to_path(cwd, trypart);
  }

  char full[PATH_MAX];
  while(trypart.length() && !realpath(trypart.c_str(), full))
  {
    CubitString split_part1, split_part2;
    CubitFileUtil::split_path(trypart, split_part1, split_part2);
    split_parts.push_back(split_part2);
    if(split_part1.length() == 0)
    {
      PRINT_ERROR( "problem getting full path to %s\n", part.c_str() );
      return CUBIT_FAILURE;
    }
    trypart = split_part1;
  }

  full_path_str = full;
  for(size_t i=0; i<split_parts.size(); i++)
  {
    full_path_str += CubitString("/") + split_parts[split_parts.size() - i - 1];
  }

#endif

  return CUBIT_SUCCESS;
}
int CubitFileUtil::get_next_filenumber ( const CubitString filepattern,
int &  num_matches,
int &  first_match 
) [static]

Definition at line 406 of file CubitFileUtil.cpp.

{
  // TODO: check this bug?
  // Continue if nothing after dot.  Also, I noticed the _WIN32 will match
  // file.cub against wildcard file.cub.*

  int max_number = 0;
  int min_number = CUBIT_INT_MAX;
  num_matches = 0;

  // get directory and file parts
  CubitString dir, file, full_file_pattern;
  CubitFileUtil::get_full_path_str(file_pattern, full_file_pattern);
  CubitFileUtil::split_path(full_file_pattern, dir, file);

  size_t wildcard_location = file.find("*");
  if(wildcard_location == CubitString::npos)
    return 1;

  CubitDirIterator dir_iter(dir, file);

  while(dir_iter.has_next())
  {
    CubitString f = dir_iter.next();

    // cut off the matched part
    f = f.substr(wildcard_location, 1 + f.length() - file.length());
    if( is_int_number(f.c_str()) )
    {
      int num = atoi(f.c_str());
      max_number = std::max(num, max_number);
      min_number = std::min(num, min_number);
    }
    num_matches++;
  }

  if( min_number != CUBIT_INT_MAX )
    first_id = min_number;

  return max_number+1;
}

Definition at line 265 of file CubitFileUtil.cpp.

{
  CubitString ret_str;

  CubitString dpart_in, fpart_in;
  split_path( path, dpart_in, fpart_in );

  CubitString wd;
  get_current_working_directory( wd );

  if( dpart_in == wd )
    ret_str = fpart_in;
  else
    ret_str = path;

  return ret_str;
}
bool CubitFileUtil::is_absolute ( const CubitString path) [static]

Definition at line 477 of file CubitFileUtil.cpp.

{
#ifdef _WIN32
  return !PathIsRelativeW(CubitString::toUtf16(path).c_str());
#else
  return path.c_str()[0] == '/' ? true : false;
#endif
}
bool CubitFileUtil::is_directory ( const CubitString path) [static]

Definition at line 450 of file CubitFileUtil.cpp.

{
  off_t size;
  time_t time;
  int mode = 0;
  if(0 == file_info(path, size, time, mode))
  {
#ifdef _WIN32
  if( (_S_IFDIR & mode) )
#else
  if( S_ISDIR( mode ) )
#endif
    {
      return true;
    }
  }
  return false;
}
static bool CubitFileUtil::is_executable ( const CubitString path) [static]
CubitBoolean CubitFileUtil::is_int_number ( const char *  str) [static, private]

Definition at line 357 of file CubitFileUtil.cpp.

{
  while( *str )
    if( !isdigit(*str++) )
      return CUBIT_FALSE;
    return CUBIT_TRUE;
}
CubitString CubitFileUtil::list_matching_files ( const char *  path,
const char *  file,
std::vector< std::string >  suffixes,
CubitString line 
) [static]

list the files that match for tab completion

Definition at line 809 of file CubitFileUtil.cpp.

{
  CubitString filename;
  size_t      len;
  int         match = 0;
  int         width = 0;
  CubitString match_file;
  CubitString char_match;
  CubitBoolean list_files = CUBIT_FALSE;
  CubitBoolean dir_only = CUBIT_FALSE;
  CubitBoolean is_dir = CUBIT_FALSE;

  CubitDirIterator dirp(path);

  if (!dirp.has_next())
  {
    PRINT_INFO("\n");
    PRINT_ERROR("Invalid Directory: '%s'\n",
                path);
    return "";
  }

    // If we're looking for directories only, indicate it
  if (suffixes.size() > 0 && suffixes.front() ==  "/")
  {
    dir_only = CUBIT_TRUE;
  }
  
  len = strlen(file);
  while (dirp.has_next())
  {
    filename = dirp.next();

    // Skip the . and .. entries in the directory
    if (filename.c_str()[0] == '.' &&
        (filename.c_str()[1] == '\0'))
      continue;
      // Skip files if we only want directories

    is_dir = CubitFileUtil::is_directory(CubitFileUtil::add_name_to_path(path, filename));
        
    if (dir_only && !is_dir)
       continue;

      // Skip what doesn't match
    if (len && strncmp(filename.c_str(), file, len) != 0)
      continue;
    
      // We have a match, see if the suffix (if any) matches
    int sat_number_found = 0;

      // Only match ".prt.", or ".asm." if they are followed by just digits.
    std::vector<std::string>::iterator suff;
    for(suff = suffixes.begin(); suff != suffixes.end(); suff++)
    {
      
      if(*suff == ".prt." ||  *suff == ".asm.")
      {        
        const char* c_ptr = strstr(filename.c_str(), suff->c_str());
        if(c_ptr)
        {
          c_ptr += 5;
            // Make sure the rest of the filename is just digits
          sat_number_found = 1;
          while(*c_ptr != '\0')
          {
            if (!isdigit(*c_ptr))
               sat_number_found = 0;
            c_ptr++;
          }
        }
      }
    }
    
    int found = 0;
    const char* dot = strrchr(filename.c_str(), '.');
    if(dot != NULL && !is_dir)
    {
      for(suff = suffixes.begin(); suff != suffixes.end(); suff++)
      {
#ifdef _WIN32
        if(stricmp(suff->c_str(), dot) == 0)
#else
        if(strcasecmp(suff->c_str(), dot) == 0)
#endif
        {
          found = 1;  //if the suffix matches
          break;
        }
      }
    }
    else  //If the filename has no suffix, then we'll add it
       found = 1;
            
      
    if(suffixes.begin()->size() == 0 || // If no suffix was sent in
        found == 1 || //or suffix matches or the filename has no suffix
        sat_number_found == 1)  //or if the suffix is something like ".sat."
    {
        // Save the filename of the first match
      if (++match == 1)
      {
        match_file = filename;
        if (list_files == CUBIT_FALSE)
          char_match = filename.c_str()+len;
      }
        // list_files is FALSE until we have found 2 or more matches
        // that have no initial characters in common
      else if (list_files == CUBIT_FALSE)
      {
          // If the initial character doesn't match, list instead.
        if (char_match.c_str()[0] != filename.c_str()[len])
        {
            // Indicate that we are listing
          list_files = CUBIT_TRUE;
            // Indicate that we are starting over
          dirp.open(path);
          match = 0;
            // Undo what has already been done
          continue;
        }
        
          // If there is a match, see how many characters match.
        for (unsigned int i = 0; i < char_match.length(); i++)
        {
          if (char_match.c_str()[i] != filename.c_str()[i+len])
          {
              // Chop off end of char_match
            char_match.put_at(i, '\0');
            break;
          }
        }
      }
        // If two or more matches, we want to 
        // output a list, so put out header and first two matches.
      else if (match == 2)
      {
        width = match_file.length() + filename.length() + 6;
          // See if we need to add a '/' to the first name
        char first_str[2];
        first_str[0] = first_str[1] = '\0';
        if(CubitFileUtil::is_directory(CubitFileUtil::add_name_to_path(path, match_file)))
          first_str[0] = '/';
        
          // Get ready to test second file
        bool tmp_is_dir = CubitFileUtil::is_directory(CubitFileUtil::add_name_to_path(path, filename));

        PRINT_INFO("\n\nPossible filename matches:\n  %s%s  %s%s",
                   match_file.c_str(), first_str, filename.c_str(),
                   tmp_is_dir ? "/" : "");
      }
      else  // This is at least the third match, and we
          // need to list the file names
      {
        bool tmp_is_dir = CubitFileUtil::is_directory(CubitFileUtil::add_name_to_path(path, filename));
        int dir_adjust = tmp_is_dir ? 1 : 0;
        width += filename.length() + 2 + dir_adjust;
        if (width > 79)
        {
          PRINT_INFO(" \n" );
          width = filename.length() + 2 + dir_adjust;
        }
        PRINT_INFO("  %s%s",  filename.c_str(),
                   dir_adjust ? "/" : "");
      }
    }
  }

  if (match == 1)
  {
      // See if match_file is a directory

    if(CubitFileUtil::is_directory(CubitFileUtil::add_name_to_path(path, match_file)))
    {
        // If our only match is a directory,
        // Add the directory name to the buffer, but
        // return NULL.
        // Otherwise, return match_file.
      
      // Look at 'line'. Find the first occurance of a '\'. Use that as
      // the suffix for the line if found. Otherwise use '/'.

      CubitString suffix = "/";
      if (line.find_first('\\') != CubitString::npos)
        suffix = "\\";

      line += match_file.substr(len) + suffix;

      match_file = "";
    }
  }
  else if (match > 1)
  {
      // If we didn't list files,
      // add the common chars to the buffer
    if (!list_files)
      line += char_match;
    PRINT_INFO(" \n"  );
    match_file = "";
  }
  
  // Return the file name.
  // If it was a directory or there was more than one match, it returns an empty string.
  return match_file;
}

Definition at line 246 of file CubitFileUtil.cpp.

{
  CubitString ret = path;
  for(size_t i=0; i<ret.length(); i++)
  {
#ifdef _WIN32
  // Replace '/' with '\\'
    if(ret.get_at(i) == '/' )
      ret.put_at(i, '\\');
#else
     // Replace '\\' with '/'
    if(ret.get_at(i) == '\\' )
      ret.put_at(i, '/');
#endif
  }
  return ret;
}
bool CubitFileUtil::path_exists ( const CubitString path) [static]

Definition at line 469 of file CubitFileUtil.cpp.

{
  off_t size;
  time_t time;
  int mode;
  return 0 == file_info(path, size, time, mode);
}

remove a file or directory

Definition at line 168 of file CubitFileUtil.cpp.

{
#ifdef _WIN32
  int status = _wremove(CubitString::toUtf16(file).c_str());
#else
  int status = remove(file.c_str());
#endif
  return status == 0 ? CUBIT_SUCCESS : CUBIT_FAILURE;
}
CubitStatus CubitFileUtil::rename_file ( const CubitString old_file,
const CubitString new_file 
) [static]

rename a file

Definition at line 178 of file CubitFileUtil.cpp.

{
#ifdef _WIN32
  int status = _wrename(CubitString::toUtf16(old_file).c_str(), CubitString::toUtf16(new_file).c_str());
#else
  int status = rename(old_file.c_str(), new_file.c_str());
#endif
  return status == 0 ? CUBIT_SUCCESS : CUBIT_FAILURE;
}
const char * CubitFileUtil::separator ( ) [static]

Definition at line 45 of file CubitFileUtil.cpp.

{
  return DIR_SEP_STR;
}

Definition at line 94 of file CubitFileUtil.cpp.

{
#ifdef _WIN32
  int ret = _wchdir(CubitString::toUtf16(wd).c_str());
#else
  int ret = chdir(wd.c_str());
#endif
  return ret == 0 ? CUBIT_SUCCESS : CUBIT_FAILURE;
}
void CubitFileUtil::split_path ( const CubitString path,
CubitString dirpart,
CubitString filepart 
) [static]

Definition at line 284 of file CubitFileUtil.cpp.

{
  CubitString mypath = path;
  while(mypath.length() && mypath.get_at(mypath.length()-1) == DIR_SEP_CHAR)
  {
    mypath = mypath.substr(0, mypath.length()-1);
  }
  size_t pos = mypath.find_last(DIR_SEP_CHAR);

  // No separator - could be filename or directory.  We assume
  // it's a directory.
  if(pos == CubitString::npos)
  {
    filepart = ".";
    dirpart = mypath;
  }
  else
  {
    filepart = mypath.substr(pos+1);
    dirpart = mypath.substr(0, pos);
  }

  // Add slash on end of dirpart if not already there
  if(dirpart.length() && dirpart.get_at(dirpart.length()-1) != DIR_SEP_CHAR)
    dirpart += DIR_SEP_STR;

  return;
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines