phobos 0.76

This commit is contained in:
Brad Roberts 2007-09-10 03:11:55 +00:00
parent fa1bc52ba2
commit 35a12fec2f
51 changed files with 761 additions and 183 deletions

View file

@ -29,6 +29,7 @@ version = MULTI_THREADED; // produce multithreaded version
debug (PRINTF) import std.c.stdio;
import std.c.stdio;
import std.c.stdlib;
import gcbits;
import std.outofmemory;
@ -814,7 +815,7 @@ struct Gcx
}
if (i + 1 < npools)
{
assert(pool.cmp(pooltable[i + 1]) < 0);
assert(pool.opCmp(pooltable[i + 1]) < 0);
}
else if (i + 1 == npools)
{
@ -1177,7 +1178,7 @@ struct Gcx
// Sort pool into newpooltable[]
for (i = 0; i < npools; i++)
{
if (pool.cmp(newpooltable[i]) < 0)
if (pool.opCmp(newpooltable[i]) < 0)
break;
}
memmove(newpooltable + i + 1, newpooltable + i, (npools - i) * (Pool *).size);
@ -1978,7 +1979,7 @@ struct Pool
* Used for sorting pooltable[]
*/
int cmp(Pool *p2)
int opCmp(Pool *p2)
{
return baseAddr - p2.baseAddr;
}

View file

@ -13,7 +13,7 @@ extern (C):
int _d_obj_eq(Object o1, Object o2)
{
return o1 === o2 || (o1 && o1.eq(o2));
return o1 === o2 || (o1 && o1.opEquals(o2));
}
@ -23,6 +23,6 @@ int _d_obj_eq(Object o1, Object o2)
int _d_obj_cmp(Object o1, Object o2)
{
return o1.cmp(o2);
return o1.opCmp(o2);
}

122
linux.mak
View file

@ -11,6 +11,7 @@
CFLAGS=-O
#CFLAGS=-g
DFLAGS=-O -release
#DFLAGS=-unittest
@ -44,15 +45,16 @@ unittest : unittest.o libphobos.a
unittest.o : unittest.d
$(DMD) -c unittest
OBJS= assert.o deh2.o switch.o complex.o gcstats.o \
OBJS= asserterror.o deh2.o switch.o complex.o gcstats.o \
critical.o object.o monitor.o arraycat.o invariant.o \
dmain2.o outofmemory.o aaA.o adi.o file.o \
compiler.o system.o moduleinit.o \
cast.o syserror.o path.o string.o memset.o math.o \
cast.o path.o string.o memset.o math.o \
outbuffer.o ctype.o regexp.o random.o linux.o \
stream.o switcherr.o array.o gc.o \
qsort.o thread.o obj.o utf.o uri.o \
crc32.o conv.o arraycast.o errno.o alloca.o cmath2.o \
process.o syserror.o \
ti_wchar.o ti_uint.o ti_short.o ti_ushort.o \
ti_byte.o ti_ubyte.o ti_long.o ti_ulong.o ti_ptr.o \
ti_float.o ti_double.o ti_real.o ti_delegate.o \
@ -61,12 +63,23 @@ OBJS= assert.o deh2.o switch.o complex.o gcstats.o \
ti_Aa.o ti_AC.o ti_Ag.o ti_Aubyte.o ti_Aushort.o ti_Ashort.o \
ti_C.o ti_int.o ti_char.o ti_dchar.o ti_Adchar.o \
ti_Aint.o ti_Auint.o ti_Along.o ti_Aulong.o ti_Awchar.o \
date.o dateparse.o llmath.o math2.o
date.o dateparse.o llmath.o math2.o Czlib.o Dzlib.o zip.o
ZLIBOBJS= etc/c/zlib/adler32.o etc/c/zlib/compress.o \
etc/c/zlib/crc32.o etc/c/zlib/gzio.o \
etc/c/zlib/uncompr.o etc/c/zlib/deflate.o \
etc/c/zlib/trees.o etc/c/zlib/zutil.o \
etc/c/zlib/inflate.o etc/c/zlib/infblock.o \
etc/c/zlib/inftrees.o etc/c/zlib/infcodes.o \
etc/c/zlib/infutil.o etc/c/zlib/inffast.o
GCOBJS= internal/gc/gc.o internal/gc/gcx.o \
internal/gc/gcbits.o internal/gc/gclinux.o
#SRC= mars.h switch.d complex.c critical.c minit.asm \
# deh.c object.d gc.d math.d c/stdio.d c/stdlib.d time.d monitor.c \
# arraycat.d string.d windows.d path.d linuxextern.d \
# invariant.d assert.d regexp.d dmain2.d dateparse.d \
# invariant.d asserterror.d regexp.d dmain2.d dateparse.d \
# outofmemory.d syserror.d utf.d uri.d \
# ctype.d aaA.d adi.d file.d compiler.d system.d \
# moduleinit.d cast.d math.d qsort.d \
@ -91,9 +104,9 @@ SRCSTD= std/zlib.d std/zip.d std/stdint.d std/conv.d std/utf.d std/uri.d \
std/gc.d std/math.d std/string.d std/path.d std/date.d \
std/ctype.d std/file.d std/compiler.d std/system.d std/moduleinit.d \
std/outbuffer.d std/math2.d std/thread.d \
std/assert.d std/dateparse.d std/outofmemory.d \
std/intrinsic.d std/array.d std/switcherr.d \
std/regexp.d std/random.d std/stream.d
std/asserterror.d std/dateparse.d std/outofmemory.d \
std/intrinsic.d std/array.d std/switcherr.d std/syserror.d \
std/regexp.d std/random.d std/stream.d std/process.d
SRCSTDC= std/c/process.d std/c/stdlib.d std/c/time.d std/c/stdio.d
@ -125,7 +138,7 @@ SRCINT= \
internal/dmain2.d internal/cast.d internal/qsort.d internal/deh2.d \
internal/cmath2.d internal/obj.d internal/mars.h
SRCSTDWIN= std/windows/registry.d std/windows/syserror.d \
SRCSTDWIN= std/windows/registry.d \
std/windows/iunknown.d
SRCSTDCWIN= std/c/windows/windows.d std/c/windows/com.d
@ -134,44 +147,44 @@ SRCSTDCLINUX= std/c/linux/linux.d std/c/linux/linuxextern.d
SRCETC= etc/c/zlib.d
SRCZLIB= etc/c/zlib\algorithm.txt \
etc/c/zlib\trees.h \
etc/c/zlib\inffixed.h \
etc/c/zlib\INDEX \
etc/c/zlib\zconf.h \
etc/c/zlib\compress.c \
etc/c/zlib\adler32.c \
etc/c/zlib\uncompr.c \
etc/c/zlib\deflate.h \
etc/c/zlib\example.c \
etc/c/zlib\zutil.c \
etc/c/zlib\gzio.c \
etc/c/zlib\crc32.c \
etc/c/zlib\infblock.c \
etc/c/zlib\infblock.h \
etc/c/zlib\infcodes.c \
etc/c/zlib\infcodes.h \
etc/c/zlib\inffast.c \
etc/c/zlib\inffast.h \
etc/c/zlib\zutil.h \
etc/c/zlib\inflate.c \
etc/c/zlib\trees.c \
etc/c/zlib\inftrees.h \
etc/c/zlib\infutil.c \
etc/c/zlib\infutil.h \
etc/c/zlib\minigzip.c \
etc/c/zlib\inftrees.c \
etc/c/zlib\zlib.html \
etc/c/zlib\maketree.c \
etc/c/zlib\zlib.h \
etc/c/zlib\zlib.3 \
etc/c/zlib\FAQ \
etc/c/zlib\deflate.c \
etc/c/zlib\ChangeLog \
etc/c/zlib\win32.mak \
etc/c/zlib\linux.mak \
etc/c/zlib\zlib.lib \
etc/c/zlib\README
SRCZLIB= etc/c/zlib/algorithm.txt \
etc/c/zlib/trees.h \
etc/c/zlib/inffixed.h \
etc/c/zlib/INDEX \
etc/c/zlib/zconf.h \
etc/c/zlib/compress.c \
etc/c/zlib/adler32.c \
etc/c/zlib/uncompr.c \
etc/c/zlib/deflate.h \
etc/c/zlib/example.c \
etc/c/zlib/zutil.c \
etc/c/zlib/gzio.c \
etc/c/zlib/crc32.c \
etc/c/zlib/infblock.c \
etc/c/zlib/infblock.h \
etc/c/zlib/infcodes.c \
etc/c/zlib/infcodes.h \
etc/c/zlib/inffast.c \
etc/c/zlib/inffast.h \
etc/c/zlib/zutil.h \
etc/c/zlib/inflate.c \
etc/c/zlib/trees.c \
etc/c/zlib/inftrees.h \
etc/c/zlib/infutil.c \
etc/c/zlib/infutil.h \
etc/c/zlib/minigzip.c \
etc/c/zlib/inftrees.c \
etc/c/zlib/zlib.html \
etc/c/zlib/maketree.c \
etc/c/zlib/zlib.h \
etc/c/zlib/zlib.3 \
etc/c/zlib/FAQ \
etc/c/zlib/deflate.c \
etc/c/zlib/ChangeLog \
etc/c/zlib/win32.mak \
etc/c/zlib/linux.mak \
etc/c/zlib/zlib.lib \
etc/c/zlib/README
SRCGC= internal/gc/gc.d \
internal/gc/gcx.d \
@ -187,8 +200,7 @@ ALLSRCS = $(SRC) $(SRCSTD) $(SRCSTDC) $(SRCTI) $(SRCINT) $(SRCSTDWIN) \
libphobos.a : $(OBJS) internal/gc/dmgc.a linux.mak
ar -r $@ $(OBJS) internal/gc/gc.o internal/gc/gcx.o \
internal/gc/gcbits.o internal/gc/gclinux.o
ar -r $@ $(OBJS) $(ZLIBOBJS) $(GCOBJS)
###########################################################
@ -267,8 +279,8 @@ switch.o : internal/switch.d
array.o : std/array.d
$(DMD) -c $(DFLAGS) std/array.d
assert.o : std/assert.d
$(DMD) -c $(DFLAGS) std/assert.d
asserterror.o : std/asserterror.d
$(DMD) -c $(DFLAGS) std/asserterror.d
compiler.o : std/compiler.d
$(DMD) -c $(DFLAGS) std/compiler.d
@ -312,6 +324,9 @@ outofmemory.o : std/outofmemory.d
path.o : std/path.d
$(DMD) -c $(DFLAGS) std/path.d
process.o : std/process.d
$(DMD) -c $(DFLAGS) std/process.d
random.o : std/random.d
$(DMD) -c $(DFLAGS) std/random.d
@ -330,6 +345,9 @@ switcherr.o : std/switcherr.d
system.o : std/system.d
$(DMD) -c $(DFLAGS) std/system.d
syserror.o : std/syserror.d
$(DMD) -c $(DFLAGS) std/syserror.d
thread.o : std/thread.d
$(DMD) -c $(DFLAGS) std/thread.d
@ -465,9 +483,9 @@ ti_int.o : std/typeinfo/ti_int.d
##########################################################333
zip : $(ALLSRCS)
zip : $(ALLSRCS) linux.mak win32.mak
rm phobos.zip
zip phobos $(ALLSRCS)
zip phobos $(ALLSRCS) linux.mak win32.mak
clean:
rm $(OBJS)

View file

@ -21,12 +21,12 @@ class Object
return (uint)(void *)this;
}
int cmp(Object o)
int opCmp(Object o)
{
return (int)(void *)this - (int)(void *)o;
}
int eq(Object o)
int opEquals(Object o)
{
return this === o;
}

