newlib: perror() && mbstowcs()

git-svn-id: svn://kolibrios.org@5220 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2014-12-06 08:37:08 +00:00
parent 3e62747fb5
commit b0a0820151
7 changed files with 192 additions and 107 deletions

View File

@ -270,7 +270,10 @@ STDIO_SRCS= \
fwrite.c \ fwrite.c \
fvwrite.c \ fvwrite.c \
fwalk.c \ fwalk.c \
makebuf.c \
mbstowcs.c \
mktemp.c \ mktemp.c \
perror.c \
putc.c \ putc.c \
puts.c \ puts.c \
refill.c \ refill.c \
@ -291,7 +294,6 @@ STDIO_SRCS= \
vsprintf.c \ vsprintf.c \
vsnprintf.c \ vsnprintf.c \
vsscanf.c \ vsscanf.c \
makebuf.c \
wsetup.c \ wsetup.c \
wbuf.c \ wbuf.c \
sccl.c \ sccl.c \

View File

@ -82,11 +82,12 @@ STDIO_SRCS = {
"fileno.c", "findfp.c", "fiprintf.c", "fiscanf.c", "fprintf.c", "fputc.c", "fileno.c", "findfp.c", "fiprintf.c", "fiscanf.c", "fprintf.c", "fputc.c",
"fputs.c", "fputwc.c", "fread.c", "freopen.c", "fscanf.c", "fseek.c", "fputs.c", "fputwc.c", "fread.c", "freopen.c", "fscanf.c", "fseek.c",
"fseeko.c", "ftell.c", "ftello.c", "fwrite.c", "fvwrite.c", "fwalk.c", "fseeko.c", "ftell.c", "ftello.c", "fwrite.c", "fvwrite.c", "fwalk.c",
"mktemp.c", "putc.c", "puts.c", "refill.c", "rget.c", "remove.c", "rename.c", "makebuf.c", "mbstowcs.c", "mktemp.c", "perror.c", "putc.c", "puts.c",
"setvbuf.c", "stdio.c", "tmpfile.c", "tmpnam.c", "ungetc.c", "vasniprintf.c", "refill.c", "rget.c", "remove.c", "rename.c", "setvbuf.c", "stdio.c",
"vasnprintf.c", "vdprintf.c", "vdiprintf.c", "vscanf.c", "vsprintf.c", "tmpfile.c", "tmpnam.c", "ungetc.c", "vasniprintf.c", "vasnprintf.c",
"vsnprintf.c", "vsscanf.c", "makebuf.c", "wsetup.c", "wbuf.c", "sccl.c", "vdprintf.c", "vdiprintf.c", "vscanf.c", "vsprintf.c", "vsnprintf.c",
"siprintf.c", "sniprintf.c", "snprintf.c", "sprintf.c", "sscanf.c" "vsscanf.c", "wsetup.c", "wbuf.c", "sccl.c", "siprintf.c", "sniprintf.c",
"snprintf.c", "sprintf.c", "sscanf.c"
} }
MATH_SRCS = { MATH_SRCS = {

View File

@ -0,0 +1,83 @@
/*
FUNCTION
<<mbstowcs>>---minimal multibyte string to wide char converter
INDEX
mbstowcs
ANSI_SYNOPSIS
#include <stdlib.h>
int mbstowcs(wchar_t *restrict <[pwc]>, const char *restrict <[s]>, size_t <[n]>);
TRAD_SYNOPSIS
#include <stdlib.h>
int mbstowcs(<[pwc]>, <[s]>, <[n]>)
wchar_t *<[pwc]>;
const char *<[s]>;
size_t <[n]>;
DESCRIPTION
When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming
implementation of <<mbstowcs>>. In this case, the
only ``multi-byte character sequences'' recognized are single bytes,
and they are ``converted'' to wide-char versions simply by byte
extension.
When _MB_CAPABLE is defined, this routine calls <<_mbstowcs_r>> to perform
the conversion, passing a state variable to allow state dependent
decoding. The result is based on the locale setting which may
be restricted to a defined set of locales.
RETURNS
This implementation of <<mbstowcs>> returns <<0>> if
<[s]> is <<NULL>> or is the empty string;
it returns <<-1>> if _MB_CAPABLE and one of the
multi-byte characters is invalid or incomplete;
otherwise it returns the minimum of: <<n>> or the
number of multi-byte characters in <<s>> plus 1 (to
compensate for the nul character).
If the return value is -1, the state of the <<pwc>> string is
indeterminate. If the input has a length of 0, the output
string will be modified to contain a wchar_t nul terminator.
PORTABILITY
<<mbstowcs>> is required in the ANSI C standard. However, the precise
effects vary with the locale.
<<mbstowcs>> requires no supporting OS subroutines.
*/
#ifndef _REENT_ONLY
#include <newlib.h>
#include <stdlib.h>
#include <wchar.h>
size_t
_DEFUN (mbstowcs, (pwcs, s, n),
wchar_t *__restrict pwcs _AND
const char *__restrict s _AND
size_t n)
{
#ifdef _MB_CAPABLE
mbstate_t state;
state.__count = 0;
return _mbstowcs_r (_REENT, pwcs, s, n, &state);
#else /* not _MB_CAPABLE */
int count = 0;
if (n != 0) {
do {
if ((*pwcs++ = (wchar_t) *s++) == 0)
break;
count++;
} while (--n != 0);
}
return count;
#endif /* not _MB_CAPABLE */
}
#endif /* !_REENT_ONLY */

View File

@ -0,0 +1,100 @@
/*
* 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
<<perror>>---print an error message on standard error
INDEX
perror
INDEX
_perror_r
ANSI_SYNOPSIS
#include <stdio.h>
void perror(char *<[prefix]>);
void _perror_r(struct _reent *<[reent]>, char *<[prefix]>);
TRAD_SYNOPSIS
#include <stdio.h>
void perror(<[prefix]>)
char *<[prefix]>;
void _perror_r(<[reent]>, <[prefix]>)
struct _reent *<[reent]>;
char *<[prefix]>;
DESCRIPTION
Use <<perror>> to print (on standard error) an error message
corresponding to the current value of the global variable <<errno>>.
Unless you use <<NULL>> as the value of the argument <[prefix]>, the
error message will begin with the string at <[prefix]>, followed by a
colon and a space (<<: >>). The remainder of the error message is one
of the strings described for <<strerror>>.
The alternate function <<_perror_r>> is a reentrant version. The
extra argument <[reent]> is a pointer to a reentrancy structure.
RETURNS
<<perror>> returns no result.
PORTABILITY
ANSI C requires <<perror>>, but the strings issued vary from one
implementation to another.
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.
*/
#include <_ansi.h>
#include <reent.h>
#include <stdio.h>
#include <string.h>
#include "local.h"
_VOID
_DEFUN(_perror_r, (ptr, s),
struct _reent *ptr _AND
_CONST char *s)
{
char *error;
int dummy;
_REENT_SMALL_CHECK_INIT (ptr);
if (s != NULL && *s != '\0')
{
fputs (s, _stderr_r (ptr));
fputs (": ", _stderr_r (ptr));
}
if ((error = _strerror_r (ptr, ptr->_errno, 1, &dummy)) != NULL)
fputs (error, _stderr_r (ptr));
fputc ('\n', _stderr_r (ptr));
}
#ifndef _REENT_ONLY
_VOID
_DEFUN(perror, (s),
_CONST char *s)
{
_perror_r (_REENT, s);
}
#endif

View File

@ -25,9 +25,6 @@ int _rename (char *from, char *to)
int f_to; int f_to;
int size; int size;
printf("%s from %s to %s\n", __FUNCTION__,
from, to);
f_from = open(from,O_RDONLY); f_from = open(from,O_RDONLY);
if (f_from < 0) if (f_from < 0)

View File

@ -1,96 +0,0 @@
/* stat.c -- Get the status of a file.
*
* Copyright (c) 1995 Cygnus Support
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice is included verbatim in any distributions. No written agreement,
* license, or royalty fee is required for any of the authorized uses.
* Modifications to this software may be copyrighted by their authors
* and need not follow the licensing terms described here, provided that
* the new terms are clearly indicated on the first page of each file where
* they apply.
*/
#include <sys/stat.h>
#include <sys/kos_io.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include "glue.h"
/*
* stat -- Since we have no file system, we just return an error.
*/
int
_DEFUN (stat, (path, buf),
const char *path _AND
struct stat *buf)
{
fileinfo_t info;
struct tm time;
printf("%s %s\n", __FUNCTION__, path);
if( get_fileinfo(path, &info))
{
errno = ENOENT;
return (-1);
};
memset (buf, 0, sizeof (* buf));
buf->st_size = info.size;
if (info.attr & 0x10)
buf->st_mode = S_IFDIR;
else
{
if (info.attr & 0x07)
buf->st_mode = S_IFREG|S_IRUSR|S_IXUSR;
else
buf->st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IXUSR;
}
buf->st_blksize = 4096;
time.tm_sec = info.atime.sec;
time.tm_min = info.atime.min;
time.tm_hour = info.atime.hour;
time.tm_mday = info.adate.day;
time.tm_mon = info.adate.month;
time.tm_year = info.adate.year - 1900;
time.tm_isdst = -1;
buf->st_atime = mktime(&time);
time.tm_sec = info.ctime.sec;
time.tm_min = info.ctime.min;
time.tm_hour = info.ctime.hour;
time.tm_mday = info.cdate.day;
time.tm_mon = info.cdate.month;
time.tm_year = info.cdate.year - 1900;
time.tm_isdst = -1;
buf->st_ctime = mktime(&time);
time.tm_sec = info.mtime.sec;
time.tm_min = info.mtime.min;
time.tm_hour = info.mtime.hour;
time.tm_mday = info.mdate.day;
time.tm_mon = info.mdate.month;
time.tm_year = info.mdate.year - 1900;
time.tm_isdst = -1;
buf->st_mtime = mktime(&time);
return (0);
}
int
_DEFUN (lstat, (path, buf),
const char *path _AND
struct stat *buf)
{
return stat(path, buf);
}

View File

@ -48,8 +48,6 @@ _DEFUN (unlink, (path),
{ {
int err; int err;
printf("%s %s\n", __FUNCTION__, path);
err = delete_file(path); err = delete_file(path);
if (!err) if (!err)