Coverage Report

Created: 2026-09-03 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aspell/common/posib_err.cpp
Line
Count
Source
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
8.30k
  {
22
8.30k
    operator=(s.data);
23
8.30k
    return *this;
24
8.30k
  }
25
26
  struct StrSize {
27
    const char * str; 
28
    unsigned int size; 
29
441k
    StrSize() : str(0), size(0) {}
30
76.4k
    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
44.1k
  {
37
44.1k
    const char * s0 = inf->mesg ? _(inf->mesg) : "";
38
44.1k
    const char * s;
39
44.1k
    ParmString p[4] = {p1,p2,p3,p4};
40
44.1k
    StrSize m[10];
41
44.1k
    unsigned int i = 0;
42
104k
    while (i != 4 && p[i] != 0) 
43
60.7k
      ++i;
44
44.1k
    assert(i == inf->num_parms || i == inf->num_parms + 1);
45
44.1k
    i = 0;
46
89.2k
    while (true) {
47
89.2k
      s = s0 + strcspn(s0, "%");
48
89.2k
      m[i].str = s0;
49
89.2k
      m[i].size = s - s0;
50
89.2k
      if (*s == '\0') break;
51
45.1k
      ++i;
52
45.1k
      s = strchr(s, ':') + 1;
53
45.1k
      unsigned int ip = *s - '0' - 1;
54
45.1k
      assert(0 <= ip && ip < inf->num_parms);
55
45.1k
      m[i] = p[ip];
56
45.1k
          ++i;
57
45.1k
      s0 = s+1;
58
45.1k
    }
59
44.1k
    if (!p[inf->num_parms].empty()) {
60
15.6k
      m[++i] = " ";
61
15.6k
      m[++i] = p[inf->num_parms];
62
15.6k
    }
63
44.1k
    unsigned int size = 0;
64
209k
    for (i = 0; m[i].str != 0; ++i)
65
165k
      size += m[i].size;
66
44.1k
    char * str = (char *)malloc(size + 1);
67
44.1k
    s0 = str;
68
209k
    for (i = 0; m[i].str != 0; str+=m[i].size, ++i)
69
165k
      strncpy(str, m[i].str, m[i].size);
70
44.1k
    *str = '\0';
71
44.1k
    Error * e = new Error;
72
44.1k
    e->err = inf;
73
44.1k
    e->mesg = s0;
74
44.1k
    err_ = new ErrPtr(e);
75
    
76
44.1k
    return *this;
77
44.1k
  }
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
8
  {
98
8
    assert(err_ != 0);
99
8
    assert(err_->refcount == 1);
100
8
    char * m = const_cast<char *>(err_->err->mesg);
101
8
    unsigned int orig_len = strlen(m);
102
8
    unsigned int new_len = orig_len +  prefix.size() + key.size() + 3;
103
8
    char * s = (char *)malloc(new_len);
104
8
    snprintf(s, new_len, "%s%s: %s", prefix.str(), key.str(), m);
105
8
    free(m);
106
8
    const_cast<Error *>(err_->err)->mesg = s;
107
8
    return *this;
108
8
  }
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
16.3k
  Error * PosibErrBase::release() {
122
16.3k
    assert (err_);
123
16.3k
    assert (err_->refcount <= 1);
124
16.3k
    --err_->refcount;
125
16.3k
    Error * tmp;
126
16.3k
    if (err_->refcount == 0) {
127
16.3k
      tmp = const_cast<Error *>(err_->err);
128
16.3k
      delete err_;
129
16.3k
    } else {
130
0
      tmp = new Error(*err_->err);
131
0
    }
132
16.3k
    err_ = 0;
133
16.3k
    return tmp;
134
16.3k
  }
135
136
27.7k
  void PosibErrBase::del() {
137
27.7k
    if (!err_) return;
138
27.7k
    delete const_cast<Error *>(err_->err);
139
27.7k
    delete err_;
140
27.7k
  }
141
142
}