Mercurial > octave
diff libinterp/corefcn/hex2num.cc @ 20939:b17fda023ca6
maint: Use new C++ archetype in more files.
Place input validation first in files.
Move declaration of retval down in function to be closer to point of usage.
Eliminate else clause after if () error.
Use "return ovl()" where it makes sense.
* find.cc, gammainc.cc, gcd.cc, getgrent.cc, getpwent.cc, givens.cc,
graphics.cc, help.cc, hess.cc, hex2num.cc, input.cc, kron.cc, load-path.cc,
load-save.cc, lookup.cc, mappers.cc, matrix_type.cc, mgorth.cc, nproc.cc,
ordschur.cc, pager.cc, pinv.cc, pr-output.cc, profiler.cc, psi.cc, quad.cc,
rcond.cc, regexp.cc, schur.cc, sighandlers.cc, sparse.cc, str2double.cc,
strfind.cc, strfns.cc, sub2ind.cc, svd.cc, sylvester.cc, symtab.cc,
syscalls.cc, sysdep.cc, time.cc, toplev.cc, tril.cc, tsearch.cc, typecast.cc,
urlwrite.cc, utils.cc, variables.cc, __delaunayn__.cc, __eigs__.cc,
__glpk__.cc, __magick_read__.cc, __osmesa_print__.cc, __voronoi__.cc, amd.cc,
audiodevinfo.cc, audioread.cc, chol.cc, colamd.cc, dmperm.cc, fftw.cc, qr.cc,
symbfact.cc, symrcm.cc, ov-bool-mat.cc, ov-cell.cc, ov-class.cc,
ov-classdef.cc, ov-fcn-handle.cc, ov-fcn-inline.cc, ov-flt-re-mat.cc,
ov-java.cc, ov-null-mat.cc, ov-oncleanup.cc, ov-re-mat.cc, ov-struct.cc,
ov-typeinfo.cc, ov-usr-fcn.cc, ov.cc, octave.cc:
Use new C++ archetype in more files.
author | Rik <rik@octave.org> |
---|---|
date | Fri, 18 Dec 2015 15:37:22 -0800 |
parents | 1142cf6abc0d |
children | 48b2ad5ee801 |
line wrap: on
line diff
--- a/libinterp/corefcn/hex2num.cc Fri Dec 18 16:22:53 2015 -0500 +++ b/libinterp/corefcn/hex2num.cc Fri Dec 18 15:37:22 2015 -0800 @@ -65,8 +65,6 @@ @seealso{num2hex, hex2dec, dec2hex}\n\ @end deftypefn") { - octave_value retval; - int nargin = args.length (); if (nargin < 1 || nargin > 2) @@ -74,109 +72,103 @@ if (nargin == 2 && ! args(1).is_string ()) error ("hex2num: CLASS must be a string"); + + const charMatrix cmat = args(0).char_matrix_value (); + std::string prec = (nargin == 2) ? args(1).string_value () : "double"; + bool is_single = (prec == "single"); + octave_idx_type nchars = (is_single) ? 8 : 16; + + if (cmat.columns () > nchars) + error ("hex2num: S must be no more than %d characters", nchars); + else if (prec != "double" && prec != "single") + error ("hex2num: CLASS must be either \"double\" or \"single\""); + + octave_value retval; + octave_idx_type nr = cmat.rows (); + octave_idx_type nc = cmat.columns (); + + if (is_single) + { + FloatColumnVector m (nr); + + for (octave_idx_type i = 0; i < nr; i++) + { + union + { + uint32_t ival; + float dval; + } num; + + num.ival = 0; + + for (octave_idx_type j = 0; j < nc; j++) + { + unsigned char ch = cmat.elem (i, j); + + if (isxdigit (ch)) + { + num.ival <<= 4; + if (ch >= 'a') + num.ival += static_cast<uint32_t> (ch - 'a' + 10); + else if (ch >= 'A') + num.ival += static_cast<uint32_t> (ch - 'A' + 10); + else + num.ival += static_cast<uint32_t> (ch - '0'); + } + else + { + error ("hex2num: illegal character found in string S"); + break; + } + } + + if (nc < nchars) + num.ival <<= (nchars - nc) * 4; + + m(i) = num.dval; + } + + retval = m; + } else { - const charMatrix cmat = args(0).char_matrix_value (); - std::string prec = (nargin == 2) ? args(1).string_value () : "double"; - bool is_single = (prec == "single"); - octave_idx_type nchars = (is_single) ? 8 : 16; - - if (cmat.columns () > nchars) - error ("hex2num: S must be no more than %d characters", nchars); - else if (prec != "double" && prec != "single") - error ("hex2num: CLASS must be either \"double\" or \"single\""); - else - { - octave_idx_type nr = cmat.rows (); - octave_idx_type nc = cmat.columns (); - - if (is_single) - { - FloatColumnVector m (nr); + ColumnVector m (nr); - for (octave_idx_type i = 0; i < nr; i++) - { - union - { - uint32_t ival; - float dval; - } num; - - num.ival = 0; - - for (octave_idx_type j = 0; j < nc; j++) - { - unsigned char ch = cmat.elem (i, j); + for (octave_idx_type i = 0; i < nr; i++) + { + union + { + uint64_t ival; + double dval; + } num; - if (isxdigit (ch)) - { - num.ival <<= 4; - if (ch >= 'a') - num.ival += static_cast<uint32_t> (ch - 'a' + 10); - else if (ch >= 'A') - num.ival += static_cast<uint32_t> (ch - 'A' + 10); - else - num.ival += static_cast<uint32_t> (ch - '0'); - } - else - { - error ("hex2num: illegal character found in string S"); - break; - } - } + num.ival = 0; + + for (octave_idx_type j = 0; j < nc; j++) + { + unsigned char ch = cmat.elem (i, j); - if (nc < nchars) - num.ival <<= (nchars - nc) * 4; - - m(i) = num.dval; + if (isxdigit (ch)) + { + num.ival <<= 4; + if (ch >= 'a') + num.ival += static_cast<uint64_t> (ch - 'a' + 10); + else if (ch >= 'A') + num.ival += static_cast<uint64_t> (ch - 'A' + 10); + else + num.ival += static_cast<uint64_t> (ch - '0'); } - - retval = m; + else + error ("hex2num: illegal character found in string S"); } - else - { - ColumnVector m (nr); - - for (octave_idx_type i = 0; i < nr; i++) - { - union - { - uint64_t ival; - double dval; - } num; - - num.ival = 0; - - for (octave_idx_type j = 0; j < nc; j++) - { - unsigned char ch = cmat.elem (i, j); - if (isxdigit (ch)) - { - num.ival <<= 4; - if (ch >= 'a') - num.ival += static_cast<uint64_t> (ch - 'a' + 10); - else if (ch >= 'A') - num.ival += static_cast<uint64_t> (ch - 'A' + 10); - else - num.ival += static_cast<uint64_t> (ch - '0'); - } - else - { - error ("hex2num: illegal character found in string S"); - break; - } - } + if (nc < nchars) + num.ival <<= (nchars - nc) * 4; - if (nc < nchars) - num.ival <<= (nchars - nc) * 4; + m(i) = num.dval; + } - m(i) = num.dval; - } - - retval = m; - } - } + retval = m; } return retval; @@ -220,11 +212,11 @@ @seealso{hex2num, hex2dec, dec2hex}\n\ @end deftypefn") { - octave_value retval; - if (args.length () != 1) print_usage (); + octave_value retval; + if (args(0).is_single_type ()) { const FloatColumnVector v (args(0).float_vector_value ());