source: tags/arb-7.0/CONVERTALN/wrap.cxx

Last change on this file was 16763, checked in by westram, 7 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.2 KB
Line 
1#include "seq.h"
2#include "wrap.h"
3#include "reader.h"
4
5int WrapMode::wrap_pos(const char *str, int wrapCol) const {
6    // returns the first position lower equal 'wrapCol' after which splitting
7    // is possible (according to separators of WrapMode)
8    //
9    // returns 'wrapCol' if no such position exists (fallback)
10    //
11    // throws if WrapMode is disabled
12
13    if (!allowed_to_wrap()) throw_errorf(50, "Oversized content - no wrapping allowed here (content='%s')", str);
14
15    ca_assert(wrapCol <= (int)strlen(str)); // to short to wrap
16
17    const char *wrapAfter = get_seps();
18    ca_assert(wrapAfter);
19    int i = wrapCol;
20    for (; i >= 0 && !occurs_in(str[i], wrapAfter); --i) {}
21    return i >= 0 ? i : wrapCol;
22}
23
24const char *WrapMode::print_return_wrapped(Writer& write, const char * const content, const int len, const int rest_width) const {
25    ca_assert(content[len] == '\n');
26
27    if (len<(rest_width+1)) {
28        write.out(content);
29        return NULp; // no rest
30    }
31
32    int split_after = wrap_pos(content, rest_width);
33
34    ca_assert(split_after>0);
35    if (occurs_in(content[split_after], " \n")) split_after--;
36    ca_assert(split_after >= 0);
37    ca_assert(split_after <= len);
38
39    int continue_at = split_after+1;
40    while (continue_at < len && occurs_in(content[continue_at], " \n")) continue_at++;
41
42    ca_assert(content[split_after] != '\n');
43    fputs_len(content, split_after+1, write);
44    write.out('\n');
45
46    ca_assert(content[len] == '\n');
47    ca_assert(len >= continue_at);
48
49    return content+continue_at;
50}
51
52void WrapMode::print(Writer& write, const char *first_prefix, const char *other_prefix, const char *content, int max_width) const {
53    ca_assert(has_content(content));
54
55    int len        = strlen(content)-1;
56    int prefix_len = strlen(first_prefix);
57
58    write.out(first_prefix);
59    const char *rest = print_return_wrapped(write, content, len, max_width-prefix_len);
60
61    if (rest) {
62        prefix_len = strlen(other_prefix);
63
64        while (rest) {
65            len     -= rest-content;
66            content  = rest;
67
68            write.out(other_prefix);
69            rest = print_return_wrapped(write, content, len, max_width-prefix_len);
70        }
71    }
72}
73
Note: See TracBrowser for help on using the repository browser.