亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gzlog.c

?? StormLib是對MPQ文件進行處理的庫 MPQ是暴雪公司的私有的一種壓縮格式
?? C
字號:
/* * gzlog.c * Copyright (C) 2004 Mark Adler * For conditions of distribution and use, see copyright notice in gzlog.h * version 1.0, 26 Nov 2004 * */#include <string.h>             /* memcmp() */#include <stdlib.h>             /* malloc(), free(), NULL */#include <sys/types.h>          /* size_t, off_t */#include <unistd.h>             /* read(), close(), sleep(), ftruncate(), */                                /* lseek() */#include <fcntl.h>              /* open() */#include <sys/file.h>           /* flock() */#include "zlib.h"               /* deflateInit2(), deflate(), deflateEnd() */#include "gzlog.h"              /* interface */#define local static/* log object structure */typedef struct {    int id;                 /* object identifier */    int fd;                 /* log file descriptor */    off_t extra;            /* offset of extra "ap" subfield */    off_t mark_off;         /* offset of marked data */    off_t last_off;         /* offset of last block */    unsigned long crc;      /* uncompressed crc */    unsigned long len;      /* uncompressed length (modulo 2^32) */    unsigned stored;        /* length of current stored block */} gz_log;#define GZLOGID 19334       /* gz_log object identifier */#define LOCK_RETRY 1            /* retry lock once a second */#define LOCK_PATIENCE 1200      /* try about twenty minutes before forcing *//* acquire a lock on a file */local int lock(int fd){    int patience;    /* try to lock every LOCK_RETRY seconds for LOCK_PATIENCE seconds */    patience = LOCK_PATIENCE;    do {        if (flock(fd, LOCK_EX + LOCK_NB) == 0)            return 0;        (void)sleep(LOCK_RETRY);        patience -= LOCK_RETRY;    } while (patience > 0);    /* we've run out of patience -- give up */    return -1;}/* release lock */local void unlock(int fd){    (void)flock(fd, LOCK_UN);}/* release a log object */local void log_clean(gz_log *log){    unlock(log->fd);    (void)close(log->fd);    free(log);}/* read an unsigned long from a byte buffer little-endian */local unsigned long make_ulg(unsigned char *buf){    int n;    unsigned long val;    val = (unsigned long)(*buf++);    for (n = 8; n < 32; n += 8)        val += (unsigned long)(*buf++) << n;    return val;}/* read an off_t from a byte buffer little-endian */local off_t make_off(unsigned char *buf){    int n;    off_t val;    val = (off_t)(*buf++);    for (n = 8; n < 64; n += 8)        val += (off_t)(*buf++) << n;    return val;}/* write an unsigned long little-endian to byte buffer */local void dice_ulg(unsigned long val, unsigned char *buf){    int n;    for (n = 0; n < 4; n++) {        *buf++ = val & 0xff;        val >>= 8;    }}/* write an off_t little-endian to byte buffer */local void dice_off(off_t val, unsigned char *buf){    int n;    for (n = 0; n < 8; n++) {        *buf++ = val & 0xff;        val >>= 8;    }}/* initial, empty gzip file for appending */local char empty_gz[] = {    0x1f, 0x8b,                 /* magic gzip id */    8,                          /* compression method is deflate */    4,                          /* there is an extra field */    0, 0, 0, 0,                 /* no modification time provided */    0, 0xff,                    /* no extra flags, no OS */    20, 0, 'a', 'p', 16, 0,     /* extra field with "ap" subfield */    32, 0, 0, 0, 0, 0, 0, 0,    /* offset of uncompressed data */    32, 0, 0, 0, 0, 0, 0, 0,    /* offset of last block */    1, 0, 0, 0xff, 0xff,        /* empty stored block (last) */    0, 0, 0, 0,                 /* crc */    0, 0, 0, 0                  /* uncompressed length */};/* initialize a log object with locking */void *gzlog_open(char *path){    unsigned xlen;    unsigned char temp[20];    unsigned sub_len;    int good;    gz_log *log;    /* allocate log structure */    log = malloc(sizeof(gz_log));    if (log == NULL)        return NULL;    log->id = GZLOGID;    /* open file, creating it if necessary, and locking it */    log->fd = open(path, O_RDWR | O_CREAT, 0600);    if (log->fd < 0) {        free(log);        return NULL;    }    if (lock(log->fd)) {        close(log->fd);        free(log);        return NULL;    }    /* if file is empty, write new gzip stream */    if (lseek(log->fd, 0, SEEK_END) == 0) {        if (write(log->fd, empty_gz, sizeof(empty_gz)) != sizeof(empty_gz)) {            log_clean(log);            return NULL;        }    }    /* check gzip header */    (void)lseek(log->fd, 0, SEEK_SET);    if (read(log->fd, temp, 12) != 12 || temp[0] != 0x1f ||        temp[1] != 0x8b || temp[2] != 8 || (temp[3] & 4) == 0) {        log_clean(log);        return NULL;    }    /* process extra field to find "ap" sub-field */    xlen = temp[10] + (temp[11] << 8);    good = 0;    while (xlen) {        if (xlen < 4 || read(log->fd, temp, 4) != 4)            break;        sub_len = temp[2];        sub_len += temp[3] << 8;        xlen -= 4;        if (memcmp(temp, "ap", 2) == 0 && sub_len == 16) {            good = 1;            break;        }        if (xlen < sub_len)            break;        (void)lseek(log->fd, sub_len, SEEK_CUR);        xlen -= sub_len;    }    if (!good) {        log_clean(log);        return NULL;    }    /* read in "ap" sub-field */    log->extra = lseek(log->fd, 0, SEEK_CUR);    if (read(log->fd, temp, 16) != 16) {        log_clean(log);        return NULL;    }    log->mark_off = make_off(temp);    log->last_off = make_off(temp + 8);    /* get crc, length of gzip file */    (void)lseek(log->fd, log->last_off, SEEK_SET);    if (read(log->fd, temp, 13) != 13 ||        memcmp(temp, "\001\000\000\377\377", 5) != 0) {        log_clean(log);        return NULL;    }    log->crc = make_ulg(temp + 5);    log->len = make_ulg(temp + 9);    /* set up to write over empty last block */    (void)lseek(log->fd, log->last_off + 5, SEEK_SET);    log->stored = 0;    return (void *)log;}/* maximum amount to put in a stored block before starting a new one */#define MAX_BLOCK 16384/* write a block to a log object */int gzlog_write(void *obj, char *data, size_t len){    size_t some;    unsigned char temp[5];    gz_log *log;    /* check object */    log = (gz_log *)obj;    if (log == NULL || log->id != GZLOGID)        return 1;    /* write stored blocks until all of the input is written */    do {        some = MAX_BLOCK - log->stored;        if (some > len)            some = len;        if (write(log->fd, data, some) != some)            return 1;        log->crc = crc32(log->crc, data, some);        log->len += some;        len -= some;        data += some;        log->stored += some;        /* if the stored block is full, end it and start another */        if (log->stored == MAX_BLOCK) {            (void)lseek(log->fd, log->last_off, SEEK_SET);            temp[0] = 0;            dice_ulg(log->stored + ((unsigned long)(~log->stored) << 16),                     temp + 1);            if (write(log->fd, temp, 5) != 5)                return 1;            log->last_off = lseek(log->fd, log->stored, SEEK_CUR);            (void)lseek(log->fd, 5, SEEK_CUR);            log->stored = 0;        }    } while (len);    return 0;}/* recompress the remaining stored deflate data in place */local int recomp(gz_log *log){    z_stream strm;    size_t len, max;    unsigned char *in;    unsigned char *out;    unsigned char temp[16];    /* allocate space and read it all in (it's around 1 MB) */    len = log->last_off - log->mark_off;    max = len + (len >> 12) + (len >> 14) + 11;    out = malloc(max);    if (out == NULL)        return 1;    in = malloc(len);    if (in == NULL) {        free(out);        return 1;    }    (void)lseek(log->fd, log->mark_off, SEEK_SET);    if (read(log->fd, in, len) != len) {        free(in);        free(out);        return 1;    }    /* recompress in memory, decoding stored data as we go */    /* note: this assumes that unsigned is four bytes or more */    /*       consider not making that assumption */    strm.zalloc = Z_NULL;    strm.zfree = Z_NULL;    strm.opaque = Z_NULL;    if (deflateInit2(&strm, Z_BEST_COMPRESSION, Z_DEFLATED, -15, 8,        Z_DEFAULT_STRATEGY) != Z_OK) {        free(in);        free(out);        return 1;    }    strm.next_in = in;    strm.avail_out = max;    strm.next_out = out;    while (len >= 5) {        if (strm.next_in[0] != 0)            break;        strm.avail_in = strm.next_in[1] + (strm.next_in[2] << 8);        strm.next_in += 5;        len -= 5;        if (strm.avail_in != 0) {            if (len < strm.avail_in)                break;            len -= strm.avail_in;            (void)deflate(&strm, Z_NO_FLUSH);            if (strm.avail_in != 0 || strm.avail_out == 0)                break;        }    }    (void)deflate(&strm, Z_SYNC_FLUSH);    (void)deflateEnd(&strm);    free(in);    if (len != 0 || strm.avail_out == 0) {        free(out);        return 1;    }    /* overwrite stored data with compressed data */    (void)lseek(log->fd, log->mark_off, SEEK_SET);    len = max - strm.avail_out;    if (write(log->fd, out, len) != len) {        free(out);        return 1;    }    free(out);    /* write last empty block, crc, and length */    log->mark_off = log->last_off = lseek(log->fd, 0, SEEK_CUR);    temp[0] = 1;    dice_ulg(0xffffL << 16, temp + 1);    dice_ulg(log->crc, temp + 5);    dice_ulg(log->len, temp + 9);    if (write(log->fd, temp, 13) != 13)        return 1;    /* truncate file to discard remaining stored data and old trailer */    ftruncate(log->fd, lseek(log->fd, 0, SEEK_CUR));    /* update extra field to point to new last empty block */    (void)lseek(log->fd, log->extra, SEEK_SET);    dice_off(log->mark_off, temp);    dice_off(log->last_off, temp + 8);    if (write(log->fd, temp, 16) != 16)        return 1;    return 0;}/* maximum accumulation of stored blocks before compressing */#define MAX_STORED 1048576/* close log object */int gzlog_close(void *obj){    unsigned char temp[8];    gz_log *log;    /* check object */    log = (gz_log *)obj;    if (log == NULL || log->id != GZLOGID)        return 1;    /* go to start of most recent block being written */    (void)lseek(log->fd, log->last_off, SEEK_SET);    /* if some stuff was put there, update block */    if (log->stored) {        temp[0] = 0;        dice_ulg(log->stored + ((unsigned long)(~log->stored) << 16),                 temp + 1);        if (write(log->fd, temp, 5) != 5)            return 1;        log->last_off = lseek(log->fd, log->stored, SEEK_CUR);    }    /* write last block (empty) */    if (write(log->fd, "\001\000\000\377\377", 5) != 5)        return 1;    /* write updated crc and uncompressed length */    dice_ulg(log->crc, temp);    dice_ulg(log->len, temp + 4);    if (write(log->fd, temp, 8) != 8)        return 1;    /* put offset of that last block in gzip extra block */    (void)lseek(log->fd, log->extra + 8, SEEK_SET);    dice_off(log->last_off, temp);    if (write(log->fd, temp, 8) != 8)        return 1;    /* if more than 1 MB stored, then time to compress it */    if (log->last_off - log->mark_off > MAX_STORED) {        if (recomp(log))            return 1;    }    /* unlock and close file */    log_clean(log);    return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆国产自产在线观看| 91蜜桃在线免费视频| 国产剧情av麻豆香蕉精品| 91在线观看下载| 欧美一区二区三区免费视频| 久久久久99精品一区| 亚洲在线视频一区| 国产成人精品午夜视频免费 | 伊人婷婷欧美激情| 久久99精品久久久| 欧美日韩在线播放| 国产精品久久久久影视| 日本vs亚洲vs韩国一区三区 | 中文字幕欧美区| 日本亚洲免费观看| 欧美影院一区二区三区| 中文字幕一区二区三区在线不卡 | 国产a精品视频| 日韩欧美一级片| 婷婷六月综合亚洲| 色欧美片视频在线观看| 中文字幕av不卡| 国产一区二区网址| 日韩午夜在线影院| 五月婷婷综合激情| 欧美三级中文字| 一区二区三区四区不卡视频| 99国产欧美另类久久久精品| 久久久国产精品不卡| 激情综合色播激情啊| 欧美一区二区三区公司| 日产欧产美韩系列久久99| 欧洲日韩一区二区三区| 亚洲精品自拍动漫在线| 91浏览器在线视频| 玉足女爽爽91| 99re在线精品| 亚洲男帅同性gay1069| 99精品久久只有精品| 国产精品久久福利| 91国内精品野花午夜精品| 亚洲黄色录像片| 欧美色欧美亚洲另类二区| 五月天亚洲婷婷| 欧美一区二区成人| 日本成人中文字幕| 日韩欧美一二三四区| 免费人成网站在线观看欧美高清| 欧美日本不卡视频| 视频一区在线视频| 欧美tickling挠脚心丨vk| 国产乱子伦视频一区二区三区| 日韩一区二区在线看| 久久不见久久见免费视频1| 精品久久久久久久久久久院品网| 国模一区二区三区白浆| 国产欧美中文在线| a在线欧美一区| 性欧美疯狂xxxxbbbb| 日韩一区二区高清| 成人中文字幕合集| 亚洲精品中文字幕乱码三区| 欧美日韩成人在线| 黄页视频在线91| 亚洲视频在线观看三级| 91福利社在线观看| 久久99久久精品| 亚洲欧美自拍偷拍色图| 欧美久久久久久久久久| 国产一区二区三区不卡在线观看 | 久久久久久日产精品| 色先锋资源久久综合| 青青草国产成人av片免费| 日本一区二区视频在线观看| 在线一区二区三区四区五区| 六月丁香综合在线视频| 亚洲丝袜制服诱惑| 欧美tk丨vk视频| 欧美吻胸吃奶大尺度电影| 国内精品国产成人国产三级粉色| 亚洲精品福利视频网站| 欧美精品一区二区三区蜜桃| 91麻豆精品在线观看| 国产一区二区三区不卡在线观看| 亚洲影视在线观看| 国产女主播一区| 日韩免费高清av| 色婷婷精品久久二区二区蜜臀av | 在线看日韩精品电影| 国产一区二区三区四区五区入口| 国产精品视频yy9299一区| 欧美精品自拍偷拍| 91老司机福利 在线| 久88久久88久久久| 性感美女极品91精品| 中文字幕精品一区二区精品绿巨人| 欧美久久一区二区| 91官网在线观看| 99国产一区二区三精品乱码| 国产制服丝袜一区| 青青草原综合久久大伊人精品 | 欧美在线视频你懂得| 丰满放荡岳乱妇91ww| 久久成人av少妇免费| 免费在线观看一区| 午夜精品视频在线观看| 一区二区三区中文在线观看| 日本一区二区成人| 国产欧美中文在线| 欧美国产日韩精品免费观看| 精品福利二区三区| 337p粉嫩大胆色噜噜噜噜亚洲 | 精品一区二区三区影院在线午夜| 亚洲www啪成人一区二区麻豆| 亚洲码国产岛国毛片在线| 国产精品久久久久久久久晋中| 国产欧美精品一区二区三区四区| 精品国产一区二区三区四区四 | 欧美日韩电影在线| 欧美人狂配大交3d怪物一区| 欧美色视频在线观看| 欧美视频第二页| 欧美日韩国产首页| 正在播放亚洲一区| 欧美一区二区三区不卡| 日韩视频123| 久久亚洲春色中文字幕久久久| 欧美精品一区二区三区蜜桃视频| 精品国产伦一区二区三区观看方式| 欧美精品一区二区三区视频| 久久综合一区二区| 亚洲国产成人自拍| 亚洲日本va午夜在线影院| 亚洲摸摸操操av| 亚洲成人精品一区| 美女在线视频一区| 国产成人免费网站| 一本到一区二区三区| 欧美无乱码久久久免费午夜一区 | 国产午夜精品久久| 亚洲人精品午夜| 亚洲1区2区3区4区| 国产在线播放一区| www.66久久| 日韩一区二区高清| 中文字幕成人av| 午夜精品久久久久久久| 久草中文综合在线| 成+人+亚洲+综合天堂| 欧美三片在线视频观看| 2021国产精品久久精品| 亚洲色图欧美在线| 蜜桃久久久久久久| 99久久精品久久久久久清纯| 欧美三级视频在线播放| 久久久美女艺术照精彩视频福利播放| 国产女人18毛片水真多成人如厕| 一区二区三区欧美视频| 激情综合一区二区三区| 97久久超碰国产精品| 欧美一区二区三区白人| 国产精品无遮挡| 奇米精品一区二区三区四区| 国产成人免费视频网站 | 欧美性色综合网| 久久综合久久鬼色中文字| 亚洲精品国产精华液| 国产尤物一区二区在线| 在线观看亚洲a| 日本一区二区三区久久久久久久久不 | 国产精品国产a级| 裸体一区二区三区| 在线观看免费视频综合| 亚洲国产精品99久久久久久久久| 日韩经典中文字幕一区| 91小视频在线| 国产免费成人在线视频| 精品一区二区综合| 欧美精品少妇一区二区三区| 日韩码欧中文字| 国产99精品国产| 精品第一国产综合精品aⅴ| 无码av中文一区二区三区桃花岛| 成人免费三级在线| 久久一区二区三区国产精品| 丝袜亚洲另类欧美综合| 在线观看91视频| 亚洲免费在线看| 一本色道久久综合亚洲精品按摩| 久久精品人人爽人人爽| 狠狠色丁香久久婷婷综合丁香| 欧美欧美欧美欧美首页| 亚洲精品高清在线| 91免费小视频| 亚洲天堂精品在线观看| 成人黄色a**站在线观看| 欧美激情一区二区三区不卡 | 亚洲午夜成aⅴ人片| 在线视频国产一区| 亚洲综合免费观看高清完整版 |