The R Project SVN R

Rev

Rev 28254 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 28254 Rev 28362
Line 76... Line 76...
76
    if (!isNumeric(snr) || !isNumeric(snc))
76
    if (!isNumeric(snr) || !isNumeric(snc))
77
	error("non-numeric matrix extent");
77
	error("non-numeric matrix extent");
78
 
78
 
79
    lendat = length(vals);
79
    lendat = length(vals);
80
    nr = asInteger(snr);
80
    nr = asInteger(snr);
-
 
81
    if (nr == NA_INTEGER) /* This is < 0 */
-
 
82
	error("matrix: invalid nrow value (too large or NA)");
-
 
83
    if (nr < 0)
-
 
84
	error("matrix: invalid nrow value (< 0)");
81
    nc = asInteger(snc);
85
    nc = asInteger(snc);
-
 
86
    if (nc < 0)
-
 
87
	error("matrix: invalid ncol value (< 0)");
-
 
88
    if (nc == NA_INTEGER)
-
 
89
	error("matrix: invalid ncol value (too large or NA)");
-
 
90
    if (nc < 0)
-
 
91
	error("matrix: invalid ncol value (< 0)");
82
 
92
 
83
    if(lendat > 0 ) {
93
    if(lendat > 0 ) {
84
	if (lendat > 1 && (nr * nc) % lendat != 0) {
94
	if (lendat > 1 && (nr * nc) % lendat != 0) {
85
	    if (((lendat > nr) && (lendat / nr) * nr != lendat) ||
95
	    if (((lendat > nr) && (lendat / nr) * nr != lendat) ||
86
		((lendat < nr) && (nr / lendat) * lendat != nr))
96
		((lendat < nr) && (nr / lendat) * lendat != nr))
Line 92... Line 102...
92
	else if ((lendat > 1) && (nr * nc == 0)){
102
	else if ((lendat > 1) && (nr * nc == 0)){
93
	    warning("data length exceeds size of matrix");
103
	    warning("data length exceeds size of matrix");
94
	}
104
	}
95
    }
105
    }
96
 
106
 
-
 
107
    if ((double)nr * (double)nc > INT_MAX)
-
 
108
	error("matrix: too many elements specified");
-
 
109
 
97
    PROTECT(snr = allocMatrix(TYPEOF(vals), nr, nc));
110
    PROTECT(snr = allocMatrix(TYPEOF(vals), nr, nc));
98
    if(lendat) {
111
    if(lendat) {
99
	if (isVector(vals))
112
	if (isVector(vals))
100
	    copyMatrix(snr, vals, byrow);
113
	    copyMatrix(snr, vals, byrow);
101
	else
114
	else
Line 145... Line 158...
145
    SEXP s, t;
158
    SEXP s, t;
146
    int n;
159
    int n;
147
 
160
 
148
    if (nrow < 0 || ncol < 0)
161
    if (nrow < 0 || ncol < 0)
149
	error("negative extents to matrix");
162
	error("negative extents to matrix");
-
 
163
    if ((double)nrow * (double)ncol > INT_MAX)
-
 
164
	error("allocMatrix: too many elements specified");
150
    n = nrow * ncol;
165
    n = nrow * ncol;
151
    PROTECT(s = allocVector(mode, n));
166
    PROTECT(s = allocVector(mode, n));
152
    PROTECT(t = allocVector(INTSXP, 2));
167
    PROTECT(t = allocVector(INTSXP, 2));
153
    INTEGER(t)[0] = nrow;
168
    INTEGER(t)[0] = nrow;
154
    INTEGER(t)[1] = ncol;
169
    INTEGER(t)[1] = ncol;
Line 160... Line 175...
160
 
175
 
161
SEXP allocArray(SEXPTYPE mode, SEXP dims)
176
SEXP allocArray(SEXPTYPE mode, SEXP dims)
162
{
177
{
163
    SEXP array;
178
    SEXP array;
164
    int i, n;
179
    int i, n;
-
 
180
    double dn;
165
 
181
 
166
    n = 1;
182
    dn = n = 1;
167
    for (i = 0; i < LENGTH(dims); i++)
183
    for (i = 0; i < LENGTH(dims); i++) {
168
	n = n * INTEGER(dims)[i];
184
	dn *= INTEGER(dims)[i];
-
 
185
	if(dn > INT_MAX)
-
 
186
	    error("allocArray: too many elements specified by dims");
-
 
187
	n *= INTEGER(dims)[i];
-
 
188
    }
169
 
189
 
170
    PROTECT(dims = duplicate(dims));
190
    PROTECT(dims = duplicate(dims));
171
    PROTECT(array = allocVector(mode, n));
191
    PROTECT(array = allocVector(mode, n));
172
    setAttrib(array, R_DimSymbol, dims);
192
    setAttrib(array, R_DimSymbol, dims);
173
    UNPROTECT(2);
193
    UNPROTECT(2);