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

📄 qdos.c

📁 给出了 zip 压缩算法的完整实现过程。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  Copyright (c) 1990-2005 Info-ZIP.  All rights reserved.  See the accompanying file LICENSE, version 2004-May-22 or later  (the contents of which are also included in zip.h) for terms of use.  If, for some reason, both of these files are missing, the Info-ZIP license  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html*//* * Yes this  file is necessary; the QDOS file system is the most * ludicrous known to man (even more so than VMS!). */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <fcntl.h>#include <dirent.h>#include <unistd.h>#include "zip.h"#include "crypt.h"#include "ttyio.h"#ifdef QDOS# include <qdos.h>#if CRYPTchar *getp(m, p, n)    ZCONST char *m;              /* prompt for password */    char *p;                    /* return value: line input */    int n;                      /* bytes available in p[] */{    int c;                      /* one-byte buffer for read() to use */    int i;                      /* number of characters input */    char *w;                    /* warning on retry */    /* get password */    w = "";    sd_cure(getchid(0), -1);    /* enable cursor */    do {        fputs(w, stderr);       /* warning if back again */        fputs(m, stderr);       /* display prompt and flush */        fflush(stderr);        i = 0;        do {            c = getch();            if (c == 0xc2) {                if (i > 0) {                    i--; /* the `del' keys works */                    fputs("\b \b", stderr);                }            }            else if (i < n) {                p[i++] = c;     /* truncate past n */                if(c != '\n') putc('*', stderr);            }        } while (c != '\n');        putc('\n', stderr);  fflush(stderr);        w = "(line too long--try again)\n";    } while (p[i-1] != '\n');    p[i-1] = 0;                 /* terminate at newline */    sd_curs(getchid(0), -1);    /* suppress cursor */    return p;                   /* return pointer to password */} /* end function getp() */#endif /* CRYPT */#define __attribute__(p)int newname(char *, int, int);#else /* !QDOS */#define QDOS_FLMAX 36short qlflag = 0;struct qdirect  {    long            d_length __attribute__ ((packed));  /* file length */    unsigned char   d_access __attribute__ ((packed));  /* file access type */    unsigned char   d_type __attribute__ ((packed));    /* file type */    long            d_datalen __attribute__ ((packed)); /* data length */    long            d_reserved __attribute__ ((packed));/* Unused */    short           d_szname __attribute__ ((packed));  /* size of name */    char            d_name[QDOS_FLMAX] __attribute__ ((packed));/* name area */    long            d_update __attribute__ ((packed));  /* last update */    long            d_refdate __attribute__ ((packed));    long            d_backup __attribute__ ((packed));   /* EOD */    } ;#endif /* ?QDOS */#define SHORTID 0x4afb          /* in big-endian order !! */#define LONGID  "QDOS02"#define EXTRALEN (sizeof(struct qdirect) + 8)typedef struct{    unsigned short shortid __attribute__ ((packed));    struct    {        unsigned char lo __attribute__ ((packed));        unsigned char hi __attribute__ ((packed));    } len __attribute__ ((packed));    char        longid[8] __attribute__ ((packed));    struct      qdirect     header __attribute__ ((packed));} qdosextra;#ifdef USE_EF_UT_TIMElocal int GetExtraTime(struct zlist far *z, iztimes *z_utim, unsigned ut_flg);#endif#ifdef QDOS#define rev_short(x) (x)#define rev_long(x) (x)char _prog_name[] = "zip";char _copyright[] = "(c) Info-ZIP Group";long _stack = 16*1024;char *  _endmsg = NULL;extern void consetup_title(chanid_t,struct WINDOWDEF *);void (*_consetup)(chanid_t,struct WINDOWDEF *) = consetup_title;struct WINDOWDEF _condetails ={    2,    1,    0,    7,    500,    220,    2,    30};extern short qlwait;extern short dtype;#define CHECKDIR(p1) (((p1).d_type == dtype) && (((p1).d_length % 64) == 0))char * stpcpy (char *d, ZCONST char *s){    while(*d++ = *s++)        ; /* Null loop */    return d-1;}static jobid_t chowner(chanid_t chan){    extern char *_sys_var;    char *scht;    long *cdb;    long jid;    scht = *((char **)(_sys_var + 0x78));    cdb = *(long **)((long *)scht  + (chan & 0xffff));    jid = *(cdb + 2);    return jid;}void QDOSexit(void){    jobid_t me,you;    me = getpid();    you = chowner(getchid(0));    if((me == you) && ((qlflag & 4) == 0))    {        if(isatty(0) && isatty(2) && qlwait)        {            char c = 0;            fputs("Press a key to exit", stderr);            if((io_fbyte(getchid(0), qlwait, &c) == 0) && c == 27)            {                io_fbyte(getchid(0), -1, &c);            }        }    }    exit(ZE_OK);}/* Access seems to be *always* broken in c68 *//* Not accurate, just works */int access (char *f, int mode){    struct stat st;    int fd;    if((fd = stat(f, &st)) == 0)    {        switch(fd)        {        case F_OK:            break;        case R_OK:            fd = (st.st_mode & 0444) == 0;            break;        case W_OK:            fd = (st.st_mode & 0222) == 0;            break;        case X_OK:            fd = (st.st_mode & 0111) == 0;            break;        default:            fd = -1;            break;        }    }    return fd;}/* Fixup a Mickey Mouse file naming system */char * Unix2ql (char *qlname, char **dot){    static char path[64];    char name[64];    char *q, *r, *s;    strcpy(name, qlname);    if(*name == '~')    {        r = name+1;        getcwd(path, sizeof(path));        q = path + strlen(path);        if(*(q-1) != '_')        {            *q++ = '_';        }    }    else    {        q = path;        r = name;    }    if(*r == '/')    {        r++;    }    strcpy(q, r);    while (*q)    {        if(*q == '/' || *q == '.')        {            if(*q == '.' && dot)            {                *dot = name + (q - path);            }            *q = '_';        }        q++;    }    return path;}#if 0                                 /* Not used in ZIP */GuessAltName(char *name, char *dot){    if(dot)    {        *dot = '.';    }    else    {        if((dot = strrchr(name, '_')))        {            *dot = '.';        }    }}#endif /* 0 */short devlen(char *p){    char defpath[40];    short deflen = 0, ok = 0;    getcwd(defpath, sizeof(defpath));    deflen = strlen(defpath);    if(deflen)    {        if(strnicmp(p, defpath, deflen) == 0)        {            ok = 1;        }    }    if(!ok)    {        if(isdirdev(p))        {            deflen = 5;        }        else        {            deflen = 0;        }    }    return deflen;}char * ql2Unix (char *qlname){    struct stat st;    int sts;    char *p, *r, *s, *ldp;    char *pnam = NULL;    static char path[64];    short  deflen;    char name[64];    strcpy(name, qlname);    strcpy(path, name);    deflen = devlen(qlname);    p = name + deflen;    pnam = path + deflen;    if(s = strrchr(p, '_'))    {        *s = 0;        sts = stat(name, &st);        if(deflen && sts ==0 && (st.st_mode & S_IFDIR))        {            *(path+(s-name)) = '/';        }        else        {            *(path+(s-name)) = '.';        }    }    ldp = p;    for(r = p; *r; r++)    {        if(r != ldp && *r == '_')        {            *r = 0;            if(deflen)            {                sts = stat(name, &st);            }            else                sts = -1;            if(sts ==0 && (st.st_mode & S_IFDIR))            {                *(path+(r-name)) = '/';                ldp = r + 1;            }            else            {                *(path+(r-name)) = '_';            }            *r = '_';        }    }    return pnam;}char *LastDir(char *ws){    char *p;    char *q = ws;    struct stat s;    for(p = ws; *p; p++)    {        if(p != ws && *p == '_')        {            char c;            p++;            c = *p;            *p = 0;            if(stat(ws, &s) == 0 && S_ISDIR(s.st_mode))            {                q = p;            }            *p = c;        }    }    return q;}# ifndef UTILstatic int add_dir(char * dnam){    int e = ZE_OK;    char *p;    short nlen;    nlen = strlen(dnam);    if(p = malloc(nlen + 2))    {        strncpy (p, dnam, nlen);        if(*(p+nlen) != '_')        {            *(p+nlen) = '_';            *(p+nlen+1) = '\0';        }        if ((e = newname(p, 1, 0)) != ZE_OK)        {                free(p);        }    }    else    {        e = ZE_MEM;    }    return e;}int qlwild (char *dnam, short dorecurse, short l){    static char match[40] = {0};    static char ddev[8] =  {0};    static short nc;    static short llen;    static char base[40];

⌨️ 快捷键说明

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