00001
00002 #include "idep_aliastable.h"
00003
00004 #include <string.h>
00005 #include <memory.h>
00006 #include <iostream>
00007 #include <cassert>
00008
00009
00010
00011 enum { DEFAULT_TABLE_SIZE = 521 };
00012
00013 static unsigned hash(register const char* name)
00014 {
00015 register unsigned sum = 1000003;
00016 while (*name) {
00017 sum *= *name++;
00018 }
00019 return sum;
00020 }
00021
00022 static char *newStrCpy(const char *oldStr)
00023 {
00024 int size = strlen(oldStr) + 1;
00025 char *newStr = new char[size];
00026 assert(newStr);
00027 memcpy(newStr, oldStr, size);
00028 return newStr;
00029 }
00030
00031
00032
00033 struct idep_AliasTableLink {
00034 char *d_alias_p;
00035 char *d_originalName_p;
00036 idep_AliasTableLink *d_next_p;
00037
00038 idep_AliasTableLink(const char *alias, const char *orignalName,
00039 idep_AliasTableLink *next);
00040 ~idep_AliasTableLink();
00041 };
00042
00043 idep_AliasTableLink::idep_AliasTableLink(const char *alias,
00044 const char *originalName, idep_AliasTableLink* next)
00045 : d_alias_p(newStrCpy(alias))
00046 , d_originalName_p(newStrCpy(originalName))
00047 , d_next_p(next)
00048 {
00049 }
00050
00051 idep_AliasTableLink::~idep_AliasTableLink()
00052 {
00053 delete [] d_alias_p;
00054 delete [] d_originalName_p;
00055 }
00056
00057
00058
00059
00060 idep_AliasTable::idep_AliasTable(int size)
00061 : d_size(size > 0 ? size : DEFAULT_TABLE_SIZE)
00062 {
00063 d_table_p = new idep_AliasTableLink *[d_size];
00064 assert (d_table_p);
00065 memset (d_table_p, 0, d_size * sizeof *d_table_p);
00066 }
00067
00068 idep_AliasTable::~idep_AliasTable()
00069 {
00070 for (int i = 0; i < d_size; ++i) {
00071 idep_AliasTableLink *p = d_table_p[i];
00072 while (p) {
00073 idep_AliasTableLink *q = p;
00074 p = p->d_next_p;
00075 delete q;
00076 }
00077 }
00078 delete [] d_table_p;
00079 }
00080
00081 int idep_AliasTable::add(const char *alias, const char *originalName)
00082 {
00083 enum { FOUND_DIFFERENT = -1, NOT_FOUND = 0, FOUND_IDENTICAL = 1 };
00084
00085 idep_AliasTableLink *&slot = d_table_p[hash(alias) % d_size];
00086 idep_AliasTableLink *p = slot;
00087
00088 while (p && 0 != strcmp(p->d_alias_p, alias)) {
00089 p = p->d_next_p;
00090 }
00091 if (!p) {
00092 slot = new idep_AliasTableLink(alias, originalName, slot);
00093 return NOT_FOUND;
00094 }
00095 else if (0 == strcmp(p->d_originalName_p, originalName)) {
00096 return FOUND_IDENTICAL;
00097 }
00098 else {
00099 return FOUND_DIFFERENT;
00100 }
00101 }
00102
00103 const char *idep_AliasTable::lookup(const char *alias) const
00104 {
00105 idep_AliasTableLink *p = d_table_p[hash(alias) % d_size];
00106 while (p && 0 != strcmp(p->d_alias_p, alias)) {
00107 p = p->d_next_p;
00108 }
00109 return p ? p->d_originalName_p : 0;
00110 }
00111
00112 std::ostream& operator<<(std::ostream &o, const idep_AliasTable& table)
00113 {
00114 int fieldWidth = 0;
00115 idep_AliasTableIter it(table);
00116 for (; it; ++it) {
00117 int len = strlen(it.alias());
00118 if (fieldWidth < len) {
00119 fieldWidth = len;
00120 }
00121 }
00122 for (it.reset(); it; ++it) {
00123 o.width(fieldWidth);
00124 o << it.alias() << " -> " << it.originalName() << std::endl;
00125 }
00126 return o;
00127 }
00128
00129
00130
00131 idep_AliasTableIter::idep_AliasTableIter(const idep_AliasTable& t)
00132 : d_table(t)
00133 {
00134 reset();
00135 }
00136
00137 idep_AliasTableIter::~idep_AliasTableIter()
00138 {
00139 }
00140
00141 void idep_AliasTableIter::reset()
00142 {
00143 d_link_p = 0;
00144 d_index = -1;
00145 ++*this;
00146 }
00147
00148 void idep_AliasTableIter::operator++()
00149 {
00150 if (d_link_p) {
00151 d_link_p = d_link_p->d_next_p;
00152 }
00153 while (!d_link_p && *this) {
00154 ++d_index;
00155 if (*this) {
00156 d_link_p = d_table.d_table_p[d_index];
00157 }
00158 }
00159 }
00160
00161 idep_AliasTableIter::operator const void *() const
00162 {
00163 return d_index < d_table.d_size ? this : 0;
00164 }
00165
00166 const char *idep_AliasTableIter::alias() const
00167 {
00168 return d_link_p->d_alias_p;
00169 }
00170
00171 const char *idep_AliasTableIter::originalName() const
00172 {
00173 return d_link_p->d_originalName_p;
00174 }
00175