Diff for /qemu/qdict.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2018/04/24 17:33:50 version 1.1.1.2, 2018/04/24 18:23:14
Line 1 Line 1
 /*  /*
  * QDict data type.   * QDict Module
  *   *
  * Copyright (C) 2009 Red Hat Inc.   * Copyright (C) 2009 Red Hat Inc.
  *   *
  * Authors:   * Authors:
  *  Luiz Capitulino <lcapitulino@redhat.com>   *  Luiz Capitulino <lcapitulino@redhat.com>
  *   *
  * This work is licensed under the terms of the GNU GPL, version 2.  See   * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
  * the COPYING file in the top-level directory.   * See the COPYING.LIB file in the top-level directory.
  */   */
   
 #include "qint.h"  #include "qint.h"
   #include "qfloat.h"
 #include "qdict.h"  #include "qdict.h"
 #include "qbool.h"  #include "qbool.h"
 #include "qstring.h"  #include "qstring.h"
Line 82  static QDictEntry *alloc_entry(const cha Line 83  static QDictEntry *alloc_entry(const cha
 }  }
   
 /**  /**
    * qdict_entry_value(): Return qdict entry value
    *
    * Return weak reference.
    */
   QObject *qdict_entry_value(const QDictEntry *entry)
   {
       return entry->value;
   }
   
   /**
    * qdict_entry_key(): Return qdict entry key
    *
    * Return a *pointer* to the string, it has to be duplicated before being
    * stored.
    */
   const char *qdict_entry_key(const QDictEntry *entry)
   {
       return entry->key;
   }
   
   /**
  * qdict_find(): List lookup function   * qdict_find(): List lookup function
  */   */
 static QDictEntry *qdict_find(const QDict *qdict,  static QDictEntry *qdict_find(const QDict *qdict,
                               const char *key, unsigned int hash)                                const char *key, unsigned int bucket)
 {  {
     QDictEntry *entry;      QDictEntry *entry;
   
     QLIST_FOREACH(entry, &qdict->table[hash], next)      QLIST_FOREACH(entry, &qdict->table[bucket], next)
         if (!strcmp(entry->key, key))          if (!strcmp(entry->key, key))
             return entry;              return entry;
   
Line 109  static QDictEntry *qdict_find(const QDic Line 131  static QDictEntry *qdict_find(const QDic
  */   */
 void qdict_put_obj(QDict *qdict, const char *key, QObject *value)  void qdict_put_obj(QDict *qdict, const char *key, QObject *value)
 {  {
     unsigned int hash;      unsigned int bucket;
     QDictEntry *entry;      QDictEntry *entry;
   
     hash = tdb_hash(key) % QDICT_HASH_SIZE;      bucket = tdb_hash(key) % QDICT_BUCKET_MAX;
     entry = qdict_find(qdict, key, hash);      entry = qdict_find(qdict, key, bucket);
     if (entry) {      if (entry) {
         /* replace key's value */          /* replace key's value */
         qobject_decref(entry->value);          qobject_decref(entry->value);
Line 121  void qdict_put_obj(QDict *qdict, const c Line 143  void qdict_put_obj(QDict *qdict, const c
     } else {      } else {
         /* allocate a new entry */          /* allocate a new entry */
         entry = alloc_entry(key, value);          entry = alloc_entry(key, value);
         QLIST_INSERT_HEAD(&qdict->table[hash], entry, next);          QLIST_INSERT_HEAD(&qdict->table[bucket], entry, next);
         qdict->size++;          qdict->size++;
     }      }
 }  }
Line 136  QObject *qdict_get(const QDict *qdict, c Line 158  QObject *qdict_get(const QDict *qdict, c
 {  {
     QDictEntry *entry;      QDictEntry *entry;
   
     entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE);      entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX);
     return (entry == NULL ? NULL : entry->value);      return (entry == NULL ? NULL : entry->value);
 }  }
   
Line 147  QObject *qdict_get(const QDict *qdict, c Line 169  QObject *qdict_get(const QDict *qdict, c
  */   */
 int qdict_haskey(const QDict *qdict, const char *key)  int qdict_haskey(const QDict *qdict, const char *key)
 {  {
     unsigned int hash = tdb_hash(key) % QDICT_HASH_SIZE;      unsigned int bucket = tdb_hash(key) % QDICT_BUCKET_MAX;
     return (qdict_find(qdict, key, hash) == NULL ? 0 : 1);      return (qdict_find(qdict, key, bucket) == NULL ? 0 : 1);
 }  }
   
 /**  /**
Line 175  static QObject *qdict_get_obj(const QDic Line 197  static QObject *qdict_get_obj(const QDic
 }  }
   
 /**  /**
    * qdict_get_double(): Get an number mapped by 'key'
    *
    * This function assumes that 'key' exists and it stores a
    * QFloat or QInt object.
    *
    * Return number mapped by 'key'.
    */
   double qdict_get_double(const QDict *qdict, const char *key)
   {
       QObject *obj = qdict_get(qdict, key);
   
       assert(obj);
       switch (qobject_type(obj)) {
       case QTYPE_QFLOAT:
           return qfloat_get_double(qobject_to_qfloat(obj));
       case QTYPE_QINT:
           return qint_get_int(qobject_to_qint(obj));
       default:
           abort();
       }
   }
   
   /**
  * qdict_get_int(): Get an integer mapped by 'key'   * qdict_get_int(): Get an integer mapped by 'key'
  *   *
  * This function assumes that 'key' exists and it stores a   * This function assumes that 'key' exists and it stores a
Line 216  QList *qdict_get_qlist(const QDict *qdic Line 261  QList *qdict_get_qlist(const QDict *qdic
 }  }
   
 /**  /**
    * qdict_get_qdict(): Get the QDict mapped by 'key'
    *
    * This function assumes that 'key' exists and it stores a
    * QDict object.
    *
    * Return QDict mapped by 'key'.
    */
   QDict *qdict_get_qdict(const QDict *qdict, const char *key)
   {
       return qobject_to_qdict(qdict_get_obj(qdict, key, QTYPE_QDICT));
   }
   
   /**
  * qdict_get_str(): Get a pointer to the stored string mapped   * qdict_get_str(): Get a pointer to the stored string mapped
  * by 'key'   * by 'key'
  *   *
Line 235  const char *qdict_get_str(const QDict *q Line 293  const char *qdict_get_str(const QDict *q
  *   *
  * Return integer mapped by 'key', if it is not present in   * Return integer mapped by 'key', if it is not present in
  * the dictionary or if the stored object is not of QInt type   * the dictionary or if the stored object is not of QInt type
  * 'err_value' will be returned.   * 'def_value' will be returned.
  */   */
 int64_t qdict_get_try_int(const QDict *qdict, const char *key,  int64_t qdict_get_try_int(const QDict *qdict, const char *key,
                           int64_t err_value)                            int64_t def_value)
 {  {
     QObject *obj;      QObject *obj;
   
     obj = qdict_get(qdict, key);      obj = qdict_get(qdict, key);
     if (!obj || qobject_type(obj) != QTYPE_QINT)      if (!obj || qobject_type(obj) != QTYPE_QINT)
         return err_value;          return def_value;
   
     return qint_get_int(qobject_to_qint(obj));      return qint_get_int(qobject_to_qint(obj));
 }  }
   
 /**  /**
    * qdict_get_try_bool(): Try to get a bool mapped by 'key'
    *
    * Return bool mapped by 'key', if it is not present in the
    * dictionary or if the stored object is not of QBool type
    * 'def_value' will be returned.
    */
   int qdict_get_try_bool(const QDict *qdict, const char *key, int def_value)
   {
       QObject *obj;
   
       obj = qdict_get(qdict, key);
       if (!obj || qobject_type(obj) != QTYPE_QBOOL)
           return def_value;
   
       return qbool_get_int(qobject_to_qbool(obj));
   }
   
   /**
  * qdict_get_try_str(): Try to get a pointer to the stored string   * qdict_get_try_str(): Try to get a pointer to the stored string
  * mapped by 'key'   * mapped by 'key'
  *   *
Line 281  void qdict_iter(const QDict *qdict, Line 357  void qdict_iter(const QDict *qdict,
     int i;      int i;
     QDictEntry *entry;      QDictEntry *entry;
   
     for (i = 0; i < QDICT_HASH_SIZE; i++) {      for (i = 0; i < QDICT_BUCKET_MAX; i++) {
         QLIST_FOREACH(entry, &qdict->table[i], next)          QLIST_FOREACH(entry, &qdict->table[i], next)
             iter(entry->key, entry->value, opaque);              iter(entry->key, entry->value, opaque);
     }      }
 }  }
   
   static QDictEntry *qdict_next_entry(const QDict *qdict, int first_bucket)
   {
       int i;
   
       for (i = first_bucket; i < QDICT_BUCKET_MAX; i++) {
           if (!QLIST_EMPTY(&qdict->table[i])) {
               return QLIST_FIRST(&qdict->table[i]);
           }
       }
   
       return NULL;
   }
   
   /**
    * qdict_first(): Return first qdict entry for iteration.
    */
   const QDictEntry *qdict_first(const QDict *qdict)
   {
       return qdict_next_entry(qdict, 0);
   }
   
   /**
    * qdict_next(): Return next qdict entry in an iteration.
    */
   const QDictEntry *qdict_next(const QDict *qdict, const QDictEntry *entry)
   {
       QDictEntry *ret;
   
       ret = QLIST_NEXT(entry, next);
       if (!ret) {
           unsigned int bucket = tdb_hash(entry->key) % QDICT_BUCKET_MAX;
           ret = qdict_next_entry(qdict, bucket + 1);
       }
   
       return ret;
   }
   
 /**  /**
  * qentry_destroy(): Free all the memory allocated by a QDictEntry   * qentry_destroy(): Free all the memory allocated by a QDictEntry
  */   */
Line 310  void qdict_del(QDict *qdict, const char  Line 423  void qdict_del(QDict *qdict, const char 
 {  {
     QDictEntry *entry;      QDictEntry *entry;
   
     entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_HASH_SIZE);      entry = qdict_find(qdict, key, tdb_hash(key) % QDICT_BUCKET_MAX);
     if (entry) {      if (entry) {
         QLIST_REMOVE(entry, next);          QLIST_REMOVE(entry, next);
         qentry_destroy(entry);          qentry_destroy(entry);
Line 329  static void qdict_destroy_obj(QObject *o Line 442  static void qdict_destroy_obj(QObject *o
     assert(obj != NULL);      assert(obj != NULL);
     qdict = qobject_to_qdict(obj);      qdict = qobject_to_qdict(obj);
   
     for (i = 0; i < QDICT_HASH_SIZE; i++) {      for (i = 0; i < QDICT_BUCKET_MAX; i++) {
         QDictEntry *entry = QLIST_FIRST(&qdict->table[i]);          QDictEntry *entry = QLIST_FIRST(&qdict->table[i]);
         while (entry) {          while (entry) {
             QDictEntry *tmp = QLIST_NEXT(entry, next);              QDictEntry *tmp = QLIST_NEXT(entry, next);

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


unix.superglobalmegacorp.com