📄 util.c
字号:
/*
========================================================================
DEVise Data Visualization Software
(c) Copyright 1992-1996
By the DEVise Development Group
Madison, Wisconsin
All Rights Reserved.
========================================================================
Under no circumstances is this software to be copied, distributed,
or altered in any way without prior permission from the DEVise
Development Group.
*/
/*
$Id: Util.c,v 1.20 1996/12/03 20:24:22 jussi Exp $
$Log: Util.c,v $
Revision 1.20 1996/12/03 20:24:22 jussi
Added readn() and writen().
Revision 1.19 1996/12/02 18:44:35 wenger
Fixed problems dealing with DST in dates (including all date composite
parsers); added more error checking to date composite parsers.
Revision 1.18 1996/11/19 15:23:28 wenger
Minor changes to fix compiles on HP, etc.
Revision 1.17 1996/11/05 18:23:11 wenger
Minor mods to get things to compile on SGI systems.
Revision 1.16 1996/10/18 20:34:08 wenger
Transforms and clip masks now work for PostScript output; changed
WindowRep::Text() member functions to ScaledText() to make things
more clear; added WindowRep::SetDaliServer() member functions to make
Dali stuff more compatible with client/server library.
Revision 1.15 1996/10/09 14:33:45 wenger
Had to make changes to get my new code to compile on HP and Sun.
Revision 1.14 1996/10/07 22:53:50 wenger
Added more error checking and better error messages in response to
some of the problems uncovered by CS 737 students.
Revision 1.13 1996/08/23 16:55:44 wenger
First version that allows the use of Dali to display images (more work
needs to be done on this); changed DevStatus to a class to make it work
better; various minor bug fixes.
Revision 1.12 1996/07/14 20:04:47 jussi
Made code to compile in OSF/1.
Revision 1.11 1996/07/05 14:39:47 jussi
Fixed minor problem with null-termination in DateString().
Revision 1.10 1996/05/20 18:44:42 jussi
Replaced PENTIUM flag with SOLARIS.
Revision 1.9 1996/03/27 17:54:56 wenger
Changes to get DEVise to compile and run on Linux.
Revision 1.8 1996/02/13 16:20:16 jussi
Fixed for AIX.
Revision 1.7 1996/01/10 19:11:17 jussi
Added error checking to CopyString.
Revision 1.6 1995/12/28 18:48:14 jussi
Small fixes to remove compiler warnings.
Revision 1.5 1995/12/14 17:12:38 jussi
Small fixes.
Revision 1.4 1995/10/18 14:55:32 jussi
Changed mask of created directory to 0777 from 0755.
Revision 1.3 1995/10/15 18:36:40 jussi
Added HPUX-specific code.
Revision 1.2 1995/09/05 21:13:13 jussi
Added/updated CVS header.
*/
#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>
#if defined (SGI)
#define STAT_BAVAIL f_bfree
#else
#define STAT_BAVAIL f_bavail
#endif
#if defined(SOLARIS)
#include <sys/statvfs.h>
#define STAT_STRUCT statvfs
#define STAT_FUNC statvfs
#define STAT_FRSIZE f_frsize
#elif defined(AIX)
#define _KERNEL
#define _VOPS
#include <sys/vfs.h>
#include <sys/statfs.h>
#define STAT_STRUCT statfs
#define STAT_FUNC VFS_STATFS
#define STAT_FRSIZE f_bsize
#else
#include <sys/vfs.h>
#define STAT_STRUCT statfs
#define STAT_FUNC statfs
#define STAT_FRSIZE f_bsize
#if defined(SUN)
extern "C" int statfs(const char *, struct statfs *);
#else
#if defined(SGI)
#include <sys/statfs.h>
#endif
#endif
#endif
#if defined(SOLARIS) || defined(HPUX) || defined(AIX)
#include <dirent.h>
#else
#include <sys/dir.h>
#endif
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include "Util.h"
#include "Exit.h"
#include "DevError.h"
long ModTime(char *fname)
{
struct stat sbuf;
if (stat(fname, &sbuf) < 0) {
fprintf(stderr, "Cannot get modtime of %s\n", fname);
Exit::DoExit(2);
}
return (long)sbuf.st_mtime;
}
DevStatus
ReadFile(char *filename, int &size, char *&buffer)
{
DevStatus result = StatusOk;
struct stat sbuf;
if (stat(filename, &sbuf) < 0)
{
reportError("Can't get size of file", errno);
result = StatusFailed;
}
else
{
size = sbuf.st_size;
buffer = new char[size];
if (buffer == NULL)
{
reportError("Out of memory", errno);
result = StatusFailed;
}
else
{
int fd = open(filename, O_RDONLY);
if (fd < 0)
{
reportError("Can't open file", errno);
result = StatusFailed;
}
else
{
if (read(fd, buffer, size) != size)
{
reportError("Error reading file", errno);
result = StatusFailed;
}
if (close(fd) < 0)
{
reportError("Error closing file", errno);
result = StatusWarn;
}
}
if (!result.IsComplete()) delete [] buffer;
}
}
return result;
}
char *CopyString(char *str)
{
if (str == NULL) return str;
char *result = new char[strlen(str) + 1];
if (!result) {
fprintf(stderr, "Insufficient memory for new string\n");
Exit::DoExit(2);
}
strcpy(result, str);
return result;
}
static char dateBuf[21];
char *DateString(time_t tm)
{
#if 0
if (tm < 0) {
char errBuf[1024];
sprintf(errBuf, "Illegal time value %ld\n", tm);
reportErrNosys(errBuf);
}
#endif
char *dateStr = ctime(&tm);
int i;
for(i = 0; i < 7; i++)
dateBuf[i] = dateStr[i + 4];
for(i = 7; i < 11; i++)
dateBuf[i] = dateStr[i + 13];
dateBuf[11] = ' ';
for(i = 12; i < 20; i++)
dateBuf[i] = dateStr[i - 1];
dateBuf[20] = '\0';
return dateBuf;
}
void ClearDir(char *dir)
{
/* clear directory */
DIR *dirp = opendir(dir);
if (dirp != NULL){
#if defined(SOLARIS) || defined(HPUX) || defined(AIX) || defined(LINUX) \
|| defined(OSF)
struct dirent *dp;
#else
struct direct *dp;
#endif
for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)){
#if defined(SOLARIS) || defined(HPUX) || defined(AIX) || defined(LINUX) \
|| defined(OSF)
struct dirent *realdp = (struct dirent *)dp;
#else
struct direct *realdp = dp;
#endif
if (strcmp(realdp->d_name,".") != 0 &&
strcmp(realdp->d_name,"..") != 0 ){
char buf[512];
sprintf(buf,"%s/%s",dir,realdp->d_name);
/*
printf("unlinking %s\n", buf);
*/
unlink(buf);
}
}
closedir(dirp);
}
}
/* Check if directory exists. Make directory if not already exists
Clear directory if clear == true*/
void CheckAndMakeDirectory(char *dir, int clear )
{
struct stat sbuf;
int ret = stat(dir,&sbuf);
if (ret >= 0 ) {
if (!(sbuf.st_mode & S_IFDIR)){
fprintf(stderr,"Init:: %s not a directory\n", dir);
Exit::DoExit(1);
}
if (clear){
ClearDir(dir);
}
} else {
/* make new directory */
int code = mkdir(dir,0777);
if (code < 0 ){
printf("Init::can't make directory %s\n",dir);
perror("");
Exit::DoExit(1);
}
}
}
/* Check whether we have enough space in a given directory. */
void CheckDirSpace(char *dirname, char *envVar, int warnSize, int exitSize)
{
struct STAT_STRUCT stats;
if (STAT_FUNC(dirname, &stats
#if defined(SGI)
, sizeof(stats), 0
#endif
) != 0)
{
reportErrSys("Can't get status of file system");
}
else
{
int bytesFree = stats.STAT_BAVAIL * stats.STAT_FRSIZE;
if (bytesFree < exitSize)
{
char errBuf[1024];
sprintf(errBuf, "%s directory (%s) has less than %d bytes free\n",
envVar, dirname, exitSize);
Exit::DoAbort(errBuf, __FILE__, __LINE__);
}
else if (bytesFree < warnSize)
{
fprintf(stderr,
"Warning: %s directory (%s) has less than %d bytes free\n",
envVar, dirname, warnSize);
}
}
return;
}
//
// Read specified number of bytes. Recover from interrupted system calls.
//
int readn(int fd, char *buf, int nbytes)
{
int nleft = nbytes;
while (nleft > 0) {
int nread = read(fd, buf, nleft);
if (nread < 0) {
if (errno == EINTR)
continue;
perror("read");
return nread;
}
if (nread == 0) // EOF?
break;
nleft -= nread;
buf += nread;
}
return nbytes - nleft;
}
//
// Write specified number of bytes. Recover from interrupted system calls.
//
int writen(int fd, char *buf, int nbytes)
{
int nleft = nbytes;
while (nleft > 0) {
int nwritten = write(fd, buf, nleft);
if (nwritten < 0) {
if (errno == EINTR)
continue;
return nwritten;
}
nleft -= nwritten;
buf += nwritten;
}
return nbytes - nleft;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -