+ ds_assign_cstr (&d->documents, documents != NULL ? documents : "");
+
+ /* In case the caller didn't get it quite right, pad out the
+ final line with spaces. */
+ remainder = ds_length (&d->documents) % DOC_LINE_LENGTH;
+ if (remainder != 0)
+ ds_put_char_multiple (&d->documents, ' ', DOC_LINE_LENGTH - remainder);
+}
+
+/* Drops the documents from dictionary D. */
+void
+dict_clear_documents (struct dictionary *d)
+{
+ ds_clear (&d->documents);
+}
+
+/* Appends LINE to the documents in D. LINE will be truncated or
+ padded on the right with spaces to make it exactly
+ DOC_LINE_LENGTH bytes long. */
+void
+dict_add_document_line (struct dictionary *d, const char *line)
+{
+ if (strlen (line) > DOC_LINE_LENGTH)
+ {
+ /* Note to translators: "bytes" is correct, not characters */
+ msg (SW, _("Truncating document line to %d bytes."), DOC_LINE_LENGTH);
+ }
+ buf_copy_str_rpad (ds_put_uninit (&d->documents, DOC_LINE_LENGTH),
+ DOC_LINE_LENGTH, line, ' ');
+}
+
+/* Returns the number of document lines in dictionary D. */
+size_t
+dict_get_document_line_cnt (const struct dictionary *d)
+{
+ return ds_length (&d->documents) / DOC_LINE_LENGTH;
+}
+
+/* Copies document line number IDX from dictionary D into
+ LINE, trimming off any trailing white space. */
+void
+dict_get_document_line (const struct dictionary *d,
+ size_t idx, struct string *line)
+{
+ assert (idx < dict_get_document_line_cnt (d));
+ ds_assign_substring (line, ds_substr (&d->documents, idx * DOC_LINE_LENGTH,
+ DOC_LINE_LENGTH));
+ ds_rtrim (line, ss_cstr (CC_SPACES));