home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!haven.umd.edu!darwin.sura.net!jvnc.net!rutgers!network.ucsd.edu!mvb.saic.com!vmsnet-sources
- From: goathunter@wkuvx1.bitnet
- Newsgroups: vmsnet.sources
- Subject: Zip v1.9 & UnZip v5.0, part 12/22
- Message-ID: <8009655@MVB.SAIC.COM>
- Date: 1 Sep 92 22:52:17 GMT
- Organization: Western Kentucky University, Bowling Green, KY
- Lines: 1456
- Approved: Mark.Berryman@Mvb.Saic.Com
-
- Submitted-by: goathunter@wkuvx1.bitnet
- Posting-number: Volume 3, Issue 134
- Archive-name: zip_unzip/part12
-
- -+-+-+-+-+-+-+-+ START OF PART 12 -+-+-+-+-+-+-+-+
- X unsigned long signature; /* 4 bytes */
- X FInfo finfo; /* 16 bytes */
- X unsigned long lCrDat; /* 4 bytes */
- X unsigned long lMdDat; /* 4 bytes */
- X unsigned long flags ; /* 4 bytes */
- X unsigned long lDirID; /* 4 bytes */
- X char rguchVolName`5B28`5D; /* 28 bytes */
- X /*------------*/
- X`7D MACINFO; /* = 68 bytes for size of data */
- X#endif /* MACOS */
- X
- X/*--------------------------------------------------------------------------
- V-
- X And finally, some random extra stuff:
- X --------------------------------------------------------------------------
- V-*/
- X
- X#ifdef MINIX
- X# include <stdio.h>
- X#endif
- X
- X#ifdef SHORT_NAMES /* Mark Williams C, ...? */
- X# define extract_or_test_files xtr_or_tst_files
- X# define extract_or_test_member xtr_or_tst_member
- X#endif
- X
- X#ifdef MTS
- X# include <unix.h> /* Some important non-ANSI routines */
- X# define mkdir(s,n) (-1) /* No "make directory" capability */
- X# define EBCDIC /* Set EBCDIC conversion on */
- X#endif
- X
- X
- X
- X
- X
- X/*************/
- X/* Defines */
- X/*************/
- X
- X#ifndef WSIZE
- X# define WSIZE 0x8000 /* window size--must be a power of two, and */
- X#endif /* !WSIZE */ /* at least 32K for zip's deflate method */
- X
- X#define DIR_BLKSIZ 64 /* number of directory entries per block
- X * (should fit in 4096 bytes, usually) */
- X#ifndef INBUFSIZ
- X# define INBUFSIZ 2048 /* works for MS-DOS small model */
- X#endif /* !INBUFSIZ */
- X
- X/*
- X * If <limits.h> exists on most systems, should include that, since it may
- X * define some or all of the following: NAME_MAX, PATH_MAX, _POSIX_NAME_MAX
- V,
- X * _POSIX_PATH_MAX.
- X */
- X#ifdef DOS_OS2
- X# include <limits.h>
- X#endif /* DOS_OS2 */
- X
- X#ifdef _MAX_PATH
- X# define FILNAMSIZ (_MAX_PATH)
- X#else /* !_MAX_PATH */
- X# define FILNAMSIZ 1025
- X#endif /* ?_MAX_PATH */
- X
- X#ifndef PATH_MAX
- X# ifdef MAXPATHLEN /* defined in <sys/param.h> some systems
- V */
- X# define PATH_MAX MAXPATHLEN
- X# else
- X# if FILENAME_MAX > 255 /* used like PATH_MAX on some systems */
- X# define PATH_MAX FILENAME_MAX
- X# else
- X# define PATH_MAX (FILNAMSIZ - 1)
- X# endif
- X# endif /* ?MAXPATHLEN */
- X#endif /* !PATH_MAX */
- X
- X#define OUTBUFSIZ INBUFSIZ
- X
- X#define ZSUFX ".zip"
- X#define CENTRAL_HDR_SIG "\113\001\002" /* the infamous "PK" signature */
- X#define LOCAL_HDR_SIG "\113\003\004" /* bytes, sans "P" (so unzip */
- X#define END_CENTRAL_SIG "\113\005\006" /* executable not mistaken for *
- V/
- X#define EXTD_LOCAL_SIG "\113\007\010" /* zipfile itself) */
- X
- X#define SKIP 0 /* choice of activities for do_string() */
- X#define DISPLAY 1
- X#define FILENAME 2
- X#define EXTRA_FIELD 3
- X
- X#define DOES_NOT_EXIST -1 /* return values for check_for_newer() */
- X#define EXISTS_AND_OLDER 0
- X#define EXISTS_AND_NEWER 1
- X
- X#define DOS_OS2_FAT_ 0 /* version_made_by codes (central dir) */
- X#define AMIGA_ 1
- X#define VMS_ 2 /* make sure these are not defined on */
- X#define UNIX_ 3 /* the respective systems!! (like, for */
- X#define VM_CMS_ 4 /* instance, "VMS", or "UNIX": CFLAGS = */
- X#define ATARI_ 5 /* -O -DUNIX) */
- X#define OS2_HPFS_ 6
- X#define MAC_ 7
- X#define Z_SYSTEM_ 8
- X#define CPM_ 9
- X/* #define TOPS20_ 10? (TOPS20_ is to be defined in PKZIP 2.0...) */
- X#define NUM_HOSTS 10 /* index of last system + 1 */
- X
- X#define STORED 0 /* compression methods */
- X#define SHRUNK 1
- X#define REDUCED1 2
- X#define REDUCED2 3
- X#define REDUCED3 4
- X#define REDUCED4 5
- X#define IMPLODED 6
- X#define TOKENIZED 7
- X#define DEFLATED 8
- X#define NUM_METHODS 9 /* index of last method + 1 */
- X/* don't forget to update list_files() appropriately if NUM_METHODS changes
- V */
- X
- X#define DF_MDY 0 /* date format 10/26/91 (USA only) */
- X#define DF_DMY 1 /* date format 26/10/91 (most of the world) *
- V/
- X#define DF_YMD 2 /* date format 91/10/26 (a few countries) */
- X
- X#define UNZIP_VERSION 20 /* compatible with PKUNZIP 2.0 */
- X#define VMS_VERSION 42 /* if OS-needed-to-extract is VMS: can do */
- X
- X/*--------------------------------------------------------------------------
- V-
- X True sizes of the various headers, as defined by PKWare--so it is not
- X likely that these will ever change. But if they do, make sure both thes
- Ve
- X defines AND the typedefs below get updated accordingly.
- X --------------------------------------------------------------------------
- V-*/
- X#define LREC_SIZE 26 /* lengths of local file headers, central */
- X#define CREC_SIZE 42 /* directory headers, and the end-of- */
- X#define ECREC_SIZE 18 /* central-dir record, respectively */
- X
- X#define MAX_BITS 13 /* used in unShrink() */
- X#define HSIZE (1 << MAX_BITS) /* size of global work area */
- X
- X#define LF 10 /* '\n' on ASCII machines. Must be 10 due to EBCDIC *
- V/
- X#define CR 13 /* '\r' on ASCII machines. Must be 13 due to EBCDIC *
- V/
- X#define CTRLZ 26 /* DOS & OS/2 EOF marker (used in file_io.c, vms.c) */
- X
- X#ifdef EBCDIC
- X# define ascii_to_native(c) ebcdic`5B(c)`5D
- X# define NATIVE "EBCDIC"
- X#endif
- X
- X#if MPW
- X# define FFLUSH putc('\n',stderr);
- X#else /* !MPW */
- X# define FFLUSH fflush(stderr);
- X#endif /* ?MPW */
- X
- X#ifdef VMS
- X# define ENV_UNZIP "UNZIP_OPTS" /* name of environment variable */
- X# define ENV_ZIPINFO "ZIPINFO_OPTS"
- X#else /* !VMS */
- X# define ENV_UNZIP "UNZIP"
- X# define ENV_ZIPINFO "ZIPINFO"
- X#endif /* ?VMS */
- X
- X#ifdef CRYPT
- X# define PWLEN 80
- X# define DECRYPT(b) (update_keys(t=((b)&0xff)`5Edecrypt_byte()),t)
- X#endif /* CRYPT */
- X
- X#ifdef QQ /* Newtware version */
- X# define QCOND (!quietflg) /* for no file comments with -vq or -vqq */
- X#else /* (original) Bill Davidsen version */
- X# define QCOND (which_hdr) /* no way to kill file comments with -v, -l
- V */
- X#endif
- X
- X#ifndef TRUE
- X# define TRUE 1 /* sort of obvious */
- X#endif
- X#ifndef FALSE
- X# define FALSE 0
- X#endif
- X
- X#ifndef SEEK_SET /* These should all be declared in stdio.h! But *
- V/
- X# define SEEK_SET 0 /* since they're not (in many cases), do so here. *
- V/
- X# define SEEK_CUR 1
- X# define SEEK_END 2
- X#endif
- X
- X#ifndef S_IRUSR
- X# define S_IRWXU 00700 /* read, write, execute: owner */
- X# define S_IRUSR 00400 /* read permission: owner */
- X# define S_IWUSR 00200 /* write permission: owner */
- X# define S_IXUSR 00100 /* execute permission: owner */
- X# define S_IRWXG 00070 /* read, write, execute: group */
- X# define S_IRGRP 00040 /* read permission: group */
- X# define S_IWGRP 00020 /* write permission: group */
- X# define S_IXGRP 00010 /* execute permission: group */
- X# define S_IRWXO 00007 /* read, write, execute: other */
- X# define S_IROTH 00004 /* read permission: other */
- X# define S_IWOTH 00002 /* write permission: other */
- X# define S_IXOTH 00001 /* execute permission: other */
- X#endif /* !S_IRUSR */
- X
- X#ifdef ZIPINFO /* these are individually checked because SysV doesn't *
- V/
- X# ifndef S_IFBLK /* have some of them, Microsoft C others, etc. */
- X# define S_IFBLK 0060000 /* block special */
- X# endif
- X# ifndef S_IFIFO /* in Borland C, not MSC */
- X# define S_IFIFO 0010000 /* fifo */
- X# endif
- X# ifndef S_IFLNK /* in BSD, not SysV */
- X# define S_IFLNK 0120000 /* symbolic link */
- X# endif
- X# ifndef S_IFSOCK /* in BSD, not SysV */
- X# define S_IFSOCK 0140000 /* socket */
- X# endif
- X# ifndef S_ISUID
- X# define S_ISUID 04000 /* set user id on execution */
- X# endif
- X# ifndef S_ISGID
- X# define S_ISGID 02000 /* set group id on execution */
- X# endif
- X# ifndef S_ISVTX
- X# define S_ISVTX 01000 /* directory permissions control */
- X# endif
- X# ifndef S_ENFMT
- X# define S_ENFMT S_ISGID /* record locking enforcement flag */
- X# endif
- X#endif /* ZIPINFO */
- X
- X
- X
- X
- X
- X/**************/
- X/* Typedefs */
- X/**************/
- X
- X#ifndef _BULL_SOURCE /* Bull has it defined somewhere already
- V */
- X typedef unsigned char byte; /* code assumes UNSIGNED bytes */
- X#endif /* !_BULL_SOURCE */
- X
- Xtypedef char boolean;
- Xtypedef long longint;
- Xtypedef unsigned short UWORD;
- Xtypedef unsigned long ULONG;
- X
- Xtypedef struct min_info `7B
- X unsigned unix_attr;
- X unsigned dos_attr;
- X int hostnum;
- X longint offset;
- X ULONG compr_size; /* compressed size (needed if extended header)
- V */
- X ULONG crc; /* crc (needed if extended header) */
- X unsigned encrypted : 1; /* file encrypted: decrypt before uncompressing
- V */
- X unsigned ExtLocHdr : 1; /* use time instead of CRC for decrypt check */
- X unsigned text : 1; /* file is text or binary */
- X unsigned lcflag : 1; /* convert filename to lowercase */
- X`7D min_info;
- X
- Xtypedef struct VMStimbuf `7B
- X char *revdate; /* (both correspond to Unix modtime/st_mtime) *
- V/
- X char *credate;
- X`7D VMStimbuf;
- X
- X/*--------------------------------------------------------------------------
- V-
- X Zipfile layout declarations. If these headers ever change, make sure th
- Ve
- X xxREC_SIZE defines (above) change with them!
- X --------------------------------------------------------------------------
- V-*/
- X
- X typedef byte local_byte_hdr`5B LREC_SIZE `5D;
- X# define L_VERSION_NEEDED_TO_EXTRACT_0 0
- X# define L_VERSION_NEEDED_TO_EXTRACT_1 1
- X# define L_GENERAL_PURPOSE_BIT_FLAG 2
- X# define L_COMPRESSION_METHOD 4
- X# define L_LAST_MOD_FILE_TIME 6
- X# define L_LAST_MOD_FILE_DATE 8
- X# define L_CRC32 10
- X# define L_COMPRESSED_SIZE 14
- X# define L_UNCOMPRESSED_SIZE 18
- X# define L_FILENAME_LENGTH 22
- X# define L_EXTRA_FIELD_LENGTH 24
- X
- X typedef byte cdir_byte_hdr`5B CREC_SIZE `5D;
- X# define C_VERSION_MADE_BY_0 0
- X# define C_VERSION_MADE_BY_1 1
- X# define C_VERSION_NEEDED_TO_EXTRACT_0 2
- X# define C_VERSION_NEEDED_TO_EXTRACT_1 3
- X# define C_GENERAL_PURPOSE_BIT_FLAG 4
- X# define C_COMPRESSION_METHOD 6
- X# define C_LAST_MOD_FILE_TIME 8
- X# define C_LAST_MOD_FILE_DATE 10
- X# define C_CRC32 12
- X# define C_COMPRESSED_SIZE 16
- X# define C_UNCOMPRESSED_SIZE 20
- X# define C_FILENAME_LENGTH 24
- X# define C_EXTRA_FIELD_LENGTH 26
- X# define C_FILE_COMMENT_LENGTH 28
- X# define C_DISK_NUMBER_START 30
- X# define C_INTERNAL_FILE_ATTRIBUTES 32
- X# define C_EXTERNAL_FILE_ATTRIBUTES 34
- X# define C_RELATIVE_OFFSET_LOCAL_HEADER 38
- X
- X typedef byte ec_byte_rec`5B ECREC_SIZE+4 `5D;
- X/* define SIGNATURE 0 space-holder only */
- X# define NUMBER_THIS_DISK 4
- X# define NUM_DISK_WITH_START_CENTRAL_DIR 6
- X# define NUM_ENTRIES_CENTRL_DIR_THS_DISK 8
- X# define TOTAL_ENTRIES_CENTRAL_DIR 10
- X# define SIZE_CENTRAL_DIRECTORY 12
- X# define OFFSET_START_CENTRAL_DIRECTORY 16
- X# define ZIPFILE_COMMENT_LENGTH 20
- X
- X
- X typedef struct local_file_header `7B /* LOCAL */
- X byte version_needed_to_extract`5B2`5D;
- X UWORD general_purpose_bit_flag;
- X UWORD compression_method;
- X UWORD last_mod_file_time;
- X UWORD last_mod_file_date;
- X ULONG crc32;
- X ULONG compressed_size;
- X ULONG uncompressed_size;
- X UWORD filename_length;
- X UWORD extra_field_length;
- X `7D local_file_hdr;
- X
- X typedef struct central_directory_file_header `7B /* CENTRAL */
- X byte version_made_by`5B2`5D;
- X byte version_needed_to_extract`5B2`5D;
- X UWORD general_purpose_bit_flag;
- X UWORD compression_method;
- X UWORD last_mod_file_time;
- X UWORD last_mod_file_date;
- X ULONG crc32;
- X ULONG compressed_size;
- X ULONG uncompressed_size;
- X UWORD filename_length;
- X UWORD extra_field_length;
- X UWORD file_comment_length;
- X UWORD disk_number_start;
- X UWORD internal_file_attributes;
- X ULONG external_file_attributes;
- X ULONG relative_offset_local_header;
- X `7D cdir_file_hdr;
- X
- X typedef struct end_central_dir_record `7B /* END CENTRAL */
- X UWORD number_this_disk;
- X UWORD num_disk_with_start_central_dir;
- X UWORD num_entries_centrl_dir_ths_disk;
- X UWORD total_entries_central_dir;
- X ULONG size_central_directory;
- X ULONG offset_start_central_directory;
- X UWORD zipfile_comment_length;
- X `7D ecdir_rec;
- X
- X
- X
- X
- X
- X/*************************/
- X/* Function Prototypes */
- X/*************************/
- X
- X#ifndef __
- X# define __ OF
- X#endif
- X
- X/*--------------------------------------------------------------------------
- V-
- X Functions in unzip.c and/or zipinfo.c:
- X --------------------------------------------------------------------------
- V-*/
- X
- Xint usage __((int error));
- Xint process_zipfile __((void));
- Xint find_end_central_dir __((void));
- Xint process_end_central_dir __((void));
- Xint list_files __((void)); /* unzip.c
- V */
- Xint process_cdir_file_hdr __((void)); /* unzip.c
- V */
- Xint process_local_file_hdr __((void)); /* unzip.c
- V */
- Xint process_central_dir __((void));
- Xint long_info __((void)); /* zipinfo.c
- V */
- Xint short_info __((void)); /* zipinfo.c
- V */
- Xchar *zipinfo_time __((UWORD *datez, UWORD *timez));
- X
- X/*--------------------------------------------------------------------------
- V-
- X Functions in extract.c:
- X --------------------------------------------------------------------------
- V-*/
- X
- Xint extract_or_test_files __((void));
- X/* static int store_info __((void)); */
- X/* static int extract_or_test_member __((void)); */
- Xint memextract __((byte *, ULONG, byte *, ULONG));
- Xint FlushMemory __((void));
- Xint ReadMemoryByte __((UWORD *x));
- X
- X/*--------------------------------------------------------------------------
- V-
- X Decompression functions:
- X --------------------------------------------------------------------------
- V-*/
- X
- Xint explode __((void)); /* explode.c
- V */
- X
- Xvoid inflate __((void)); /* inflate.c
- V */
- X
- Xvoid unReduce __((void)); /* unreduce.c
- V */
- X/* static void LoadFollowers __((void)); * unreduce.c
- V */
- X
- Xvoid unShrink __((void)); /* unshrink.c
- V */
- X/* static void partial_clear __((void)); * unshrink.c
- V */
- X
- X/*--------------------------------------------------------------------------
- V-
- X Functions in file_io.c and crypt.c:
- X --------------------------------------------------------------------------
- V-*/
- X
- Xint open_input_file __((void)); /* file_io.c
- V */
- Xint readbuf __((char *buf, register unsigned len));
- Xint create_output_file __((void)); /* file_io.c, vms.c
- V */
- Xint FillBitBuffer __((void)); /* file_io.c
- V */
- Xint ReadByte __((UWORD *x)); /* file_io.c
- V */
- Xint FlushOutput __((void)); /* file_io.c, vms.c
- V */
- X/* static int dos2unix __((unsigned char *, int)); * file_io.c
- V */
- Xvoid set_file_time_and_close __((void)); /* file_io.c
- V */
- Xvoid handler __((int signal)); /* file_io.c
- V */
- Xint echo __((int opt)); /* file_io.c
- V */
- Xvoid echoff __((int f)); /* file_io.c
- V */
- Xvoid echon __((void)); /* file_io.c
- V */
- Xchar *getp __((char *, char *, int)); /* file_io.c
- V */
- X
- Xint decrypt_byte __((void)); /* crypt.c
- V */
- Xvoid update_keys __((int)); /* crypt.c
- V */
- Xvoid init_keys __((char *)); /* crypt.c
- V */
- X
- X/*--------------------------------------------------------------------------
- V-
- X Macintosh file_io functions:
- X --------------------------------------------------------------------------
- V-*/
- X
- X#ifdef MACOS
- X/* static int IsHFSDisk __((int)); */
- X void macfstest __((int));
- X int macmkdir __((char *, short, long));
- X void ResolveMacVol __((short, short *, long *, StringPtr));
- X short macopen __((char *, short, short, long));
- X short maccreat __((char *, short, long, OSType, OSType));
- X short macread __((short, char *, unsigned));
- X short macwrite __((short, char *, unsigned));
- X short macclose __((short));
- X long maclseek __((short, long, short));
- X#endif
- X
- X/*--------------------------------------------------------------------------
- V-
- X OS/2 file_io functions:
- X --------------------------------------------------------------------------
- V-*/
- X
- Xvoid ChangeNameForFAT __((char *name)); /* os2unzip.c
- V */
- Xint IsFileNameValid __((char *name)); /* os2unzip.c
- V */
- Xint GetCountryInfo __((void)); /* os2unzip.c
- V */
- Xlong GetFileTime __((char *name)); /* os2unzip.c
- V */
- Xvoid SetPathInfo __((char *path, UWORD moddate, UWORD modtime, int flags
- V));
- Xint SetLongNameEA __((char *name, char *longname)); /* os2unzip.c
- V */
- Xint IsEA __((void *extra_field)); /* os2unzip.c
- V */
- XULONG SizeOfEAs __((void *extra_field)); /* os2unzip.c
- V */
- Xvoid SetEAs __((char *path, void *eablock)); /* os2unzip.c
- V */
- Xint IsUpperNLS __((int nChr)); /* os2unzip.c
- V */
- Xint ToLowerNLS __((int nChr)); /* os2unzip.c
- V */
- X
- X/*--------------------------------------------------------------------------
- V-
- X VMS file_io functions:
- X --------------------------------------------------------------------------
- V-*/
- X
- Xint check_format __((void)); /* vms.c
- V */
- Xint find_vms_attrs __((void)); /* vms.c
- V */
- Xint CloseOutputFile __((void)); /* vms.c
- V */
- X/* static byte *extract_block __((struct extra_block *, int *, byte *, int))
- V;*/
- X/* static int _flush_blocks __((int final_flag)); * vms.c
- V */
- X/* static int _flush_records __((int final_flag)); * vms.c
- V */
- X/* static int WriteBuffer __((unsigned char *buf, int len)); * vms.c
- V */
- X/* static int WriteRecord __((unsigned char *rec, int len)); * vms.c
- V */
- X/* static void message __((int string, char *status)); * vms.c
- V */
- X
- Xint VMSmunch __((char *, int, char *)); /* VMSmunch.c
- V */
- X
- X/*--------------------------------------------------------------------------
- V-
- X Functions in match.c, mapname.c, misc.c, etc.:
- X --------------------------------------------------------------------------
- V-*/
- X
- Xint match __((char *string, char *pattern)); /* match.c
- V */
- X
- Xint mapname __((int create_dirs)); /* mapname.c
- V */
- X
- Xvoid UpdateCRC __((register unsigned char *s, register int len))
- V;
- Xint do_string __((unsigned int len, int option)); /* misc.c
- V */
- Xtime_t dos_to_unix_time __((unsigned ddate, unsigned dtime)); /* misc.c
- V */
- Xint check_for_newer __((char *filename)); /* misc.c
- V */
- Xint dateformat __((void)); /* misc.c
- V */
- XUWORD makeword __((byte *b)); /* misc.c
- V */
- XULONG makelong __((byte *sig)); /* misc.c
- V */
- Xvoid return_VMS __((int zip_error)); /* misc.c
- V */
- X
- Xvoid envargs __((int *, char ***, char *)); /* envargs.c
- V */
- X
- X#ifdef AMIGA
- X int utime __((char *file, time_t timep`5B`5D)); /* uti
- Vme.c */
- X#endif /* AMIGA */
- X
- X#ifdef ZMEM /* these MUST be ifdef'd because of conflicts with the std def
- V */
- X char *memset __((register char *buf, register char init,
- X register unsigned int len)); /* misc.c
- V */
- X char *memcpy __((register char *dst, register char *src,
- X register unsigned int len)); /* misc.c
- V */
- X#endif /* ZMEM */
- X
- X
- X
- X
- X
- X/************/
- X/* Macros */
- X/************/
- X
- X#ifndef MAX
- X# define MAX(a,b) ((a) > (b) ? (a) : (b))
- X#endif
- X
- X#ifndef MIN
- X# define MIN(a,b) ((a) < (b) ? (a) : (b))
- X#endif
- X
- X
- X#define LSEEK(abs_offset) `7Blongint request=(abs_offset)+extra_bytes,\
- X inbuf_offset=request%INBUFSIZ, bufstart=request-inbuf_offset;\
- X if(request<0) `7Bfprintf(stderr, SeekMsg, ReportMsg); return(3);`7D\
- X else if(bufstart!=cur_zipfile_bufstart)\
- X `7Bcur_zipfile_bufstart=lseek(zipfd,bufstart,SEEK_SET);\
- X if((incnt=read(zipfd,(char *)inbuf,INBUFSIZ))<=0) return(51);\
- X inptr=inbuf+(int)inbuf_offset; incnt-=(int)inbuf_offset;`7D else\
- X `7Bincnt+=(inptr-inbuf)-(int)inbuf_offset; inptr=inbuf+(int)inbuf_offset;
- V`7D`7D
- X
- X/*
- X * Seek to the block boundary of the block which includes abs_offset,
- X * then read block into input buffer and set pointers appropriately.
- X * If block is already in the buffer, just set the pointers. This macro
- X * is used by process_end_central_dir (unzip.c) and do_string (misc.c).
- X * A slightly modified version is embedded within extract_or_test_files
- X * (unzip.c). ReadByte and readbuf (file_io.c) are compatible.
- X *
- X * macro LSEEK(abs_offset)
- X * ULONG abs_offset;
- X * `7B
- X * longint request = abs_offset + extra_bytes;
- X * longint inbuf_offset = request % INBUFSIZ;
- X * longint bufstart = request - inbuf_offset;
- X *
- X * if (request < 0) `7B
- X * fprintf(stderr, SeekMsg, ReportMsg);
- X * return(3); /-* 3: severe error in zipfile *-/
- X * `7D else if (bufstart != cur_zipfile_bufstart) `7B
- X * cur_zipfile_bufstart = lseek(zipfd, bufstart, SEEK_SET);
- X * if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0)
- X * return(51); /-* 51: unexpected EOF *-/
- X * inptr = inbuf + (int)inbuf_offset;
- X * incnt -= (int)inbuf_offset;
- X * `7D else `7B
- X * incnt += (inptr-inbuf) - (int)inbuf_offset;
- X * inptr = inbuf + (int)inbuf_offset;
- X * `7D
- X * `7D
- X *
- X */
- X
- X
- X#define SKIP_(length) if(length&&((error=do_string(length,SKIP))!=0))\
- X `7Berror_in_archive=error; if(error>1) return error;`7D
- X
- X/*
- X * Skip a variable-length field, and report any errors. Used in zipinfo.c
- X * and unzip.c in several functions.
- X *
- X * macro SKIP_(length)
- X * UWORD length;
- X * `7B
- X * if (length && ((error = do_string(length, SKIP)) != 0)) `7B
- X * error_in_archive = error; /-* might be warning *-/
- X * if (error > 1) /-* fatal *-/
- X * return (error);
- X * `7D
- X * `7D
- X *
- X */
- X
- X
- X#define OUTB(intc) `7B*outptr++=(byte)(intc); if (++outcnt==OUTBUFSIZ)\
- X FlushOutput();`7D
- X
- X/*
- X * macro OUTB(intc)
- X * `7B
- X * *outptr++ = (byte)(intc);
- X * if (++outcnt == OUTBUFSIZ)
- X * FlushOutput();
- X * `7D
- X *
- X */
- X
- X
- X#define READBIT(nbits,zdest) `7Bif(nbits>bits_left) FillBitBuffer();\
- X zdest=(int)((UWORD)bitbuf&mask_bits`5Bnbits`5D);bitbuf>>=nbits;bits_left-=
- Vnbits;`7D
- X
- X/*
- X * macro READBIT(nbits,zdest)
- X * `7B
- X * if (nbits > bits_left)
- X * FillBitBuffer();
- X * zdest = (int)((UWORD)bitbuf & mask_bits`5Bnbits`5D);
- X * bitbuf >>= nbits;
- X * bits_left -= nbits;
- X * `7D
- X *
- X */
- X
- X
- X#define PEEKBIT(nbits) (nbits>bits_left? (FillBitBuffer(),\
- X (UWORD)bitbuf & mask_bits`5Bnbits`5D) : (UWORD)bitbuf & mask_bits`5Bnbits`
- V5D)
- X
- X
- X#define NUKE_CRs(buf,len) `7Bregister int i,j; for (i=j=0; j<len;\
- X (buf)`5Bi++`5D=(buf)`5Bj++`5D) if ((buf)`5Bj`5D=='\r') ++j; len=i;`7D
- X
- X/*
- X * Remove all the ASCII carriage returns from buffer buf (length len),
- X * shortening as necessary (note that len gets modified in the process,
- X * so it CANNOT be an expression). This macro is intended to be used
- X * BEFORE A_TO_N(); hence the check for CR instead of '\r'. NOTE: The
- X * if-test gets performed one time too many, but it doesn't matter.
- X *
- X * macro NUKE_CRs(buf,len)
- X * `7B
- X * register int i, j;
- X *
- X * for (i = j = 0; j < len; (buf)`5Bi++`5D = (buf)`5Bj++`5D)
- X * if ((buf)`5Bj`5D == CR)
- X * ++j;
- X * len = i;
- X * `7D
- X *
- X */
- X
- X
- X#define TOLOWER(str1,str2) `7Bchar *ps1,*ps2; ps1=(str1)-1; ps2=(str2);\
- X while(*++ps1) *ps2++=(char)(isupper((int)(*ps1))?tolower((int)(*ps1)):*ps1
- V);\
- X *ps2='\0';`7D
- X
- X/*
- X * Copy the zero-terminated string in str1 into str2, converting any
- X * uppercase letters to lowercase as we go. str2 gets zero-terminated
- X * as well, of course. str1 and str2 may be the same character array.
- X *
- X * macro TOLOWER( str1, str2 )
- X * `7B
- X * char *ps1, *ps2;
- X *
- X * ps1 = (str1) - 1;
- X * ps2 = (str2);
- X * while (*++ps1)
- X * *ps2++ = (char)(isupper((int)(*ps1))? tolower((int)(*ps1)) : *ps
- V1);
- X * *ps2='\0';
- X * `7D
- X *
- X * NOTES: This macro makes no assumptions about the characteristics of
- X * the tolower() function or macro (beyond its existence), nor does it
- X * make assumptions about the structure of the character set (i.e., it
- X * should work on EBCDIC machines, too). The fact that either or both
- X * of isupper() and tolower() may be macros has been taken into account;
- X * watch out for "side effects" (in the C sense) when modifying this
- X * macro.
- X */
- X
- X
- X#ifndef ascii_to_native
- X# define ascii_to_native(c) (c)
- X# define A_TO_N(str1)
- X#else
- X# ifndef NATIVE
- X# define NATIVE "native chars"
- X# endif
- X# define A_TO_N(str1) `7Bregister unsigned char *ps1;\
- X for (ps1=str1; *ps1; ps1++) *ps1=ascii_to_native(*ps1);`7D
- X#endif
- X
- X/*
- X * Translate the zero-terminated string in str1 from ASCII to the native
- X * character set. The translation is performed in-place and uses the
- X * ascii_to_native macro to translate each character.
- X *
- X * macro A_TO_N( str1 )
- X * `7B
- X * register unsigned char *ps1;
- X *
- X * for (ps1 = str1; *ps1; ++ps1)
- X * *ps1 = ascii_to_native(*ps1);
- X * `7D
- X *
- X * NOTE: Using the ascii_to_native macro means that is it the only part of
- X * unzip which knows which translation table (if any) is actually in use
- X * to produce the native character set. This makes adding new character
- X * set translation tables easy, insofar as all that is needed is an
- X * appropriate ascii_to_native macro definition and the translation
- X * table itself. Currently, the only non-ASCII native character set
- X * implemented is EBCDIC, but this may not always be so.
- X */
- X
- X
- X
- X
- X
- X/*************/
- X/* Globals */
- X/*************/
- X
- X extern int aflag;
- X/* extern int bflag; reserved */
- X extern int cflag;
- X extern int fflag;
- X extern int jflag;
- X extern int overwrite_none;
- X extern int overwrite_all;
- X extern int force_flag;
- X extern int quietflg;
- X#ifdef DOS_OS2
- X extern int sflag;
- X#endif
- X extern int tflag;
- X extern int uflag;
- X extern int V_flag;
- X#ifdef VMS
- X extern int secinf;
- X#endif
- X#ifdef MACOS
- X extern int hfsflag;
- X#endif
- X extern int process_all_files;
- X extern longint csize;
- X extern longint ucsize;
- X extern char *fnames`5B`5D;
- X extern char **fnv;
- X extern char sig`5B`5D;
- X extern char answerbuf`5B`5D;
- X extern min_info *pInfo;
- X extern char *key;
- X extern ULONG keys`5B`5D;
- X
- X#ifdef MACOS
- X union work `7B
- X struct `7B
- X short *Prefix_of; /* (8193 * sizeof(short)) */
- X byte *Suffix_of;
- X byte *Stack;
- X `7D shrink;
- X byte *Slide;
- X `7D;
- X#else
- X union work `7B
- X struct `7B
- X short Prefix_of`5BHSIZE + 2`5D; /* (8194 * sizeof(short)) */
- X byte Suffix_of`5BHSIZE + 2`5D; /* also s-f length_nodes (smalle
- Vr) */
- X byte Stack`5BHSIZE + 2`5D; /* also s-f distance_nodes (smal
- Vler) */
- X `7D shrink;
- X byte Slide`5BWSIZE`5D;
- X `7D;
- X#endif
- X extern union work area;
- X
- X# define prefix_of area.shrink.Prefix_of
- X# define suffix_of area.shrink.Suffix_of
- X# define stack area.shrink.Stack
- X# define slide area.Slide
- X
- X extern ULONG crc32val;
- X extern UWORD mask_bits`5B`5D;
- X
- X extern byte *inbuf;
- X extern byte *inptr;
- X extern int incnt;
- X extern ULONG bitbuf;
- X extern int bits_left;
- X extern boolean zipeof;
- X extern int zipfd;
- X#ifdef MSWIN
- X extern char *zipfn;
- X#else
- X extern char zipfn`5B`5D;
- X#endif
- X extern longint extra_bytes;
- X extern longint cur_zipfile_bufstart;
- X extern byte *extra_field;
- X extern char local_hdr_sig`5B`5D;
- X extern char central_hdr_sig`5B`5D;
- X extern char end_central_sig`5B`5D;
- X extern local_file_hdr lrec;
- X extern cdir_file_hdr crec;
- X extern ecdir_rec ecrec;
- X extern struct stat statbuf;
- X
- X extern byte *outbuf;
- X extern byte *outptr;
- X#ifdef MSWIN
- X extern byte __far *outout;
- X extern char *filename;
- X#else
- X extern byte *outout;
- X extern char filename`5B`5D;
- X#endif
- X extern longint outpos;
- X extern int outcnt;
- X extern int outfd;
- X extern int mem_mode;
- X extern int disk_full;
- X
- X extern char *EndSigMsg;
- X extern char *CentSigMsg;
- X extern char *SeekMsg;
- X extern char *ReportMsg;
- X
- X#ifdef DECLARE_ERRNO
- X extern int errno;
- X#endif
- X
- X#ifdef EBCDIC
- X extern byte ebcdic`5B`5D;
- X#endif
- X
- X#ifdef MACOS
- X extern short gnVRefNum;
- X extern long glDirID;
- X extern OSType gostCreator;
- X extern OSType gostType;
- X extern boolean fMacZipped;
- X extern boolean macflag;
- X extern short giCursor;
- X extern CursHandle rghCursor`5B`5D;
- X#endif
- $ CALL UNPACK [.UNZIP50]UNZIP.H;1 2002099974
- $ create 'f'
- X.!
- X.! File:`09UNZIP.RNH
- X.!
- X.! Author:`09Hunter Goatley
- X.!
- X.! Date:`09October 23, 1991
- X.!
- X.! Description:
- X.!
- X.!`09RUNOFF source file for portable UNZIP on-line help for VMS.
- X.!`09Adapted from UNZIP.MAN, distributed with UNZIP.
- X.!
- X.!`09To build:`09$ RUNOFF UNZIP.RNH
- X.!`09`09`09$ LIBR/HELP/INSERT libr UNZIP
- X.!
- X.! Modification history:
- X.!
- X.!`0901-001`09`09Hunter Goatley`09`0923-OCT-1991 09:21
- X.!`09`09Genesis.
- X.!`0901-002`09`09Cave Newt`09`0916-MAR-1992 22:37
- X.!`09`09Update for UnZip 4.2.
- X.!`0901-003`09`09Igor Mandrichenko`0923-MAY-1992 22:14
- X.!`09`09Add -X option to command syntax.
- X.!`0901-004`09`09Cave Newt`09`0924-MAY-1992 13:30
- X.!`09`09Add UNZIP_OPTS environment variable help.
- X.!
- X.noflags
- X.lm4 .rm72
- X.indent -4
- X1 UNZIP
- X.br
- XUnZip is used to extract files compressed and packaged by Zip (see HELP ZIP
- Xfor information on ZIP).
- X.sk
- XFor a brief help on Zip and Unzip, run each without specifying any
- Xparameters on the command line.
- X.sk
- XUNZIP will list, test, or extract from a ZIP archive. ZIP archives are comm
- Vonly
- Xfound on MS-DOS systems; a VMS version of ZIP can also be found here.
- X.sk
- XArchive member extraction is implied by the absence of the -c, -p, -t, -l, -
- Vv or
- X-z options. All archive members are processed unless a filespec is provided
- V to
- Xspecify a subset of the archive members. The filespec is similar to an egre
- Vp
- Xexpression, and may contain:
- X.sk
- X.literal
- X * matches a sequence of 0 or more characters
- X ? matches exactly 1 character
- X \nnn matches the character having octal code nnn
- X `5B...`5D matches any single character found inside the brackets;
- X ranges are specified by a beginning character,
- X a hyphen, and an ending character. If a '!' follows
- X the left bracket, then the range of characters
- X matched is complemented with respect to the ASCII
- X character set.
- X.end literal
- X.sk
- XFormat:
- X.sk;.lm+1;.literal
- XUNZIP `5B-cflptuvxz`5BajnoqUVX`5D`5D file`5B.zip`5D `5Bfilespec...`5D
- X.end literal;.lm-1
- X.!--------------------------------------------------------------------------
- V----
- X.indent -4
- X2 Parameters
- X.sk;.indent -4
- Xfile`5B.zip`5D
- X.sk
- XFile specification for the ZIP archive. The suffix .ZIP is applied if the
- Xspecified file does not exist. Note that self-extracting ZIP files are
- Xsupported; just specify the .EXE suffix yourself.
- X.sk;.indent -4
- X`5Bfilespec`5D
- X.sk
- XAn optional list of archive members to be processed. Expressions may be
- Xused to match multiple members. Expressions should be enclosed in double-qu
- Votes
- Xto prevent interpretation by DCL. Multiple filenames should be separated by
- Xblanks.
- X.!--------------------------------------------------------------------------
- V----
- X.indent -4
- X2 Options
- X.br
- XThe default action of UnZip is to extract all zipfile entries. The followin
- Vg
- Xoptions and modifiers can be provided:
- X.sk;.literal
- X -c extract files to SYS$OUTPUT (terminal)
- X -f freshen existing files (replace if newer); create none
- X -l list archive files (short format)
- X -p extract files to SYS$OUTPUT; no informational messages
- X -t test archive files
- X -u update existing files; create new ones if needed
- X -v list archive files (verbose format)
- X -x extract files in archive (default)
- X -z display only the archive comment
- X.end literal;.sk;.literal
- X MODIFIERS
- X -a convert to VMS textfile format (only use for TEXT files!)
- X -j junk paths (don't recreate archive's directory structure)
- X -n never overwrite existing files; don't prompt
- X -o OK to overwrite files without prompting
- X -q perform operations quietly (-qq => even quieter)
- X -U leave filenames uppercase if created under MS-DOS, VMS, etc.
- X -V retain (VMS) file version numbers
- X -X restore owner/protection info (may require privileges)
- X.end literal;.sk
- X! `5Bthis should probably be a separate section`5D:
- XIn addition, default options may be specified via the UNZIP_OPTS logical.
- XFor example, the following will cause UnZip to restore owner/protection
- Xinformation and perform all operations at quiet-level 1 by default:
- X.sk;.literal
- X define UNZIP_OPTS "-qX"
- X.end literal;.sk
- XNote that the quotation marks are required to preserve lowercase options.
- XTo negate a default option on the command line, add one or more minus`20
- Xsigns before the option letter, in addition to the leading switch character
- X`60-':
- X.sk;.literal
- X unzip --ql zipfile
- X.end literal
- Xor
- X.literal
- X unzip -l-q zipfile
- X.end literal;.sk
- XAt present it is not possible to decrement an option below zero--that is,
- Xmore than a few minuses have no effect.
- X.sk
- XUNZIP_OPTS may be defined as a symbol rather than a logical, but if both
- Xare defined, the logical is used.
- X.!--------------------------------------------------------------------------
- V---
- X.indent -4
- X2 Authors
- X.br
- XSamuel H. Smith, Usenet contributors, and Info-ZIP.
- X.sk
- XVMS on-line help ported from UNZIP.MAN by Hunter Goatley.
- $ CALL UNPACK [.UNZIP50]UNZIP.RNH;1 1141060954
- $ create 'f'
- X/*************************************************************************
- X * *
- X * Copyright (C) 1992 Igor Mandrichenko. *
- X * Permission is granted to any individual or institution to use, copy, *
- X * or redistribute this software so long as all of the original files *
- X * are included unmodified, that it is not sold for profit, and that *
- X * this copyright notice is retained. *
- X * *
- X *************************************************************************/
- X
- X/*
- X * vms.c by Igor Mandrichenko
- X * version 1.2-1
- X *
- X * This module contains routines to extract VMS file attributes
- X * from extra field and create file with these attributes. This
- X * source is mainly based on sources of file_io.c from UNZIP 4.1
- X * by Info-ZIP. `5BInfo-ZIP note: very little of this code is from
- X * file_io.c; it has virtually been written from the ground up.
- X * Of the few lines which are from the older code, most are mine
- X * (G. Roelofs) and I make no claims upon them. On the contrary,
- X * my/our thanks to Igor for his contributions!`5D
- X */
- X
- X/*
- X * Revision history:
- X * 1.0-1 Mandrichenko 16-feb-1992
- X * Recognize -c option
- X * 1.0-2 Mandrichenko 17-feb-1992
- X * Do not use ASYnchroneous mode.
- X * 1.0-3 Mandrichenko 2-mar-1992
- X * Make code more standard
- X * Use lrec instead of crec -- unzip4.2p does not provide
- X * crec now.
- X * 1.1 Mandrichenko 5-mar-1992
- X * Make use of asynchronous output.
- X * Be ready to extract RMS blocks of invalid size (because diff
- X * VMS version used to compress).
- X * 1.1-1 Mandrichenko 11-mar-1992
- X * Use internal file attributes saved in pInfo to decide
- X * if the file is text. `5BGRR: temporarily disabled, since
- X * no way to override and force binary extraction`5D
- X * 1.1-2 Mandrichenko 13-mar-1992
- X * Do not restore owner/protection info if -X not specified.
- X * 1.1-3 Mandrichenko 30-may-1992
- X * Set revision date/time to creation date/time if none specifi
- Ved
- X * Take quiet flag into account.
- X * 1.1-4 Cave Newt 14-jun-1992
- X * Check zipfile for variable-length format (unzip and zipinfo)
- V.
- X *`091.2`09Mandrichenko`0921-jun-1992
- X *`09`09Use deflation/inflation for compression of extra blocks
- X *`09`09Free all allocated space
- X *`091.2-1`09Mandrichenko`0923-jun-1992
- X *`09`09Interactively select an action when file exists
- X */
- X
- X#ifdef VMS`09`09`09/* VMS only ! */
- X
- X#ifndef SYI$_VERSION
- X#define SYI$_VERSION 4096`09/* VMS 5.4 definition */
- X#endif
- X
- X#ifndef VAXC
- X`09`09`09`09/* This definition may be missed */
- Xstruct XAB `7B
- X unsigned char xab$b_cod;
- X unsigned char xab$b_bln;
- X short int xabdef$$_fill_1;
- X char *xab$l_nxt;
- X`7D;
- X
- X#endif
- X
- X#include "unzip.h"
- X#include <ctype.h>
- X#include <descrip.h>
- X#include <syidef.h>
- X
- X#define ERR(s) !((s) & 1)
- X
- X#define BUFS512 8192*2`09`09/* Must be a multiple of 512 */
- X
- X/*
- X* Local static storage
- X*/
- Xstatic struct FAB fileblk;
- Xstatic struct XABDAT dattim;
- Xstatic struct XABRDT rdt;
- Xstatic struct RAB rab;
- X
- Xstatic struct FAB *outfab = 0;
- Xstatic struct RAB *outrab = 0;
- Xstatic struct XABFHC *xabfhc = 0;
- Xstatic struct XABDAT *xabdat = 0;
- Xstatic struct XABRDT *xabrdt = 0;
- Xstatic struct XABPRO *xabpro = 0;
- Xstatic struct XABKEY *xabkey = 0;
- Xstatic struct XABALL *xaball = 0;
- Xstruct XAB *first_xab = 0L, *last_xab = 0L;
- X
- Xstatic char query = 0;
- Xstatic int text_file = 0;
- X
- Xstatic char locbuf`5BBUFS512`5D;
- Xstatic int loccnt = 0;
- Xstatic char *locptr;
- X
- Xstatic int WriteBuffer();
- Xstatic int _flush_blocks();
- Xstatic int _flush_records();
- Xstatic byte *extract_block();
- Xstatic void message();
- Xstatic int get_vms_version();
- Xstatic void free_up();
- Xstatic int replace();
- X
- Xstruct bufdsc
- X`7B
- X struct bufdsc *next;
- X byte *buf;
- X int bufcnt;
- X`7D;
- X
- Xstatic struct bufdsc b1, b2, *curbuf;
- Xstatic byte buf1`5BBUFS512`5D, buf2`5BBUFS512`5D;
- X
- X
- Xint check_format()`09`09/* return non-0 if format is variable-length */
- X`7B
- X int rtype;
- X struct FAB fab;
- X
- X fab = cc$rms_fab;
- X fab.fab$l_fna = zipfn;
- X fab.fab$b_fns = strlen(zipfn);
- X sys$open(&fab);
- X rtype = fab.fab$b_rfm;
- X sys$close(&fab);
- X
- X if (rtype == FAB$C_VAR `7C`7C rtype == FAB$C_VFC)
- X `7B
- X`09fprintf(stderr,
- X`09`09"\n Error: zipfile is in variable-length record format. Please\n
- V\
- X run \"bilf l %s\" to convert the zipfile to stream-LF\n\
- X record format. (Bilf.exe, bilf.c and make_bilf.com are included\n\
- X in the VMS UnZip source distribution.)\n\n", zipfn);
- X`09return 2;`09`09/* 2: error in zipfile */
- X `7D
- X
- X return 0;
- X`7D
- X
- X
- X#ifndef ZIPINFO
- X
- Xint create_output_file()
- X`7B`09`09`09`09/* return non-0 if sys$create failed */
- X int ierr, yr, mo, dy, hh, mm, ss;
- X char timbuf`5B24`5D;`09`09/* length = first entry in "stupid" + 1 */
- X int attr_given = 0;`09`09/* =1 if VMS attributes are present in
- X`09`09`09`09* extra_field */
- X
- X rab = cc$rms_rab;`09`09/* fill FAB & RAB with default values */
- X fileblk = cc$rms_fab;
- X
- X text_file =/* pInfo->text `7C`7C */aflag `7C`7C cflag;
- X
- X if (attr_given = find_vms_attrs())
- X `7B
- X`09text_file = 0;
- X`09if (cflag)
- X`09`7B
- X`09 printf("Cannot put VMS file %s to stdout.\n",
- X`09`09 filename);
- X`09 free_up();
- X`09 return 50;
- X`09`7D
- X `7D
- X
- X if (!attr_given)
- X `7B
- X`09outfab = &fileblk;
- X`09outfab->fab$l_xab = 0L;
- X`09if (text_file)
- X`09`7B
- X`09 outfab->fab$b_rfm = FAB$C_VAR;`09/* variable length records */
- X`09 outfab->fab$b_rat = FAB$M_CR;`09/* carriage-return carriage ctrl */
- X`09`7D
- X`09else
- X`09`7B
- X`09 outfab->fab$b_rfm = FAB$C_STMLF;`09/* stream-LF record format */
- X`09 outfab->fab$b_rat = FAB$M_CR;`09/* carriage-return carriage ctrl */
- X`09`7D
- X `7D
- X
- X if (!cflag)
- X`09outfab->fab$l_fna = filename;
- X else
- X`09outfab->fab$l_fna = "sys$output:";
- X
- X outfab->fab$b_fns = strlen(outfab->fab$l_fna);
- X
- X if ((!attr_given) `7C`7C xabdat == 0 `7C`7C xabrdt == 0)`09/* Use date/t
- Vime info
- X`09`09`09`09`09`09`09 * from zipfile if
- X`09`09`09`09`09`09`09 * no attributes given
- X`09`09`09`09`09`09`09 */
- X `7B
- X`09static char *month`5B`5D =
- X`09 `7B"JAN", "FEB", "MAR", "APR", "MAY", "JUN",
- X`09 "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"`7D;
- X
- X`09/* fixed-length string descriptor: */
- X`09struct dsc$descriptor stupid =
- X`09 `7B23, DSC$K_DTYPE_T, DSC$K_CLASS_S, timbuf`7D;
- X
- X`09yr = ((lrec.last_mod_file_date >> 9) & 0x7f) + 1980;
- X`09mo = ((lrec.last_mod_file_date >> 5) & 0x0f) - 1;
- X`09dy = (lrec.last_mod_file_date & 0x1f);
- X`09hh = (lrec.last_mod_file_time >> 11) & 0x1f;
- X`09mm = (lrec.last_mod_file_time >> 5) & 0x3f;
- X`09ss = (lrec.last_mod_file_time & 0x1f) * 2;
- X
- X`09dattim = cc$rms_xabdat;`09/* fill XABs with default values */
- X`09rdt = cc$rms_xabrdt;
- X`09sprintf(timbuf, "%02d-%3s-%04d %02d:%02d:%02d.00", dy, month`5Bmo`5D, yr,
- X`09`09hh, mm, ss);
- X`09sys$bintim(&stupid, &dattim.xab$q_cdt);
- X`09memcpy(&rdt.xab$q_rdt, &dattim.xab$q_cdt, sizeof(rdt.xab$q_rdt));
- X
- X`09if ((!attr_given) `7C`7C xabdat == 0L)
- X`09`7B
- X`09 dattim.xab$l_nxt = outfab->fab$l_xab;
- X`09 outfab->fab$l_xab = &dattim;
- X`09`7D
- X `7D
- X
- X outfab->fab$w_ifi = 0;`09/* Clear IFI. It may be nonzero after ZIP */
- X
- X ierr = sys$create(outfab);
- X if (ierr == RMS$_FEX)
- X`09ierr = replace();
- X
- X if (ierr == 0)`09`09/* Canceled */
- X`09return free_up(), 1;
- X
- X if (ERR(ierr))
- X `7B
- X`09char buf`5B256`5D;
- X
- X`09sprintf(buf, "`5B Cannot create output file %s `5D\n", filename);
- X`09message(buf, ierr);
- X`09message("", outfab->fab$l_stv);
- X`09free_up();
- X`09return (1);
- X `7D
- X
- X if (!text_file && !cflag)`09/* Do not reopen text files and stdout
- X`09`09`09`09* Just open them in right mode */
- X `7B
- X`09/*
- X`09* Reopen file for Block I/O with no XABs.
- X`09*/
- X`09if ((ierr = sys$close(outfab)) != RMS$_NORMAL)
- X`09`7B
- X#ifdef DEBUG
- X`09 message("`5B create_output_file: sys$close failed `5D\n", ierr);
- X`09 message("", outfab->fab$l_stv);
- X#endif
- X`09 fprintf(stderr, "Can't create output file: %s\n", filename);
- X`09 free_up();
- X`09 return (1);
- X`09`7D
- X
- X
- X`09outfab->fab$b_fac = FAB$M_BIO `7C FAB$M_PUT;`09/* Get ready for block
- X`09`09`09`09`09`09`09 * output */
- X`09outfab->fab$l_xab = 0L;`09/* Unlink all XABs */
- X
- X`09if ((ierr = sys$open(outfab)) != RMS$_NORMAL)
- X`09`7B
- X`09 char buf`5B256`5D;
- X
- X`09 sprintf(buf, "`5B Cannot open output file %s `5D\n", filename);
- X`09 message(buf, ierr);
- X`09 message("", outfab->fab$l_stv);
- X`09 free_up();
- X`09 return (1);
- X`09`7D
- X `7D
- X
- X outrab = &rab;
- X rab.rab$l_fab = outfab;
- X if (!text_file) rab.rab$l_rop `7C= RAB$M_BIO;
- X if (!text_file) rab.rab$l_rop `7C= RAB$M_ASY;
- X rab.rab$b_rac = RAB$C_SEQ;
- X
- X if ((ierr = sys$connect(outrab)) != RMS$_NORMAL)
- X `7B
- X#ifdef DEBUG
- X`09message("create_output_file: sys$connect failed.\n", ierr);
- X`09message("", outfab->fab$l_stv);
- X#endif
- X`09fprintf(stderr, "Can't create output file: %s\n", filename);
- X`09free_up();
- X`09return (1);
- X `7D
- X
- X locptr = &locbuf`5B0`5D;
- X loccnt = 0;
- X
- X b1.buf = &buf1`5B0`5D;
- X b1.bufcnt = 0;
- X b1.next = &b2;
- X b2.buf = &buf2`5B0`5D;
- X b2.bufcnt = 0;
- X b2.next = &b1;
- X curbuf = &b1;
- X
- X return (0);
- X`7D
- X
- Xstatic int replace()
- X`7B`09`09`09`09/*
- X`09`09`09`09*`09File exists. Inquire user about futher action.
- X`09`09`09`09*/
- X char answ`5B10`5D;
- X struct NAM nam;
- X int ierr;
- X
- X if (query == 0)
- X `7B
- X`09do
- X`09`7B
- X`09 fprintf(stderr,
- X`09`09 "Replace %s : `5Bo`5Dverwrite, new `5Bv`5Dersion or `5Bc`5Dancel (
- VO,V,C - all) ? ",
- X`09`09 filename);
- X`09 fflush(stderr);
- X`09`7D while (fgets(answ, 9, stderr) == NULL && !isalpha(answ`5B0`5D)
- X`09`09 && tolower(answ`5B0`5D) != 'o'
- X`09`09 && tolower(answ`5B0`5D) != 'v'
- X`09`09 && tolower(answ`5B0`5D) != 'c');
- X
- X`09if (isupper(answ`5B0`5D))
- X`09 query = answ`5B0`5D = tolower(answ`5B0`5D);
- X `7D
- X else
- X`09answ`5B0`5D = query;
- X
- X switch (answ`5B0`5D)
- X `7B
- X`09case 'c':
- X`09 ierr = 0;
- X`09 break;
- X`09case 'v':
- X`09 nam = cc$rms_nam;
- X`09 nam.nam$l_rsa = filename;
- +-+-+-+-+-+-+-+- END OF PART 12 +-+-+-+-+-+-+-+-
-