Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygen_num_put.c
Go to the documentation of this file.
00001 /* 00002 * Copyright (c) 1999 00003 * Silicon Graphics Computer Systems, Inc. 00004 * 00005 * Copyright (c) 1999 00006 * Boris Fomitchev 00007 * 00008 * This material is provided "as is", with absolutely no warranty expressed 00009 * or implied. Any use is at your own risk. 00010 * 00011 * Permission to use or copy this software for any purpose is hereby granted 00012 * without fee, provided the above notices are retained on all copies. 00013 * Permission to modify the code and to distribute modified code is granted, 00014 * provided the above notices are retained, and a notice that the code was 00015 * modified is included with the above copyright notice. 00016 * 00017 */ 00018 #ifndef _STLP_NUM_PUT_C 00019 #define _STLP_NUM_PUT_C 00020 00021 #ifndef _STLP_INTERNAL_NUM_PUT_H 00022 # include <stl/_num_put.h> 00023 #endif 00024 00025 #ifndef _STLP_INTERNAL_LIMITS 00026 # include <stl/_limits.h> 00027 #endif 00028 00029 _STLP_BEGIN_NAMESPACE 00030 00031 _STLP_MOVE_TO_PRIV_NAMESPACE 00032 00033 // __do_put_float and its helper functions. Strategy: write the output 00034 // to a buffer of char, transform the buffer to _CharT, and then copy 00035 // it to the output. 00036 00037 //---------------------------------------------------------------------- 00038 // num_put facet 00039 00040 template <class _CharT, class _OutputIter> 00041 _OutputIter _STLP_CALL 00042 __copy_float_and_fill(const _CharT* __first, const _CharT* __last, 00043 _OutputIter __oi, 00044 ios_base::fmtflags __flags, 00045 streamsize __width, _CharT __fill, 00046 _CharT __xplus, _CharT __xminus) { 00047 if (__width <= __last - __first) 00048 return _STLP_STD::copy(__first, __last, __oi); 00049 else { 00050 streamsize __pad = __width - (__last - __first); 00051 ios_base::fmtflags __dir = __flags & ios_base::adjustfield; 00052 00053 if (__dir == ios_base::left) { 00054 __oi = _STLP_STD::copy(__first, __last, __oi); 00055 return _STLP_PRIV __fill_n(__oi, __pad, __fill); 00056 } 00057 else if (__dir == ios_base::internal && __first != __last && 00058 (*__first == __xplus || *__first == __xminus)) { 00059 *__oi++ = *__first++; 00060 __oi = _STLP_PRIV __fill_n(__oi, __pad, __fill); 00061 return _STLP_STD::copy(__first, __last, __oi); 00062 } 00063 else { 00064 __oi = _STLP_PRIV __fill_n(__oi, __pad, __fill); 00065 return _STLP_STD::copy(__first, __last, __oi); 00066 } 00067 } 00068 } 00069 00070 #if !defined (_STLP_NO_WCHAR_T) 00071 // Helper routine for wchar_t 00072 template <class _OutputIter> 00073 _OutputIter _STLP_CALL 00074 __put_float(__iostring &__str, _OutputIter __oi, 00075 ios_base& __f, wchar_t __fill, 00076 wchar_t __decimal_point, wchar_t __sep, 00077 size_t __group_pos, const string& __grouping) { 00078 const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__f.getloc()); 00079 00080 __iowstring __wbuf; 00081 __convert_float_buffer(__str, __wbuf, __ct, __decimal_point); 00082 00083 if (!__grouping.empty()) { 00084 __insert_grouping(__wbuf, __group_pos, __grouping, 00085 __sep, __ct.widen('+'), __ct.widen('-'), 0); 00086 } 00087 00088 return __copy_float_and_fill(__wbuf.data(), __wbuf.data() + __wbuf.size(), __oi, 00089 __f.flags(), __f.width(0), __fill, __ct.widen('+'), __ct.widen('-')); 00090 } 00091 #endif /* WCHAR_T */ 00092 00093 // Helper routine for char 00094 template <class _OutputIter> 00095 _OutputIter _STLP_CALL 00096 __put_float(__iostring &__str, _OutputIter __oi, 00097 ios_base& __f, char __fill, 00098 char __decimal_point, char __sep, 00099 size_t __group_pos, const string& __grouping) { 00100 if ((__group_pos < __str.size()) && (__str[__group_pos] == '.')) { 00101 __str[__group_pos] = __decimal_point; 00102 } 00103 00104 if (!__grouping.empty()) { 00105 __insert_grouping(__str, __group_pos, 00106 __grouping, __sep, '+', '-', 0); 00107 } 00108 00109 return __copy_float_and_fill(__str.data(), __str.data() + __str.size(), __oi, 00110 __f.flags(), __f.width(0), __fill, '+', '-'); 00111 } 00112 00113 template <class _CharT, class _OutputIter, class _Float> 00114 _OutputIter _STLP_CALL 00115 __do_put_float(_OutputIter __s, ios_base& __f, 00116 _CharT __fill, _Float __x) { 00117 __iostring __buf; 00118 00119 size_t __group_pos = __write_float(__buf, __f.flags(), (int)__f.precision(), __x); 00120 00121 const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__f.getloc()); 00122 return __put_float(__buf, __s, __f, __fill, 00123 __np.decimal_point(), __np.thousands_sep(), 00124 __group_pos, __np.grouping()); 00125 } 00126 00127 inline void __get_money_digits_aux (__iostring &__buf, ios_base &, _STLP_LONGEST_FLOAT_TYPE __x) 00128 { __get_floor_digits(__buf, __x); } 00129 00130 #if !defined (_STLP_NO_WCHAR_T) 00131 inline void __get_money_digits_aux (__iowstring &__wbuf, ios_base &__f, _STLP_LONGEST_FLOAT_TYPE __x) { 00132 __iostring __buf; 00133 __get_floor_digits(__buf, __x); 00134 00135 const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__f.getloc()); 00136 __convert_float_buffer(__buf, __wbuf, __ct, wchar_t(0), false); 00137 } 00138 #endif 00139 00140 template <class _CharT> 00141 void _STLP_CALL __get_money_digits(_STLP_BASIC_IOSTRING(_CharT) &__buf, ios_base& __f, _STLP_LONGEST_FLOAT_TYPE __x) 00142 { __get_money_digits_aux(__buf, __f, __x); } 00143 00144 // _M_do_put_integer and its helper functions. 00145 00146 template <class _CharT, class _OutputIter> 00147 _OutputIter _STLP_CALL 00148 __copy_integer_and_fill(const _CharT* __buf, ptrdiff_t __len, 00149 _OutputIter __oi, 00150 ios_base::fmtflags __flg, streamsize __wid, _CharT __fill, 00151 _CharT __xplus, _CharT __xminus) { 00152 if (__len >= __wid) 00153 return _STLP_STD::copy(__buf, __buf + __len, __oi); 00154 else { 00155 //casting numeric_limits<ptrdiff_t>::max to streamsize only works is ptrdiff_t is signed or streamsize representation 00156 //is larger than ptrdiff_t one. 00157 _STLP_STATIC_ASSERT((sizeof(streamsize) > sizeof(ptrdiff_t)) || 00158 ((sizeof(streamsize) == sizeof(ptrdiff_t)) && numeric_limits<ptrdiff_t>::is_signed)) 00159 ptrdiff_t __pad = __STATIC_CAST(ptrdiff_t, (min) (__STATIC_CAST(streamsize, (numeric_limits<ptrdiff_t>::max)()), 00160 __STATIC_CAST(streamsize, __wid - __len))); 00161 ios_base::fmtflags __dir = __flg & ios_base::adjustfield; 00162 00163 if (__dir == ios_base::left) { 00164 __oi = _STLP_STD::copy(__buf, __buf + __len, __oi); 00165 return _STLP_PRIV __fill_n(__oi, __pad, __fill); 00166 } 00167 else if (__dir == ios_base::internal && __len != 0 && 00168 (__buf[0] == __xplus || __buf[0] == __xminus)) { 00169 *__oi++ = __buf[0]; 00170 __oi = __fill_n(__oi, __pad, __fill); 00171 return _STLP_STD::copy(__buf + 1, __buf + __len, __oi); 00172 } 00173 else if (__dir == ios_base::internal && __len >= 2 && 00174 (__flg & ios_base::showbase) && 00175 (__flg & ios_base::basefield) == ios_base::hex) { 00176 *__oi++ = __buf[0]; 00177 *__oi++ = __buf[1]; 00178 __oi = __fill_n(__oi, __pad, __fill); 00179 return _STLP_STD::copy(__buf + 2, __buf + __len, __oi); 00180 } 00181 else { 00182 __oi = __fill_n(__oi, __pad, __fill); 00183 return _STLP_STD::copy(__buf, __buf + __len, __oi); 00184 } 00185 } 00186 } 00187 00188 #if !defined (_STLP_NO_WCHAR_T) 00189 // Helper function for wchar_t 00190 template <class _OutputIter> 00191 _OutputIter _STLP_CALL 00192 __put_integer(char* __buf, char* __iend, _OutputIter __s, 00193 ios_base& __f, 00194 ios_base::fmtflags __flags, wchar_t __fill) { 00195 locale __loc = __f.getloc(); 00196 const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__loc); 00197 00198 wchar_t __xplus = __ct.widen('+'); 00199 wchar_t __xminus = __ct.widen('-'); 00200 00201 wchar_t __wbuf[64]; 00202 __ct.widen(__buf, __iend, __wbuf); 00203 ptrdiff_t __len = __iend - __buf; 00204 wchar_t* __eend = __wbuf + __len; 00205 00206 const numpunct<wchar_t>& __np = use_facet<numpunct<wchar_t> >(__loc); 00207 const string& __grouping = __np.grouping(); 00208 00209 if (!__grouping.empty()) { 00210 int __basechars; 00211 if (__flags & ios_base::showbase) 00212 switch (__flags & ios_base::basefield) { 00213 case ios_base::hex: __basechars = 2; break; 00214 case ios_base::oct: __basechars = 1; break; 00215 default: __basechars = 0; 00216 } 00217 else 00218 __basechars = 0; 00219 00220 __len = __insert_grouping(__wbuf, __eend, __grouping, __np.thousands_sep(), 00221 __xplus, __xminus, __basechars); 00222 } 00223 00224 return __copy_integer_and_fill((wchar_t*)__wbuf, __len, __s, 00225 __flags, __f.width(0), __fill, __xplus, __xminus); 00226 } 00227 #endif 00228 00229 // Helper function for char 00230 template <class _OutputIter> 00231 _OutputIter _STLP_CALL 00232 __put_integer(char* __buf, char* __iend, _OutputIter __s, 00233 ios_base& __f, ios_base::fmtflags __flags, char __fill) { 00234 char __grpbuf[64]; 00235 ptrdiff_t __len = __iend - __buf; 00236 00237 const numpunct<char>& __np = use_facet<numpunct<char> >(__f.getloc()); 00238 const string& __grouping = __np.grouping(); 00239 00240 if (!__grouping.empty()) { 00241 int __basechars; 00242 if (__flags & ios_base::showbase) 00243 switch (__flags & ios_base::basefield) { 00244 case ios_base::hex: __basechars = 2; break; 00245 case ios_base::oct: __basechars = 1; break; 00246 default: __basechars = 0; 00247 } 00248 else 00249 __basechars = 0; 00250 00251 // make sure there is room at the end of the buffer 00252 // we pass to __insert_grouping 00253 _STLP_STD::copy(__buf, __iend, (char *) __grpbuf); 00254 __buf = __grpbuf; 00255 __iend = __grpbuf + __len; 00256 __len = __insert_grouping(__buf, __iend, __grouping, __np.thousands_sep(), 00257 '+', '-', __basechars); 00258 } 00259 00260 return __copy_integer_and_fill(__buf, __len, __s, __flags, __f.width(0), __fill, '+', '-'); 00261 } 00262 00263 #if defined (_STLP_LONG_LONG) 00264 typedef _STLP_LONG_LONG __max_int_t; 00265 typedef unsigned _STLP_LONG_LONG __umax_int_t; 00266 #else 00267 typedef long __max_int_t; 00268 typedef unsigned long __umax_int_t; 00269 #endif 00270 00271 _STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_lo(); 00272 _STLP_DECLSPEC const char* _STLP_CALL __hex_char_table_hi(); 00273 00274 template <class _Integer> 00275 inline char* _STLP_CALL 00276 __write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __true_type& /* is_signed */) { 00277 const bool __negative = __x < 0 ; 00278 __max_int_t __temp = __x; 00279 __umax_int_t __utemp = __negative?-__temp:__temp; 00280 00281 for (; __utemp != 0; __utemp /= 10) 00282 *--__ptr = (char)((int)(__utemp % 10) + '0'); 00283 // put sign if needed or requested 00284 if (__negative) 00285 *--__ptr = '-'; 00286 else if (__flags & ios_base::showpos) 00287 *--__ptr = '+'; 00288 return __ptr; 00289 } 00290 00291 template <class _Integer> 00292 inline char* _STLP_CALL 00293 __write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __false_type& /* is_signed */) { 00294 for (; __x != 0; __x /= 10) 00295 *--__ptr = (char)((int)(__x % 10) + '0'); 00296 // put sign if requested 00297 if (__flags & ios_base::showpos) 00298 *--__ptr = '+'; 00299 return __ptr; 00300 } 00301 00302 template <class _Integer> 00303 char* _STLP_CALL 00304 __write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x) { 00305 char* __ptr = __buf; 00306 00307 if (__x == 0) { 00308 *--__ptr = '0'; 00309 if ((__flags & ios_base::showpos) && ((__flags & (ios_base::oct | ios_base::hex)) == 0)) 00310 *--__ptr = '+'; 00311 // oct or hex base shall not be added to the 0 value (see '#' flag in C formating strings) 00312 } 00313 else { 00314 switch (__flags & ios_base::basefield) { 00315 case ios_base::oct: 00316 { 00317 __umax_int_t __temp = __x; 00318 // if the size of integer is less than 8, clear upper part 00319 if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 ) 00320 __temp &= 0xFFFFFFFF; 00321 00322 for (; __temp != 0; __temp >>=3) 00323 *--__ptr = (char)((((unsigned)__temp)& 0x7) + '0'); 00324 00325 // put leading '0' if showbase is set 00326 if (__flags & ios_base::showbase) 00327 *--__ptr = '0'; 00328 } 00329 break; 00330 case ios_base::hex: 00331 { 00332 const char* __table_ptr = (__flags & ios_base::uppercase) ? 00333 __hex_char_table_hi() : __hex_char_table_lo(); 00334 __umax_int_t __temp = __x; 00335 // if the size of integer is less than 8, clear upper part 00336 if ( sizeof(__x) < 8 && sizeof(__umax_int_t) >= 8 ) 00337 __temp &= 0xFFFFFFFF; 00338 00339 for (; __temp != 0; __temp >>=4) 00340 *--__ptr = __table_ptr[((unsigned)__temp & 0xF)]; 00341 00342 if (__flags & ios_base::showbase) { 00343 *--__ptr = __table_ptr[16]; 00344 *--__ptr = '0'; 00345 } 00346 } 00347 break; 00348 //case ios_base::dec: 00349 default: 00350 { 00351 #if defined(__HP_aCC) && (__HP_aCC == 1) 00352 bool _IsSigned = !((_Integer)-1 > 0); 00353 if (_IsSigned) 00354 __ptr = __write_decimal_backward(__ptr, __x, __flags, __true_type() ); 00355 else 00356 __ptr = __write_decimal_backward(__ptr, __x, __flags, __false_type() ); 00357 #else 00358 typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned; 00359 __ptr = __write_decimal_backward(__ptr, __x, __flags, _IsSigned()); 00360 #endif 00361 } 00362 break; 00363 } 00364 } 00365 00366 // return pointer to beginning of the string 00367 return __ptr; 00368 } 00369 00370 template <class _CharT, class _OutputIter, class _Integer> 00371 _OutputIter _STLP_CALL 00372 __do_put_integer(_OutputIter __s, ios_base& __f, _CharT __fill, _Integer __x) { 00373 // buffer size = number of bytes * number of digit necessary in the smallest Standard base (base 8, 3 digits/byte) 00374 // plus the longest base representation '0x' 00375 // Do not use __buf_size to define __buf static buffer, some compilers (HP aCC) do not accept const variable as 00376 // the specification of a static buffer size. 00377 char __buf[sizeof(_Integer) * 3 + 2]; 00378 const ptrdiff_t __buf_size = sizeof(__buf) / sizeof(char); 00379 ios_base::fmtflags __flags = __f.flags(); 00380 char* __ibeg = __write_integer_backward((char*)__buf + __buf_size, __flags, __x); 00381 return __put_integer(__ibeg, (char*)__buf + __buf_size, __s, __f, __flags, __fill); 00382 } 00383 00384 template <class _CharT, class _OutputIter> 00385 _OutputIter _STLP_CALL 00386 __do_put_bool(_OutputIter __s, ios_base& __f, _CharT __fill, bool __x) { 00387 const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__f.getloc()); 00388 00389 basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > __str = __x ? __np.truename() : __np.falsename(); 00390 00391 streamsize __wid = __f.width(0); 00392 if (__str.size() >= __STATIC_CAST(size_t, __wid)) 00393 return _STLP_STD::copy(__str.begin(), __str.end(), __s); 00394 else { 00395 streamsize __pad = __wid - __str.size(); 00396 ios_base::fmtflags __dir = __f.flags() & ios_base::adjustfield; 00397 00398 if (__dir == ios_base::left) { 00399 __s = _STLP_STD::copy(__str.begin(), __str.end(), __s); 00400 return __fill_n(__s, __pad, __fill); 00401 } 00402 else /* covers right and internal padding */ { 00403 __s = __fill_n(__s, __pad, __fill); 00404 return _STLP_STD::copy(__str.begin(), __str.end(), __s); 00405 } 00406 } 00407 } 00408 _STLP_MOVE_TO_STD_NAMESPACE 00409 00410 // 00411 // num_put<> 00412 // 00413 00414 template <class _CharT, class _OutputIterator> 00415 locale::id num_put<_CharT, _OutputIterator>::id; 00416 00417 #if !defined (_STLP_NO_BOOL) 00418 template <class _CharT, class _OutputIter> 00419 _OutputIter 00420 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 00421 bool __val) const { 00422 if (!(__f.flags() & ios_base::boolalpha)) 00423 // 22.2.2.2.2.23: shall return do_put for int and not directly __do_put_integer. 00424 return do_put(__s, __f, __fill, __STATIC_CAST(long, __val)); 00425 00426 return _STLP_PRIV __do_put_bool(__s, __f, __fill, __val); 00427 } 00428 #endif 00429 00430 template <class _CharT, class _OutputIter> 00431 _OutputIter 00432 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 00433 long __val) const 00434 { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 00435 00436 template <class _CharT, class _OutputIter> 00437 _OutputIter 00438 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 00439 unsigned long __val) const 00440 { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 00441 00442 template <class _CharT, class _OutputIter> 00443 _OutputIter 00444 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 00445 double __val) const 00446 { return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); } 00447 00448 #if !defined (_STLP_NO_LONG_DOUBLE) 00449 template <class _CharT, class _OutputIter> 00450 _OutputIter 00451 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 00452 long double __val) const 00453 { return _STLP_PRIV __do_put_float(__s, __f, __fill, __val); } 00454 #endif 00455 00456 #if defined (_STLP_LONG_LONG) 00457 template <class _CharT, class _OutputIter> 00458 _OutputIter 00459 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 00460 _STLP_LONG_LONG __val) const 00461 { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 00462 00463 template <class _CharT, class _OutputIter> 00464 _OutputIter 00465 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 00466 unsigned _STLP_LONG_LONG __val) const 00467 { return _STLP_PRIV __do_put_integer(__s, __f, __fill, __val); } 00468 #endif /* _STLP_LONG_LONG */ 00469 00470 00471 // 22.2.2.2.2 Stage 1: "For conversion from void* the specifier is %p." 00472 // This is not clear and I'm really don't follow this (below). 00473 template <class _CharT, class _OutputIter> 00474 _OutputIter 00475 num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT /*__fill*/, 00476 const void* __val) const { 00477 const ctype<_CharT>& __c_type = use_facet<ctype<_CharT> >(__f.getloc()); 00478 ios_base::fmtflags __save_flags = __f.flags(); 00479 00480 __f.setf(ios_base::hex, ios_base::basefield); 00481 __f.setf(ios_base::showbase); 00482 __f.setf(ios_base::internal, ios_base::adjustfield); 00483 __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix 00484 if ( __val == 0 ) { 00485 // base ('0x') not shown for null, but I really want to type it 00486 // for pointer. Print it first in this case. 00487 const char* __table_ptr = (__save_flags & ios_base::uppercase) ? 00488 _STLP_PRIV __hex_char_table_hi() : _STLP_PRIV __hex_char_table_lo(); 00489 __s++ = __c_type.widen( '0' ); 00490 __s++ = __c_type.widen( __table_ptr[16] ); 00491 __f.width((sizeof(void*) * 2)); // digits in pointer type 00492 } else { 00493 __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix 00494 } 00495 #if defined (_STLP_MSVC) 00496 # pragma warning (push) 00497 # pragma warning (disable : 4311) //pointer truncation from 'const void*' to 'unsigned long' 00498 #endif 00499 _OutputIter result = 00500 #ifdef _WIN64 // ReactOS, compilation with 64 bit gcc 00501 _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val)); 00502 #else 00503 #ifdef _STLP_LONG_LONG 00504 ( sizeof(void*) == sizeof(unsigned long) ) ? 00505 #endif 00506 _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned long,__val)) 00507 #ifdef _STLP_LONG_LONG 00508 : /* ( sizeof(void*) == sizeof(unsigned _STLP_LONG_LONG) ) ? */ 00509 _STLP_PRIV __do_put_integer(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val)) 00510 #endif 00511 ; 00512 #endif 00513 #if defined (_STLP_MSVC) 00514 # pragma warning (pop) 00515 #endif 00516 __f.flags(__save_flags); 00517 return result; 00518 } 00519 00520 _STLP_END_NAMESPACE 00521 00522 #endif /* _STLP_NUM_PUT_C */ 00523 00524 // Local Variables: 00525 // mode:C++ 00526 // End: Generated on Fri May 25 2012 04:27:52 for ReactOS by
1.7.6.1
|