Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeni10output.c
Go to the documentation of this file.
00001 #include <precomp.h> 00002 00003 #define I10_OUTPUT_MAX_PREC 21 00004 /* Internal structure used by $I10_OUTPUT */ 00005 struct _I10_OUTPUT_DATA { 00006 short pos; 00007 char sign; 00008 BYTE len; 00009 char str[I10_OUTPUT_MAX_PREC+1]; /* add space for '\0' */ 00010 }; 00011 00012 /********************************************************************* 00013 * $I10_OUTPUT (MSVCRT.@) 00014 * ld - long double to be printed to data 00015 * prec - precision of part, we're interested in 00016 * flag - 0 for first prec digits, 1 for fractional part 00017 * data - data to be populated 00018 * 00019 * return value 00020 * 0 if given double is NaN or INF 00021 * 1 otherwise 00022 * 00023 * FIXME 00024 * Native sets last byte of data->str to '0' or '9', I don't know what 00025 * it means. Current implementation sets it always to '0'. 00026 */ 00027 int CDECL MSVCRT_I10_OUTPUT(long double ld, int prec, int flag, struct _I10_OUTPUT_DATA *data) 00028 { 00029 static const char inf_str[] = "1#INF"; 00030 static const char nan_str[] = "1#QNAN"; 00031 00032 double d = ld; 00033 char format[8]; 00034 char buf[I10_OUTPUT_MAX_PREC+9]; /* 9 = strlen("0.e+0000") + '\0' */ 00035 char *p; 00036 00037 TRACE("(%lf %d %x %p)\n", d, prec, flag, data); 00038 00039 if(d<0) { 00040 data->sign = '-'; 00041 d = -d; 00042 } else 00043 data->sign = ' '; 00044 00045 if(!_finite(d)) { 00046 data->pos = 1; 00047 data->len = 5; 00048 memcpy(data->str, inf_str, sizeof(inf_str)); 00049 00050 return 0; 00051 } 00052 00053 if(_isnan(d)) { 00054 data->pos = 1; 00055 data->len = 6; 00056 memcpy(data->str, nan_str, sizeof(nan_str)); 00057 00058 return 0; 00059 } 00060 00061 if(flag&1) { 00062 int exp = (int)(1+floor(log10(d))); 00063 00064 prec += exp; 00065 if(exp < 0) 00066 prec--; 00067 } 00068 prec--; 00069 00070 if(prec+1 > I10_OUTPUT_MAX_PREC) 00071 prec = I10_OUTPUT_MAX_PREC-1; 00072 else if(prec < 0) { 00073 d = 0.0; 00074 prec = 0; 00075 } 00076 00077 sprintf(format, "%%.%dle", prec); 00078 sprintf(buf, format, d); 00079 00080 buf[1] = buf[0]; 00081 data->pos = atoi(buf+prec+3); 00082 if(buf[1] != '0') 00083 data->pos++; 00084 00085 for(p = buf+prec+1; p>buf+1 && *p=='0'; p--); 00086 data->len = (BYTE)(p - buf); 00087 00088 memcpy(data->str, buf+1, data->len); 00089 data->str[data->len] = '\0'; 00090 00091 if(buf[1]!='0' && prec-data->len+1>0) 00092 memcpy(data->str+data->len+1, buf+data->len+1, prec-data->len+1); 00093 00094 return 1; 00095 } 00096 #undef I10_OUTPUT_MAX_PREC 00097 00098 00099 Generated on Fri May 25 2012 04:34:56 for ReactOS by
1.7.6.1
|