home *** CD-ROM | disk | FTP | other *** search
/ CD Concept 6 / CD Concept 06.iso / mac / UTILITAIRE / Universal TCL 1.1.3 v3.1 / Pointer TCL 3.1 / new source / MetaInfo.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-09  |  1.1 KB  |  64 lines  |  [TEXT/MPCC]

  1. #include "MetaInfo.h"
  2.  
  3. int MetaInfo::sNumClasses = 0;
  4. MetaInfo *MetaInfo::g_head_info;
  5.  
  6. static int cstrcmp(char const *a,char const *b)
  7. {
  8.     int ac,bc,c;
  9.  
  10.     for (;;) {
  11.         ac=*a++;
  12.         bc=*b++;
  13.         c=ac-bc;
  14.         if (c || !ac || !bc)
  15.             break;
  16.     }
  17.     return c;
  18. }
  19.  
  20. void * MetaInfo :: NewByName ( const char * str )
  21. {
  22.     MetaInfo * iter ;
  23.  
  24.     for ( iter = g_head_info ; iter ; iter = iter -> next )
  25.     {
  26.         if ( ! cstrcmp ( str , iter -> name ) )
  27.             return ( * ( iter -> new_func ) ) ( ) ;
  28.     }
  29.     DebugStr ( "\pnew_by_name failed!" ) ;
  30.     return NULL ;
  31. }
  32.  
  33. Boolean MetaInfo :: Member ( MetaInfo * obj , MetaInfo * cls )
  34. {
  35.     return obj &&
  36.            ( obj == cls ||
  37.              Member ( obj -> ancestor1 , cls ) ||
  38.              Member ( obj -> ancestor2 , cls ) ||
  39.              Member ( obj -> ancestor3 , cls ) ||
  40.              Member ( obj -> ancestor4 , cls ) ) ;
  41. }
  42.  
  43.  
  44. Boolean
  45. MetaInfo::ClassExists(
  46.     const char *name)
  47. {
  48.     MetaInfo *iter;
  49. #if defined(DEBUG)
  50.     int numClasses=0;
  51. #endif
  52.     for(iter = g_head_info; iter; iter = iter->next)
  53.     {
  54.         sNumClasses++;
  55.         if (!cstrcmp(iter->name, name))
  56.             return true;
  57.     }
  58. #if defined(DEBUG)
  59.     if (numClasses != sNumClasses)
  60.         DebugStr("\pnumClasses doesn't match!");
  61. #endif
  62.     return false;
  63. }
  64.