diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /unix/boot/bootlib/envinit.c | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'unix/boot/bootlib/envinit.c')
-rw-r--r-- | unix/boot/bootlib/envinit.c | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/unix/boot/bootlib/envinit.c b/unix/boot/bootlib/envinit.c new file mode 100644 index 00000000..e70a8d86 --- /dev/null +++ b/unix/boot/bootlib/envinit.c @@ -0,0 +1,269 @@ +/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + */ + +#include <stdio.h> +#include <string.h> +#define import_spp +#define import_xnames +#include <iraf.h> + +#define isspace(c) ((c)==' '||(c)=='\t'||(c)=='\n') +#define SETENV "zzsetenv.def" +#define SZ_VALUE SZ_COMMAND +#define MAXLEV 8 +#define PKGLIBS "pkglibs" +#define IRAFARCH "IRAFARCH" +#define ARCH "arch" + +extern char *_os_getenv (char *envvar, char *outstr, int maxch); +extern char *os_getenv (char *envvar); +extern char *os_strpak (XCHAR *sppstr, char *cstr, int maxch); +extern char *vfn2osfn (char *vfn, int new); +extern XCHAR *os_strupk (char *str, XCHAR *outstr, int maxch); +extern void os_putenv (char *name, char *value); +extern int bdebug; + +void _envinit (void); +void loadenv (char *osfn); + + + +/* LOADPKGENV -- Load the environment definitions for the named package. + * [e.g., loadpkgenv ("noao")]. This assumes that the root directory of + * the named package is already defined, and that this directory contains + * a subdirectory lib containing the file zzsetenv.def. If none of these + * assumptions are true, call loadenv(osfn) with the host filename of the + * file to be loaded. + */ +void +loadpkgenv (char *pkg) +{ + char vfn[SZ_PATHNAME+1]; + char pkglibs[SZ_COMMAND+1]; + char newlibs[SZ_COMMAND+1]; + + /* Initialize the default IRAF environment. */ + _envinit(); + + /* If no package name is given or the IRAF environment is being + * loaded we are done. + */ + if (!pkg || strcmp(pkg,"iraf")==0) + return; + + strcpy (vfn, pkg); + strcat (vfn, "$lib/"); + strcat (vfn, SETENV); + + /* Load the package environment. The new values are added to the + * environment in the conventional way except for the value of + * "pkglibs". As each package environment is loaded we want to + * add the newly defined package libraries to the current list + * of package libraries, otherwise the most recent package environment + * overrides the earlier ones. It is still possible that user + * defined environment variables will be redefined but there is + * little we can do about that; "pkglibs" is special though since + * it is a part of the loadpkgenv facility. + */ + _os_getenv (PKGLIBS, pkglibs, SZ_COMMAND); + loadenv (vfn2osfn (vfn, 0)); + _os_getenv (PKGLIBS, newlibs, SZ_COMMAND); + + if (strlen(newlibs) > 0 && strcmp (newlibs, pkglibs)) { + char *ip, *op; + char *otop; + + /* Find the end of the current pkglibs file list. */ + for (ip=op=pkglibs; *ip; ip++) + if (!isspace(*ip)) + op = ip + 1; + + /* Concatenate the new files list segment. */ + if (op > pkglibs) + *op++ = ','; + for (ip=newlibs, otop=pkglibs+SZ_COMMAND; *ip && op < otop; ip++) + if (!isspace(*ip)) + *op++ = *ip; + + /* Blank fill to the next SZ_LINE increment to optimize resets. */ + while (op < otop && ((op-pkglibs) % SZ_LINE)) + *op++ = ' '; + *op++ = EOS; + + /* Reset the stored value in the environment. */ + os_putenv (PKGLIBS, pkglibs); + } +} + + +#ifdef NOVOS +void _envinit (void) {} +void loadenv (char *osfn) { printf ("HSI is compiled NOVOS\n"); } +#else + +/* ENVINIT -- Initialize the VOS environment list by scanning the file + * hlib$zzsetenv.def. HLIB is defined in terms of HOST which is sufficiently + * well known to have a value before the environment list is loaded. + */ +void +_envinit (void) +{ + static int initialized = 0; + char osfn[SZ_PATHNAME+1], *hlib; + char irafarch[SZ_PATHNAME+1]; + + extern void ENVINIT(), ENVRESET(); + + + if (initialized++) + return; + + if ( (hlib = os_getenv ("hlib")) ) { + strcpy (osfn, hlib); + strcat (osfn, SETENV); + } else { + fprintf (stderr, "cannot translate logical name `hlib'"); + fflush (stderr); + } + + ENVINIT(); + loadenv (osfn); + + /* If the variable "IRAFARCH" is defined and "arch" is not, add + * a definition for the latter. "arch" is used to construct + * pathnames but the HSI architecture support requires only that + * IRAFARCH be predefined. + */ + if (_os_getenv (IRAFARCH, irafarch, SZ_PATHNAME)) + if (!_os_getenv (ARCH, osfn, SZ_PATHNAME)) { + XCHAR x_name[SZ_PATHNAME+1]; + XCHAR x_value[SZ_PATHNAME+1]; + + sprintf (osfn, ".%s", irafarch); + os_strupk (ARCH, x_name, SZ_PATHNAME); + os_strupk (osfn, x_value, SZ_PATHNAME); + ENVRESET (x_name, x_value); + } +} + + +/* LOADENV -- Load environment definitions from the named host file. + */ +void +loadenv (char *osfn) +{ + register char *ip; + register XCHAR *op; + + char lbuf[SZ_LINE+1]; + char pkname[SZ_FNAME+1], old_value[SZ_VALUE+1]; + XCHAR name[SZ_FNAME+1], value[SZ_VALUE+1]; + FILE *fp, *sv_fp[MAXLEV]; + int lev=0; + + extern void ENVRESET(); + + + if ((fp = fopen (osfn, "r")) == NULL) { + printf ("envinit: cannot open `%s'\n", osfn); + fflush (stdout); + return; + } + + for (;;) { + /* Get next line from input file. */ + if (fgets (lbuf, SZ_LINE, fp) == NULL) { + /* End of file. */ + if (lev > 0) { + fclose (fp); + fp = sv_fp[--lev]; + continue; + } else + break; + + } else { + /* Skip comments and blank lines. */ + for (ip=lbuf; isspace(*ip); ip++) + ; + if (strncmp (lbuf, "set", 3) != 0) { + if (strncmp (lbuf, "reset", 5) != 0) + continue; + else + ip += 5; + } else + ip += 3; + + /* Check for @file inclusion. */ + while (isspace(*ip)) + ip++; + + if (*ip == '@') { + sv_fp[lev++] = fp; + if (lev >= MAXLEV) { + printf ("envinit: nesting too deep\n"); + fflush (stdout); + break; + + } else { + char *fname; + fname = ++ip; + + while (*ip) + if (isspace(*ip)) { + *ip = '\0'; + break; + } else + ip++; + + if ((fp = fopen (vfn2osfn(fname,0), "r")) == NULL) { + printf ("envinit: cannot open `%s'\n", fname); + fflush (stdout); + break; + } + } + continue; + } + + /* fall through */ + } + + /* Extract name field. */ + for (op=name; *ip && *ip != '=' && !isspace(*ip); op++) + *op = *ip++; + *op = XEOS; + + /* Extract value field; may be quoted. Newline may be escaped + * to break a long value string over several lines of the input + * file. + */ + for (; *ip && (*ip == '=' || *ip == '"' || isspace (*ip)); ip++) + ; + for (op=value; *ip && *ip != '"' && *ip != '\n'; op++) + if (*ip == '\\' && *(ip+1) == '\n') { +again: if (fgets (lbuf, SZ_LINE, fp) == NULL) + break; + for (ip=lbuf; isspace(*ip); ip++) + ; + if (*ip == '#') + goto again; + } else + *op = *ip++; + *op = XEOS; + + /* Allow the user to override the values of environment variables + * by defining them in their host environment. Once again, + * "pkglibs" requires special treatment as we want to permit + * redefinitions to allow concatenation in loadpkgenv(). + */ + os_strpak (name, pkname, SZ_FNAME); + if (strcmp (pkname, PKGLIBS) && + _os_getenv (pkname, old_value, SZ_VALUE)) { + if (bdebug) + printf ("%s = %s\n", pkname, old_value); + } else + ENVRESET (name, value); + } + + fclose (fp); +} +#endif |