void xheader_string_add (struct xheader *xhdr, char const *s) { if (xhdr->buffer) return; xheader_init (xhdr); xhdr->string_length += strlen (s); x_obstack_grow (xhdr, s, strlen (s)); }
void xheader_store (char const *keyword, struct tar_stat_info *st, void const *data) { struct xhdr_tab const *t; if (st->xhdr.buffer) return; t = locate_handler (keyword); if (!t || !t->coder) return; if (xheader_keyword_deleted_p (keyword) || xheader_keyword_override_p (keyword)) return; xheader_init (&st->xhdr); t->coder (st, keyword, &st->xhdr, data); }
bool xheader_string_end (struct xheader *xhdr, char const *keyword) { uintmax_t len; uintmax_t p; uintmax_t n = 0; size_t size; char nbuf[UINTMAX_STRSIZE_BOUND]; char const *np; char *cp; if (xhdr->buffer) return false; xheader_init (xhdr); len = strlen (keyword) + xhdr->string_length + 3; /* ' ' + '=' + '\n' */ do { p = n; np = umaxtostr (len + p, nbuf); n = nbuf + sizeof nbuf - 1 - np; } while (n != p); p = strlen (keyword) + n + 2; size = p; if (size != p) { ERROR ((0, 0, _("Generated keyword/value pair is too long (keyword=%s, length=%s)"), keyword, nbuf)); obstack_free (xhdr->stk, obstack_finish (xhdr->stk)); return false; } x_obstack_blank (xhdr, p); x_obstack_1grow (xhdr, '\n'); cp = obstack_next_free (xhdr->stk) - xhdr->string_length - p - 1; memmove (cp + p, cp, xhdr->string_length); cp = stpcpy (cp, np); *cp++ = ' '; cp = stpcpy (cp, keyword); *cp++ = '='; return true; }
void xheader_write_global (struct xheader *xhdr) { if (keyword_global_override_list) { struct keyword_list *kp; xheader_init (xhdr); for (kp = keyword_global_override_list; kp; kp = kp->next) code_string (kp->value, kp->pattern, xhdr); } if (xhdr->stk) { char *name; xheader_finish (xhdr); xheader_write (XGLTYPE, name = xheader_ghdr_name (), time (NULL), xhdr); free (name); } }