diff --git a/VersionASM b/VersionASM index 63e477ce79f878af6e906a42b1400252a6c733b2..f9beb2ce17d0f551b9a4a865635dacc31e6a620c 100644 --- a/VersionASM +++ b/VersionASM @@ -11,13 +11,13 @@ GBLS Module_HelpVersion GBLS Module_ComponentName GBLS Module_ComponentPath -Module_MajorVersion SETS "5.52" -Module_Version SETA 552 +Module_MajorVersion SETS "5.53" +Module_Version SETA 553 Module_MinorVersion SETS "" -Module_Date SETS "07 Mar 2005" -Module_ApplicationDate SETS "07-Mar-05" +Module_Date SETS "14 Mar 2005" +Module_ApplicationDate SETS "14-Mar-05" Module_ComponentName SETS "RISC_OSLib" Module_ComponentPath SETS "RiscOS/Sources/Lib/RISC_OSLib" -Module_FullVersion SETS "5.52" -Module_HelpVersion SETS "5.52 (07 Mar 2005)" +Module_FullVersion SETS "5.53" +Module_HelpVersion SETS "5.53 (14 Mar 2005)" END diff --git a/VersionNum b/VersionNum index 1bb5e5f0bd52fe56b351e8cd34948e2396bc0c68..9b8e7031aca95c4ce6656db4501e9d39f14befd3 100644 --- a/VersionNum +++ b/VersionNum @@ -1,23 +1,23 @@ -/* (5.52) +/* (5.53) * * This file is automatically maintained by srccommit, do not edit manually. * Last processed by srccommit version: 1.2. * */ -#define Module_MajorVersion_CMHG 5.52 +#define Module_MajorVersion_CMHG 5.53 #define Module_MinorVersion_CMHG -#define Module_Date_CMHG 07 Mar 2005 +#define Module_Date_CMHG 14 Mar 2005 -#define Module_MajorVersion "5.52" -#define Module_Version 552 +#define Module_MajorVersion "5.53" +#define Module_Version 553 #define Module_MinorVersion "" -#define Module_Date "07 Mar 2005" +#define Module_Date "14 Mar 2005" -#define Module_ApplicationDate "07-Mar-05" +#define Module_ApplicationDate "14-Mar-05" #define Module_ComponentName "RISC_OSLib" #define Module_ComponentPath "RiscOS/Sources/Lib/RISC_OSLib" -#define Module_FullVersion "5.52" -#define Module_HelpVersion "5.52 (07 Mar 2005)" -#define Module_LibraryVersionInfo "5:52" +#define Module_FullVersion "5.53" +#define Module_HelpVersion "5.53 (14 Mar 2005)" +#define Module_LibraryVersionInfo "5:53" diff --git a/c/stdio b/c/stdio index 26bb4c763ead8bff39d001782338032a99fecf10..759613cd77f80e47dbfaef37a5c383a3dd0bccd5 100644 --- a/c/stdio +++ b/c/stdio @@ -20,8 +20,6 @@ /* Incorporate _sys_tmpnam_ idea from WGD */ -/* __pos of a file is now a long, and we avoid warnings by two casts */ -/* of this to (int) in the calls to _sys_seek(). */ /* N.B. I am trying to factor out machine dependence via calls to */ /* routines like _sys_read_ which can be implemented as _osgbpb or */ /* NIOP as required. This file SHOULD therefore be machine independent */ @@ -102,6 +100,42 @@ typedef struct __extradata { static _extradatap _extra; +/* 14-Mar-2005 - upgraded to handle more files beyond _SYS_OPEN; extra */ +/* handles stored in a linked list. For simplicity, these structures are */ +/* never freed until terminateio is called. Need to take care that all */ +/* code directly referencing __iob also considers this list. */ +typedef struct _FILElist { + struct _FILElist *next; + FILE file; + _extradata extra; +} _FILElist, *_FILElistp; + +static _FILElistp _flist; + +static FILE *_getFILE(void) +{ _FILElistp fp; + int i; + /* First try __iob array */ + for (i=3; i<_SYS_OPEN; i++) + { FILE *stream = &__iob[i]; + if (!(stream->__flag & _IOREAD+_IOWRITE)) + return stream; + } + /* Then try linked list */ + for (fp = _flist; fp; fp = fp->next) + if (!(fp->file.__flag & _IOREAD+_IOWRITE)) + return &fp->file; + /* Then try to allocate a new one */ + fp = calloc(1, sizeof(_FILElist)); + if (fp) + { fp->file.__extrap = &fp->extra; + fp->next = _flist; + _flist = fp; + return &fp->file; + } + return 0; +} + #ifdef SUPPORT_WIDE #define O_NONE 0 #define O_BYTE (-1) @@ -176,7 +210,7 @@ static _extradatap _extra; int (fgetc)(FILE *stream) { return getc(stream); } int (fputc)(int ch, FILE *stream) { return putc(ch, stream); } int (getc)(FILE *stream) { return getc(stream); } -int (getchar)() { return getchar(); } +int (getchar)(void) { return getchar(); } int (putc)(int ch, FILE *stream) { return putc(ch, stream); } int (putchar)(int ch) { return putchar(ch); } int (feof)(FILE *stream) { return feof(stream); } @@ -267,7 +301,7 @@ dbmsg("_IOSHARED so zoom to end %d\n", (int)stream->__pos); if (flag & _IOSEEK+_IOBUFREAD) { dbmsg("_writebuf seeking to %d\n", (int)stream->__pos); - if (_sys_seek(fh, (int)stream->__pos) < 0) + if (_sys_seek(fh, stream->__pos) < 0) { seterr(stream); return EOF; } @@ -485,7 +519,7 @@ dbmsg("fillbuf seeking to %d\n", (int)stream->__pos); _sys_ensure(fh); stream->__flag &= ~_IOADFSBUG; } - if (_sys_seek(fh, (int)stream->__pos) < 0) + if (_sys_seek(fh, stream->__pos) < 0) { seterr(stream); return EOF; } @@ -508,7 +542,7 @@ dbmsg("fillbuf dirty buffer, read into end,seeking to %d\n",(int) stream->__pos+ _sys_ensure(fh); stream->__flag &= ~_IOADFSBUG; } - if (_sys_seek(fh, (int) stream->__pos + extent) < 0) + if (_sys_seek(fh, stream->__pos + extent) < 0) { seterr(stream); return EOF; } else stream->__flag |= _IOBUFREAD; @@ -582,7 +616,9 @@ int fclose(FILE *stream) { int fd = _SYS_OPEN; res = fflush(stream); if (flag & _IOSHARED) - { for (fd = 0; fd < _SYS_OPEN; ++fd) + { /* No need to check FILElist, as only FILEs in __iob can be */ + /* shared by __dup(). */ + for (fd = 0; fd < _SYS_OPEN; ++fd) { FILE *f = &__iob[fd]; if ((f != stream) && (f->__flag & _IOREAD+_IOWRITE) && /* f is open */ @@ -647,12 +683,9 @@ FILE *freopen(const char *name, const char *mode, FILE *iob) } FILE *fopen(const char *name, const char *mode) -{ int i; - for (i=3; i<_SYS_OPEN; i++) - { FILE *stream = &__iob[i]; - if (!(stream->__flag & _IOREAD+_IOWRITE)) /* if not open then try it */ - return (freopen(name, mode, stream)); - } +{ FILE *stream = _getFILE(); + if (stream) + return (freopen(name, mode, stream)); return 0; /* no more i/o channels allowed for */ } @@ -674,17 +707,13 @@ FILE *_fopen_string_file(const char *data, int length) /* The declaration of this function in #include "hostsys.h" suggests */ /* that this function is of type (void *), so this definition will lead */ /* to a warning message. */ - int i; - for (i=3; i<_SYS_OPEN; i++) - { FILE *stream = &__iob[i]; - if (!(stream->__flag & _IOREAD+_IOWRITE)) /* if not open then try it */ - { - fclose(stream); - stream->__flag = _IOSTRG+_IOREAD+_IOACTIVE; - stream->__ptr = stream->__base = (unsigned char *)data; - stream->__icnt = length; - return stream; - } + FILE *stream = _getFILE(); + if (stream) + { fclose(stream); + stream->__flag = _IOSTRG+_IOREAD+_IOACTIVE; + stream->__ptr = stream->__base = (unsigned char *)data; + stream->__icnt = length; + return stream; } return 0; /* no more i/o channels allowed for */ } @@ -717,13 +746,18 @@ void _initio(char *f1,char *f2,char *f3) _sprintf_lf(v,_kernel_getmessage("Couldn't write %s", "C46"), f2), _sys_msg(v), exit(1); } -void _terminateio() +void _terminateio(void) { int i; int closeall = !_kernel_client_is_module(); + _FILElistp fp; for (i=3; i<_SYS_OPEN; i++) { FILE *f = &__iob[i]; if (closeall || (f->__flag & _IOUSERFILE)) fclose(f); } + for (fp = _flist; fp; fp = fp->next) { + FILE *f = &fp->file; + if (closeall || (f->__flag & _IOUSERFILE)) fclose(f); + } /* for cowardice do stdin, stdout, stderr last (in that order) */ for (i=0; i<3; i++) { FILE *f = &__iob[i]; @@ -732,7 +766,13 @@ void _terminateio() if (!closeall) freopen(TTYFILENAME, (f == stdin ? "r" : "w"), f); } } - if (_extra) { + if (closeall) { + _FILElistp fpnext; + for (fp = _flist; fp; fp = fpnext) { + fpnext = fp->next; + free(fp); + } + _flist = 0; free(_extra); _extra = 0; } @@ -1066,8 +1106,11 @@ int fflush(FILE *stream) res =_do_fflush(stream); else { int i; + _FILElistp fp; for (i=0; i<_SYS_OPEN; i++) if (_do_fflush(&__iob[i]) != 0) res = EOF; + for (fp=_flist; fp; fp=fp->next) + if (_do_fflush(&fp->file) != 0) res = EOF; } return res; } @@ -1119,7 +1162,7 @@ char *__old_tmpnam(char *a) return tmpnam(a); } -FILE *tmpfile() +FILE *tmpfile(void) { char name[L_tmpnam]; FILE *f; diff --git a/c/stdlib b/c/stdlib index 256ad21ffa77601197cd6512d553d6973557cb55..32018dc22bf53ef496e31a46a6699c02f73a860e 100644 --- a/c/stdlib +++ b/c/stdlib @@ -30,7 +30,7 @@ static unsigned long int next = 1; -int _ANSI_rand() /* This is the ANSI suggested portable code */ +int _ANSI_rand(void) /* This is the ANSI suggested portable code */ { next = next * 1103515245 + 12345; return (unsigned int) (next >> 16) % 32768; @@ -63,7 +63,7 @@ static unsigned _random_number_seed[55] = static int _random_j = 23, _random_k = 54; -int rand() +int rand(void) { /* See Knuth vol 2 section 3.2.2 for a discussion of this random number generator. @@ -108,7 +108,7 @@ static struct { char alloc_finalised, io_finalised, getenv_finalised; } exit_s; -void _exit_init() +void _exit_init(void) { if (_kernel_client_is_module()) { /* leave SWI mode exit handlers in place. number_of_exit_functions @@ -130,19 +130,28 @@ int atexit(vprocp func) return 0; /* success */ } -void _lib_shutdown() +void _lib_shutdown(void) { int mode = ((_kernel_processor_mode() & 0xF) != 0); + int ismodule = _kernel_client_is_module(); /* ie is module app, so not */ + /* total shutdown */ while (exit_s.number_of_exit_functions!=0) { vprocp fn = _exitvector[--exit_s.number_of_exit_functions].p; int flags = _exitvector[exit_s.number_of_exit_functions].i; if ((flags & 3) != mode) { ++exit_s.number_of_exit_functions; break; }; + /* Take extra care with fn ptr - consider Thumb */ + fn = (vprocp) ((unsigned) fn &~ 3); _call_client_0(fn); } /* ensure no recursion if finalisation fails */ - if (!exit_s.getenv_finalised) { exit_s.getenv_finalised = 1; _terminate_getenv(); } - if (!exit_s.alloc_finalised) { exit_s.alloc_finalised = 1; _terminate_user_alloc(); } - if (!exit_s.io_finalised) { exit_s.io_finalised = 1; _terminateio(); } + if (!exit_s.getenv_finalised && !ismodule) + { exit_s.getenv_finalised = 1; _terminate_getenv(); } + if (!exit_s.alloc_finalised) + { exit_s.alloc_finalised = 1; _terminate_user_alloc(); } + if (!exit_s.io_finalised) + { exit_s.io_finalised = 1; _terminateio(); } + if (ismodule) /* Want terminateio again for module part */ + exit_s.io_finalised = 0; } @@ -166,7 +175,7 @@ void _Exit(int n) _exit(n); } -void abort() +void abort(void) { raise(SIGABRT); exit(1); diff --git a/clib/h/stdio b/clib/h/stdio index 0fcb6e1605dc1f175d87090af2c7f7c1ab4316b9..9aeb0a5b724280b35b80054a5b6bdec24f359605 100644 --- a/clib/h/stdio +++ b/clib/h/stdio @@ -96,9 +96,7 @@ typedef struct __FILE_struct * negative integral constant, indicates end-of-file, that is, no more input * from a stream. */ -/* It is not clear to me what value FOPEN_MAX should have, so I will - err in the cautious direction - ANSI requires it to be at least 8 */ -#define FOPEN_MAX 8 /* check re arthur/unix/mvs */ +#define FOPEN_MAX _SYS_OPEN /* * an integral constant expression that is the minimum number of files that * this implementation guarantees can be open simultaneously. @@ -203,20 +201,24 @@ int fclose(FILE * /*stream*/); * causes the stream pointed to by stream to be flushed and the associated * file to be closed. Any unwritten buffered data for the stream are * delivered to the host environment to be written to the file; any unread - * buffered data are discarded. The stream is disassociated from the file. - * If the associated buffer was automatically allocated, it is deallocated. - * Returns: zero if the stream was succesfully closed, or nonzero if any + * buffered data are discarded. Whether or not the call succeeds, the stream + * is disassociated from the file and any buffer set by the setbuf or + * setvbuf function is disassociated from the stream (and deallocated if it + * was automatically allocated). + * Returns: zero if the stream was succesfully closed, or EOF if any * errors were detected or if the stream was already closed. */ int fflush(FILE * /*stream*/); /* - * If the stream points to an output or update stream in which the most - * recent operation was output, the fflush function causes any unwritten - * data for that stream to be delivered to the host environment to be - * written to the file. If the stream points to an input or update stream, - * the fflush function undoes the effect of any preceding ungetc operation - * on the stream. - * Returns: nonzero if a write error occurs. + * If the stream points to an output stream or an update stream in which + * the most recent operation was not input, the fflush function causes any + * unwritten data for that stream to be delivered to the host environment to + * be written to the file. If the stream points to an input or update + * stream, the fflush function undoes the effect of any preceding ungetc + * operation on the stream. + * If stream is a null pointer, the fflush function performs this flushing + * action on all streams for which the behaviour is defined above. + * Returns: EOF if a write error occurs. */ FILE *fopen(const char * restrict /*filename*/, const char * restrict /*mode*/); diff --git a/clib/s/cl_spare b/clib/s/cl_spare index 21060a863241ae19d40e3b10bf2720b7defbd1f6..6c6566ddfd258b8a1bc84452a8272e48f099c4ad 100644 --- a/clib/s/cl_spare +++ b/clib/s/cl_spare @@ -25,7 +25,7 @@ EXPORT |CLib_data_end| - % 124*4 + % 123*4 |CLib_data_end| END