home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / c / objam01.lha / objam / runtime / atom.c next >
Encoding:
C/C++ Source or Header  |  1995-01-18  |  2.3 KB  |  118 lines

  1. /*
  2. ** ObjectiveAmiga: NeXTSTEP NXAtom emulation under AmigaOS
  3. ** See GNU:lib/libobjam/ReadMe for details
  4. */
  5.  
  6.  
  7. #include <exec/lists.h>
  8. #include <proto/exec.h>
  9. #include <clib/alib_protos.h>
  10. #include <stddef.h>
  11.  
  12. #include <libraries/objc.h>
  13. #include <clib/objc_protos.h>
  14.  
  15. #include "misc.h" /* For the ANSI function emulations */
  16. #include "zone.h" /* For quick access to the default zone */
  17.  
  18.  
  19. struct List *__AtomList;
  20.  
  21.  
  22. NXAtom __FindAtom(const char *buffer)
  23. {
  24.   struct Node *worknode, *nextnode;
  25.  
  26.   worknode=(struct Node *)(__AtomList->lh_Head);
  27.   while(nextnode=(struct Node *)(worknode->ln_Succ))
  28.   {
  29.     if(strcmp(buffer,worknode->ln_Name)==0) return (NXAtom)(worknode->ln_Name);
  30.     worknode=nextnode;
  31.   }
  32.  
  33.   return NULL;
  34. }
  35.  
  36.  
  37. NXAtom __AddAtom(const char *buffer, BOOL copyBuffer)
  38. {
  39.   NXAtom atom;
  40.   struct Node *node;
  41.  
  42.   if(copyBuffer)
  43.   {
  44.     if(!(atom=NXCopyStringBuffer(buffer))) return NULL;
  45.   }
  46.   else atom=(NXAtom)buffer;
  47.  
  48.   if(!(node=(struct Node *)NXZoneMalloc(__DefaultMallocZone,sizeof(struct Node))))
  49.   {
  50.     if(copyBuffer) NXZoneFree(__DefaultMallocZone,(void *)atom);
  51.     return NULL;
  52.   }
  53.   node->ln_Name=(STRPTR)atom;
  54.   AddTail(__AtomList,node);
  55.  
  56.   return atom;
  57. }
  58.  
  59.  
  60. NXAtom NXUniqueString(const char *buffer)
  61. {
  62.   NXAtom atom;
  63.  
  64.   if(!buffer) return NULL;
  65.   if(atom=__FindAtom(buffer)) return atom;
  66.   return __AddAtom(buffer,TRUE);
  67. }
  68.  
  69.  
  70. NXAtom NXUniqueStringWithLength(const char *buffer, int length)
  71. {
  72.   char *terminatedBuffer;
  73.   NXAtom atom;
  74.   int i;
  75.  
  76.   if(!buffer) return NULL;
  77.   if(!length) return NULL;
  78.   if(!(terminatedBuffer=(char *)NXZoneMalloc(__DefaultMallocZone,length))) return NULL;
  79.  
  80.   for(i=0;i<length;i++) terminatedBuffer[i]=buffer[i];
  81.   terminatedBuffer[i+1]=0;
  82.  
  83.   atom=NXUniqueString(terminatedBuffer);
  84.   NXZoneFree(__DefaultMallocZone,(void *)terminatedBuffer);
  85.  
  86.   return atom;
  87. }
  88.  
  89.  
  90. NXAtom NXUniqueStringNoCopy(const char *buffer)
  91. {
  92.   NXAtom atom;
  93.  
  94.   if(!buffer) return NULL;
  95.   if(atom=__FindAtom(buffer)) return atom;
  96.   return __AddAtom(buffer,FALSE);
  97. }
  98.  
  99.  
  100. char *NXCopyStringBuffer(const char *buffer)
  101. {
  102.   return NXCopyStringBufferFromZone(buffer,__DefaultMallocZone);
  103. }
  104.  
  105.  
  106. char *NXCopyStringBufferFromZone(const char *buffer, NXZone *zone)
  107. {
  108.   char *newBuffer;
  109.  
  110.   if(!buffer) return NULL;
  111.  
  112.   if(!(newBuffer=(char *)NXZoneMalloc(zone,strlen(buffer)+1))) return NULL;
  113.   strcpy(newBuffer,buffer);
  114.  
  115.   return newBuffer;
  116. }
  117.  
  118.