Пример #1
0
PHB_DYNS hb_dynsymGetWithNamespaces( const char * szName, const char * pNamespaces )  /* finds and creates a symbol if not found CASE INSENSITIVE! */
{
   HB_THREAD_STUB_STACK
   PHB_DYNS pDynSym;

   HB_TRACE( HB_TR_DEBUG, ( "hb_dynsymGetCase(%s)", szName ) );

   /* TraceLog( NULL, "Searching: %s\n", szName );
    */

   /* JC1: read the notice for hb_dynsymGet() */
   hb_dynsymLock();

   pDynSym = hb_dynsymFindNameWithNamespaces( szName, pNamespaces );

   if( ! pDynSym )       /* Does it exists ? */
   {
      /* TraceLog( NULL, "Creating: %s\n", szName );
       */
      pDynSym                       = hb_dynsymNew( hb_symbolNew( szName ), HB_GETMODULESYM() ); /* Make new symbol */
      pDynSym->pSymbol->scope.value = HB_FS_PUBLIC;
   }

   hb_dynsymUnlock();

   /* TraceLog( NULL, "Returning: %p\n", pDynSym );
    */

   return pDynSym;
}
Пример #2
0
PHB_DYNS hb_dynsymGet( const char * szName )  /* finds and creates a symbol if not found */
{
   HB_THREAD_STUB_STACK

   /* make a copy as we may get a const string, then turn it to uppercase */
   char szUprName[ HB_SYMBOL_NAME_LEN + 1 ];
   PHB_DYNS pDynSym;

   HB_TRACE(HB_TR_DEBUG, ("hb_dynsymGet(%s)", szName));

   {
      register int iLen = HB_SYMBOL_NAME_LEN;
      char * pDest = szUprName;

      do
      {
         register char cChar = *szName++;
         if( cChar == 0 || cChar == ' ' || cChar == '\t' )
            break;
         else if( cChar >= 'a' && cChar <= 'z' )
            *pDest++ = cChar - ( 'a' - 'A' );
         else
            *pDest++ = cChar;
      }
      while( --iLen );
      *pDest = '\0';
   }

   /* JC1: Notice, locking this function MAY seem useless but it is not.
   Suppose two threads calling this functon with the same szUprName: both
   of them may find ! pDynSym, and both of them may proceed to hb_dynsymNew().
   Although this operation would suceed, one of the threas would get an
   invalid reference, and we would have a memory leak, as one of the
   two dynsymNew() would be overriden */
   hb_dynsymLock();

   pDynSym = hb_dynsymFind( (char *) szUprName );

   if( !pDynSym )       /* Does it exists ? */
   {
      //TraceLog( NULL, "*** Did NOT find >%s< - CREATED New!\n", szUprName );

      pDynSym = hb_dynsymNew( hb_symbolNew( (char *)szUprName ), HB_GETMODULESYM() );   /* Make new symbol */
      pDynSym->pSymbol->scope.value = HB_FS_PUBLIC;
   }

   hb_dynsymUnlock();

   return pDynSym;
}