X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fobject.h;h=9b79f482e18ba48d2c02804fb0b955c5efb999f2;hb=a010e5f6e075097c0d6362d40fb49e812e99e185;hp=01da6ab9e8aa1749fea578d54a6d717558343f5b;hpb=115aec7929c19d3276bdf7baa7917f95483cf417;p=libucw.git diff --git a/lib/object.h b/lib/object.h index 01da6ab9..9b79f482 100644 --- a/lib/object.h +++ b/lib/object.h @@ -1,7 +1,8 @@ /* * Sherlock Library -- Object Functions * - * (c) 1997--2003 Martin Mares + * (c) 1997--2004 Martin Mares + * (c) 2004, Robert Spalek * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -10,7 +11,10 @@ #ifndef _SHERLOCK_OBJECT_H #define _SHERLOCK_OBJECT_H +#define MAX_ATTR_SIZE 1024 /* Maximum length an attribute can ever have (including name and trailing 0) */ + struct fastbuf; +struct mempool; struct odes { /* Object description */ struct oattr *attrs; @@ -21,14 +25,11 @@ struct odes { /* Object description */ struct oattr { /* Object attribute */ struct oattr *next, *same; byte attr; - byte val[1]; + byte *val; }; void obj_dump(struct odes *); struct odes *obj_new(struct mempool *); -int obj_read(struct fastbuf *, struct odes *); -void obj_write(struct fastbuf *, struct odes *); -void obj_write_nocheck(struct fastbuf *, struct odes *); struct oattr *obj_find_attr(struct odes *, uns); struct oattr *obj_find_attr_last(struct odes *, uns); uns obj_del_attr(struct odes *, struct oattr *); @@ -36,7 +37,48 @@ byte *obj_find_aval(struct odes *, uns); struct oattr *obj_set_attr(struct odes *, uns, byte *); struct oattr *obj_set_attr_num(struct odes *, uns, uns); struct oattr *obj_add_attr(struct odes *, uns, byte *); +struct oattr *obj_add_attr_ref(struct odes *o, uns x, byte *v); // no strdup() struct oattr *obj_prepend_attr(struct odes *, uns, byte *); struct oattr *obj_insert_attr(struct odes *o, struct oattr *first, struct oattr *after, byte *v); +void obj_move_attr_to_head(struct odes *o, uns); +void obj_move_attr_to_tail(struct odes *o, uns); + +/* buck2obj.c: Reading of objects from buckets */ + +struct buck2obj_buf; + +struct buck2obj_buf *buck2obj_alloc(void); +void buck2obj_free(struct buck2obj_buf *buf); + +int buck2obj_parse(struct buck2obj_buf *buf, uns buck_type, uns buck_len, struct fastbuf *body, struct odes *o_hdr, uns *body_start, struct odes *o_body); +struct odes *obj_read_bucket(struct buck2obj_buf *buf, struct mempool *pool, uns buck_type, uns buck_len, struct fastbuf *body, uns *body_start); + /* If body_start != NULL, then only the header is parsed and *body_start is + * set to the position of the body. This function does a plenty of optimizations + * and if the body fastbuf is overwritable (body->can_overwrite_buffer), it can keep the + * attribute values stored on their original locations in the fastbuf's buffer. + * However, no such things are performed when reading the header only. + */ + +int obj_read(struct fastbuf *, struct odes *); +void obj_read_multi(struct fastbuf *, struct odes *); + +/* obj2buck.c: Generating buckets from objects */ + +void attr_set_type(uns type); + +byte *put_attr(byte *ptr, uns type, byte *val, uns len); +byte *put_attr_str(byte *ptr, uns type, byte *val); +byte *put_attr_vformat(byte *ptr, uns type, byte *mask, va_list va); +byte *put_attr_format(byte *ptr, uns type, char *mask, ...) __attribute__((format(printf,3,4))); +byte *put_attr_num(byte *ptr, uns type, uns val); + +void bput_attr(struct fastbuf *b, uns type, byte *val, uns len); +void bput_attr_str(struct fastbuf *b, uns type, byte *val); +void bput_attr_vformat(struct fastbuf *b, uns type, byte *mask, va_list va); +void bput_attr_format(struct fastbuf *b, uns type, char *mask, ...) __attribute__((format(printf,3,4))); +void bput_attr_num(struct fastbuf *b, uns type, uns val); + +void obj_write(struct fastbuf *, struct odes *); +void obj_write_nocheck(struct fastbuf *, struct odes *); #endif