X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fobject.c;h=371d9b3647d7e6443f09dd838d34716acc78b84f;hb=2265a52d853e27176ff5eea67c9eeb93080b8614;hp=6f047863086bd508c4c8242d10895fd3c86a1d3b;hpb=77a7da57886543b363b60f692c4fd0a65733c3a1;p=libucw.git diff --git a/lib/object.c b/lib/object.c index 6f047863..371d9b36 100644 --- a/lib/object.c +++ b/lib/object.c @@ -1,7 +1,7 @@ /* * Sherlock Library -- Object Functions * - * (c) 1997--2003 Martin Mares + * (c) 1997--2004 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -26,14 +26,26 @@ obj_dump(struct odes *o) static struct oattr * oa_new(struct odes *o, uns x, byte *v) { - struct oattr *a = mp_alloc(o->pool, sizeof(struct oattr) + strlen(v)); + struct oattr *a = mp_alloc(o->pool, sizeof(struct oattr) + strlen(v)+1); a->next = a->same = NULL; a->attr = x; + a->val = (byte*) (a+1); strcpy(a->val, v); return a; } +static struct oattr * +oa_new_ref(struct odes *o, uns x, byte *v) +{ + struct oattr *a = mp_alloc(o->pool, sizeof(struct oattr)); + + a->next = a->same = NULL; + a->attr = x; + a->val = v; + return a; +} + struct odes * obj_new(struct mempool *pool) { @@ -58,6 +70,16 @@ obj_read(struct fastbuf *f, struct odes *o) return 0; } +void +obj_read_multi(struct fastbuf *f, struct odes *o) +{ + /* Read a multi-part object ending with either EOF or a NUL character */ + byte buf[MAX_ATTR_SIZE]; + while (bpeekc(f) > 0 && bgets(f, buf, sizeof(buf))) + if (buf[0]) + obj_add_attr(o, buf[0], buf+1); +} + void obj_write(struct fastbuf *f, struct odes *d) { @@ -147,7 +169,6 @@ byte * obj_find_aval(struct odes *o, uns x) { struct oattr *a = obj_find_attr(o, x); - return a ? a->val : NULL; } @@ -189,15 +210,14 @@ obj_set_attr_num(struct odes *o, uns a, uns v) return obj_set_attr(o, a, x); } -struct oattr * -obj_add_attr(struct odes *o, uns x, byte *v) +static inline struct oattr * +obj_add_attr_internal(struct odes *o, struct oattr *b) { - struct oattr *a, *b; + struct oattr *a; - b = oa_new(o, x, v); - if (!(a = o->cached_attr) || a->attr != x) + if (!(a = o->cached_attr) || a->attr != b->attr) { - if (!(a = obj_find_attr(o, x))) + if (!(a = obj_find_attr(o, b->attr))) { b->next = o->attrs; o->attrs = b; @@ -212,6 +232,18 @@ obj_add_attr(struct odes *o, uns x, byte *v) return b; } +struct oattr * +obj_add_attr(struct odes *o, uns x, byte *v) +{ + return obj_add_attr_internal(o, oa_new(o, x, v)); +} + +struct oattr * +obj_add_attr_ref(struct odes *o, uns x, byte *v) +{ + return obj_add_attr_internal(o, oa_new_ref(o, x, v)); +} + struct oattr * obj_prepend_attr(struct odes *o, uns x, byte *v) { @@ -244,3 +276,43 @@ obj_insert_attr(struct odes *o, struct oattr *first, struct oattr *after, byte * after->same = b; return b; } + +void +obj_move_attr_to_head(struct odes *o, uns x) +{ + struct oattr *a, **z; + + z = &o->attrs; + while (a = *z) + { + if (a->attr == x) + { + *z = a->next; + a->next = o->attrs; + o->attrs = a; + break; + } + z = &a->next; + } +} + +void +obj_move_attr_to_tail(struct odes *o, uns x) +{ + struct oattr *a, **z; + + z = &o->attrs; + while (a = *z) + { + if (a->attr == x) + { + *z = a->next; + while (*z) + z = &(*z)->next; + *z = a; + a->next = NULL; + break; + } + z = &a->next; + } +}