Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

idep_altab.cxx

Go to the documentation of this file.
00001 // idep_altab.c
00002 #include "idep_aliastable.h"
00003 
00004 #include <string.h>     // strcmp() strlen()
00005 #include <memory.h>     // memcpy()
00006 #include <iostream> 
00007 #include <cassert> 
00008 
00009                 // -*-*-*- static functions -*-*-*-
00010  
00011 enum { DEFAULT_TABLE_SIZE = 521 };
00012 
00013 static unsigned hash(register const char* name) // Note: returns unsigned!
00014 {
00015     register unsigned sum = 1000003; // 1,000,003 is the 78,498th prime number
00016     while (*name) {
00017         sum *= *name++; // integer multiplication is a subroutine on a SPARC
00018     }
00019     return sum; // unsigned ensures positive value for use with (%) operator.
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                 // -*-*-*- idep_AliasTableLink -*-*-*-
00032 
00033 struct idep_AliasTableLink {
00034     char *d_alias_p;                            // "from" (alias) name
00035     char *d_originalName_p;                     // "to" (original) name
00036     idep_AliasTableLink *d_next_p;              // pointer to next link
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                 // -*-*-*- idep_AliasTable -*-*-*-
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                 // -*-*-*- idep_AliasTableIter -*-*-*-
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 

Generated on Mon Feb 15 11:06:48 2010 for loon by  doxygen 1.3.9.1