00001
00002
00003 #if OSK
00004 #define sprintf Sprintf
00005 #endif
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 static void cvtnum(buf, num, base)
00037 char *buf;
00038 unsigned long num;
00039 int base;
00040 {
00041 static char digits[] = "0123456789abcdef";
00042 unsigned long tmp;
00043
00044
00045 if (num == 0L)
00046 {
00047 buf[0] = '0';
00048 buf[1] = '\0';
00049 return;
00050 }
00051
00052
00053 for (tmp = num; tmp > 0; tmp /= base)
00054 {
00055 buf++;
00056 }
00057
00058
00059 *buf = '\0';
00060
00061
00062 for (tmp = num; tmp > 0; tmp /= base)
00063 {
00064 *--buf = digits[tmp % base];
00065 }
00066 }
00067
00068 int sprintf(buf, fmt, argref)
00069 char *buf;
00070 char *fmt;
00071 int argref;
00072 {
00073 char *argptr;
00074 int pad;
00075 int clip;
00076 long num;
00077 long digit;
00078 char *src, *dst;
00079
00080
00081 argptr = (char *)&argref;
00082
00083
00084 while (*fmt)
00085 {
00086
00087 if (*fmt != '%')
00088 {
00089 *buf++ = *fmt++;
00090 continue;
00091 }
00092
00093
00094 fmt++;
00095 if ('*' == *fmt)
00096 {
00097 pad = *((int *)argptr)++;
00098 fmt++;
00099 }
00100 else if (*fmt == '-' || (*fmt >= '0' && *fmt <= '9'))
00101 {
00102 pad = atol(fmt);
00103 do
00104 {
00105 fmt++;
00106 } while (*fmt >= '0' && *fmt <= '9');
00107 }
00108 else
00109 {
00110 pad = 0;
00111 }
00112
00113
00114 if (*fmt == '.')
00115 {
00116 fmt++;
00117 if ('*' == *fmt)
00118 {
00119 clip = *((int *)argptr)++;
00120 fmt++;
00121 }
00122 else if (*fmt >= '0' && *fmt <= '9')
00123 {
00124 clip = atol(fmt);
00125 do
00126 {
00127 fmt++;
00128 } while (*fmt >= '0' && *fmt <= '9');
00129 }
00130 }
00131 else
00132 {
00133 clip = 0;
00134 }
00135
00136
00137 switch (*fmt++)
00138 {
00139 case 'c':
00140 buf[0] = *((int *)argptr)++;
00141 buf[1] = '\0';
00142 break;
00143
00144 case 's':
00145 src = *((char **)argptr)++;
00146 if (!src)
00147 {
00148 src = "(null)";
00149 }
00150 if (clip)
00151 {
00152 strncpy(buf, src, clip);
00153 buf[clip] = '\0';
00154 }
00155 else
00156 {
00157 strcpy(buf, src);
00158 }
00159 break;
00160
00161 case 'l':
00162 fmt++;
00163 num = *((long *)argptr)++;
00164 dst = buf;
00165 if (num < 0)
00166 {
00167 *dst++ = '-';
00168 num = -num;
00169 }
00170 cvtnum(dst, num, 10);
00171 break;
00172
00173 case 'x':
00174 num = *((int *)argptr)++;
00175 cvtnum(buf, num, 16);
00176 break;
00177
00178 case 'd':
00179 num = *((int *)argptr)++;
00180 dst = buf;
00181 if (num < 0)
00182 {
00183 *dst++ = '-';
00184 num = -num;
00185 }
00186 cvtnum(dst, num, 10);
00187 break;
00188
00189 default:
00190 buf[0] = fmt[-1];
00191 buf[1] = '\0';
00192 }
00193
00194
00195 clip = strlen(buf);
00196 if (pad < 0)
00197 {
00198
00199 pad = -pad - clip;
00200 for (buf += clip; pad > 0; pad--)
00201 {
00202 *buf++ = ' ';
00203 }
00204 *buf = '\0';
00205 }
00206 else
00207 {
00208
00209 pad -= clip;
00210 if (pad > 0)
00211 {
00212 src = buf + clip;
00213 dst = src + pad;
00214 *dst = '\0';
00215 while (src > buf)
00216 {
00217 *--dst = *--src;
00218 }
00219 while (dst > buf)
00220 {
00221 *--dst = ' ';
00222 }
00223 }
00224 buf += strlen(buf);
00225 }
00226 }
00227
00228
00229 *buf = '\0';
00230 }