diff --git a/contrib/sdk/sources/newlib/libc/Makefile b/contrib/sdk/sources/newlib/libc/Makefile index 2e7572e8a8..40378655f8 100644 --- a/contrib/sdk/sources/newlib/libc/Makefile +++ b/contrib/sdk/sources/newlib/libc/Makefile @@ -75,7 +75,7 @@ CORE_SRCS:= \ ctype/iswalnum.c \ ctype/iswalpha.c \ ctype/iswblank.c \ - ctype/iswcntrl.c \ + ctype/iswcntrl.c \ ctype/iswdigit.c \ ctype/iswgraph.c \ ctype/iswlower.c \ @@ -272,6 +272,7 @@ STDIO_SRCS= \ refill.c \ rget.c \ remove.c \ + rewind.c \ setvbuf.c \ stdio.c \ tmpfile.c \ diff --git a/contrib/sdk/sources/newlib/libc/crt/crt1.c b/contrib/sdk/sources/newlib/libc/crt/crt1.c index 292dcfc0bd..58131dc8a6 100644 --- a/contrib/sdk/sources/newlib/libc/crt/crt1.c +++ b/contrib/sdk/sources/newlib/libc/crt/crt1.c @@ -37,9 +37,6 @@ extern int main (int, char **, char **); int _errno; int _fmode; -char __appcwd[1024]; -int __appcwdlen; - int _argc; char **_argv; @@ -98,13 +95,6 @@ __crt_startup (void) __do_global_ctors(); - __appcwdlen = strrchr(&__pgmname[0], '/') - &__pgmname[0] + 1; - __appcwdlen = __appcwdlen > 1023 ? 1023 : __appcwdlen; - memcpy(__appcwd, &__pgmname, __appcwdlen); - __appcwd[__appcwdlen] = 0; - - set_cwd(__appcwd); - arg[0] = &__pgmname[0]; if( __cmdline[0] != 0) diff --git a/contrib/sdk/sources/newlib/libc/crt/crtdll.c b/contrib/sdk/sources/newlib/libc/crt/crtdll.c index 024531dc1d..629c90726d 100644 --- a/contrib/sdk/sources/newlib/libc/crt/crtdll.c +++ b/contrib/sdk/sources/newlib/libc/crt/crtdll.c @@ -33,8 +33,6 @@ int link_app(); void* get_entry_point(void *raw); int (*entry)(int, char **, char **); -char __appcwd[1024]; -int __appcwdlen; char* __appenv; int __appenv_size; @@ -202,11 +200,6 @@ libc_crt_startup (void *libc_base) if( link_app() == 0) goto done; - __appcwdlen = strrchr(header->path, '/') - header->path; - __appcwdlen = __appcwdlen > 1022 ? 1022 : __appcwdlen; - memcpy(__appcwd, header->path, __appcwdlen); - set_cwd(__appcwd); - if( header->cmdline[0] != 0) { argc = split_cmdline(header->cmdline, NULL) + 1; diff --git a/contrib/sdk/sources/newlib/libc/stdio/rewind.c b/contrib/sdk/sources/newlib/libc/stdio/rewind.c new file mode 100644 index 0000000000..fb03e5be72 --- /dev/null +++ b/contrib/sdk/sources/newlib/libc/stdio/rewind.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---reinitialize a file or stream + +INDEX + rewind +INDEX + _rewind_r + +ANSI_SYNOPSIS + #include + void rewind(FILE *<[fp]>); + void _rewind_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +TRAD_SYNOPSIS + #include + void rewind(<[fp]>) + FILE *<[fp]>; + + void _rewind_r(<[ptr]>, <[fp]>) + struct _reent *<[ptr]>; + FILE *<[fp]>; + +DESCRIPTION +<> returns the file position indicator (if any) for the file +or stream identified by <[fp]> to the beginning of the file. It also +clears any error indicator and flushes any pending output. + +RETURNS +<> does not return a result. + +PORTABILITY +ANSI C requires <>. + +No supporting OS subroutines are required. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include + +_VOID +_DEFUN(_rewind_r, (ptr, fp), + struct _reent * ptr _AND + register FILE * fp) +{ + _CAST_VOID _fseek_r (ptr, fp, 0L, SEEK_SET); + clearerr (fp); +} + +#ifndef _REENT_ONLY + +_VOID +_DEFUN(rewind, (fp), + register FILE * fp) +{ + _rewind_r (_REENT, fp); +} + +#endif /* !_REENT_ONLY */ diff --git a/contrib/sdk/sources/newlib/libc/sys/open.c b/contrib/sdk/sources/newlib/libc/sys/open.c index 85dc2633c2..da990e40a3 100644 --- a/contrib/sdk/sources/newlib/libc/sys/open.c +++ b/contrib/sdk/sources/newlib/libc/sys/open.c @@ -22,8 +22,89 @@ #undef erro extern int errno; +static inline int is_slash(char c) +{ + return c=='/' || c=='\\'; +} + +void fix_slashes(char * in,char * out) +{ + int slash_count; + + for(slash_count=1;in && out && *in;in++) + { + if(is_slash(*in)) + { + slash_count++; + continue; + } + else + { + if(slash_count) + { + slash_count=0; + *out++='/'; + } + *out++=*in; + } + } + *out='\0'; +}; + + +void buildpath(char *buf, const char* file) +{ + char *ptr; + + ptr = buf + strlen(buf); + + while (*file) + { + if (file[0] == '.' && file[1] == 0) + break; + + if (file[0] == '.' && file[1] == '/') + { + file+=2; + continue; + }; + + if (file[0] == '.' && file[1] == '.' && + (file[2] == 0 || file[2] == '/')) + { + while (ptr > buf && ptr[-1] != '/') + --ptr; + file+=2; + if (*file == 0) + break; + ++file; + continue; + } + *ptr++ = '/'; + if (*file == '/') + ++file; + while (*file && *file!='/') + *ptr++ = *file++; + } + *ptr = 0; +}; + +static char *getccwd(char *buf, size_t size) +{ + int bsize; + __asm__ __volatile__( + "int $0x40" + :"=a"(bsize) + :"a"(30),"b"(2),"c"(buf), "d"(size) + :"memory"); + + return buf; +}; + int open (const char * filename, int flags, ...) { + char buf[1024]; + __io_handle *ioh; fileinfo_t info; int iomode, rwmode, offset; @@ -37,9 +118,19 @@ int open (const char * filename, int flags, ...) return (-1); }; -// path = getfullpath(name); + if (filename[0]=='/') + { + strcpy(buf,filename); + } + else + { + getccwd(buf, 1024); + buildpath(buf, filename); + } - err = get_fileinfo(filename, &info); +// printf("%s %s\n", __FUNCTION__, buf); + + err = get_fileinfo(buf, &info); if( flags & O_EXCL && flags & O_CREAT ) @@ -54,7 +145,7 @@ int open (const char * filename, int flags, ...) if( err ) { if(flags & O_CREAT) - err=create_file(filename); + err=create_file(buf); if( err ) { errno = EACCES; @@ -63,7 +154,7 @@ int open (const char * filename, int flags, ...) }; if( flags & O_TRUNC ) - set_file_size(filename, 0); + set_file_size(buf, 0); ioh = &__io_tab[hid]; @@ -92,12 +183,14 @@ int open (const char * filename, int flags, ...) } else iomode |= _BINARY; - ioh->name = strdup(filename); + ioh->name = strdup(buf); ioh->offset = offset; ioh->mode = iomode; ioh->read = read_file; ioh->write = write_file; +// printf("%s %s\n", __FUNCTION__, ioh->name); + return hid; };