X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fobj2buck.c;h=a38051a53416ef4bd9d933ddd3058fa3bbd6083e;hb=3d60a4fe8e95194666956fe7e861101f40571630;hp=afd4c1dff0d4c530037faf1417d19372088359c1;hpb=4aa712644886cd4ebb82803a19aba6d39eaec8c2;p=libucw.git diff --git a/lib/obj2buck.c b/lib/obj2buck.c index afd4c1df..a38051a5 100644 --- a/lib/obj2buck.c +++ b/lib/obj2buck.c @@ -1,24 +1,45 @@ /* - * Generating V33 buckets + * Generating Buckets from Objects * * (c) 2004, Robert Spalek + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. */ #include "lib/lib.h" #include "lib/fastbuf.h" -#include "lib/obj2buck.h" +#include "lib/ff-utf8.h" #include "lib/bucket.h" -#include "charset/unistream.h" +#include "lib/object.h" #include #include static uns use_v33; +static int hdr_sep; void attr_set_type(uns type) { - use_v33 = (type == BUCKET_TYPE_V33 || type == BUCKET_TYPE_V33_LIZARD); + switch (type) + { + case BUCKET_TYPE_PLAIN: + use_v33 = 0; + hdr_sep = -1; + break; + case BUCKET_TYPE_V30: + use_v33 = 0; + hdr_sep = '\n'; + break; + case BUCKET_TYPE_V33: + case BUCKET_TYPE_V33_LIZARD: + use_v33 = 1; + hdr_sep = 0; + break; + default: + die("Don't know how to generate buckets of type %08x", type); + } } inline byte * @@ -103,6 +124,14 @@ put_attr_num(byte *ptr, uns type, uns val) return ptr; } +byte * +put_attr_separator(byte *ptr) +{ + if (hdr_sep >= 0) + *ptr++ = hdr_sep; + return ptr; +} + inline void bput_attr(struct fastbuf *b, uns type, byte *val, uns len) { @@ -169,3 +198,36 @@ bput_attr_num(struct fastbuf *b, uns type, uns val) else bprintf(b, "%c%d\n", type, val); } + +void +bput_attr_separator(struct fastbuf *b) +{ + if (hdr_sep >= 0) + bputc(b, hdr_sep); +} + +void +obj_write(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) + { + byte *z; + for (z = b->val; *z; z++) + if (*z < ' ' && *z != '\t') + { + log(L_ERROR, "obj_dump: Found non-ASCII characters (URL might be %s)", obj_find_aval(d, 'U')); + *z = '?'; + } + ASSERT(z - b->val <= MAX_ATTR_SIZE-2); + bput_attr_str(f, a->attr, b->val); + } +} + +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) + bput_attr_str(f, a->attr, b->val); +}