--- /dev/null
+/*
+ * 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
+
--- /dev/null
+
+#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
\ No newline at end of file
-# $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
#
io/utime.o \
io/write.o
+OBJECTS_LOCALE = \
+ locale/locale.o
+
OBJECTS_MATH = \
math/acos.o \
math/adjust.o \
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 \
stdio/vsprintf.o \
stdio/vsscanf.o
-#incomplete
OBJECTS_STDLIB = \
stdlib/_exit.o \
stdlib/abort.o \
$(OBJECTS_EXCEPT) \
$(OBJECTS_FLOAT) \
$(OBJECTS_IO) \
+ $(OBJECTS_LOCALE) \
$(OBJECTS_MATH) \
$(OBJECTS_MISC) \
$(OBJECTS_PROCESS) \
+ $(OBJECTS_SEARCH) \
+ $(OBJECTS_SETJMP) \
$(OBJECTS_SIGNAL) \
$(OBJECTS_STDIO) \
$(OBJECTS_STDLIB) \
except\*.o \
float\*.o \
io\*.o \
+ locale\*.o \
math\*.o \
misc\*.o \
process\*.o \
+ search\*.o \
+ setjmp\*.o \
signal\*.o \
stdio\*.o \
stdlib\*.o \
except/*.o \
float/*.o \
io/*.o \
+ locale/*.o \
math/*.o \
misc/*.o \
process/*.o \
+ search/*.o \
+ setjmp/*.o \
signal/*.o \
stdio/*.o \
stdlib/*.o \
--- /dev/null
+#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;
+}
-/* $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
*/
int __app_type = 0; //_UNKNOWN_APP; /* application type */
+int __mb_cur_max = 1;
+
static int envAlloced = 0;
return &__initenv;
}
+int *__p___mb_cur_max(void)
+{
+ return &__mb_cur_max;
+}
+
unsigned int *__p__osver(void)
{
return &_osver;
-; $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
;
; __RTDynamicCast
; __RTtypeid
; __STRINGTOLD
-__argc
-__argv
+__argc DATA
+__argv DATA
; __badioinfo
; __crtCompareStringA
; __crtGetLocaleInfoW
; __doserrno
__fpecode
__getmainargs
-; __initenv
+__initenv DATA
__isascii
__iscsym
__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
_creat
_cscanf
_ctype DATA
-; _cwait
-; _daylight
+_cwait
+_daylight DATA
; _dstbias
_dup
_dup2
_fgetchar
_fgetwchar
_filbuf
-; _fileinfo
+; _fileinfo DATA
_filelength
_filelengthi64
_fileno
_j1
_jn
_kbhit
-; _lfind
+_lfind
_loaddll
_local_unwind2
; _lock
; _longjmpex
_lrotl
_lrotr
-; _lsearch
+_lsearch
_lseek
_lseeki64
_ltoa
; _set_error_mode
; _set_sbh_threshold
_seterrormode
-; _setjmp
+_setjmp
; _setjmp3
; _setmaxstdio
; _setmbcp
_tell
_telli64
_tempnam
-; _timezone
+_timezone DATA
_tolower
_toupper
-; _tzname
+_tzname DATA
_tzset
_ui64toa
_ui64tow
labs
ldexp
ldiv
-; localeconv
+localeconv
localtime
log
log10
-; longjmp
+longjmp
malloc
; mblen
; mbstowcs
rewind
scanf
setbuf
-; setlocale
+setlocale
setvbuf
signal
sin
strxfrm
swprintf
swscanf
-; system
+system
tan
tanh
time
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
\ No newline at end of file
--- /dev/null
+/* 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;
+}
** 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[] = " ";