#ifdef vms
# include <types.h>
# include <stat.h>
# include <descrip.h>
#else
# include <sys/types.h>
# include <sys/stat.h>
# include <unistd.h>
#endif
#include <nidl.h>
#include <files.h>
#include <message.h>
char *FILE_def_filespec = NULL;
boolean FILE_open
(
char *filespec,
FILE **fid
)
{
if ((*fid = fopen(filespec, "r")) == NULL)
{
idl_error_list_t errvec[2];
errvec[0].msg_id = NIDL_OPENREAD;
errvec[0].arg1 = filespec;
errvec[1].msg_id = NIDL_SYSERRMSG;
errvec[1].arg1 = strerror(errno);
error_list(2, errvec, TRUE);
}
return TRUE;
}
boolean FILE_create
(
char *filespec,
FILE **fid
)
{
#ifndef VMS
#define MODE_WRITE "w"
#else
#define MODE_WRITE "w","mbc = 16","rop = WBH","mbf = 3"
#endif
if ((*fid = fopen(filespec, MODE_WRITE)) == NULL)
{
idl_error_list_t errvec[2];
errvec[0].msg_id = NIDL_OPENWRITE;
errvec[0].arg1 = filespec;
errvec[1].msg_id = NIDL_SYSERRMSG;
errvec[1].arg1 = strerror(errno);
error_list(2, errvec, TRUE);
}
return TRUE;
}
boolean FILE_lookup
(
char *filespec,
char **idir_list,
struct stat *stat_buf,
char *lookup_spec
)
{
#ifdef HASDIRTREE
int i;
if (stat(filespec, stat_buf) != -1)
{
#ifndef VMS
strcpy(lookup_spec, filespec);
#else
char *cp, *cwd = getcwd((char *)NULL, PATH_MAX);
if (cwd != NULL)
for (cp = cwd; *cp != '\0'; cp++) *cp = tolower(*cp);
if (!FILE_form_filespec(filespec, cwd, (char *)NULL, (char *)NULL,
lookup_spec))
strcpy(lookup_spec, filespec);
if (cwd != NULL) free(cwd);
#endif
return TRUE;
}
if (idir_list == NULL)
return FALSE;
for (i = 0; idir_list[i]; i++)
{
if (FILE_form_filespec(filespec, idir_list[i], (char *)NULL,
(char *)NULL, lookup_spec)
&& stat(lookup_spec, stat_buf) != -1)
return TRUE;
}
#if defined(UNIX) || defined(_MSDOS)
if (*filespec != BRANCHCHAR && FILE_has_dir_info(filespec))
for (i = 0; idir_list[i]; i++)
{
sprintf(lookup_spec, "%s%c%s", idir_list[i], BRANCHCHAR, filespec);
if (stat(lookup_spec, stat_buf) != -1)
return TRUE;
}
#endif
return FALSE;
#else
error(NIDL_FNUNIXONLY, __FILE__, __LINE__);
#endif
}
#ifdef VMS
# include <ctype.h>
#endif
boolean FILE_form_filespec
(
char *in_filespec,
char *dirspec,
char *type,
char *rel_filespec,
char *out_filespec
)
{
char *dir = NULL,
in_dir[PATH_MAX],
in_name[PATH_MAX],
in_type[PATH_MAX],
rel_dir[PATH_MAX],
rel_name[PATH_MAX],
rel_type[PATH_MAX],
*res_dir,
*res_name,
*res_type;
in_dir[0] = '\0';
in_name[0] = '\0';
in_type[0] = '\0';
rel_dir[0] = '\0';
rel_name[0] = '\0';
rel_type[0] = '\0';
res_dir = "";
res_name = "";
res_type = "";
if (in_filespec != NULL && in_filespec[0] != '\0')
{
if (rel_filespec)
FILE_def_filespec = rel_filespec;
else if (type)
FILE_def_filespec = type;
if (!FILE_parse(in_filespec, in_dir, in_name, in_type))
#ifndef VMS
return FALSE;
#else
{
char tmp_filespec[PATH_MAX];
if (dirspec == NULL || strcmp(dirspec, CD_IDIR) == 0)
dir = "";
else if (dirspec != NULL)
{
extern char *getenv(), *shell$translate_vms();
char *logical_val;
logical_val = getenv(dirspec);
if (logical_val == NULL)
{
char upcase_log[PATH_MAX];
strncpy(upcase_log, dirspec, PATH_MAX);
for (logical_val = upcase_log; *logical_val; logical_val++)
if (isalpha(*logical_val))
*logical_val = toupper(*logical_val);
logical_val = getenv(upcase_log);
}
if (logical_val != NULL)
{
dir = shell$translate_vms(logical_val);
}
else
dir = shell$translate_vms(dirspec);
if (dir == (char *)0 || dir == (char *)-1)
return FALSE;
}
strcpy(tmp_filespec, dir);
strcat(tmp_filespec, "/");
strcat(tmp_filespec, in_filespec);
if (!FILE_parse(tmp_filespec, in_dir, in_name, in_type))
return FALSE;
}
#endif
}
if (dir == NULL) dir = dirspec;
if (rel_filespec != NULL && rel_filespec[0] != '\0')
#ifndef VMS
if (!FILE_parse(rel_filespec, rel_dir, rel_name, rel_type))
return FALSE;
#else
if ( (in_filespec != NULL && in_filespec[0] != '\0')
|| (dir != NULL && dir[0] != '\0') )
{
if (type)
FILE_def_filespec = type;
if (!FILE_parse(rel_filespec, rel_dir, rel_name, rel_type))
return FALSE;
}
else
{
int len;
char *cp = strrchr(rel_filespec, '.');
if (cp == NULL)
len = strlen(rel_filespec);
else
len = cp - rel_filespec;
strncpy(rel_name, rel_filespec, len);
rel_name[len] = '\0';
strcpy(rel_type, &rel_filespec[len]);
}
#endif
if (in_dir[0] != '\0')
res_dir = in_dir;
else if (dir != NULL && dir[0] != '\0')
res_dir = dir;
else if (rel_dir[0] != '\0')
res_dir = rel_dir;
if (in_name[0] != '\0')
res_name = in_name;
else if (rel_name[0] != '\0')
res_name = rel_name;
if (in_type[0] != '\0')
res_type = in_type;
else if (type != NULL && type[0] != '\0')
res_type = type;
else if (rel_type[0] != '\0')
res_type = rel_type;
#ifdef HASDIRTREE
out_filespec[0] = '\0';
if (res_dir[0] != '\0')
{
strcat(out_filespec, res_dir);
#ifndef VMS
strcat(out_filespec, BRANCHSTRING);
#else
{
char upcase_dir[PATH_MAX];
char *cp;
strcpy(upcase_dir, res_dir);
for (cp = upcase_dir; *cp; cp++)
if (isalpha(*cp))
*cp = toupper(*cp);
if (getenv(upcase_dir) != NULL) strcat(out_filespec, ":");
}
#endif
}
if (res_name[0] != '\0')
strcat(out_filespec, res_name);
if (res_type[0] != '\0')
strcat(out_filespec, res_type);
return TRUE;
#else
error(NIDL_FNUNIXONLY, __FILE__, __LINE__);
#endif
}
#ifdef VMS
#include <fab.h>
#include <nam.h>
#include <rmsdef.h>
static char vms_filespec[NAM$C_MAXRSS];
static int process_vms_filespec
(
char *filespec,
int flags
)
{
strcpy(vms_filespec, filespec);
return 0;
}
#endif
#ifdef VMS
#define STRNLCPY(dst, src, len) \
for (i = 0; i < (len); i++) (dst)[i] = tolower((src)[i]);
#endif
boolean FILE_parse
(
char *filespec,
char *dir,
char *name,
char *type
)
#ifndef VMS
{
#if defined(HASDIRTREE)
FILE_k_t filekind;
char *pn;
int pn_len,
leaf_len;
int i,
j;
int leaf_start,
ext_start;
int dir_end,
leaf_end;
boolean slash_seen,
dot_seen;
if (dir)
dir[0] = '\0';
if (name)
name[0] = '\0';
if (type)
type[0] = '\0';
if (strchr(filespec, BRANCHCHAR)
&& FILE_kind(filespec, &filekind)
&& filekind == file_dir)
{
strcpy(dir, filespec);
return TRUE;
}
pn = filespec;
pn_len = strlen(pn);
slash_seen = FALSE;
dir_end = -1;
leaf_start = 0;
dot_seen = FALSE;
for (i = pn_len - 1; i >= 0; i--)
if (pn[i] == BRANCHCHAR
#ifdef VMS
|| pn[i] == ':'
#endif
#if BRANCHAR == '\\'
|| pn[i] == '/'
#endif
)
{
leaf_start = i + 1;
#ifdef VMS
dir_end = i + 1;
#else
dir_end = i > 0 ? i : 1;
#endif
slash_seen = TRUE;
break;
}
if (dir)
{
if (slash_seen)
{
strncpy(dir, pn, dir_end);
dir[dir_end] = '\0';
}
else
dir[0] = '\0';
}
ext_start = pn_len;
leaf_end = pn_len;
for (j = pn_len; j > leaf_start; --j)
if (pn[j] == '.')
{
leaf_end = j - 1;
ext_start = j;
dot_seen = TRUE;
break;
}
if (leaf_end >= dir_end + 1)
{
leaf_len = dot_seen ? leaf_end - leaf_start + 1 : leaf_end - leaf_start;
if (name)
{
strncpy(name, &pn[leaf_start], leaf_len);
name[leaf_len] = '\0';
}
if (!dot_seen)
{
if (type)
type[0] = '\0';
return TRUE;
}
else
{
if (type)
strcpy(type, &pn[ext_start]);
}
}
return TRUE;
#else
error(NIDL_FNUNIXONLY, __FILE__, __LINE__);
return FALSE;
#endif
}
#else
{
unsigned int rms_status;
struct FAB fab;
struct NAM nam;
char defspec[NAM$C_MAXRSS];
char outspec[NAM$C_MAXRSS];
int i;
fab = cc$rms_fab;
if (FILE_def_filespec == NULL)
defspec[0] = '\0';
else
strcpy(defspec, FILE_def_filespec);
FILE_def_filespec = NULL;
fab.fab$l_dna = defspec;
fab.fab$b_dns = strlen(defspec);
fab.fab$l_fna = filespec;
fab.fab$b_fns = strlen(filespec);
fab.fab$l_fop = 0;
fab.fab$w_ifi = 0;
fab.fab$l_nam = &nam;
nam = cc$rms_nam;
nam.nam$l_esa = outspec;
nam.nam$b_ess = NAM$C_MAXRSS;
nam.nam$b_nop = NAM$M_SYNCHK;
nam.nam$l_rlf = 0;
rms_status = SYS$PARSE(&fab, 0, 0);
if (rms_status != RMS$_NORMAL)
{
if (shell$to_vms(filespec, process_vms_filespec, 1) != 1)
{
char inspec[NAM$C_MAXRSS];
inspec[0] = '/';
strcpy(&inspec[1], filespec);
if (shell$to_vms(inspec, process_vms_filespec, 1) != 1)
return FALSE;
}
fab.fab$l_fna = vms_filespec;
fab.fab$b_fns = strlen(vms_filespec);
rms_status = SYS$PARSE(&fab, 0, 0);
if (rms_status != RMS$_NORMAL)
return FALSE;
}
if (dir != NULL)
{
if (nam.nam$l_fnb & (NAM$M_NODE | NAM$M_EXP_DEV | NAM$M_EXP_DIR))
{
nam.nam$b_nop = 0;
rms_status = SYS$PARSE(&fab, 0, 0);
rms_status = SYS$SEARCH(&fab, 0, 0);
if (rms_status != RMS$_NORMAL)
{
nam.nam$b_nop = NAM$M_SYNCHK;
SYS$PARSE(&fab, 0, 0);
}
STRNLCPY(dir, nam.nam$l_node, nam.nam$b_node);
STRNLCPY(&dir[nam.nam$b_node], nam.nam$l_dev, nam.nam$b_dev);
STRNLCPY(&dir[nam.nam$b_node + nam.nam$b_dev],
nam.nam$l_dir, nam.nam$b_dir);
dir[nam.nam$b_node + nam.nam$b_dev + nam.nam$b_dir] = '\0';
}
else
dir[0] = '\0';
}
if (name != NULL)
{
if (nam.nam$l_fnb & NAM$M_EXP_NAME)
{
STRNLCPY(name, nam.nam$l_name, nam.nam$b_name);
name[nam.nam$b_name] = '\0';
}
else
name[0] = '\0';
}
if (type != NULL)
{
if (nam.nam$l_fnb & (NAM$M_EXP_TYPE | NAM$M_EXP_VER))
{
STRNLCPY(type, nam.nam$l_type, nam.nam$b_type);
if (nam.nam$l_fnb & NAM$M_EXP_VER)
{
STRNLCPY(&type[nam.nam$b_type], nam.nam$l_ver, nam.nam$b_ver);
type[nam.nam$b_type + nam.nam$b_ver] = '\0';
}
else
type[nam.nam$b_type] = '\0';
}
else
type[0] = '\0';
}
return TRUE;
}
#endif
boolean FILE_has_dir_info
(
char *filespec
)
{
char dir[PATH_MAX];
if (!FILE_parse(filespec, dir, (char *)NULL, (char *)NULL))
return FALSE;
return (dir[0] != '\0');
}
boolean FILE_is_cwd
(
char *filespec
)
{
char *cwd;
char *twd;
boolean result;
if (filespec[0] == '\0')
return TRUE;
cwd = getcwd((char *)NULL, PATH_MAX);
if (cwd == NULL)
return FALSE;
if (chdir(filespec) != 0)
{
free(cwd);
return FALSE;
}
twd = getcwd((char *)NULL, PATH_MAX);
if (twd == NULL)
{
free(cwd);
return FALSE;
}
if (strcmp(cwd, twd) == 0)
result = TRUE;
else
{
result = FALSE;
chdir(cwd);
}
free(cwd);
free(twd);
return result;
}
boolean FILE_kind
(
char *filespec,
FILE_k_t *filekind
)
{
struct stat fileinfo;
if (stat(filespec, &fileinfo) == -1)
return FALSE;
switch (fileinfo.st_mode & S_IFMT)
{
case S_IFDIR:
*filekind = file_dir;
break;
case S_IFREG:
*filekind = file_file;
break;
default:
*filekind = file_special;
}
return TRUE;
}
boolean FILE_contains_ev_ref
(
STRTAB_str_t fs_id
)
{
char *pn;
int i;
STRTAB_str_to_string(fs_id, &pn);
for (i = 0; i < strlen(pn) - 1; i++)
if (pn[i] == '$' && pn[i + 1] == '(')
return TRUE;
return FALSE;
}
int FILE_execute_cmd
(
char *cmd_string,
char *p1,
char *p2,
long msg_id
)
{
char *cmd;
int status;
cmd = (char *)MALLOC(strlen(cmd_string) + strlen(p1) + strlen(p2) + 3);
cmd[0] = '\0';
strcat(cmd,cmd_string);
strcat(cmd," ");
strcat(cmd,p1);
strcat(cmd," ");
strcat(cmd,p2);
if (msg_id != 0)
message_print(msg_id, (char*)cmd);
#ifdef VMS
{
$DESCRIPTOR(vcmd, cmd);
vcmd.dsc$w_length = strlen(cmd);
status = LIB$SPAWN(&vcmd);
if ((status & 1) != 1) {
if (msg_id == 0) {
idl_error_list_t errvec[2];
errvec[0].msg_id = NIDL_STUBCOMPILE;
errvec[0].arg1 = cmd;
errvec[1].msg_id = NIDL_SYSERRMSG;
errvec[1].arg1 = strerror(EVMSERR,status);
error_list(2, errvec, TRUE);
}
else
message_print(NIDL_SYSERRMSG,strerror(EVMSERR,status));
}
}
#else
status = system(cmd);
#endif
FREE(cmd);
return status;
}
void FILE_delete
(
char *filename
)
{
#ifdef VMS
remove (filename);
#else
unlink (filename);
#endif
}