/src/aspell/common/posib_err.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // This file is part of The New Aspell |
2 | | // Copyright (C) 2001 by Kevin Atkinson under the GNU LGPL license |
3 | | // version 2.0 or 2.1. You should have received a copy of the LGPL |
4 | | // license along with this library if you did not you can find |
5 | | // it at http://www.gnu.org/. |
6 | | |
7 | | #include <stdlib.h> |
8 | | #include <stdio.h> |
9 | | #include <assert.h> |
10 | | |
11 | | //#include "iostream.hpp" |
12 | | |
13 | | #include "posib_err.hpp" |
14 | | |
15 | | #include "gettext.h" |
16 | | |
17 | | |
18 | | namespace acommon { |
19 | | |
20 | | String & String::operator= (const PosibErr<String> & s) |
21 | 6.31k | { |
22 | 6.31k | operator=(s.data); |
23 | 6.31k | return *this; |
24 | 6.31k | } |
25 | | |
26 | | struct StrSize { |
27 | | const char * str; |
28 | | unsigned int size; |
29 | 294k | StrSize() : str(0), size(0) {} |
30 | 55.2k | void operator= (ParmString s) {str = s; size = s.size();} |
31 | | }; |
32 | | |
33 | | PosibErrBase & PosibErrBase::set(const ErrorInfo * inf, |
34 | | ParmString p1, ParmString p2, |
35 | | ParmString p3, ParmString p4) |
36 | 29.4k | { |
37 | 29.4k | const char * s0 = inf->mesg ? _(inf->mesg) : ""; |
38 | 29.4k | const char * s; |
39 | 29.4k | ParmString p[4] = {p1,p2,p3,p4}; |
40 | 29.4k | StrSize m[10]; |
41 | 29.4k | unsigned int i = 0; |
42 | 72.1k | while (i != 4 && p[i] != 0) |
43 | 42.7k | ++i; |
44 | 29.4k | assert(i == inf->num_parms || i == inf->num_parms + 1); |
45 | 0 | i = 0; |
46 | 59.6k | while (true) { |
47 | 59.6k | s = s0 + strcspn(s0, "%"); |
48 | 59.6k | m[i].str = s0; |
49 | 59.6k | m[i].size = s - s0; |
50 | 59.6k | if (*s == '\0') break; |
51 | 30.1k | ++i; |
52 | 30.1k | s = strchr(s, ':') + 1; |
53 | 30.1k | unsigned int ip = *s - '0' - 1; |
54 | 30.1k | assert(0 <= ip && ip < inf->num_parms); |
55 | 0 | m[i] = p[ip]; |
56 | 30.1k | ++i; |
57 | 30.1k | s0 = s+1; |
58 | 30.1k | } |
59 | 29.4k | if (!p[inf->num_parms].empty()) { |
60 | 12.5k | m[++i] = " "; |
61 | 12.5k | m[++i] = p[inf->num_parms]; |
62 | 12.5k | } |
63 | 29.4k | unsigned int size = 0; |
64 | 144k | for (i = 0; m[i].str != 0; ++i) |
65 | 114k | size += m[i].size; |
66 | 29.4k | char * str = (char *)malloc(size + 1); |
67 | 29.4k | s0 = str; |
68 | 144k | for (i = 0; m[i].str != 0; str+=m[i].size, ++i) |
69 | 114k | strncpy(str, m[i].str, m[i].size); |
70 | 29.4k | *str = '\0'; |
71 | 29.4k | Error * e = new Error; |
72 | 29.4k | e->err = inf; |
73 | 29.4k | e->mesg = s0; |
74 | 29.4k | err_ = new ErrPtr(e); |
75 | | |
76 | 29.4k | return *this; |
77 | 29.4k | } |
78 | | |
79 | | PosibErrBase & PosibErrBase::with_file(ParmString fn, int line_num) |
80 | 0 | { |
81 | 0 | assert(err_ != 0); |
82 | 0 | assert(err_->refcount == 1); |
83 | 0 | char * m = const_cast<char *>(err_->err->mesg); |
84 | 0 | unsigned int orig_len = strlen(m); |
85 | 0 | unsigned int new_len = fn.size() + (line_num ? 10 : 0) + 2 + orig_len + 1; |
86 | 0 | char * s = (char *)malloc(new_len); |
87 | 0 | if (line_num) |
88 | 0 | snprintf(s, new_len, "%s:%d: %s", fn.str(), line_num, m); |
89 | 0 | else |
90 | 0 | snprintf(s, new_len, "%s: %s", fn.str(), m); |
91 | 0 | free(m); |
92 | 0 | const_cast<Error *>(err_->err)->mesg = s; |
93 | 0 | return *this; |
94 | 0 | } |
95 | | |
96 | | PosibErrBase & PosibErrBase::with_key(ParmString prefix, ParmString key) |
97 | 2 | { |
98 | 2 | assert(err_ != 0); |
99 | 0 | assert(err_->refcount == 1); |
100 | 0 | char * m = const_cast<char *>(err_->err->mesg); |
101 | 2 | unsigned int orig_len = strlen(m); |
102 | 2 | unsigned int new_len = orig_len + prefix.size() + key.size() + 3; |
103 | 2 | char * s = (char *)malloc(new_len); |
104 | 2 | snprintf(s, new_len, "%s%s: %s", prefix.str(), key.str(), m); |
105 | 2 | free(m); |
106 | 2 | const_cast<Error *>(err_->err)->mesg = s; |
107 | 2 | return *this; |
108 | 2 | } |
109 | | |
110 | | #ifndef NDEBUG |
111 | 0 | void PosibErrBase::handle_err() const { |
112 | 0 | assert (err_); |
113 | 0 | assert (!err_->handled); |
114 | 0 | fputs(_("Unhandled Error: "), stderr); |
115 | 0 | fputs(err_->err->mesg, stderr); |
116 | 0 | fputs("\n", stderr); |
117 | 0 | abort(); |
118 | 0 | } |
119 | | #endif |
120 | | |
121 | 9.39k | Error * PosibErrBase::release() { |
122 | 9.39k | assert (err_); |
123 | 0 | assert (err_->refcount <= 1); |
124 | 0 | --err_->refcount; |
125 | 9.39k | Error * tmp; |
126 | 9.39k | if (err_->refcount == 0) { |
127 | 9.39k | tmp = const_cast<Error *>(err_->err); |
128 | 9.39k | delete err_; |
129 | 9.39k | } else { |
130 | 0 | tmp = new Error(*err_->err); |
131 | 0 | } |
132 | 9.39k | err_ = 0; |
133 | 9.39k | return tmp; |
134 | 9.39k | } |
135 | | |
136 | 20.0k | void PosibErrBase::del() { |
137 | 20.0k | if (!err_) return; |
138 | 20.0k | delete const_cast<Error *>(err_->err); |
139 | 20.0k | delete err_; |
140 | 20.0k | } |
141 | | |
142 | | } |