Wrapping: Expanded space of output to be a bit larger than input. Basic wrap(): Embed continuation markers if there's enough space.

This commit is contained in:
Coren[m] 2013-11-14 02:44:21 +01:00
parent 3af83a6aec
commit ca621bd440
No known key found for this signature in database
GPG Key ID: AFA6943800F5DC6D

View File

@ -59,7 +59,9 @@ char input_line[STRING_LENGTH];
const size_t wrap_cont_len = 3; const size_t wrap_cont_len = 3;
const char wrap_cont_str[] = "\n+ "; const char wrap_cont_str[] = "\n+ ";
/* documented: fdmnlsahxgiztq */ #define STRING_LENGTH_WRAPPED (STRING_LENGTH + 16 * (wrap_cont_len + 1))
/* documented: fdmnlsahxgiztq(c[rfg]) */
/* undocumented: d (tox_do()) */ /* undocumented: d (tox_do()) */
/* 249 characters */ /* 249 characters */
@ -593,29 +595,82 @@ void line_eval(Tox *m, char *line)
} }
} }
/* basic wrap, ignores embedded '\t', '\n' or '|' */ /* basic wrap, ignores embedded '\t', '\n' or '|'
void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width) * inserts continuation markers if there's enough space left,
* otherwise turns spaces into newlines if possible */
void wrap(char output[STRING_LENGTH_WRAPPED], char input[STRING_LENGTH], int line_width)
{ {
strcpy(output, input); size_t i, k, m, len = strlen(input);
size_t i, k, m, len = strlen(output);
for (i = line_width; i < len; i = i + line_width) { if ((line_width < 4) || (len < (size_t)line_width)) {
/* look backward for a space to turn into a new line */ /* if line_width ridiculously tiny, it's not worth the effort */
strcpy(output, input);
return;
}
/* how much can we shift? */
size_t delta_is = 0, delta_remain = STRING_LENGTH_WRAPPED - len - 1;
/* if the line is very very short, don't insert continuation markers,
* as they would use up too much of the line */
if ((size_t)line_width < 2 * wrap_cont_len)
delta_remain = 0;
for (i = line_width; i < len; i += line_width) {
/* look backward for a space to expand/turn into a new line */
k = i; k = i;
m = i - line_width; m = i - line_width;
while (output[k] != ' ' && k > m) { while (input[k] != ' ' && k > m) {
k--; k--;
} }
if (k > m) { if (k > m) {
/* replace and set as new line start */ if (delta_remain > wrap_cont_len) {
output[k] = '\n'; /* replace space with continuation, then
i = k + 1; * set the pos. after the space as new line start
} * (i.e. space is being "eaten") */
memcpy(output + m + delta_is, input + m, k - m);
strcpy(output + k + delta_is, wrap_cont_str);
/* else: nothing to do now, TODO shift string */ delta_remain -= wrap_cont_len - 1;
delta_is += wrap_cont_len - 1;
i = k + 1;
} else {
/* no more space to push forward: replace the space,
* use its pos. + 1 as starting point for the next line */
memcpy(output + m + delta_is, input + m, k - m);
output[k + delta_is] = '\n';
i = k + 1;
}
} else {
/* string ends right here:
* don't add a continuation marker with nothing following */
if (i == len - 1)
break;
/* nothing found backwards */
if (delta_remain > wrap_cont_len) {
/* break at the end of the line,
* i.e. in the middle of the word at the border */
memcpy(output + m + delta_is, input + m, line_width);
strcpy(output + i + delta_is, wrap_cont_str);
delta_remain -= wrap_cont_len;
delta_is += wrap_cont_len;
} else {
/* no more space to push, no space to convert:
* just copy the whole line and move on;
* means the line count calc'ed will be off */
memcpy(output + m + delta_is, input + m, line_width);
}
}
} }
i -= line_width;
memcpy(output + i + delta_is, input + i, len - i);
output[len + delta_is] = 0;
} }
/* /*
@ -623,7 +678,7 @@ void wrap(char output[STRING_LENGTH], char input[STRING_LENGTH], int line_width)
* marks wrapped lines with "+ " in front, which does expand output * marks wrapped lines with "+ " in front, which does expand output
* does NOT honor '\t': would require a lot more work (and tab width isn't always 8) * does NOT honor '\t': would require a lot more work (and tab width isn't always 8)
*/ */
void wrap_bars(char output[STRING_LENGTH], char input[STRING_LENGTH], size_t line_width) void wrap_bars(char output[STRING_LENGTH_WRAPPED], char input[STRING_LENGTH], size_t line_width)
{ {
size_t len = strlen(input); size_t len = strlen(input);
size_t ipos, opos = 0; size_t ipos, opos = 0;
@ -639,8 +694,8 @@ void wrap_bars(char output[STRING_LENGTH], char input[STRING_LENGTH], size_t lin
output[opos++] = input[ipos]; output[opos++] = input[ipos];
if (opos >= STRING_LENGTH) { if (opos >= STRING_LENGTH_WRAPPED) {
opos = STRING_LENGTH - 1; opos = STRING_LENGTH_WRAPPED - 1;
break; break;
} }
@ -648,8 +703,8 @@ void wrap_bars(char output[STRING_LENGTH], char input[STRING_LENGTH], size_t lin
output[opos - 1] = ' '; output[opos - 1] = ' ';
bar_avail = opos; bar_avail = opos;
if (opos + 2 >= STRING_LENGTH) { if (opos + 2 >= STRING_LENGTH_WRAPPED) {
opos = STRING_LENGTH - 1; opos = STRING_LENGTH_WRAPPED - 1;
break; break;
} }
@ -673,8 +728,8 @@ void wrap_bars(char output[STRING_LENGTH], char input[STRING_LENGTH], size_t lin
} }
if (space_avail > nl_got) { if (space_avail > nl_got) {
if (opos + wrap_cont_len - 1 >= STRING_LENGTH) { if (opos + wrap_cont_len - 1 >= STRING_LENGTH_WRAPPED) {
opos = STRING_LENGTH - 1; opos = STRING_LENGTH_WRAPPED - 1;
break; break;
} }
@ -691,8 +746,8 @@ void wrap_bars(char output[STRING_LENGTH], char input[STRING_LENGTH], size_t lin
char c = input[ipos]; char c = input[ipos];
if ((c == '|') || (c == ' ') || (c == '\n')) { if ((c == '|') || (c == ' ') || (c == '\n')) {
if (opos + wrap_cont_len >= STRING_LENGTH) { if (opos + wrap_cont_len >= STRING_LENGTH_WRAPPED) {
opos = STRING_LENGTH - 1; opos = STRING_LENGTH_WRAPPED - 1;
break; break;
} }
@ -704,8 +759,8 @@ void wrap_bars(char output[STRING_LENGTH], char input[STRING_LENGTH], size_t lin
output[opos++] = input[ipos]; output[opos++] = input[ipos];
if (opos >= STRING_LENGTH) { if (opos >= STRING_LENGTH_WRAPPED) {
opos = STRING_LENGTH - 1; opos = STRING_LENGTH_WRAPPED - 1;
break; break;
} }
@ -713,6 +768,9 @@ void wrap_bars(char output[STRING_LENGTH], char input[STRING_LENGTH], size_t lin
} }
} }
if (opos >= STRING_LENGTH_WRAPPED)
opos = STRING_LENGTH_WRAPPED - 1;
output[opos] = 0; output[opos] = 0;
} }
@ -744,7 +802,7 @@ char *appender(char *str, const char c)
void do_refresh() void do_refresh()
{ {
int count = 0; int count = 0;
char wrap_output[STRING_LENGTH]; char wrap_output[STRING_LENGTH_WRAPPED];
int L; int L;
int i; int i;
@ -983,7 +1041,6 @@ void write_file(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, uin
fclose(pFile); fclose(pFile);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
/* minimalistic locale support (i.e. when printing dates) */ /* minimalistic locale support (i.e. when printing dates) */