/* * FormattedIO.sli * * This file is part of NEST. * * Copyright (C) 2004 The NEST Initiative * * NEST 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. * * NEST 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. * * You should have received a copy of the GNU General Public License * along with NEST. If not, see <http://www.gnu.org/licenses/>. * */ %% %% High-level input output fascilities for sli %% %% this file must be run AFTER typeinit and mathematica %% The i/o facilities model those of Mathematica. %% /*BeginDocumentation Name: ReadModes - dictionary with type specifiers for read functions Description: The following read modes are available: /Number - read a number (as double) /Word - read a whitespace separated string /Double - read a double /Integer - read an integer /String - read a newline separated line Author: Marc-Oliver Gewaltig FirstVersion: Jun 17 2000 */ /ReadModes << /Number /ReadDouble load /Word /ReadWord load /Double /ReadDouble load /Integer /ReadInt load /String /getline load >> def /ArrayQ trie [/arraytype] true addtotrie [/anytype] false addtotrie def /LiteralQ trie [/literaltype] true addtotrie [/anytype] false addtotrie def /*BeginDocumentation Name: Read - read an object of a certain type from a stream Synopsis: istream [type] Read -> istream [result] true -> istream false Example: cin [/Number] Read -> cin [1] Description: Author: Marc-Oliver Gewaltig FirstVersion: Jun 17 2000 */ /Read [/istreamtype /arraytype] { mark 3 1 roll ReadModes begin { LiteralQ {cvn} if exec { exch } if } forall counttomark 1 add 1 roll counttomark arraystore exch pop % remove mark end size 0 gt {true} {pop false} ifelse } def /*BeginDocumentation Name: ReadList - read a list of specified format from a stream Synopsis: istream [types] ReadList -> [result] Parameters: istream : an input stream [types] : an array with one or more of the following type specifiers: Number - specifies a real number Double - specifies a real number Integer- specifies an integer Word - a white space separated string String - a text line terminated with a newline character Description: ReadList reads the rest of a file into an array. If [types] contains more than one type specifier, the array is constructed from subarray with elements of the types, specified by [types]. ReadList tries to allocate the result array in advance. The option BufferSize can be specified to optimize this behaviour. The valid type specifiers are defined in the ReadModes dictionary. Examples: istream [/Number /Number] ReadList -> [[1 2] [3 4] ...] istream [/Number] ReadList -> [1 2 3 4 ...] References: ReadList approximates the Mathematica function. Author: Marc-Oliver Gewaltig FirstVersion: Jun 17 2000 SeeAlso: Read, ReadModes, Export */ /ReadList << /BufferSize 1000 >> Options /ReadList [/istreamtype /arraytype] { {cvn} Map % Convert all literals to names, << >> begin [] /ReadList /BufferSize GetOption reserve_a %istream [result] array exch_ size_a 1 eq { %istream [result] array cvx /read Set exch_ % [result] istream ReadModes begin { read % call the read handler { % [] istream obj 3 -1 roll exch_ append_a exch_ } { exit } ifelse_ } loop pop_ end } { %istream [] array /types Set exch_ { types Read { % [] istream [result] 3 -1 roll exch_ append_a exch_ } { exit } ifelse_ } loop pop_ } ifelse_ end } def /*BeginDocumentation Name: SaveDictionary - Save contents of a dictionary to a file. Synopsis: dict (fname) SaveDictionary -> - Description: SaveDictionary tries to save the contents of the dicitonary to a file. For this, it reproduces the input syntax of the dictionary. Thus, the resulting file is a readable ASCII-file. SaveDictionary only processes those definitions which have a keyboard input form. Currently, the following types are saved - integertype - doubletype - stringtype - arraytype SeeAlso: RestoreDictionary, MergeDictionary */ /SaveDictionary [/dictionarytype /stringtype] { (w) file % exch cva 2 2 Partition { arrayload pop :out } forall close } def /_:out { rollu cvlit <-- ( ) <- exch <-- ( def \n) <- } def /:out [/ostreamtype /nametype /anytype] {2 npop} def /:out [/ostreamtype /nametype /doubletype] { rollu cvlit <-- ( ) <- showpoint exch <- ( def \n) <- } def /:out [/ostreamtype /nametype /integertype] /_:out load def /:out [/ostreamtype /nametype /stringtype] /_:out load def /:out [/ostreamtype /nametype /arraytype] /_:out load def %/:out [/ostreamtype /nametype /proceduretype] %/_:out load def /*BeginDocumentation Name: MergeDictionary - Merge all definitions of a dictionary with the current dicitonary. Synopsis: dict MergeDictionary -> - SeeAlso: SaveDictionary, RestoreDictionary */ /MergeDictionary [/dictionarytype] { cva 2 2 Partition { arrayload pop def } forall } def /*BeginDocumentation Name: RestoreDictionary - Read a dictionary definition from a file. Synopsis: (fname) RestoreDictionary -> dict SeeAlso: SaveDictionary, MergeDictionary */ /RestoreDictionary [/stringtype] { << >> begin (r) file cvx exec currentdict end } def /*BeginDocumentation Name: Export - save in a foreign file format Synopsis: (fname) any Export -> (fname) any literal Export -> Examples: (spike.gdf) [ [1 121] [2 127] ] Export --> (hello.dat) [ [3 121 4.3] [9 127 4.2] ] Export --> Description: The currently supported formats are GDF (.gdf) and Table (.dat), only the first argument style is currently supported. Export raises an /UnknownExportFormat error if an unsupported output format is requested. Author: Diesmann FirstVersion: 10.5.2001 Remarks: The Mathematica implementation is much more general. Mathematica does not support GDF. References: [1] The Mathematica Book "Export" SeeAlso: ReadList */ /Export { % filename array exch dup (.) breakup Last % array filename (gdf) [(gdf) (dat)] exch MemberQ not {exch /Export /UnknownExportFormat raiseerror} if % array filename (w) file exch % file array { dup [1 -2] Take exch Last rollu { <- (\t) <- } forall exch <- endl } forall closeostream } def