📄 symtab.cpp
字号:
//-< 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -