14887Schin /***********************************************************************
24887Schin * *
34887Schin * This software is part of the ast package *
4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property *
54887Schin * and is licensed under the *
64887Schin * Common Public License, Version 1.0 *
78462SApril.Chin@Sun.COM * by AT&T Intellectual Property *
84887Schin * *
94887Schin * A copy of the License is available at *
104887Schin * http://www.opensource.org/licenses/cpl1.0.txt *
114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
124887Schin * *
134887Schin * Information and Software Systems Research *
144887Schin * AT&T Research *
154887Schin * Florham Park NJ *
164887Schin * *
174887Schin * Glenn Fowler <gsf@research.att.com> *
184887Schin * David Korn <dgk@research.att.com> *
194887Schin * Phong Vo <kpv@research.att.com> *
204887Schin * *
214887Schin ***********************************************************************/
224887Schin #include "sfhdr.h"
234887Schin #include "FEATURE/float"
244887Schin
254887Schin /* Dealing with $ argument addressing stuffs.
264887Schin **
274887Schin ** Written by Kiem-Phong Vo.
284887Schin */
294887Schin
304887Schin #if __STD_C
sffmtint(const char * str,int * v)314887Schin static char* sffmtint(const char* str, int* v)
324887Schin #else
334887Schin static char* sffmtint(str, v)
344887Schin char* str;
354887Schin int* v;
364887Schin #endif
374887Schin {
384887Schin for(*v = 0; isdigit(*str); ++str)
394887Schin *v = *v * 10 + (*str - '0');
404887Schin *v -= 1;
414887Schin return (char*)str;
424887Schin }
434887Schin
444887Schin #if __STD_C
sffmtpos(Sfio_t * f,const char * form,va_list args,Sffmt_t * ft,int type)454887Schin static Fmtpos_t* sffmtpos(Sfio_t* f,const char* form,va_list args,Sffmt_t* ft,int type)
464887Schin #else
474887Schin static Fmtpos_t* sffmtpos(f,form,args,ft,type)
484887Schin Sfio_t* f;
494887Schin char* form;
504887Schin va_list args;
514887Schin Sffmt_t* ft;
524887Schin int type; /* >0: scanf, =0: printf, -1: internal */
534887Schin #endif
544887Schin {
554887Schin int base, fmt, flags, dot, width, precis;
564887Schin ssize_t n_str, size;
574887Schin char *t_str, *sp;
584887Schin int v, n, skip, dollar, decimal, thousand;
594887Schin Sffmt_t savft;
604887Schin Fmtpos_t* fp; /* position array of arguments */
614887Schin int argp, argn, maxp, need[FP_INDEX];
624887Schin #if _has_multibyte
634887Schin SFMBDCL(fmbs)
644887Schin #endif
654887Schin
664887Schin if(type < 0)
674887Schin fp = NIL(Fmtpos_t*);
684887Schin else if(!(fp = sffmtpos(f,form,args,ft,-1)) )
694887Schin return NIL(Fmtpos_t*);
704887Schin
714887Schin dollar = decimal = thousand = 0; argn = maxp = -1;
724887Schin SFMBCLR(&fmbs);
734887Schin while((n = *form) )
744887Schin { if(n != '%') /* collect the non-pattern chars */
754887Schin { sp = (char*)form;
764887Schin for(;;)
774887Schin { form += SFMBLEN(form, &fmbs);
784887Schin if(*form == 0 || *form == '%')
794887Schin break;
804887Schin }
814887Schin continue;
824887Schin }
834887Schin else form += 1;
844887Schin if(*form == 0)
854887Schin break;
864887Schin else if(*form == '%')
874887Schin { form += 1;
884887Schin continue;
894887Schin }
904887Schin
914887Schin if(*form == '*' && type > 0) /* skip in scanning */
924887Schin { skip = 1;
934887Schin form += 1;
944887Schin argp = -1;
954887Schin }
964887Schin else /* get the position of this argument */
974887Schin { skip = 0;
984887Schin sp = sffmtint(form,&argp);
994887Schin if(*sp == '$')
1004887Schin { dollar = 1;
1014887Schin form = sp+1;
1024887Schin }
1034887Schin else argp = -1;
1044887Schin }
1054887Schin
1064887Schin flags = dot = 0;
1074887Schin t_str = NIL(char*); n_str = 0;
1084887Schin size = width = precis = base = -1;
1094887Schin for(n = 0; n < FP_INDEX; ++n)
1104887Schin need[n] = -1;
1114887Schin
1124887Schin loop_flags: /* LOOP FOR \0, %, FLAGS, WIDTH, PRECISION, BASE, TYPE */
1134887Schin switch((fmt = *form++) )
1144887Schin {
1154887Schin case LEFTP : /* get the type enclosed in balanced parens */
1164887Schin t_str = (char*)form;
1174887Schin for(v = 1;;)
1184887Schin { switch(*form++)
1194887Schin {
1204887Schin case 0 : /* not balancable, retract */
1214887Schin form = t_str;
1224887Schin t_str = NIL(char*);
1234887Schin n_str = 0;
1244887Schin goto loop_flags;
1254887Schin case LEFTP : /* increasing nested level */
1264887Schin v += 1;
1274887Schin continue;
1284887Schin case RIGHTP : /* decreasing nested level */
1294887Schin if((v -= 1) != 0)
1304887Schin continue;
1314887Schin n_str = form-t_str;
1324887Schin if(*t_str == '*')
1334887Schin { t_str = sffmtint(t_str+1,&n);
1344887Schin if(*t_str == '$')
1354887Schin dollar = 1;
1364887Schin else n = -1;
1374887Schin if((n = FP_SET(n,argn)) > maxp)
1384887Schin maxp = n;
1394887Schin if(fp && fp[n].ft.fmt == 0)
1404887Schin { fp[n].ft.fmt = LEFTP;
1414887Schin fp[n].ft.form = (char*)form;
1424887Schin }
1434887Schin need[FP_STR] = n;
1444887Schin }
1454887Schin goto loop_flags;
1464887Schin }
1474887Schin }
1484887Schin
1494887Schin case '-' :
1504887Schin flags |= SFFMT_LEFT;
1514887Schin flags &= ~SFFMT_ZERO;
1524887Schin goto loop_flags;
1534887Schin case '0' :
1544887Schin if(!(flags&SFFMT_LEFT) )
1554887Schin flags |= SFFMT_ZERO;
1564887Schin goto loop_flags;
1574887Schin case ' ' :
1584887Schin if(!(flags&SFFMT_SIGN) )
1594887Schin flags |= SFFMT_BLANK;
1604887Schin goto loop_flags;
1614887Schin case '+' :
1624887Schin flags |= SFFMT_SIGN;
1634887Schin flags &= ~SFFMT_BLANK;
1644887Schin goto loop_flags;
1654887Schin case '#' :
1664887Schin flags |= SFFMT_ALTER;
1674887Schin goto loop_flags;
1684887Schin case QUOTE:
1694887Schin SFSETLOCALE(&decimal,&thousand);
1704887Schin if(thousand > 0)
1714887Schin flags |= SFFMT_THOUSAND;
1724887Schin goto loop_flags;
1734887Schin
1744887Schin case '.' :
1754887Schin if((dot += 1) == 2)
1764887Schin base = 0; /* for %s,%c */
1774887Schin if(isdigit(*form))
1784887Schin { fmt = *form++;
1794887Schin goto dot_size;
1804887Schin }
1814887Schin else if(*form != '*')
1824887Schin goto loop_flags;
1834887Schin else form += 1; /* drop thru below */
1844887Schin
1854887Schin case '*' :
1864887Schin form = sffmtint(form,&n);
1874887Schin if(*form == '$' )
1884887Schin { dollar = 1;
1894887Schin form += 1;
1904887Schin }
1914887Schin else n = -1;
1924887Schin if((n = FP_SET(n,argn)) > maxp)
1934887Schin maxp = n;
1944887Schin if(fp && fp[n].ft.fmt == 0)
1954887Schin { fp[n].ft.fmt = '.';
1964887Schin fp[n].ft.size = dot;
1974887Schin fp[n].ft.form = (char*)form;
1984887Schin }
1994887Schin if(dot <= 2)
2004887Schin need[dot] = n;
2014887Schin goto loop_flags;
2024887Schin
2034887Schin case '1' : case '2' : case '3' :
2044887Schin case '4' : case '5' : case '6' :
2054887Schin case '7' : case '8' : case '9' :
2064887Schin dot_size :
2074887Schin for(v = fmt - '0', fmt = *form; isdigit(fmt); fmt = *++form)
2084887Schin v = v*10 + (fmt - '0');
2094887Schin if(dot == 0)
2104887Schin width = v;
2114887Schin else if(dot == 1)
2124887Schin precis = v;
2134887Schin else if(dot == 2)
2144887Schin base = v;
2154887Schin goto loop_flags;
2164887Schin
2174887Schin case 'I' : /* object length */
2184887Schin size = -1; flags = (flags & ~SFFMT_TYPES) | SFFMT_IFLAG;
2194887Schin if(isdigit(*form) )
2204887Schin { for(size = 0, n = *form; isdigit(n); n = *++form)
2214887Schin size = size*10 + (n - '0');
2224887Schin }
2234887Schin else if(*form == '*')
2244887Schin { form = sffmtint(form+1,&n);
2254887Schin if(*form == '$' )
2264887Schin { dollar = 1;
2274887Schin form += 1;
2284887Schin }
2294887Schin else n = -1;
2304887Schin if((n = FP_SET(n,argn)) > maxp)
2314887Schin maxp = n;
2324887Schin if(fp && fp[n].ft.fmt == 0)
2334887Schin { fp[n].ft.fmt = 'I';
2344887Schin fp[n].ft.size = sizeof(int);
2354887Schin fp[n].ft.form = (char*)form;
2364887Schin }
2374887Schin need[FP_SIZE] = n;
2384887Schin }
2394887Schin goto loop_flags;
2404887Schin
2414887Schin case 'l' :
2424887Schin size = -1; flags &= ~SFFMT_TYPES;
2434887Schin if(*form == 'l')
2444887Schin { form += 1;
2454887Schin flags |= SFFMT_LLONG;
2464887Schin }
2474887Schin else flags |= SFFMT_LONG;
2484887Schin goto loop_flags;
2494887Schin case 'h' :
2504887Schin size = -1; flags &= ~SFFMT_TYPES;
2514887Schin if(*form == 'h')
2524887Schin { form += 1;
2534887Schin flags |= SFFMT_SSHORT;
2544887Schin }
2554887Schin else flags |= SFFMT_SHORT;
2564887Schin goto loop_flags;
2574887Schin case 'L' :
2584887Schin size = -1; flags = (flags & ~SFFMT_TYPES) | SFFMT_LDOUBLE;
2594887Schin goto loop_flags;
2604887Schin }
2614887Schin
2624887Schin /* set object size for scalars */
2634887Schin if(flags & SFFMT_TYPES)
2644887Schin { if((_Sftype[fmt]&(SFFMT_INT|SFFMT_UINT)) || fmt == 'n')
2654887Schin { if(flags&SFFMT_LONG)
2664887Schin size = sizeof(long);
2674887Schin else if(flags&SFFMT_SHORT)
2684887Schin size = sizeof(short);
2694887Schin else if(flags&SFFMT_SSHORT)
2704887Schin size = sizeof(char);
2714887Schin else if(flags&SFFMT_TFLAG)
2724887Schin size = sizeof(ptrdiff_t);
2734887Schin else if(flags&SFFMT_ZFLAG)
2744887Schin size = sizeof(size_t);
2754887Schin else if(flags&(SFFMT_LLONG|SFFMT_JFLAG) )
2764887Schin size = sizeof(Sflong_t);
2774887Schin else if(flags&SFFMT_IFLAG)
2784887Schin { if(size <= 0 ||
2794887Schin size == sizeof(Sflong_t)*CHAR_BIT )
2804887Schin size = sizeof(Sflong_t);
2814887Schin }
2824887Schin else if(size < 0)
2834887Schin size = sizeof(int);
2844887Schin }
2854887Schin else if(_Sftype[fmt]&SFFMT_FLOAT)
2864887Schin { if(flags&(SFFMT_LONG|SFFMT_LLONG))
2874887Schin size = sizeof(double);
2884887Schin else if(flags&SFFMT_LDOUBLE)
2894887Schin size = sizeof(Sfdouble_t);
2904887Schin else if(flags&SFFMT_IFLAG)
2914887Schin { if(size <= 0)
2924887Schin size = sizeof(Sfdouble_t);
2934887Schin }
2944887Schin else if(size < 0)
2954887Schin size = sizeof(float);
2964887Schin }
2974887Schin else if(_Sftype[fmt]&SFFMT_CHAR)
2984887Schin {
2994887Schin #if _has_multibyte
3004887Schin if((flags&SFFMT_LONG) || fmt == 'C')
3014887Schin { size = sizeof(wchar_t) > sizeof(int) ?
3024887Schin sizeof(wchar_t) : sizeof(int);
3034887Schin } else
3044887Schin #endif
3054887Schin if(size < 0)
3064887Schin size = sizeof(int);
3074887Schin }
3084887Schin }
3094887Schin
3104887Schin if(skip)
3114887Schin continue;
3124887Schin
3134887Schin if((argp = FP_SET(argp,argn)) > maxp)
3144887Schin maxp = argp;
3154887Schin
3164887Schin if(dollar && fmt == '!')
3174887Schin return NIL(Fmtpos_t*);
3184887Schin
3194887Schin if(fp && fp[argp].ft.fmt == 0)
3204887Schin { fp[argp].ft.form = (char*)form;
3214887Schin fp[argp].ft.fmt = fp[argp].fmt = fmt;
3224887Schin fp[argp].ft.size = size;
3234887Schin fp[argp].ft.flags = flags;
3244887Schin fp[argp].ft.width = width;
3254887Schin fp[argp].ft.precis = precis;
3264887Schin fp[argp].ft.base = base;
3274887Schin fp[argp].ft.t_str = t_str;
3284887Schin fp[argp].ft.n_str = n_str;
3294887Schin for(n = 0; n < FP_INDEX; ++n)
3304887Schin fp[argp].need[n] = need[n];
3314887Schin }
3324887Schin }
3334887Schin
3344887Schin if(!fp) /* constructing position array only */
3354887Schin { if(!dollar || !(fp = (Fmtpos_t*)malloc((maxp+1)*sizeof(Fmtpos_t))) )
3364887Schin return NIL(Fmtpos_t*);
3374887Schin for(n = 0; n <= maxp; ++n)
3384887Schin fp[n].ft.fmt = 0;
3394887Schin return fp;
3404887Schin }
3414887Schin
3424887Schin /* get value for positions */
343*12068SRoger.Faulkner@Oracle.COM if(ft)
344*12068SRoger.Faulkner@Oracle.COM memcpy(&savft, ft, sizeof(*ft));
3454887Schin for(n = 0; n <= maxp; ++n)
3464887Schin { if(fp[n].ft.fmt == 0) /* gap: pretend it's a 'd' pattern */
3474887Schin { fp[n].ft.fmt = 'd';
3484887Schin fp[n].ft.width = 0;
3494887Schin fp[n].ft.precis = 0;
3504887Schin fp[n].ft.base = 0;
3514887Schin fp[n].ft.size = 0;
3524887Schin fp[n].ft.t_str = 0;
3534887Schin fp[n].ft.n_str = 0;
3544887Schin fp[n].ft.flags = 0;
3554887Schin for(v = 0; v < FP_INDEX; ++v)
3564887Schin fp[n].need[v] = -1;
3574887Schin }
3584887Schin
3594887Schin if(ft && ft->extf)
3604887Schin { fp[n].ft.version = ft->version;
3614887Schin fp[n].ft.extf = ft->extf;
3624887Schin fp[n].ft.eventf = ft->eventf;
3634887Schin if((v = fp[n].need[FP_WIDTH]) >= 0 && v < n)
3644887Schin fp[n].ft.width = fp[v].argv.i;
3654887Schin if((v = fp[n].need[FP_PRECIS]) >= 0 && v < n)
3664887Schin fp[n].ft.precis = fp[v].argv.i;
3674887Schin if((v = fp[n].need[FP_BASE]) >= 0 && v < n)
3684887Schin fp[n].ft.base = fp[v].argv.i;
3694887Schin if((v = fp[n].need[FP_STR]) >= 0 && v < n)
3704887Schin fp[n].ft.t_str = fp[v].argv.s;
3714887Schin if((v = fp[n].need[FP_SIZE]) >= 0 && v < n)
3724887Schin fp[n].ft.size = fp[v].argv.i;
3734887Schin
3744887Schin memcpy(ft,&fp[n].ft,sizeof(Sffmt_t));
3754887Schin va_copy(ft->args,args);
3764887Schin ft->flags |= SFFMT_ARGPOS;
3774887Schin v = (*ft->extf)(f, (Void_t*)(&fp[n].argv), ft);
3784887Schin va_copy(args,ft->args);
3794887Schin memcpy(&fp[n].ft,ft,sizeof(Sffmt_t));
3804887Schin if(v < 0)
3814887Schin { memcpy(ft,&savft,sizeof(Sffmt_t));
3824887Schin ft = NIL(Sffmt_t*);
3834887Schin }
3844887Schin
3854887Schin if(!(fp[n].ft.flags&SFFMT_VALUE) )
3864887Schin goto arg_list;
3874887Schin else if(_Sftype[fp[n].ft.fmt]&(SFFMT_INT|SFFMT_UINT) )
3884887Schin { if(fp[n].ft.size == sizeof(short))
3894887Schin { if(_Sftype[fp[n].ft.fmt]&SFFMT_INT)
3904887Schin fp[n].argv.i = fp[n].argv.h;
3914887Schin else fp[n].argv.i = fp[n].argv.uh;
3924887Schin }
3934887Schin else if(fp[n].ft.size == sizeof(char))
3944887Schin { if(_Sftype[fp[n].ft.fmt]&SFFMT_INT)
3954887Schin fp[n].argv.i = fp[n].argv.c;
3964887Schin else fp[n].argv.i = fp[n].argv.uc;
3974887Schin }
3984887Schin }
3994887Schin else if(_Sftype[fp[n].ft.fmt]&SFFMT_FLOAT )
4004887Schin { if(fp[n].ft.size == sizeof(float) )
4014887Schin fp[n].argv.d = fp[n].argv.f;
4024887Schin }
4034887Schin }
4044887Schin else
4054887Schin { arg_list:
4064887Schin if(fp[n].ft.fmt == LEFTP)
4074887Schin { fp[n].argv.s = va_arg(args, char*);
4084887Schin fp[n].ft.size = strlen(fp[n].argv.s);
4094887Schin }
4104887Schin else if(fp[n].ft.fmt == '.' || fp[n].ft.fmt == 'I')
4114887Schin fp[n].argv.i = va_arg(args, int);
4124887Schin else if(fp[n].ft.fmt == '!')
4134887Schin { if(ft)
4144887Schin memcpy(ft,&savft,sizeof(Sffmt_t));
4154887Schin fp[n].argv.ft = ft = va_arg(args, Sffmt_t*);
4164887Schin if(ft->form)
4174887Schin ft = NIL(Sffmt_t*);
4184887Schin if(ft)
4194887Schin memcpy(&savft,ft,sizeof(Sffmt_t));
4204887Schin }
4214887Schin else if(type > 0) /* from sfvscanf */
4224887Schin fp[n].argv.vp = va_arg(args, Void_t*);
4234887Schin else switch(_Sftype[fp[n].ft.fmt])
4244887Schin { case SFFMT_INT:
4254887Schin case SFFMT_UINT:
4264887Schin #if !_ast_intmax_long
4274887Schin if(size == sizeof(Sflong_t) )
4284887Schin fp[n].argv.ll = va_arg(args, Sflong_t);
4294887Schin else
4304887Schin #endif
4314887Schin if(size == sizeof(long) )
4324887Schin fp[n].argv.l = va_arg(args, long);
4334887Schin else fp[n].argv.i = va_arg(args, int);
4344887Schin break;
4354887Schin case SFFMT_FLOAT:
4364887Schin #if !_ast_fltmax_double
4374887Schin if(size == sizeof(Sfdouble_t) )
4384887Schin fp[n].argv.ld = va_arg(args,Sfdouble_t);
4394887Schin else
4404887Schin #endif
4414887Schin fp[n].argv.d = va_arg(args,double);
4424887Schin break;
4434887Schin case SFFMT_POINTER:
4444887Schin fp[n].argv.vp = va_arg(args,Void_t*);
4454887Schin break;
4464887Schin case SFFMT_CHAR:
4474887Schin if(fp[n].ft.base >= 0)
4484887Schin fp[n].argv.s = va_arg(args,char*);
4494887Schin #if _has_multibyte
4504887Schin else if((fp[n].ft.flags & SFFMT_LONG) ||
4514887Schin fp[n].ft.fmt == 'C' )
4524887Schin { if(sizeof(wchar_t) <= sizeof(int) )
4534887Schin fp[n].argv.wc = (wchar_t)va_arg(args,int);
4544887Schin else fp[n].argv.wc = va_arg(args,wchar_t);
4554887Schin }
4564887Schin #endif
4574887Schin /* observe promotion rule */
4584887Schin else fp[n].argv.i = va_arg(args,int);
4594887Schin break;
4604887Schin default: /* unknown pattern */
4614887Schin break;
4624887Schin }
4634887Schin }
4644887Schin }
4654887Schin
4664887Schin if(ft)
4674887Schin memcpy(ft,&savft,sizeof(Sffmt_t));
4684887Schin return fp;
4694887Schin }
4704887Schin
4714887Schin static const unsigned char flt_nan[] = { _ast_flt_nan_init };
4724887Schin static const unsigned char flt_inf[] = { _ast_flt_inf_init };
4734887Schin static const unsigned char dbl_nan[] = { _ast_dbl_nan_init };
4744887Schin static const unsigned char dbl_inf[] = { _ast_dbl_inf_init };
4754887Schin #ifdef _ast_ldbl_nan_init
4764887Schin static const unsigned char ldbl_nan[] = { _ast_ldbl_nan_init };
4774887Schin static const unsigned char ldbl_inf[] = { _ast_ldbl_inf_init };
4784887Schin #endif
4794887Schin
4804887Schin /* function to initialize conversion tables */
sfcvinit()4814887Schin static int sfcvinit()
4824887Schin { reg int d, l;
4834887Schin
4844887Schin for(d = 0; d <= SF_MAXCHAR; ++d)
4854887Schin { _Sfcv36[d] = SF_RADIX;
4864887Schin _Sfcv64[d] = SF_RADIX;
4874887Schin }
4884887Schin
4894887Schin /* [0-9] */
4904887Schin for(d = 0; d < 10; ++d)
4914887Schin { _Sfcv36[(uchar)_Sfdigits[d]] = d;
4924887Schin _Sfcv64[(uchar)_Sfdigits[d]] = d;
4934887Schin }
4944887Schin
4954887Schin /* [a-z] */
4964887Schin for(; d < 36; ++d)
4974887Schin { _Sfcv36[(uchar)_Sfdigits[d]] = d;
4984887Schin _Sfcv64[(uchar)_Sfdigits[d]] = d;
4994887Schin }
5004887Schin
5014887Schin /* [A-Z] */
5024887Schin for(l = 10; d < 62; ++l, ++d)
5034887Schin { _Sfcv36[(uchar)_Sfdigits[d]] = l;
5044887Schin _Sfcv64[(uchar)_Sfdigits[d]] = d;
5054887Schin }
5064887Schin
5074887Schin /* remaining digits */
5084887Schin for(; d < SF_RADIX; ++d)
5094887Schin { _Sfcv36[(uchar)_Sfdigits[d]] = d;
5104887Schin _Sfcv64[(uchar)_Sfdigits[d]] = d;
5114887Schin }
5124887Schin
5134887Schin _Sftype['d'] = _Sftype['i'] = SFFMT_INT;
5144887Schin _Sftype['u'] = _Sftype['o'] = _Sftype['x'] = _Sftype['X'] = SFFMT_UINT;
5154887Schin _Sftype['e'] = _Sftype['E'] = _Sftype['a'] = _Sftype['A'] =
5164887Schin _Sftype['g'] = _Sftype['G'] = _Sftype['f'] = SFFMT_FLOAT;
5174887Schin _Sftype['s'] = _Sftype['n'] = _Sftype['p'] = _Sftype['!'] = SFFMT_POINTER;
5184887Schin _Sftype['c'] = SFFMT_CHAR;
5194887Schin _Sftype['['] = SFFMT_CLASS;
5204887Schin #if _has_multibyte
5214887Schin _Sftype['S'] = SFFMT_POINTER;
5224887Schin _Sftype['C'] = SFFMT_CHAR;
5234887Schin #endif
5244887Schin
5254887Schin /* IEEE floating point computed constants */
5264887Schin
5274887Schin memcpy((char*)&_Sffnan, (char*)flt_nan, sizeof(_Sffnan));
5284887Schin memcpy((char*)&_Sffinf, (char*)flt_inf, sizeof(_Sffinf));
5294887Schin memcpy((char*)&_Sfdnan, (char*)dbl_nan, sizeof(_Sfdnan));
5304887Schin memcpy((char*)&_Sfdinf, (char*)dbl_inf, sizeof(_Sfdinf));
5314887Schin #ifdef _ast_ldbl_nan_init
5324887Schin memcpy((char*)&_Sflnan, (char*)ldbl_nan, sizeof(_Sflnan));
5334887Schin memcpy((char*)&_Sflinf, (char*)ldbl_inf, sizeof(_Sflinf));
5344887Schin #else
5354887Schin memcpy((char*)&_Sflnan, (char*)dbl_nan, sizeof(_Sfdnan));
5364887Schin memcpy((char*)&_Sflinf, (char*)dbl_inf, sizeof(_Sfdinf));
5374887Schin #endif
5384887Schin
5394887Schin return 1;
5404887Schin }
5414887Schin
5424887Schin /* table for floating point and integer conversions */
5434887Schin #include "FEATURE/sfinit"
544