⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vms.c

📁 infozip2.2源码
💻 C
字号:
/************************************************************************* *                                                                       * * VMS portions copyright (C) 1993 Igor Mandrichenko.                    * * Permission is granted to any individual or institution to use, copy,  * * or redistribute this software so long as all of the original files    * * are included, that it is not sold for profit, and that this copyright * * notice is retained.                                                   * *                                                                       * *************************************************************************//* *  vms.c (zip) by Igor Mandrichenko    Version 2.2-2 * *  Revision history: *  ... *  2.2-2       18-jan-1993     I.Mandrichenko *      vms_stat() added - version of stat() that handles special *      case when end-of-file-block == 0 */#ifdef VMS                      /* For VMS only ! */#include "zip.h"#ifndef __STARLET_LOADED#include <starlet.h>#endif#if !defined(_RMS_H) && !defined(__RMS_LOADED)#include <rms.h>#endif#ifndef UTIL/* Include the `VMS attributes' preserving file-io code. We distinguish   between two incompatible flavours of storing VMS attributes in the   Zip archive:   a) The "PKware" style follows the extra field specification for      PKware's VMS Zip.   b) The "IM (Info-ZIP)" flavour was defined from scratch by      Igor Mandrichenko. This version has be used in official Info-ZIP      releases for several years and is known to work well. */#if defined(VMS_PK_EXTRA)#include "vms_pk.c"#else#include "vms_im.c"#endif#endif /* !UTIL */#ifndef ERR#define ERR(x) (((x)&1)==0)#endif#ifndef NULL#define NULL (void*)(0L)#endifint vms_stat(file,s)char *file;stat_t *s;{    int status;    int staterr;    struct FAB fab;    struct XABFHC fhc;    /*     *  In simplest case when stat() returns "ok" and file size is     *  nonzero or this is directory, finish with this     */    if( (staterr=stat(file,s)) == 0        && ( (int)(s->st_size) >= 0               /* Size - ok */             || (s->st_mode & S_IFREG) == 0       /* Not a plain file */           )    ) return staterr;    /*     *  Get here to handle the special case when stat() returns     *  invalid file size. Use RMS to compute the size.     *  When EOF block is zero, set file size to its physical size.     *  One more case to get here is when this is remote file accessed     *  via DECnet.     */    fab = cc$rms_fab;    fhc = cc$rms_xabfhc;    fab.fab$l_fna = file;    fab.fab$b_fns = strlen(file);    fab.fab$l_xab = (char*)(&fhc);    fab.fab$b_fac = FAB$M_GET;    status = sys$open(&fab);    fab.fab$l_xab = (char*)0L;    sys$close(&fab);    if( !ERR(status) )    {        if( fhc.xab$l_ebk > 0 )            s->st_size = ( fhc.xab$l_ebk-1 ) * 512 + fhc.xab$w_ffb;        else if( fab.fab$b_org == FAB$C_IDX                 || fab.fab$b_org == FAB$C_REL                 || fab.fab$b_org == FAB$C_HSH )                /* Special case, when ebk=0: save entire allocated space */                    s->st_size = fhc.xab$l_hbk * 512;        else            s->st_size = fhc.xab$w_ffb;        return 0; /* stat() success code */    }    else        return status;}void vms_exit(e)   int e;{/*---------------------------------------------------------------------------    Return an intelligent status/severity level if RETURN_SEVERITY defined:    $STATUS          $SEVERITY = $STATUS & 7    31 .. 16 15 .. 3   2 1 0                       -----    VMS                0 0 0  0    Warning    FACILITY           0 0 1  1    Success    Number             0 1 0  2    Error             MESSAGE   0 1 1  3    Information             Number    1 0 0  4    Severe (fatal) error    0x7FFF0000 was chosen (by experimentation) to be outside the range of    VMS FACILITYs that have dedicated message numbers.  Hopefully this will    always result in silent exits--it does on VMS 5.4.  Note that the C li-    brary translates exit arguments of zero to a $STATUS value of 1 (i.e.,    exit is both silent and has a $SEVERITY of "success").  ---------------------------------------------------------------------------*/  {    int severity;    switch (e) {                        /* $SEVERITY: */      case ZE_NONE:          severity = 0; break;          /*   warning  */      case ZE_FORM:      case ZE_BIG:      case ZE_NOTE:      case ZE_ABORT:      case ZE_NAME:      case ZE_PARMS:      case ZE_OPEN:          severity = 2; break;          /*   error    */      default:          severity = 4; break;          /*   fatal    */    }    exit(                                       /* $SEVERITY:              */         (e == ZE_OK) ? 1 :                     /*   success               */         (0x7FFF0000 | (e << 4) | severity)     /*   warning, error, fatal */        );   }}/******************************//*  Function version_local()  *//******************************/void version_local(){    static ZCONST char CompiledWith[] = "Compiled with %s%s for %s%s%s%s.\n\n";#ifdef VMS_VERSION    char buf[40];#endif#ifdef __DECC_VER    char buf2[40];    int  vtyp;#endif/*  DEC C in ANSI mode does not like "#ifdef MACRO" inside another    macro when MACRO is equated to a value (by "#define MACRO 1").   */    printf(CompiledWith,#ifdef __GNUC__      "gcc ", __VERSION__,#else#  if defined(DECC) || defined(__DECC) || defined (__DECC__)      "DEC C",#    ifdef __DECC_VER      (sprintf(buf2, " %c%d.%d-%03d",               ((vtyp = (__DECC_VER / 10000) % 10) == 6 ? 'T' :                (vtyp == 8 ? 'S' : 'V')),               __DECC_VER / 10000000,               (__DECC_VER % 10000000) / 100000, __DECC_VER % 1000), buf2),#    else      "",#    endif#  else#  ifdef VAXC      "VAX C", "",#  else      "unknown compiler", "",#  endif#  endif#endif#ifdef VMS_VERSION#  if defined(__alpha)      "OpenVMS",   /* version has trailing spaces ("V6.1   "), so truncate: */      (sprintf(buf, " (%.4s for Alpha)", VMS_VERSION), buf),#  else /* VAX */      (VMS_VERSION[1] >= '6')? "OpenVMS" : "VMS",      (sprintf(buf, " (%.4s for VAX)", VMS_VERSION), buf),#  endif#else      "VMS",      "",#endif /* ?VMS_VERSION */#ifdef __DATE__      " on ", __DATE__#else      "", ""#endif      );} /* end function version_local() */#endif /* VMS */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -