#include <string.h>
#include <file.h>
#include <rmsdef.h>
#include <fab.h>
#include <nam.h>
#include <stdlib.h>
#include <lib$routines.h>
#include <descrip.h>
#include "filutils.h"
char *
file_name_as_directory (out, in)
char *out, *in;
{
int size = strlen (in) - 1;
int ext_point = 0;
strcpy (out, in);
if (in[size] == ':' || in[size] == ']' || in[size] == '>')
return out;
else
if (! strchr (in, '/'))
{
ext_point = 1;
if (size > 3 && (! strcmp (&in[size - 3], ".DIR")
|| ! strcmp (&in[size - 3], ".dir")))
ext_point = -3;
else
if (size > 5 && (! strncmp (&in[size - 5], ".DIR", 4)
|| ! strncmp (&in[size - 5], ".dir", 4))
&& (in[size - 1] == '.' || in[size - 1] == ';')
&& in[size] == '1')
ext_point = -5;
}
if (ext_point != 0)
{
register char *p, *dot;
char brack;
static char tem[256];
p = dot = strchr(in,':');
if (p != 0 && (p[1] == '[' || p[1] == '<'))
{
p += 2;
if (strncmp(p,"000000",6) == 0)
{
p += 6;
if (strncmp(p,".000000",7) != 0
&& (*p == ']' || *p == '>' || *p == '.'))
{
size = dot - in + 1;
strncpy(tem, in, size);
if (*p == '.')
tem[size++] = '[';
strcpy(tem + size, p + 1);
in = tem;
size = strlen(in) - 1;
}
}
}
p = in + size;
while (p != in && *p != ':' && *p != '>' && *p != ']') p--;
{
char *emergency_dir = 0;
int emergency_point = 0;
if (p != in)
{
strncpy (out, in, p - in);
out[p - in] = '\0';
if (*p == ':')
{
brack = ']';
strcat (out, ":[");
emergency_dir = "000000";
emergency_point = 0;
}
else
{
brack = *p;
strcat (out, ".");
emergency_dir = "";
emergency_point = -1;
}
p++;
}
else
{
brack = ']';
strcpy (out, "[.");
emergency_dir = "";
emergency_point = -2;
}
if (strncmp (p, "000000.", 7) == 0
&& (strncmp (p+7, "000000", 6) != 0
|| (p[13] != ']' && p[13] != '>' && p[13] != '.')))
p += 7;
if (p < (in + size + ext_point))
{
register copy_len = ((in + size + ext_point) - p);
size = strlen (out) + copy_len;
strncat (out, p, copy_len);
}
else
{
size = strlen (out) + emergency_point;
strcpy (out + size, emergency_dir);
size += strlen (emergency_dir);
}
}
out[size++] = brack;
out[size] = '\0';
}
return out;
}
#include <stdio.h>
directory_file_name (src, dst)
char *src, *dst;
{
long slen;
long rlen;
char * ptr, * rptr;
char bracket;
struct FAB fab = cc$rms_fab;
struct NAM nam = cc$rms_nam;
char esa[NAM$C_MAXRSS];
slen = strlen (src);
if (! strchr (src, '/')
&& (src[slen - 1] == ']'
|| src[slen - 1] == ':'
|| src[slen - 1] == '>'))
{
fab.fab$l_fna = src;
fab.fab$b_fns = slen;
fab.fab$l_nam = &nam;
fab.fab$l_fop = FAB$M_NAM;
nam.nam$l_esa = esa;
nam.nam$b_ess = sizeof esa;
nam.nam$b_nop |= NAM$M_SYNCHK;
if (SYS$PARSE(&fab, 0, 0) == RMS$_NORMAL)
{
slen = nam.nam$b_esl;
if (esa[slen - 1] == ';' && esa[slen - 2] == '.')
slen -= 2;
esa[slen] = '\0';
src = esa;
}
if (src[slen - 1] != ']' && src[slen - 1] != '>')
{
if (src[slen - 1] == ':')
{
ptr = strcpy (dst, src);
while (*ptr)
{
if ('a' <= *ptr && *ptr <= 'z')
*ptr -= 040;
ptr++;
}
dst[slen - 1] = 0;
if (!(src = getenv (dst)))
return 0;
slen = strlen (src);
if (src[slen - 1] != ']' && src[slen - 1] != '>')
{
strcpy (dst, src);
return 0;
}
}
else
{
strcpy (dst, src);
return 0;
}
}
bracket = src[slen - 1];
ptr = strchr (src, bracket - 2);
if (ptr == 0)
{
strcpy (dst, src);
return 0;
}
if (!(rptr = strrchr (src, '.')))
rptr = ptr;
slen = rptr - src;
strncpy (dst, src, slen);
dst[slen] = '\0';
#if 0
fprintf (stderr, "dst = \"%s\"\nsrc = \"%s\"\nslen = %d\n",
dst, src, slen);
#endif
if (*rptr == '.')
{
dst[slen++] = bracket;
dst[slen] = '\0';
}
else
{
if (dst[slen - 1] == ':'
&& dst[slen - 2] != ':'
&& ((src[slen] == '['
&& strcmp(src + slen + 1, "000000]") == 0)
|| src[slen] == '<'
&& strcmp(src + slen + 1, "000000>") == 0))
{
static char equiv_buf[256];
static struct dsc$descriptor_s equiv
= {sizeof (equiv_buf), DSC$K_DTYPE_T, DSC$K_CLASS_S, equiv_buf};
static struct dsc$descriptor_s d_name
= {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};
short eqlen;
dst[slen - 1] = '\0';
d_name.dsc$w_length = strlen (dst);
d_name.dsc$a_pointer = dst;
if (LIB$SYS_TRNLOG (&d_name, &eqlen, &equiv) == 1
&& (equiv_buf[eqlen] = '\0', ptr = equiv_buf) != 0
&& (rlen = strlen (ptr) - 1) > 0
&& (ptr[rlen] == ']' || ptr[rlen] == '>')
&& ptr[rlen - 1] == '.')
{
char * buf = (char *) malloc (strlen (ptr) + 1);
int tmp = ptr[rlen];
if (buf == 0)
return 0;
strcpy (buf, ptr);
buf[rlen - 1] = tmp;
buf[rlen] = '\0';
tmp = directory_file_name (buf, dst);
free (buf);
return tmp;
}
else
dst[slen - 1] = ':';
}
strcat (dst, "[000000]");
slen += 8;
}
rptr++;
rlen = strlen (rptr) - 1;
strncat (dst, rptr, rlen);
dst[slen + rlen] = '\0';
strcat (dst, ".DIR.1");
return 1;
}
strcpy (dst, src);
if (slen > 1 && dst[slen - 1] == '/')
{
dst[slen - 1] = 0;
return 1;
}
return 0;
}