ARB
wrap.cxx
Go to the documentation of this file.
1 #include "seq.h"
2 #include "wrap.h"
3 #include "reader.h"
4 
5 int 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 
24 const 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 
52 void 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 
void throw_errorf(int error_num, const char *error_messagef,...) __ATTR__FORMAT(2) __ATTR__NORETURN
Definition: util.cxx:41
#define ca_assert(cond)
Definition: global.h:33
int fputs_len(const char *str, int len, Writer &write)
Definition: util.cxx:155
Definition: reader.h:95
CONSTEXPR_INLINE bool has_content(const char *field)
Definition: global.h:127
void print(Writer &write, const char *first_prefix, const char *other_prefix, const char *content, int max_width) const
Definition: wrap.cxx:52
virtual void out(char ch)=0
#define NULp
Definition: cxxforward.h:97
bool occurs_in(char ch, const char *in)
Definition: global.h:111