1/* 2 * Copyright (c) 2004-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 27 unchanged lines hidden (view full) --- 36#include "arch/arguments.hh" 37 38using namespace std; 39 40 41void 42Printk(TheISA::Arguments args) 43{ |
44 std::ostream &out = Trace::output(); |
45 char *p = (char *)args++; 46 |
47 ios::fmtflags saved_flags = out.flags(); 48 char old_fill = out.fill(); 49 int old_precision = out.precision(); |
50 51 while (*p) { 52 switch (*p) { 53 case '%': { 54 bool more = true; 55 bool islong = false; 56 bool leftjustify = false; 57 bool format = false; --- 56 unchanged lines hidden (view full) --- 114 case 'u': 115 case 'X': 116 case 'x': 117 case 'O': 118 case 'o': 119 case 'P': 120 case 'p': { 121 if (hexnum) |
122 out << hex; |
123 124 if (octal) |
125 out << oct; |
126 127 if (format) { 128 if (!zero) |
129 out.setf(ios::showbase); |
130 else { 131 if (hexnum) { |
132 out << "0x"; |
133 width -= 2; 134 } else if (octal) { |
135 out << "0"; |
136 width -= 1; 137 } 138 } 139 } 140 141 if (zero) |
142 out.fill('0'); |
143 144 if (width > 0) |
145 out.width(width); |
146 147 if (leftjustify && !zero) |
148 out.setf(ios::left); |
149 150 if (sign) { 151 if (islong) |
152 out << (int64_t)args; |
153 else |
154 out << (int32_t)args; |
155 } else { 156 if (islong) |
157 out << (uint64_t)args; |
158 else |
159 out << (uint32_t)args; |
160 } 161 162 if (zero) |
163 out.fill(' '); |
164 165 if (width > 0) |
166 out.width(0); |
167 |
168 out << dec; |
169 170 ++args; 171 } 172 break; 173 174 case 's': { 175 char *s = (char *)args; 176 if (!s) 177 s = "<NULL>"; 178 179 if (width > 0) |
180 out.width(width); |
181 if (leftjustify) |
182 out.setf(ios::left); |
183 |
184 out << s; |
185 ++args; 186 } 187 break; 188 case 'C': 189 case 'c': { 190 uint64_t mask = (*p == 'C') ? 0xffL : 0x7fL; 191 uint64_t num; 192 int width; --- 4 unchanged lines hidden (view full) --- 197 } else { 198 num = (uint32_t)args; 199 width = sizeof(uint32_t); 200 } 201 202 while (width-- > 0) { 203 char c = (char)(num & mask); 204 if (c) |
205 out << c; |
206 num >>= 8; 207 } 208 209 ++args; 210 } 211 break; 212 case 'b': { 213 uint64_t n = (uint64_t)args++; 214 char *s = (char *)args++; |
215 out << s << ": " << n; |
216 } 217 break; 218 case 'n': 219 case 'N': { 220 args += 2; 221#if 0 222 uint64_t n = (uint64_t)args++; 223 struct reg_values *rv = (struct reg_values *)args++; --- 5 unchanged lines hidden (view full) --- 229 args += 2; 230#if 0 231 uint64_t n = (uint64_t)args++; 232 struct reg_desc *rd = (struct reg_desc *)args++; 233#endif 234 } 235 break; 236 case '%': |
237 out << '%'; |
238 break; 239 } 240 ++p; 241 } 242 break; 243 case '\n': |
244 out << endl; |
245 ++p; 246 break; 247 case '\r': 248 ++p; 249 if (*p != '\n') |
250 out << endl; |
251 break; 252 253 default: { 254 size_t len = strcspn(p, "%\n\r\0"); |
255 out.write(p, len); |
256 p += len; 257 } 258 } 259 } 260 |
261 out.flags(saved_flags); 262 out.fill(old_fill); 263 out.precision(old_precision); |
264} 265 |