/* * vms_misc.c -- sustitute code for missing/different run-time library routines. */ /* * Copyright (C) 1991 the Free Software Foundation, Inc. * * This file is part of GAWK, the GNU implementation of the * AWK Progamming Language. * * GAWK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GAWK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GAWK; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "awk.h" /* really "../awk.h" */ #include #include /* * VMS uses a completely different status scheme (odd => success, * even => failure), so we'll trap calls to exit() and alter the * exit status code. [VAXC can't handle this as a macro.] */ #ifdef exit # undef exit #endif void vms_exit( int errno ) /* note: local override of global 'errno' */ { exit(errno == 0 ? SS$_NORMAL : (SS$_ABORT | STS$M_INHIB_MSG)); } #define exit(v) vms_exit(v) /* * In VMS's VAXCRTL, strerror() takes an optional second argument. * #define strerror(errnum) strerror(errnum,vaxc$errno) * is all that's needed, but VAXC can't handle that (gcc can). * [The 2nd arg is used iff errnum == EVMSERR.] */ #ifdef strerror # undef strerror #endif /* vms_strerror() -- convert numeric error code into text string */ char * vms_strerror( int errnum ) { extern char *strerror( /* int, ... */ ); return ( errnum != EVMSERR ? strerror(errnum) : strerror(EVMSERR, vaxc$errno) ); } # define strerror(v) vms_strerror(v) /* * Miscellaneous utility routine, not part of the run-time library. */ /* vms_strdup() - allocate some new memory and copy a string into it */ char * vms_strdup( const char *str ) { char *result; int len = strlen(str); emalloc(result, char *, len+1, "strdup"); return strcpy(result, str); } /* * VAXCRTL does not contain unlink(). This replacement has limited * functionality which is sufficient for GAWK's needs. It works as * desired even when we have the file open. */ /* unlink(file) -- delete a file (ignore soft links) */ int unlink( const char *file_spec ) { char tmp[255+1]; /*(should use alloca(len+2+1)) */ extern int delete(const char *); strcpy(tmp, file_spec); /* copy file name */ if (strchr(tmp, ';') == NULL) strcat(tmp, ";0"); /* append version number */ return delete(tmp); } /* * Check for attempt to (re-)open known file. */ /* vms_devopen() - check for "SYS$INPUT" or "SYS$OUTPUT" or "SYS$ERROR" */ int vms_devopen( const char *name ) { FILE *file = NULL; if (strncasecmp(name, "SYS$", 4) == 0) { name += 4; /* skip "SYS$" */ if (strncasecmp(name, "INPUT", 5) == 0) file = stdin, name += 5; else if (strncasecmp(name, "OUTPUT", 6) == 0) file = stdout, name += 6; else if (strncasecmp(name, "ERROR", 5) == 0) file = stderr, name += 5; if (*name == ':') name++; /* treat trailing colon as optional */ } /* note: VAXCRTL stdio has extra level of indirection (*file) */ return (file && *file && *name == '\0') ? fileno(file) : -1; } /* * VMS has no timezone support. */ /* these are global for use by missing/strftime.c */ char *tzname[2] = { "local", "" }; int daylight = 0; /* dummy to satisfy linker */ void tzset() { return; } #ifndef __GNUC__ # ifdef bcopy # undef bcopy # endif void bcopy( char *src, char *dst, int len ) { (void) OTS$MOVE3(len, src, dst); } #endif /*!__GNUC__*/ /*----------------------------------------------------------------------*/ #ifdef NO_VMS_ARGS /* real code is in "vms/vms_args.c" */ void vms_arg_fixup( int *argc, char ***argv ) { return; } /* dummy */ #endif #ifdef NO_VMS_PIPES /* real code is in "vms/vms_popen.c" */ FILE *popen( const char *command, const char *mode ) { fatal(" Cannot open pipe `%s' (not implemented)", command); return NULL; } int pclose( FILE *current ) { fatal(" Cannot close pipe #%d (not implemented)", fileno(current)); return -1; } int fork( void ) { fatal(" Cannot fork process (not implemented)"); return -1; } #endif /*NO_VMS_PIPES*/