📄 rprintf_8c-source.html
字号:
00191 <span class="keywordtype">char</span> *p, buf[32];00192 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> x;00193 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> count;00194 00195 <span class="comment">// prepare negative number</span>00196 <span class="keywordflow">if</span>( isSigned && (n < 0) )00197 {00198 x = -n;00199 }00200 <span class="keywordflow">else</span>00201 {00202 x = n;00203 }00204 00205 <span class="comment">// setup little string buffer</span>00206 count = (numDigits-1)-(isSigned?1:0);00207 p = buf + <span class="keyword">sizeof</span> (buf);00208 *--p = <span class="charliteral">'\0'</span>;00209 00210 <span class="comment">// force calculation of first digit</span>00211 <span class="comment">// (to prevent zero from not printing at all!!!)</span>00212 *--p = pgm_read_byte(HexChars + (x%base)); x /= base;00213 <span class="comment">// calculate remaining digits</span>00214 <span class="keywordflow">while</span>(count--)00215 {00216 <span class="keywordflow">if</span>(x != 0)00217 {00218 <span class="comment">// calculate next digit</span>00219 *--p = pgm_read_byte(HexChars + (x%base)); x /= base;00220 }00221 <span class="keywordflow">else</span>00222 {00223 <span class="comment">// no more digits left, pad out to desired length</span>00224 *--p = padchar;00225 }00226 }00227 00228 <span class="comment">// apply signed notation if requested</span>00229 <span class="keywordflow">if</span>( isSigned )00230 {00231 <span class="keywordflow">if</span>(n < 0)00232 {00233 *--p = <span class="charliteral">'-'</span>;00234 }00235 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(n > 0)00236 {00237 *--p = <span class="charliteral">'+'</span>;00238 }00239 <span class="keywordflow">else</span>00240 {00241 *--p = <span class="charliteral">' '</span>;00242 }00243 }00244 00245 <span class="comment">// print the string right-justified</span>00246 count = numDigits;00247 <span class="keywordflow">while</span>(count--)00248 {00249 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(*p++);00250 }00251 }00252 00253 <span class="preprocessor">#ifdef RPRINTF_FLOAT</span>00254 <span class="preprocessor"></span><span class="comment">// *** rprintfFloat ***</span>00255 <span class="comment">// floating-point print</span>00256 <span class="keywordtype">void</span> rprintfFloat(<span class="keywordtype">char</span> numDigits, <span class="keywordtype">double</span> x)00257 {00258 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> firstplace = FALSE;00259 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> negative;00260 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i, digit;00261 <span class="keywordtype">double</span> place = 1.0;00262 00263 <span class="comment">// save sign</span>00264 negative = (x<0);00265 <span class="comment">// convert to absolute value</span>00266 x = (x>0)?(x):(-x);00267 00268 <span class="comment">// find starting digit place</span>00269 <span class="keywordflow">for</span>(i=0; i<15; i++)00270 {00271 <span class="keywordflow">if</span>((x/place) < 10.0)00272 <span class="keywordflow">break</span>;00273 <span class="keywordflow">else</span>00274 place *= 10.0;00275 }00276 <span class="comment">// print polarity character</span>00277 <span class="keywordflow">if</span>(negative)00278 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00279 <span class="keywordflow">else</span>00280 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'+'</span>);00281 00282 <span class="comment">// print digits</span>00283 <span class="keywordflow">for</span>(i=0; i<numDigits; i++)00284 {00285 digit = (x/place);00286 00287 <span class="keywordflow">if</span>(digit | firstplace | (place == 1.0))00288 {00289 firstplace = TRUE;00290 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(digit+0x30);00291 }00292 <span class="keywordflow">else</span>00293 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00294 00295 <span class="keywordflow">if</span>(place == 1.0)00296 {00297 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'.'</span>);00298 }00299 00300 x -= (digit*place);00301 place /= 10.0;00302 }00303 }00304 <span class="preprocessor">#endif</span>00305 <span class="preprocessor"></span>00306 <span class="preprocessor">#ifdef RPRINTF_SIMPLE</span>00307 <span class="preprocessor"></span><span class="comment">// *** rprintf1RamRom ***</span>00308 <span class="comment">// called by rprintf() - does a simple printf (supports %d, %x, %c)</span>00309 <span class="comment">// Supports:</span>00310 <span class="comment">// %d - decimal</span>00311 <span class="comment">// %x - hex</span>00312 <span class="comment">// %c - character</span><a name="l00313"></a><a class="code" href="group__rprintf.html#ga11">00313</a> <span class="keywordtype">int</span> <a class="code" href="group__rprintf.html#ga11">rprintf1RamRom</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> stringInRom, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...)00314 {00315 <span class="comment">// simple printf routine</span>00316 <span class="comment">// define a global HexChars or use line below</span>00317 <span class="comment">//static char HexChars[16] = "0123456789ABCDEF";</span>00318 <span class="keywordtype">char</span> format_flag;00319 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> u_val, div_val, base;00320 va_list ap;00321 00322 va_start(ap, format);00323 <span class="keywordflow">for</span> (;;)00324 {00325 <span class="keywordflow">while</span> ((format_flag = READMEMBYTE(stringInRom,format++) ) != <span class="charliteral">'%'</span>)00326 { <span class="comment">// Until '%' or '\0'</span>00327 <span class="keywordflow">if</span> (!format_flag)00328 {00329 va_end(ap);00330 <span class="keywordflow">return</span>(0);00331 }00332 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(format_flag);00333 }00334 00335 <span class="keywordflow">switch</span> (format_flag = READMEMBYTE(stringInRom,format++) )00336 {00337 <span class="keywordflow">case</span> <span class="charliteral">'c'</span>: format_flag = va_arg(ap,<span class="keywordtype">int</span>);00338 <span class="keywordflow">default</span>: <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(format_flag); <span class="keywordflow">continue</span>;00339 <span class="keywordflow">case</span> <span class="charliteral">'d'</span>: base = 10; div_val = 10000; <span class="keywordflow">goto</span> CONVERSION_LOOP;00340 <span class="keywordflow">case</span> <span class="charliteral">'x'</span>: base = 16; div_val = 0x10;00341 00342 CONVERSION_LOOP:00343 u_val = va_arg(ap,<span class="keywordtype">int</span>);00344 <span class="keywordflow">if</span> (format_flag == <span class="charliteral">'d'</span>)00345 {00346 <span class="keywordflow">if</span> (((<span class="keywordtype">int</span>)u_val) < 0)00347 {00348 u_val = - u_val;00349 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'-'</span>);00350 }00351 <span class="keywordflow">while</span> (div_val > 1 && div_val > u_val) div_val /= 10;00352 }00353 <span class="keywordflow">do</span>00354 {00355 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(pgm_read_byte(HexChars+(u_val/div_val)));00356 u_val %= div_val;00357 div_val /= base;00358 } <span class="keywordflow">while</span> (div_val);00359 }00360 }00361 va_end(ap);00362 }00363 <span class="preprocessor">#endif</span>00364 <span class="preprocessor"></span>00365 00366 <span class="preprocessor">#ifdef RPRINTF_COMPLEX</span>00367 <span class="preprocessor"></span><span class="comment">// *** rprintf2RamRom ***</span>00368 <span class="comment">// called by rprintf() - does a more powerful printf (supports %d, %u, %o, %x, %c, %s)</span>00369 <span class="comment">// Supports:</span>00370 <span class="comment">// %d - decimal</span>00371 <span class="comment">// %u - unsigned decimal</span>00372 <span class="comment">// %o - octal</span>00373 <span class="comment">// %x - hex</span>00374 <span class="comment">// %c - character</span>00375 <span class="comment">// %s - strings</span>00376 <span class="comment">// and the width,precision,padding modifiers</span>00377 <span class="comment">// **this printf does not support floating point numbers</span>00378 <span class="keywordtype">int</span> rprintf2RamRom(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> stringInRom, <span class="keyword">const</span> <span class="keywordtype">char</span> *sfmt, ...)00379 {00380 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *f, *bp;00381 <span class="keyword">register</span> <span class="keywordtype">long</span> l;00382 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> u;00383 <span class="keyword">register</span> <span class="keywordtype">int</span> i;00384 <span class="keyword">register</span> <span class="keywordtype">int</span> fmt;00385 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> pad = <span class="charliteral">' '</span>;00386 <span class="keywordtype">int</span> flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0;00387 <span class="keywordtype">int</span> sign = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -