vsprintf.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: vsprintf.c 271 2005-08-09 08:31:35Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. int vsprintf(tchar_t *s0, const tchar_t *fmt, va_list args)
  25. {
  26. tchar_t Num[80];
  27. tchar_t *s;
  28. for (s=s0;*fmt;++fmt)
  29. {
  30. if (fmt[0]=='%' && fmt[1])
  31. {
  32. const tchar_t *str;
  33. bool_t Left = 0;
  34. bool_t Sign = 0;
  35. bool_t Large = 0;
  36. bool_t ZeroPad = 0;
  37. int Width = -1;
  38. int Type = -1;
  39. int Base = 10;
  40. tchar_t ch,cs;
  41. int Len;
  42. long n;
  43. for (;;)
  44. {
  45. switch (*(++fmt)) 
  46. {
  47. case '-': Left = 1; continue;
  48. case '0': ZeroPad = 1; continue;
  49. default: break;
  50. }
  51. break;
  52. }
  53. if (IsDigit(*fmt))
  54. {
  55. Width = 0;
  56. for (;IsDigit(*fmt);++fmt)
  57. Width = Width*10 + (*fmt-'0');
  58. }
  59. else
  60. if (*fmt == '*')
  61. {
  62. ++fmt;
  63. Width = va_arg(args, int);
  64. if (Width < 0)
  65. {
  66. Left = 1;
  67. Width = -Width;
  68. }
  69. }
  70. if (*fmt == 'h' || 
  71. *fmt == 'L' ||
  72. *fmt == 'l')
  73. Type = *(fmt++);
  74. switch (*fmt)
  75. {
  76. case 'c':
  77. for (;!Left && Width>1;--Width)
  78. *(s++) = ' ';
  79. *(s++) = (char)va_arg(args,int);
  80. for (;Width>1;--Width)
  81. *(s++) = ' ';
  82. continue;
  83. case 's':
  84. str = va_arg(args,const tchar_t*);
  85. if (!s)
  86. str = T("<NULL>");
  87. Len = tcslen(str);
  88. for (;!Left && Width>Len;--Width)
  89. *(s++) = ' ';
  90. for (;Len>0;--Len,--Width)
  91. *(s++) = *(str++);
  92. for (;Width>0;--Width)
  93. *(s++) = ' ';
  94. continue;
  95. case 'o':
  96. Base = 8;
  97. break;
  98. case 'X':
  99. Large = 1;
  100. case 'x':
  101. Base = 16;
  102. break;
  103. case 'i':
  104. case 'd':
  105. Sign = 1;
  106. case 'u':
  107. break;
  108. default:
  109. if (*fmt != '%')
  110. *(s++) = '%';
  111. *(s++) = *fmt;
  112. continue;
  113. }
  114. if (Type == 'l')
  115. n = va_arg(args,unsigned long);
  116. else
  117. if (Type == 'h')
  118. if (Sign)
  119. n = (short)va_arg(args,int);
  120. else
  121. n = (unsigned short)va_arg(args,unsigned int);
  122. else
  123. if (Sign)
  124. n = va_arg(args,int);
  125. else
  126. n= va_arg(args,unsigned int);
  127. if (Left)
  128. ZeroPad = 0;
  129. if (Large)
  130. str = T("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  131. else
  132. str = T("0123456789abcdefghijklmnopqrstuvwxyz");
  133. ch = ' ';
  134. if (ZeroPad)
  135. ch = '0';
  136. cs = 0;
  137. if (n<0 && Sign)
  138. {
  139. cs = '-';
  140. n=-n;
  141. }
  142. Len = 0;
  143. if (n==0)
  144. Num[Len++] = '0';
  145. else
  146. {
  147. unsigned long un = n;
  148. while (un != 0)
  149. {
  150. Num[Len++] = str[un%Base];
  151. un /= Base;
  152. }
  153. }
  154. if (cs)
  155. ++Len;
  156. for (;!Left && Width>Len;--Width)
  157. *(s++) = ch;
  158. if (cs)
  159. {
  160. *(s++) = cs;
  161. --Len;
  162. --Width;
  163. }
  164. for (;Len;--Width)
  165. *(s++) = Num[--Len];
  166. for (;Width>0;--Width)
  167. *(s++) = ' ';
  168. }
  169. else
  170. *(s++) = *fmt;
  171. }
  172. *(s++) = 0;
  173. return s-s0;
  174. }
  175. int sprintf(tchar_t *s, const tchar_t *fmt, ...) {
  176. int i; va_list Args; va_start(Args,fmt); i=vsprintf(s,fmt,Args); va_end(Args); return i; }