]> mj.ucw.cz Git - libucw.git/blobdiff - lib/object.c
Added obj_find_anum() which is obj_find_aval() combined with atol() and
[libucw.git] / lib / object.c
index 22d906473138033c163f23b0665b79bb207716ed..6a2a90c5b5d46aeec6c8709be842121bd553f41a 100644 (file)
@@ -9,12 +9,13 @@
  */
 
 #include "lib/lib.h"
-#include "lib/pools.h"
+#include "lib/mempool.h"
 #include "lib/fastbuf.h"
 #include "lib/object.h"
 
 #include <string.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 void
 obj_dump(struct odes *o)
@@ -117,6 +118,13 @@ obj_find_aval(struct odes *o, uns x)
   return a ? a->val : NULL;
 }
 
+uns
+obj_find_anum(struct odes *o, uns x, uns def)
+{
+  struct oattr *a = obj_find_attr(o, x);
+  return a ? (uns)atol(a->val) : def;
+}
+
 struct oattr *
 obj_set_attr(struct odes *o, uns x, byte *v)
 {
@@ -158,14 +166,17 @@ obj_set_attr_num(struct odes *o, uns a, uns v)
 static inline struct oattr *
 obj_add_attr_internal(struct odes *o, struct oattr *b)
 {
-  struct oattr *a;
+  struct oattr *a, **z;
 
   if (!(a = o->cached_attr) || a->attr != b->attr)
     {
-      if (!(a = obj_find_attr(o, b->attr)))
+      z = &o->attrs;
+      while ((a = *z) && a->attr != b->attr)
+       z = &a->next;
+      if (!a)
        {
-         b->next = o->attrs;
-         o->attrs = b;
+         *z = b;
+         /* b->next is NULL */
          goto done;
        }
     }