ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

i10output.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.