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