format.c
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:12k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. //
  2. // Copyright (c) Microsoft Corporation.  All rights reserved.
  3. //
  4. //
  5. // Use of this source code is subject to the terms of the Microsoft end-user
  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. // If you did not accept the terms of the EULA, you are not authorized to use
  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. // install media.
  10. //
  11. /*++
  12. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  13. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  14. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  15. PARTICULAR PURPOSE.
  16. Module Name:  
  17.     format.c
  18. Abstract:  
  19.     This file contains simple formatted output string support for the
  20.     boot loader.
  21. Functions:
  22. Notes: 
  23.     supported, with no frills: x d s u X, H, and B
  24.     backslash n is converted to backslash n backslash r.
  25.     X is equivalent to 08x; B, 02x; and H, 04x in printf format.
  26. --*/
  27. #include <windows.h>
  28. #include <blcommon.h>
  29. //
  30. // Functional Prototypes
  31. //
  32. static void pOutputByte(unsigned char c);
  33. static void pOutputNumHex(unsigned long n,long depth);
  34. static void pOutputNumDecimal(unsigned long n);
  35. static void OutputString(const unsigned char *s);
  36. char *szSprintf;
  37. //
  38. // Routine starts
  39. //
  40. /*****************************************************************************
  41. *
  42. *
  43. *   @func   void    | EdbgOutputDebugString | Simple formatted debug output string routine
  44. *
  45. *   @rdesc  none
  46. *
  47. *   @parm   LPCSTR  |   sz,... |
  48. *               Format String:
  49. *
  50. *               @flag Format string | type
  51. *               @flag u | unsigned
  52. *               @flag d | int
  53. *               @flag c | char
  54. *               @flag s | string
  55. *               @flag x | 4-bit hex number
  56. *               @flag B | 8-bit hex number
  57. *               @flag H | 16-bit hex number
  58. *               @flag X | 32-bit hex number
  59. *
  60. *   @comm
  61. *           Same as FormatString, but output to serial port instead of buffer.
  62. */
  63. void EdbgOutputDebugString (LPCSTR sz, ...)
  64. {
  65.     unsigned char    c;
  66.     va_list         vl;
  67.     
  68.     va_start(vl, sz);
  69.     
  70.     while (*sz) {
  71.         c = *sz++;
  72.         switch (c) {
  73.         case '%':
  74.             c = *sz++;
  75.             switch (c) { 
  76.             case 'x':
  77.                 pOutputNumHex(va_arg(vl, unsigned long), 0);
  78.                 break;
  79.             case 'B':
  80.                 pOutputNumHex(va_arg(vl, unsigned long), 2);
  81.                 break;
  82.             case 'H':
  83.                 pOutputNumHex(va_arg(vl, unsigned long), 4);
  84.                 break;
  85.             case 'X':
  86.                 pOutputNumHex(va_arg(vl, unsigned long), 8);
  87.                 break;
  88.             case 'd':
  89.                 {
  90.                     long    l;
  91.                 
  92.                     l = va_arg(vl, long);
  93.                     if (l < 0) { 
  94.                         pOutputByte('-');
  95.                         l = - l;
  96.                     }
  97.                     pOutputNumDecimal((unsigned long)l);
  98.                 }
  99.                 break;
  100.             case 'u':
  101.                 pOutputNumDecimal(va_arg(vl, unsigned long));
  102.                 break;
  103.             case 's':
  104.                 OutputString(va_arg(vl, char *));
  105.                 break;
  106.             case '%':
  107.                 pOutputByte('%');
  108.                 break;
  109.             case 'c':
  110.                 c = va_arg(vl, unsigned char);
  111.                 pOutputByte(c);
  112.                 break;
  113.                 
  114.             default:
  115.                 pOutputByte(' ');
  116.                 break;
  117.             }
  118.             break;
  119.         case 'r':
  120.             if (*sz == 'n')
  121.                 sz ++;
  122.             c = 'n';
  123.             // fall through
  124.         case 'n':
  125.             pOutputByte('r');
  126.             // fall through
  127.         default:
  128.             pOutputByte(c);
  129.         }
  130.     }
  131.     
  132.     va_end(vl);
  133. }
  134. /*****************************************************************************
  135. *
  136. *
  137. *   @func   void    |   FormatString | Simple formatted output string routine
  138. *
  139. *   @rdesc  Returns length of formatted string
  140. *
  141. *   @parm   unsigned char * |   pBuf |
  142. *               Pointer to string to return formatted output.  User must ensure
  143. *               that buffer is large enough.
  144. *
  145. *   @parm   const unsigned char * |   sz,... |
  146. *               Format String:
  147. *
  148. *               @flag Format string | type
  149. *               @flag u | unsigned
  150. *               @flag d | int
  151. *               @flag c | char
  152. *               @flag s | string
  153. *               @flag x | 4-bit hex number
  154. *               @flag B | 8-bit hex number
  155. *               @flag H | 16-bit hex number
  156. *               @flag X | 32-bit hex number
  157. *
  158. *   @comm
  159. *           Same as OutputFormatString, but output to buffer instead of serial port.
  160. */
  161. unsigned int FormatString (unsigned char *pBuf, const unsigned char *sz, ...)
  162. {
  163.     unsigned char    c;
  164.     va_list         vl;
  165.     
  166.     va_start(vl, sz);
  167.     
  168.     szSprintf = pBuf;
  169.     while (*sz) {
  170.         c = *sz++;
  171.         switch (c) {
  172.         case '%':
  173.             c = *sz++;
  174.             switch (c) { 
  175.             case 'x':
  176.                 pOutputNumHex(va_arg(vl, unsigned long), 0);
  177.                 break;
  178.             case 'B':
  179.                 pOutputNumHex(va_arg(vl, unsigned long), 2);
  180.                 break;
  181.             case 'H':
  182.                 pOutputNumHex(va_arg(vl, unsigned long), 4);
  183.                 break;
  184.             case 'X':
  185.                 pOutputNumHex(va_arg(vl, unsigned long), 8);
  186.                 break;
  187.             case 'd':
  188.                 {
  189.                     long    l;
  190.                 
  191.                     l = va_arg(vl, long);
  192.                     if (l < 0) { 
  193.                         pOutputByte('-');
  194.                         l = - l;
  195.                     }
  196.                     pOutputNumDecimal((unsigned long)l);
  197.                 }
  198.                 break;
  199.             case 'u':
  200.                 pOutputNumDecimal(va_arg(vl, unsigned long));
  201.                 break;
  202.             case 's':
  203.                 OutputString(va_arg(vl, char *));
  204.                 break;
  205.             case '%':
  206.                 pOutputByte('%');
  207.                 break;
  208.             case 'c':
  209.                 c = va_arg(vl, unsigned char);
  210.                 pOutputByte(c);
  211.                 break;
  212.                 
  213.             default:
  214.                 pOutputByte(' ');
  215.                 break;
  216.             }
  217.             break;
  218.         case 'r':
  219.             if (*sz == 'n')
  220.                 sz ++;
  221.             c = 'n';
  222.             // fall through
  223.         case 'n':
  224.             pOutputByte('r');
  225.             // fall through
  226.         default:
  227.             pOutputByte(c);
  228.         }
  229.     }
  230.     pOutputByte(0);
  231.     c = szSprintf - pBuf;
  232.     szSprintf = 0;
  233.     va_end(vl);
  234.     return (c);
  235. }
  236. /*****************************************************************************
  237. *
  238. *
  239. *   @func   void    |   pOutputByte | Sends a byte out of the monitor port.
  240. *
  241. *   @rdesc  none
  242. *
  243. *   @parm   unsigned int |   c |
  244. *               Byte to send.
  245. *
  246. */
  247. static void
  248. pOutputByte(
  249.     unsigned char c
  250. )
  251. {
  252.     if (szSprintf)
  253.         *szSprintf++ = c;
  254.     else
  255.         OEMWriteDebugByte(c);
  256. }
  257. /*****************************************************************************
  258. *
  259. *
  260. *   @func   void    |   pOutputNumHex | Print the hex representation of a number through the monitor port.
  261. *
  262. *   @rdesc  none
  263. *
  264. *   @parm   unsigned long |   n |
  265. *               The number to print.
  266. *
  267. *   @parm   long | depth |
  268. *               Minimum number of digits to print.
  269. *
  270. */
  271. static void pOutputNumHex (unsigned long n, long depth)
  272. {
  273.     if (depth) {
  274.         depth--;
  275.     }
  276.     
  277.     if ((n & ~0xf) || depth) {
  278.         pOutputNumHex(n >> 4, depth);
  279.         n &= 0xf;
  280.     }
  281.     
  282.     if (n < 10) {
  283.         pOutputByte((unsigned char)(n + '0'));
  284.     } else { 
  285.     pOutputByte((unsigned char)(n - 10 + 'A'));
  286. }
  287. }
  288. /*****************************************************************************
  289. *
  290. *
  291. *   @func   void    |   pOutputNumDecimal | Print the decimal representation of a number through the monitor port.
  292. *
  293. *   @rdesc  none
  294. *
  295. *   @parm   unsigned long |   n |
  296. *               The number to print.
  297. *
  298. */
  299. static void pOutputNumDecimal (unsigned long n)
  300. {
  301.     if (n >= 10) {
  302.         pOutputNumDecimal(n / 10);
  303.         n %= 10;
  304.     }
  305.     pOutputByte((unsigned char)(n + '0'));
  306. }
  307. /*****************************************************************************
  308. *
  309. *
  310. *   @func   void    |   OutputString | Sends an unformatted string to the monitor port.
  311. *
  312. *   @rdesc  none
  313. *
  314. *   @parm   const unsigned char * |   s |
  315. *               points to the string to be printed.
  316. *
  317. *   @comm
  318. *           backslash n is converted to backslash r backslash n
  319. */
  320. static void OutputString (const unsigned char *s)
  321. {
  322.     while (*s) {        
  323.         if (*s == 'n') {
  324.             OEMWriteDebugByte('r');
  325.         }
  326.         OEMWriteDebugByte(*s++);
  327.     }
  328. }
  329. // This routine will take a binary IP address as represent here and return a dotted decimal version of it
  330. char *inet_ntoa( DWORD dwIP ) {
  331.     static char szDottedD[16];
  332.     FormatString( szDottedD, "%u.%u.%u.%u",
  333.         (BYTE)dwIP, (BYTE)(dwIP >> 8), (BYTE)(dwIP >> 16), (BYTE)(dwIP >> 24) );
  334.     return szDottedD;
  335. } // inet_ntoa()
  336. // This routine will take a dotted decimal IP address as represent here and return a binary version of it
  337. DWORD inet_addr( char *pszDottedD ) {
  338.     DWORD dwIP = 0;
  339.     DWORD cBytes;
  340.     char *pszLastNum;
  341.     int atoi (const char *s);
  342.     
  343.     // Replace the dots with NULL terminators
  344.     pszLastNum = pszDottedD;
  345.     for( cBytes = 0; cBytes < 4; cBytes++ ) {
  346.         while(*pszDottedD != '.' && *pszDottedD != '')
  347.             pszDottedD++;
  348.         if (pszDottedD == '' && cBytes != 3)
  349.             return 0;
  350.         *pszDottedD = '';
  351.         dwIP |= (atoi(pszLastNum) & 0xFF) << (8*cBytes);
  352.         pszLastNum = ++pszDottedD;
  353.     }
  354.     return dwIP;
  355. } // inet_ntoa()
  356. /*****************************************************************************
  357. *
  358. *   Function: NKDbgPrintfW
  359. *
  360. *   Description: Formats and writes a wide character string to the serial port
  361. *
  362. *   Parameters: sz - pointer to wide character string
  363. *
  364. *   Returns: Nothing
  365. *
  366. */
  367. #ifndef SIMULATOR
  368. void NKDbgPrintfW(
  369.     const WCHAR *sz, ...)
  370. {
  371.     unsigned char    c;
  372.     va_list         vl;
  373.     
  374.     va_start(vl, sz);
  375.     
  376.     while (*sz) {
  377.         c = (unsigned char)*sz++;
  378.         switch (c) { 
  379.             case (unsigned char)'%':
  380.             c = (unsigned char)*sz++;
  381.             switch (c) { 
  382.                 case 'x':
  383.                 pOutputNumHex(va_arg(vl, unsigned long), 0);
  384.                 break;
  385.                 case 'B':
  386.                 pOutputNumHex(va_arg(vl, unsigned long), 2);
  387.                 break;
  388.                 case 'H':
  389.                 pOutputNumHex(va_arg(vl, unsigned long), 4);
  390.                 break;
  391.                 case 'X':
  392.                 pOutputNumHex(va_arg(vl, unsigned long), 8);
  393.                 break;
  394.                 case 'd': {
  395.                 long    l;
  396.                 
  397.                 l = va_arg(vl, long);
  398.                 if (l < 0) { 
  399.                     pOutputByte('-');
  400.                     l = - l;
  401.                 }
  402.                 pOutputNumDecimal((unsigned long)l);
  403.             }
  404.                 break;
  405.                 case 'u':
  406.                 pOutputNumDecimal(va_arg(vl, unsigned long));
  407.                 break;
  408.                 case 's':
  409.                 OutputString(va_arg(vl, char *));
  410.                 break;
  411.                 case '%':
  412.                 pOutputByte('%');
  413.                 break;
  414.                 case 'c':
  415.                 c = va_arg(vl, unsigned char);
  416.                 pOutputByte(c);
  417.                 break;
  418.                 
  419.                 default:
  420.                 pOutputByte(' ');
  421.                 break;
  422.             }
  423.             break;
  424.             case 'n':
  425.             pOutputByte('r');
  426.             // fall through
  427.             default:
  428.             pOutputByte(c);
  429.         }
  430.     }
  431.     
  432.     va_end(vl);
  433. }
  434. #endif