annotate DEPENDENCIES/generic/include/boost/format/parsing.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // ----------------------------------------------------------------------------
Chris@16 2 // parsing.hpp : implementation of the parsing member functions
Chris@16 3 // ( parse, parse_printf_directive)
Chris@16 4 // ----------------------------------------------------------------------------
Chris@16 5
Chris@16 6 // Copyright Samuel Krempp 2003. Use, modification, and distribution are
Chris@16 7 // subject to the Boost Software License, Version 1.0. (See accompanying
Chris@16 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9
Chris@16 10 // see http://www.boost.org/libs/format for library home page
Chris@16 11
Chris@16 12 // ----------------------------------------------------------------------------
Chris@16 13
Chris@16 14 #ifndef BOOST_FORMAT_PARSING_HPP
Chris@16 15 #define BOOST_FORMAT_PARSING_HPP
Chris@16 16
Chris@16 17
Chris@16 18 #include <boost/format/format_class.hpp>
Chris@16 19 #include <boost/format/exceptions.hpp>
Chris@16 20 #include <boost/throw_exception.hpp>
Chris@16 21 #include <boost/assert.hpp>
Chris@16 22
Chris@16 23
Chris@16 24 namespace boost {
Chris@16 25 namespace io {
Chris@16 26 namespace detail {
Chris@16 27
Chris@16 28 #if defined(BOOST_NO_STD_LOCALE)
Chris@16 29 // streams will be used for narrow / widen. but these methods are not const
Chris@16 30 template<class T>
Chris@16 31 T& const_or_not(const T& x) {
Chris@16 32 return const_cast<T&> (x);
Chris@16 33 }
Chris@16 34 #else
Chris@16 35 template<class T>
Chris@16 36 const T& const_or_not(const T& x) {
Chris@16 37 return x;
Chris@16 38 }
Chris@16 39 #endif
Chris@16 40
Chris@16 41 template<class Ch, class Facet> inline
Chris@16 42 char wrap_narrow(const Facet& fac, Ch c, char deflt) {
Chris@16 43 return const_or_not(fac).narrow(c, deflt);
Chris@16 44 }
Chris@16 45
Chris@16 46 template<class Ch, class Facet> inline
Chris@16 47 bool wrap_isdigit(const Facet& fac, Ch c) {
Chris@16 48 #if ! defined( BOOST_NO_LOCALE_ISDIGIT )
Chris@16 49 return fac.is(std::ctype<Ch>::digit, c);
Chris@16 50 # else
Chris@16 51 (void) fac; // remove "unused parameter" warning
Chris@16 52 using namespace std;
Chris@16 53 return isdigit(c);
Chris@16 54 #endif
Chris@16 55 }
Chris@16 56
Chris@16 57 template<class Iter, class Facet>
Chris@16 58 Iter wrap_scan_notdigit(const Facet & fac, Iter beg, Iter end) {
Chris@16 59 using namespace std;
Chris@16 60 for( ; beg!=end && wrap_isdigit(fac, *beg); ++beg) ;
Chris@16 61 return beg;
Chris@16 62 }
Chris@16 63
Chris@16 64
Chris@16 65 // Input : [start, last) iterators range and a
Chris@16 66 // a Facet to use its widen/narrow member function
Chris@16 67 // Effects : read sequence and convert digits into integral n, of type Res
Chris@16 68 // Returns : n
Chris@16 69 template<class Res, class Iter, class Facet>
Chris@16 70 Iter str2int (const Iter & start, const Iter & last, Res & res,
Chris@16 71 const Facet& fac)
Chris@16 72 {
Chris@16 73 using namespace std;
Chris@16 74 Iter it;
Chris@16 75 res=0;
Chris@16 76 for(it=start; it != last && wrap_isdigit(fac, *it); ++it ) {
Chris@16 77 char cur_ch = wrap_narrow(fac, *it, 0); // cant fail.
Chris@16 78 res *= 10;
Chris@16 79 res += cur_ch - '0'; // 22.2.1.1.2.13 of the C++ standard
Chris@16 80 }
Chris@16 81 return it;
Chris@16 82 }
Chris@16 83
Chris@16 84 // skip printf's "asterisk-fields" directives in the format-string buf
Chris@16 85 // Input : char string, with starting index *pos_p
Chris@16 86 // a Facet merely to use its widen/narrow member function
Chris@16 87 // Effects : advance *pos_p by skipping printf's asterisk fields.
Chris@16 88 // Returns : nothing
Chris@16 89 template<class Iter, class Facet>
Chris@16 90 Iter skip_asterisk(Iter start, Iter last, const Facet& fac)
Chris@16 91 {
Chris@16 92 using namespace std;
Chris@16 93 ++ start;
Chris@16 94 start = wrap_scan_notdigit(fac, start, last);
Chris@16 95 if(start!=last && *start== const_or_not(fac).widen( '$') )
Chris@16 96 ++start;
Chris@16 97 return start;
Chris@16 98 }
Chris@16 99
Chris@16 100
Chris@16 101 // auxiliary func called by parse_printf_directive
Chris@16 102 // for centralising error handling
Chris@16 103 // it either throws if user sets the corresponding flag, or does nothing.
Chris@16 104 inline void maybe_throw_exception(unsigned char exceptions,
Chris@16 105 std::size_t pos, std::size_t size)
Chris@16 106 {
Chris@16 107 if(exceptions & io::bad_format_string_bit)
Chris@16 108 boost::throw_exception(io::bad_format_string(pos, size) );
Chris@16 109 }
Chris@16 110
Chris@16 111
Chris@16 112 // Input: the position of a printf-directive in the format-string
Chris@16 113 // a basic_ios& merely to use its widen/narrow member function
Chris@16 114 // a bitset'exceptions' telling whether to throw exceptions on errors.
Chris@16 115 // Returns:
Chris@16 116 // true if parse succeeded (ignore some errors if exceptions disabled)
Chris@16 117 // false if it failed so bad that the directive should be printed verbatim
Chris@16 118 // Effects:
Chris@16 119 // start is incremented so that *start is the first char after
Chris@16 120 // this directive
Chris@16 121 // *fpar is set with the parameters read in the directive
Chris@16 122 template<class Ch, class Tr, class Alloc, class Iter, class Facet>
Chris@16 123 bool parse_printf_directive(Iter & start, const Iter& last,
Chris@16 124 detail::format_item<Ch, Tr, Alloc> * fpar,
Chris@16 125 const Facet& fac,
Chris@16 126 std::size_t offset, unsigned char exceptions)
Chris@16 127 {
Chris@16 128 typedef typename basic_format<Ch, Tr, Alloc>::format_item_t format_item_t;
Chris@16 129
Chris@16 130 fpar->argN_ = format_item_t::argN_no_posit; // if no positional-directive
Chris@16 131 bool precision_set = false;
Chris@16 132 bool in_brackets=false;
Chris@16 133 Iter start0 = start;
Chris@16 134 std::size_t fstring_size = last-start0+offset;
Chris@16 135
Chris@16 136 if(start>= last) { // empty directive : this is a trailing %
Chris@16 137 maybe_throw_exception(exceptions, start-start0 + offset, fstring_size);
Chris@16 138 return false;
Chris@16 139 }
Chris@16 140
Chris@16 141 if(*start== const_or_not(fac).widen( '|')) {
Chris@16 142 in_brackets=true;
Chris@16 143 if( ++start >= last ) {
Chris@16 144 maybe_throw_exception(exceptions, start-start0 + offset, fstring_size);
Chris@16 145 return false;
Chris@16 146 }
Chris@16 147 }
Chris@16 148
Chris@16 149 // the flag '0' would be picked as a digit for argument order, but here it's a flag :
Chris@16 150 if(*start== const_or_not(fac).widen( '0'))
Chris@16 151 goto parse_flags;
Chris@16 152
Chris@16 153 // handle argument order (%2$d) or possibly width specification: %2d
Chris@16 154 if(wrap_isdigit(fac, *start)) {
Chris@16 155 int n;
Chris@16 156 start = str2int(start, last, n, fac);
Chris@16 157 if( start >= last ) {
Chris@16 158 maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 159 return false;
Chris@16 160 }
Chris@16 161
Chris@16 162 // %N% case : this is already the end of the directive
Chris@16 163 if( *start == const_or_not(fac).widen( '%') ) {
Chris@16 164 fpar->argN_ = n-1;
Chris@16 165 ++start;
Chris@16 166 if( in_brackets)
Chris@16 167 maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 168 // but don't return. maybe "%" was used in lieu of '$', so we go on.
Chris@16 169 else
Chris@16 170 return true;
Chris@16 171 }
Chris@16 172
Chris@16 173 if ( *start== const_or_not(fac).widen( '$') ) {
Chris@16 174 fpar->argN_ = n-1;
Chris@16 175 ++start;
Chris@16 176 }
Chris@16 177 else {
Chris@16 178 // non-positionnal directive
Chris@16 179 fpar->fmtstate_.width_ = n;
Chris@16 180 fpar->argN_ = format_item_t::argN_no_posit;
Chris@16 181 goto parse_precision;
Chris@16 182 }
Chris@16 183 }
Chris@16 184
Chris@16 185 parse_flags:
Chris@16 186 // handle flags
Chris@16 187 while ( start != last) { // as long as char is one of + - = _ # 0 l h or ' '
Chris@16 188 // misc switches
Chris@16 189 switch ( wrap_narrow(fac, *start, 0)) {
Chris@16 190 case '\'' : break; // no effect yet. (painful to implement)
Chris@16 191 case 'l':
Chris@16 192 case 'h': // short/long modifier : for printf-comaptibility (no action needed)
Chris@16 193 break;
Chris@16 194 case '-':
Chris@16 195 fpar->fmtstate_.flags_ |= std::ios_base::left;
Chris@16 196 break;
Chris@16 197 case '=':
Chris@16 198 fpar->pad_scheme_ |= format_item_t::centered;
Chris@16 199 break;
Chris@16 200 case '_':
Chris@16 201 fpar->fmtstate_.flags_ |= std::ios_base::internal;
Chris@16 202 break;
Chris@16 203 case ' ':
Chris@16 204 fpar->pad_scheme_ |= format_item_t::spacepad;
Chris@16 205 break;
Chris@16 206 case '+':
Chris@16 207 fpar->fmtstate_.flags_ |= std::ios_base::showpos;
Chris@16 208 break;
Chris@16 209 case '0':
Chris@16 210 fpar->pad_scheme_ |= format_item_t::zeropad;
Chris@16 211 // need to know alignment before really setting flags,
Chris@16 212 // so just add 'zeropad' flag for now, it will be processed later.
Chris@16 213 break;
Chris@16 214 case '#':
Chris@16 215 fpar->fmtstate_.flags_ |= std::ios_base::showpoint | std::ios_base::showbase;
Chris@16 216 break;
Chris@16 217 default:
Chris@16 218 goto parse_width;
Chris@16 219 }
Chris@16 220 ++start;
Chris@16 221 } // loop on flag.
Chris@16 222
Chris@16 223 if( start>=last) {
Chris@16 224 maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 225 return true;
Chris@16 226 }
Chris@16 227 parse_width:
Chris@16 228 // handle width spec
Chris@16 229 // first skip 'asterisk fields' : *, or *N$
Chris@16 230 if(*start == const_or_not(fac).widen( '*') )
Chris@16 231 start = skip_asterisk(start, last, fac);
Chris@16 232 if(start!=last && wrap_isdigit(fac, *start))
Chris@16 233 start = str2int(start, last, fpar->fmtstate_.width_, fac);
Chris@16 234
Chris@16 235 parse_precision:
Chris@16 236 if( start>= last) {
Chris@16 237 maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 238 return true;
Chris@16 239 }
Chris@16 240 // handle precision spec
Chris@16 241 if (*start== const_or_not(fac).widen( '.')) {
Chris@16 242 ++start;
Chris@16 243 if(start != last && *start == const_or_not(fac).widen( '*') )
Chris@16 244 start = skip_asterisk(start, last, fac);
Chris@16 245 if(start != last && wrap_isdigit(fac, *start)) {
Chris@16 246 start = str2int(start, last, fpar->fmtstate_.precision_, fac);
Chris@16 247 precision_set = true;
Chris@16 248 }
Chris@16 249 else
Chris@16 250 fpar->fmtstate_.precision_ =0;
Chris@16 251 }
Chris@16 252
Chris@16 253 // handle formatting-type flags :
Chris@16 254 while( start != last && ( *start== const_or_not(fac).widen( 'l')
Chris@16 255 || *start== const_or_not(fac).widen( 'L')
Chris@16 256 || *start== const_or_not(fac).widen( 'h')) )
Chris@16 257 ++start;
Chris@16 258 if( start>=last) {
Chris@16 259 maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 260 return true;
Chris@16 261 }
Chris@16 262
Chris@16 263 if( in_brackets && *start== const_or_not(fac).widen( '|') ) {
Chris@16 264 ++start;
Chris@16 265 return true;
Chris@16 266 }
Chris@16 267 switch ( wrap_narrow(fac, *start, 0) ) {
Chris@16 268 case 'X':
Chris@16 269 fpar->fmtstate_.flags_ |= std::ios_base::uppercase;
Chris@16 270 case 'p': // pointer => set hex.
Chris@16 271 case 'x':
Chris@16 272 fpar->fmtstate_.flags_ &= ~std::ios_base::basefield;
Chris@16 273 fpar->fmtstate_.flags_ |= std::ios_base::hex;
Chris@16 274 break;
Chris@16 275
Chris@16 276 case 'o':
Chris@16 277 fpar->fmtstate_.flags_ &= ~std::ios_base::basefield;
Chris@16 278 fpar->fmtstate_.flags_ |= std::ios_base::oct;
Chris@16 279 break;
Chris@16 280
Chris@16 281 case 'E':
Chris@16 282 fpar->fmtstate_.flags_ |= std::ios_base::uppercase;
Chris@16 283 case 'e':
Chris@16 284 fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield;
Chris@16 285 fpar->fmtstate_.flags_ |= std::ios_base::scientific;
Chris@16 286
Chris@16 287 fpar->fmtstate_.flags_ &= ~std::ios_base::basefield;
Chris@16 288 fpar->fmtstate_.flags_ |= std::ios_base::dec;
Chris@16 289 break;
Chris@16 290
Chris@16 291 case 'f':
Chris@16 292 fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield;
Chris@16 293 fpar->fmtstate_.flags_ |= std::ios_base::fixed;
Chris@16 294 case 'u':
Chris@16 295 case 'd':
Chris@16 296 case 'i':
Chris@16 297 fpar->fmtstate_.flags_ &= ~std::ios_base::basefield;
Chris@16 298 fpar->fmtstate_.flags_ |= std::ios_base::dec;
Chris@16 299 break;
Chris@16 300
Chris@16 301 case 'T':
Chris@16 302 ++start;
Chris@16 303 if( start >= last)
Chris@16 304 maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 305 else
Chris@16 306 fpar->fmtstate_.fill_ = *start;
Chris@16 307 fpar->pad_scheme_ |= format_item_t::tabulation;
Chris@16 308 fpar->argN_ = format_item_t::argN_tabulation;
Chris@16 309 break;
Chris@16 310 case 't':
Chris@16 311 fpar->fmtstate_.fill_ = const_or_not(fac).widen( ' ');
Chris@16 312 fpar->pad_scheme_ |= format_item_t::tabulation;
Chris@16 313 fpar->argN_ = format_item_t::argN_tabulation;
Chris@16 314 break;
Chris@16 315
Chris@16 316 case 'G':
Chris@16 317 fpar->fmtstate_.flags_ |= std::ios_base::uppercase;
Chris@16 318 break;
Chris@16 319 case 'g': // 'g' conversion is default for floats.
Chris@16 320 fpar->fmtstate_.flags_ &= ~std::ios_base::basefield;
Chris@16 321 fpar->fmtstate_.flags_ |= std::ios_base::dec;
Chris@16 322
Chris@16 323 // CLEAR all floatield flags, so stream will CHOOSE
Chris@16 324 fpar->fmtstate_.flags_ &= ~std::ios_base::floatfield;
Chris@16 325 break;
Chris@16 326
Chris@16 327 case 'C':
Chris@16 328 case 'c':
Chris@16 329 fpar->truncate_ = 1;
Chris@16 330 break;
Chris@16 331 case 'S':
Chris@16 332 case 's':
Chris@16 333 if(precision_set) // handle truncation manually, with own parameter.
Chris@16 334 fpar->truncate_ = fpar->fmtstate_.precision_;
Chris@16 335 fpar->fmtstate_.precision_ = 6; // default stream precision.
Chris@16 336 break;
Chris@16 337 case 'n' :
Chris@16 338 fpar->argN_ = format_item_t::argN_ignored;
Chris@16 339 break;
Chris@16 340 default:
Chris@16 341 maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 342 }
Chris@16 343 ++start;
Chris@16 344
Chris@16 345 if( in_brackets ) {
Chris@16 346 if( start != last && *start== const_or_not(fac).widen( '|') ) {
Chris@16 347 ++start;
Chris@16 348 return true;
Chris@16 349 }
Chris@16 350 else maybe_throw_exception(exceptions, start-start0+offset, fstring_size);
Chris@16 351 }
Chris@16 352 return true;
Chris@16 353 }
Chris@16 354 // -end parse_printf_directive()
Chris@16 355
Chris@16 356 template<class String, class Facet>
Chris@16 357 int upper_bound_from_fstring(const String& buf,
Chris@16 358 const typename String::value_type arg_mark,
Chris@16 359 const Facet& fac,
Chris@16 360 unsigned char exceptions)
Chris@16 361 {
Chris@16 362 // quick-parsing of the format-string to count arguments mark (arg_mark, '%')
Chris@16 363 // returns : upper bound on the number of format items in the format strings
Chris@16 364 using namespace boost::io;
Chris@16 365 typename String::size_type i1=0;
Chris@16 366 int num_items=0;
Chris@16 367 while( (i1=buf.find(arg_mark,i1)) != String::npos ) {
Chris@16 368 if( i1+1 >= buf.size() ) {
Chris@16 369 if(exceptions & bad_format_string_bit)
Chris@16 370 boost::throw_exception(bad_format_string(i1, buf.size() )); // must not end in ".. %"
Chris@16 371 else {
Chris@16 372 ++num_items;
Chris@16 373 break;
Chris@16 374 }
Chris@16 375 }
Chris@16 376 if(buf[i1+1] == buf[i1] ) {// escaped "%%"
Chris@16 377 i1+=2; continue;
Chris@16 378 }
Chris@16 379
Chris@16 380 ++i1;
Chris@16 381 // in case of %N% directives, dont count it double (wastes allocations..) :
Chris@16 382 i1 = detail::wrap_scan_notdigit(fac, buf.begin()+i1, buf.end()) - buf.begin();
Chris@16 383 if( i1 < buf.size() && buf[i1] == arg_mark )
Chris@16 384 ++i1;
Chris@16 385 ++num_items;
Chris@16 386 }
Chris@16 387 return num_items;
Chris@16 388 }
Chris@16 389 template<class String> inline
Chris@16 390 void append_string(String& dst, const String& src,
Chris@16 391 const typename String::size_type beg,
Chris@16 392 const typename String::size_type end) {
Chris@16 393 dst.append(src.begin()+beg, src.begin()+end);
Chris@16 394 }
Chris@16 395
Chris@16 396 } // detail namespace
Chris@16 397 } // io namespace
Chris@16 398
Chris@16 399
Chris@16 400
Chris@16 401 // -----------------------------------------------
Chris@16 402 // format :: parse(..)
Chris@16 403
Chris@16 404 template<class Ch, class Tr, class Alloc>
Chris@16 405 basic_format<Ch, Tr, Alloc>& basic_format<Ch, Tr, Alloc>::
Chris@16 406 parse (const string_type& buf) {
Chris@16 407 // parse the format-string
Chris@16 408 using namespace std;
Chris@16 409 #if !defined(BOOST_NO_STD_LOCALE)
Chris@16 410 const std::ctype<Ch> & fac = BOOST_USE_FACET( std::ctype<Ch>, getloc());
Chris@16 411 #else
Chris@16 412 io::basic_oaltstringstream<Ch, Tr, Alloc> fac;
Chris@16 413 //has widen and narrow even on compilers without locale
Chris@16 414 #endif
Chris@16 415
Chris@16 416 const Ch arg_mark = io::detail::const_or_not(fac).widen( '%');
Chris@16 417 bool ordered_args=true;
Chris@16 418 int max_argN=-1;
Chris@16 419
Chris@16 420 // A: find upper_bound on num_items and allocates arrays
Chris@16 421 int num_items = io::detail::upper_bound_from_fstring(buf, arg_mark, fac, exceptions());
Chris@16 422 make_or_reuse_data(num_items);
Chris@16 423
Chris@16 424 // B: Now the real parsing of the format string :
Chris@16 425 num_items=0;
Chris@16 426 typename string_type::size_type i0=0, i1=0;
Chris@16 427 typename string_type::const_iterator it;
Chris@16 428 bool special_things=false;
Chris@16 429 int cur_item=0;
Chris@16 430 while( (i1=buf.find(arg_mark,i1)) != string_type::npos ) {
Chris@16 431 string_type & piece = (cur_item==0) ? prefix_ : items_[cur_item-1].appendix_;
Chris@16 432 if( buf[i1+1] == buf[i1] ) { // escaped mark, '%%'
Chris@16 433 io::detail::append_string(piece, buf, i0, i1+1);
Chris@16 434 i1+=2; i0=i1;
Chris@16 435 continue;
Chris@16 436 }
Chris@16 437 BOOST_ASSERT( static_cast<unsigned int>(cur_item) < items_.size() || cur_item==0);
Chris@16 438
Chris@16 439 if(i1!=i0) {
Chris@16 440 io::detail::append_string(piece, buf, i0, i1);
Chris@16 441 i0=i1;
Chris@16 442 }
Chris@16 443 ++i1;
Chris@16 444 it = buf.begin()+i1;
Chris@16 445 bool parse_ok = io::detail::parse_printf_directive(
Chris@16 446 it, buf.end(), &items_[cur_item], fac, i1, exceptions());
Chris@16 447 i1 = it - buf.begin();
Chris@16 448 if( ! parse_ok ) // the directive will be printed verbatim
Chris@16 449 continue;
Chris@16 450 i0=i1;
Chris@16 451 items_[cur_item].compute_states(); // process complex options, like zeropad, into params
Chris@16 452
Chris@16 453 int argN=items_[cur_item].argN_;
Chris@16 454 if(argN == format_item_t::argN_ignored)
Chris@16 455 continue;
Chris@16 456 if(argN ==format_item_t::argN_no_posit)
Chris@16 457 ordered_args=false;
Chris@16 458 else if(argN == format_item_t::argN_tabulation) special_things=true;
Chris@16 459 else if(argN > max_argN) max_argN = argN;
Chris@16 460 ++num_items;
Chris@16 461 ++cur_item;
Chris@16 462 } // loop on %'s
Chris@16 463 BOOST_ASSERT(cur_item == num_items);
Chris@16 464
Chris@16 465 // store the final piece of string
Chris@16 466 {
Chris@16 467 string_type & piece = (cur_item==0) ? prefix_ : items_[cur_item-1].appendix_;
Chris@16 468 io::detail::append_string(piece, buf, i0, buf.size());
Chris@16 469 }
Chris@16 470
Chris@16 471 if( !ordered_args) {
Chris@16 472 if(max_argN >= 0 ) { // dont mix positional with non-positionnal directives
Chris@16 473 if(exceptions() & io::bad_format_string_bit)
Chris@101 474 boost::throw_exception(
Chris@101 475 io::bad_format_string(static_cast<std::size_t>(max_argN), 0));
Chris@16 476 // else do nothing. => positionnal arguments are processed as non-positionnal
Chris@16 477 }
Chris@16 478 // set things like it would have been with positional directives :
Chris@16 479 int non_ordered_items = 0;
Chris@16 480 for(int i=0; i< num_items; ++i)
Chris@16 481 if(items_[i].argN_ == format_item_t::argN_no_posit) {
Chris@16 482 items_[i].argN_ = non_ordered_items;
Chris@16 483 ++non_ordered_items;
Chris@16 484 }
Chris@16 485 max_argN = non_ordered_items-1;
Chris@16 486 }
Chris@16 487
Chris@16 488 // C: set some member data :
Chris@16 489 items_.resize(num_items, format_item_t(io::detail::const_or_not(fac).widen( ' ')) );
Chris@16 490
Chris@16 491 if(special_things) style_ |= special_needs;
Chris@16 492 num_args_ = max_argN + 1;
Chris@16 493 if(ordered_args) style_ |= ordered;
Chris@16 494 else style_ &= ~ordered;
Chris@16 495 return *this;
Chris@16 496 }
Chris@16 497
Chris@16 498 } // namespace boost
Chris@16 499
Chris@16 500
Chris@16 501 #endif // BOOST_FORMAT_PARSING_HPP