静态链接

main中只需包含

#include "extmem.h"


extmem.h中写如下内容,主要是结构体定义和函数声明。


/*

 * extmem.h
 * Zhaonian Zou
 * Harbin Institute of Technology
 * Jun 22, 2011
 */


#ifndef EXTMEM_H
#define EXTMEM_H


#define BLOCK_AVAILABLE 0
#define BLOCK_UNAVAILABLE 1
#include <string.h>
typedef struct tagBuffer {
    unsigned long numIO; /* Number of IO's*/
    size_t bufSize; /* Buffer size*/
    size_t blkSize; /* Block size */
    size_t numAllBlk; /* Number of blocks that can be kept in the buffer */
    size_t numFreeBlk; /* Number of available blocks in the buffer */
    unsigned char *data; /* Starting address of the buffer */
} Buffer;


Buffer *initBuffer(size_t bufSize, size_t blkSize, Buffer *buf)
{
    int i;


    buf->numIO = 0;
    buf->bufSize = bufSize;
    buf->blkSize = blkSize;
    buf->numAllBlk = bufSize / (blkSize + 1);
    buf->numFreeBlk = buf->numAllBlk;
    buf->data = (unsigned char*)malloc(bufSize * sizeof(unsigned char));


    if (!buf->data)
    {
        perror("Buffer Initialization Failed!\n");
        return NULL;
    }


    memset(buf->data, 0, bufSize * sizeof(unsigned char));
    return buf;
}


void freeBuffer(Buffer *buf)
{
    free(buf->data);
}


unsigned char *getNewBlockInBuffer(Buffer *buf)
{
    unsigned char *blkPtr;


    if (buf->numFreeBlk == 0)
    {
        perror("Buffer is full!\n");
        return NULL;
    }


    blkPtr = buf->data;


    while (blkPtr < buf->data + (buf->blkSize + 1) * buf->numAllBlk)
    {
        if (*blkPtr == BLOCK_AVAILABLE)
            break;
        else
            blkPtr += buf->blkSize + 1;
    }


    *blkPtr = BLOCK_UNAVAILABLE;
    buf->numFreeBlk--;
    return blkPtr + 1;
}


void freeBlockInBuffer(unsigned char *blk, Buffer *buf)
{
    *(blk - 1) = BLOCK_AVAILABLE;
    buf->numFreeBlk++;
}


int dropBlockOnDisk(unsigned int addr)
{
    char filename[40];


    sprintf(filename, "%d.blk", addr);


    if (remove(filename) == -1)
    {
        perror("Dropping Block Fails!\n");
        return -1;
    }


    return 0;
}


unsigned char *readBlockFromDisk(unsigned int addr, Buffer *buf)
{
    char filename[40];
    unsigned char *blkPtr, *bytePtr;
    unsigned char ch;


    if (buf->numFreeBlk == 0)
    {
        perror("Buffer Overflows!\n");
        return NULL;
    }


    blkPtr = buf->data;


    while (blkPtr < buf->data + (buf->blkSize + 1) * buf->numAllBlk)
    {
        if (*blkPtr == BLOCK_AVAILABLE)
            break;
        else
            blkPtr += buf->blkSize + 1;
    }


    sprintf(filename, "%d.blk", addr);
    FILE *fp = fopen(filename, "rb");


    if (!fp)
    {
        //perror("Reading Block Failed!\n");
        return NULL;
    }


    *blkPtr = BLOCK_UNAVAILABLE;
    blkPtr++;
    bytePtr = blkPtr;
    char tc;
    while ((ch = fgetc(fp)) != EOF && bytePtr < blkPtr + buf->blkSize)
    {
        *bytePtr = ch;
        //printf("%x",*bytePtr);
        bytePtr++;
        tc=ch;
    }


    fclose(fp);
    buf->numFreeBlk--;
    buf->numIO++;
    return blkPtr;
}


int writeBlockToDisk(unsigned char *blkPtr, unsigned int addr, Buffer *buf)
{
    char filename[40];
    unsigned char *bytePtr;


    sprintf(filename, "%d.blk", addr);
    FILE *fp = fopen(filename, "wb");


    if (!fp)
    {
        perror("Writing Block Failed!\n");
        return -1;
    }


    for (bytePtr = blkPtr; bytePtr < blkPtr + buf->blkSize; bytePtr++)
        fputc((int)(*bytePtr), fp);


    fclose(fp);
    *(blkPtr - 1) = BLOCK_AVAILABLE;
    buf->numFreeBlk++;
    buf->numIO++;
    return 0;
}


#endif // EXTMEM_H
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值