diff options
-rw-r--r-- | src/cache.cpp | 1 | ||||
-rw-r--r-- | src/cache.h | 58 | ||||
-rw-r--r-- | src/cachestore.h | 6 | ||||
-rw-r--r-- | src/cptr.h | 11 | ||||
-rw-r--r-- | src/tests/cache.cpp | 125 | ||||
-rw-r--r-- | src/trace.cpp | 12 | ||||
-rw-r--r-- | src/trace.h | 37 |
7 files changed, 198 insertions, 52 deletions
diff --git a/src/cache.cpp b/src/cache.cpp index e69de29..fd1082b 100644 --- a/src/cache.cpp +++ b/src/cache.cpp | |||
@@ -0,0 +1 @@ | |||
#include "bu/cache.h" | |||
diff --git a/src/cache.h b/src/cache.h index 0c3994c..9488044 100644 --- a/src/cache.h +++ b/src/cache.h | |||
@@ -38,6 +38,20 @@ namespace Bu | |||
38 | virtual ~Cache() | 38 | virtual ~Cache() |
39 | { | 39 | { |
40 | TRACE(); | 40 | TRACE(); |
41 | for( typename CidHash::iterator i = hEnt.begin(); | ||
42 | i != hEnt.end(); i++ ) | ||
43 | { | ||
44 | if( i.getValue().iRefs > 0 ) | ||
45 | { | ||
46 | printf("Error? iRefs=%d for key ", i.getValue().iRefs ); | ||
47 | __tracer_format( i.getKey() ); | ||
48 | printf("!\n"); | ||
49 | } | ||
50 | lStore.first()->unload( | ||
51 | i.getValue().pData, | ||
52 | i.getKey() | ||
53 | ); | ||
54 | } | ||
41 | for( typename StoreList::iterator i = lStore.begin(); | 55 | for( typename StoreList::iterator i = lStore.begin(); |
42 | i != lStore.end(); i++ ) | 56 | i != lStore.end(); i++ ) |
43 | { | 57 | { |
@@ -47,44 +61,72 @@ namespace Bu | |||
47 | 61 | ||
48 | void appendStore( Store *pHand ) | 62 | void appendStore( Store *pHand ) |
49 | { | 63 | { |
64 | TRACE(); | ||
50 | lStore.append( pHand ); | 65 | lStore.append( pHand ); |
51 | } | 66 | } |
52 | 67 | ||
53 | void prependStore( Store *pHand ) | 68 | void prependStore( Store *pHand ) |
54 | { | 69 | { |
70 | TRACE(); | ||
55 | lStore.prepend( pHand ); | 71 | lStore.prepend( pHand ); |
56 | } | 72 | } |
57 | 73 | ||
58 | Ptr insert( obtype *pData ) | 74 | Ptr insert( obtype *pData ) |
59 | { | 75 | { |
60 | TRACE(); | 76 | TRACE( pData ); |
61 | CacheEntry e = {pData, 0}; | 77 | CacheEntry e = {pData, 0}; |
62 | hEnt.insert( 0 , e ); | 78 | keytype k = lStore.first()->create( pData ); |
63 | return Ptr( *this, pData ); | 79 | hEnt.insert( k, e ); |
80 | |||
81 | return Ptr( *this, pData, k ); | ||
64 | } | 82 | } |
65 | 83 | ||
66 | Ptr get( keytype cId ) | 84 | Ptr get( keytype cId ) |
67 | { | 85 | { |
68 | TRACE(); | 86 | TRACE( cId ); |
69 | return Ptr( *this, hEnt.get( cId ).pData ); | 87 | try { |
88 | return Ptr( *this, hEnt.get( cId ).pData, cId ); | ||
89 | } | ||
90 | catch( Bu::HashException &e ) { | ||
91 | CacheEntry e = {lStore.first()->load( cId ), 0}; | ||
92 | hEnt.insert( cId, e ); | ||
93 | return Ptr( *this, e.pData, cId ); | ||
94 | } | ||
95 | } | ||
96 | |||
97 | void erase( keytype cId ) | ||
98 | { | ||
99 | TRACE( cId ); | ||
100 | try { | ||
101 | if( hEnt.get( cId ).iRefs > 0 ) | ||
102 | { | ||
103 | printf("Shouldn't delete, references still exist!\n"); | ||
104 | return; | ||
105 | } | ||
106 | } | ||
107 | catch( Bu::HashException &e ) { | ||
108 | get( cId ); | ||
109 | } | ||
110 | lStore.first()->destroy( hEnt.get( cId ).pData, cId ); | ||
111 | hEnt.erase( cId ); | ||
70 | } | 112 | } |
71 | 113 | ||
72 | int getRefCnt( keytype cId ) | 114 | int getRefCnt( keytype cId ) |
73 | { | 115 | { |
74 | TRACE(); | 116 | TRACE( cId ); |
75 | return hEnt.get( cId ).iRefs; | 117 | return hEnt.get( cId ).iRefs; |
76 | } | 118 | } |
77 | 119 | ||
78 | private: | 120 | private: |
79 | void incRef( keytype cId ) | 121 | void incRef( keytype cId ) |
80 | { | 122 | { |
81 | TRACE(); | 123 | TRACE( cId ); |
82 | hEnt.get( cId ).iRefs++; | 124 | hEnt.get( cId ).iRefs++; |
83 | } | 125 | } |
84 | 126 | ||
85 | void decRef( keytype cId ) | 127 | void decRef( keytype cId ) |
86 | { | 128 | { |
87 | TRACE(); | 129 | TRACE( cId ); |
88 | CacheEntry &e = hEnt.get( cId ); | 130 | CacheEntry &e = hEnt.get( cId ); |
89 | e.iRefs--; | 131 | e.iRefs--; |
90 | } | 132 | } |
diff --git a/src/cachestore.h b/src/cachestore.h index 3211b6a..5b52359 100644 --- a/src/cachestore.h +++ b/src/cachestore.h | |||
@@ -1,8 +1,6 @@ | |||
1 | #ifndef BU_CACHE_STORE_H | 1 | #ifndef BU_CACHE_STORE_H |
2 | #define BU_CACHE_STORE_H | 2 | #define BU_CACHE_STORE_H |
3 | 3 | ||
4 | #include "bu/cptr.h" | ||
5 | |||
6 | namespace Bu | 4 | namespace Bu |
7 | { | 5 | { |
8 | /** | 6 | /** |
@@ -21,10 +19,8 @@ namespace Bu | |||
21 | { | 19 | { |
22 | } | 20 | } |
23 | 21 | ||
24 | typedef Bu::CPtr<obtype, keytype> Ptr; | ||
25 | |||
26 | virtual obtype *load( const keytype &key )=0; | 22 | virtual obtype *load( const keytype &key )=0; |
27 | virtual void unload( obtype *pObj )=0; | 23 | virtual void unload( obtype *pObj, const keytype &key )=0; |
28 | virtual keytype create( obtype *pSrc )=0; | 24 | virtual keytype create( obtype *pSrc )=0; |
29 | virtual void destroy( obtype *pObj, const keytype &key )=0; | 25 | virtual void destroy( obtype *pObj, const keytype &key )=0; |
30 | 26 | ||
@@ -15,9 +15,11 @@ namespace Bu | |||
15 | { | 15 | { |
16 | friend class Bu::Cache<obtype, keytype>; | 16 | friend class Bu::Cache<obtype, keytype>; |
17 | private: | 17 | private: |
18 | CPtr( Cache<obtype, keytype> &rCache, obtype *pData ) : | 18 | CPtr( Cache<obtype, keytype> &rCache, obtype *pData, |
19 | const keytype &kId ) : | ||
19 | rCache( rCache ), | 20 | rCache( rCache ), |
20 | pData( pData ) | 21 | pData( pData ), |
22 | kId( kId ) | ||
21 | { | 23 | { |
22 | rCache.incRef( kId ); | 24 | rCache.incRef( kId ); |
23 | } | 25 | } |
@@ -38,6 +40,11 @@ namespace Bu | |||
38 | return pData; | 40 | return pData; |
39 | } | 41 | } |
40 | 42 | ||
43 | const keytype &getKey() | ||
44 | { | ||
45 | return kId; | ||
46 | } | ||
47 | |||
41 | private: | 48 | private: |
42 | Bu::Cache<obtype, keytype> &rCache; | 49 | Bu::Cache<obtype, keytype> &rCache; |
43 | obtype *pData; | 50 | obtype *pData; |
diff --git a/src/tests/cache.cpp b/src/tests/cache.cpp index 1cc008a..18e6a95 100644 --- a/src/tests/cache.cpp +++ b/src/tests/cache.cpp | |||
@@ -1,9 +1,12 @@ | |||
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | #include <stdlib.h> | ||
2 | #include <sys/stat.h> | 3 | #include <sys/stat.h> |
3 | #include <sys/types.h> | 4 | #include <sys/types.h> |
4 | #include <errno.h> | 5 | #include <errno.h> |
5 | 6 | ||
6 | #include "bu/cache.h" | 7 | #include "bu/cache.h" |
8 | #include "bu/file.h" | ||
9 | #include "bu/fstring.h" | ||
7 | 10 | ||
8 | class Bob | 11 | class Bob |
9 | { | 12 | { |
@@ -13,6 +16,12 @@ public: | |||
13 | TRACE(); | 16 | TRACE(); |
14 | } | 17 | } |
15 | 18 | ||
19 | Bob( int i ) : | ||
20 | iInt( i ) | ||
21 | { | ||
22 | TRACE( i ); | ||
23 | } | ||
24 | |||
16 | virtual ~Bob() | 25 | virtual ~Bob() |
17 | { | 26 | { |
18 | TRACE(); | 27 | TRACE(); |
@@ -20,7 +29,7 @@ public: | |||
20 | 29 | ||
21 | void setInt( int i ) | 30 | void setInt( int i ) |
22 | { | 31 | { |
23 | TRACE(); | 32 | TRACE( i ); |
24 | iInt = i; | 33 | iInt = i; |
25 | } | 34 | } |
26 | 35 | ||
@@ -29,15 +38,17 @@ public: | |||
29 | return iInt; | 38 | return iInt; |
30 | } | 39 | } |
31 | 40 | ||
32 | long getCacheId() const | ||
33 | { | ||
34 | TRACE(); | ||
35 | return 0; | ||
36 | } | ||
37 | |||
38 | int iInt; | 41 | int iInt; |
39 | }; | 42 | }; |
40 | 43 | ||
44 | namespace Bu { | ||
45 | template<> | ||
46 | void __tracer_format<Bob*>( Bob* const &c ) | ||
47 | { | ||
48 | printf("%08X=%d", (uint32_t)c, c->getInt() ); | ||
49 | } | ||
50 | } | ||
51 | |||
41 | class BobStore : public Bu::CacheStore<Bob, long> | 52 | class BobStore : public Bu::CacheStore<Bob, long> |
42 | { | 53 | { |
43 | public: | 54 | public: |
@@ -45,34 +56,79 @@ public: | |||
45 | cLastId( 0 ) | 56 | cLastId( 0 ) |
46 | { | 57 | { |
47 | TRACE(); | 58 | TRACE(); |
59 | if( access( "bobcache/last", R_OK|W_OK ) ) | ||
60 | { | ||
61 | mkdir("bobcache", 0755 ); | ||
62 | Bu::File f("bobcache/last", Bu::File::Write|Bu::File::Create ); | ||
63 | f.write("0", 1); | ||
64 | printf("Initializing cache: %s\n", strerror( errno ) ); | ||
65 | } | ||
66 | else | ||
67 | { | ||
68 | cLastId = readNum("bobcache/last"); | ||
69 | } | ||
48 | } | 70 | } |
49 | 71 | ||
50 | ~BobStore() | 72 | ~BobStore() |
51 | { | 73 | { |
52 | TRACE(); | 74 | TRACE(); |
75 | writeNum("bobcache/last", cLastId ); | ||
76 | } | ||
77 | |||
78 | long readNum( const Bu::FString &sFile ) | ||
79 | { | ||
80 | TRACE( sFile ); | ||
81 | Bu::File f( sFile, Bu::File::Read ); | ||
82 | char buf[80]; | ||
83 | buf[f.read( buf, 80 )] = '\0'; | ||
84 | return strtol( buf, NULL, 0 ); | ||
85 | } | ||
86 | |||
87 | void writeNum( const Bu::FString &sFile, long num ) | ||
88 | { | ||
89 | TRACE( sFile, num ); | ||
90 | Bu::File f( sFile, | ||
91 | Bu::File::Write|Bu::File::Create|Bu::File::Truncate | ||
92 | ); | ||
93 | Bu::FString s; | ||
94 | s.format("%d", num ); | ||
95 | f.write( s ); | ||
53 | } | 96 | } |
54 | 97 | ||
55 | virtual Bob *load( const long &key ) | 98 | virtual Bob *load( const long &key ) |
56 | { | 99 | { |
57 | TRACE(); | 100 | TRACE( key ); |
58 | return NULL; | 101 | Bu::FString sDest; |
102 | sDest.format("bobcache/%d", key ); | ||
103 | return new Bob( readNum( sDest ) ); | ||
59 | } | 104 | } |
60 | 105 | ||
61 | virtual void unload( Bob *pObj ) | 106 | virtual void unload( Bob *pObj, const long &key ) |
62 | { | 107 | { |
63 | TRACE(); | 108 | TRACE( pObj, key ); |
109 | Bu::FString sDest; | ||
110 | sDest.format("bobcache/%d", key ); | ||
111 | writeNum( sDest, pObj->getInt() ); | ||
64 | delete pObj; | 112 | delete pObj; |
65 | } | 113 | } |
66 | 114 | ||
67 | virtual long create( Bob *rSrc ) | 115 | virtual long create( Bob *rSrc ) |
68 | { | 116 | { |
69 | TRACE(); | 117 | TRACE( rSrc ); |
70 | return ++cLastId; | 118 | long id = ++cLastId; |
119 | Bu::FString sDest; | ||
120 | sDest.format("bobcache/%d", id ); | ||
121 | writeNum( sDest, rSrc->getInt() ); | ||
122 | return id; | ||
71 | } | 123 | } |
72 | 124 | ||
73 | virtual void destroy( Bob *pObj, const long &key ) | 125 | virtual void destroy( Bob *pObj, const long &key ) |
74 | { | 126 | { |
75 | TRACE(); | 127 | TRACE( pObj, key ); |
128 | Bu::FString sDest; | ||
129 | sDest.format("bobcache/%d", key ); | ||
130 | if( !access( sDest.getStr(), F_OK ) ) | ||
131 | unlink( sDest.getStr() ); | ||
76 | delete pObj; | 132 | delete pObj; |
77 | } | 133 | } |
78 | 134 | ||
@@ -82,28 +138,47 @@ private: | |||
82 | 138 | ||
83 | int main( int argc, char *argv[] ) | 139 | int main( int argc, char *argv[] ) |
84 | { | 140 | { |
85 | TRACE(); | 141 | TRACE( argc, argv ); |
142 | typedef Bu::Cache<Bob, long> BobCache; | ||
143 | typedef BobCache::Ptr BobPtr; | ||
144 | |||
86 | if( argc < 3 ) | 145 | if( argc < 3 ) |
87 | { | 146 | { |
88 | printf("Try: %s [icufd] [<id/value>]\n\n", argv[0] ); | 147 | printf("Try: %s [crud] [<id/value>]\n\n", argv[0] ); |
89 | return 0; | 148 | return 0; |
90 | } | 149 | } |
91 | 150 | ||
151 | BobCache cBob; | ||
152 | cBob.appendStore( new BobStore() ); | ||
92 | switch( argv[1][0] ) | 153 | switch( argv[1][0] ) |
93 | { | 154 | { |
94 | case 'i': | ||
95 | mkdir("bobcache", 0755 ); | ||
96 | printf("Initialized cache: %s\n", strerror( errno ) ); | ||
97 | return 0; | ||
98 | |||
99 | case 'c': | 155 | case 'c': |
100 | typedef Bu::Cache<Bob, long> BobCache; | 156 | { |
101 | typedef BobCache::Ptr BobPtr; | 157 | BobCache::Ptr pBob = cBob.insert( |
158 | new Bob( strtol( argv[2], NULL, 0 ) ) | ||
159 | ); | ||
160 | printf("Key = %ld\n", pBob.getKey() ); | ||
161 | } | ||
162 | return 0; | ||
102 | 163 | ||
103 | BobCache cBob; | 164 | case 'r': |
165 | { | ||
166 | BobCache::Ptr pBob = cBob.get( strtol( argv[2], NULL, 0 ) ); | ||
167 | printf("Value = %d\n", pBob->getInt() ); | ||
168 | } | ||
169 | return 0; | ||
104 | 170 | ||
105 | cBob.appendStore( new BobStore() ); | 171 | case 'u': |
172 | { | ||
173 | BobCache::Ptr pBob = cBob.get( strtol( argv[2], NULL, 0 ) ); | ||
174 | pBob->setInt( strtol( argv[3], NULL, 0 ) ); | ||
175 | } | ||
176 | return 0; | ||
106 | 177 | ||
178 | case 'd': | ||
179 | { | ||
180 | cBob.erase( strtol( argv[2], NULL, 0 ) ); | ||
181 | } | ||
107 | return 0; | 182 | return 0; |
108 | } | 183 | } |
109 | 184 | ||
diff --git a/src/trace.cpp b/src/trace.cpp index dab53d6..242d110 100644 --- a/src/trace.cpp +++ b/src/trace.cpp | |||
@@ -58,7 +58,7 @@ template<> void Bu::__tracer_format<char>( const char &v ) | |||
58 | { | 58 | { |
59 | printf("%hhd", v ); | 59 | printf("%hhd", v ); |
60 | } | 60 | } |
61 | /* | 61 | |
62 | template<> void Bu::__tracer_format<long>( const long &v ) | 62 | template<> void Bu::__tracer_format<long>( const long &v ) |
63 | { | 63 | { |
64 | printf("%ld", v ); | 64 | printf("%ld", v ); |
@@ -67,7 +67,7 @@ template<> void Bu::__tracer_format<long>( const long &v ) | |||
67 | template<> void Bu::__tracer_format<unsigned long>( const unsigned long &v ) | 67 | template<> void Bu::__tracer_format<unsigned long>( const unsigned long &v ) |
68 | { | 68 | { |
69 | printf("%lu", v ); | 69 | printf("%lu", v ); |
70 | }*/ | 70 | } |
71 | 71 | ||
72 | template<> void Bu::__tracer_format<float>( const float &v ) | 72 | template<> void Bu::__tracer_format<float>( const float &v ) |
73 | { | 73 | { |
@@ -93,7 +93,11 @@ template<> void Bu::__tracer_format<char **>( char ** const &v ) | |||
93 | { | 93 | { |
94 | printf("["); | 94 | printf("["); |
95 | for( int j = 0; v[j]; j++ ) | 95 | for( int j = 0; v[j]; j++ ) |
96 | { | ||
97 | if( j > 0 ) | ||
98 | printf(", "); | ||
96 | printf("\"%s\"", v[j] ); | 99 | printf("\"%s\"", v[j] ); |
100 | } | ||
97 | printf("]"); | 101 | printf("]"); |
98 | } | 102 | } |
99 | 103 | ||
@@ -111,6 +115,10 @@ template<> void Bu::__tracer_format<char const **>( char const ** const &v ) | |||
111 | { | 115 | { |
112 | printf("["); | 116 | printf("["); |
113 | for( int j = 0; v[j]; j++ ) | 117 | for( int j = 0; v[j]; j++ ) |
118 | { | ||
119 | if( j > 0 ) | ||
120 | printf(", "); | ||
114 | printf("\"%s\"", v[j] ); | 121 | printf("\"%s\"", v[j] ); |
122 | } | ||
115 | printf("]"); | 123 | printf("]"); |
116 | } | 124 | } |
diff --git a/src/trace.h b/src/trace.h index 82399c2..049d138 100644 --- a/src/trace.h +++ b/src/trace.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <stdio.h> | 11 | #include <stdio.h> |
12 | #include <stdint.h> | 12 | #include <stdint.h> |
13 | #include <stddef.h> | 13 | #include <stddef.h> |
14 | #include <string.h> | ||
14 | 15 | ||
15 | namespace Bu | 16 | namespace Bu |
16 | { | 17 | { |
@@ -26,7 +27,12 @@ namespace Bu | |||
26 | #define looper( vv ) \ | 27 | #define looper( vv ) \ |
27 | for( ; *n; n++ ) \ | 28 | for( ; *n; n++ ) \ |
28 | { \ | 29 | { \ |
29 | if( *n == ',' || *n == ')' ) \ | 30 | if( bInBracket == true ) \ |
31 | { \ | ||
32 | if( *n == '>' ) \ | ||
33 | bInBracket = false; \ | ||
34 | } \ | ||
35 | else if( *n == ',' || *n == ')' ) \ | ||
30 | { \ | 36 | { \ |
31 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); \ | 37 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); \ |
32 | fwrite("=", 1, 1, stdout); \ | 38 | fwrite("=", 1, 1, stdout); \ |
@@ -35,6 +41,10 @@ namespace Bu | |||
35 | n++; \ | 41 | n++; \ |
36 | break; \ | 42 | break; \ |
37 | } \ | 43 | } \ |
44 | else if( *n == '<' ) \ | ||
45 | { \ | ||
46 | bInBracket = true; \ | ||
47 | } \ | ||
38 | } (void)0 | 48 | } (void)0 |
39 | 49 | ||
40 | template<typename t1> void __tracer( const char *pf, t1 &v1 ) | 50 | template<typename t1> void __tracer( const char *pf, t1 &v1 ) |
@@ -42,8 +52,9 @@ namespace Bu | |||
42 | printf("trace: "); | 52 | printf("trace: "); |
43 | const char *s = pf; | 53 | const char *s = pf; |
44 | const char *n = pf; | 54 | const char *n = pf; |
55 | bool bInBracket = false; | ||
45 | looper( v1 ); | 56 | looper( v1 ); |
46 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); | 57 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); |
47 | fwrite( "\n", 1, 1, stdout ); | 58 | fwrite( "\n", 1, 1, stdout ); |
48 | fflush( stdout ); | 59 | fflush( stdout ); |
49 | } | 60 | } |
@@ -54,9 +65,10 @@ namespace Bu | |||
54 | printf("trace: "); | 65 | printf("trace: "); |
55 | const char *s = pf; | 66 | const char *s = pf; |
56 | const char *n = pf; | 67 | const char *n = pf; |
68 | bool bInBracket = false; | ||
57 | looper( v1 ); | 69 | looper( v1 ); |
58 | looper( v2 ); | 70 | looper( v2 ); |
59 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); | 71 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); |
60 | fwrite( "\n", 1, 1, stdout ); | 72 | fwrite( "\n", 1, 1, stdout ); |
61 | fflush( stdout ); | 73 | fflush( stdout ); |
62 | } | 74 | } |
@@ -67,10 +79,11 @@ namespace Bu | |||
67 | printf("trace: "); | 79 | printf("trace: "); |
68 | const char *s = pf; | 80 | const char *s = pf; |
69 | const char *n = pf; | 81 | const char *n = pf; |
82 | bool bInBracket = false; | ||
70 | looper( v1 ); | 83 | looper( v1 ); |
71 | looper( v2 ); | 84 | looper( v2 ); |
72 | looper( v3 ); | 85 | looper( v3 ); |
73 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); | 86 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); |
74 | fwrite( "\n", 1, 1, stdout ); | 87 | fwrite( "\n", 1, 1, stdout ); |
75 | fflush( stdout ); | 88 | fflush( stdout ); |
76 | } | 89 | } |
@@ -81,11 +94,12 @@ namespace Bu | |||
81 | printf("trace: "); | 94 | printf("trace: "); |
82 | const char *s = pf; | 95 | const char *s = pf; |
83 | const char *n = pf; | 96 | const char *n = pf; |
97 | bool bInBracket = false; | ||
84 | looper( v1 ); | 98 | looper( v1 ); |
85 | looper( v2 ); | 99 | looper( v2 ); |
86 | looper( v3 ); | 100 | looper( v3 ); |
87 | looper( v4 ); | 101 | looper( v4 ); |
88 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); | 102 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); |
89 | fwrite( "\n", 1, 1, stdout ); | 103 | fwrite( "\n", 1, 1, stdout ); |
90 | fflush( stdout ); | 104 | fflush( stdout ); |
91 | } | 105 | } |
@@ -96,12 +110,13 @@ namespace Bu | |||
96 | printf("trace: "); | 110 | printf("trace: "); |
97 | const char *s = pf; | 111 | const char *s = pf; |
98 | const char *n = pf; | 112 | const char *n = pf; |
113 | bool bInBracket = false; | ||
99 | looper( v1 ); | 114 | looper( v1 ); |
100 | looper( v2 ); | 115 | looper( v2 ); |
101 | looper( v3 ); | 116 | looper( v3 ); |
102 | looper( v4 ); | 117 | looper( v4 ); |
103 | looper( v5 ); | 118 | looper( v5 ); |
104 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); | 119 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); |
105 | fwrite( "\n", 1, 1, stdout ); | 120 | fwrite( "\n", 1, 1, stdout ); |
106 | fflush( stdout ); | 121 | fflush( stdout ); |
107 | } | 122 | } |
@@ -114,13 +129,14 @@ namespace Bu | |||
114 | printf("trace: "); | 129 | printf("trace: "); |
115 | const char *s = pf; | 130 | const char *s = pf; |
116 | const char *n = pf; | 131 | const char *n = pf; |
132 | bool bInBracket = false; | ||
117 | looper( v1 ); | 133 | looper( v1 ); |
118 | looper( v2 ); | 134 | looper( v2 ); |
119 | looper( v3 ); | 135 | looper( v3 ); |
120 | looper( v4 ); | 136 | looper( v4 ); |
121 | looper( v5 ); | 137 | looper( v5 ); |
122 | looper( v6 ); | 138 | looper( v6 ); |
123 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); | 139 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); |
124 | fwrite( "\n", 1, 1, stdout ); | 140 | fwrite( "\n", 1, 1, stdout ); |
125 | fflush( stdout ); | 141 | fflush( stdout ); |
126 | } | 142 | } |
@@ -133,6 +149,7 @@ namespace Bu | |||
133 | printf("trace: "); | 149 | printf("trace: "); |
134 | const char *s = pf; | 150 | const char *s = pf; |
135 | const char *n = pf; | 151 | const char *n = pf; |
152 | bool bInBracket = false; | ||
136 | looper( v1 ); | 153 | looper( v1 ); |
137 | looper( v2 ); | 154 | looper( v2 ); |
138 | looper( v3 ); | 155 | looper( v3 ); |
@@ -140,7 +157,7 @@ namespace Bu | |||
140 | looper( v5 ); | 157 | looper( v5 ); |
141 | looper( v6 ); | 158 | looper( v6 ); |
142 | looper( v7 ); | 159 | looper( v7 ); |
143 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); | 160 | fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); |
144 | fwrite( "\n", 1, 1, stdout ); | 161 | fwrite( "\n", 1, 1, stdout ); |
145 | fflush( stdout ); | 162 | fflush( stdout ); |
146 | } | 163 | } |
@@ -156,8 +173,8 @@ namespace Bu | |||
156 | template<> void __tracer_format<uint64_t>( const uint64_t &v ); | 173 | template<> void __tracer_format<uint64_t>( const uint64_t &v ); |
157 | template<> void __tracer_format<bool>( const bool &v ); | 174 | template<> void __tracer_format<bool>( const bool &v ); |
158 | template<> void __tracer_format<char>( const char &v ); | 175 | template<> void __tracer_format<char>( const char &v ); |
159 | //template<> void __tracer_format<long>( const long &v ); | 176 | template<> void __tracer_format<long>( const long &v ); |
160 | //template<> void __tracer_format<unsigned long>( const unsigned long &v ); | 177 | template<> void __tracer_format<unsigned long>( const unsigned long &v ); |
161 | template<> void __tracer_format<float>( const float &v ); | 178 | template<> void __tracer_format<float>( const float &v ); |
162 | template<> void __tracer_format<double>( const double &v ); | 179 | template<> void __tracer_format<double>( const double &v ); |
163 | template<> void __tracer_format<void *>( void * const &v ); | 180 | template<> void __tracer_format<void *>( void * const &v ); |