forked from KolibriOS/kolibrios
newlib: add rewind.c
git-svn-id: svn://kolibrios.org@5198 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
40cd438474
commit
84eba6470e
@ -272,6 +272,7 @@ STDIO_SRCS= \
|
|||||||
refill.c \
|
refill.c \
|
||||||
rget.c \
|
rget.c \
|
||||||
remove.c \
|
remove.c \
|
||||||
|
rewind.c \
|
||||||
setvbuf.c \
|
setvbuf.c \
|
||||||
stdio.c \
|
stdio.c \
|
||||||
tmpfile.c \
|
tmpfile.c \
|
||||||
|
@ -37,9 +37,6 @@ extern int main (int, char **, char **);
|
|||||||
int _errno;
|
int _errno;
|
||||||
int _fmode;
|
int _fmode;
|
||||||
|
|
||||||
char __appcwd[1024];
|
|
||||||
int __appcwdlen;
|
|
||||||
|
|
||||||
int _argc;
|
int _argc;
|
||||||
char **_argv;
|
char **_argv;
|
||||||
|
|
||||||
@ -98,13 +95,6 @@ __crt_startup (void)
|
|||||||
|
|
||||||
__do_global_ctors();
|
__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];
|
arg[0] = &__pgmname[0];
|
||||||
|
|
||||||
if( __cmdline[0] != 0)
|
if( __cmdline[0] != 0)
|
||||||
|
@ -33,8 +33,6 @@ int link_app();
|
|||||||
void* get_entry_point(void *raw);
|
void* get_entry_point(void *raw);
|
||||||
int (*entry)(int, char **, char **);
|
int (*entry)(int, char **, char **);
|
||||||
|
|
||||||
char __appcwd[1024];
|
|
||||||
int __appcwdlen;
|
|
||||||
char* __appenv;
|
char* __appenv;
|
||||||
int __appenv_size;
|
int __appenv_size;
|
||||||
|
|
||||||
@ -202,11 +200,6 @@ libc_crt_startup (void *libc_base)
|
|||||||
if( link_app() == 0)
|
if( link_app() == 0)
|
||||||
goto done;
|
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)
|
if( header->cmdline[0] != 0)
|
||||||
{
|
{
|
||||||
argc = split_cmdline(header->cmdline, NULL) + 1;
|
argc = split_cmdline(header->cmdline, NULL) + 1;
|
||||||
|
81
contrib/sdk/sources/newlib/libc/stdio/rewind.c
Normal file
81
contrib/sdk/sources/newlib/libc/stdio/rewind.c
Normal file
@ -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
|
||||||
|
<<rewind>>---reinitialize a file or stream
|
||||||
|
|
||||||
|
INDEX
|
||||||
|
rewind
|
||||||
|
INDEX
|
||||||
|
_rewind_r
|
||||||
|
|
||||||
|
ANSI_SYNOPSIS
|
||||||
|
#include <stdio.h>
|
||||||
|
void rewind(FILE *<[fp]>);
|
||||||
|
void _rewind_r(struct _reent *<[ptr]>, FILE *<[fp]>);
|
||||||
|
|
||||||
|
TRAD_SYNOPSIS
|
||||||
|
#include <stdio.h>
|
||||||
|
void rewind(<[fp]>)
|
||||||
|
FILE *<[fp]>;
|
||||||
|
|
||||||
|
void _rewind_r(<[ptr]>, <[fp]>)
|
||||||
|
struct _reent *<[ptr]>;
|
||||||
|
FILE *<[fp]>;
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
<<rewind>> 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
|
||||||
|
<<rewind>> does not return a result.
|
||||||
|
|
||||||
|
PORTABILITY
|
||||||
|
ANSI C requires <<rewind>>.
|
||||||
|
|
||||||
|
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 <reent.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
_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 */
|
@ -22,8 +22,89 @@
|
|||||||
#undef erro
|
#undef erro
|
||||||
extern int errno;
|
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, ...)
|
int open (const char * filename, int flags, ...)
|
||||||
{
|
{
|
||||||
|
char buf[1024];
|
||||||
|
|
||||||
__io_handle *ioh;
|
__io_handle *ioh;
|
||||||
fileinfo_t info;
|
fileinfo_t info;
|
||||||
int iomode, rwmode, offset;
|
int iomode, rwmode, offset;
|
||||||
@ -37,9 +118,19 @@ int open (const char * filename, int flags, ...)
|
|||||||
return (-1);
|
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 &&
|
if( flags & O_EXCL &&
|
||||||
flags & O_CREAT )
|
flags & O_CREAT )
|
||||||
@ -54,7 +145,7 @@ int open (const char * filename, int flags, ...)
|
|||||||
if( err )
|
if( err )
|
||||||
{
|
{
|
||||||
if(flags & O_CREAT)
|
if(flags & O_CREAT)
|
||||||
err=create_file(filename);
|
err=create_file(buf);
|
||||||
if( err )
|
if( err )
|
||||||
{
|
{
|
||||||
errno = EACCES;
|
errno = EACCES;
|
||||||
@ -63,7 +154,7 @@ int open (const char * filename, int flags, ...)
|
|||||||
};
|
};
|
||||||
|
|
||||||
if( flags & O_TRUNC )
|
if( flags & O_TRUNC )
|
||||||
set_file_size(filename, 0);
|
set_file_size(buf, 0);
|
||||||
|
|
||||||
ioh = &__io_tab[hid];
|
ioh = &__io_tab[hid];
|
||||||
|
|
||||||
@ -92,12 +183,14 @@ int open (const char * filename, int flags, ...)
|
|||||||
} else
|
} else
|
||||||
iomode |= _BINARY;
|
iomode |= _BINARY;
|
||||||
|
|
||||||
ioh->name = strdup(filename);
|
ioh->name = strdup(buf);
|
||||||
ioh->offset = offset;
|
ioh->offset = offset;
|
||||||
ioh->mode = iomode;
|
ioh->mode = iomode;
|
||||||
ioh->read = read_file;
|
ioh->read = read_file;
|
||||||
ioh->write = write_file;
|
ioh->write = write_file;
|
||||||
|
|
||||||
|
// printf("%s %s\n", __FUNCTION__, ioh->name);
|
||||||
|
|
||||||
return hid;
|
return hid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user