File: ml4.i

package info (click to toggle)
yorick-ml4 0.5.1-3
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 132 kB
  • ctags: 68
  • sloc: ansic: 689; makefile: 103
file content (145 lines) | stat: -rw-r--r-- 4,509 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* ml4.i Yorick plugin
 *
 * Yorick wrappers for ml4.c
 * Matlab 4 IO
 *
 * $Id: ml4.i,v 1.1.1.1 2007/12/28 17:45:09 frigaut Exp $
 * Francois Rigaut, 2005-2007
 * last revision/addition: 2007jun14
 *
 * Copyright (c) 2005, Francois RIGAUT (frigaut@gemini.edu, Gemini
 * Observatory, 670 N A'Ohoku Place, HILO HI-96720).
 *
 * This program is free software; you can redistribute it and/or  modify it
 * under the terms of the GNU General Public License  as  published  by the
 * Free Software Foundation; either version 2 of the License,  or  (at your
 * option) any later version.
 *
 * This program is distributed in the hope  that  it  will  be  useful, but
 * WITHOUT  ANY   WARRANTY;   without   even   the   implied   warranty  of
 * MERCHANTABILITY or  FITNESS  FOR  A  PARTICULAR  PURPOSE.   See  the GNU
 * General Public License for more details (to receive a  copy  of  the GNU
 * General Public License, write to the Free Software Foundation, Inc., 675
 * Mass Ave, Cambridge, MA 02139, USA).
 *
 * $log$
 *
*/

plug_in,"ml4";

local ml4
/* DOCUMENT matlab4 I/O
   This package was develop for the Gemini MCAO (RTC file exchange)
   Available functions:
   ml4scan(file[,maxvar])
   ml4search(file,varname)
   ml4read(file,varname,leave_open)
   ml4close,file
   ml4write(file,data,varname,mode,endian=)
   SEE ALSO:
 */

extern ml4endian
/* DOCUMENT ml4endian
   return 1 is machine is little endian, 0 if big endian
   SEE ALSO:
 */

if (ml4endian) default_endian='L'; else default_endian='B';

extern ml4scan
/* DOCUMENT ml4scan,file[,maxvar]
   Scans a matlab4 file for variables and output name, type and dimension.
   If used as a subroutine, the result is printed on the screen.
   If used as a function, returns what would have been printed on the screen.
   maxvar is the maximum number of variables to scan (optional).
   SEE ALSO: ml4read, ml4search
 */

extern ml4search
/* DOCUMENT ml4search(file,varname)
   Returns 1 if the variable is present in file, 0 otherwise
   SEE ALSO: ml4scan, ml4read
 */

extern ml4read
/* DOCUMENT ml4read(file,varname,leave_open)
   Returns the data associated with "varname"
   leave_open will prevent closing the file when the operation is completed.
   This can be useful when reading files containing large numbers of variables.
   Be aware that it is left open, pointed at the next variable in the file.
   Hence a request to read a variable located prior to the one you just read
   will fail ("No Such Variable").
   When the variable read is corrupted (i.e. with NaN), the file is not close
   and hence requires a manual ml4close.
   SEE ALSO: ml4scan, ml4search, ml4close.
 */

extern ml4close
/* DOCUMENT ml4close,file
   Closes access to the matlab4 file.
   SEE ALSO:
 */

func ml4write(file,data,varname,mode,endian=)
/* DOCUMENT ml4write(file,data,varname,mode,endian=)
   mode : "w" or "a"
   endian= 'L' will write the file in little endian. Useful if the target
   machine uses little endian.
   SEE ALSO: ml4read, ml4close
 */
{
  if ((mode!="w")&&(mode!="a")) error,"mode should be \"w\" or \"a\"";
  if (default_endian) endian=default_endian;
  //  if (!endian) endian='B';
  if ((endian!='L')&&(endian!='B')) error,"Endian should be 'L' or 'B'";
  
  if (structof(data)==string) {
    status=matout_string(file, varname, data(1), mode);
    if (status) error,"string write failed";
    return;
  }

  dims = dimsof(data);

  if (dims(1)>2) error,"ml4write only supports writing up 2D arrays";

  if (dims(1)==0) {
    nrows=1n;
    ncols=1n;
  } else if (dims(1)==1) {
    nrows=1n;
    ncols=int(dims(2));
  } else if (dims(1)==2) {
    nrows=int(dims(2));
    ncols=int(dims(3));
  }
  
  if      (structof(data)==long)   { type='l'; }
  else if (structof(data)==int)    { type='l'; }
  else if (structof(data)==float)  { type='r'; }
  else if (structof(data)==double) { type='d'; }
  else if (structof(data)==short)  { type='s'; }
  else if (structof(data)==char)   { type='b'; }
  else error,"Unsupported type";

  tmp = data; // otherwise data may be swapped in place in endian='L'
  
  status = matout(file,varname,&tmp,nrows,ncols,type,mode,endian);
  if (status) error,"write failed";
}

//=====================================================

extern matout
/* PROTOTYPE
   int matout(string filename, string varname, pointer ptr,
   int nrows, int ncols, char vartype, string mode, char endianess)
*/

extern matout_string
/* PROTOTYPE
   int matout_string(string filename, string varname, string text, string mode)
*/