aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/bootlib/osfn2vfn.c
blob: c16ccf033e32193bac120fbdc7120d5faaed8bc0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
 */

#include <stdio.h>
#include <string.h>
#define	NOLIBCNAMES
#define	import_spp
#define	import_libc
#define	import_xnames
#define	import_knames
#include <iraf.h>
#include "bootlib.h"


static	char	vfn[SZ_PATHNAME+1];

#ifdef NOVOS

/* OSFN2VFN -- Convert a local-directory OS filename into a virtual filename.
 * On UNIX this is a no-op since escape sequence encoding is not needed and
 * the IRAF file extensions are the same as UNIX.
 */
char *
osfn2vfn (
  char	*osfn 			/* input OS filename	*/
)
{
	strcpy (vfn, osfn);		/* [MACHDEP */
	return (vfn);
}

#else

/* OSFN2VFN -- Convert a local-directory OS filename into a virtual filename.
 * Undo the escape sequence encoding and map the OS filename extension into
 * the IRAF one.  No attempt is made to map OS directory names into IRAF
 * logical directory names; this is a local directory operation only.
 */
char *osfn2vfn (osfn)
char	*osfn;			/* input OS filename	*/
{
	XCHAR	x_osfn[SZ_PATHNAME+1];
	XCHAR	x_vfn[SZ_PATHNAME+1];
	XINT	x_maxch = SZ_PATHNAME;
	XINT	x_mode, vp, nchars;

	extern  void _envinit();


	_envinit();
	
	os_strupk ("./", x_vfn, SZ_PATHNAME);
	x_mode = VFN_UNMAP;
	iferr (vp = VFNOPEN (x_vfn, (integer *)&x_mode)) {
	    vp = 0;
	    goto err_;
	}

	strcpy ((char *)x_osfn, osfn);
	iferr (nchars = VFNUNMAP ((integer *)&vp, x_osfn, x_vfn, 
	    (integer *)&x_maxch))
	        goto err_;
	if (nchars < 0)
	    goto err_;

	x_mode = VFN_NOUPDATE;
	VFNCLOSE ((integer *)&vp, (integer *)&x_mode);

	os_strpak (x_vfn, vfn, SZ_PATHNAME);
	return (vfn);

err_:
	fprintf (stderr, "cannot unmap filename `%s'\n", osfn);
	if (vp > 0)
	    VFNCLOSE ((integer *)&vp, (integer *)&x_mode);

	strcpy (vfn, osfn);
	return (vfn);
}

#endif