Changeset 3975:b4010f0840a4 in roaraudio


Ignore:
Timestamp:
06/27/10 16:55:41 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

implemented functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/keyval.c

    r3973 r3975  
    3636#include "libroar.h" 
    3737 
     38struct roar_keyval * roar_keyval_lookup (struct roar_keyval *  kv, const char * key, ssize_t len, int casesens) { 
     39 int (*sc)(const char *s1, const char *s2) = strcasecmp; 
     40 ssize_t i; 
     41 
     42 if ( casesens ) 
     43  sc = strcmp; 
     44 
     45 for (i = 0; len != -1 ? (i < len) : kv[i].key != NULL; i++) { 
     46  if ( !sc(key, kv[i].key) ) 
     47   return &(kv[i]); 
     48 } 
     49 
     50 return NULL; 
     51} 
     52 
     53static inline int is_in (const char c, const char * delm) { 
     54 for (; *delm != 0; delm++) 
     55  if ( *delm == c ) 
     56   return 1; 
     57 
     58 return 0; 
     59} 
     60 
     61ssize_t              roar_keyval_split  (struct roar_keyval ** kv, char * str, const char * fdel, const char * kdel, int quotes) { 
     62 struct roar_keyval * kvs; 
     63 int    pos = -1; 
     64 size_t len =  0; 
     65 char * sp; 
     66 char quote =  0; 
     67 int last_was_seg = 0; 
     68 
     69 if ( kv == NULL || str == NULL ) 
     70  return -1; 
     71 
     72 // we currently do not support quotes 
     73 if ( quotes ) 
     74  return -1; 
     75 
     76 if ( fdel == NULL ) 
     77  fdel = " \t,"; 
     78 
     79 if ( kdel == NULL ) 
     80  kdel = "=:"; 
     81 
     82 // count num of segements: 
     83 for (sp = str; *sp != 0; sp++) { 
     84  if ( quote ) { 
     85   if ( *sp == quote ) 
     86    quote = 0; 
     87  } else { 
     88   if ( last_was_seg ) { 
     89    last_was_seg = !is_in(*sp, fdel); 
     90   } else { 
     91    if ( !is_in(*sp, fdel) ) { 
     92     last_was_seg = 1; 
     93     len++; 
     94    } 
     95   } 
     96  } 
     97 } 
     98 
     99 kvs = roar_mm_malloc(sizeof(struct roar_keyval)*(len+1)); 
     100 
     101 if ( kvs == NULL ) 
     102  return -1; 
     103 
     104 *kv = kvs; 
     105 
     106 // End of Array Mark: 
     107 kvs[len].key   = NULL; 
     108 kvs[len].value = NULL; 
     109 
     110 // do the acctual filling: 
     111 last_was_seg = 0; 
     112 
     113 for (sp = str; *sp != 0; sp++) { 
     114  if ( last_was_seg ) { 
     115   if ( is_in(*sp, fdel) ) { 
     116    last_was_seg = 0; 
     117    *sp = 0; 
     118   } else { 
     119    last_was_seg = 1; 
     120    if ( is_in(*sp, kdel) ) { 
     121     *sp = 0; 
     122     kvs[pos].value = sp+1; 
     123    } 
     124   } 
     125  } else { 
     126   if ( !is_in(*sp, fdel) ) { 
     127    last_was_seg = 1; 
     128    pos++; 
     129    kvs[pos].key   = sp; 
     130    kvs[pos].value = NULL; 
     131   } 
     132  } 
     133 } 
     134 
     135 return len; 
     136} 
     137 
    38138//ll 
Note: See TracChangeset for help on using the changeset viewer.