diff options
Diffstat (limited to 'src/txtacc.c')
-rw-r--r-- | src/txtacc.c | 228 |
1 files changed, 108 insertions, 120 deletions
diff --git a/src/txtacc.c b/src/txtacc.c index d5da901..a1b96ed 100644 --- a/src/txtacc.c +++ b/src/txtacc.c @@ -1,5 +1,5 @@ /* wydawca - automatic release submission daemon - Copyright (C) 2007, 2009-2011 Sergey Poznyakoff + Copyright (C) 2007, 2009-2013 Sergey Poznyakoff Wydawca is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -16,169 +16,157 @@ #include "wydawca.h" -struct txtacc_entry -{ - char *buf; /* Text buffer */ - size_t size; /* Buffer size */ - size_t len; /* Actual number of bytes in buffer */ +struct txtacc_entry { + char *buf; /* Text buffer */ + size_t size; /* Buffer size */ + size_t len; /* Actual number of bytes in buffer */ }; #define TXTACC_BUFSIZE 1024 #define txtacc_entry_freesize(e) ((e)->size - (e)->len) -struct txtacc -{ - struct grecs_list *cur; /* Current build list */ - struct grecs_list *mem; /* List of already allocated elements */ +struct txtacc { + struct grecs_list *cur; /* Current build list */ + struct grecs_list *mem; /* List of already allocated elements */ }; static struct txtacc_entry * -txtacc_alloc_entry (struct grecs_list *list, size_t size) +txtacc_alloc_entry(struct grecs_list *list, size_t size) { - struct txtacc_entry *p = grecs_malloc (sizeof (*p)); - p->buf = grecs_malloc (size); - p->size = size; - p->len = 0; - grecs_list_append (list, p); - return p; + struct txtacc_entry *p = grecs_malloc(sizeof(*p)); + p->buf = grecs_malloc(size); + p->size = size; + p->len = 0; + grecs_list_append(list, p); + return p; } static struct txtacc_entry * -txtacc_cur_entry (struct txtacc *acc) +txtacc_cur_entry(struct txtacc *acc) { - struct txtacc_entry *ent; - - if (grecs_list_size (acc->cur) == 0) - return txtacc_alloc_entry (acc->cur, TXTACC_BUFSIZE); - ent = acc->cur->tail->data; - if (txtacc_entry_freesize (ent) == 0) - ent = txtacc_alloc_entry (acc->cur, TXTACC_BUFSIZE); - return ent; + struct txtacc_entry *ent; + + if (grecs_list_size(acc->cur) == 0) + return txtacc_alloc_entry(acc->cur, TXTACC_BUFSIZE); + ent = acc->cur->tail->data; + if (txtacc_entry_freesize(ent) == 0) + ent = txtacc_alloc_entry(acc->cur, TXTACC_BUFSIZE); + return ent; } static void -txtacc_entry_append (struct txtacc_entry *ent, const char *p, size_t size) +txtacc_entry_append(struct txtacc_entry *ent, const char *p, size_t size) { - memcpy (ent->buf + ent->len, p, size); - ent->len += size; -} + memcpy(ent->buf + ent->len, p, size); + ent->len += size; +} static void -txtacc_entry_tailor (struct txtacc_entry *ent) +txtacc_entry_tailor(struct txtacc_entry *ent) { - if (ent->size > ent->len) - { - char *p = realloc (ent->buf, ent->len); - if (!p) - return; - ent->buf = p; - ent->size = ent->len; - } + if (ent->size > ent->len) { + char *p = realloc(ent->buf, ent->len); + if (!p) + return; + ent->buf = p; + ent->size = ent->len; + } } static void -txtacc_entry_free (void *p) +txtacc_entry_free(void *p) { - if (p) - { - struct txtacc_entry *ent = p; - free (ent->buf); - free (ent); - } + if (p) { + struct txtacc_entry *ent = p; + free(ent->buf); + free(ent); + } } struct txtacc * -txtacc_create () +txtacc_create() { - struct txtacc *acc = grecs_malloc (sizeof (*acc)); - acc->cur = grecs_list_create (); - acc->cur->free_entry = txtacc_entry_free; - acc->mem = grecs_list_create (); - acc->mem->free_entry = txtacc_entry_free; - return acc; + struct txtacc *acc = grecs_malloc(sizeof(*acc)); + acc->cur = grecs_list_create(); + acc->cur->free_entry = txtacc_entry_free; + acc->mem = grecs_list_create(); + acc->mem->free_entry = txtacc_entry_free; + return acc; } void -txtacc_free (struct txtacc *acc) +txtacc_free(struct txtacc *acc) { - grecs_list_free (acc->cur); - grecs_list_free (acc->mem); - free (acc); + grecs_list_free(acc->cur); + grecs_list_free(acc->mem); + free(acc); } void -txtacc_grow (struct txtacc *acc, const char *buf, size_t size) +txtacc_grow(struct txtacc *acc, const char *buf, size_t size) { - while (size) - { - struct txtacc_entry *ent = txtacc_cur_entry (acc); - size_t rest = txtacc_entry_freesize (ent); - if (rest > size) - rest = size; - txtacc_entry_append (ent, buf, rest); - buf += rest; - size -= rest; - } + while (size) { + struct txtacc_entry *ent = txtacc_cur_entry(acc); + size_t rest = txtacc_entry_freesize(ent); + if (rest > size) + rest = size; + txtacc_entry_append(ent, buf, rest); + buf += rest; + size -= rest; + } } char * -txtacc_finish (struct txtacc *acc, int steal) +txtacc_finish(struct txtacc *acc, int steal) { - struct grecs_list_entry *ep; - struct txtacc_entry *txtent; - size_t size; - char *p; - - switch (grecs_list_size (acc->cur)) - { - case 0: - return NULL; - - case 1: - txtent = acc->cur->head->data; - acc->cur->head->data = NULL; - txtacc_entry_tailor (txtent); - grecs_list_append (acc->mem, txtent); - break; - - default: - size = 0; - for (ep = acc->cur->head; ep; ep = ep->next) - { - txtent = ep->data; - size += txtent->len; + struct grecs_list_entry *ep; + struct txtacc_entry *txtent; + size_t size; + char *p; + + switch (grecs_list_size(acc->cur)) { + case 0: + return NULL; + + case 1: + txtent = acc->cur->head->data; + acc->cur->head->data = NULL; + txtacc_entry_tailor(txtent); + grecs_list_append(acc->mem, txtent); + break; + + default: + size = 0; + for (ep = acc->cur->head; ep; ep = ep->next) { + txtent = ep->data; + size += txtent->len; + } + + txtent = txtacc_alloc_entry(acc->mem, size); + for (ep = acc->cur->head; ep; ep = ep->next) { + struct txtacc_entry *tp = ep->data; + txtacc_entry_append(txtent, tp->buf, tp->len); + } } - - txtent = txtacc_alloc_entry (acc->mem, size); - for (ep = acc->cur->head; ep; ep = ep->next) - { - struct txtacc_entry *tp = ep->data; - txtacc_entry_append (txtent, tp->buf, tp->len); + + grecs_list_clear(acc->cur); + p = txtent->buf; + if (steal) { + grecs_list_remove_tail(acc->mem); + free(txtent); } - } - - grecs_list_clear (acc->cur); - p = txtent->buf; - if (steal) - { - grecs_list_remove_tail (acc->mem); - free (txtent); - } - return p; + return p; } void -txtacc_free_string (struct txtacc *acc, char *str) +txtacc_free_string(struct txtacc *acc, char *str) { - struct grecs_list_entry *ep; - for (ep = acc->mem->head; ep; ep = ep->next) - { - struct txtacc_entry *tp = ep->data; - if (tp->buf == str) - { - grecs_list_remove_entry (acc->mem, ep); - free (tp->buf); - return; + struct grecs_list_entry *ep; + for (ep = acc->mem->head; ep; ep = ep->next) { + struct txtacc_entry *tp = ep->data; + if (tp->buf == str) { + grecs_list_remove_entry(acc->mem, ep); + free(tp->buf); + return; + } } - } } - |