manual.txt
上传用户:szhypcb168
上传日期:2007-01-06
资源大小:2187k
文件大小:36k
源码类别:

语音压缩

开发平台:

Unix_Linux

  1.             USER'S GUIDE TO THE SUNGRAPH FORMAT DISK I/O ROUTINES
  2.                                   JULY 1988
  3.                               TABLE OF CONTENTS
  4. 1.0  INTRODUCTION
  5. 2.0  GENERAL INFORMATION
  6.      2.1 Supported Data Types
  7.      2.2 The Concept of Data Blocks
  8.      2.3 Files Associated with Disk I/O
  9.      2.4 Calling the Disk I/O Routines from C
  10.      2.5 Calling the Disk I/O Routines from FORTRAN
  11.      2.6 Error Reporting
  12. 3.0  USING THE DISK WRITE ROUTINES
  13.      3.1 Description of the Disk Write Routines
  14.           3.1.1 Open File Routine
  15.           3.1.2 Define Variable Routine
  16.           3.1.3 Save Variable Routine
  17.           3.1.4 End Block Routine
  18.           3.1.5 Close File Routine
  19.           3.1.6 Disk Write Error Routines
  20. 4.0  USING THE DISK READ ROUTINES
  21.      4.1 Description of the Disk Read Routines
  22.           4.1.1 Open Variable Channel Routine
  23.           4.1.2 Open Block Channel Routine
  24.           4.1.3 Read Format Routine
  25.           4.1.4 File Length Routine
  26.           4.1.5 Goto Sample Routine
  27.           4.1.6 Read Variable Routine
  28.           4.1.7 Goto Block Routine
  29.           4.1.8 Read Block Routine
  30.           4.1.9 Close Channel Routine
  31.           4.1.10 Disk Read Error Routines
  32. 1.0  INTRODUCTION
  33.      A set of routines to transfer data between programs and disk was
  34. developed as part of the SUNGRAPH project.  The primary use of these routines
  35. is to transfer data from a program to SUNGRAPH.  In this case, the user's
  36. program uses only the disk write routines.  Another use for these routines is
  37. to pass data between user's programs in situations where disk storage is
  38. needed, but display with SUNGRAPH is not necessary.  In this case, the user
  39. will need to use the disk read routines as well.  This document describes
  40. each disk I/O routine and how to use them.  It does not describe the actual
  41. format of the disk files which the routines use.
  42. 2.0  GENERAL INFORMATION
  43.      The disk I/O routines are written in C and are available on the Alliant
  44. and the Suns.  Calling them from C programs is just like calling any C
  45. function.  Porting the routines to other machines should be straightforward.
  46. A FORTRAN interface to the I/O routines is provided for the Alliant and Sun
  47. machines.  These interfaces are machine dependent and therefore don't port
  48. easily to other machines.
  49. 2.1  Supported Data Types
  50.      The disk I/O routines enable users to write and read variables of several
  51. data types.  The current version supports two and four byte integers and four
  52. byte floating point variables.  Other data types can be added quite easily as
  53. the need arises. 
  54. 2.2  The Concept of Data Blocks
  55.      A data file can contain the values of one or more variables.  The files
  56. and the routines which read and write them are organized around the concept of
  57. data blocks.  A data block is the elementary unit of a data file and consists
  58. of one or more values of each variable stored in the file.  When a new file is
  59. created, the user decides how many variables the file will have and how many
  60. values of each variable will be saved per data block.  A data file consists of
  61. an arbitrary number of concatenated data blocks.
  62. 2.3  Files Associated With Disk I/O
  63.      Data files created by the disk write routines have the extension
  64. .sg_data.  These files consist entirely of data saved by the user; there is NO
  65. header or record information.  Associated with each data file is a format file
  66. having the extension .sg_format.  The format file (which has the function of a
  67. small header) has information about the data file.  The format file contains
  68. the following: 
  69.      a) a number indicating data file type
  70.      b) the number of variables in the data file
  71.      c) for each variable in the file:
  72.           1) data type
  73.           2) number of values per block
  74.           3) name
  75. The description for the read_format routine contains additional information
  76. about the format file.
  77.      Any file written with the disk write routines can be read with the disk
  78. read routines.  One other type of file can be read.  This data file must have
  79. the extension .spd (SPeech Data).  These files usually originate by A/D
  80. conversion of a signal of interest, such as speech.  To be an spd file, the
  81. following must hold: 
  82.      a) the data consists entirely of 16 bit integers stored in the binary
  83. format of the Alliant or Sun (or machine with equivalent representation).  In
  84. FORTRAN, this is an integer*2.  In C, it is a short int.
  85.      b) the sample values are from a single data source.  i.e. the file has
  86. values of a single variable; it is not multiplexed. 
  87. 2.4  Calling the Disk I/O Routines from C
  88.      All object code that you need to link to is contained in one archive
  89. file.  "disk_io.h" is a header file which contains definitions of some
  90. parameters in the read and write routines.  You may want to use some of these
  91. definitions in your program, but this is not necessary.  The files are located
  92. as follows: 
  93.           diskio/disk_io.h
  94.           diskio/disk_io.a
  95. 2.5  Calling the Disk I/O Routines from FORTRAN
  96.      Most of the disk I/O routines can be called from FORTRAN; exceptions
  97. are noted in the routine descriptions.  When calling these routines from
  98. Alliant FORTRAN, string arguments passed to the I/O routines are required to
  99. be terminated with a null.  Put the null right after the last valid character. 
  100.      All object code that you need to link to is contained in one archive
  101. file.  The location of the object files is as follows: 
  102.           diskio/disk_io.a
  103.      The "released" directory also contains source code for all object files
  104. in the archive file. 
  105. 2.6  Error Reporting
  106.      The disk I/O routines check for all but the most unlikely error
  107. conditions.  There are two error reporting methods which the user can select
  108. from.  The default method is that when an error is detected, an error message
  109. is printed.  Program execution is then halted.  The default method is called
  110. auto error reporting.  The other error reporting method is for the disk I/O
  111. routine to return a negative number.  (Disk I/O routines return zero or a
  112. positive number when successful.)  The user checks the return value and takes
  113. appropriate action.  All return values are type int (integer*4 in FORTRAN).  A
  114. routine to turn an error number into an error message is provided.  The
  115. following routine allows the user to change the error handling method. 
  116.      disk_io_erh(flag)   flag is an int (integer*4 in FORTRAN)
  117. When 'flag' is zero, auto error reporting is disabled
  118. When 'flag' is not zero, auto error reporting is enabled.
  119.      The error handling method can be changed as often as you want, thus
  120. allowing some error conditions to be handled automatically and others to be
  121. handled by the user.
  122. 3.0  USING THE DISK WRITE ROUTINES
  123.      There are five routines in the disk write collection:
  124.      1) open_file - opens a file for writing;
  125.      2) def_variable - defines attributes of a variable to be saved;
  126.      3) save_variable - saves the values of a variable;
  127.      4) end_block - declares that all values of the variables have been saved
  128.                     for this block;
  129.      5) close_file - ends the use of a file
  130.      For each file that you want to save variables in, you use a process
  131. similar to the following.  First, open the file with open_file.  Then, for
  132. each variable, declare its name, data type, number of values saved per block,
  133. and default value with the def_variable routine.  These two routines set up
  134. the file so that data can be saved and don't get called again for this file.
  135. Next, save the values of variables with save_variable.  When all values
  136. of a block of file variables have been saved, call end_block.  Repeat the
  137. process of saving variables and ending a block for as much data as you want to
  138. save.  After saving the last block, close the file with close_file. 
  139.      If you use the auto error reporting method, a disk I/O error halts
  140. execution and causes an error message to be printed.  If you don't use this
  141. method, a disk I/O routine indicates an error via a negative return value.
  142. This condition should be tested after using any of these routines and
  143. appropriate action taken if an error occurs.  The disk write error routines
  144. are provided to turn the return value into an error message.
  145. 3.1  Description of the Disk Write Routines
  146. 3.1.1  Open File Routine:
  147.      file_id = open_file ( filename, open_type )
  148.        argument  |  C type  |  FORTRAN type
  149.      ------------+----------+----------------
  150.        filename  |  char *  |  character*80  (or shorter)
  151.       open_type  |   int    |  integer*4
  152.      This routine opens the file "filename" so that data may be written to it.
  153. The parameter "open_type" specifies the following:
  154.      1 - Open the file unconditionally.  Discard any prior data in the file.
  155.      2 - Append to an existing file.
  156.      3 - Open a new file.  If the file already exists, don't open it.
  157.          (An error message will indicate that the file already exists.)
  158.      The data will be written to a file named "filename.sg_data" and
  159. information about this file's format will be written to "filename.sg_format".
  160. Since the variable definition process determines part of the file format
  161. information, the format file is not written until this process terminates
  162. (with the first call to end_block, described below).  When appending to an
  163. existing file, the current format must match that of the appended file.  This
  164. is checked in the first call to end_block. 
  165. Returned value:
  166.      If there are no errors, the returned value is a file id which is used to
  167. identify this open file when using several other of the disk write routines.
  168. A valid file id is >= 0.  If an error occurs, the returned value is < 0.
  169. The following errors are detected:
  170.      - file "filename" is already open
  171.      - filename is too long
  172.      - the number of files currently open is the maximum
  173.      - could not create a format file
  174.      - could not create a data file
  175.      - could not open filename.sg_format for reading
  176.      - could not open filename.sg_data for writing
  177.      - file "filename" exists and open_type prohibits overwriting
  178.      - invalid open_type
  179. 3.1.2  Define Variable Routine:
  180.      
  181.      var_id = def_variable ( file_id, name, type, number, def_val )
  182.        argument  |  C type  |  FORTRAN type
  183.      ------------+----------+----------------
  184.        file_id   |   int    |   integer*4
  185.          name    |  char *  |  character*16  (or shorter)
  186.          type    |   int    |   integer*4
  187.         number   |   int    |   integer*4
  188.        def_val   | "type" * |     "type"     (see description below)
  189.      This routine defines parameters of a variable to be saved.  The
  190. parameters are the variable's name, data type, number per block, and default
  191. value.  Variables in a particular file may be defined until the first call to
  192. end_block for that file; i.e. calling end_block ends the variable definition
  193. process for a file.  The string used as the variable's name does not have to
  194. be the name the calling program uses to reference the variable's values.  It
  195. can be some other string of the programmer's choosing.  This name is used to
  196. select the variable for reading by the disk read routines.  It is also used to
  197. select and label variables in SUNGRAPH.  This routine does NOT check for
  198. duplication of variable names, so be sure that each file variable has a unique
  199. name.  The default value is written if the user has saved fewer than "number"
  200. values per block when end_block is called.  In FORTRAN, the default value's
  201. type must be the saved variable's type.  (e.g.  If type=3, the default value
  202. must be a real*4.)  In C, the default value is a POINTER to a value of the
  203. type specified in the argument list.  (e.g.  If type=3, the default value must
  204. be a pointer to a float.)  The argument "type" refers to data types according
  205. to the following table: 
  206.     TYPE  #  |  C TYPE  |  # of BYTES  |  FORTRAN TYPE
  207.     --------------------------------------------------
  208.        1     |  short |      2       |  integer*2
  209.        2     |   int |      4       |  integer*4
  210.        3     |  float |      4       |    real*4
  211. Returned value:
  212.      When no error occurs, the returned value is a variable id which is used
  213. to identify this variable when saving its values with the save variable
  214. routine.  A valid variable id is >= 0.  If an error occurs, the returned value
  215. is < 0. 
  216. The following errors are detected:
  217.      - 'file_id' is out of range
  218.      - 'file_id' corresponds to an unopened file
  219.      - the file variables have already been defined
  220.      - invalid data type specified
  221.      - invalid number of values specified
  222.      - the maximum number of variables have already been defined
  223.      - variable name is too long
  224.      - could not get a buffer for saved values
  225. 3.1.3  Save Variable Routine:
  226.      status = save_variable ( var_id, values, num )
  227.        argument  |  C type  |  FORTRAN type
  228.      ------------+----------+----------------
  229.         var_id   |   int    |   integer*4
  230.         values   |  varies  |     varies
  231.                  | (array)  |    (array)
  232.          num     |   int    |   integer*4
  233.      This routine saves values of a variable that has been defined.  "values"
  234. is the array of which "num" values will be saved.  The data type of the values
  235. array must match that declared when the variable was defined.  The routine
  236. does NOT test for such a match.  The number of values saved per call can be
  237. from 1 to the number per block specified when the variable was defined with
  238. def_variable.  The total number of values saved per variable cannot exceed the
  239. number per block specified when the variable was defined.  Note to C users:
  240. When saving a single value, be sure that "values" is a POINTER to that value. 
  241. Returned value:
  242.      The returned value indicates the error status of the routine.  If no
  243. error occurs, the returned value is 0.  If an error occurs, the value is < 0. 
  244. The following errors are detected:
  245.      - 'num' < 1
  246.      - 'var_id' is out of range
  247.      - 'var_id' corresponds to an undefined variable
  248.      - all values of this variable have been saved in the current block
  249.      - saved less than the specified number of values because the current
  250.        block became full
  251. 3.1.4  End Block Routine:
  252.      status = end_block ( file_id )
  253.        argument  |  C type  |  FORTRAN type
  254.      ------------+----------+----------------
  255.        file_id   |   int    |   integer*4
  256.      This routine terminates the saving of variables for a block.  This is the
  257. routine which writes the block values to the data file.  The first call to
  258. this routine terminates the variable definition process, i.e. def_variable can
  259. no longer be called for this file_id.  When a file is open for appending, the
  260. first call to this routine checks to see that the variable definition of the
  261. appended file matches the current definition.  An error is returned if not.
  262. Returned value:
  263.      The returned value indicates the error status of the routine.  If no
  264. error occurs, the returned value is 0.  If an error occurs, the value is < 0. 
  265. The following errors are detected:
  266.      - 'file_id' is out of range
  267.      - 'file_id' corresponds to an unopened file
  268.      - current variable definition differs from that of appended file
  269.      - error when writing format file
  270.      - error when writing data buffer to disk
  271.      - no variables have been defined
  272. 3.1.5  Close File Routine:
  273.      status = close_file ( file_id )
  274.        argument  |  C type  |  FORTRAN type
  275.      ------------+----------+----------------
  276.        file_id   |   int    |   integer*4
  277.      This routine closes the file associated with "file_id".  In the event
  278. that more files need to be written than can be opened simultaneously, this
  279. routine provides a way to close a file so that another can be opened. 
  280. Returned value:
  281.      The returned value indicates the error status of the routine.  If no
  282. error occurs, the returned value is 0.  If an error occurs, the value is < 0. 
  283. The following errors are detected:
  284.      - 'file_id' is out of range
  285.      - 'file_id' corresponds to an unopened file
  286. 3.1.6  Disk Write Error Routines:
  287.      print_disk_write_error ( err_num )            (Callable from FORTRAN)
  288.      error_string = disk_write_error ( err_num )   (No FORTRAN interface yet)
  289.        argument  |  C type  |  FORTRAN type
  290.      ------------+----------+----------------
  291.        err_num   |   int    |   integer*4
  292.      The disk write routines return a value which, when less than zero,
  293. corresponds to an error number.  The disk write error routines provide a way
  294. to turn the error number into an appropriate error message.  The
  295. disk_write_error routine returns brief error message corresponding to
  296. "err_num".  The "print_disk_write_error" routine prints a more elaborate error
  297. message.  These routines return "No error" for arguments zero or greater and
  298. "Bad value for error number" if "err_num" is not a value from one of the write
  299. routines. 
  300. 4.0  USING THE DISK READ ROUTINES
  301.      The disk read routines are structured to provide "channels" through which
  302. the file variables flow.  There are two types of channels - variable channels
  303. and block channels.  A variable channel provides access to just one of the
  304. variables in a file, independent of how many variables the file may contain. 
  305. A block channel provides access to all of the variables in a file.  The values
  306. of a variable are read on a variable channel via the read_variable routine.
  307. This routine can return any number of the variable's values in a single call.
  308. Values are read on a block channel via the read_block routine.  This routine
  309. returns one block of values per call.  The reading is done sequentially on
  310. each channel type.  Two routines are provided to modify the point from which
  311. data is read - the goto_sample routine and the goto_block routine.  There is
  312. also a routine to read the file format and one to close channels.
  313. The disk read routines consist of the following:
  314.      1) read_format - reads and returns information about the data file
  315.              format.
  316.      2) open_var_channel - opens a channel to access one variable in a data
  317.              file.
  318.      3) read_variable - reads and returns values of a variable.
  319.      4) goto_sample - re-positions the reading process so that read_variable
  320.              will read from a different sample in the file.
  321.      5) open_block_channel - opens a channel to access all variables in a data
  322.              file.
  323.      6) read_block - reads and returns the values of one block of data.
  324.      7) goto_block - re-positions the reading process so that read_variable
  325.              and read_block will read from a different place in the file.
  326.      8) file_length - return the length of an open file.
  327.      9) close_channel - close an open channel.
  328.      To set-up a variable channel do the following.  First, call
  329. open_var_channel to open a channel and get a channel id.  Then use
  330. read_variable to read values and if necessary, use goto_sample or goto_block
  331. to read non-sequentially.  Call close_channel when you no longer want to read
  332. values of the variable on that channel.  To use a block channel, do the
  333. following.  First, call open_block_channel to open a channel and get a channel
  334. id.  Then use read_block to read one block's worth of values.  Use goto_block
  335. if you need to read other than sequentially.  The read_format routine is
  336. provided to read format information in situations when the file format is not
  337. known at the time your program is being written. 
  338.      If you use the auto error reporting method, a disk I/O error halts
  339. execution and causes an error message to be printed.  If you don't use this
  340. method, a disk I/O routine indicates an error via a negative return value.
  341. This condition should be tested after using any of these routines and
  342. appropriate action taken if an error occurs.  The disk read error routines
  343. are provided to turn the return value into an error message.
  344. 4.1  Description of the Disk Read Routines
  345. 4.1.1  Open Variable Channel Routine:
  346.      chan_id = open_var_channel ( filename, var_name )
  347.        argument  |  C type  |  FORTRAN type
  348.      ------------+----------+----------------
  349.        filename  |  char *  |  character*80  (or shorter)
  350.        var_name  |  char *  |  character*16  (or shorter)
  351.      This routine is called to establish a new channel to access the values of
  352. one of the variables in a data file.  "filename" is the name of the file and
  353. "var_name" is the name of the variable whose values are to be read.  The
  354. variable's values are accessed with the read_variable routine.  This function
  355. returns a channel id which is used to identify the opened channel when calling
  356. other disk read routines.  "filename" can have an extension, but it is not
  357. mandatory.   
  358. If "filename" has an extension:
  359.      a) The extension is tested for validity.  (e.g. Is it .sg_data or one of
  360.         the other types that can be read by these routines?)  Valid extensions
  361.         are: .sg_data  .spd
  362.      b) If the extension is valid, open_var_channel tries to open "filename".
  363.         If the extension is not valid, an error is returned.
  364. If "filename" does not have an extension:
  365.      a) Each valid extension is concatenated in turn with a copy of filename
  366.         and the resulting filename is tested for existence.  The order is:
  367.         .sg_data, .spd.
  368.      b) If this file exists, open_var_channel tries to open it.
  369.         If none of these files exist, an error is returned.
  370.      If the file to be opened is a .sg_data file, the format information must
  371. reside in a corresponding .sg_format file.  There is no format file associated
  372. with .spd files.
  373. Returned value:
  374.      If there are no errors, the returned value is a channel id which is used
  375. to identify the open channel when using other disk read routines.  A valid
  376. channel id is >= 0.  If an error occurs, the returned value is < 0. 
  377. The following errors are detected:
  378.      - filename is too long
  379.      - all channels are open
  380.      - there is a format file problem
  381.        (use read_format to determine the problem)
  382.      - the specified variable was not found
  383.      - invalid extension in filename
  384.      - no data file found
  385.      - the data file could not be opened
  386. 4.1.2  Open Block Channel Routine:
  387.      chan_id = open_block_channel ( filename )
  388.        argument  |  C type  |  FORTRAN type
  389.      ------------+----------+----------------
  390.        filename  |  char *  |  character*80  (or shorter)
  391.      This routine is called to establish a new channel to access the values of
  392. all of the variables in a data file.  The values of the data file variables
  393. are accessed with the read_block routine.  This function returns a channel id
  394. which is used to identify the opened channel when calling other disk read
  395. routines.  The same rules concerning filename extensions described in
  396. open_var_channel apply to open_block_channel.
  397. Returned value:
  398.      If there are no errors, the returned value is a channel id which is used
  399. to identify the open channel when using other disk read routines.  A valid
  400. channel id is >= 0.  If an error occurs, the returned value is < 0. 
  401. The following errors are detected:
  402.      - filename is too long
  403.      - all channels are open
  404.      - there is a format file problem
  405.        (use read_format to determine the problem)
  406.      - invalid extension in filename
  407.      - no data file found
  408.      - the data file could not be opened
  409. 4.1.3  Read Format Routine:
  410.      status = read_format ( filename, format, vnames )
  411.        argument  |  C type  |  FORTRAN type
  412.      ------------+----------+----------------
  413.        filename  |  char *  |  character*80  (or shorter)
  414.         format   |   int    |   integer*4
  415.                  | (array)  |    (array)
  416.         vnames   | char **  |  character*16  (see description)
  417.                  |          |    (array)
  418.      This routine reads the format file associated with file "filename" and
  419. returns this information.  As with the filename argument in the open channel
  420. routines, read_format accepts filenames with or without extensions.  It uses
  421. the same process that the open channel routines use to determine for what data
  422. file the format information is sought.  Hence, for a given filename,
  423. read_format always gets the format which corresponds to the data file opened
  424. by an open channel routine.  (However, read_format accepts filenames that end
  425. with .sg_format.  Such a filename would cause an error if given to an open
  426. channel routine.)  When calling from FORTRAN, vnames should be declared:
  427.      character*16 vnames(n)
  428. n should be equal to or greater than the number of variables in the file.  A
  429. safe choice for n is the maximum number of variables permitted in a file
  430. (currently 36).
  431. The format array contains the following information:
  432.      format[0]   -   file type indicator
  433.                      current meaning (could be expanded later):
  434.                      1 if .sg_data file allows sample & block positioning;
  435.                      0 if this is NOT allowed
  436.      format[1]   -   number of variables/block in .sg_data file
  437.      format[2*n]  -  data type of variable n in .sg_data file
  438.                      1 - short; 2 - int; 3 - float
  439.                      (integer*2; integer*4; real*4 in FORTRAN)
  440.      format[2*n+1] - number of values/block of variable n in .sg_data file
  441. "vnames" is an array of pointers to the names of variables saved in the data
  442. file.  Thus, vnames[0] points to the name of the first variable, vnames[1]
  443. points to the name of the second variable, etc.  In FORTRAN, vnames is an
  444. array of character strings.  vnames(1) has the name of the first variable,
  445. vnames(2) has the name of the second variable, etc.
  446.      The format information comes from a .sg_format file when the data file is
  447. a .sg_data file.  Other data file types have fixed formats which return a set
  448. of parameters stored in this routine.  Listed below are the format parameters
  449. for each of these other data file types.
  450. Format parameters for .spd data files:
  451.      format[0] = 1
  452.      format[1] = 1
  453.      format[2] = 1
  454.      format[3] = 512
  455.      vnames[0] = "speech_data"
  456. (No other data file types are currently defined.)
  457. Returned value:
  458.      The returned value indicates the error status of the routine.  If no
  459. error occurs, the returned value is 0.  If an error occurs, the value is < 0.
  460. The following errors are detected:
  461.      - filename is too long
  462.      - invalid extension in filename
  463.      - no data file found, so can't determine format
  464.      - the format file could not be opened
  465.      - the format file is not complete
  466.      - invalid value read for file type
  467.      - invalid value read for variables/block
  468.      - invalid value read for data type
  469.      - invalid value read for values/block
  470. 4.1.4  File Length Routine:
  471.      status = file_length ( chan_id, bytes, samples, blocks )
  472.        argument  |  C type  |  FORTRAN type
  473.      ------------+----------+----------------
  474.        chan_id   |   int    |   integer*4
  475.         bytes    |  int *   |   integer*4
  476.        samples   |  int *   |   integer*4
  477.         blocks   |  int *   |   integer*4
  478.      This routine returns the length of the file connected to "chan_id" in
  479. terms of bytes, samples and blocks.  I don't know what it should do with 
  480. real-time data files (sockets) yet.
  481. Returned value:
  482.      The returned value indicates the error status of the routine.  If no
  483. error occurs, the returned value is 0.  If an error occurs, the value is < 0.
  484. The following errors are detected:
  485.      - channel number is outside valid range
  486.      - specified channel is not open
  487. 4.1.5  Goto Sample Routine:
  488.      position = goto_sample ( chan_id, sample_num, how )
  489.        argument  |  C type  |  FORTRAN type
  490.      ------------+----------+----------------
  491.        chan_id   |   int    |   integer*4
  492.       sample_num |   int    |   integer*4
  493.          how     |   int    |   integer*4
  494.      This routine changes the sample number that the next call to
  495. read_variable on "chan_id" reads from.  When "how" is 0, "sample_num" is
  496. measured from the beginning of the file (i.e. absolute positioning).  When
  497. "how" is not 0, "sample_num" is measured from the current file position (i.e.
  498. relative positioning).  The first sample in the file is called sample 1.  This
  499. routine can be called only if the specified channel is a "variable channel",
  500. that is one opened via open_var_channel.  This routine does not return an
  501. error if the sample to be read is beyond the end of file; this condition is
  502. reported when reading.
  503. Returned value:
  504.      If there are no errors, the returned value indicates the current file
  505. position (the sample number of the next sample to be read by read_variable). A
  506. valid sample number is 1 or greater.  If an error occurs, the returned value
  507. is < 0. 
  508. The following errors are detected:
  509.      - channel number is outside valid range
  510.      - specified channel is not open
  511.      - this routine is for use only with variable channel types
  512.      - the file connected to this channel prohibits positioning
  513.      - effective sample_num is < 1
  514. 4.1.6  Read Variable Routine:
  515.      position = read_variable ( chan_id, values, num, num_read )
  516.        argument  |  C type  |  FORTRAN type
  517.      ------------+----------+----------------
  518.        chan_id   |   int    |   integer*4
  519.         values   |  varies  |     varies
  520.                  | (array)  |    (array)
  521.          num     |   int    |   integer*4
  522.        num_read  |  int *   |   integer*4
  523.      This routine returns the next "num" values of the variable connected to
  524. channel number "chan_id".  "values" is an array where the returned values are
  525. placed.  In the calling routine, this array type should match that of the
  526. variable being returned.  The size of "n" is limited only by the array size in
  527. the calling routine.  The actual number of values read is returned in
  528. "num_read".  "num_read" will equal "num" unless an error (specified below)
  529. occurs; in this case, it may be zero to num-1.  This routine can be called
  530. only if the specified channel is a "variable channel", that is one opened via
  531. open_var_channel.
  532. Returned value:
  533.      If there are no errors, the returned value indicates the current file
  534. position (the sample number of the next sample to be read by read_variable). A
  535. valid sample number is 1 or greater.  If an error occurs, the returned value
  536. is < 0. 
  537. The following errors are detected:
  538.      - error during the file read operation
  539.      - EOF encountered on the data file
  540.      - channel number is outside valid range
  541.      - specified channel is not open
  542.      - this routine is for use only with variable channel types
  543. 4.1.7  Goto Block Routine:
  544.      position = goto_block ( chan_id, block_num, how )
  545.        argument  |  C type  |  FORTRAN type
  546.      ------------+----------+----------------
  547.        chan_id   |   int    |   integer*4
  548.       block_num  |   int    |   integer*4
  549.          how     |   int    |   integer*4
  550.      This routine changes the place from which data is read in the file
  551. connected to "chan_id".  When "how" is 0, "block_num" is measured from the
  552. beginning of the file (i.e. absolute positioning).  When "how" is not 0,
  553. "block_num" is measured from the current file position (i.e. relative
  554. positioning).  It can be used on block channels and on variable channels.  The
  555. first block in a file is called block 1.  This routine does not return an
  556. error if positioned beyond the end of file; this condition is reported when
  557. reading.
  558.      On block channels, the repositioning is as follows:
  559.      If absolute positioning, the block number read by the next read_block is
  560. "block_num". 
  561.      If relative positioning, the block number read by the next read_block is
  562. changed by "block_num" blocks. 
  563.      On variable channels, the repositioning is as follows:
  564.      If absolute positioning, the first sample read by the next read_variable
  565. is sample number: 
  566. 1 + (block_num - 1) * (# of values of variable per block)
  567.      If relative positioning, the first sample read by the next read_variable
  568. is changed by "block_num" blocks. 
  569. Returned value:
  570.      If there are no errors, the returned value indicates the current file
  571. position.  On variable channels, the returned value is the sample number of
  572. the next sample to be read by read_variable.  On block channels, the returned
  573. value is the block number of the next block to be read by read_block. A valid
  574. sample number or block number is 1 or greater.  If an error occurs, the
  575. returned value is < 0.
  576. The following errors are detected:
  577.      - channel number is outside valid range
  578.      - specified channel is not open
  579.      - the file connected to this channel prohibits positioning
  580.      - effective block_num < 1
  581. 4.1.8  Read Block Routine:
  582.      position = read_block ( chan_id, val_pntr )
  583.        argument  |  C type  |  FORTRAN type
  584.      ------------+----------+----------------
  585.        chan_id   |   int    |   integer*4
  586.        val_pntr  | pointer  |   integer*4    (see below)
  587.                  |  array   |     array
  588.      This routine returns one block of values from the file connected to
  589. channel "chan_id".  "val_pntr" is an array of pointers having one element for
  590. each block variable.  The calling routine sets each pointer in the array to
  591. specify where the values for each block variable are to go.  Thus, val_pntr[0]
  592. is the address where the first value of the first block variable will be
  593. stored; val_pntr[1] is the address where the first value of the second block
  594. variable will be stored; etc.  Subsequent values of the variables are stored
  595. in sequential locations following the address of the first value.
  596.      For FORTRAN (ugh) users, here's what you do with val_pntr.  This array is
  597. set up to contain for each block variable, the ADDRESS of where you want the
  598. first value of each variable to be placed.  A routine for getting the address
  599. of a variable is included in the disk I/O package.  To illustrate the process,
  600. suppose you have two variables in a block and you want to store them in x and
  601. y.  The following code fragment shows what you do: 
  602.      INTEGER*4 GET_ADDRESS  ! get_address returns an address of type integer*4
  603.      REAL*4 X(13)           ! there are 13 values of X per block
  604.      INTEGER*4 Y(8)         ! there are 8 values of Y per block
  605.      VAL_PNTR(2)            ! there are 2 variables per block
  606.      VAL_PNTR(1) = GET_ADDRESS( X(1) )
  607.      VAL_PNTR(2) = GET_ADDRESS( Y(1) )
  608.      STATUS = READ_BLOCK(CHAN_ID, VAL_PNTR)
  609.      If the X and Y arrays are stored at fixed memory addresses, the val_pntr 
  610. array can be set just once, rather than before each use of read_block.  If the
  611. arrays move, val_pntr must be recalculated.
  612. Returned value:
  613.      If there are no errors, the returned value indicates the current file
  614. position (the block number of the next block to be read by read_block).  A
  615. valid block number is 1 or greater.  If an error occurs, the returned value is
  616. < 0. 
  617. The following errors are detected:
  618.      - channel number is outside valid range
  619.      - specified channel is not open
  620.      - this routine is for use only with block channel types
  621.      - error during the file read operation
  622.      - EOF encountered on the data file
  623. 4.1.9  Close Channel Routine:
  624.      status = close_channel ( chan_id )
  625.        argument  |  C type  |  FORTRAN type
  626.      ------------+----------+----------------
  627.        chan_id   |   int    |   integer*4
  628.      This routine closes the specified channel.  Doing so makes the channel id
  629. available for re-assignment.
  630. Returned value:
  631.      The returned value indicates the error status of the routine.  If no
  632. error occurs, the returned value is 0.  If an error occurs, the value is < 0. 
  633. The following errors are detected:
  634.      - channel number is outside valid range
  635.      - specified channel is not open
  636. 4.1.10  Disk Read Error Routines:
  637.      print_disk_read_error ( err_num )            (Callable from FORTRAN)
  638.      error_string = disk_read_error ( err_num )   (No FORTRAN interface yet)
  639.        argument  |  C type  |  FORTRAN type
  640.      ------------+----------+----------------
  641.        err_num   |   int    |   integer *4
  642.      The disk read routines return a value which, when less than zero,
  643. corresponds to an error number.  The disk read error routines provide a way to
  644. turn the error number into an appropriate error message.  The disk_read_error
  645. routine returns a brief error message corresponding to "err_num".  The
  646. "print_disk_read_error" routine prints a more elaborate error message.  These
  647. routines return "No error" for arguments zero or greater and "Bad value for
  648. error number" if "err_num" is not a value from one of the read routines.