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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
c101c486d80a fix web address
schloegl
parents: 7888
diff changeset
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
b9f35668b55e replace <inttypes.h> with <stdint.h>
schloegl
parents: 7068
diff changeset
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