Mercurial > forge
annotate extra/NaN/src/str2array.cpp @ 12693:c76411f5c22e octave-forge
fix prototyp definition of mexFunktion (reverts partly commit 12878)
author | schloegl |
---|---|
date | Sat, 12 Sep 2015 19:19:57 +0000 |
parents | 13815b367946 |
children |
rev | line source |
---|---|
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
1 //------------------------------------------------------------------- |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
2 // C-MEX implementation of STR2ARRAY - this function is part of the NaN-toolbox. |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
3 // Actually, it also fixes a problem in STR2ARRAY.m described here: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
4 // http://www-old.cae.wisc.edu/pipermail/help-octave/2007-December/007325.html |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
5 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
6 // This program is free software; you can redistribute it and/or modify |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
7 // it under the terms of the GNU General Public License as published by |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
8 // the Free Software Foundation; either version 3 of the License, or |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
9 // (at your option) any later version. |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
10 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
11 // This program is distributed in the hope that it will be useful, |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
14 // GNU General Public License for more details. |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
15 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
16 // You should have received a copy of the GNU General Public License |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
17 // along with this program; if not, see <http://www.gnu.org/licenses/>. |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
18 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
19 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
20 // usage: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
21 // [...] = STR2ARRAY(s) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
22 // [...] = STR2ARRAY(sa) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
23 // [...] = STR2ARRAY(s,cdelim) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
24 // [...] = STR2ARRAY(s,cdelim,rdelim) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
25 // [...] = STR2ARRAY(s,cdelim,rdelim,ddelim) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
26 // [num,status,strarray] = STR2ARRAY(...) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
27 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
28 // Input: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
29 // s char string |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
30 // sa cell array of strings |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
31 // cdelim column delimiter |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
32 // rdelim row delimiter |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
33 // ddelim decimal delimiter |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
34 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
35 // Output: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
36 // $Id: STR2ARRAY.cpp 7142 2010-03-30 18:48:06Z schloegl $ |
12436
b8b7b9fe9eb2
str2array: revert last change because it breaks beckward compatibility
schloegl
parents:
12363
diff
changeset
|
37 // Copyright (C) 2010,2011 Alois Schloegl <alois.schloegl@gmail.com> |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
38 // This function is part of the NaN-toolbox |
7889 | 39 // http://pub.ist.ac.at/~schloegl/matlab/NaN/ |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
40 // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
41 //------------------------------------------------------------------- |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
42 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
43 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
44 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
45 #include <ctype.h> |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
46 #include <math.h> |
7888 | 47 #include <stdint.h> |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
48 #include <string.h> |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
49 #include "mex.h" |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
50 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
51 #ifdef tmwtypes_h |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
52 #if (MX_API_VER<=0x07020000) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
53 typedef int mwSize; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
54 #endif |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
55 #endif |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
56 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
57 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
58 int str2val(char *s, double *r, double *i) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
59 { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
60 /* |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
61 str2val converts string into numeric value. real and complex numbers are supported. |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
62 complex numbers are "3.4 + 5.6i" or "3.4 + i * 5.6" (spaces are optional) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
63 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
64 input: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
65 s char string |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
66 output: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
67 *r real value |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
68 *i imaginary value |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
69 return values: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
70 0: conversion failed |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
71 1: real number returned: |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
72 2: complex number returned |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
73 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
74 */ |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
75 char *endptr = NULL; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
76 double val = strtod(s, &endptr); // conversion |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
77 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
78 while (isspace(*endptr)) endptr++; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
79 #ifdef DEBUG |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
80 mexPrintf("123<%s>\t,%f,\t[%s]\n",s,val,endptr); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
81 #endif |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
82 if (!*endptr) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
83 // conversion successful |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
84 *r = val; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
85 return(1); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
86 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
87 else if ((*endptr=='+') || (*endptr=='-')) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
88 // imaginary part |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
89 double sgn = (*endptr=='+') ? 1.0 : -1.0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
90 double ival; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
91 while (isspace(*(++endptr))); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
92 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
93 if (*endptr=='i') { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
94 // case " a + i * b " |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
95 while (isspace(*(++endptr))); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
96 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
97 if (*endptr=='*') { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
98 ival = strtod(endptr+1, &endptr); // conversion |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
99 if (*endptr && !isspace(*endptr)) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
100 return(0); // failed |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
101 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
102 else { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
103 *r = val; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
104 *i = sgn*ival; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
105 return(2); // |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
106 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
107 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
108 else |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
109 return(0); //failed |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
110 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
111 else { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
112 // case " a + bi " |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
113 ival = strtod(endptr, &endptr); // conversion |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
114 if (*endptr != 'i') return(0); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
115 endptr++; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
116 while (*endptr) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
117 if (!isspace(*endptr)) return(0); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
118 endptr++; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
119 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
120 *r = val; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
121 *i = sgn*ival; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
122 return(2); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
123 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
124 } |
12692
13815b367946
use size_t instead of mwSize/mwIndex whenever possible
schloegl
parents:
12436
diff
changeset
|
125 else //if (*endptr && !isspace(*endptr)) |
13815b367946
use size_t instead of mwSize/mwIndex whenever possible
schloegl
parents:
12436
diff
changeset
|
126 { |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
127 // conversion failed |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
128 return(0); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
129 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
130 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
131 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
132 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
133 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
134 void mexFunction( |
12693
c76411f5c22e
fix prototyp definition of mexFunktion (reverts partly commit 12878)
schloegl
parents:
12692
diff
changeset
|
135 int nlhs, /* number of expected outputs */ |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
136 mxArray *plhs[], /* array of pointers to output arguments */ |
12693
c76411f5c22e
fix prototyp definition of mexFunktion (reverts partly commit 12878)
schloegl
parents:
12692
diff
changeset
|
137 int nrhs, /* number of inputs */ |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
138 const mxArray *prhs[] /* array of pointers to input arguments */ |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
139 ) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
140 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
141 { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
142 char *s = NULL; |
8924
caddf4cd12de
correct name of bland_altman; address compiler warning warning: deprecated conversion from string constant
schloegl
parents:
8037
diff
changeset
|
143 const char *cdelim = "\x09,"; |
caddf4cd12de
correct name of bland_altman; address compiler warning warning: deprecated conversion from string constant
schloegl
parents:
8037
diff
changeset
|
144 const char *rdelim = "\x0a;"; |
caddf4cd12de
correct name of bland_altman; address compiler warning warning: deprecated conversion from string constant
schloegl
parents:
8037
diff
changeset
|
145 const char *ddelim = NULL; |
caddf4cd12de
correct name of bland_altman; address compiler warning warning: deprecated conversion from string constant
schloegl
parents:
8037
diff
changeset
|
146 const char *valid_delim = " ()[]{},;:\"|/\x21\x22\x09\0x0a\0x0b\0x0c\0x0d\x00"; // valid delimiter |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
147 uint8_t *u; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
148 size_t slen = 0,k; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
149 size_t maxcol=0, maxrow=0, nr, nc; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
150 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
151 if (nrhs<1) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
152 mexPrintf(" STR2ARRAY.MEX converts delimiter text files into arrays of numerics and cell-strings\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
153 mexPrintf(" STR2ARRAY.MEX converts delimiter text files into numeric arrays\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
154 mexPrintf(" It fixes a problem of the old STR2DOUBLE discussed here: http://www-old.cae.wisc.edu/pipermail/help-octave/2007-December/007325.html\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
155 mexPrintf(" at avoids using the insecure STR2NUM using EVAL\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
156 mexPrintf("\n Usage of STR2ARRAY:\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
157 mexPrintf("\t[...] = STR2ARRAY(s)\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
158 mexPrintf("\t[...] = STR2ARRAY(sa)\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
159 mexPrintf("\t[...] = STR2ARRAY(s,cdelim)\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
160 mexPrintf("\t[...] = STR2ARRAY(s,cdelim,rdelim)\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
161 mexPrintf("\t[...] = STR2ARRAY(s,cdelim,rdelim,ddelim)\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
162 mexPrintf("\t[num,status,strarray] = STR2ARRAY(...)\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
163 mexPrintf(" Input:\n\ts\tstring\n\tsa\tcell array of strings\n\tcdelim\tlist of column delimiters (default: \"<Tab>,\"\n\trdelim\tlist of row delimiter (defautlt: \"<LF><CR>;\")"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
164 mexPrintf("\n\tddelim\tdecimal delimiter (default: \".\"). This is useful if decimal delimiter is a comma (e.g. after Excel export in Europe)\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
165 mexPrintf(" Output:\n\tnum\tnumeric array\n\tstatus\tflag failing conversion\n\tstrarray\tcell array of strings contains strings of failed conversions\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
166 mexPrintf("\nExamples:\n\tSTR2ARRAY('4.12')\n\tSTR2ARRAY('1.2 - 3.4e2i') complex numbers\n\tSTR2ARRAY('101.01 , 0-i4; 1.2 - i * 3.4, abc')\n\tSTR2ARRAY({'101.01', '0-i4'; '1.2 - i * 3.4', 'abc'})\n\tSTR2ARRAY('1,2;a,b,c;3,4')\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
167 mexPrintf("\tSTR2ARRAY('1;2,3;4',';',',') exchange row- and column delimiter\n\tSTR2ARRAY('1,200 4;3,400 5',' ',';',',') replace decimal delimter\n"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
168 return; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
169 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
170 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
171 /* sanity check of input arguments */ |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
172 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
173 if ((nrhs==1) && mxIsCell(prhs[0])) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
174 // cell array of strings |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
175 maxrow = mxGetM(prhs[0]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
176 maxcol = mxGetN(prhs[0]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
177 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
178 /* allocate output memory */ |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
179 if (nlhs>2) plhs[2] = mxCreateCellMatrix(maxrow, maxcol); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
180 uint8_t *v = NULL; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
181 if (nlhs>1) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
182 plhs[1] = mxCreateLogicalMatrix(maxrow, maxcol); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
183 v = (uint8_t*)mxGetData(plhs[1]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
184 memset(v, 1, maxrow*maxcol); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
185 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
186 plhs[0] = mxCreateDoubleMatrix(maxrow, maxcol, mxREAL); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
187 double *o = (double*)mxGetData(plhs[0]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
188 double *oi= NULL; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
189 for (k=0; k<maxrow*maxcol; k++) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
190 o[k] = 0.0/0.0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
191 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
192 for (k = 0; k < maxrow*maxcol; k++) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
193 double ival; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
194 char *s = mxArrayToString(mxGetCell(prhs[0],k)); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
195 if (s==NULL) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
196 mxArray *a = mxGetCell(prhs[0],k); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
197 /* |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
198 this does not work because a must not be modified |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
199 if (nlhs>2) mxSetCell(plhs[2], k, a); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
200 */ |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
201 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
202 else { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
203 int typ = str2val(s, o+k, &ival); |
12692
13815b367946
use size_t instead of mwSize/mwIndex whenever possible
schloegl
parents:
12436
diff
changeset
|
204 if ((nlhs>2) && (typ==0)) mxSetCell(plhs[2], (mwSize)k, mxCreateString(s)); |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
205 if ((nlhs>1) && (typ> 0)) v[k] = 0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
206 if (typ==2) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
207 if (mxGetPi(plhs[0])==NULL) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
208 oi = (double*) mxCalloc(maxrow*maxcol, sizeof(double)); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
209 mxSetPi(plhs[0], oi); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
210 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
211 oi[k] = ival; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
212 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
213 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
214 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
215 // cell-array input is finished |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
216 return; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
217 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
218 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
219 if (nrhs>0) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
220 if (mxIsChar(prhs[0])) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
221 s = mxArrayToString(prhs[0]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
222 slen = mxGetNumberOfElements(prhs[0]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
223 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
224 else |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
225 mexErrMsgTxt("arg1 is not a char array"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
226 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
227 if (nrhs>1) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
228 if (mxIsChar(prhs[1])) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
229 cdelim = mxArrayToString(prhs[1]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
230 else |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
231 mexErrMsgTxt("arg2 is not a char array"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
232 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
233 if (nrhs>2) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
234 if (mxIsChar(prhs[2])) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
235 rdelim = mxArrayToString(prhs[2]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
236 else |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
237 mexErrMsgTxt("arg3 is not a char array"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
238 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
239 if (nrhs>3) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
240 if (mxIsChar(prhs[3]) && (mxGetNumberOfElements(prhs[3])==1) ) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
241 ddelim = mxArrayToString(prhs[3]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
242 for (k=0; k<slen; k++) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
243 if (s[k]==ddelim[0]) |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
244 s[k] = '.'; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
245 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
246 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
247 else |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
248 mexErrMsgTxt("arg4 is not a single char"); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
249 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
250 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
251 /* identify separators */ |
7068
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
252 u = (uint8_t*) mxCalloc(1,slen+1); |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
253 for (k = 0; k < slen; ) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
254 if (strchr(cdelim,s[k]) != NULL) { |
12436
b8b7b9fe9eb2
str2array: revert last change because it breaks beckward compatibility
schloegl
parents:
12363
diff
changeset
|
255 u[k] = 1; // column delimiter |
b8b7b9fe9eb2
str2array: revert last change because it breaks beckward compatibility
schloegl
parents:
12363
diff
changeset
|
256 while (s[++k]==' '); // ignore extra space characters |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
257 } |
12436
b8b7b9fe9eb2
str2array: revert last change because it breaks beckward compatibility
schloegl
parents:
12363
diff
changeset
|
258 else if (strchr(rdelim,s[k]) != NULL) |
7068
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
259 u[k++] = 2; // row delimiter |
12436
b8b7b9fe9eb2
str2array: revert last change because it breaks beckward compatibility
schloegl
parents:
12363
diff
changeset
|
260 else |
7068
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
261 k++; // ordinary character |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
262 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
263 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
264 /* count dimensions and set delimiter elements to 0 */ |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
265 nc=0, nr=0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
266 if (u[slen-1]<2) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
267 // when terminating char is not a row delimiter |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
268 nr = (slen>0); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
269 u[slen] = 2; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
270 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
271 for (k = 0; k < slen; ) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
272 if (u[k]==2) { |
7068
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
273 s[k] = 0; |
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
274 nr++; |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
275 if (nc > maxcol) maxcol=nc; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
276 nc = 0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
277 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
278 else if (u[k]==1) { |
7068
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
279 s[k] = 0; |
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
280 nc++; |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
281 } |
7068
08be2816321a
bug fix for uninitialized u[k] causing seg-faults
schloegl
parents:
7029
diff
changeset
|
282 k++; |
7029
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
283 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
284 if (nc > maxcol) maxcol=nc; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
285 maxcol += (slen>0); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
286 maxrow = nr; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
287 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
288 /* allocate output memory */ |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
289 if (nlhs>2) plhs[2] = mxCreateCellMatrix(maxrow, maxcol); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
290 uint8_t *v = NULL; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
291 if (nlhs>1) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
292 plhs[1] = mxCreateLogicalMatrix(maxrow, maxcol); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
293 v = (uint8_t*)mxGetData(plhs[1]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
294 memset(v,1,maxrow*maxcol); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
295 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
296 plhs[0] = mxCreateDoubleMatrix(maxrow, maxcol, mxREAL); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
297 double *o = (double*)mxGetData(plhs[0]); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
298 double *oi = NULL; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
299 for (k=0; k<maxrow*maxcol; k++) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
300 o[k] = 0.0/0.0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
301 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
302 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
303 nr = 0; nc = 0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
304 size_t last=0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
305 for (k = 0; k <= slen; k++) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
306 if (u[k]) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
307 // delimiter triggers action |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
308 size_t idx = nr+nc*maxrow; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
309 if (last==k) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
310 // empty field |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
311 o[idx] = 0.0/0.0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
312 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
313 else { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
314 double ival; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
315 int typ = str2val(s+last, o+idx, &ival); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
316 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
317 if ((nlhs>2) && (typ==0)) mxSetCell(plhs[2], idx, mxCreateString(s+last)); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
318 if ((nlhs>1) && (typ> 0)) v[idx] = 0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
319 if (typ==2) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
320 if (oi==NULL) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
321 oi = (double*) mxCalloc(maxrow*maxcol, sizeof(double)); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
322 mxSetPi(plhs[0], oi); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
323 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
324 oi[idx] = ival; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
325 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
326 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
327 |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
328 nc++; // next element |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
329 if (u[k]==2) { |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
330 nr++; // next row |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
331 nc = 0; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
332 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
333 last = k+1; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
334 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
335 } |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
336 mxFree(u); |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
337 }; |
e49443313691
rename STR2DOUBLE to STR2ARRAY, ignore extra space characters
schloegl
parents:
diff
changeset
|
338 |