cprintf.cc

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 286 行

CC
286
字号
/* * Copyright (c) 2002, 2003, 2004, 2005, 2006 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Nathan L. Binkert */#include <cassert>#include <iomanip>#include <iostream>#include <sstream>#include "base/cprintf.hh"using namespace std;namespace cp {Print::Print(std::ostream &stream, const std::string &format)    : stream(stream), format(format.c_str()), ptr(format.c_str()){    saved_flags = stream.flags();    saved_fill = stream.fill();    saved_precision = stream.precision();}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(){}voidPrint::process(Format &fmt){    size_t len;    while (*ptr) {        switch (*ptr) {          case '%':            if (ptr[1] != '%')                goto processing;            stream.put('%');            ptr += 2;            break;          case '\n':            stream << endl;            ++ptr;            break;          case '\r':            ++ptr;            if (*ptr != '\n')                stream << endl;            break;          default:            len = strcspn(ptr, "%\n\r\0");            stream.write(ptr, len);            ptr += len;            break;        }    }    return;  processing:    bool done = false;    bool end_number = false;    bool have_precision = false;    int number = 0;    stream.fill(' ');    stream.flags((ios::fmtflags)0);    while (!done) {        ++ptr;        if (*ptr >= '0' && *ptr <= '9') {            if (end_number)                continue;        } else if (number > 0)            end_number = true;        switch (*ptr) {          case 's':            fmt.format = Format::string;            done = true;            break;          case 'c':            fmt.format = Format::character;            done = true;            break;          case 'l':            continue;          case 'p':            fmt.format = Format::integer;            fmt.base = Format::hex;            fmt.alternate_form = true;            done = true;            break;          case 'X':            fmt.uppercase = true;          case 'x':            fmt.base = Format::hex;            fmt.format = Format::integer;            done = true;            break;          case 'o':            fmt.base = Format::oct;            fmt.format = Format::integer;            done = true;            break;          case 'd':          case 'i':          case 'u':            fmt.format = Format::integer;            done = true;            break;          case 'G':            fmt.uppercase = true;          case 'g':            fmt.format = Format::floating;            fmt.float_format = Format::best;            done = true;            break;          case 'E':            fmt.uppercase = true;          case 'e':            fmt.format = Format::floating;            fmt.float_format = Format::scientific;            done = true;            break;          case 'f':            fmt.format = Format::floating;            fmt.float_format = Format::fixed;            done = true;            break;          case 'n':            stream << "we don't do %n!!!\n";            done = true;            break;          case '#':            fmt.alternate_form = true;            break;          case '-':            fmt.flush_left = true;            break;          case '+':            fmt.print_sign = true;            break;          case ' ':            fmt.blank_space = true;            break;          case '.':            fmt.width = number;            fmt.precision = 0;            have_precision = true;            number = 0;            end_number = false;            break;          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;          case '%':            assert("we shouldn't get here");            break;          default:            done = true;            break;        }        if (end_number) {            if (have_precision)                fmt.precision = number;            else                fmt.width = number;            end_number = false;            number = 0;        }    }    ++ptr;}voidPrint::end_args(){    size_t len;    while (*ptr) {        switch (*ptr) {          case '%':            if (ptr[1] != '%')                stream << "<extra arg>";            stream.put('%');            ptr += 2;            break;          case '\n':            stream << endl;            ++ptr;            break;          case '\r':            ++ptr;            if (*ptr != '\n')                stream << endl;            break;          default:            len = strcspn(ptr, "%\n\r\0");            stream.write(ptr, len);            ptr += len;            break;        }    }    stream.flags(saved_flags);    stream.fill(saved_fill);    stream.precision(saved_precision);}/* end namespace cp */ }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?