From 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 Mon Sep 17 00:00:00 2001 From: Joe Hunkeler Date: Tue, 11 Aug 2015 16:51:37 -0400 Subject: Repatch (from linux) of OSX IRAF --- unix/boot/bootlib/vfn2osfn.c | 147 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 unix/boot/bootlib/vfn2osfn.c (limited to 'unix/boot/bootlib/vfn2osfn.c') diff --git a/unix/boot/bootlib/vfn2osfn.c b/unix/boot/bootlib/vfn2osfn.c new file mode 100644 index 00000000..c93d2090 --- /dev/null +++ b/unix/boot/bootlib/vfn2osfn.c @@ -0,0 +1,147 @@ +/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + */ + +#include +#include +#define NOLIBCNAMES +#define import_spp +#define import_libc +#define import_xnames +#define import_knames +#include + +#define FINIT +#include "bootlib.h" + +static PKCHAR pk_osfn[SZ_PATHNAME+1]; +static char *osfn = (char *)pk_osfn; +extern char *os_getenv(); + + +#ifdef NOVOS + +/* VFN2OSFN -- Map an IRAF virtual filename into an OS filename. This is + * a simplified version for UNIX which does not use the VOS. This version + * should also be almost sufficient to compile the system libraries when + * starting from scratch on a new machine, since the filenames in the system + * directories are simple and the full generality of the FIO filename mapping + * code is not required (extension mapping is about all that is required). + * Only the well-known system logical directories are recognized in this + * version, however ZGTENV is called to replace logical directories, and + * this in turn references the host system environment, so one can bootstrap + * things by using the host environment facilities. + */ +char * +vfn2osfn ( + char *vfn, /* input IRAF virtual filename */ + int new /* new file */ +) +{ + register char *ip, *op; + char fname[SZ_PATHNAME+1], *ldir; + + /* Recursively expand logical directories, but don't do anything + * about subdirectories, extensions, etc. This is all that is + * needed for UNIX. + */ + for (ip=vfn, op=fname; (*op = *ip++); op++) + if (*op == '$') { + *op = EOS; + if ( (ldir = os_getenv (fname)) ) + strcpy (fname, ldir); + strcat (fname, ip); + return (vfn2osfn (fname, 0)); + } + + /* Copy filename to the output string. Fix up the "//" sequences + * that occur because IRAF likes the / at the end of logical directory + * names. + */ + for (ip=fname, op=osfn; (*op = *ip++); op++) + if (*op == '/' && op > osfn && *(op-1) == '/') + --op; + + return (osfn); +} + + +#else + +/* VFN2OSFN -- Map an IRAF virtual filename into an OS filename. This is + * the portable version using the VOS (libsys.a+libvops.a+libos.a) to do the + * mapping. The system libraries must have been built before we can do this, + * of course. + */ +char * +vfn2osfn ( + char *vfn, /* input IRAF virtual filename */ + int new /* new file */ +) +{ + register char *ip; + register XCHAR *op; + register int n = SZ_PATHNAME; + XINT vp, mode, maxch = SZ_PATHNAME; + PKCHAR upkvfn[SZ_PATHNAME+1]; + int err; + + extern void _envinit(); + + + + /* Copy the input filename into local storage before calling envinit, + * below, to avoid any chance of overwriting the input string in a + * recursive call to vfn2osfn by envinit. + */ + for (ip=vfn, op=upkvfn; --n >= 0 && (*op++ = *ip++) != (XCHAR)EOS; ) + ; + *(op-1) = XEOS; + mode = new ? VFN_WRITE : VFN_READ; + + /* Nasty beast that can call vsn2osfn recursively. */ + _envinit(); + + err = 0; + iferr (vp = VFNOPEN (upkvfn, (integer *)&mode)) { + fprintf (stderr, "Warning: cannot open vfn `%s' for %s\n", + vfn, mode == VFN_WRITE ? "writing" : "reading"); + err++; + } + + if (new) { + if (!err) + iferr (VFNADD ((integer *)&vp, pk_osfn, (integer *)&maxch)) + fprintf (stderr, "Warning: cannot add filename `%s'\n",vfn); + } else { + if (!err) + iferr (VFNMAP ((integer *)&vp, pk_osfn, (integer *)&maxch)) + fprintf (stderr, "Warning: cannot map filename `%s'\n",vfn); + } + + mode = (mode == VFN_WRITE) ? VFN_UPDATE : VFN_NOUPDATE; + if (!err) { + iferr (VFNCLOSE ((integer *)&vp, (integer *)&mode)) + fprintf (stderr, "Warning: error closing mapping file\n"); + } else + *osfn = EOS; + + return (osfn); +} + + +/* + * KISTUB -- Stub out selected KI (kernel network interface) routines. This + * is done when VOS filename mapping is in use to avoid linking in a lot of + * objects that will never be used, since the HSI does not use networking. + */ +int KI_GETHOSTS() { return (0); } +void KI_SEND(){} +void KI_RECEIVE(){} +#endif + +#ifdef SUNOS +/* Stub out the following too, since there is no floating point in the HSI. */ +ieee_flags(){} +ieee_handler(){} +abrupt_underflow_(){} +#endif -- cgit