/*
* filesystem.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/>.
*
*/
/filesystem /SLI ($Revision: 9979 $) provide-component
/filesystem /C++ (7610) require-component
/FileNames_s
{
regcomp
FileNames_r
} def
/FileNames_r
{
<< >> begin
/Mask Set
Directory
FileNames_
:sort
/FilesList [] def
{
dup Mask exch regex_find
{FilesList exch append /FilesList Set}
{pop} ifelse
} forall
FilesList
end
} def
/* BeginDocumentation
Name: FileNames - return contents of current working directory
Synopsis: string FileNames -> array
regex FileNames -> array
Description: FileNames reads contents of current working directory
via POSIX commands. Only files matching the regular expression
mask set in string/regex are used.
Parameters: string : a mask converted to the regex
regex : the regular expression used to filter files
array : an array of strings containing matched files
Examples: (.*) FileNames -> all files of current directory
Remember that POSIX regex and those used by ls are not
necessarily the same !
Bugs: see remarks
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: Sorting of files done by :sort, a dummy UNIX sorter which
is far from protable!
SeeAlso: SetDirectory, Directory, ls, cd
*/
/FileNames trie
[/stringtype] /FileNames_s load addtotrie
[/regextype] /FileNames_r load addtotrie
def
/* BeginDocumentation
Name: ls - print contents of current working directory
Synopsis: ls -> -
Description: Prints the contents of the working directory on stdout.
Don't mess it up with UNIX ls, this is POSIX. No parameters can
be set like -l, -a !
Any files starting with a . are NOT shown by default.
Use FileNames if you need them.
Parameters: -
Examples: There's only one usage:
ls -> see contents of current working directory
Bugs:
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: This is in fact not much more than a wrapper to FileNames,
in addition using a regex to filter out ".anything" files.
SeeAlso: FileNames, SetDirectory, Directory, MakeDirectory, RemoveDirectory, cd
*/
/ls {(^[^\\.]) FileNames {=} forall} def
/* BeginDocumentation
Name: SetDirectory - Change working directory
Synopsis: string SetDirectory -> boolean
Description: Changes the working directory to the given argument,
e.g. the value of '.' in the UNIX world.
Parameters: string : The new working directory.
boolean: A flag if operation succeded.
Examples: (/home/MyName) SetDirectory -> Commands like ofstream,
FileNames etc. take
/home/MyName as a default.
(..) SetDirectory -> Flip to parent directory.
Bugs: -
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks:
SeeAlso: FileNames, Directory, MakeDirectory, RemoveDirectory, cd, ls
*/
/SetDirectory trie
[/stringtype] /SetDirectory_ load addtotrie
def
/* BeginDocumentation
Name: cd - Change working directory
Synopsis: string cd -> -
Description: Changes the working directory to the given argument,
e.g. the value of '.' in the UNIX world.
Parameters: string : The new working directory.
boolean: A flag if operation succeded.
Examples: (..) cd -> Flip to parent directory.
Diagnostics: Raises /UnknownDirectory, if SetDirectory fails.
Bugs: -
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: This is a wrapper to SetDirectory
SeeAlso: FileNames, Directory, SetDirectory, MakeDirectory, RemoveDirectory, ls
*/
/cd {dup SetDirectory not {/cd /UnknownDirectory raiseerror} if pop} def
/* BeginDocumentation
Name: pwd - Print working directory
Synopsis: pwd -> -
Description: Prints the working directory.
For UNIX compatibility.
Parameters: -
Bugs: -
Author: Schrader
Remarks: This is a wrapper to Directory
SeeAlso: Directory, SetDirectory, MakeDirectory, RemoveDirectory, ls
*/
/pwd {Directory =} def
/* BeginDocumentation
Name: MoveFile - Rename a file
Synopsis: string1 string2 MoveFile -> boolean
Description: Rename a file, e.g. link the file to the new name
and unlink the old filename. If this unlink was the only link
to the file, the old file is effectively deleted.
Note that this is only guaranteed to work if new and old filename
refer to the same directory. Renaming over different directories
might work, but that's not POSIX and thus not portable.
Parameters: string1 : Old File
string2 : NewFile
boolean : A flag if operation succeded.
Examples: (Simulation1) (obsolete) MoveFile -> The File Simulation1
is now called obsolete
Bugs: -
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: Since POSIX rename() did not work for some obscur reasons,
MoveFile indeed works by linking the new filename and unlinking
the old one!
But that's exactly what rename() is supposed to do, no damage done...
SeeAlso: CopyFile, ofstream, ifstream, DeleteFile, FileNames, MakeDirectory, RemoveDirectory
*/
/MoveFile trie
[/stringtype /stringtype] /MoveFile_ load addtotrie
def
/* BeginDocumentation
Name: CopyFile - Copy a file
Synopsis: (sourcefilename) (targetfilename) CopyFile -> -
Description: Copy a file.
Examples: (Simulation1) (Sim1Backup) CopyFile
Author: R Kupper
FirstVersion: 06 aug 2008
Diagnostics: Issues informative message and
raises /BadIO if file cannot be copied for any reason.
SeeAlso: MoveFile, ofstream, ifstream, DeleteFile, FileNames, MakeDirectory, RemoveDirectory
*/
/CopyFile trie
[/stringtype /stringtype] /CopyFile_ load addtotrie
def
/* BeginDocumentation
Name: DeleteFile - Delete a file
Synopsis: string DeleteFile -> boolean
Description: Delete a file defined by it's filename. To be exact, it
is unlinked, so if it link to another file, only the link and not
the file is removed. (This is at least what is supposed to happen
if your POSIX is really POSIX ...)
Mind that regex arguments like (*) DeleteFile are NOT supported.
This was done for safety reasons because the regex flavour of
POSIX is not exactly like what one might be used to from UNIX,
which could easily end in a disaster.
Parameters: string : Filename of file to be deleted.
boolean : A flag if operation succeded.
Examples: (DontNeedYou) DeleteFile -> True, and DontNeedYou is removed
from your working directory
if this file existed,
otherwise False.
Bugs: -
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: -
SeeAlso: CopyFile, ofstream, ifstream, MoveFile, FileNames, MakeDirectory, RemoveDirectory
*/
/DeleteFile trie
[/stringtype] /DeleteFile_ load addtotrie
def
/* BeginDocumentation
Name: MakeDirectory - Create a new directory
Synopsis: string MakeDirectory -> boolean
Description: MakeDirectory creates the named subdirectory of your
current working directory.
Parameters: string : Name of new subdirectory
boolean : A flag if operation succeded.
Examples: (NewSubDir) MakeDirectory -> ./NewSubDir created
Bugs: -
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: -
SeeAlso: FileNames, MoveDirectory, RemoveDirectory
*/
/MakeDirectory trie
[/stringtype] /MakeDirectory_ load addtotrie
def
/* BeginDocumentation
Name: RemoveDirectory - Delete a directory
Synopsis: string RemoveDirectory -> boolean
Description: RemoveDirectory deletes the named subdirectory of your
current working directory, provided it is empty.
Parameters: string : Name of subdirectory to be deleted.
boolean : A flag if operation succeded.
Examples: (RemoveMeDir) RemoveDirectory -> True, and
./RemoveMeDir does not longer exist, provided it ever did
and was empty.
Bugs: -
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: -
SeeAlso: FileNames, MoveDirectory, RemoveDirectory
*/
/RemoveDirectory trie
[/stringtype] /RemoveDirectory_ load addtotrie
def
/* BeginDocumentation
Name: MoveDirectory - Rename a directory
Synopsis: string1 string2 MoveDirectory -> boolean
Description: MoveDirectory unlinks old directory name and links to
the new name. This is only possible if this directory is empty.
Parameters: string1 : Name of old directory
string2 : Name of new directory
boolean : A flag if operation succeded.
Examples: (NewSubDir) (Other) MoveDirectory -> True, and ./NewSubDir
is now called ./Other, provided it exists and is empty.
Bugs: -
Author: Hehl
FirstVersion: Oct 12th 1999
Remarks: This operator in fact only sequentially calls
RemoveDirectory, MoveDirectory
POSIX statet this would be the same operator like renaming
a file, but that did not work.
SeeAlso: FileNames, MoveDirectory, RemoveDirectory, MoveFile
*/
/MoveDirectory trie
[/stringtype /stringtype] {MakeDirectory pop RemoveDirectory pop} addtotrie
def
/CompareFiles trie
[/stringtype /stringtype] /CompareFiles_s_s load addtotrie
def
/* BeginDocumentation
Name: dirname - strip last component from file name
Synopsis: string dirname -> string
Description: Print NAME with its trailing /component removed;
if NAME contains no /'s, output `.' (meaning the current directory).
Parameters: string: Name of the directory
Examples: (./../test/dir/foo.sli) dirname -> (./../test/dir)
FirstVersion: November 2012
Author: Yury V. Zaytsev and Jochen M. Eppler
*/
/dirname {
/pth exch def
mark
% Special cases of leading directory separators
pth (/) eq
pth (//) eq or
pth (///) eq or
{ (/) } case
% Special cases of lacking directory separators
pth (/) searchif not
pth () eq or
pth (.) eq or
pth (..) eq or
{ (.) } case
{
% General case
(/{1,3}[^/]+/{0,3}$) regexdict/REG_EXTENDED :: regcomp () pth regex_replace
% Special case of non-empty path plus leading directory separator
dup () eq { pop (/) } if
}
switchdefault
} def