| 2193 | #endif |
| 2194 | |
| 2195 | static const char * |
| 2196 | compress_str(const char *str) |
| 2197 | { |
| 2198 | static char cbuf[BUFSZ]; |
| 2199 | |
| 2200 | /* compress out consecutive spaces if line is too long; |
| 2201 | topline wrapping converts space at wrap point into newline, |
| 2202 | we reverse that here */ |
| 2203 | if ((int) strlen(str) >= CO || strchr(str, '\n')) { |
| 2204 | const char *in_str = str; |
| 2205 | char c, *outstr = cbuf, *outend = &cbuf[sizeof cbuf - 1]; |
| 2206 | boolean was_space = TRUE; /* True discards all leading spaces; |
| 2207 | False would retain one if present */ |
| 2208 | |
| 2209 | while ((c = *in_str++) != '\0' && outstr < outend) { |
| 2210 | if (c == '\n') |
| 2211 | c = ' '; |
| 2212 | if (was_space && c == ' ') |
| 2213 | continue; |
| 2214 | *outstr++ = c; |
| 2215 | was_space = (c == ' '); |
| 2216 | } |
| 2217 | if ((was_space && outstr > cbuf) || outstr == outend) |
| 2218 | --outstr; /* remove trailing space or make room for terminator */ |
| 2219 | *outstr = '\0'; |
| 2220 | str = cbuf; |
| 2221 | } |
| 2222 | return str; |
| 2223 | } |
| 2224 | |
| 2225 | void |
| 2226 | tty_putstr(winid window, int attr, const char *str) |