Mercurial > octave
annotate libinterp/corefcn/hex2num.cc @ 26159:aa678451b758
Silence compiler warning about incorrect format specifier (bug #55046).
* hex2num.cc, mex.cc: Use format specifier %zd for size_t.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Sun, 02 Dec 2018 17:21:09 +0100 |
parents | 07c2c42f457e |
children | 00f796120a6d |
rev | line source |
---|---|
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
1 /* |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
2 |
25054
6652d3823428
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
3 Copyright (C) 2017-2018 John W. Eaton |
6652d3823428
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
4 Copyright (C) 2008-2018 David Bateman |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
5 |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
6 This file is part of Octave. |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
7 |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23581
diff
changeset
|
8 Octave is free software: you can redistribute it and/or modify it |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
9 under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23581
diff
changeset
|
10 the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
11 (at your option) any later version. |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
12 |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
13 Octave is distributed in the hope that it will be useful, but |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
14 WITHOUT ANY WARRANTY; without even the implied warranty of |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22407
diff
changeset
|
16 GNU General Public License for more details. |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
17 |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
18 You should have received a copy of the GNU General Public License |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
19 along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23581
diff
changeset
|
20 <https://www.gnu.org/licenses/>. |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
21 |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
22 */ |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
23 |
21724
aba2e6293dd8
use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents:
21568
diff
changeset
|
24 #if defined (HAVE_CONFIG_H) |
21301
40de9f8f23a6
Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents:
21200
diff
changeset
|
25 # include "config.h" |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
26 #endif |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
27 |
15039
e753177cde93
maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents:
14501
diff
changeset
|
28 #include "defun.h" |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
29 #include "error.h" |
21100
e39e05d90788
Switch gripe_XXX to either err_XXX or warn_XXX naming scheme.
Rik <rik@octave.org>
parents:
20962
diff
changeset
|
30 #include "errwarn.h" |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
31 #include "mach-info.h" |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
32 #include "ov.h" |
20940
48b2ad5ee801
maint: Rename oct-obj.[cc|h] to ovl.[cc|h] for clarity.
Rik <rik@octave.org>
parents:
20939
diff
changeset
|
33 #include "ovl.h" |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
34 #include "utils.h" |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
35 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
36 static inline bool |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
37 is_little_endian (bool is_float) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
38 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
39 return ((is_float && (octave::mach_info::native_float_format () |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
40 == octave::mach_info::flt_fmt_ieee_little_endian)) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
41 || octave::mach_info::words_little_endian ()); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
42 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
43 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
44 static uint8_t |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
45 hex2nibble (unsigned char ch) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
46 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
47 unsigned char val = 0; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
48 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
49 if (! isxdigit (ch)) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
50 error ("hex2num: invalid character '%c' found in string S", ch); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
51 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
52 if (ch >= 'a') |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
53 val = static_cast<unsigned char> (ch - 'a' + 10); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
54 else if (ch >= 'A') |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
55 val = static_cast<unsigned char> (ch - 'A' + 10); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
56 else |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
57 val = static_cast<unsigned char> (ch - '0'); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
58 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
59 return val; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
60 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
61 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
62 static void |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
63 hex2num (const std::string& hex, void *num, size_t nbytes, bool swap_bytes) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
64 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
65 unsigned char *cp = reinterpret_cast<unsigned char *> (num); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
66 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
67 const size_t nc = hex.length (); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
68 const size_t nchars = 2 * nbytes; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
69 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
70 if (nc > nchars) |
26159
aa678451b758
Silence compiler warning about incorrect format specifier (bug #55046).
Markus Mützel <markus.muetzel@gmx.de>
parents:
25579
diff
changeset
|
71 error ("hex2num: S must be no more than %zd characters", nchars); |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
72 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
73 size_t j = 0; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
74 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
75 for (size_t i = 0; i < nbytes; i++) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
76 { |
23450
855122b993da
maint: Wrap tertiary operator in parentheses "(COND ? x : y)".
Rik <rik@octave.org>
parents:
23359
diff
changeset
|
77 size_t k = (swap_bytes ? nbytes - i - 1 : i); |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
78 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
79 unsigned char ch1 = (j < nc) ? hex[j++] : '0'; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
80 unsigned char ch2 = (j < nc) ? hex[j++] : '0'; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
81 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
82 cp[k] = (hex2nibble (ch1) << 4) + hex2nibble (ch2); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
83 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
84 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
85 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
86 template <typename T> |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
87 Array<T> |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
88 hex2num (const Array<std::string>& val, bool swap_bytes) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
89 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
90 octave_idx_type nel = val.numel (); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
91 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
92 Array<T> m (val.dims ()); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
93 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
94 size_t nbytes = sizeof (T); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
95 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
96 for (octave_idx_type i = 0; i < nel; i++) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
97 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
98 T num; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
99 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
100 hex2num (val.xelem (i), &num, nbytes, swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
101 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
102 m(i) = num; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
103 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
104 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
105 return m; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
106 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
107 |
15039
e753177cde93
maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents:
14501
diff
changeset
|
108 DEFUN (hex2num, args, , |
21966
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
109 doc: /* -*- texinfo -*- |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
110 @deftypefn {} {@var{n} =} hex2num (@var{s}) |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
111 @deftypefnx {} {@var{n} =} hex2num (@var{s}, @var{class}) |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
112 Typecast a hexadecimal character array or cell array of strings to an |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
113 array of numbers. |
21966
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
114 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
115 By default, the input array is interpreted as a hexadecimal number |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
116 representing a double precision value. If fewer than 16 characters are |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
117 given the strings are right padded with @qcode{'0'} characters. |
21966
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
118 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
119 Given a string matrix, @code{hex2num} treats each row as a separate number. |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
120 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
121 @example |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
122 @group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
123 hex2num (["4005bf0a8b145769"; "4024000000000000"]) |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
124 @result{} [2.7183; 10.000] |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
125 @end group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
126 @end example |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
127 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
128 The optional second argument @var{class} may be used to cause the input |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
129 array to be interpreted as a different value type. Possible values are |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
130 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
131 @multitable {Option} {Characters} |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
132 @headitem Option @tab Characters |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
133 @item @qcode{"int8"} @tab 2 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
134 @item @qcode{"uint8"} @tab 2 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
135 @item @qcode{"int16"} @tab 4 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
136 @item @qcode{"uint16"} @tab 4 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
137 @item @qcode{"int32"} @tab 8 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
138 @item @qcode{"uint32"} @tab 8 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
139 @item @qcode{"int64"} @tab 16 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
140 @item @qcode{"uint64"} @tab 16 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
141 @item @qcode{"char"} @tab 2 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
142 @item @qcode{"single"} @tab 8 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
143 @item @qcode{"double"} @tab 16 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
144 @end multitable |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
145 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
146 For example: |
21966
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
147 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
148 @example |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
149 @group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
150 hex2num (["402df854"; "41200000"], "single") |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
151 @result{} [2.7183; 10.000] |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
152 @end group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
153 @end example |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
154 @seealso{num2hex, hex2dec, dec2hex} |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
155 @end deftypefn */) |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
156 { |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
157 octave_value retval; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
158 |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
159 int nargin = args.length (); |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
160 |
17178
f010db8b710c
hex2num: Add single precision conversion option (bug #39608)
Mike Miller <mtmiller@ieee.org>
parents:
17177
diff
changeset
|
161 if (nargin < 1 || nargin > 2) |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
162 print_usage (); |
20802
8bb38ba1bad6
eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents:
20678
diff
changeset
|
163 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
164 std::string type = "double"; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
165 if (nargin == 2) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
166 type = args(1).xstring_value ("hex2num: CLASS must be a string"); |
20939
b17fda023ca6
maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
167 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
168 Array<std::string> val = args(0).cellstr_value (); |
20939
b17fda023ca6
maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
169 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
170 // We always use big-endian order for hex digits. |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
171 bool is_float = type == "single" || type == "double"; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
172 bool swap_bytes = is_little_endian (is_float); |
20939
b17fda023ca6
maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents:
20853
diff
changeset
|
173 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
174 if (type == "int8") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
175 retval = octave_value (hex2num<octave_int8> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
176 else if (type == "uint8") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
177 retval = octave_value (hex2num<octave_uint8> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
178 else if (type == "int16") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
179 retval = octave_value (hex2num<octave_int16> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
180 else if (type == "uint16") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
181 retval = octave_value (hex2num<octave_uint16> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
182 else if (type == "int32") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
183 retval = octave_value (hex2num<octave_int32> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
184 else if (type == "uint32") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
185 retval = octave_value (hex2num<octave_uint32> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
186 else if (type == "int64") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
187 retval = octave_value (hex2num<octave_int64> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
188 else if (type == "uint64") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
189 retval = octave_value (hex2num<octave_uint64> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
190 else if (type == "char") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
191 retval = octave_value (hex2num<char> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
192 else if (type == "single") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
193 retval = octave_value (hex2num<float> (val, swap_bytes)); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
194 else if (type == "double") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
195 retval = octave_value (hex2num<double> (val, swap_bytes)); |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
196 else |
23359
dd6ce1e09a4c
fix typo in previous change
John W. Eaton <jwe@octave.org>
parents:
23356
diff
changeset
|
197 error ("hex2num: unrecognized CLASS '%s'", type.c_str ()); |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
198 |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
199 return retval; |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
200 } |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
201 |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
202 /* |
14501
60e5cf354d80
Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents:
14360
diff
changeset
|
203 %!assert (hex2num (["c00";"bff";"000";"3ff";"400"]), [-2:2]') |
17178
f010db8b710c
hex2num: Add single precision conversion option (bug #39608)
Mike Miller <mtmiller@ieee.org>
parents:
17177
diff
changeset
|
204 %!assert (hex2num (["c00";"bf8";"000";"3f8";"400"], "single"), single([-2:2])') |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
205 %!assert (hex2num ("ff", "uint8"), intmax ("uint8")) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
206 %!assert (hex2num ("ffff", "uint16"), intmax ("uint16")) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
207 %!assert (hex2num ("ffffffff", "uint32"), intmax ("uint32")) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
208 %!assert (hex2num ("ffffffff", "uint32"), intmax ("uint32")) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
209 %!assert (hex2num ("ffffffffffffffff", "uint64"), intmax ("uint64")) |
8808
d724487d2c4b
hex2num.cc: use union to avoid cast and GCC warning
John W. Eaton <jwe@octave.org>
parents:
8807
diff
changeset
|
210 */ |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
211 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
212 static inline unsigned char |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
213 nibble2hex (unsigned char ch) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
214 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
215 if (ch >= 10) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
216 ch += 'a' - 10; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
217 else |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
218 ch += '0'; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
219 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
220 return ch; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
221 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
222 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
223 static inline void |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
224 num2hex (const void *p, size_t n, char *hex, bool swap_bytes) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
225 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
226 const unsigned char *cp = reinterpret_cast<const unsigned char *> (p); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
227 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
228 size_t k = 0; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
229 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
230 for (size_t i = 0; i < n; i++) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
231 { |
23450
855122b993da
maint: Wrap tertiary operator in parentheses "(COND ? x : y)".
Rik <rik@octave.org>
parents:
23359
diff
changeset
|
232 size_t j = (swap_bytes ? n - i - 1 : i); |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
233 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
234 unsigned char ch = cp[j]; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
235 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
236 hex[k++] = nibble2hex ((ch >> 4) & 0xF); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
237 hex[k++] = nibble2hex (ch & 0xF); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
238 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
239 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
240 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
241 template <typename T> |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
242 Cell |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
243 num2hex (const Array<T>& v, bool swap_bytes) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
244 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
245 const size_t nbytes = sizeof (T); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
246 const size_t nchars = 2 * nbytes; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
247 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
248 octave_idx_type nel = v.numel (); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
249 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
250 string_vector sv (nel); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
251 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
252 const T *pv = v.fortran_vec (); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
253 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
254 for (octave_idx_type i = 0; i < nel; i++) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
255 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
256 char hex[nchars]; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
257 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
258 num2hex (pv++, nbytes, hex, swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
259 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
260 sv[i] = std::string (hex, nchars); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
261 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
262 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
263 return Cell (v.dims (), sv); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
264 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
265 |
15039
e753177cde93
maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents:
14501
diff
changeset
|
266 DEFUN (num2hex, args, , |
21966
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
267 doc: /* -*- texinfo -*- |
23565
3a730821e4a2
doc: Peridoc grammarcheck of documentation.
Rik <rik@octave.org>
parents:
23450
diff
changeset
|
268 @deftypefn {} {@var{s} =} num2hex (@var{n}) |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
269 @deftypefnx {} {@var{s} =} num2hex (@var{n}, "cell") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
270 Convert a numeric array to an array of hexadecimal strings. |
21966
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
271 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
272 For example: |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
273 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
274 @example |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
275 @group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
276 num2hex ([-1, 1, e, Inf]) |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
277 @result{} "bff0000000000000 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
278 3ff0000000000000 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
279 4005bf0a8b145769 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
280 7ff0000000000000" |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
281 @end group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
282 @end example |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
283 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
284 If the argument @var{n} is a single precision number or vector, the returned |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
285 string has a length of 8. For example: |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
286 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
287 @example |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
288 @group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
289 num2hex (single ([-1, 1, e, Inf])) |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
290 @result{} "bf800000 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
291 3f800000 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
292 402df854 |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
293 7f800000" |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
294 @end group |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
295 @end example |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
296 |
25579
07c2c42f457e
doc: Miscellaneous documentation fixes all over the manual (bug #54288).
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
297 With the optional second argument @qcode{"cell"}, return a cell array of |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
298 strings instead of a character array. |
21966
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
299 @seealso{hex2num, hex2dec, dec2hex} |
112b20240c87
move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents:
21839
diff
changeset
|
300 @end deftypefn */) |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
301 { |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
302 int nargin = args.length (); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
303 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
304 if (nargin < 1 || nargin > 2) |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
305 print_usage (); |
20802
8bb38ba1bad6
eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents:
20678
diff
changeset
|
306 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
307 bool as_cell = false; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
308 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
309 if (nargin == 2) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
310 { |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
311 std::string opt = args(1).xstring_value ("num2hex: second argument must be a string"); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
312 if (opt == "cell") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
313 as_cell = true; |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
314 else |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
315 error ("num2hex: unrecognized option '%s'", opt.c_str ()); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
316 } |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
317 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
318 octave_value val = args(0); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
319 |
23581
c3075ae020e1
maint: Deprecate is_complex_type and replace with iscomplex.
Rik <rik@octave.org>
parents:
23565
diff
changeset
|
320 if (val.iscomplex ()) |
21839
6b4f6339df91
num2hex: Report an error on complex arguments (bug #48184)
Mike Miller <mtmiller@octave.org>
parents:
21724
diff
changeset
|
321 error ("num2hex: N must be real"); |
6b4f6339df91
num2hex: Report an error on complex arguments (bug #48184)
Mike Miller <mtmiller@octave.org>
parents:
21724
diff
changeset
|
322 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
323 Cell result; |
17177
81d3c4409645
num2hex: Handle single precision argument correctly (bug #39607)
Mike Miller <mtmiller@ieee.org>
parents:
15195
diff
changeset
|
324 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
325 // We always use big-endian order for hex digits. |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
326 bool is_float = val.is_single_type () || val.is_double_type (); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
327 bool swap_bytes = is_little_endian (is_float); |
17177
81d3c4409645
num2hex: Handle single precision argument correctly (bug #39607)
Mike Miller <mtmiller@ieee.org>
parents:
15195
diff
changeset
|
328 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
329 if (val.is_int8_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
330 result = num2hex (val.int8_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
331 else if (val.is_int16_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
332 result = num2hex<octave_int16> (val.int16_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
333 else if (val.is_int32_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
334 result = num2hex<octave_int32> (val.int32_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
335 else if (val.is_int64_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
336 result = num2hex<octave_int64> (val.int64_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
337 else if (val.is_uint8_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
338 result = num2hex<octave_uint8> (val.uint8_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
339 else if (val.is_uint16_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
340 result = num2hex<octave_uint16> (val.uint16_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
341 else if (val.is_uint32_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
342 result = num2hex<octave_uint32> (val.uint32_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
343 else if (val.is_uint64_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
344 result = num2hex<octave_uint64> (val.uint64_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
345 else if (val.is_char_matrix ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
346 result = num2hex<char> (val.char_array_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
347 else if (val.is_single_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
348 result = num2hex<float> (val.float_vector_value (), swap_bytes); |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
349 else if (val.is_double_type ()) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
350 result = num2hex<double> (val.vector_value (), swap_bytes); |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
351 else |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
352 err_wrong_type_arg ("num2hex", val); |
20678
4b00afb5e9c3
eliminate more uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20232
diff
changeset
|
353 |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
354 return (as_cell |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
355 ? octave_value (result) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
356 : octave_value (result.string_vector_value ())); |
7639
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
357 } |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
358 |
b2fbb393a072
Add the num2hex and hex2num functions
David Bateman <dbateman@free.fr>
parents:
diff
changeset
|
359 /* |
14501
60e5cf354d80
Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents:
14360
diff
changeset
|
360 %!assert (num2hex (-2:2), ["c000000000000000";"bff0000000000000";"0000000000000000";"3ff0000000000000";"4000000000000000"]) |
17177
81d3c4409645
num2hex: Handle single precision argument correctly (bug #39607)
Mike Miller <mtmiller@ieee.org>
parents:
15195
diff
changeset
|
361 %!assert (num2hex (single (-2:2)), ["c0000000";"bf800000";"00000000";"3f800000";"40000000"]) |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
362 %!assert (num2hex (intmax ("uint8")), "ff") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
363 %!assert (num2hex (intmax ("uint16")), "ffff") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
364 %!assert (num2hex (intmax ("uint32")), "ffffffff") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
365 %!assert (num2hex (intmax ("uint32")), "ffffffff") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
366 %!assert (num2hex (intmax ("uint64")), "ffffffffffffffff") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
367 |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
368 %!assert (hex2num (num2hex (pi)), pi) |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
369 %!assert (hex2num (num2hex (single (pi)), "single"), single (pi)) |
21839
6b4f6339df91
num2hex: Report an error on complex arguments (bug #48184)
Mike Miller <mtmiller@octave.org>
parents:
21724
diff
changeset
|
370 |
6b4f6339df91
num2hex: Report an error on complex arguments (bug #48184)
Mike Miller <mtmiller@octave.org>
parents:
21724
diff
changeset
|
371 %!error num2hex () |
6b4f6339df91
num2hex: Report an error on complex arguments (bug #48184)
Mike Miller <mtmiller@octave.org>
parents:
21724
diff
changeset
|
372 %!error num2hex (1,2) |
23356
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
373 %!error num2hex (1,"foo") |
ef20eee0247d
allow hex2num to handle integer values
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
374 %!error num2hex (1,2,3) |
21839
6b4f6339df91
num2hex: Report an error on complex arguments (bug #48184)
Mike Miller <mtmiller@octave.org>
parents:
21724
diff
changeset
|
375 %!error num2hex (1j) |
8808
d724487d2c4b
hex2num.cc: use union to avoid cast and GCC warning
John W. Eaton <jwe@octave.org>
parents:
8807
diff
changeset
|
376 */ |