symtab.cpp

来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· C++ 代码 · 共 72 行

CPP
72
字号
//-< SYMTAB.CPP >----------------------------------------------------*--------*// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *// (Main Memory Database Management System)                          *   /\|  *//                                                                   *  /  \  *//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *//                          Last update: 20-Nov-98    K.A. Knizhnik  * GARRET *//-------------------------------------------------------------------*--------*// Symbol table implementation//-------------------------------------------------------------------*--------*#define INSIDE_FASTDB#include "stdtp.h"#include "sync.h"#include "symtab.h"const size_t hashTableSize = 1009;dbSymbolTable::HashTableItem* dbSymbolTable::hashTable[hashTableSize];dbSymbolTable dbSymbolTable::instance;dbSymbolTable::~dbSymbolTable() {     for (int i = hashTableSize; --i >= 0;) { 	HashTableItem *ip, *next;	for (ip = hashTable[i]; ip != NULL; ip = next) {	    next = ip->next;	    delete ip;	}    }}#ifdef IGNORE_CASE#define strcmp(x,y) stricmp(x,y)#endifint dbSymbolTable::add(char* &str, int tag, bool allocate) {    static dbMutex mutex;    dbCriticalSection cs(mutex);    unsigned hash = 0;    byte* p = (byte*)str;    while (*p != 0) {         byte b = *p++;#ifdef IGNORE_CASE        b = tolower(b);#endif	hash = hash*31 + b;    }    int index = hash % hashTableSize;    HashTableItem *ip;    for (ip = hashTable[index]; ip != NULL; ip = ip->next) { 	if (ip->hash == hash && strcmp(ip->str, str) == 0) { 	    str = ip->str;	    return ip->tag;	}    }    ip = new HashTableItem;    ip->allocated = false;    if (allocate) { 	char* dupstr = new char[strlen(str) + 1];	strcpy(dupstr, str);	str = dupstr;	ip->allocated = true;    }    ip->str = str;    ip->hash = hash;    ip->tag = tag;    ip->next = hashTable[index];    hashTable[index] = ip;    return tag;}

⌨️ 快捷键说明

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