Mercurial > projects > ldc
comparison dmd/lstring.h @ 1:c53b6e3fe49a trunk
[svn r5] Initial commit. Most things are very rough.
author | lindquist |
---|---|
date | Sat, 01 Sep 2007 21:43:27 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:a9e71648e74d | 1:c53b6e3fe49a |
---|---|
1 | |
2 // lstring.h | |
3 // length-prefixed strings | |
4 | |
5 // Copyright (c) 1999-2002 by Digital Mars | |
6 // All Rights Reserved | |
7 // written by Walter Bright | |
8 // www.digitalmars.com | |
9 // License for redistribution is by either the Artistic License | |
10 // in artistic.txt, or the GNU General Public License in gnu.txt. | |
11 // See the included readme.txt for details. | |
12 | |
13 #ifndef LSTRING_H | |
14 #define LSTRING_H 1 | |
15 | |
16 #include "dchar.h" | |
17 | |
18 struct Lstring | |
19 { | |
20 unsigned length; | |
21 | |
22 // Disable warning about nonstandard extension | |
23 #pragma warning (disable : 4200) | |
24 dchar string[]; | |
25 | |
26 static Lstring zero; // 0 length string | |
27 | |
28 // No constructors because we want to be able to statically | |
29 // initialize Lstring's, and Lstrings are of variable size. | |
30 | |
31 #if M_UNICODE | |
32 #define LSTRING(p,length) { length, L##p } | |
33 #else | |
34 #define LSTRING(p,length) { length, p } | |
35 #endif | |
36 | |
37 #if __GNUC__ | |
38 #define LSTRING_EMPTY() { 0 } | |
39 #else | |
40 #define LSTRING_EMPTY() LSTRING("", 0) | |
41 #endif | |
42 | |
43 static Lstring *ctor(const dchar *p) { return ctor(p, Dchar::len(p)); } | |
44 static Lstring *ctor(const dchar *p, unsigned length); | |
45 static unsigned size(unsigned length) { return sizeof(Lstring) + (length + 1) * sizeof(dchar); } | |
46 static Lstring *alloc(unsigned length); | |
47 Lstring *clone(); | |
48 | |
49 unsigned len() { return length; } | |
50 | |
51 dchar *toDchars() { return string; } | |
52 | |
53 hash_t hash() { return Dchar::calcHash(string, length); } | |
54 hash_t ihash() { return Dchar::icalcHash(string, length); } | |
55 | |
56 static int cmp(const Lstring *s1, const Lstring *s2) | |
57 { | |
58 int c = s2->length - s1->length; | |
59 return c ? c : Dchar::memcmp(s1->string, s2->string, s1->length); | |
60 } | |
61 | |
62 static int icmp(const Lstring *s1, const Lstring *s2) | |
63 { | |
64 int c = s2->length - s1->length; | |
65 return c ? c : Dchar::memicmp(s1->string, s2->string, s1->length); | |
66 } | |
67 | |
68 Lstring *append(const Lstring *s); | |
69 Lstring *substring(int start, int end); | |
70 }; | |
71 | |
72 #endif |