📄 mutils.c
字号:
*times;
tm=time (NULL);
times=ctime(&tm);
times[(int) strlen(times)-1] = '\0';
return (times);
}
/* chop new line from a string */
/* string is modifiled */
char mutilsChopNL(string)
char
*string;
{
char
c;
char
*ptr;
c='\0';
if (string == NULL || *string == '\0')
return(c);
for (ptr = string; *ptr; ptr++);
if (ptr != string)
{
c = *(--ptr);
if (c == '\n')
{
*ptr='\0';
}
}
return (c);
}
/*
* mutilsStripLeadingSpace () - strips leading space/s from a string
*
* Description:
* This function strips leading spaces from a string and
* null terminates it.
*
* Input Parameters:
* char *str
*
* Output Parameters:
* char *str
*
* Return Values:
* one
*
* Side Effects:
* str is modified
*
* Limitations and Comments:
* str must points to a pre-allocated static or dynamic space
*
* Development History:
* who when why
* MA_Muquit@fccc.edu 18-Jun-96 first cut
*/
void mutilsStripLeadingSpace(char *s)
{
int i,
n=0;
char
*ls;
if (s == NULL || *s == '\0')
return;
for (i=0; i < (int) strlen(s); i++)
{
if ((s[i] == ' ' ) || (s[i] == '\t'))
n++;
else
break;
}
if (n)
{
ls= (char *) malloc(strlen(s)*sizeof(char)+1);
if (ls != (char *) NULL)
{
(void) strcpy (ls,s+n);
(void) strcpy (s,ls);
(void) free ((char *) ls);
}
}
}
/*
** mutilsStripTrailingSpace()
** strips trailing spaces at the end of a string.
**
** Parameters:
** char *str the string
**
** Return Values:
** none
**
** Limitations and Comments:
** the string is modified
**
**
** Development History:
** who when why
** ma_muquit@fccc.edu Jul-04-1998 first cut
*/
void mutilsStripTrailingSpace (char *str)
{
register int
i;
if (str == NULL || *str == '\0')
return;
for ((i=(int) strlen(str)-1); i >= 0; i--)
{
if ((str[i] == ' ') || (str[i] == '\t'))
{
str[i] = '\0';
}
else
break;
}
}
/*
** make a temporary filename
** filename - returns
*/
int mutilsTmpFilename(char *filename)
{
#define TMP_DIR "/tmp"
#define TMP_TEMPLATE "%s/editdb.XXXXXX"
char
*dir;
dir=(char *) getenv("TMPDIR");
if (dir == (char *) NULL)
dir=TMP_DIR;
(void) sprintf(filename,TMP_TEMPLATE,dir);
#ifdef HAVE_MKSTEMP
return(mkstemp(filename));
#else
return(mktemp(filename));
#endif /* ! HAVE_MKSTEMP */
}
/*
* basename() - return a file's basename
*
* RCS:
* $Revision: 1 $
* $Date: 2/24/04 8:38p $
*
* Security:
* Unclassified
*
* Description:
* Basename parses a char string containing a path name and
* returns a pointer to the file's base name.
*
* Input Parameters:
* char *path - the fully qualified path to parse
*
* Output Parameters:
* None.
*
* Return Values:
* (char *) - a pointer to the start of the base name within
* 'path'
*
* Side Effects:
* None.
*
* Limitations and Comments:
* Basename handles both DOS and UNIX path separators; it also
* handles the DOS device delimiter.
*
* I renamed it to mutilsBasename() as basename() will have collision
* now a days. -- mm, augh-11-1999
*
* Note that this function can return NULL.
*
* Development History:
* 3/26/92, jps, first cut
*/
char *mutilsBasename(path)
char
*path;
{
char
*cptr;
for (cptr = path + strlen(path); cptr >= path; --cptr)
{
switch (*cptr)
{
case ':':
case '/':
case '\\':
return ++cptr;
}
}
return (path);
}
/*
** mutilsDotLock()
** open a file for locking purpose. If the system is Unix, use
** Kernel lock on the file.
**
** Parameters:
** char *lockfile_path - full path of the lock file
** char *errbuf - feels this errbuf in case of error
**
** Return Values:
** none
**
** Limitations and Comments:
** if you're on Unix, make sure the partition is not NFS mounted, if i
** is NFS mounted, the counter might hang.
** errbuf must have enough space to hold the message
**
** Development History:
** who when why
** ma_muquit@fccc.edu Aug-16-1999 first cut
*/
static char
s_lockfile[BUFSIZ];
void mutilsDotLock(char *filepath,char *errbuf)
{
*errbuf='\0';
*s_lockfile='\0';
#ifdef SYS_WIN32
lock_fd=sopen(filepath,_O_RDWR|_O_CREAT,SH_DENYWR,_S_IREAD|_S_IWRITE);
#else
lock_fd=open(filepath,O_RDWR|O_CREAT,0644);
#endif
if (lock_fd < 0) /* open failed */
{
(void) sprintf(errbuf,"Could open counter database lock file for writing:\n%s",filepath);
return;
}
(void) strcpy(s_lockfile,filepath);
#ifdef SYS_UNIX
mutilsSetLock(lock_fd);
#endif
}
/* unlock the file */
void mutilsDotUnlock(int delete)
{
if (lock_fd >= 0)
{
/* closing also unlocks kernel locking */
(void) close(lock_fd);
lock_fd=(-1);
if (delete == 1)
unlink(s_lockfile);
}
}
#ifdef SYS_UNIX
void mutilsSetLock (int fd)
{
#ifdef HAVE_FLOCK
(void) flock(fd,LOCK_EX);
#else
lseek(fd,0L,0);
(void) lockf(fd,F_LOCK,0L);
#endif
}
void mutilsUnsetLock (int fd)
{
#ifdef HAVE_FLOCK
(void) flock(fd,LOCK_UN);
#else
lseek(fd,0L,0);
(void) lockf(fd,F_ULOCK,0L);
#endif
}
#endif /* SYS_UNIX */
/*
** mutilsWhich()
** returns 0 if the program is found in path
** -1 otherwise
**
** modified from: /usr3/doc/which-1.0/which.c on RH 5.2
*/
int mutilsWhich(char *name)
{
#ifndef X_OK
#define X_OK 0x01
#endif /* X_OK */
char
s,
*p,
*path,
szbuf[BUFSIZ];
int
found=0,
len;
/* check if the program exists and executable */
if (access(name,X_OK) == 0) /* found it */
return(0);
/* go through the PATH */
path=getenv("PATH");
if (path == NULL)
return(-1);
p=path;
found=0;
while (*p != '\0' && found == 0)
{
len=0;
while (*p != ':' && *p != '\0')
{
len++;
p++;
}
s=(char) *p;
*p='\0';
(void) sprintf(szbuf,"%s/%s",p-len,name);
*p=s;
if (*p)
p++;
if (access(szbuf,X_OK) == 0)
found=1;
}
if (found == 0)
found=(-1);
if (found == 1) /* found */
found=0;
return(found);
}
/* eat white space from a open FILE pointer */
/* return -1 if fp is NULL */
int mutilsEatWhitespace(FILE *fp)
{
int
c;
if (fp == NULL)
return(-1);
for(c =getc(fp);isspace(c) && ('\n' != c); c=getc(fp))
;
return (c);
}
/* eat comments space from a open FILE pointer */
/* this function is called after seeing the comment character, so the */
/* function actually eats the line till sees a new line */
/* return -1 if fp is NULL */
int mutilsEatComment(FILE *fp)
{
int
c;
if (fp == NULL)
return(-1);
for(c=getc(fp); ('\n' != c) && (EOF != c ) && (c > 0); c=getc(fp))
;
return(c);
}
/*
** mutilsGgetDirname()
** returns the base directory of file (Unix or Windows)
** if fails returns NULL
** Note: returns pointer to a malloc'd space, caller is responsible to
** free it.
*/
char *mutilsGetDirname(file)
char
*file;
{
char
*f,
*p;
int
len;
if (file == NULL || *file == '\0')
return (NULL);
f=strdup(file);
if (f == NULL)
return(NULL);
if ((p=strrchr(f,'/')) || (p=strrchr(f,'\\')))
{
*p='\0';
if (f)
return(f);
}
else
{
p=strdup("./");
return(p);
}
return (NULL);
}
/**
* @brief Free memory associated with tokens
* @param tokens The tokens to free
* @param ntokens Number of tokens in tokens
*/
void mutilsFreeTokens(char **tokens,int ntokens)
{
int
i;
/* free memory allocated for each token */
for (i=0; i < ntokens; i++)
{
if (tokens[i])
(void) free((char *) tokens[i]);
}
/* free the tokens itself */
if (tokens)
(void) free((char *) tokens);
}
/**
* @brief Tokenizes a string separated by delimiter
* @param str The string to tokenize
* @param delip The delimeter e.g. ' '
* @param ntoken Number of tokens in the string (returns)
* @return tokens on success, NULL on failure
*
* Example:
* int n=0;
* char **tokens=mutils_tokenize("this is"," ",&n);
*
* The caller should free the tokens by calling:
* mutils_free_tokens(tokens,ntokens)
* Note: A token can be of MUTILS_MAX_TOKEN_LEN long
*/
char **mutilsTokenize(char *str,int delim,int *ntokens)
{
char
tbuf[MUTILS_MAX_TOKEN_LEN],
**tokens=NULL;
int
j=0,
count=0,
allocated=0,
i=0;
char
*p;
*ntokens=0;
if (str == NULL || *str == '\0')
return(NULL);
/* count how many token there first */
for (p=str; *p; p++)
{
if (*p == delim)
{
count++;
}
}
count++;
/* allocate memory for tokens */
tokens=(char **) malloc(count * sizeof(char *));
MUTILS_CHECK_MALLOC(tokens);
allocated=0;
for (i=0; i < count; i++)
{
/*
** allocate memory for each token string, a token can
** be of MUTILS_MAX_TOKEN_LEN characters long maximum
*/
tokens[i]=(char *) malloc(MUTILS_MAX_TOKEN_LEN*sizeof(char));
MUTILS_CHECK_MALLOC(tokens[i]);
allocated++;
}
j=0;
count=0;
for (p=str; *p; p++)
{
if (*p != delim && *p != '\0')
{
if (j >= MUTILS_MAX_TOKEN_LEN)
{
(void) fprintf(stderr,"Buffer overflow detected\n");
/* buffer overfow */
goto ExitProcessing;
}
tbuf[j++]=*p;
}
else
{
/* we're in a new token */
tbuf[j++]='\0';
strcpy(tokens[count],tbuf);
count++;
j=0;
}
}
if (j > 0 && j < MUTILS_MAX_TOKEN_LEN)
{
tbuf[j]='\0';
mutilsStrncpy(tokens[count],tbuf,MUTILS_MAX_TOKEN_LEN-1);
}
count++;
*ntokens=count;
return(tokens);
ExitProcessing:
mutilsFreeTokens(tokens,allocated);
return(NULL);
}
#ifdef TEST
int main (int argc,char **argv)
{
int
rc;
rc=mutilsWhich(argv[1]);
(void) fprintf(stderr,"rc=%d\n",rc);
return(0);
}
#endif /* TEST */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -