diff options
-rw-r--r-- | build.conf | 5 | ||||
-rw-r--r-- | patches/libbu++-osx-compatability.patch | 85 | ||||
-rw-r--r-- | src/fstring.h | 41 | ||||
-rw-r--r-- | src/ito.cpp | 1 | ||||
-rw-r--r-- | src/server.cpp | 1 | ||||
-rw-r--r-- | src/serversocket.cpp | 11 | ||||
-rw-r--r-- | src/socket.cpp | 1 | ||||
-rw-r--r-- | src/tests/fstring.cpp | 4 | ||||
-rw-r--r-- | src/unit/fstring.cpp | 9 |
9 files changed, 142 insertions, 16 deletions
@@ -5,9 +5,10 @@ default action: check group "lnhdrs", check "libbu++.a" | |||
5 | "all" action: check group "lnhdrs", check targets() | 5 | "all" action: check group "lnhdrs", check targets() |
6 | 6 | ||
7 | set "CXXFLAGS" += "-ggdb -Wall" | 7 | set "CXXFLAGS" += "-ggdb -Wall" |
8 | #set "CXXFLAGS" += "-O2 -Wall" | ||
8 | 9 | ||
9 | #set "CXXFLAGS" += "-pg" | 10 | set "CXXFLAGS" += "-pg" |
10 | #set "LDFLAGS" += "-pg" | 11 | set "LDFLAGS" += "-pg" |
11 | 12 | ||
12 | filesIn("src") filter regexp("^src/(.*)\\.h$", "src/bu/{re:1}.h"): | 13 | filesIn("src") filter regexp("^src/(.*)\\.h$", "src/bu/{re:1}.h"): |
13 | rule "hln", | 14 | rule "hln", |
diff --git a/patches/libbu++-osx-compatability.patch b/patches/libbu++-osx-compatability.patch new file mode 100644 index 0000000..73f4d7a --- /dev/null +++ b/patches/libbu++-osx-compatability.patch | |||
@@ -0,0 +1,85 @@ | |||
1 | Index: src/server.cpp | ||
2 | =================================================================== | ||
3 | --- src/server.cpp (revision 345) | ||
4 | +++ src/server.cpp (working copy) | ||
5 | @@ -3,6 +3,7 @@ | ||
6 | #include "bu/serversocket.h" | ||
7 | #include "bu/client.h" | ||
8 | #include "bu/socket.h" | ||
9 | +#include "osx_compatibility.h" | ||
10 | |||
11 | Bu::Server::Server() : | ||
12 | nTimeoutSec( 0 ), | ||
13 | Index: src/socket.cpp | ||
14 | =================================================================== | ||
15 | --- src/socket.cpp (revision 345) | ||
16 | +++ src/socket.cpp (working copy) | ||
17 | @@ -13,6 +13,7 @@ | ||
18 | #include <fcntl.h> | ||
19 | #include "socket.h" | ||
20 | #include "exceptions.h" | ||
21 | +#include "osx_compatibility.h" | ||
22 | |||
23 | #define RBS (1024*2) | ||
24 | |||
25 | Index: src/osx_compatibility.h | ||
26 | =================================================================== | ||
27 | --- src/osx_compatibility.h (revision 0) | ||
28 | +++ src/osx_compatibility.h (revision 0) | ||
29 | @@ -0,0 +1,19 @@ | ||
30 | +#ifndef OSX_COMPATIBILITY__H | ||
31 | +#define OSX_COMPATIBILITY__H | ||
32 | + | ||
33 | +#ifdef __APPLE__ | ||
34 | + | ||
35 | +#ifndef TEMP_FAILURE_RETRY | ||
36 | +#define TEMP_FAILURE_RETRY(expression) \ | ||
37 | + (__extension__ \ | ||
38 | + ({ long int __result; \ | ||
39 | + do __result = (long int) (expression); \ | ||
40 | + while (__result == -1L && errno == EINTR); \ | ||
41 | + __result; })) | ||
42 | +#endif | ||
43 | + | ||
44 | +#include <sched.h> | ||
45 | + | ||
46 | +#define pthread_yield() sched_yield() | ||
47 | +#endif /* __APPLE__ */ | ||
48 | +#endif | ||
49 | \ No newline at end of file | ||
50 | Index: src/serversocket.cpp | ||
51 | =================================================================== | ||
52 | --- src/serversocket.cpp (revision 345) | ||
53 | +++ src/serversocket.cpp (working copy) | ||
54 | @@ -13,6 +13,7 @@ | ||
55 | #include <fcntl.h> | ||
56 | #include "serversocket.h" | ||
57 | #include "exceptions.h" | ||
58 | +#include "osx_compatibility.h" | ||
59 | |||
60 | Bu::ServerSocket::ServerSocket( int nPort, int nPoolSize ) : | ||
61 | nPort( nPort ) | ||
62 | @@ -118,8 +119,12 @@ | ||
63 | (int *)&size | ||
64 | ); | ||
65 | #else | ||
66 | - nClient = ::accept( nServer, (struct sockaddr *)&clientname, &size ); | ||
67 | +#ifdef __APPLE__ | ||
68 | + nClient = ::accept( nServer, (struct sockaddr *)&clientname, (socklen_t*)&size ); | ||
69 | +#else | ||
70 | + nClient = ::accept( nServer, (struct sockaddr *)&clientname, &size ); | ||
71 | #endif | ||
72 | +#endif | ||
73 | if( nClient < 0 ) | ||
74 | { | ||
75 | throw SocketException( | ||
76 | Index: src/ito.cpp | ||
77 | =================================================================== | ||
78 | --- src/ito.cpp (revision 345) | ||
79 | +++ src/ito.cpp (working copy) | ||
80 | @@ -1,4 +1,5 @@ | ||
81 | #include "ito.h" | ||
82 | +#include "osx_compatibility.h" | ||
83 | |||
84 | Bu::Ito::Ito() | ||
85 | { | ||
diff --git a/src/fstring.h b/src/fstring.h index 72ac99d..4dee537 100644 --- a/src/fstring.h +++ b/src/fstring.h | |||
@@ -25,11 +25,11 @@ namespace Bu | |||
25 | * generation in mind. Like the standard string class you can specify what | 25 | * generation in mind. Like the standard string class you can specify what |
26 | * datatype to use for each character. Unlike the standard string class, | 26 | * datatype to use for each character. Unlike the standard string class, |
27 | * collection of appended and prepended terms is done lazily, making long | 27 | * collection of appended and prepended terms is done lazily, making long |
28 | * operations that involve many appends very inexpensive. In addition internal | 28 | * operations that involve many appends very inexpensive. In addition |
29 | * ref-counting means that if you pass strings around between functions there's | 29 | * internal ref-counting means that if you pass strings around between |
30 | * almost no overhead in time or memory since a reference is created and no | 30 | * functions there's almost no overhead in time or memory since a reference |
31 | * data is actually copied. This also means that you never need to put any | 31 | * is created and no data is actually copied. This also means that you |
32 | * FBasicString into a ref-counting container class. | 32 | * never need to put any FBasicString into a ref-counting container class. |
33 | * | 33 | * |
34 | *@param chr (typename) Type of character (i.e. char) | 34 | *@param chr (typename) Type of character (i.e. char) |
35 | *@param nMinSize (int) Chunk size (default: 256) | 35 | *@param nMinSize (int) Chunk size (default: 256) |
@@ -126,7 +126,7 @@ namespace Bu | |||
126 | for( nLen = 0; pData[nLen] != (chr)0; nLen++ ); | 126 | for( nLen = 0; pData[nLen] != (chr)0; nLen++ ); |
127 | if( nLen == 0 ) | 127 | if( nLen == 0 ) |
128 | return; | 128 | return; |
129 | 129 | ||
130 | Chunk *pNew = newChunk( nLen ); | 130 | Chunk *pNew = newChunk( nLen ); |
131 | cpy( pNew->pData, pData, nLen ); | 131 | cpy( pNew->pData, pData, nLen ); |
132 | 132 | ||
@@ -156,7 +156,16 @@ namespace Bu | |||
156 | */ | 156 | */ |
157 | void append( const chr &cData ) | 157 | void append( const chr &cData ) |
158 | { | 158 | { |
159 | append( &cData, 1 ); | 159 | if( pLast && pLast->nLength < nMinSize ) |
160 | { | ||
161 | pLast->pData[pLast->nLength] = cData; | ||
162 | ++pLast->nLength; ++nLength; | ||
163 | // pLast->pData[pLast->nLength] = (chr)0; | ||
164 | } | ||
165 | else | ||
166 | { | ||
167 | append( &cData, 1 ); | ||
168 | } | ||
160 | } | 169 | } |
161 | 170 | ||
162 | /** | 171 | /** |
@@ -323,11 +332,21 @@ namespace Bu | |||
323 | * Plus equals operator for FString. | 332 | * Plus equals operator for FString. |
324 | *@param pData (const chr) The character to append to your FString. | 333 | *@param pData (const chr) The character to append to your FString. |
325 | */ | 334 | */ |
326 | MyType &operator +=( const chr pData ) | 335 | MyType &operator +=( const chr cData ) |
327 | { | 336 | { |
328 | append( &pData, 1 ); | 337 | if( pLast && pLast->nLength < nMinSize ) |
338 | { | ||
339 | pLast->pData[pLast->nLength] = cData; | ||
340 | ++pLast->nLength; ++nLength; | ||
341 | // pLast->pData[pLast->nLength] = (chr)0; | ||
342 | } | ||
343 | else | ||
344 | { | ||
345 | append( &cData, 1 ); | ||
346 | } | ||
347 | //append( pData ); | ||
329 | 348 | ||
330 | return (*this); | 349 | //return (*this); |
331 | } | 350 | } |
332 | 351 | ||
333 | /** | 352 | /** |
@@ -714,7 +733,7 @@ namespace Bu | |||
714 | Chunk *pNew = aChunk.allocate( 1 ); | 733 | Chunk *pNew = aChunk.allocate( 1 ); |
715 | pNew->pNext = NULL; | 734 | pNew->pNext = NULL; |
716 | pNew->nLength = nLen; | 735 | pNew->nLength = nLen; |
717 | pNew->pData = aChr.allocate( nLen+1 ); | 736 | pNew->pData = aChr.allocate( (nLen<nMinSize)?(nMinSize):(nLen)+1 ); |
718 | pNew->pData[nLen] = (chr)0; | 737 | pNew->pData[nLen] = (chr)0; |
719 | return pNew; | 738 | return pNew; |
720 | } | 739 | } |
diff --git a/src/ito.cpp b/src/ito.cpp index 001ca06..231e822 100644 --- a/src/ito.cpp +++ b/src/ito.cpp | |||
@@ -1,4 +1,5 @@ | |||
1 | #include "ito.h" | 1 | #include "ito.h" |
2 | #include "osx_compatibility.h" | ||
2 | 3 | ||
3 | Bu::Ito::Ito() | 4 | Bu::Ito::Ito() |
4 | { | 5 | { |
diff --git a/src/server.cpp b/src/server.cpp index d07a597..53b4301 100644 --- a/src/server.cpp +++ b/src/server.cpp | |||
@@ -3,6 +3,7 @@ | |||
3 | #include "bu/serversocket.h" | 3 | #include "bu/serversocket.h" |
4 | #include "bu/client.h" | 4 | #include "bu/client.h" |
5 | #include "bu/socket.h" | 5 | #include "bu/socket.h" |
6 | #include "osx_compatibility.h" | ||
6 | 7 | ||
7 | Bu::Server::Server() : | 8 | Bu::Server::Server() : |
8 | nTimeoutSec( 0 ), | 9 | nTimeoutSec( 0 ), |
diff --git a/src/serversocket.cpp b/src/serversocket.cpp index 1424630..010c562 100644 --- a/src/serversocket.cpp +++ b/src/serversocket.cpp | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <fcntl.h> | 13 | #include <fcntl.h> |
14 | #include "serversocket.h" | 14 | #include "serversocket.h" |
15 | #include "exceptions.h" | 15 | #include "exceptions.h" |
16 | #include "osx_compatibility.h" | ||
16 | 17 | ||
17 | Bu::ServerSocket::ServerSocket( int nPort, int nPoolSize ) : | 18 | Bu::ServerSocket::ServerSocket( int nPort, int nPoolSize ) : |
18 | nPort( nPort ) | 19 | nPort( nPort ) |
@@ -117,9 +118,13 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
117 | nClient = ::accept( nServer, (struct sockaddr *)&clientname, | 118 | nClient = ::accept( nServer, (struct sockaddr *)&clientname, |
118 | (int *)&size | 119 | (int *)&size |
119 | ); | 120 | ); |
120 | #else | 121 | #else /* not-cygwin */ |
121 | nClient = ::accept( nServer, (struct sockaddr *)&clientname, &size ); | 122 | #ifdef __APPLE__ |
122 | #endif | 123 | nClient = ::accept( nServer, (struct sockaddr *)&clientname, (socklen_t*)&size ); |
124 | #else /* linux */ | ||
125 | nClient = ::accept( nServer, (struct sockaddr *)&clientname, &size ); | ||
126 | #endif /* __APPLE__ */ | ||
127 | #endif /* __CYGWIN__ */ | ||
123 | if( nClient < 0 ) | 128 | if( nClient < 0 ) |
124 | { | 129 | { |
125 | throw SocketException( | 130 | throw SocketException( |
diff --git a/src/socket.cpp b/src/socket.cpp index 50ed4e2..ce4ee82 100644 --- a/src/socket.cpp +++ b/src/socket.cpp | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <fcntl.h> | 13 | #include <fcntl.h> |
14 | #include "socket.h" | 14 | #include "socket.h" |
15 | #include "exceptions.h" | 15 | #include "exceptions.h" |
16 | #include "osx_compatibility.h" | ||
16 | 17 | ||
17 | #define RBS (1024*2) | 18 | #define RBS (1024*2) |
18 | 19 | ||
diff --git a/src/tests/fstring.cpp b/src/tests/fstring.cpp index 48dfc5f..11f147d 100644 --- a/src/tests/fstring.cpp +++ b/src/tests/fstring.cpp | |||
@@ -110,6 +110,10 @@ void doTimings() | |||
110 | #define pem printf("---------\n%08X: %s\n%08X: %s\n", (unsigned int)str.c_str(), str.c_str(), (unsigned int)str2.c_str(), str2.c_str() ); | 110 | #define pem printf("---------\n%08X: %s\n%08X: %s\n", (unsigned int)str.c_str(), str.c_str(), (unsigned int)str2.c_str(), str2.c_str() ); |
111 | int main( int argc, char *argv ) | 111 | int main( int argc, char *argv ) |
112 | { | 112 | { |
113 | Bu::FString fs1; | ||
114 | for( int j = 0; j < 500000; j++ ) fs1 += (char)('a'+(j%26)); | ||
115 | return 0; | ||
116 | |||
113 | Bu::FString str("th"); | 117 | Bu::FString str("th"); |
114 | 118 | ||
115 | str.prepend("Hello "); | 119 | str.prepend("Hello "); |
diff --git a/src/unit/fstring.cpp b/src/unit/fstring.cpp index 2c6bf7a..462ce5e 100644 --- a/src/unit/fstring.cpp +++ b/src/unit/fstring.cpp | |||
@@ -9,6 +9,7 @@ public: | |||
9 | setName("FString"); | 9 | setName("FString"); |
10 | addTest( Unit::compare1 ); | 10 | addTest( Unit::compare1 ); |
11 | addTest( Unit::compare2 ); | 11 | addTest( Unit::compare2 ); |
12 | addTest( Unit::appendSingle ); | ||
12 | } | 13 | } |
13 | 14 | ||
14 | virtual ~Unit() | 15 | virtual ~Unit() |
@@ -28,6 +29,14 @@ public: | |||
28 | unitTest( !(b == "Bob") ); | 29 | unitTest( !(b == "Bob") ); |
29 | unitTest( b == "Bobo" ); | 30 | unitTest( b == "Bobo" ); |
30 | } | 31 | } |
32 | |||
33 | void appendSingle() | ||
34 | { | ||
35 | Bu::FString b; | ||
36 | for( char l = 'a'; l < 'g'; l++ ) | ||
37 | b += l; | ||
38 | unitTest( b == "abcdef" ); | ||
39 | } | ||
31 | }; | 40 | }; |
32 | 41 | ||
33 | int main( int argc, char *argv[] ) | 42 | int main( int argc, char *argv[] ) |