You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
6.4 KiB
225 lines
6.4 KiB
/*!
|
|
\file fs.c
|
|
\brief Various file-system functions.
|
|
|
|
This file contains various functions that deal with interfacing with
|
|
the filesystem in a portable way.
|
|
|
|
\date Started 4/10/95
|
|
\author George
|
|
\version\verbatim $Id: fs.c 14332 2013-05-18 12:22:57Z karypis $ \endverbatim
|
|
*/
|
|
|
|
|
|
#include <GKlib.h>
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
* This function checks if a file exists
|
|
**************************************************************************/
|
|
int gk_fexists(char *fname)
|
|
{
|
|
struct stat status;
|
|
|
|
if (stat(fname, &status) == -1)
|
|
return 0;
|
|
|
|
return S_ISREG(status.st_mode);
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* This function checks if a directory exists
|
|
**************************************************************************/
|
|
int gk_dexists(char *dirname)
|
|
{
|
|
struct stat status;
|
|
|
|
if (stat(dirname, &status) == -1)
|
|
return 0;
|
|
|
|
return S_ISDIR(status.st_mode);
|
|
}
|
|
|
|
|
|
/*************************************************************************/
|
|
/*! \brief Returns the size of the file in bytes
|
|
|
|
This function returns the size of a file as a 64 bit integer. If there
|
|
were any errors in stat'ing the file, -1 is returned.
|
|
\note That due to the -1 return code, the maximum file size is limited to
|
|
63 bits (which I guess is okay for now).
|
|
*/
|
|
/**************************************************************************/
|
|
ssize_t gk_getfsize(char *filename)
|
|
{
|
|
struct stat status;
|
|
|
|
if (stat(filename, &status) == -1)
|
|
return -1;
|
|
|
|
return (size_t)(status.st_size);
|
|
}
|
|
|
|
|
|
/*************************************************************************/
|
|
/*! This function gets some basic statistics about the file.
|
|
\param fname is the name of the file
|
|
\param r_nlines is the number of lines in the file. If it is NULL,
|
|
this information is not returned.
|
|
\param r_ntokens is the number of tokens in the file. If it is NULL,
|
|
this information is not returned.
|
|
\param r_max_nlntokens is the maximum number of tokens in any line
|
|
in the file. If it is NULL this information is not returned.
|
|
\param r_nbytes is the number of bytes in the file. If it is NULL,
|
|
this information is not returned.
|
|
*/
|
|
/*************************************************************************/
|
|
void gk_getfilestats(char *fname, size_t *r_nlines, size_t *r_ntokens,
|
|
size_t *r_max_nlntokens, size_t *r_nbytes)
|
|
{
|
|
size_t nlines=0, ntokens=0, max_nlntokens=0, nbytes=0, oldntokens=0, nread;
|
|
int intoken=0;
|
|
char buffer[4097], *cptr;
|
|
FILE *fpin;
|
|
|
|
fpin = gk_fopen(fname, "r", "gk_GetFileStats");
|
|
|
|
while (!feof(fpin)) {
|
|
nread = fread(buffer, sizeof(char), 4096, fpin);
|
|
nbytes += nread;
|
|
|
|
buffer[nread] = '\0'; /* There is space for this one */
|
|
for (cptr=buffer; *cptr!='\0'; cptr++) {
|
|
if (*cptr == '\n') {
|
|
nlines++;
|
|
ntokens += intoken;
|
|
intoken = 0;
|
|
if (max_nlntokens < ntokens-oldntokens)
|
|
max_nlntokens = ntokens-oldntokens;
|
|
oldntokens = ntokens;
|
|
}
|
|
else if (*cptr == ' ' || *cptr == '\t') {
|
|
ntokens += intoken;
|
|
intoken = 0;
|
|
}
|
|
else {
|
|
intoken = 1;
|
|
}
|
|
}
|
|
}
|
|
ntokens += intoken;
|
|
if (max_nlntokens < ntokens-oldntokens)
|
|
max_nlntokens = ntokens-oldntokens;
|
|
|
|
gk_fclose(fpin);
|
|
|
|
if (r_nlines != NULL)
|
|
*r_nlines = nlines;
|
|
if (r_ntokens != NULL)
|
|
*r_ntokens = ntokens;
|
|
if (r_max_nlntokens != NULL)
|
|
*r_max_nlntokens = max_nlntokens;
|
|
if (r_nbytes != NULL)
|
|
*r_nbytes = nbytes;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* This function takes in a potentially full path specification of a file
|
|
* and just returns a string containing just the basename of the file.
|
|
* The basename is derived from the actual filename by stripping the last
|
|
* .ext part.
|
|
**************************************************************************/
|
|
char *gk_getbasename(char *path)
|
|
{
|
|
char *startptr, *endptr;
|
|
char *basename;
|
|
|
|
if ((startptr = strrchr(path, '/')) == NULL)
|
|
startptr = path;
|
|
else
|
|
startptr = startptr+1;
|
|
|
|
basename = gk_strdup(startptr);
|
|
|
|
if ((endptr = strrchr(basename, '.')) != NULL)
|
|
*endptr = '\0';
|
|
|
|
return basename;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* This function takes in a potentially full path specification of a file
|
|
* and just returns a string corresponding to its file extension. The
|
|
* extension of a file is considered to be the string right after the
|
|
* last '.' character.
|
|
**************************************************************************/
|
|
char *gk_getextname(char *path)
|
|
{
|
|
char *startptr;
|
|
|
|
if ((startptr = strrchr(path, '.')) == NULL)
|
|
return gk_strdup(path);
|
|
else
|
|
return gk_strdup(startptr+1);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* This function takes in a potentially full path specification of a file
|
|
* and just returns a string containing just the filename.
|
|
**************************************************************************/
|
|
char *gk_getfilename(char *path)
|
|
{
|
|
char *startptr;
|
|
|
|
if ((startptr = strrchr(path, '/')) == NULL)
|
|
return gk_strdup(path);
|
|
else
|
|
return gk_strdup(startptr+1);
|
|
}
|
|
|
|
/*************************************************************************
|
|
* This function takes in a potentially full path specification of a file
|
|
* and extracts the directory path component if it exists, otherwise it
|
|
* returns "./" as the path. The memory for it is dynamically allocated.
|
|
**************************************************************************/
|
|
char *getpathname(char *path)
|
|
{
|
|
char *endptr, *tmp;
|
|
|
|
if ((endptr = strrchr(path, '/')) == NULL) {
|
|
return gk_strdup(".");
|
|
}
|
|
else {
|
|
tmp = gk_strdup(path);
|
|
*(strrchr(tmp, '/')) = '\0';
|
|
return tmp;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
* This function creates a path
|
|
**************************************************************************/
|
|
int gk_mkpath(char *pathname)
|
|
{
|
|
char tmp[2048];
|
|
|
|
sprintf(tmp, "mkdir -p %s", pathname);
|
|
return system(tmp);
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
* This function deletes a directory tree and all of its contents
|
|
**************************************************************************/
|
|
int gk_rmpath(char *pathname)
|
|
{
|
|
char tmp[2048];
|
|
|
|
sprintf(tmp, "rm -r %s", pathname);
|
|
return system(tmp);
|
|
}
|
|
|