/* Just replace your format_string() function with this. Anything that uses the function thereout should be correctly formatted with preserved newlines. I need no credit; I didn't write this.*/ /* * Thanks to Kalgen for the new procedure (no more bug!) * Original wordwrap() written by Surreality. * Modifications for color codes and blank lines by Geoff. */ /***************************************************************************** Name: format_string Purpose: Special string formating and word-wrapping. Called by: string_add(string.c) (many)olc_act.c ****************************************************************************/ char *format_string (char *oldstring /*, bool fSpace */ ) { char xbuf[MAX_STRING_LENGTH]; char xbuf2[MAX_STRING_LENGTH]; char *rdesc; int i = 0; int end_of_line; bool cap = TRUE; bool bFormat = TRUE; xbuf[0] = xbuf2[0] = 0; i = 0; for (rdesc = oldstring; *rdesc; rdesc++) { if (*rdesc != '`') { if (bFormat) { if (*rdesc == '\n') { if (*(rdesc + 1) == '\r' && *(rdesc + 2) == ' ' && *(rdesc + 3) == '\n' && xbuf[i - 1] != '\r') { xbuf[i] = '\n'; xbuf[i + 1] = '\r'; xbuf[i + 2] = '\n'; xbuf[i + 3] = '\r'; i += 4; rdesc += 2; } else if (*(rdesc + 1) == '\r' && *(rdesc + 2) == ' ' && *(rdesc + 2) == '\n' && xbuf[i - 1] == '\r') { xbuf[i] = '\n'; xbuf[i + 1] = '\r'; i += 2; } else if (*(rdesc + 1) == '\r' && *(rdesc + 2) == '\n' && xbuf[i - 1] != '\r') { xbuf[i] = '\n'; xbuf[i + 1] = '\r'; xbuf[i + 2] = '\n'; xbuf[i + 3] = '\r'; i += 4; rdesc += 1; } else if (*(rdesc + 1) == '\r' && *(rdesc + 2) == '\n' && xbuf[i - 1] == '\r') { xbuf[i] = '\n'; xbuf[i + 1] = '\r'; i += 2; } else if (xbuf[i - 1] != ' ' && xbuf[i - 1] != '\r') { xbuf[i] = ' '; i++; } } else if (*rdesc == '\r') ; else if (*rdesc == 'i' && *(rdesc + 1) == '.' && *(rdesc + 2) == 'e' && *(rdesc + 3) == '.') { xbuf[i] = 'i'; xbuf[i + 1] = '.'; xbuf[i + 2] = 'e'; xbuf[i + 3] = '.'; i += 4; rdesc += 3; } else if (*rdesc == ' ') { if (xbuf[i - 1] != ' ') { xbuf[i] = ' '; i++; } } else if (*rdesc == ')') { if (xbuf[i - 1] == ' ' && xbuf[i - 2] == ' ' && (xbuf[i - 3] == '.' || xbuf[i - 3] == '?' || xbuf[i - 3] == '!')) { xbuf[i - 2] = *rdesc; xbuf[i - 1] = ' '; xbuf[i] = ' '; i++; } else if (xbuf[i - 1] == ' ' && (xbuf[i - 2] == ',' || xbuf[i - 2] == ';')) { xbuf[i - 1] = *rdesc; xbuf[i] = ' '; i++; } else { xbuf[i] = *rdesc; i++; } } else if (*rdesc == ',' || *rdesc == ';') { if (xbuf[i - 1] == ' ') { xbuf[i - 1] = *rdesc; xbuf[i] = ' '; i++; } else { xbuf[i] = *rdesc; if (*(rdesc + 1) != '\"') { xbuf[i + 1] = ' '; i += 2; } else { xbuf[i + 1] = '\"'; xbuf[i + 2] = ' '; i += 3; rdesc++; } } } else if (*rdesc == '.' || *rdesc == '?' || *rdesc == '!') { if (xbuf[i - 1] == ' ' && xbuf[i - 2] == ' ' && (xbuf[i - 3] == '.' || xbuf[i - 3] == '?' || xbuf[i - 3] == '!')) { xbuf[i - 2] = *rdesc; if (*(rdesc + 1) != '\"') { xbuf[i - 1] = ' '; xbuf[i] = ' '; i++; } else { xbuf[i - 1] = '\"'; xbuf[i] = ' '; xbuf[i + 1] = ' '; i += 2; rdesc++; } } else { xbuf[i] = *rdesc; if (*(rdesc + 1) != '\"') { xbuf[i + 1] = ' '; xbuf[i + 2] = ' '; i += 3; } else { xbuf[i + 1] = '\"'; xbuf[i + 2] = ' '; xbuf[i + 3] = ' '; i += 4; rdesc++; } } cap = TRUE; } else { xbuf[i] = *rdesc; if (cap) { cap = FALSE; xbuf[i] = UPPER (xbuf[i]); } i++; } } else { xbuf[i] = *rdesc; i++; } } else { if (*(rdesc + 1) == 'Z') bFormat = !bFormat; xbuf[i] = *rdesc; i++; rdesc++; xbuf[i] = *rdesc; i++; } } xbuf[i] = 0; strcpy (xbuf2, xbuf); rdesc = xbuf2; xbuf[0] = 0; for (;;) { end_of_line = 77; for (i = 0; i < end_of_line; i++) { if (*(rdesc + i) == '`') { end_of_line += 2; i++; } if (!*(rdesc + i)) break; if (*(rdesc + i) == '\r') end_of_line = i; } if (i < end_of_line) { break; } if (*(rdesc + i - 1) != '\r') { for (i = (xbuf[0] ? (end_of_line - 1) : (end_of_line - 4)); i; i--) { if (*(rdesc + i) == ' ') break; } if (i) { *(rdesc + i) = 0; strcat (xbuf, rdesc); strcat (xbuf, "\n\r"); rdesc += i + 1; while (*rdesc == ' ') rdesc++; } else { bug ("`5Wrap_string: `@No spaces``", 0); *(rdesc + (end_of_line - 2)) = 0; strcat (xbuf, rdesc); strcat (xbuf, "-\n\r"); rdesc += end_of_line - 1; } } else { *(rdesc + i - 1) = 0; strcat (xbuf, rdesc); strcat (xbuf, "\r"); rdesc += i; while (*rdesc == ' ') rdesc++; } } while (*(rdesc + i) && (*(rdesc + i) == ' ' || *(rdesc + i) == '\n' || *(rdesc + i) == '\r')) i--; *(rdesc + i + 1) = 0; strcat (xbuf, rdesc); if (xbuf[strlen (xbuf) - 2] != '\n') strcat (xbuf, "\n\r"); free_string (oldstring); return (str_dup (xbuf)); }