Changeset 4877:f204efc45b07 in roaraudio


Ignore:
Timestamp:
04/26/11 14:04:57 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added roar_ht_digest2str()

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/hash.h

    r4795 r4877  
    9393ssize_t      roar_ht_digestlen (const int    ht); 
    9494 
     95ssize_t      roar_ht_digest2str(char * out, size_t outlen, void * digest, size_t digestlen, int ht); 
     96 
    9597int          roar_ht_is_supported(const int    ht); 
    9698 
  • libroar/hash.c

    r4795 r4877  
    172172} 
    173173 
     174static void _bin2hex(char * out, char * in, size_t inlen, int uppercase) { 
     175 const char * tab = uppercase ? "0123456789ABCDEF" : "0123456789abcdef"; 
     176 unsigned char c; 
     177 int nib0, nib1; 
     178 
     179 for (; inlen; inlen--) { 
     180  c = *(in++); 
     181  nib0 = (c & 0x0F) >> 0; 
     182  nib1 = (c & 0xF0) >> 4; 
     183//  printf("inlen=%zu, c=%u, nibs={%i, %i}\n", inlen, (unsigned)c, nib1, nib0); 
     184  *(out++) = tab[nib1]; 
     185  *(out++) = tab[nib0]; 
     186 } 
     187 *out = 0; 
     188} 
     189 
     190ssize_t      roar_ht_digest2str(char * out, size_t outlen, void * digest, size_t digestlen, int ht) { 
     191 ssize_t slen = roar_ht_digestlen(ht); 
     192 union { 
     193  long long int llsi; 
     194 } tmp; 
     195 enum { 
     196  HEX, 
     197  TIGER, 
     198//  BASE64, 
     199  UUID, 
     200  INT, 
     201  GTIN 
     202 } type = HEX; 
     203 
     204 if ( out == NULL || digest == NULL ) { 
     205  roar_err_set(ROAR_ERROR_FAULT); 
     206  return -1; 
     207 } 
     208 
     209 if ( !(slen == -1 || digestlen == slen) ) { 
     210  roar_err_set(ROAR_ERROR_INVAL); 
     211  return -1; 
     212 } 
     213 
     214 switch (ht) { 
     215  case ROAR_HT_TIGER: type = TIGER; break; 
     216  case ROAR_HT_UUID:  type = UUID;  break; 
     217  case ROAR_HT_CLIENTID: 
     218  case ROAR_HT_STREAMID: 
     219  case ROAR_HT_SOURCEID: 
     220  case ROAR_HT_SAMPLEID: 
     221  case ROAR_HT_MIXERID: 
     222  case ROAR_HT_BRIDGEID: 
     223  case ROAR_HT_LISTENID: 
     224  case ROAR_HT_ACTIONID: 
     225  case ROAR_HT_MSGQUEUEID: 
     226  case ROAR_HT_MSGBUSID: 
     227    type = INT; 
     228   break; 
     229  case ROAR_HT_GTIN8: 
     230  case ROAR_HT_GTIN13: 
     231  case ROAR_HT_ISBN10: 
     232    type = GTIN; 
     233   break; 
     234 } 
     235 
     236 switch (type) { 
     237  case HEX: 
     238    if ( outlen < (digestlen*2 + 1) ) { 
     239     roar_err_set(ROAR_ERROR_FAULT); 
     240     return -1; 
     241    } 
     242    _bin2hex(out, digest, digestlen, 0); 
     243   break; 
     244  case UUID: 
     245    if ( outlen < 37 || digestlen != 16 ) { 
     246     roar_err_set(ROAR_ERROR_FAULT); 
     247     return -1; 
     248    } 
     249    _bin2hex(out+ 0, digest+ 0, 4, 0); 
     250    out[ 8] = '-'; 
     251    _bin2hex(out+ 9, digest+ 4, 2, 0); 
     252    out[13] = '-'; 
     253    _bin2hex(out+14, digest+ 6, 2, 0); 
     254    out[18] = '-'; 
     255    _bin2hex(out+19, digest+ 8, 2, 0); 
     256    out[23] = '-'; 
     257    _bin2hex(out+24, digest+10, 6, 0); 
     258//    printf("%s\n", out+24); 
     259   break; 
     260  case TIGER: 
     261    if ( outlen < 51 || digestlen != 24 ) { 
     262     roar_err_set(ROAR_ERROR_FAULT); 
     263     return -1; 
     264    } 
     265    _bin2hex(out+ 0, digest+ 0, 8, 1); 
     266    out[16] = ' '; 
     267    _bin2hex(out+17, digest+ 8, 8, 1); 
     268    out[33] = ' '; 
     269    _bin2hex(out+34, digest+16, 8, 1); 
     270   break; 
     271  case INT: 
     272    switch (digestlen) { 
     273     case 1: 
     274       tmp.llsi = *(char*)digest; 
     275      break; 
     276     case 2: 
     277       tmp.llsi = ROAR_NET2HOST16(*(int16_t*)digest); 
     278      break; 
     279     case 4: 
     280       tmp.llsi = ROAR_NET2HOST32(*(int32_t*)digest); 
     281      break; 
     282     default: 
     283       roar_err_set(ROAR_ERROR_NOSYS); 
     284       return -1; 
     285      break; 
     286    } 
     287    snprintf(out, outlen-1, "%lli", tmp.llsi); 
     288   break; 
     289  default: 
     290    roar_err_set(ROAR_ERROR_NOSYS); 
     291    return -1; 
     292 } 
     293 
     294 out[outlen-1] = 0; 
     295 return strlen(out); 
     296} 
     297 
    174298int          roar_ht_is_supported(const int    ht) { 
    175299 roar_crypto_init(); 
Note: See TracChangeset for help on using the changeset viewer.