Mercurial > octave
diff src/file-io.cc @ 471:32fb3a762074
[project @ 1994-06-06 08:55:13 by jwe]
author | jwe |
---|---|
date | Mon, 06 Jun 1994 08:55:32 +0000 |
parents | a1b3aae0fbc3 |
children | 88614b380d6e |
line wrap: on
line diff
--- a/src/file-io.cc Mon Jun 06 08:48:27 1994 +0000 +++ b/src/file-io.cc Mon Jun 06 08:55:32 1994 +0000 @@ -1208,114 +1208,46 @@ } /* - * Find out how many elements are left. - * - * size is the size of the elements - * nr is the number of rows or columns in the matrix + * Find out how many elements are left to read. */ static long -get_whats_left (FILE *fptr, int size, int nn) +num_items_remaining (FILE *fptr, char *type) { + size_t size; + + if (strcasecmp (type, "uchar") == 0) + size = sizeof (u_char); + else if (strcasecmp (type, "char") == 0) + size = sizeof (char); + else if (strcasecmp (type, "short") == 0) + size = sizeof (short); + else if (strcasecmp (type, "ushort") == 0) + size = sizeof (u_short); + else if (strcasecmp (type, "int") == 0) + size = sizeof (int); + else if (strcasecmp (type, "uint") == 0) + size = sizeof (u_int); + else if (strcasecmp (type, "long") == 0) + size = sizeof (long); + else if (strcasecmp (type, "ulong") == 0) + size = sizeof (u_long); + else if (strcasecmp (type, "float") == 0) + size = sizeof (float); + else if (strcasecmp (type, "double") == 0) + size = sizeof (double); + else + return 0; + long curr_pos = ftell (fptr); fseek (fptr, 0, SEEK_END); long end_of_file = ftell (fptr); - fseek (fptr, end_of_file, SEEK_SET); + fseek (fptr, curr_pos, SEEK_SET); long len = end_of_file - curr_pos; - long num_items = len / size / nn; - - if (len > num_items * size * nn) - num_items++; - - return num_items; -} - -static void -get_size_conv (const char *preci, int& size, Matrix::conversion& conv, - const char *warn) -{ -// Get type and number of bytes per element to read. - - char *prec = strdup (preci); - char *ip = prec; - - while (*ip > 0) - { - tolower (*ip); - ip++; - } - - if (strcmp (prec, "uchar") == 0) - { - size = 1; - conv = Matrix::CNV_UCHAR; - } - else if (strcmp (prec, "char") == 0) - { - size = 1; - conv = Matrix::CNV_CHAR; - } - else if (strcmp (prec, "schar") == 0) - { - size = 1; - conv = Matrix::CNV_CHAR; -// Some systems may need this?? -// size = 1; -// conv = CNV_SCHAR; - } - else if (strcmp (prec, "short") == 0) - { - size = 2; - conv = Matrix::CNV_SHORT; - } - else if (strcmp (prec, "ushort") == 0) - { - size = 2; - conv = Matrix::CNV_USHORT; - } - else if (strcmp (prec, "int") == 0) - { - size = 4; - conv = Matrix::CNV_INT; - } - else if (strcmp (prec, "uint") == 0) - { - size = 4; - conv = Matrix::CNV_UINT; - } - else if (strcmp (prec, "long") == 0) - { - size = 4; - conv = Matrix::CNV_LONG; - } - else if (strcmp (prec, "ulong") == 0) - { - size = 4; - conv = Matrix::CNV_ULONG; - } - else if (strcmp (prec, "float") == 0) - { - size = 4; - conv = Matrix::CNV_FLOAT; - } - else if (strcmp (prec, "double") == 0) - { - size = 8; - conv = Matrix::CNV_DOUBLE; - } - else - { - error ("%s: precision: \'%s\' unknown", warn, prec); - size = -1; - conv = Matrix::CNV_UNKNOWN; - } - - delete [] prec; - - return; + return len / size; } /* @@ -1364,86 +1296,87 @@ } } - int size; - Matrix::conversion conv; - get_size_conv (prec, size, conv, "fread"); - if (size < 0) - return retval; +// Get file info. -// Get file info. file_info file = file_list (p); - FILE * fptr = file.fptr (); + + FILE *fptr = file.fptr (); // Set up matrix to read into. If specified in arguments use that // number, otherwise read everyting left in file. - double dnr = 1.0; - double dnc = 1.0; - int nr = 1; - int nc = 1; + double dnr = 0.0; + double dnc = 0.0; + int nr; + int nc; if (nargin > 2) { -// tree_constant tmpa = args[2].make_numeric (); // ?? - if (args[2].is_scalar_type ()) { tree_constant tmpa = args[2].make_numeric (); - - dnr = 1.0; - dnc = tmpa.double_value (); + dnr = tmpa.double_value (); + dnc = 1.0; } else if (args[2].is_matrix_type ()) { -// tree_constant tmpa = args[2].make_numeric (); // ?? - Matrix tmpm = args[2].to_matrix (); - nr = tmpm.rows (); - nc = tmpm.columns (); + ColumnVector tmp = args[2].to_vector (); - if(nr != 1 || nc > 2) + if (tmp.length () == 2) + { + dnr = tmp.elem (0); + dnc = tmp.elem (1); + } + else + { + error ("fread: invalid size specification\n"); + return retval; + } + } + + if ((xisinf (dnr)) && (xisinf (dnc))) { - error ("fread: Illegal size specification\n"); - print_usage ("fread"); + error ("fread: number of rows and columns cannot both be infinite"); return retval; } - dnr = tmpm.elem (0, 0); - dnc = tmpm.elem (0, 1); - } - if ((xisinf (dnr)) && (xisinf (dnc))) - { - error ("fread: number of rows and columns cannot both be infinite\n"); - return retval; - } - - if (xisinf (dnr)) - { - nc = NINT (dnc); - nr = get_whats_left (fptr, size, nc); - } - else if (xisinf (dnc)) - { - nr = NINT (dnr); - nc = get_whats_left (fptr, size, nr); - } - else - { - nr = NINT (dnr); - nc = NINT (dnc); - } + if (xisinf (dnr)) + { + nc = NINT (dnc); + int n = num_items_remaining (fptr, prec); + nr = n / nc; + if (n > nr * nc) + nr++; + } + else if (xisinf (dnc)) + { + nr = NINT (dnr); + int n = num_items_remaining (fptr, prec); + nc = n / nr; + if (n > nc * nr) + nc++; + } + else + { + nr = NINT (dnr); + nc = NINT (dnc); + } } else { // No size parameter, read what's left of the file. - nr = 1; - nc = get_whats_left (fptr, size, nr); + nc = 1; + int n = num_items_remaining (fptr, prec); + nr = n / nc; + if (n > nr * nc) + nr++; } Matrix m (nr, nc, octave_NaN); // Read data. - int count = m.read (fptr, size, conv); + int count = m.read (fptr, prec); if (nargout > 1) { @@ -1497,21 +1430,11 @@ } } - int size; - Matrix::conversion conv; - get_size_conv(prec, size, conv, "fwrite"); - if (size < 0) - return retval; - -// Get file info. file_info file = file_list (p); -// Write the matrix data. - tree_constant tmpa = args[2].make_numeric (); + Matrix m = args[2].to_matrix (); - Matrix tmpm = tmpa.to_matrix (); - - int count = tmpm.write (file.fptr(), size, conv); + int count = m.write (file.fptr (), prec); retval = new tree_constant[2]; retval[0] = tree_constant ((double) count);