#include "lib/lib.h"
#include "lib/pools.h"
#include "lib/fastbuf.h"
+#include "lib/object.h"
#include <string.h>
#include <stdio.h>
-#define OBJ_POOL_SIZE 4096
-
void
obj_dump(struct odes *o)
{
- struct oattr *a, *b;
-
- for(a=o->attrs; a; a=a->next)
- for(b=a; b; b=b->same)
+ for(struct oattr *a=o->attrs; a; a=a->next)
+ for(struct oattr *b=a; b; b=b->same)
printf("%c%s\n", (a==b ? a->attr : ' '), b->val);
}
struct odes *
obj_new(struct mempool *pool)
{
- struct mempool *lp = pool;
- struct odes *o;
-
- if (!lp)
- lp = mp_new(OBJ_POOL_SIZE);
- o = mp_alloc(lp, sizeof(struct odes));
- o->pool = lp;
- o->local_pool = (pool == lp) ? NULL : lp;
+ struct odes *o = mp_alloc(pool, sizeof(struct odes));
+ o->pool = pool;
o->attrs = NULL;
o->cached_attr = NULL;
return o;
}
-void
-obj_free(struct odes *o)
-{
- if (o->local_pool)
- mp_delete(o->local_pool);
-}
-
int
obj_read(struct fastbuf *f, struct odes *o)
{
- byte buf[1024];
+ byte buf[MAX_ATTR_SIZE];
while (bgets(f, buf, sizeof(buf)))
{
void
obj_write(struct fastbuf *f, struct odes *d)
{
- struct oattr *a, *b;
- byte *z;
-
- for(a=d->attrs; a; a=a->next)
- for(b=a; b; b=b->same)
+ for(struct oattr *a=d->attrs; a; a=a->next)
+ for(struct oattr *b=a; b; b=b->same)
{
+ byte *z;
bputc(f, a->attr);
for(z = b->val; *z; z++)
if (*z >= ' ' || *z == '\t')
bputc(f, '?');
log(L_ERROR, "obj_dump: Found non-ASCII characters (URL might be %s)", obj_find_aval(d, 'U'));
}
+ ASSERT(z - b->val <= MAX_ATTR_SIZE-2);
bputc(f, '\n');
}
}
+void
+obj_write_nocheck(struct fastbuf *f, struct odes *d)
+{
+ for(struct oattr *a=d->attrs; a; a=a->next)
+ for(struct oattr *b=a; b; b=b->same)
+ {
+ bputc(f, a->attr);
+ bputsn(f, b->val);
+ }
+}
+
struct oattr *
obj_find_attr(struct odes *o, uns x)
{
struct oattr *a;
-
for(a=o->attrs; a && a->attr != x; a=a->next)
;
return a;
struct oattr *
obj_insert_attr(struct odes *o, struct oattr *first, struct oattr *after, byte *v)
{
- struct oattr *b;
-
- b = oa_new(o, first->attr, v);
+ struct oattr *b = oa_new(o, first->attr, v);
b->same = after->same;
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;
+ }
+}