| 69 | } |
| 70 | |
| 71 | std::string regex_error::regex_error_message(const char *message, const char *pattern, size_t pos) |
| 72 | { |
| 73 | const char *p = strrchr(pattern, '\n'); |
| 74 | if (p != NULL) |
| 75 | pattern = p + 1; |
| 76 | size_t l = strlen(pattern); |
| 77 | if (pos > l) |
| 78 | pos = l; |
| 79 | l = strlen(message); |
| 80 | size_t n = pos / 40; |
| 81 | size_t k = pos % 40 + (n == 0 ? 0 : 20); |
| 82 | p = n == 0 ? pattern : pattern + 40 * n - 20; |
| 83 | while (p > pattern && (*p & 0xc0) == 0x80) |
| 84 | { |
| 85 | --p; |
| 86 | ++k; |
| 87 | } |
| 88 | size_t m = disppos(p, 79) - p; |
| 89 | size_t r = displen(p, k); |
| 90 | std::string what("error at position "); |
| 91 | what.append(ztoa(pos)).append("\n").append(p, m).append("\n"); |
| 92 | if (r >= l + 4) |
| 93 | what.append(r - l - 4, ' ').append(message).append("___/\n"); |
| 94 | else |
| 95 | what.append(r, ' ').append("\\___").append(message).append("\n"); |
| 96 | return what; |
| 97 | } |
| 98 | |
| 99 | size_t regex_error::displen(const char *s, size_t k) |
| 100 | { |