View file

@ -1,6 +1,7 @@
import object;
import std.c.stdio;
module std.array;
private import std.c.stdio;
class ArrayBoundsError : Error
{

View file

@ -1,8 +1,7 @@
import object;
import std.c.stdio;
module std.assertexception;
class Assert : Object
class AssertError : Object
{
private:
@ -18,26 +17,26 @@ class Assert : Object
public:
/***************************************
* If nobody catches the Assert, this winds up
* If nobody catches the AssertError, this winds up
* getting called by the startup code.
*/
void print()
{
printf("Assertion Failure %s(%u)\n", (char *)filename, linnum);
printf("AssertErrorion Failure %s(%u)\n", (char *)filename, linnum);
}
}
/********************************************
* Called by the compiler generated module assert function.
* Builds an Assert exception and throws it.
* Builds an AssertError exception and throws it.
*/
extern (C) static void _d_assert(char[] filename, uint line)
{
//printf("_d_assert(%s, %d)\n", (char *)filename, line);
Assert a = new Assert(filename, line);
AssertError a = new AssertError(filename, line);
//printf("assertion %p created\n", a);
throw a;
}

View file

@ -52,7 +52,7 @@ enum
O_APPEND = 02000,
}
struct stat
struct struct_stat // distinguish it from the stat() function
{
ulong st_dev;
ushort __pad1;
@ -78,9 +78,21 @@ struct stat
unittest
{
assert(stat.size == 88);
assert(struct_stat.size == 88);
}
enum : int
{
S_IFIFO = 0010000,
S_IFCHR = 0020000,
S_IFDIR = 0040000,
S_IFBLK = 0060000,
S_IFREG = 0100000,
S_IFLNK = 0120000,
S_IFSOCK = 0140000,
S_IFMT = 0170000
}
extern (C)
{
@ -89,8 +101,13 @@ extern (C)
int write(int, void*, int);
int close(int);
int lseek(int, int, int);
int fstat(int, stat*);
int fstat(int, struct_stat*);
int stat(char*, struct_stat*);
int getErrno();
int chdir(char*);
int mkdir(char*, int);
int rmdir(char*);
char* getcwd(char*, int);
}
struct timeval

View file

@ -7,6 +7,8 @@
* Put them separate so they'll be externed - do not link in linuxextern.o
*/
module std.c.linux.linuxextern;
extern (C)
{
void* __libc_stack_end;

View file

@ -2,6 +2,8 @@
/* Interface to the C header file process.h
*/
module std.c.process;
extern (C):
void exit(int);

View file

@ -1,4 +1,6 @@
module std.c.time;
extern (C):
const uint CLOCKS_PER_SEC = 1000;

View file

@ -1,6 +1,8 @@
import std.c.windows.windows;
import std.string;
module std.c.windows.com;
private import std.c.windows.windows;
private import std.string;
alias WCHAR OLECHAR;
alias OLECHAR *LPOLESTR;

View file

@ -1,4 +1,6 @@
module std.c.windows.windows;
extern (Windows)
{
alias uint ULONG;
@ -22,7 +24,7 @@ extern (Windows)
alias LPSTR PTSTR, LPTSTR;
alias LPCSTR LPCTSTR;
alias WCHAR* LPCWSTR, PCWSTR;
alias WCHAR* LPWSTR, LPCWSTR, PCWSTR;
alias uint DWORD;
alias int BOOL;
@ -262,8 +264,32 @@ struct WIN32_FIND_DATA {
char cAlternateFileName[ 14 ];
}
struct WIN32_FIND_DATAW {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
WCHAR cFileName[ 260 ];
WCHAR cAlternateFileName[ 14 ];
}
export
{
BOOL SetCurrentDirectoryA(LPCSTR lpPathName);
BOOL SetCurrentDirectoryW(LPCWSTR lpPathName);
DWORD GetCurrentDirectoryA(DWORD nBufferLength, LPSTR lpBuffer);
DWORD GetCurrentDirectoryW(DWORD nBufferLength, LPWSTR lpBuffer);
BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
BOOL CreateDirectoryExA(LPCSTR lpTemplateDirectory, LPCSTR lpNewDirectory, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
BOOL CreateDirectoryExW(LPCWSTR lpTemplateDirectory, LPCWSTR lpNewDirectory, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
BOOL RemoveDirectoryA(LPCSTR lpPathName);
BOOL RemoveDirectoryW(LPCWSTR lpPathName);
BOOL CloseHandle(HANDLE hObject);
HANDLE CreateFileA(char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
SECURITY_ATTRIBUTES *lpSecurityAttributes, DWORD dwCreationDisposition,

View file

@ -1,7 +1,7 @@
// Identify the compiler used and its various features.
module std.compiler;
const
{

View file

@ -1,13 +1,14 @@
// conv.d
// Written by Walter Bright
// Copyright (c) 2002 Digital Mars
// Copyright (c) 2002-2003 Digital Mars
// All Rights Reserved
// www.digitalmars.com
// Conversion building blocks. These differ from the C equivalents by
// checking for overflow and not allowing whitespace.
module std.conv;
//debug=conv; // uncomment to turn on debugging printf's

View file

@ -1,11 +1,12 @@
// ctype.d
// Written by Walter Bright
// Copyright (c) 2001 Digital Mars
// Copyright (c) 2001-2003 Digital Mars
// All Rights Reserved
// www.digitalmars.com
// Simple char classification functions
module std.ctype;
int isalnum(char c) { return _ctype[1 + c] & (_ALP|_DIG); }
int isalpha(char c) { return _ctype[1 + c] & (_ALP); }

View file

@ -6,9 +6,12 @@
module std.dateparse;
import std.string;
import std.c.stdlib;
import std.date;
private
{
import std.string;
import std.c.stdlib;
import std.date;
}
//debug=log;

View file

@ -1,17 +1,20 @@
// Copyright (c) 2001-2002 by Digital Mars
// Copyright (c) 2001-2003 by Digital Mars
// All Rights Reserved
// www.digitalmars.com
module std.file;
private import std.c.stdio;
private import std.path;
private import std.string;
/***********************************
*/
class FileError : Error
class FileException : Exception
{
private import std.windows.syserror;
private import std.syserror;
uint errno; // operating system error code
@ -49,7 +52,7 @@ private import std.c.windows.windows;
* array of bytes read
*/
byte[] read(char[] name)
void[] read(char[] name)
{
DWORD size;
DWORD numread;
@ -82,7 +85,7 @@ err2:
err:
delete buf;
err1:
throw new FileError(name, GetLastError());
throw new FileException(name, GetLastError());
}
/*********************************************
@ -91,7 +94,7 @@ err1:
* 0 success
*/
void write(char[] name, byte[] buffer)
void write(char[] name, void[] buffer)
{
HANDLE h;
DWORD numwritten;
@ -114,7 +117,7 @@ void write(char[] name, byte[] buffer)
err2:
CloseHandle(h);
err:
throw new FileError(name, GetLastError());
throw new FileException(name, GetLastError());
}
@ -122,7 +125,7 @@ err:
* Append to a file.
*/
void append(char[] name, byte[] buffer)
void append(char[] name, void[] buffer)
{
HANDLE h;
DWORD numwritten;
@ -147,7 +150,7 @@ void append(char[] name, byte[] buffer)
err2:
CloseHandle(h);
err:
throw new FileError(name, GetLastError());
throw new FileException(name, GetLastError());
}
@ -161,7 +164,7 @@ void rename(char[] from, char[] to)
result = MoveFileA(toStringz(from), toStringz(to));
if (!result)
throw new FileError(to, GetLastError());
throw new FileException(to, GetLastError());
}
@ -175,7 +178,7 @@ void remove(char[] name)
result = DeleteFileA(toStringz(name));
if (!result)
throw new FileError(name, GetLastError());
throw new FileException(name, GetLastError());
}
@ -183,7 +186,7 @@ void remove(char[] name)
* Get file size.
*/
uint getSize(char[] name)
ulong getSize(char[] name)
{
WIN32_FIND_DATA filefindbuf;
HANDLE findhndl;
@ -191,7 +194,7 @@ uint getSize(char[] name)
findhndl = FindFirstFileA(toStringz(name), &filefindbuf);
if (findhndl == (HANDLE)-1)
{
throw new FileError(name, GetLastError());
throw new FileException(name, GetLastError());
}
FindClose(findhndl);
return filefindbuf.nFileSizeLow;
@ -209,7 +212,120 @@ uint getAttributes(char[] name)
result = GetFileAttributesA(toStringz(name));
if (result == 0xFFFFFFFF)
{
throw new FileError(name, GetLastError());
throw new FileException(name, GetLastError());
}
return result;
}
/****************************************************
* Is name a file?
*/
int isfile(char[] name)
{
return (getAttributes(name) & FILE_ATTRIBUTE_DIRECTORY) == 0;
}
/****************************************************
* Is name a directory?
*/
int isdir(char[] name)
{
return (getAttributes(name) & FILE_ATTRIBUTE_DIRECTORY) != 0;
}
/****************************************************
* Change directory.
*/
void chdir(char[] pathname)
{
if (!SetCurrentDirectoryA(toStringz(pathname)))
{
throw new FileException(pathname, GetLastError());
}
}
/****************************************************
* Make directory.
*/
void mkdir(char[] pathname)
{
if (!CreateDirectoryA(toStringz(pathname), null))
{
throw new FileException(pathname, GetLastError());
}
}
/****************************************************
* Remove directory.
*/
void rmdir(char[] pathname)
{
if (!RemoveDirectoryA(toStringz(pathname)))
{
throw new FileException(pathname, GetLastError());
}
}
/****************************************************
* Get current directory.
*/
char[] getcwd()
{
char[] dir;
int length;
char c;
length = GetCurrentDirectoryA(0, &c);
if (!length)
{
throw new FileException("getcwd", GetLastError());
}
dir = new char[length];
length = GetCurrentDirectoryA(length, dir);
if (!length)
{
throw new FileException("getcwd", GetLastError());
}
return dir[0 .. length]; // leave off terminating 0
}
/***************************************************
* Return contents of directory.
*/
char[][] listdir(char[] pathname)
{
char[][] result;
char[] c;
HANDLE h;
WIN32_FIND_DATA fileinfo;
c = std.path.join(pathname, "*.*");
h = FindFirstFileA(toStringz(c), &fileinfo);
if (h != INVALID_HANDLE_VALUE)
{
do
{ int i;
int clength;
// Skip "." and ".."
if (std.string.strcmp(fileinfo.cFileName, ".") == 0 ||
std.string.strcmp(fileinfo.cFileName, "..") == 0)
continue;
i = result.length;
result.length = i + 1;
clength = std.string.strlen(fileinfo.cFileName);
result[i] = new char[clength];
result[i][] = fileinfo.cFileName[0 .. clength];
} while (FindNextFileA(h,&fileinfo) != FALSE);
FindClose(h);
}
return result;
}
@ -229,12 +345,12 @@ private import std.c.linux.linux;
* array of bytes read
*/
byte[] read(char[] name)
void[] read(char[] name)
{
uint size;
uint numread;
int fd;
stat statbuf;
struct_stat statbuf;
byte[] buf;
char *namez;
@ -277,7 +393,7 @@ err:
delete buf;
err1:
throw new FileError(name, getErrno());
throw new FileException(name, getErrno());
}
/*********************************************
@ -286,7 +402,7 @@ err1:
* 0 success
*/
void write(char[] name, byte[] buffer)
void write(char[] name, void[] buffer)
{
int fd;
int numwritten;
@ -309,7 +425,7 @@ void write(char[] name, byte[] buffer)
err2:
std.c.linux.linux.close(fd);
err:
throw new FileError(name, getErrno());
throw new FileException(name, getErrno());
}
@ -317,7 +433,7 @@ err:
* Append to a file.
*/
void append(char[] name, byte[] buffer)
void append(char[] name, void[] buffer)
{
int fd;
int numwritten;
@ -340,7 +456,7 @@ void append(char[] name, byte[] buffer)
err2:
std.c.linux.linux.close(fd);
err:
throw new FileError(name, getErrno());
throw new FileException(name, getErrno());
}
@ -354,7 +470,7 @@ void rename(char[] from, char[] to)
char *toz = toStringz(to);
if (std.c.stdio.rename(fromz, toz) == -1)
throw new FileError(to, getErrno());
throw new FileException(to, getErrno());
}
@ -365,7 +481,7 @@ void rename(char[] from, char[] to)
void remove(char[] name)
{
if (std.c.stdio.remove(toStringz(name)) == -1)
throw new FileError(name, getErrno());
throw new FileException(name, getErrno());
}
@ -373,11 +489,11 @@ void remove(char[] name)
* Get file size.
*/
uint getSize(char[] name)
ulong getSize(char[] name)
{
uint size;
int fd;
stat statbuf;
struct_stat statbuf;
char *namez;
namez = toStringz(name);
@ -409,7 +525,7 @@ err2:
std.c.linux.linux.close(fd);
err:
err1:
throw new FileError(name, getErrno());
throw new FileException(name, getErrno());
}
@ -419,7 +535,100 @@ err1:
uint getAttributes(char[] name)
{
return 0;
struct_stat statbuf;
char *namez;
namez = toStringz(name);
if (std.c.linux.linux.stat(namez, &statbuf))
{
throw new FileException(name, getErrno());
}
return statbuf.st_mode;
}
/****************************************************
* Is name a file?
*/
int isfile(char[] name)
{
return getAttributes(name) & S_IFREG; // regular file
}
/****************************************************
* Is name a directory?
*/
int isdir(char[] name)
{
return getAttributes(name) & S_IFDIR;
}
/****************************************************
* Change directory.
*/
void chdir(char[] pathname)
{
if (std.c.linux.linux.chdir(toStringz(pathname)) == 0)
{
throw new FileException(pathname, getErrno());
}
}
/****************************************************
* Make directory.
*/
void mkdir(char[] pathname)
{
if (std.c.linux.linux.mkdir(toStringz(pathname), 0777) == 0)
{
throw new FileException(pathname, getErrno());
}
}
/****************************************************
* Remove directory.
*/
void rmdir(char[] pathname)
{
if (std.c.linux.linux.rmdir(toStringz(pathname)) == 0)
{
throw new FileException(pathname, getErrno());
}
}
/****************************************************
* Get current directory.
*/
char[] getcwd()
{ char* p;
p = std.c.linux.linux.getcwd(null, 0);
if (!p)
{
throw new FileException("cannot get cwd", getErrno());
}
int length = std.string.strlen(p);
char[] buf = new char[length];
buf[] = p[0 .. length];
std.c.stdlib.free(p);
return buf;
}
/***************************************************
* Return contents of directory.
*/
char[][] listdir(char[] pathname)
{
assert(0); // BUG: not implemented
return null;
}
}

View file

@ -1,8 +1,11 @@
// Copyright (c) 1999-2002 by Digital Mars
// Copyright (c) 1999-2003 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// www.digitalmars.com
module std.gc;
import gcstats;
void addRoot(void *p); // add p to list of roots

View file

@ -8,7 +8,7 @@ module std.math;
//debug=math; // uncomment to turn on debugging printf's
import std.c.stdio;
private import std.c.stdio;
/* Intrinsics */

View file

@ -1,10 +1,15 @@
module std.moduleinit;
//debug = 1;
import object;
import std.c.stdio;
import std.c.stdlib;
import std.string;
private
{
import object;
import std.c.stdio;
import std.c.stdlib;
import std.string;
}
enum
{ MIctorstart = 1, // we've started constructing it

View file

@ -12,9 +12,14 @@
// from OutBuffer.
// To convert an array of bytes back into raw data, use InBuffer.
import std.string;
import std.c.stdio;
import std.c.stdlib;
module std.outbuffer;
private
{
import std.string;
import std.c.stdio;
import std.c.stdlib;
}
class OutBuffer
{

View file

@ -1,5 +1,5 @@
import std.c.stdio;
module std.outofmemory;
class OutOfMemory : Object
{

View file

@ -9,12 +9,7 @@ module std.path;
//debug=path; // uncomment to turn on debugging printf's
debug(path)
{
import std.c.stdio; // for printf()
}
import std.string;
private import std.string;
version(Win32)
{

15
std/process.d Normal file
View file

@ -0,0 +1,15 @@
// Copyright (c) 2003 by Digital Mars
// All Rights Reserved
// www.digitalmars.com
module std.process;
private import std.string;
private import std.c.process;
int system(char[] command)
{
return std.c.process.system(toStringz(command));
}

View file

@ -2,6 +2,7 @@
// random.d
// www.digitalmars.com
module std.random;
// Segments of the code in this file Copyright (c) 1997 by Rick Booth
// From "Inner Loops" by Rick Booth, Addison-Wesley
@ -13,7 +14,7 @@ version (Win32)
version (linux)
{
import std.c.linux.linux;
private import std.c.linux.linux;
}
/* ===================== Random ========================= */
@ -94,7 +95,6 @@ static this()
rand_seed((uint) s, (uint)(s >> 32));
}
//import std.c.stdio;
unittest
{

View file

@ -31,11 +31,14 @@
an error.
*/
module std.regexp;
//debug = regexp; // uncomment to turn on debugging printf's
private
{
import std.c.stdio;
import std.c.stdlib;
import std.string;
import std.ctype;
import std.outbuffer;

View file

@ -1,4 +1,5 @@
module std.stdint;
/* Exact sizes */

View file

@ -18,12 +18,14 @@
// The code is not optimized for speed, that will have to wait
// until the design is solidified.
module std.string;
//debug=string; // uncomment to turn on debugging printf's
debug(string)
{
import std.c.stdio; // for printf()
}
private import std.c.stdio;
private import std.c.stdlib;
private import std.outbuffer;
private import std.utf;
extern (C)
{
@ -48,7 +50,7 @@ extern (C)
/************** Exceptions ****************/
class StringError : Error
class StringException : Exception
{
this(char[] msg)
{
@ -1187,7 +1189,7 @@ body
unittest
{
debug(string) printf("string.replaceSlice.unittest()\n");
debug(string) printf("string.replaceSlice.unittest\n");
char[] string = "hello";
char[] slice = string[2 .. 4];
@ -1462,7 +1464,7 @@ char[] toString(uint u)
unittest
{
debug(string) printf("string.toString.unittest\n");
debug(string) printf("string.toString(uint).unittest\n");
char[] r;
int i;
@ -1491,7 +1493,7 @@ char[] toString(char *s)
unittest
{
debug(string) printf("string.toString.unittest\n");
debug(string) printf("string.toString(char*).unittest\n");
char[] r;
int i;
@ -1506,3 +1508,100 @@ unittest
}
/*****************************************************
*/
char[] format(char[] fmt, ...)
{
OutBuffer b = new OutBuffer();
va_list ap;
ap = cast(va_list)&fmt;
ap += fmt.size;
b.reserve(fmt.length);
int fmtlength = fmt.length;
char[] s;
for (int i = 0; i < fmtlength; i++)
{
char c = fmt[i];
if (c != '%')
{ b.write(c);
continue;
}
i++;
if (i == fmtlength)
{ b.write(c);
continue;
}
c = fmt[i];
switch (c)
{
case '%':
b.write(c);
break;
case 'c':
{ dchar dc;
dc = *cast(dchar*)ap;
ap += dc.size;
if (dc <= 0x7F)
b.write(cast(char)dc);
else
{ char[] s;
if (!isValidDchar(dc))
throw new StringException("invalid dchar value");
std.utf.encode(s, dc);
b.write(cast(ubyte[])s);
}
break;
}
case 's':
s = *cast(char[]*)ap;
ap += s.size;
b.write(cast(ubyte[])s);
break;
default:
throw new StringException("invalid format");
break;
}
}
return cast(char[])b.toBytes();
}
unittest
{
debug(string) printf("std.string.format.unittest\n");
char[] r;
int i;
r = format(null);
i = cmp(r, "");
assert(i == 0);
r = format("foo");
i = cmp(r, "foo");
assert(i == 0);
r = format("foo%%");
i = cmp(r, "foo%");
assert(i == 0);
r = format("foo%c", 'C');
i = cmp(r, "fooC");
assert(i == 0);
r = format("%s foo", "bar");
i = cmp(r, "bar foo");
assert(i == 0);
r = format("%s foo %s", "bar", "abc");
i = cmp(r, "bar foo abc");
assert(i == 0);
}

View file

@ -1,6 +1,5 @@
import object;
import std.c.stdio;
module std.switcherr;
class SwitchError : Object
{

View file

@ -3,6 +3,8 @@
// www.digitalmars.com
// Convert Win32 error code to string
module std.syserror;
class SysError
{
private import std.c.stdio;

View file

@ -1,6 +1,8 @@
// Information about the target operating system, environment, and CPU
module std.system;
const
{

View file

@ -3,6 +3,8 @@
// written by Walter Bright
// www.digitalmars.com
module std.thread;
//debug=thread;
/* ================================ Win32 ================================= */
@ -10,7 +12,7 @@
version (Win32)
{
import std.c.windows.windows;
private import std.c.windows.windows;
extern (Windows) alias uint (*stdfp)(void *);

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// Object[]
@ -25,9 +25,9 @@ class TypeInfo_AC : TypeInfo
{
for (uint u = 0; u < s1.length; u++)
{
// Do not pass null's to Object.eq()
// Do not pass null's to Object.opEquals()
if (s1[u] === s2[u] ||
(s1[u] !== null && s2[u] !== null && s1[u].eq(s2[u])))
(s1[u] !== null && s2[u] !== null && s1[u].opEquals(s2[u])))
continue;
return 0;
}
@ -59,7 +59,7 @@ class TypeInfo_AC : TypeInfo
{ c = 1;
break;
}
c = o1.cmp(o2);
c = o1.opCmp(o2);
if (c)
break;
}

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// char[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// dchar[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// byte[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// int[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// long[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// short[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// ubyte[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// uint[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// ulong[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// ushort[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// wchar[]

View file

@ -1,5 +1,5 @@
import std.string;
private import std.string;
// Object
@ -17,7 +17,7 @@ class TypeInfo_C : TypeInfo
Object o1 = *(Object*)p1;
Object o2 = *(Object*)p2;
return o1 == o2 || (o1 && o1.cmp(o2) == 0);
return o1 == o2 || (o1 && o1.opCmp(o2) == 0);
}
int compare(void *p1, void *p2)
@ -33,7 +33,7 @@ class TypeInfo_C : TypeInfo
{ if (!o2)
c = 1;
else
c = o1.cmp(o2);
c = o1.opCmp(o2);
}
else
c = -1;

View file

@ -1,4 +1,7 @@
module std.uri;
//debug=uri; // uncomment to turn on debugging printf's
/* ====================== URI Functions ================ */

View file

@ -7,6 +7,8 @@
// Description of UTF-8 at:
// http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
module std.utf;
//debug=utf; // uncomment to turn on debugging printf's
class UtfError : Error

View file

@ -1,7 +1,7 @@
module std.windows.iunknown;
import std.c.windows.windows;
private import std.c.windows.windows;
alias int HRESULT;

View file

@ -4,7 +4,7 @@
* Purpose: Win32 Registry manipulation
*
* Created 15th March 2003
* Updated: 6th November 2003
* Updated: 18th October 2003
*
* Author: Matthew Wilson
*
@ -58,8 +58,8 @@
/** \file std/windows/registry.d This file contains
* the \c std.windows.registry.* classes
/** \file D/win32/registry.d This file contains
* the \c D.win32.registry.* classes
*/
/* ////////////////////////////////////////////////////////////////////////// */
@ -70,10 +70,6 @@ module std.windows.registry;
* Imports
*/
import std.windows.error_codes;
import std.windows.exceptions;
import std.windows.types;
//import synsoft.types;
/+ + These are borrowed from synsoft.types, until such time as something similar is in Phobos ++
+/
@ -111,6 +107,165 @@ public enum Endian
+/
//import synsoft.win32.types;
/+ + These are borrowed from synsoft.win32.types for the moment, but will not be
+ needed once I've convinced Walter to use strong typedefs for things like HKEY +
+/
public typedef uint Reserved;
public typedef void *HKEY;
public alias HKEY *PHKEY;
public alias char *LPCSTR;
public alias int LONG;
public alias uint DWORD;
public alias DWORD *LPDWORD;
public alias void *LPSECURITY_ATTRIBUTES;
public alias char *LPSTR;
public alias char *LPCSTR;
public alias void *LPCVOID;
public struct FILETIME
{
DWORD dwLowDateTime;
DWORD dwHighDateTime;
};
/+
+/
//import synsoft.win32.error_codes;
/+ +++++++ These are in here for now, but will be in windows.d very soon +++++++
+/
public const LONG ERROR_SUCCESS = 0;
public const LONG ERROR_ACCESS_DENIED = 5;
public const LONG ERROR_MORE_DATA = 234;
public const LONG ERROR_NO_MORE_ITEMS = 259;
/+
+/
//import synsoft.win32.exception;
/+ +++ This is in here, until the Phobos exception hierarchy is implemented ++++
+/
class Win32Exception
: Exception
{
/// \name Construction
//@{
public:
/// \brief Creates an instance of the exception
///
/// \param message The message associated with the exception
this(char[] message)
{
this(message, GetLastError());
}
/// \brief Creates an instance of the exception, with the given
///
/// \param message The message associated with the exception
/// \param error The Win32 error number associated with the exception
this(char[] message, int error)
{
char sz[24]; // Enough for the three " ()" characters and a 64-bit integer value
int cch = wsprintfA(sz, " (%d)", error);
m_message = message;
m_error = error;
super(message ~ sz[0 .. cch]);
}
//@}
/// \name Attributes
//@{
public:
/// Returns the message string associated with the exception
char[] Message()
{
return m_message;
}
/// Returns the Win32 error code associated with the exception
int Error()
{
return m_error;
}
/// Converts the error code into a string
///
/// \note Not yet implemented
char[] LookupError(char[] moduleName)
{
return null;
}
//@}
/// \name Members
//@{
private:
char[] m_message;
int m_error;
//@}
}
unittest
{
// (i) Test that we can throw and catch one by its own type
try
{
char[] message = "Test 1";
int code = 3;
char[] string = "Test 1 (3)";
try
{
throw new Win32Exception(message, code);
}
catch(Win32Exception x)
{
assert(x.Error == code);
if(message != x.Message)
{
printf( "UnitTest failure for Win32Exception:\n"
" x.message [%d;\"%.*s\"] does not equal [%d;\"%.*s\"]\n"
, x.Message.length, x.Message
, message.length, message);
}
assert(message == x.Message);
}
}
catch(Exception /* x */)
{
int code_flow_should_never_reach_here = 0;
assert(code_flow_should_never_reach_here);
}
// (ii) Catch that can throw and be caught by Exception
{
char[] message = "Test 2";
int code = 3;
char[] string = "Test 2 (3)";
try
{
throw new Win32Exception(message, code);
}
catch(Exception x)
{
if(string != x.toString())
{
printf( "UnitTest failure for Win32Exception:\n"
" x.toString() [%d;\"%.*s\"] does not equal [%d;\"%.*s\"]\n"
, x.toString().length, x.toString()
, string.length, string);
}
assert(string == x.toString());
}
}
}
/+
+/
//import synsoft.text.token;
/+ ++++++ This is borrowed from synsoft.text.token, until such time as something
+ similar is in Phobos ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@ -192,12 +347,12 @@ char[][] tokenise(char[] source, char delimiter, boolean bElideBlanks, boolean b
+/
import std.string;
private import std.string;
/* ////////////////////////////////////////////////////////////////////////// */
/// \defgroup group_std_windows_reg std.windows.registry
/// \ingroup group_std_windows
/// \defgroup group_D_win32_reg D.win32.registry
/// \ingroup group_D_win32
/// \brief This library provides Win32 Registry facilities
/* /////////////////////////////////////////////////////////////////////////////
@ -893,7 +1048,7 @@ body
////////////////////////////////////////////////////////////////////////////////
// RegistryException
/// Exception class thrown by the std.windows.registry classes
/// Exception class thrown by the D.win32.registry classes
///
/// \ingroup group_D_win32_reg

View file

@ -5,7 +5,7 @@
module std.zlib;
debug=zlib; // uncomment to turn on debugging printf's
//debug=zlib; // uncomment to turn on debugging printf's
private import etc.c.zlib;

View file

@ -15,8 +15,8 @@
CP=cp
CFLAGS=-g -mn -6 -r
DFLAGS=-O -release
#DFLAGS=-unittest -g
#DFLAGS=-O -release
DFLAGS=-unittest -g
CC=sc
#DMD=\dmd\bin\dmd
@ -51,7 +51,7 @@ unittest.exe : unittest.d phobos.lib
$(DMD) unittest -g
sc unittest.obj -g
OBJS= assert.obj deh.obj switch.obj complex.obj gcstats.obj \
OBJS= asserterror.obj deh.obj switch.obj complex.obj gcstats.obj \
critical.obj object.obj monitor.obj arraycat.obj invariant.obj \
dmain2.obj outofmemory.obj aaA.obj adi.obj file.obj \
compiler.obj system.obj moduleinit.obj \
@ -60,7 +60,7 @@ OBJS= assert.obj deh.obj switch.obj complex.obj gcstats.obj \
stream.obj switcherr.obj com.obj array.obj gc.obj \
qsort.obj math2.obj date.obj dateparse.obj thread.obj obj.obj \
iunknown.obj crc32.obj conv.obj arraycast.obj utf.obj uri.obj \
registry.obj Czlib.obj Dzlib.obj zip.obj \
Czlib.obj Dzlib.obj zip.obj process.obj registry.obj \
ti_Aa.obj ti_Ag.obj ti_C.obj ti_int.obj ti_char.obj \
ti_wchar.obj ti_uint.obj ti_short.obj ti_ushort.obj \
ti_byte.obj ti_ubyte.obj ti_long.obj ti_ulong.obj ti_ptr.obj \
@ -79,9 +79,9 @@ SRCSTD= std\zlib.d std\zip.d std\stdint.d std\conv.d std\utf.d std\uri.d \
std\gc.d std\math.d std\string.d std\path.d std\date.d \
std\ctype.d std\file.d std\compiler.d std\system.d std\moduleinit.d \
std\outbuffer.d std\math2.d std\thread.d \
std\assert.d std\dateparse.d std\outofmemory.d \
std\intrinsic.d std\array.d std\switcherr.d \
std\regexp.d std\random.d std\stream.d
std\asserterror.d std\dateparse.d std\outofmemory.d \
std\intrinsic.d std\array.d std\switcherr.d std\syserror.d \
std\regexp.d std\random.d std\stream.d std\process.d
SRCSTDC= std\c\process.d std\c\stdlib.d std\c\time.d std\c\stdio.d
@ -113,7 +113,7 @@ SRCINT= \
internal\dmain2.d internal\cast.d internal\qsort.d internal\deh2.d \
internal\cmath2.d internal\obj.d internal\mars.h
SRCSTDWIN= std\windows\registry.d std\windows\syserror.d \
SRCSTDWIN= std\windows\registry.d \
std\windows\iunknown.d
SRCSTDCWIN= std\c\windows\windows.d std\c\windows\com.d
@ -230,8 +230,8 @@ switch.obj : internal\switch.d
array.obj : std\array.d
$(DMD) -c $(DFLAGS) std\array.d
assert.obj : std\assert.d
$(DMD) -c $(DFLAGS) std\assert.d
asserterror.obj : std\asserterror.d
$(DMD) -c $(DFLAGS) std\asserterror.d
compiler.obj : std\compiler.d
$(DMD) -c $(DFLAGS) std\compiler.d
@ -275,6 +275,9 @@ outofmemory.obj : std\outofmemory.d
path.obj : std\path.d
$(DMD) -c $(DFLAGS) std\path.d
process.obj : std\process.d
$(DMD) -c $(DFLAGS) std\process.d
random.obj : std\random.d
$(DMD) -c $(DFLAGS) std\random.d
@ -290,6 +293,9 @@ string.obj : std\string.d
switcherr.obj : std\switcherr.d
$(DMD) -c $(DFLAGS) std\switcherr.d
syserror.obj : std\syserror.d
$(DMD) -c $(DFLAGS) std\syserror.d
system.obj : std\system.d
$(DMD) -c $(DFLAGS) std\system.d
@ -316,9 +322,6 @@ iunknown.obj : std\windows\iunknown.d
registry.obj : std\windows\registry.d
$(DMD) -c $(DFLAGS) std\windows\registry.d
syserror.obj : std\windows\syserror.d
$(DMD) -c $(DFLAGS) std\windows\syserror.d
### etc\c
Czlib.obj : etc\c\zlib.d
@ -472,7 +475,7 @@ install:
$(CP) $(SRCINT) \dmd\src\phobos\internal
$(CP) $(SRCSTDWIN) \dmd\src\phobos\std\windows
$(CP) $(SRCSTDCWIN) \dmd\src\phobos\std\c\windows
$(CP) $(SRCSTDCLINUX) \dmd\src\phobos\std\linux
$(CP) $(SRCSTDCLINUX) \dmd\src\phobos\std\c\linux
$(CP) $(SRCETC) \dmd\src\phobos\etc\c
$(CP) $(SRCZLIB) \dmd\src\phobos\etc\c\zlib
$(CP) $(SRCGC) \dmd\src\phobos\internal\gc