static void ParseKeyValueString( DaoProcess *proc, DaoMap *mulmap, DaoMap *map, const char *data ) { const char *end = data + strlen( data ); DaoValue *vk = (DaoValue*) DaoProcess_NewString( proc, NULL, 0 ); DaoValue *vv = (DaoValue*) DaoProcess_NewString( proc, NULL, 0 ); DString *key = DaoString_Get( DaoValue_CastString( vk ) ); DString *value = DaoString_Get( DaoValue_CastString( vv ) ); DString *buffer = key; buffer->size = 0; for(; data < end; ++data) { if( buffer->size >= buffer->bufSize ) DString_Reserve( buffer, 1.5*buffer->size + 8 ); if( *data == '=' ) { buffer->chars[ buffer->size ] = 0; buffer = value; buffer->size = 0; } else if( *data == '&' || *data == ';' ) { buffer->chars[ buffer->size ] = 0; InsertKeyValue( proc, mulmap, map, vk, vv ); DString_Reset( key, 0 ); /* also detaching shared memory; */ DString_Reset( value, 0 ); /* also detaching shared memory; */ buffer = key; } else if( *data != ' ' ) { if( *data == '%' ) { char a = tolower( data[1] ); char b = tolower( data[2] ); buffer->chars[ buffer->size ++ ] = (char) ((HEXTOI(a) << 4) | HEXTOI(b)); data += 2; } else if( *data == '+' ) { buffer->chars[ buffer->size ++ ] = ' '; } else { buffer->chars[ buffer->size ++ ] = *data; } } } if( key->size ) InsertKeyValue( proc, mulmap, map, vk, vv ); }
void WCKeyValuesT<Base>::SetValue(const char *pszKey, const char *pszValue) { char szTmpKey[KEYVALUE_MAX_KEY_LENGTH]; char szTmpValue[KEYVALUE_MAX_VALUE_LENGTH]; V_strcpy_safe(szTmpKey, pszKey); if (pszValue != NULL) { V_strcpy_safe(szTmpValue, pszValue); } else { szTmpValue[0] = 0; } StripEdgeWhiteSpace(szTmpKey); StripEdgeWhiteSpace(szTmpValue); int i = FindByKeyName( szTmpKey ); if ( i == GetInvalidIndex() ) { if ( pszValue ) { // // Add the keyvalue to our list. // MDkeyvalue newkv; Q_strncpy( newkv.szKey, szTmpKey, sizeof( newkv.szKey ) ); Q_strncpy( newkv.szValue, szTmpValue, sizeof( newkv.szValue ) ); InsertKeyValue( newkv ); } } else { if (pszValue != NULL) { V_strncpy(m_KeyValues[i].szValue, szTmpValue, sizeof(m_KeyValues[i].szValue)); } // // If we are setting to a NULL value, delete the key. // else { RemoveKeyAt( i ); } } }
static void ParseKeyValueString( DaoProcess *proc, DaoMap *mulmap, DaoMap *map, const char *s ) { int i = 0; int nc = 0; int len = 0; char buffer[ LOCAL_BUF_SIZE + 1 ]; DaoValue *vk = (DaoValue*) DaoProcess_NewMBString( proc, NULL, 0 ); DaoValue *vv = (DaoValue*) DaoProcess_NewMBString( proc, NULL, 0 ); DString *key = DaoString_Get( DaoValue_CastString( vk ) ); DString *value = DaoString_Get( DaoValue_CastString( vv ) ); len = strlen( s ); nc = 0; int isKey = 1; char tmp[3]; tmp[2] = 0; for(i=0; i<len; i++){ if( s[i] == '=' ){ buffer[nc] = 0; DString_AppendMBS( key, buffer ); nc = 0; isKey = 0; }else if( s[i] == '&' || s[i] == ';' || i+1==len ){ if( i+1 == len ){ buffer[ nc ] = s[i]; nc ++; } if( DString_Size( key ) > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( value, buffer ); InsertKeyValue( proc, mulmap, map, vk, vv ); DString_Clear( key ); DString_Clear( value ); nc = 0; isKey = 1; }else if( nc > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( key, buffer ); DString_SetMBS( value, "NULL" ); InsertKeyValue( proc, mulmap, map, vk, vv ); DString_Clear( key ); DString_Clear( value ); nc = 0; isKey = 1; } }else if( s[i] != ' ' ){ if( nc >= LOCAL_BUF_SIZE ){ buffer[ nc ] = 0; if( isKey ){ DString_AppendMBS( key, buffer ); }else{ DString_AppendMBS( value, buffer ); } nc = 0; } if( s[i] == '%' ){ tmp[0] = s[i+1]; tmp[1] = s[i+2]; buffer[ nc ] = strtol( tmp, NULL, 16 ); i += 2; }else if( s[i] == '+' ){ buffer[ nc ] = ' '; }else{ buffer[ nc ] = s[i]; } nc ++; } } if( DString_Size( key ) > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( value, buffer ); InsertKeyValue( proc, mulmap, map, vk, vv ); }else if( nc > 0 ){ buffer[ nc ] = 0; DString_AppendMBS( key, buffer ); DString_SetMBS( value, "NULL" ); InsertKeyValue( proc, mulmap, map, vk, vv ); } }