2c2
< * Copyright (c) 2002-2005 The Regents of The University of Michigan
---
> * Copyright (c) 2002-2006 The Regents of The University of Michigan
42c42,43
< ArgList::~ArgList()
---
> Print::Print(std::ostream &stream, const std::string &format)
> : stream(stream), format(format.c_str()), ptr(format.c_str())
44,47c45,47
< while (!objects.empty()) {
< delete objects.front();
< objects.pop_front();
< }
---
> saved_flags = stream.flags();
> saved_fill = stream.fill();
> saved_precision = stream.precision();
49a50,61
> Print::Print(std::ostream &stream, const char *format)
> : stream(stream), format(format), ptr(format)
> {
> saved_flags = stream.flags();
> saved_fill = stream.fill();
> saved_precision = stream.precision();
> }
>
> Print::~Print()
> {
> }
>
51c63
< ArgList::dump(const string &format)
---
> Print::process(Format &fmt)
53,54c65
< list_t::iterator iter = objects.begin();
< list_t::iterator end = objects.end();
---
> size_t len;
56c67,71
< const char *p = format.c_str();
---
> while (*ptr) {
> switch (*ptr) {
> case '%':
> if (ptr[1] != '%')
> goto processing;
58,59c73,75
< stream->fill(' ');
< stream->flags((ios::fmtflags)0);
---
> stream.put('%');
> ptr += 2;
> break;
61,68c77,85
< while (*p) {
< switch (*p) {
< case '%': {
< if (p[1] == '%') {
< *stream << '%';
< p += 2;
< continue;
< }
---
> case '\n':
> stream << endl;
> ++ptr;
> break;
> case '\r':
> ++ptr;
> if (*ptr != '\n')
> stream << endl;
> break;
70,74c87,93
< Format fmt;
< bool done = false;
< bool end_number = false;
< bool have_precision = false;
< int number = 0;
---
> default:
> len = strcspn(ptr, "%\n\r\0");
> stream.write(ptr, len);
> ptr += len;
> break;
> }
> }
76,82c95
< while (!done) {
< ++p;
< if (*p >= '0' && *p <= '9') {
< if (end_number)
< continue;
< } else if (number > 0)
< end_number = true;
---
> return;
84,88c97,101
< switch (*p) {
< case 's':
< fmt.format = Format::string;
< done = true;
< break;
---
> processing:
> bool done = false;
> bool end_number = false;
> bool have_precision = false;
> int number = 0;
90,93c103,104
< case 'c':
< fmt.format = Format::character;
< done = true;
< break;
---
> stream.fill(' ');
> stream.flags((ios::fmtflags)0);
95,96c106,112
< case 'l':
< continue;
---
> while (!done) {
> ++ptr;
> if (*ptr >= '0' && *ptr <= '9') {
> if (end_number)
> continue;
> } else if (number > 0)
> end_number = true;
98,103c114,118
< case 'p':
< fmt.format = Format::integer;
< fmt.base = Format::hex;
< fmt.alternate_form = true;
< done = true;
< break;
---
> switch (*ptr) {
> case 's':
> fmt.format = Format::string;
> done = true;
> break;
105,111c120,123
< case 'X':
< fmt.uppercase = true;
< case 'x':
< fmt.base = Format::hex;
< fmt.format = Format::integer;
< done = true;
< break;
---
> case 'c':
> fmt.format = Format::character;
> done = true;
> break;
113,117c125,126
< case 'o':
< fmt.base = Format::oct;
< fmt.format = Format::integer;
< done = true;
< break;
---
> case 'l':
> continue;
119,124c128,133
< case 'd':
< case 'i':
< case 'u':
< fmt.format = Format::integer;
< done = true;
< break;
---
> case 'p':
> fmt.format = Format::integer;
> fmt.base = Format::hex;
> fmt.alternate_form = true;
> done = true;
> break;
126,132c135,141
< case 'G':
< fmt.uppercase = true;
< case 'g':
< fmt.format = Format::floating;
< fmt.float_format = Format::best;
< done = true;
< break;
---
> case 'X':
> fmt.uppercase = true;
> case 'x':
> fmt.base = Format::hex;
> fmt.format = Format::integer;
> done = true;
> break;
134,140c143,147
< case 'E':
< fmt.uppercase = true;
< case 'e':
< fmt.format = Format::floating;
< fmt.float_format = Format::scientific;
< done = true;
< break;
---
> case 'o':
> fmt.base = Format::oct;
> fmt.format = Format::integer;
> done = true;
> break;
142,146c149,154
< case 'f':
< fmt.format = Format::floating;
< fmt.float_format = Format::fixed;
< done = true;
< break;
---
> case 'd':
> case 'i':
> case 'u':
> fmt.format = Format::integer;
> done = true;
> break;
148,151c156,162
< case 'n':
< *stream << "we don't do %n!!!\n";
< done = true;
< break;
---
> case 'G':
> fmt.uppercase = true;
> case 'g':
> fmt.format = Format::floating;
> fmt.float_format = Format::best;
> done = true;
> break;
153,155c164,170
< case '#':
< fmt.alternate_form = true;
< break;
---
> case 'E':
> fmt.uppercase = true;
> case 'e':
> fmt.format = Format::floating;
> fmt.float_format = Format::scientific;
> done = true;
> break;
157,159c172,176
< case '-':
< fmt.flush_left = true;
< break;
---
> case 'f':
> fmt.format = Format::floating;
> fmt.float_format = Format::fixed;
> done = true;
> break;
161,163c178,181
< case '+':
< fmt.print_sign = true;
< break;
---
> case 'n':
> stream << "we don't do %n!!!\n";
> done = true;
> break;
165,167c183,185
< case ' ':
< fmt.blank_space = true;
< break;
---
> case '#':
> fmt.alternate_form = true;
> break;
169,175c187,189
< case '.':
< fmt.width = number;
< fmt.precision = 0;
< have_precision = true;
< number = 0;
< end_number = false;
< break;
---
> case '-':
> fmt.flush_left = true;
> break;
177,192c191,193
< case '0':
< if (number == 0) {
< fmt.fill_zero = true;
< break;
< }
< case '1':
< case '2':
< case '3':
< case '4':
< case '5':
< case '6':
< case '7':
< case '8':
< case '9':
< number = number * 10 + (*p - '0');
< break;
---
> case '+':
> fmt.print_sign = true;
> break;
194,196c195,197
< case '%':
< assert("we shouldn't get here");
< break;
---
> case ' ':
> fmt.blank_space = true;
> break;
198,201c199,205
< default:
< done = true;
< break;
< }
---
> case '.':
> fmt.width = number;
> fmt.precision = 0;
> have_precision = true;
> number = 0;
> end_number = false;
> break;
203,207c207,222
< if (end_number) {
< if (have_precision)
< fmt.precision = number;
< else
< fmt.width = number;
---
> case '0':
> if (number == 0) {
> fmt.fill_zero = true;
> break;
> }
> case '1':
> case '2':
> case '3':
> case '4':
> case '5':
> case '6':
> case '7':
> case '8':
> case '9':
> number = number * 10 + (*ptr - '0');
> break;
209,212c224,226
< end_number = false;
< number = 0;
< }
< }
---
> case '%':
> assert("we shouldn't get here");
> break;
214,218c228,231
< if (iter != end)
< {
< ios::fmtflags saved_flags = stream->flags();
< char old_fill = stream->fill();
< int old_precision = stream->precision();
---
> default:
> done = true;
> break;
> }
220c233,237
< (*iter)->process(*stream, fmt);
---
> if (end_number) {
> if (have_precision)
> fmt.precision = number;
> else
> fmt.width = number;
222,224c239,242
< stream->flags(saved_flags);
< stream->fill(old_fill);
< stream->precision(old_precision);
---
> end_number = false;
> number = 0;
> }
> }
226,229c244,245
< ++iter;
< } else {
< *stream << "<missing arg for format>";
< }
---
> ++ptr;
> }
231,232c247,259
< ++p;
< }
---
> void
> Print::end_args()
> {
> size_t len;
>
> while (*ptr) {
> switch (*ptr) {
> case '%':
> if (ptr[1] != '%')
> stream << "<extra arg>";
>
> stream.put('%');
> ptr += 2;
236,237c263,264
< *stream << endl;
< ++p;
---
> stream << endl;
> ++ptr;
240,242c267,269
< ++p;
< if (*p != '\n')
< *stream << endl;
---
> ++ptr;
> if (*ptr != '\n')
> stream << endl;
245,249c272,275
< default: {
< size_t len = strcspn(p, "%\n\r\0");
< stream->write(p, len);
< p += len;
< }
---
> default:
> len = strcspn(ptr, "%\n\r\0");
> stream.write(ptr, len);
> ptr += len;
254,257c280,282
< while (iter != end) {
< *stream << "<extra arg>";
< ++iter;
< }
---
> stream.flags(saved_flags);
> stream.fill(saved_fill);
> stream.precision(saved_precision);
260,270c285
< string
< ArgList::dumpToString(const string &format)
< {
< stringstream ss;
<
< dump(ss, format);
<
< return ss.str();
< }
<
< }
---
> /* end namespace cp */ }