#define MOD 255
#define MAXN 2400
#define SIZE 65536
#define LEN 12
#define BLOCK_SIZE (LEN<<1)
#define GROUP_SIZE (BLOCK_SIZE*((MAXN/MOD)+1))
#define DATA_AREA_SIZE (BLOCK_SIZE*MAXN)
#define MAP_SIZE (MOD+1)
extern void memread(unsigned char str[], int pos, int len);
extern void memwrite(unsigned char str[], int pos, int len);
unsigned int hash(unsigned char *str)
{
unsigned int hash = 5381;
int c;
while (c = *str++)
{
hash = (((hash << 5) + hash) + c) % MOD;
}
return hash % MOD;
}
int str_len(unsigned char * str){
unsigned char len = 0;
for(;str[len]!=0 && len<=LEN ;len++);
return len;
}
int str_cmp(unsigned char arr[], unsigned char arr2[])
{
register int i = 0;
while (arr[i])
{
if (arr[i] != arr2[i++]) return 0;
}
if (arr2[i]) return 0;
return 1;
}
void str_cpy(unsigned char src[],unsigned char dst[],int len){
register int i;
for(i=0;i<len;i++){
//if(src[i]==0xff) dst[i]=0;
//else
dst[i]=src[i];
//printf("%x --> %x\n",src[i],dst[i]);
}
dst[i]=0;
//printf("%s -> %s\n",src,dst);
}
void init_mem(){
unsigned char ch = 0;
for(register int i=0;i<SIZE;i++){
memwrite(&ch,i,1);
}
}
bool init(int N)
{
init_mem();
return true;
}
int put_mem(int gid,unsigned char buf[], unsigned char key_in[], unsigned char value_in[]){
//unsigned char buf[GROUP_SIZE];
int base = gid*GROUP_SIZE;
memread(buf,base,GROUP_SIZE);
for(int i=0;i<GROUP_SIZE;i+=BLOCK_SIZE){
if(buf[i]==0){
//int len = str_len(key_in);
memwrite(key_in,base+i,LEN);
//len = str_len(value_in);
memwrite(value_in,base+i+LEN,LEN);
//dumpGroup(gid);
return 1;
}
}
return 0;
}
int get_mem_value(int gid,unsigned char buf[], unsigned char key_in[], unsigned char value_out[],int copy){
//unsigned char buf[GROUP_SIZE];
int base = gid*GROUP_SIZE;
memread(buf,base,GROUP_SIZE);
for(int i=0;i<GROUP_SIZE;i+=BLOCK_SIZE){
if(str_cmp(key_in,&buf[i])){
if(copy)
str_cpy(&buf[i+LEN],value_out,LEN);
return 1;
}
}
return 0;
}
int get_mem_key(int gid,unsigned char buf[], unsigned char value_in[], unsigned char key_out[],int copy){
//unsigned char buf[GROUP_SIZE];
int base = gid*GROUP_SIZE;
memread(buf,base,GROUP_SIZE);
for(int i=0;i<GROUP_SIZE;i+=BLOCK_SIZE){
if(str_cmp(value_in,&buf[i+LEN])){
if(copy)
str_cpy(&buf[i],key_out,LEN);
return 1;
}
}
return 0;
}
int del_mem_value(int gid,unsigned char buf[], unsigned char key_in[]){
//unsigned char buf[GROUP_SIZE];
int base = gid*GROUP_SIZE;
memread(buf,base,GROUP_SIZE);
for(int i=0;i<GROUP_SIZE;i+=BLOCK_SIZE){
if(str_cmp(key_in,&buf[i])){
unsigned char ch=0;
for(register int j=0;j<BLOCK_SIZE;j++){
memwrite(&ch,base+i+j,1);
}
return 1;
}
}
return 0;
}
void put(unsigned char key_in[], unsigned char value_in[])
{
unsigned int key_h = hash(key_in);
unsigned int val_h = hash(value_in);
unsigned char key_map[MAP_SIZE];
unsigned char val_map[MAP_SIZE];
unsigned char buf[GROUP_SIZE];
int gid;
memread(key_map,DATA_AREA_SIZE,MAP_SIZE);
memread(val_map,DATA_AREA_SIZE+MAP_SIZE,MAP_SIZE);
int cnt = MOD;
while(cnt-- && key_map[key_h]!=0){
key_h = (key_h+1)%MOD;
}
if(key_map[key_h]==0){
int ret = 0;
gid = key_h;
while(1){
ret = put_mem(gid,buf,key_in,value_in);
if(ret==0){
gid = (gid+1)%MOD;
}
else{
key_map[key_h]=gid+1;
break;
}
}
}
memwrite(key_map,DATA_AREA_SIZE,MAP_SIZE);
cnt = MOD;
while(cnt-- && val_map[val_h]!=0){
val_h = (val_h+1)%MOD;
}
if(val_map[val_h]==0){
val_map[val_h]=gid+1;
}
memwrite(val_map,DATA_AREA_SIZE+MAP_SIZE,MAP_SIZE);
}
void del(unsigned char key_in[])
{
unsigned int key_h = hash(key_in);
unsigned char key_map[MAP_SIZE];
unsigned char out[LEN+1];
unsigned int value_h;
unsigned char value_map[MAP_SIZE];
unsigned char buf[GROUP_SIZE];
memread(key_map,DATA_AREA_SIZE,MAP_SIZE);
memread(value_map,DATA_AREA_SIZE+MAP_SIZE,MAP_SIZE);
int cnt = MOD;
int ret = 0;
int gid;
while(cnt-- && key_map[key_h]!=0 && ret==0){
gid = key_map[key_h]-1;
ret = get_mem_value(gid,buf,key_in,out,1);
if(ret==0){
key_h = (key_h+1)%MOD;
}
else{
key_map[key_h]=0;
memwrite(key_map,DATA_AREA_SIZE,MAP_SIZE);
break;
}
}
cnt = MOD;
ret = 0;
while(cnt-- && value_map[value_h]!=0 && ret==0){
ret = get_mem_key(value_map[value_h]-1,buf,out,out,0);
if(ret==0){
value_h = (value_h+1)%MOD;
}
else{
value_map[value_h]=0;
memwrite(key_map,DATA_AREA_SIZE+MAP_SIZE,MAP_SIZE);
}
}
ret = del_mem_value(gid,buf,key_in);
}
void get(unsigned char key_in[], unsigned char value_out[])
{
unsigned int key_h = hash(key_in);
unsigned char key_map[MAP_SIZE];
unsigned char buf[GROUP_SIZE];
memread(key_map,DATA_AREA_SIZE,MAP_SIZE);
int cnt = MOD;
int ret = 0;
while(cnt-- && key_map[key_h]!=0 && ret==0){
// dumpGroup(key_map[key_h]-1);
ret = get_mem_value(key_map[key_h]-1,buf,key_in,value_out,1);
if(ret==0){
key_h = (key_h+1)%MOD;
}
}
}
void get_key(unsigned char value_in[], unsigned char key_out[])
{
unsigned int value_h = hash(value_in);
unsigned char value_map[MAP_SIZE];
unsigned char buf[GROUP_SIZE];
memread(value_map,DATA_AREA_SIZE+MAP_SIZE,MAP_SIZE);
int cnt = MOD;
int ret = 0;
while(cnt-- && value_map[value_h]!=0 && ret==0){
//dumpGroup(value_map[value_h]-1);
ret = get_mem_key(value_map[value_h]-1,buf,value_in,key_out,1);
if(ret==0){
value_h = (value_h+1)%MOD;
}
}
}
댓글