summaryrefslogblamecommitdiffstats
path: root/cpukit/libcsupport/src/assoc.c
blob: 58c0b2e73f484c8390ced5572ff972a3cd41a59c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
  





                            



                   
                  
                        
 




                                                                                             
                     
                        

                            

   
                                        


                                   
 






                                        
                     
                         
                            
                              

   
                                        


                                   
 







                                           
                     
                          
                            
                               

   
                                        


                                   
 











                                             
        
                            
                            
                              

   
                             


                                                    
 


             
        
                            
                            
                               

   
                             


                                                      
 


             
        
                           

                             

   
                             


                                            
 


             
        
                          

                             

   
                             


                                            
 







                                                                   
                                 
                        


                                                          

 
            
                          
                            
                              

   
                             


                                                    
 


                                             
            
                           
                            
                               

   
                             


                                                      
 







                                                                       
                                                
                            
                              
   
 

                                



                                                               
 



                        
                                                
                            
                               
   
 

                               



                                                              
 


                       


                                    
                         

                         
 
                 









                                                              
 


                  


                                   
                         

                         
 
                 









                                                             
 

                  
/*
 * assoc.c
 *      rtems assoc routines
 *
 *  $Id$
 */

#if HAVE_CONFIG_H
#include "config.h"
#endif

#include <rtems.h>
#include <rtems/assoc.h>

#include <string.h>             /* strcat, strcmp */

#define STREQ(a,b)      (strcmp((a), (b)) == 0)
#define rtems_assoc_is_default(ap)  ((ap)->name && STREQ(ap->name, RTEMS_ASSOC_DEFAULT_NAME))

const rtems_assoc_t *
rtems_assoc_ptr_by_name(
    const rtems_assoc_t *ap,
    const char *name
  )
{
    const rtems_assoc_t *default_ap = 0;

    if (rtems_assoc_is_default(ap))
        default_ap = ap++;

    for ( ; ap->name; ap++)
        if (strcmp(ap->name, name) == 0)
            return ap;

    return default_ap;
}

const rtems_assoc_t *
rtems_assoc_ptr_by_local(
    const rtems_assoc_t *ap,
    uint32_t       local_value
  )
{
    const rtems_assoc_t *default_ap = 0;

    if (rtems_assoc_is_default(ap))
        default_ap = ap++;

    for ( ; ap->name; ap++)
        if (ap->local_value == local_value)
            return ap;

    return default_ap;
}


const rtems_assoc_t *
rtems_assoc_ptr_by_remote(
    const rtems_assoc_t *ap,
    uint32_t       remote_value
  )
{
    const rtems_assoc_t *default_ap = 0;

    if (rtems_assoc_is_default(ap))
        default_ap = ap++;

    for ( ; ap->name; ap++)
        if (ap->remote_value == remote_value)
            return ap;

    return default_ap;
}


/*
 * Get values
 */

uint32_t
rtems_assoc_remote_by_local(
    const rtems_assoc_t *ap,
    uint32_t       local_value
  )
{
    const rtems_assoc_t *nap;
    nap = rtems_assoc_ptr_by_local(ap, local_value);
    if (nap)
        return nap->remote_value;

    return 0;
}

uint32_t
rtems_assoc_local_by_remote(
    const rtems_assoc_t *ap,
    uint32_t       remote_value
  )
{
    const rtems_assoc_t *nap;
    nap = rtems_assoc_ptr_by_remote(ap, remote_value);
    if (nap)
        return nap->local_value;

    return 0;
}

uint32_t
rtems_assoc_remote_by_name(
    const rtems_assoc_t *ap,
    const char          *name
  )
{
    const rtems_assoc_t *nap;
    nap = rtems_assoc_ptr_by_name(ap, name);
    if (nap)
        return nap->remote_value;

    return 0;
}

uint32_t
rtems_assoc_local_by_name(
    const rtems_assoc_t *ap,
    const char          *name
  )
{
    const rtems_assoc_t *nap;
    nap = rtems_assoc_ptr_by_name(ap, name);
    if (nap)
        return nap->local_value;

    return 0;
}

/*
 * what to return if a value is not found
 * this is not reentrant, but it really shouldn't be invoked anyway
 */

const char *rtems_assoc_name_bad(
    uint32_t   bad_value
);

/* body in separate file to reduce dependency on printf */


const char *
rtems_assoc_name_by_local(
    const rtems_assoc_t *ap,
    uint32_t       local_value
  )
{
    const rtems_assoc_t *nap;
    nap = rtems_assoc_ptr_by_local(ap, local_value);
    if (nap)
        return nap->name;

    return rtems_assoc_name_bad(local_value);
}

const char *
rtems_assoc_name_by_remote(
    const rtems_assoc_t *ap,
    uint32_t       remote_value
  )
{
    const rtems_assoc_t *nap;
    nap = rtems_assoc_ptr_by_remote(ap, remote_value);
    if (nap)
        return nap->name;

    return rtems_assoc_name_bad(remote_value);
}

/*
 * Bitfield functions assume just 1 bit set in each of remote and local
 *      entries; they do not check for this.
 */

uint32_t   rtems_assoc_remote_by_local_bitfield(
    const rtems_assoc_t *ap,
    uint32_t       local_value
  )
{
    uint32_t   b;
    uint32_t   remote_value = 0;

    for (b = 1; b; b <<= 1)
        if (b & local_value)
            remote_value |= rtems_assoc_remote_by_local(ap, b);

    return remote_value;
}


uint32_t   rtems_assoc_local_by_remote_bitfield(
    const rtems_assoc_t *ap,
    uint32_t       remote_value
  )
{
    uint32_t   b;
    uint32_t   local_value = 0;

    for (b = 1; b; b <<= 1)
        if (b & remote_value)
            local_value |= rtems_assoc_local_by_remote(ap, b);

    return local_value;
}

char *
rtems_assoc_name_by_remote_bitfield(
    const rtems_assoc_t *ap,
    uint32_t       value,
    char          *buffer
  )
{
    uint32_t   b;

    *buffer = 0;

    for (b = 1; b; b <<= 1)
        if (b & value)
        {
            if (*buffer)
                strcat(buffer, " ");
            strcat(buffer, rtems_assoc_name_by_remote(ap, b));
        }

    return buffer;
}

char *
rtems_assoc_name_by_local_bitfield(
    const rtems_assoc_t *ap,
    uint32_t       value,
    char          *buffer
  )
{
    uint32_t   b;

    *buffer = 0;

    for (b = 1; b; b <<= 1)
        if (b & value)
        {
            if (*buffer)
                strcat(buffer, " ");
            strcat(buffer, rtems_assoc_name_by_local(ap, b));
        }

    return buffer;
}