GNU Octave  3.8.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
lo-array-gripes.cc
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 2003-2013 John W. Eaton
4 Copyright (C) 2009 VZLU Prague
5 
6 This file is part of Octave.
7 
8 Octave is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12 
13 Octave is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with Octave; see the file COPYING. If not, see
20 <http://www.gnu.org/licenses/>.
21 
22 */
23 
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27 
28 #include "lo-array-gripes.h"
29 #include "lo-error.h"
30 
31 const char *error_id_nonconformant_args = "Octave:nonconformant-args";
32 
33 const char *error_id_index_out_of_bounds = "Octave:index-out-of-bounds";
34 
35 const char *error_id_invalid_index = "Octave:invalid-index";
36 
37 void
39 {
40  (*current_liboctave_error_handler)
41  ("invalid conversion from NaN to logical");
42 }
43 
44 void
46 {
47  (*current_liboctave_error_handler)
48  ("invalid conversion from NaN to character");
49 }
50 
51 void
52 gripe_nonconformant (const char *op, octave_idx_type op1_len,
53  octave_idx_type op2_len)
54 {
55  const char *err_id = error_id_nonconformant_args;
56 
57  (*current_liboctave_error_with_id_handler)
58  (err_id, "%s: nonconformant arguments (op1 len: %d, op2 len: %d)",
59  op, op1_len, op2_len);
60 }
61 
62 void
63 gripe_nonconformant (const char *op,
64  octave_idx_type op1_nr, octave_idx_type op1_nc,
65  octave_idx_type op2_nr, octave_idx_type op2_nc)
66 {
67  const char *err_id = error_id_nonconformant_args;
68 
69  (*current_liboctave_error_with_id_handler)
70  (err_id, "%s: nonconformant arguments (op1 is %dx%d, op2 is %dx%d)",
71  op, op1_nr, op1_nc, op2_nr, op2_nc);
72 }
73 
74 void
75 gripe_nonconformant (const char *op, const dim_vector& op1_dims,
76  const dim_vector& op2_dims)
77 {
78  const char *err_id = error_id_nonconformant_args;
79 
80  std::string op1_dims_str = op1_dims.str ();
81  std::string op2_dims_str = op2_dims.str ();
82 
83  (*current_liboctave_error_with_id_handler)
84  (err_id, "%s: nonconformant arguments (op1 is %s, op2 is %s)",
85  op, op1_dims_str.c_str (), op2_dims_str.c_str ());
86 }
87 
88 void
90  octave_idx_type ext)
91 {
92  const char *err_id = error_id_index_out_of_bounds;
93 
94  switch (nd)
95  {
96  case 1:
97  (*current_liboctave_error_with_id_handler)
98  (err_id, "A(I): index out of bounds; value %d out of bound %d",
99  idx, ext);
100  break;
101 
102  case 2:
103  (*current_liboctave_error_with_id_handler)
104  (err_id, "A(I,J): %s index out of bounds; value %d out of bound %d",
105  (dim == 1) ? "row" : "column", idx, ext);
106  break;
107 
108  default:
109  (*current_liboctave_error_with_id_handler)
110  (err_id, "A(I,J,...): index to dimension %d out of bounds; value %d out of bound %d",
111  dim, idx, ext);
112  break;
113  }
114 }
115 
116 void
118  octave_idx_type ext)
119 {
120  const char *err_id = error_id_index_out_of_bounds;
121 
122  (*current_liboctave_error_with_id_handler)
123  (err_id, "A(%s) = []: index out of bounds; value %d out of bound %d",
124  is1d ? "I" : "..,I,..", idx, ext);
125 }
126 
127 void
129 {
130  const char *err_id = error_id_invalid_index;
131 
132  (*current_liboctave_error_with_id_handler)
133 #ifdef USE_64_BIT_IDX_T
134  (err_id, "subscript indices must be either positive integers less than 2^63 or logicals");
135 #else
136  (err_id, "subscript indices must be either positive integers less than 2^31 or logicals");
137 #endif
138 }
139 
140 // FIXME: the following is a common error message to resize,
141 // regardless of whether it's called from assign or elsewhere. It
142 // seems OK to me, but eventually the gripe can be specialized.
143 // Anyway, propagating various error messages into procedure is, IMHO,
144 // a nonsense. If anything, we should change error handling here (and
145 // throughout liboctave) to allow custom handling of errors
146 
147 void
149 {
150  (*current_liboctave_error_with_id_handler)
151  ("Octave:invalid-resize",
152  "Invalid resizing operation or ambiguous assignment to an out-of-bounds array element");
153 }
154 
155 void
157 {
158  (*current_liboctave_error_handler)
159  ("A(I) = X: X must have the same size as I");
160 }
161 
162 void
164 {
165  (*current_liboctave_error_handler)
166  ("A(I,J,...) = X: dimensions mismatch");
167 }
168