Added more functions to msvcrt.

svn path=/trunk/; revision=2055
This commit is contained in:
Eric Kohl 2001-07-12 16:31:03 +00:00
parent 562836fa81
commit b03d2d1155
12 changed files with 592 additions and 24 deletions

View file

@ -0,0 +1,84 @@
/*
* locale.h
*
* Functions and types for localization (ie. changing the appearance of
* output based on the standards of a certain country).
*
* This file is part of the Mingw32 package.
*
* Contributors:
* Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
* use, modify or distribute it freely.
*
* This code is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
* DISCLAMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* $Revision: 1.1 $
* $Author: ekohl $
* $Date: 2001/07/12 16:25:53 $
*
*/
#ifndef _LOCALE_H_
#define _LOCALE_H_
#ifdef __cplusplus
extern "C" {
#endif
/*
* NOTE: I have tried to test this, but I am limited by my knowledge of
* locale issues. The structure does not bomb if you look at the
* values, and 'decimal_point' even seems to be correct. But the
* rest of the values are, by default, not particularly useful
* (read meaningless and not related to the international settings
* of the system).
*/
#define LC_ALL 0
#define LC_COLLATE 1
#define LC_CTYPE 2
#define LC_MONETARY 3
#define LC_NUMERIC 4
#define LC_TIME 5
/*
* The structure returned by 'localeconv'.
*/
struct lconv
{
char* decimal_point;
char* thousands_sep;
char* grouping;
char* int_curr_symbol;
char* currency_symbol;
char* mon_decimal_point;
char* mon_thousands_sep;
char* mon_grouping;
char* positive_sign;
char* negative_sign;
char int_frac_digits;
char frac_digits;
char p_cs_precedes;
char p_sep_by_space;
char n_cs_precedes;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
};
char* setlocale (int nCategory, const char* locale);
struct lconv* localeconv (void);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,35 @@
#ifndef _SEARCH_H_
#define _SEARCH_H_
//char *key
//void *data
//enum { FIND, ENTER } ACTION;
//enum { preorder, postorder, endorder, leaf } VISIT;
#include <msvcrt/stddef.h>
#include <msvcrt/sys/types.h>
//The Single UNIX ® Specification, Version 2 Copyright © 1997 The Open Group
//int hcreate(size_t);
//void hdestroy(void);
//ENTRY *hsearch(ENTRY, ACTION);
//void insque(void *, void *);
void *_lfind(const void *, const void *, size_t *,
size_t, int (*)(const void *, const void *));
void *_lsearch(const void *, void *, size_t *,
size_t, int (*)(const void *, const void *));
//void remque(void *);
//void *tdelete(const void *, void **,
// int(*)(const void *, const void *));
//void *tfind(const void *, void *const *,
// int(*)(const void *, const void *));
//void *tsearch(const void *, void **,
// int(*)(const void *, const void *));
//void twalk(const void *,
// void (*)(const void *, VISIT, int ));
#endif

View file

@ -1,4 +1,4 @@
# $Id: Makefile,v 1.16 2001/07/06 12:53:03 ekohl Exp $
# $Id: Makefile,v 1.17 2001/07/12 16:31:03 ekohl Exp $
#
# ReactOS Operating System
#
@ -102,6 +102,9 @@ OBJECTS_IO = \
io/utime.o \
io/write.o
OBJECTS_LOCALE = \
locale/locale.o
OBJECTS_MATH = \
math/acos.o \
math/adjust.o \
@ -145,13 +148,22 @@ OBJECTS_MISC = \
misc/tls.o
OBJECTS_PROCESS = \
process/_cwait.o \
process/_system.o \
process/dll.o \
process/procid.o \
process/thread.o \
process/threadid.o
OBJECTS_SEARCH = \
search/lfind.o \
search/lsearch.o
OBJECTS_SETJMP = \
setjmp/setjmp.o
OBJECTS_SIGNAL = \
signal/signal.o \
signal/signal.o
OBJECTS_STDIO = \
stdio/allocfil.o \
@ -215,7 +227,6 @@ OBJECTS_STDIO = \
stdio/vsprintf.o \
stdio/vsscanf.o
#incomplete
OBJECTS_STDLIB = \
stdlib/_exit.o \
stdlib/abort.o \
@ -339,9 +350,12 @@ OBJECTS = \
$(OBJECTS_EXCEPT) \
$(OBJECTS_FLOAT) \
$(OBJECTS_IO) \
$(OBJECTS_LOCALE) \
$(OBJECTS_MATH) \
$(OBJECTS_MISC) \
$(OBJECTS_PROCESS) \
$(OBJECTS_SEARCH) \
$(OBJECTS_SETJMP) \
$(OBJECTS_SIGNAL) \
$(OBJECTS_STDIO) \
$(OBJECTS_STDLIB) \
@ -359,9 +373,12 @@ CLEAN_FILES = \
except\*.o \
float\*.o \
io\*.o \
locale\*.o \
math\*.o \
misc\*.o \
process\*.o \
search\*.o \
setjmp\*.o \
signal\*.o \
stdio\*.o \
stdlib\*.o \
@ -383,9 +400,12 @@ CLEAN_FILES = \
except/*.o \
float/*.o \
io/*.o \
locale/*.o \
math/*.o \
misc/*.o \
process/*.o \
search/*.o \
setjmp/*.o \
signal/*.o \
stdio/*.o \
stdlib/*.o \

View file

@ -0,0 +1,141 @@
#include <msvcrt/stdio.h>
#include <msvcrt/locale.h>
#include <msvcrt/string.h>
#include <limits.h>
int _current_category; /* used by setlocale */
const char *_current_locale;
int parse_locale(char *locale, char *lang, char *country, char *code_page);
char *setlocale(int category, const char *locale)
{
char lang[100];
char country[100];
char code_page[100];
parse_locale((char *)locale,lang,country,code_page);
//printf("%s %s %s %s\n",locale,lang,country,code_page);
switch ( category )
{
case LC_COLLATE:
break;
case LC_CTYPE:
break;
case LC_MONETARY:
break;
case LC_NUMERIC:
break;
case LC_TIME:
break;
case LC_ALL:
break;
default:
break;
}
return "C";
}
/*
locale "lang[_country[.code_page]]"
| ".code_page"
| ""
| NULL
*/
int parse_locale(char *locale, char *lang, char *country, char *code_page)
{
while ( *locale != 0 && *locale != '.' && *locale != '_' )
{
*lang = *locale;
lang++;
locale++;
}
*lang = 0;
if ( *locale == '_' ) {
locale++;
while ( *locale != 0 && *locale != '.' )
{
*country = *locale;
country++;
locale++;
}
}
*country = 0;
if ( *locale == '.' ) {
locale++;
while ( *locale != 0 && *locale != '.' )
{
*code_page = *locale;
code_page++;
locale++;
}
}
*code_page = 0;
return 0;
}
const struct map_lcid2str {
short langid;
const char *langname;
const char *country;
} languages[]={
{0x0409,"English", "United States"},
{0x0809,"English", "United Kingdom"},
{0x0000,"Unknown", "Unknown"}
};
const struct map_cntr {
const char *abrev;
const char *country;
} abrev[] = {
{"britain", "united kingdom"},
{"england", "united kingdom"},
{"gbr", "united kingdom"},
{"great britain", "united kingdom"},
{"uk", "united kingdom"},
{"united kingdom", "united kingdom"},
{"united-kingdom", "united kingdom"},
{"america", "united states" },
{"united states", "united states"},
{"united-states", "united states"},
{"us", "united states"},
{"usa" "united states"}
};
struct lconv _lconv = {
".", // decimal_point
",", // thousands_sep
"", // grouping;
"DOL", // int_curr_symbol
"$", // currency_symbol
".", // mon_decimal_point
",", // mon_thousands_sep
"", // mon_grouping;
"+", // positive_sign
"-", // negative_sign
127, // int_frac_digits
127, // frac_digits
127, // p_cs_precedes
127, // p_sep_by_space
127, // n_cs_precedes
127, // n_sep_by_space
127, // p_sign_posn;
127 // n_sign_posn;
};
struct lconv *localeconv(void)
{
return (struct lconv *) &_lconv;
}

View file

@ -1,4 +1,4 @@
/* $Id: dllmain.c,v 1.7 2001/04/10 19:18:59 ekohl Exp $
/* $Id: dllmain.c,v 1.8 2001/07/12 16:28:24 ekohl Exp $
*
* ReactOS MSVCRT.DLL Compatibility Library
*/
@ -25,6 +25,8 @@ char *_pgmptr = NULL; /* pointer to program name */
int __app_type = 0; //_UNKNOWN_APP; /* application type */
int __mb_cur_max = 1;
static int envAlloced = 0;
@ -127,6 +129,11 @@ char ***__p___initenv(void)
return &__initenv;
}
int *__p___mb_cur_max(void)
{
return &__mb_cur_max;
}
unsigned int *__p__osver(void)
{
return &_osver;

View file

@ -1,4 +1,4 @@
; $Id: msvcrt.def,v 1.12 2001/07/06 21:17:36 ekohl Exp $
; $Id: msvcrt.def,v 1.13 2001/07/12 16:31:03 ekohl Exp $
;
; ReactOS MSVCRT Compatibility Library
;
@ -89,8 +89,8 @@ _XcptFilter
; __RTDynamicCast
; __RTtypeid
; __STRINGTOLD
__argc
__argv
__argc DATA
__argv DATA
; __badioinfo
; __crtCompareStringA
; __crtGetLocaleInfoW
@ -99,7 +99,7 @@ __dllonexit
; __doserrno
__fpecode
__getmainargs
; __initenv
__initenv DATA
__isascii
__iscsym
__iscsymf
@ -107,11 +107,11 @@ __iscsymf
; __lc_collate_cp
; __lc_handle
; __lconv_init
; __mb_cur_max
__mb_cur_max DATA
__p___argc
__p___argv
__p___initenv
; __p___mb_cur_max
__p___mb_cur_max
; __p___wargv
; __p___winitenv
__p__acmdln
@ -200,8 +200,8 @@ _cputs
_creat
_cscanf
_ctype DATA
; _cwait
; _daylight
_cwait
_daylight DATA
; _dstbias
_dup
_dup2
@ -229,7 +229,7 @@ _fdopen
_fgetchar
_fgetwchar
_filbuf
; _fileinfo
; _fileinfo DATA
_filelength
_filelengthi64
_fileno
@ -324,7 +324,7 @@ _j0
_j1
_jn
_kbhit
; _lfind
_lfind
_loaddll
_local_unwind2
; _lock
@ -333,7 +333,7 @@ _logb
; _longjmpex
_lrotl
_lrotr
; _lsearch
_lsearch
_lseek
_lseeki64
_ltoa
@ -433,7 +433,7 @@ _searchenv
; _set_error_mode
; _set_sbh_threshold
_seterrormode
; _setjmp
_setjmp
; _setjmp3
; _setmaxstdio
; _setmbcp
@ -476,10 +476,10 @@ _sys_nerr DATA
_tell
_telli64
_tempnam
; _timezone
_timezone DATA
_tolower
_toupper
; _tzname
_tzname DATA
_tzset
_ui64toa
_ui64tow
@ -662,11 +662,11 @@ isxdigit
labs
ldexp
ldiv
; localeconv
localeconv
localtime
log
log10
; longjmp
longjmp
malloc
; mblen
; mbstowcs
@ -695,7 +695,7 @@ rename
rewind
scanf
setbuf
; setlocale
setlocale
setvbuf
signal
sin
@ -727,7 +727,7 @@ strtoul
strxfrm
swprintf
swscanf
; system
system
tan
tanh
time

View file

@ -0,0 +1,31 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/crtdll/process/cwait.c
* PURPOSE: Waits for a process to exit
* PROGRAMER: Boudewijn Dekker
* UPDATE HISTORY:
* 04/03/99: Created
*/
#include <windows.h>
#include <msvcrt/process.h>
#include <msvcrt/errno.h>
#include <msvcrt/internal/file.h>
int _cwait(int* pnStatus, int hProc, int nAction)
{
DWORD ExitCode;
nAction = 0;
if (WaitForSingleObject((void *)hProc,INFINITE) != WAIT_OBJECT_0)
{
__set_errno(ECHILD);
return -1;
}
if (!GetExitCodeProcess((void *)hProc,&ExitCode))
return -1;
if (pnStatus != NULL)
*pnStatus = (int)ExitCode;
return hProc;
}

View file

@ -0,0 +1,79 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/crtdll/process/system.c
* PURPOSE: Excutes a shell command
* PROGRAMER: Boudewijn Dekker
* UPDATE HISTORY:
* 04/03/99: Created
*/
#include <windows.h>
#include <msvcrt/stdlib.h>
#include <msvcrt/string.h>
#include <msvcrt/process.h>
int system(const char *command)
{
char szCmdLine[MAX_PATH];
char *szComSpec=NULL;
PROCESS_INFORMATION ProcessInformation;
STARTUPINFOA StartupInfo;
int nStatus;
szComSpec = getenv("COMSPEC");
// system should return 0 if command is null and the shell is found
if (command == NULL)
{
if (szComSpec == NULL)
return 0;
else
return -1;
}
// should return 127 or 0 ( MS ) if the shell is not found
// __set_errno(ENOENT);
if (szComSpec == NULL)
szComSpec = "cmd.exe";
strcpy(szCmdLine, " /C ");
strncat(szCmdLine, command, MAX_PATH-5);
//check for a too long argument E2BIG
//command file has invalid format ENOEXEC
StartupInfo.cb = sizeof(STARTUPINFOA);
StartupInfo.lpReserved= NULL;
StartupInfo.dwFlags = 0;
StartupInfo.wShowWindow = SW_SHOWDEFAULT;
StartupInfo.lpReserved2 = NULL;
StartupInfo.cbReserved2 = 0;
// According to ansi standards the new process should ignore SIGINT and SIGQUIT
// In order to disable ctr-c the process is created with CREATE_NEW_PROCESS_GROUP,
// thus SetConsoleCtrlHandler(NULL,TRUE) is made on behalf of the new process.
//SIGCHILD should be blocked aswell
if (CreateProcessA(szComSpec,szCmdLine,NULL,NULL,TRUE,CREATE_NEW_PROCESS_GROUP,NULL,NULL,&StartupInfo,&ProcessInformation) == FALSE)
{
return -1;
}
// system should wait untill the calling process is finished
_cwait(&nStatus,(int)ProcessInformation.hProcess,0);
// free the comspec [ if the COMSPEC == NULL provision is removed
// free(szComSpec);
return nStatus;
}

View file

@ -0,0 +1,18 @@
#include <msvcrt/search.h>
#include <msvcrt/stdlib.h>
void *_lfind(const void *key, const void *base, size_t *nelp,
size_t width, int (*compar)(const void *, const void *))
{
char *char_base = (char *)base;
int i;
for (i=0;i<*nelp;i++)
{
if (compar(key,char_base) == 0)
return char_base;
char_base += width;
}
return NULL;
}

View file

@ -0,0 +1,16 @@
#include <msvcrt/search.h>
#include <msvcrt/stdlib.h>
#include <msvcrt/string.h>
void *_lsearch(const void *key, void *base, size_t *nelp, size_t width,
int (*compar)(const void *, const void *))
{
void *ret_find = _lfind(key,base,nelp,width,compar);
if (ret_find != NULL)
return ret_find;
memcpy(base + (*nelp*width), key, width);
(*nelp)++;
return base;
}

View file

@ -0,0 +1,137 @@
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
/* modified by Boudewijn Dekker */
/* ms uses a smaller jmp_buf structure */
/* might do a realloc in setjmp */
typedef struct {
unsigned int __eax, __ebx, __ecx, __edx, __esi;
unsigned int __edi, __ebp, __esp, __eip, __eflags;
unsigned short __cs, __ds, __es, __fs, __gs, __ss;
unsigned long __sigmask; /* for POSIX signals only */
unsigned long __signum; /* for expansion */
unsigned long __exception_ptr; /* pointer to previous exception */
unsigned char __fpu_state[108]; /* for future use */
} jmp_buf[1];
/* jumps back to position specified in jmp_buf */
int longjmp( jmp_buf env, int value )
{
//push ebp generated by the compiler
//mov ebp, esp
__asm__ __volatile__ (
"movl 8(%ebp),%edi\n\t" /* get jmp_buf */
"movl 12(%ebp),%eax\n\t" /* store retval in j->eax */
"movl %eax,0(%edi)\n\t"
"movw 46(%edi),%fs\n\t"
"movw 48(%edi),%gs\n\t"
"movl 4(%edi),%ebx\n\t"
"movl 8(%edi),%ecx\n\t"
"movl 12(%edi),%edx\n\t"
"movl 24(%edi),%ebp\n\t"
/* Now for some uglyness. The jmp_buf structure may be ABOVE the
point on the new SS:ESP we are moving to. We don't allow overlap,
but do force that it always be valid. We will use ES:ESI for
our new stack before swapping to it. */
"movw 50(%edi),%es\n\t"
"movl 28(%edi),%esi\n\t"
"subl $28,%esi\n\t" /* We need 7 working longwords on stack */
"movl 60(%edi),%eax\n\t"
"es\n\t"
"movl %eax,(%esi)\n\t" /* Exception pointer */
"movzwl 42(%edi),%eax\n\t"
"es\n\t"
"movl %eax,4(%esi)\n\t" /* DS */
"movl 20(%edi),%eax\n\t"
"es\n\t"
"movl %eax,8(%esi)\n\t" /* EDI */
"movl 16(%edi),%eax\n\t"
"es\n\t"
"movl %eax,12(%esi)\n\t" /* ESI */
"movl 32(%edi),%eax\n\t"
"es\n\t"
"movl %eax,16(%esi)\n\t" /* EIP - start of IRET frame */
"movl 40(%edi),%eax\n\t"
"es\n\t"
"movl %eax,20(%esi)\n\t" /* CS */
"movl 36(%edi),%eax\n\t"
"es\n\t"
"movl %eax,24(%esi)\n\t" /* EFLAGS */
"movl 0(%edi),%eax\n\t"
"movw 44(%edi),%es\n\t"
"movw 50(%edi),%ss\n\t"
"movl %esi,%esp\n\t"
//"popl ___djgpp_exception_state_ptr\n\t"
"popl %edi\n\t" // dummy popl instead of djgpp_exception_state_ptr
"popl %ds\n\t"
"popl %edi\n\t"
"popl %esi\n\t"
"iret\n\t" /* actually jump to new cs:eip loading flags */
);
return value; // dummy return never reached
}
int _setjmp( jmp_buf env )
{
//push ebp generated by the compiler
//mov ebp, esp
__asm__ __volatile__ (
"pushl %edi\n\t"
"movl 8(%ebp),%edi\n\t"
"movl %eax, (%edi)\n\t"
"movl %ebx,4(%edi)\n\t"
"movl %ecx,8(%edi)\n\t"
"movl %edx,12(%edi)\n\t"
"movl %esi,16(%edi)\n\t"
"movl -4(%ebp),%eax\n\t"
"movl %eax,20(%edi)\n\t"
"movl (%ebp),%eax\n\t"
"movl %eax,24(%edi)\n\t"
"movl %esp,%eax\n\t"
"addl $12,%eax\n\t"
"movl %eax,28(%edi)\n\t"
"movl 4(%ebp),%eax\n\t"
"movl %eax,32(%edi)\n\t"
"pushfl\n\t"
"popl 36(%edi)\n\t"
"movw %cs, 40(%edi)\n\t"
"movw %ds, 42(%edi)\n\t"
"movw %es, 44(%edi)\n\t"
"movw %fs, 46(%edi)\n\t"
"movw %gs, 48(%edi)\n\t"
"movw %ss, 50(%edi)\n\t"
//movl ___djgpp_exception_state_ptr, %eax
//movl %eax, 60(%edi)
"popl %edi\n\t"
);
return 0;
}

View file

@ -84,8 +84,8 @@ static char sccsid[] = "@(#)ctime.c 5.23 (Berkeley) 6/22/90";
** manual page of what this "time zone abbreviation" means (doing this so
** that tzname[0] has the "normal" length of three characters).
*/
int _daylight_dll;
int _timezone_dll;
int _daylight;
int _timezone;
static char WILDABBR[] = " ";