in your decision.
This information should not be considered complete; it includes possibly
-transient information about idiosyncracies of some of the ports, almost
+transient information about idiosyncrasies of some of the ports, almost
all of which are in a state of constant evolution. Thus this material
should be considered a perpetual work in progress
(E<lt>IMG SRC="yellow_sign.gif" ALT="Under Construction"E<gt>).
how that path is actually written, differs.
While they are similar, file path specifications differ between Unix,
-Windows, S<Mac OS>, OS/2, VMS and probably others. Unix, for example, is
-one of the few OSes that has the idea of a root directory. S<Mac OS>
-uses C<:> as a path separator instead of C</>. VMS, Windows, and OS/2
-can work similarly to Unix with C</> as path separator, or in their own
-idiosyncratic ways.
+Windows, S<Mac OS>, OS/2, VMS, S<RISC OS> and probably others. Unix,
+for example, is one of the few OSes that has the idea of a root directory.
+S<Mac OS> uses C<:> as a path separator instead of C</>. VMS, Windows, and
+OS/2 can work similarly to Unix with C</> as path separator, or in their own
+idiosyncratic ways. C<RISC OS> perl can emulate Unix filenames with C</>
+as path separator, or go native and use C<.> for path separator and C<:>
+to signal filing systems and disc names.
As with the newline problem above, there are modules that can help. The
C<File::Spec> modules provide methods to do the Right Thing on whatever
description of the file and its format in the code's documentation, and
make it easy for the user to override the default location of the file.
+Don't assume that a you can open a full pathname for input with
+C<open (FILE, $name)>, as some platforms can use characters such as C<E<lt>>
+which will perl C<open> will interpret and eat.
+
=head2 System Interaction
Don't count on filename globbing. Use C<opendir>, C<readdir>, and
C<closedir> instead.
+Don't count on per-program environment variables, or per-program current
+directores.
+
=head2 Interprocess Communication (IPC)
probably better, as it is more consistent with popular usage, and avoids
the problem of remembering what to backwhack and what not to.
-The DOS FAT file system can only accomodate "8.3" style filenames. Under
+The DOS FAT file system can only accommodate "8.3" style filenames. Under
the "case insensitive, but case preserving" HPFS (OS/2) and NTFS (NT)
file systems you may have to be careful about case returned with functions
like C<readdir> or used with functions like C<open> or C<opendir>.
VMS' RMS filesystem is case insensitive and does not preserve case.
C<readdir> returns lowercased filenames, but specifying a file for
-opening remains case insensitive. Files without extensions have a
+opening remains case insensitive. Files without extensions have a
trailing period on them, so doing a C<readdir> with a file named F<A.;5>
will return F<a.> (though that file could be opened with C<open(FH, 'A')>.
=back
+
+=head2 Acorn RISC OS
+
+As Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like Unix
+and Unix filename emulation is turned on by default, it is quite likely that
+most simple scripts will work "out of the box". The native filing system is
+modular, and individual filing systems are free to be case sensitive or
+insensitive, usually case preserving. Some native filing systems have name
+length limits which file and directory names are silently truncated to fit -
+scripts should be aware that the standard disc filing system currently has
+a name length limit of B<10> characters, with up to 77 items in a directory,
+but other filing systems may not impose such limitations.
+
+Native filenames are of the form
+
+ Filesystem#Special_Field::DiscName.$.Directory.Directory.File
+
+where
+
+ Special_Field is not usually present, but may contain . and $ .
+ Filesystem =~ m|[A-Za-z0-9_]|
+ DsicName =~ m|[A-Za-z0-9_/]|
+ $ represents the root directory
+ . is the path separator
+ @ is the current directory (per filesystem but machine global)
+ ^ is the parent directory
+ Directory and File =~ m|[^\0- "\.\$\%\&:\@\\^\|\177]+|
+
+The default filename translation is roughly C<tr|/.|./|;>
+
+Note that C<"ADFS::HardDisc.$.File" ne 'ADFS::HardDisc.$.File'> and that
+the second stage of $ interpolation in regular expressions will fall foul
+of the C<$.> if scripts are not careful.
+
+Logical paths specified by system variables containing comma separated
+search lists are also allowed, hence C<System:Modules> is a valid filename,
+and the filesystem will prefix C<Modules> with each section of C<System$Path>
+until a name is made that points to an object on disc. Writing to a new
+file C<System:Modules> would only be allowed if C<System$Path> contains a
+single item list. The filesystem will also expand system variables in
+filenames if enclosed in angle brackets, so C<E<lt>System$DirE<gt>.Modules>
+would look for the file S<C<$ENV{'System$Dir'} . 'Modules'>>. The obvious
+implication of this is that B<fully qualified filenames can start with C<E<lt>E<gt>>>
+and should be protected when C<open> is used for input.
+
+Because C<.> was in use as a directory separator and filenames could not
+be assumed to be unique after 10 characters, Acorn implemented the C
+compiler to strip the trailing C<.c> C<.h> C<.s> and C<.o> suffix from
+filenames specified in source code and store the respective files in
+subdirectories named after the suffix. Hence files are translated:
+
+ foo.h h.foo
+ C:foo.h C:h.foo (logical path variable)
+ sys/os.h sys.h.os (C compiler groks Unix-speak)
+ 10charname.c c.10charname
+ 10charname.o o.10charname
+ 11charname_.c c.11charname (assuming filesystem truncates at 10)
+
+The Unix emulation library's translation of filenames to native assumes
+that this sort of translation is required, and allows a user defined list of
+known suffixes which it will transpose in this fashion. This may appear
+transparent, but consider that with these rules C<foo/bar/baz.h> and
+C<foo/bar/h/baz> both map to C<foo.bar.h.baz>, and that C<readdir> and
+C<glob> cannot and do not attempt to emulate the reverse mapping. Other '.'s
+in filenames are translated to '/'.
+
+S<RISC OS> has "image files", files that behave as directories. For
+example with suitable software this allows the contents of a zip file to
+be treated as a directory at command line (and therefore script) level,
+with full read-write random access. At present the perl port treats images
+as directories: C<-d> returns true, C<-f> false, and C<unlink> checks to
+ensure that recognised images are empty before deleting them. In theory
+images should never trouble a script, but in practice they may do so if
+the software to deal with an image file is loaded and registered while the
+script is running, as suddenly "files" that it had cached information on
+metamorphose into directories.
+
+As implied above the environment accessed through C<%ENV> is global, and the
+convention is that program specific environment variables are of the form
+C<Program$Name>. Each filing system maintains a current directory, and
+the current filing system's current directory is the B<global> current
+directory. Consequently sociable scripts don't change the current directory
+but rely on full pathnames, and scripts (and Makefiles) cannot assume that
+they can spawn a child process which can change the current directory
+without affecting its parent (and everyone else for that matter).
+
+As native operating system filehandles are global and currently are allocated
+down from 255, with 0 being a reserved value the Unix emulation library
+emulates Unix filehandles. Consequently you can't rely on passing C<STDIN>
+C<STDOUT> or C<STDERR> to your children. Run time libraries perform
+command line processing to emulate Unix shell style C<>> redirection, but
+the core operating system is written in assembler and has its own private,
+obscure and somewhat broken convention. All this is further complicated by
+the desire of users to express filenames of the form C<E<lt>Foo$DirE<gt>.Bar> on
+the command line unquoted. (Oh yes, it's run time libraries interpreting the
+quoting convention.) Hence C<``> command output capture has to perform
+a guessing game as to how the command is going to interpret the command line
+so that it can bodge it correctly to capture output. It assumes that a
+string C<E<lt>[^E<lt>E<gt>]+\$[^E<lt>E<gt>]E<gt>> is a reference to an environment
+variable, whereas anything else involving C<E<lt>> or C<E<gt>> is redirection,
+and generally manages to be 99% right. Despite all this the problem remains
+that scripts cannot rely on any Unix tools being available, or that any tools
+found have Unix-like command line arguments.
+
+Extensions and XS are in theory buildable by anyone using free tools. In
+practice many don't as the Acorn platform is used to binary distribution.
+MakeMaker does itself run, but no make currently copes with MakeMaker's
+makefiles! Even if (when) this is fixed os that the lack of a Unix-like
+shell can cause problems with makefile rules, especially lines of the form
+C<cd sdbm && make all> and anything using quoting.
+
+"S<RISC OS>" is the proper name for the operating system, but the value
+in C<$^O> is "riscos" (because we don't like shouting).
+
+Also see:
+
+=over 4
+
+=item perl list
+
+=back
+
+
=head2 Other perls
-Perl has been ported to a variety of platforms that do not fit into
-any of the above categories. Some, such as AmigaOS, BeOS, MPE/iX,
-OS/390 (MVS), QNX, and Plan 9, have been well integrated into the
-standard Perl source code kit. You may need to see the F<ports/>
-directory on CPAN for information, and possibly binaries, for the
-likes of: acorn, aos, atari, lynxos, riscos, Tandem Guardian, vos,
-I<etc.> (yes we know that some of these OSes may fall under the Unix
-category but we are not a standards body.)
+Perl has been ported to a variety of platforms that do not fit into any of
+the above categories. Some, such as AmigaOS, BeOS, QNX, and Plan 9, have
+been well integrated into the standard Perl source code kit. You may need
+to see the F<ports/> directory on CPAN for information, and possibly
+binaries, for the likes of: aos, atari, lynxos, HP-MPE/iX, riscos,
+Tandem Guardian, vos, I<etc.> (yes we know that some of these OSes may fall
+under the Unix category but we are not a standards body.)
See also:
C<-r>, C<-w>, C<-x>, and C<-o> tell whether or not file is accessible,
which may not reflect UIC-based file protections. (VMS)
+C<-s> returns the size of the data fork, not the total size of data fork
+plus resource fork. (S<Mac OS>).
+
+C<-s> by name on an open file will return the space reserved on disk,
+rather than the current extent. C<-s> on an open filehandle returns the
+current size. (S<RISC OS>)
+
C<-R>, C<-W>, C<-X>, C<-O> are indistinguishable from C<-r>, C<-w>,
-C<-x>, C<-o>. (S<Mac OS>, Win32, VMS)
+C<-x>, C<-o>. (S<Mac OS>, Win32, VMS, S<RISC OS>)
C<-b>, C<-c>, C<-k>, C<-g>, C<-p>, C<-u>, C<-A> are not implemented.
(S<Mac OS>)
C<-g>, C<-k>, C<-l>, C<-p>, C<-u>, C<-A> are not particularly meaningful.
-(Win32, VMS)
+(Win32, VMS, S<RISC OS>)
C<-d> is true if passed a device spec without an explicit directory.
(VMS)
C<-x> (or C<-X>) determine if a file ends in one of the executable
suffixes. C<-S> is meaningless. (Win32)
+C<-x> (or C<-X>) determine if a file has an executable file type.
+(S<RISC OS>)
+
=item binmode FILEHANDLE
-Meaningless. (S<Mac OS>)
+Meaningless. (S<Mac OS>, S<RISC OS>)
Reopens file and restores pointer; if function fails, underlying
filehandle may be closed, or pointer may be in a different position.
Only good for changing "owner" read-write access, "group", and "other"
bits are meaningless. (Win32)
+Only good for changing "owner" and "other" read-write access. (S<RISC OS>)
+
=item chown LIST
-Not implemented. (S<Mac OS>, Win32, Plan9)
+Not implemented. (S<Mac OS>, Win32, Plan9, S<RISC OS>)
Does nothing, but won't fail. (Win32)
=item chroot
-Not implemented. (S<Mac OS>, Win32, VMS, Plan9)
+Not implemented. (S<Mac OS>, Win32, VMS, Plan9, S<RISC OS>)
=item crypt PLAINTEXT,SALT
May not be available if library or source was not provided when building
-perl. (Win32)
+perl. (Win32)
=item dbmclose HASH
=item dump LABEL
-Not useful. (S<Mac OS>)
+Not useful. (S<Mac OS>, S<RISC OS>)
Not implemented. (Win32)
-Invokes VMS debugger. (VMS)
+Invokes VMS debugger. (VMS)
=item exec LIST
=item flock FILEHANDLE,OPERATION
-Not implemented (S<Mac OS>, VMS).
+Not implemented (S<Mac OS>, VMS, S<RISC OS>).
Available only on Windows NT (not on Windows 95). (Win32)
=item fork
-Not implemented. (S<Mac OS>, Win32, AmigaOS)
+Not implemented. (S<Mac OS>, Win32, AmigaOS, S<RISC OS>)
=item getlogin
-Not implemented. (S<Mac OS>)
+Not implemented. (S<Mac OS>, S<RISC OS>)
=item getpgrp PID
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item getppid
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item getpriority WHICH,WHO
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item getpwnam NAME
Not implemented. (S<Mac OS>, Win32)
+Not useful. (S<RISC OS>)
+
=item getgrnam NAME
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item getnetbyname NAME
Not implemented. (S<Mac OS>, Win32)
+Not useful. (S<RISC OS>)
+
=item getgrgid GID
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item getnetbyaddr ADDR,ADDRTYPE
=item setpwent
-Not implemented. (S<Mac OS>, Win32)
+Not implemented. (S<Mac OS>, Win32, S<RISC OS>)
=item setgrent
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item sethostent STAYOPEN
-Not implemented. (S<Mac OS>, Win32, Plan9)
+Not implemented. (S<Mac OS>, Win32, Plan9, S<RISC OS>)
=item setnetent STAYOPEN
-Not implemented. (S<Mac OS>, Win32, Plan9)
+Not implemented. (S<Mac OS>, Win32, Plan9, S<RISC OS>)
=item setprotoent STAYOPEN
-Not implemented. (S<Mac OS>, Win32, Plan9)
+Not implemented. (S<Mac OS>, Win32, Plan9, S<RISC OS>)
=item setservent STAYOPEN
-Not implemented. (Plan9, Win32)
+Not implemented. (Plan9, Win32, S<RISC OS>)
=item endpwent
=item endgrent
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item endhostent
Features depend on external perlglob.exe or perlglob.bat. May be overridden
with something like File::DosGlob, which is recommended. (Win32)
+Globbing built-in, but only C<*> and C<?> metacharacters are supported.
+Globbing relies on operating system calls, which may return filenames in
+any order. As most filesystems are case insensitive even "sorted"
+filenames will not be in case sensitive order. (S<RISC OS>)
+
=item ioctl FILEHANDLE,FUNCTION,SCALAR
Not implemented. (VMS)
Available only for socket handles, and it does what the ioctlsocket() call
in the Winsock API does. (Win32)
+Available only for socket handles. (S<RISC OS>)
+
=item kill LIST
-Not implemented. (S<Mac OS>)
+Not implemented, hence not useful for taint checking. (S<Mac OS>, S<RISC OS>)
Available only for process handles returned by the C<system(1, ...)> method of
-spawning a process. (Win32)
+spawning a process. (Win32)
=item link OLDFILE,NEWFILE
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item lstat FILEHANDLE
=item lstat
-Not implemented. (VMS)
+Not implemented. (VMS, S<RISC OS>)
-Return values may be bogus. (Win32)
+Return values may be bogus. (Win32)
=item msgctl ID,CMD,ARG
=item msgrcv ID,VAR,SIZE,TYPE,FLAGS
-Not implemented. (S<Mac OS>, Win32, VMS, Plan9)
+Not implemented. (S<Mac OS>, Win32, VMS, Plan9, S<RISC OS>)
=item open FILEHANDLE,EXPR
The C<|> variants are only supported if ToolServer is installed.
(S<Mac OS>)
-open to C<|-> and C<-|> are unsupported. (S<Mac OS>, Win32)
+open to C<|-> and C<-|> are unsupported. (S<Mac OS>, Win32, S<RISC OS>)
=item pipe READHANDLE,WRITEHANDLE
=item readlink
-Not implemented. (Win32, VMS)
+Not implemented. (Win32, VMS, S<RISC OS>)
=item select RBITS,WBITS,EBITS,TIMEOUT
Only implemented on sockets. (Win32)
+Only reliable on sockets. (S<RISC OS>)
+
=item semctl ID,SEMNUM,CMD,ARG
=item semget KEY,NSEMS,FLAGS
=item semop KEY,OPSTRING
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item setpgrp PID,PGRP
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item setpriority WHICH,WHO,PRIORITY
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL
=item shmwrite ID,STRING,POS,SIZE
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item stat FILEHANDLE
device and inode are not necessarily reliable. (VMS)
+mtime, atime and ctime all return the last modification time. Device and
+inode are not necessarily reliable. (S<RISC OS>)
+
=item symlink OLDFILE,NEWFILE
-Not implemented. (Win32, VMS)
+Not implemented. (Win32, VMS, S<RISC OS>)
=item syscall LIST
-Not implemented. (S<Mac OS>, Win32, VMS)
+Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
=item system LIST
waiting for it to terminate. Return value may be used subsequently
in C<wait> or C<waitpid>. (Win32)
+There is no shell to process metacharacters, and the native standard is
+to pass a command line terminated by "\n" "\r" or "\0" to the spawned
+program. Redirection such as C<E<gt> foo> is performed (if at all) by
+the run time library of the spawned program. C<system> I<list> will call
+the Unix emulation library's C<exec> emulation, which attempts to provide
+emulation of the stdin, stdout, stderr in force in the parent, providing
+the child program uses a compatible version of the emulation library.
+I<scalar> will call the native command line direct and no such emulation
+of a child Unix program will exists. Mileage B<will> vary. (S<RISC OS>)
+
=item times
Only the first entry returned is nonzero. (S<Mac OS>)
"system" time will be bogus, and "user" time is actually the time
returned by the clock() function in the C runtime library. (Win32)
+Not useful. (S<RISC OS>)
+
=item truncate FILEHANDLE,LENGTH
=item truncate EXPR,LENGTH
=item utime LIST
-Only the modification time is updated. (S<Mac OS>, VMS)
+Only the modification time is updated. (S<Mac OS>, VMS, S<RISC OS>)
May not behave as expected. (Win32)
Can only be applied to process handles returned for processes spawned
using C<system(1, ...)>. (Win32)
+Not useful. (S<RISC OS>)
+
=back
+=head1 CHANGES
+
+=over 4
+
+=item 1.30, 03 August 1998
+
+Major update for RISC OS, other minor changes.
+
+=item 1.23, 10 July 1998
+
+First public release with perl5.005.
+
+=back
=head1 AUTHORS / CONTRIBUTORS
Andreas J. Koenig E<lt>koenig@kulturbox.deE<gt>,
Andrew M. Langmead E<lt>aml@world.std.comE<gt>,
Andy Dougherty E<lt>doughera@lafcol.lafayette.eduE<gt>,
-Abigail E<lt>abigail@fnx.comE<gt>.
+Abigail E<lt>abigail@fnx.comE<gt>,
+Nicholas Clark E<lt>Nicholas.Clark@liverpool.ac.ukE<gt>.
This document is maintained by Chris Nandor.
=head1 VERSION
-Version 1.23, last modified 10 July 1998.
+Version 1.30, last modified 03 August 1998.