ansiStdlib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:54k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ansiStdlib.c - ANSI 'stdlib' documentation */
  2. /* Copyright 1992-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01d,11jul97,dgp  doc: SPR 7651 and 7677, specify non-reentrant functions
  7. 01c,10feb95,jdi  doc tweaks for div_r(), strtod(), strtol().
  8. 01b,08feb93,jdi  documentation cleanup for 5.1.
  9. 01a,24oct92,smb  written and documented.
  10. */
  11. /*
  12. DESCRIPTION
  13. This library includes several standard ANSI routines.  Note that where 
  14. there is a pair of routines, such as div() and div_r(), only the routine
  15. xxx_r() is reentrant.  The xxx() routine is not reentrant.
  16. The header stdlib.h declares four types and several functions of general
  17. utility, and defines several macros.
  18. .SS Types
  19. The types declared are `size_t', `wchar_t', and:
  20. .iP `div_t' 12
  21. is the structure type of the value returned by the div().
  22. .iP `ldiv_t'
  23. is the structure type of the value returned by the ldiv_t().
  24. .SS Macros
  25. The macros defined are NULL and:
  26. .iP "`EXIT_FAILURE', `EXIT_SUCCESS'" 12
  27. expand to integral constant expressions that may be used as the
  28. argument to exit() to return unsuccessful or successful termination
  29. status, respectively, to the host environment.
  30. .iP `RAND_MAX'
  31. expands to a positive integer expression whose value is the maximum
  32. number of bytes on a multibyte character for the extended character set
  33. specified by the current locale, and whose value is never greater
  34. than MB_LEN_MAX.
  35. .LP
  36. INCLUDE FILES: stdlib.h
  37. SEE ALSO: American National Standard X3.159-1989
  38. INTERNAL
  39. This module is built by appending the following files:
  40.     abort.c
  41.     abs.c
  42.     atexit.c
  43.     atof.c
  44.     atoi.c
  45.     atol.c
  46.     bsearch.c
  47.     div.c
  48.     labs.c
  49.     ldiv.c
  50.     multibyte.c
  51.     qsort.c
  52.     rand.c
  53.     strtod.c
  54.     strtol.c
  55.     strtoul.c
  56.     system.c
  57. */
  58. /* abort.c - abort file for stdlib  */
  59. /* Copyright 1992-1993 Wind River Systems, Inc. */
  60. /*
  61. modification history
  62. --------------------
  63. 01d,08feb93,jdi  documentation cleanup for 5.1.
  64. 01c,20sep92,smb  documentation additions.
  65. 01b,27jul92,smb  abort now raises an abort signal.
  66. 01a,19jul92,smb  Phase 1 of ANSI merge.
  67. */
  68. /*
  69. DESCRIPTION
  70. INCLUDE FILES: stdlib.h, signal.h
  71. SEE ALSO: American National Standard X3.159-1989
  72. NOMANUAL
  73. */
  74. #include "vxWorks.h"
  75. #include "stdlib.h"
  76. #include "signal.h"
  77. /******************************************************************************
  78. *
  79. * abort - cause abnormal program termination (ANSI)
  80. *
  81. * This routine causes abnormal program termination, unless the signal
  82. * SIGABRT is being caught and the signal handler does not return.  VxWorks
  83. * does not flush output streams, close open streams, or remove temporary
  84. * files.  abort() returns unsuccessful status termination to the host
  85. * environment by calling:
  86. * .CS
  87. *     raise (SIGABRT);
  88. * .CE
  89. *
  90. * INCLUDE FILES: stdlib.h
  91. *
  92. * RETURNS: This routine cannot return to the caller.
  93. */
  94. void abort (void)
  95. {
  96. raise (SIGABRT);
  97. exit (EXIT_FAILURE);
  98. }
  99. /* abs.c - abs file for stdlib  */
  100. /* Copyright 1992-1993 Wind River Systems, Inc. */
  101. /*
  102. modification history
  103. --------------------
  104. 01c,08feb93,jdi  documentation cleanup for 5.1.
  105. 01b,20sep92,smb  documentation additions.
  106. 01a,19jul92,smb  written and documented.
  107. */
  108. /*
  109. DESCRIPTION
  110. INCLUDE FILES: stdlib.h
  111. SEE ALSO: American National Standard X3.159-1989
  112. NOMANUAL
  113. */
  114. #include "vxWorks.h"
  115. #include "stdlib.h"
  116. /*******************************************************************************
  117. *
  118. * abs - compute the absolute value of an integer (ANSI)
  119. *
  120. * This routine computes the absolute value of a specified integer.  If the
  121. * result cannot be represented, the behavior is undefined.
  122. *
  123. * INCLUDE FILES: stdlib.h
  124. *
  125. * RETURNS: The absolute value of <i>.
  126. */
  127. int abs 
  128.     (
  129.     int i          /* integer for which to return absolute value */
  130.     )
  131.     {
  132.     return (i >= 0 ? i : -i);
  133.     }
  134. /* atexit.c - atexit file for stdlib  */
  135. /* Copyright 1992-1993 Wind River Systems, Inc. */
  136. /*
  137. modification history
  138. --------------------
  139. 01c,08feb93,jdi  documentation cleanup for 5.1.
  140. 01b,20sep92,smb  documentation additions.
  141. 01a,19jul92,smb  written.
  142. */
  143. /*
  144. DESCRIPTION
  145. INCLUDE FILES: stdlib.h, signal.h
  146. SEE ALSO: American National Standard X3.159-1989
  147. NOMANUAL
  148. */
  149. #include "vxWorks.h"
  150. #include "stdlib.h"
  151. /*******************************************************************************
  152. *
  153. * atexit - call a function at program termination (Unimplemented) (ANSI)
  154. *
  155. * This routine is unimplemented.  VxWorks task exit hooks
  156. * provide this functionality.
  157. *
  158. * INCLUDE FILES: stdlib.h
  159. *
  160. * RETURNS: ERROR, always.
  161. *
  162. * SEE ALSO: taskHookLib
  163. */
  164. int atexit 
  165.     (
  166.     void (*__func)(void) /* pointer to a function */
  167.     ) 
  168.     {
  169.     return (ERROR); 
  170.     }
  171. /* atof.c - atof files for stdlib  */
  172. /* Copyright 1992-1993 Wind River Systems, Inc. */
  173. /*
  174. modification history
  175. --------------------
  176. 01c,08feb93,jdi  documentation cleanup for 5.1.
  177. 01b,20sep92,smb  documentation additions.
  178. 01a,19jul92,smb  written and documentation.
  179. */
  180. /*
  181. DESCRIPTION
  182. INCLUDE FILES: stdlib.h
  183. SEE ALSO: American National Standard X3.159-1989
  184. NOMANUAL
  185. */
  186. #include "vxWorks.h"
  187. #include "stdlib.h"
  188. /*******************************************************************************
  189. *
  190. * atof - convert a string to a `double' (ANSI)
  191. *
  192. * This routine converts the initial portion of the string <s> 
  193. * to double-precision representation. 
  194. *
  195. * Its behavior is equivalent to:
  196. * .CS
  197. *     strtod (s, (char **)NULL);
  198. * .CE
  199. *
  200. * INCLUDE FILES: stdlib.h
  201. *
  202. * RETURNS: The converted value in double-precision representation.
  203. */
  204. double atof
  205.     (
  206.     const char * s /* pointer to string */
  207.     )
  208.     {
  209.     return (strtod (s, (char **) NULL));
  210.     }
  211. /* atoi.c - atoi files for stdlib  */
  212. /* Copyright 1992-1993 Wind River Systems, Inc. */
  213. /*
  214. modification history
  215. --------------------
  216. 01c,08feb93,jdi  documentation cleanup for 5.1.
  217. 01b,20sep92,smb  documentation additions.
  218. 01a,19jul92,smb  written and documented.
  219. */
  220. /*
  221. DESCRIPTION
  222. INCLUDE FILES: stdlib.h
  223. SEE ALSO: American National Standard X3.159-1989
  224. NOMANUAL
  225. */
  226. #include "vxWorks.h"
  227. #include "stdlib.h"
  228. /******************************************************************************
  229. *
  230. * atoi - convert a string to an `int' (ANSI)
  231. *
  232. * This routine converts the initial portion of the string
  233. * <s> to `int' representation.
  234. *
  235. * Its behavior is equivalent to:
  236. * .CS
  237. *     (int) strtol (s, (char **) NULL, 10);
  238. * .CE
  239. *
  240. * INCLUDE FILES: stdlib.h
  241. *
  242. * RETURNS: The converted value represented as an `int'.
  243. */
  244. int atoi
  245.     (
  246.     const char * s /* pointer to string */
  247.     )
  248.     {
  249.     return (int) strtol (s, (char **) NULL, 10);
  250.     }
  251. /* atol.c - atol files for stdlib  */
  252. /* Copyright 1992-1993 Wind River Systems, Inc. */
  253. /*
  254. modification history
  255. --------------------
  256. 01c,08feb93,jdi  documentation cleanup for 5.1.
  257. 01b,20sep92,smb  documentation additions.
  258. 01a,19jul92,smb  written.
  259. */
  260. /*
  261. DESCRIPTION
  262. INCLUDE FILES: stdlib.h
  263. SEE ALSO: American National Standard X3.159-1989
  264. NOMANUAL
  265. */
  266. #include "vxWorks.h"
  267. #include "stdlib.h"
  268. /*****************************************************************************
  269. *
  270. * atol - convert a string to a `long' (ANSI)
  271. *
  272. * This routine converts the initial portion of the string <s> 
  273. * to long integer representation.
  274. *
  275. * Its behavior is equivalent to:
  276. * .CS
  277. *     strtol (s, (char **)NULL, 10);
  278. * .CE
  279. *
  280. * INCLUDE FILES: stdlib.h
  281. *
  282. * RETURNS: The converted value represented as a `long'.
  283. */
  284. long atol
  285.     (
  286.     const register char * s /* pointer to string */
  287.     )
  288.     {
  289.     return strtol (s, (char **) NULL, 10);
  290.     }
  291. /* bsearch.c - bsearch routine for the stdlib ANSI library */
  292. /* Copyright 1992-1993 Wind River Systems, Inc. */
  293. /*
  294. modification history
  295. --------------------
  296. 01c,08feb93,jdi  documentation cleanup for 5.1.
  297. 01b,20sep92,smb  documentation additions.
  298. 01a,19jul92,smb  written and documented
  299. */
  300. /*
  301. DESCRIPTION
  302. INCLUDE FILE: stdlib.h
  303. SEE ALSO: American National Standard X3.159-1989
  304. NOMANUAL
  305. */
  306. #include "vxWorks.h"
  307. #include "stdlib.h"
  308. /******************************************************************************
  309. *
  310. * bsearch - perform a binary search (ANSI)
  311. *
  312. * This routine searches an array of <nmemb> objects, the initial element of
  313. * which is pointed to by <base0>, for an element that matches the object
  314. * pointed to by <key>.  The <size> of each element of the array is specified
  315. * by <size>.
  316. *
  317. * The comparison function pointed to by <compar> is called with two arguments
  318. * that point to the <key> object and to an array element, in that order.  The
  319. * function shall return an integer less than, equal to, or greater than zero if
  320. * the <key> object is considered, respectively, to be less than, to match, or
  321. * to be greater than the array element.  The array shall consist of all the
  322. * elements that compare greater than the <key> object, in that order.
  323. *
  324. * INCLUDE FILES: stdlib.h
  325. *
  326. * RETURNS:
  327. * A pointer to a matching element of the array, or a NULL pointer
  328. * if no match is found.  If two elements compare as equal, which element 
  329. * is matched is unspecified.
  330. */
  331. void * bsearch
  332.     (
  333.     FAST const void * key, /* element to match */
  334.     const void * base0, /* initial element in array */
  335.     size_t nmemb, /* array to search */
  336.     FAST size_t size, /* size of array element */
  337.     FAST int (*compar) (const void *, const void *)  /* comparison function */
  338.     )
  339.     {
  340.     FAST const char *     base = base0;
  341.     FAST const void *     p;
  342.     FAST int              lim;
  343.     FAST int              cmp;
  344.     for (lim = nmemb; lim != 0; lim >>= 1) 
  345. {
  346.      p = base + (lim >> 1) * size;
  347.      cmp = (*compar)(key, p);
  348.      if (cmp == 0)
  349.          return (CHAR_FROM_CONST (p));
  350.      if (cmp > 0) 
  351.     { /* key > p: move right */
  352.          base = (CHAR_FROM_CONST (p) + size);
  353.          lim--;
  354.          } 
  355.         }
  356.     return (NULL);
  357.     }
  358. /* div.c - div file for stdlib  */
  359. /* Copyright 1992-1995 Wind River Systems, Inc. */
  360. /*
  361. modification history
  362. --------------------
  363. 01f,10feb95,jdi  doc format tweak.
  364. 01e,08feb93,jdi  documentation cleanup for 5.1.
  365. 01d,20sep92,smb  documentation additions.
  366. 01c,24jul92,smb  corrected parameter ordering.
  367. 01b,24jul92,smb  added reentrant version for div()
  368. 01a,19jul92,smb  written and documented.
  369. */
  370. /*
  371. DESCRIPTION
  372. INCLUDE FILES: stdlib.h
  373. SEE ALSO: American National Standard X3.159-1989
  374. NOMANUAL
  375. */
  376. #include "vxWorks.h"
  377. #include "stdlib.h"
  378. /*******************************************************************************
  379. *
  380. * div - compute a quotient and remainder (ANSI)
  381. *
  382. * This routine computes the quotient and remainder of <numer>/<denom>.
  383. * If the division is inexact, the resulting quotient is the integer of lesser
  384. * magnitude that is the nearest to the algebraic quotient.  If the result cannot
  385. * be represented, the behavior is undefined; otherwise, `quot' * <denom> + `rem'
  386. * equals <numer>.
  387. *
  388. * This routine is not reentrant.  For a reentrant version, see div_r().
  389. *
  390. * INCLUDE FILES: stdlib.h 
  391. *
  392. * RETURNS:
  393. * A structure of type `div_t', containing both the quotient and the 
  394. * remainder. 
  395. *
  396. * INTERNAL
  397. * The structure shall contain the following members, in either order:
  398. * int quot; * quotient *
  399. * int rem;  * remainder *
  400. */
  401. div_t div 
  402.     (
  403.     int numer,  /* numerator */
  404.     int denom /* denominator */
  405.     ) 
  406.     {
  407.     static div_t divStruct; /* div_t structure */
  408.     div_r (numer, denom, &divStruct);
  409.     return (divStruct);
  410.     }
  411. /*******************************************************************************
  412. *
  413. * div_r - compute a quotient and remainder (reentrant)
  414. *
  415. * This routine computes the quotient and remainder of <numer>/<denom>.
  416. * The quotient and remainder are stored in the `div_t' structure
  417. * pointed to by <divStructPtr>.
  418. *
  419. * This routine is the reentrant version of div().
  420. *
  421. * INCLUDE FILES: stdlib.h 
  422. *
  423. * RETURNS: N/A
  424. */
  425. void div_r
  426.     (
  427.     int     numer,          /* numerator */
  428.     int     denom,          /* denominator */
  429.     div_t * divStructPtr    /* div_t structure */
  430.     )
  431.     {
  432.     /* calculate quotient */
  433.     divStructPtr->quot = numer / denom;
  434.     /* calculate remainder */
  435.     divStructPtr->rem = numer - (denom * divStructPtr->quot);
  436.     /* check for negative quotient */
  437.     if ((divStructPtr->quot < 0) && (divStructPtr->rem > 0))
  438.         {
  439.         divStructPtr->quot++;
  440.         divStructPtr->rem -= denom;
  441.         }
  442.     }
  443. /* labs.c - labs file for stdlib  */
  444. /* Copyright 1992-1993 Wind River Systems, Inc. */
  445. /*
  446. modification history
  447. --------------------
  448. 01c,08feb93,jdi  documentation cleanup for 5.1.
  449. 01b,20sep92,smb  documentation additions.
  450. 01a,19jul92,smb  written.
  451. */
  452. /* 
  453. DESCRIPTION 
  454.  
  455. INCLUDE FILE: stdlib.h
  456.   
  457. SEE ALSO: American National Standard X3.159-1989 
  458. NOMANUAL
  459. */ 
  460. #include "vxWorks.h"
  461. #include "stdlib.h"
  462. /*******************************************************************************
  463. *
  464. * labs - compute the absolute value of a `long' (ANSI)
  465. *
  466. * This routine computes the absolute value of a specified `long'.  If the
  467. * result cannot be represented, the behavior is undefined.  This routine is
  468. * equivalent to abs(), except that the argument and return value are all of
  469. * type `long'.
  470. *
  471. * INCLUDE FILES: stdlib.h 
  472. *
  473. * RETURNS: The absolute value of <i>.
  474. */
  475. long labs 
  476.     (
  477.     long i          /* long for which to return absolute value */
  478.     )
  479.     {
  480.     return (i >= 0 ? i : -i);
  481.     }
  482. /* ldiv.c - ldiv file for stdlib  */
  483. /* Copyright 1992-1993 Wind River Systems, Inc. */
  484. /*
  485. modification history
  486. --------------------
  487. 01e,08feb93,jdi  documentation cleanup for 5.1.
  488. 01d,20sep92,smb  documentation additions.
  489. 01c,24jul92,smb  corrected parameter ordering.
  490. 01b,24jul92,smb  added reentrant version of ldiv()
  491. 01a,19jul92,smb  written.
  492. */
  493. /*
  494. DESCRIPTION
  495. INCLUDE FILES: stdlib.h
  496. SEE ALSO: American National Standard X3.159-1989
  497. NOMANUAL
  498. */
  499. #include "vxWorks.h"
  500. #include "stdlib.h"
  501. /*******************************************************************************
  502. *
  503. * ldiv - compute the quotient and remainder of the division (ANSI)
  504. *
  505. * This routine computes the quotient and remainder of <numer>/<denom>.
  506. * This routine is similar to div(), except that the arguments and the
  507. * elements of the returned structure are all of type `long'.
  508. *
  509. * This routine is not reentrant.  For a reentrant version, see ldiv_r().
  510. *
  511. * INCLUDE FILES: stdlib.h 
  512. *
  513. * RETURNS:
  514. * A structure of type `ldiv_t', containing both the quotient and the 
  515. * remainder. 
  516. */
  517. ldiv_t ldiv 
  518.     (
  519.     long numer,  /* numerator */
  520.     long denom /* denominator */
  521.     ) 
  522.     {
  523.     static ldiv_t divStruct;
  524.     ldiv_r (numer, denom, &divStruct); 
  525.     return (divStruct);
  526.     }
  527.  
  528. /*******************************************************************************
  529. *
  530. * ldiv_r - compute a quotient and remainder (reentrant)
  531. *
  532. * This routine computes the quotient and remainder of <numer>/<denom>.
  533. * The quotient and remainder are stored in the `ldiv_t' structure
  534. * `divStructPtr'.
  535. *
  536. * This routine is the reentrant version of ldiv().
  537. *
  538. * INCLUDE FILES: stdlib.h 
  539. *
  540. * RETURNS: N/A
  541. */
  542. void ldiv_r
  543.     (
  544.     long     numer,          /* numerator */
  545.     long     denom,          /* denominator */
  546.     ldiv_t * divStructPtr    /* ldiv_t structure */
  547.     )
  548.     {
  549.     /* calculate quotient */
  550.     divStructPtr->quot = numer / denom;
  551.  
  552.     /* calculate remainder */
  553.     divStructPtr->rem = numer - (denom * divStructPtr->quot);
  554.  
  555.     /* check for negative quotient */
  556.     if ((divStructPtr->quot < 0) && (divStructPtr->rem > 0))
  557.         {
  558.         divStructPtr->quot++;
  559.         divStructPtr->rem -= denom;
  560.         }
  561.     }   
  562. /* multibyte.c - multibyte file for stdlib  */
  563. /* Copyright 1992-1993 Wind River Systems, Inc. */
  564. /*
  565. modification history
  566. --------------------
  567. 01c,08feb93,jdi  documentation cleanup for 5.1.
  568. 01b,20sep92,smb  documentation additions.
  569. 01a,19jul92,smb  written and documented.
  570. */
  571. /*
  572. DESCRIPTION
  573. These ignore the current fixed ("C") locale and
  574. always indicate that no multibyte characters are supported.
  575. INCLUDE FILES: stdlib.h
  576. SEE ALSO: American National Standard X3.159-1989
  577. NOMANUAL
  578. */
  579. #include "vxWorks.h"
  580. #include "stdlib.h"
  581. #include "string.h"
  582. /******************************************************************************
  583. *
  584. * mblen - calculate the length of a multibyte character (Unimplemented) (ANSI)
  585. * This multibyte character function is unimplemented in VxWorks.
  586. *
  587. * INCLUDE FILES: stdlib.h 
  588. *
  589. * RETURNS: OK, or ERROR if the parameters are invalid.
  590. */
  591. int mblen
  592.     (
  593.     const char * s,
  594.     size_t       n
  595.     )
  596.     {
  597.     if ((strcmp (s,NULL) == 0) && (n == 0) && (*s == EOS))
  598.      return (ERROR);
  599.     return (OK);
  600.     }
  601. /******************************************************************************
  602. *
  603. * mbtowc - convert a multibyte character to a wide character (Unimplemented) (ANSI)
  604. * This multibyte character function is unimplemented in VxWorks.
  605. *
  606. * INCLUDE FILES: stdlib.h 
  607. *
  608. * RETURNS: OK, or ERROR if the parameters are invalid.
  609. */
  610. int mbtowc
  611.     (
  612.     wchar_t *    pwc,
  613.     const char * s,
  614.     size_t       n
  615.     )
  616.     {
  617.     if ((strcmp (s,NULL) == 0) && (n == 0) && (*s == EOS))
  618.      return (ERROR);
  619.     return (OK);
  620.     }
  621. /******************************************************************************
  622. *
  623. * wctomb - convert a wide character to a multibyte character (Unimplemented) (ANSI)
  624. * This multibyte character function is unimplemented in VxWorks.
  625. *
  626. * INCLUDE FILES: stdlib.h 
  627. *
  628. * RETURNS: OK, or ERROR if the parameters are invalid.
  629. */
  630. int wctomb
  631.     (
  632.     char *  s, 
  633.     wchar_t wchar
  634.     )
  635.     {
  636.     if (strcmp (s,NULL) == 0)
  637.      return (ERROR);
  638.     return (OK);
  639.     }
  640. /******************************************************************************
  641. *
  642. * mbstowcs - convert a series of multibyte char's to wide char's (Unimplemented) (ANSI)
  643. * This multibyte character function is unimplemented in VxWorks.
  644. *
  645. * INCLUDE FILES: stdlib.h 
  646. *
  647. * RETURNS: OK, or ERROR if the parameters are invalid.
  648. */
  649. size_t mbstowcs
  650.     (
  651.     wchar_t *  pwcs,
  652.     const char * s,
  653.     size_t       n
  654.     )
  655.     {
  656.     if ((strcmp (s,NULL) == 0) && (n == 0) && (*s == EOS))
  657.      return (ERROR);
  658.     return (OK);
  659.     }
  660. /******************************************************************************
  661. *
  662. * wcstombs - convert a series of wide char's to multibyte char's (Unimplemented) (ANSI)
  663. * This multibyte character function is unimplemented in VxWorks.
  664. *
  665. * INCLUDE FILES: stdlib.h 
  666. *
  667. * RETURNS: OK, or ERROR if the parameters are invalid.
  668. */
  669. size_t wcstombs
  670.     (
  671.     char *          s,
  672.     const wchar_t * pwcs,
  673.     size_t          n
  674.     )
  675.     {
  676.     if ((strcmp (pwcs,NULL) == 0) && (n == 0) && (*pwcs == (wchar_t) EOS))
  677.      return (ERROR);
  678.     return (OK);
  679.     }
  680. /* qsort.c - qsort file for stdlib  */
  681. /* Copyright 1992-1993 Wind River Systems, Inc. */
  682. /*
  683. modification history
  684. --------------------
  685. 01d,01jul93,jmm  fixed parameter order of quick_sort and insertion_sort (spr 2202)
  686. 01c,08feb93,jdi  documentation cleanup for 5.1.
  687. 01b,20sep92,smb  documentation additions.
  688. 01a,19jul92,smb  written and documented.
  689. */
  690. /*
  691. DESCRIPTION
  692.  * Copyright (c) 1980, 1983, 1990 The Regents of the University of California.
  693.  * All rights reserved.
  694.  *
  695.  * Redistribution and use in source and binary forms, with or without
  696.  * modification, are permitted provided that the following conditions
  697.  * are met:
  698.  * 1. Redistributions of source code must retain the above copyright
  699.  *    notice, this list of conditions and the following disclaimer.
  700.  * 2. Redistributions in binary form must reproduce the above copyright
  701.  *    notice, this list of conditions and the following disclaimer in the
  702.  *    documentation and/or other materials provided with the distribution.
  703.  * 3. All advertising materials mentioning features or use of this software
  704.  *    must display the following acknowledgement:
  705.  * This product includes software developed by the University of
  706.  * California, Berkeley and its contributors.
  707.  * 4. Neither the name of the University nor the names of its contributors
  708.  *    may be used to endorse or promote products derived from this software
  709.  *    without specific prior written permission.
  710.  *
  711.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  712.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  713.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  714.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  715.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  716.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  717.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  718.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  719.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  720.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  721.  * SUCH DAMAGE.
  722.  *
  723. INCLUDE FILES: stdlib.h
  724. SEE ALSO: American National Standard X3.159-1989
  725. NOMANUAL
  726. */
  727. #include "vxWorks.h"
  728. #include "stdlib.h"
  729. /*
  730.  * MTHRESH is the smallest partition for which we compare for a median
  731.  * value instead of using the middle value.
  732.  */
  733. #define MTHRESH 6
  734. /*
  735.  * THRESH is the minimum number of entries in a partition for continued
  736.  * partitioning.
  737.  */
  738. #define THRESH 4
  739. static void insertion_sort(), quick_sort(); 
  740. /*
  741.  * Swap two areas of size number of bytes.  Although qsort(3) permits random
  742.  * blocks of memory to be sorted, sorting pointers is almost certainly the
  743.  * common case (and, were it not, could easily be made so).  Regardless, it
  744.  * isn't worth optimizing; the SWAP's get sped up by the cache, and pointer
  745.  * arithmetic gets lost in the time required for comparison function calls.
  746.  */
  747. #define SWAP(a, b) 
  748.     {  
  749.     cnt = size; 
  750.     do 
  751.      ch = *a; 
  752.      *a++ = *b; 
  753.      *b++ = ch; 
  754.         } while (--cnt); 
  755.     }
  756. /*
  757.  * Knuth, Vol. 3, page 116, Algorithm Q, step b, argues that a single pass
  758.  * of straight insertion sort after partitioning is complete is better than
  759.  * sorting each small partition as it is created.  This isn't correct in this
  760.  * implementation because comparisons require at least one (and often two)
  761.  * function calls and are likely to be the dominating expense of the sort.
  762.  * Doing a final insertion sort does more comparisons than are necessary
  763.  * because it compares the "edges" and medians of the partitions which are
  764.  * known to be already sorted.
  765.  *
  766.  * This is also the reasoning behind selecting a small THRESH value (see
  767.  * Knuth, page 122, equation 26), since the quicksort algorithm does less
  768.  * comparisons than the insertion sort.
  769.  */
  770. #define SORT(bot, n) 
  771.     { 
  772.     if (n > 1) 
  773.      if (n == 2) 
  774.     { 
  775.          t1 = bot + size; 
  776.          if (compar (t1, bot) < 0) 
  777.           SWAP (t1, bot); 
  778.          } 
  779. else 
  780.          insertion_sort(bot, n, size, compar); 
  781.     }
  782. /******************************************************************************
  783. *
  784. * qsort - sort an array of objects (ANSI)
  785. *
  786. * This routine sorts an array of <nmemb> objects, the initial element of
  787. * which is pointed to by <bot>.  The size of each object is specified by
  788. * <size>.
  789. *
  790. * The contents of the array are sorted into ascending order according to a
  791. * comparison function pointed to by <compar>, which is called with two
  792. * arguments that point to the objects being compared.  The function shall
  793. * return an integer less than, equal to, or greater than zero if the first
  794. * argument is considered to be respectively less than, equal to, or greater
  795. * than the second.
  796. *
  797. * If two elements compare as equal, their order in the sorted array is
  798. * unspecified.
  799. *
  800. * INCLUDE FILES: stdlib.h
  801. *
  802. * RETURNS: N/A
  803. */
  804. void qsort
  805.     (
  806.     void * bot, /* initial element in array */
  807.     size_t nmemb, /* no. of objects in array */
  808.     size_t size, /* size of array element */
  809.     int (*compar) (const void *, const void *)  /* comparison function */
  810.     )
  811.     {
  812.     /* static void insertion_sort(), quick_sort(); */
  813.     if (nmemb <= 1)
  814.      return;
  815.     if (nmemb >= THRESH)
  816.      quick_sort (bot, nmemb, size, compar);
  817.     else
  818.      insertion_sort (bot, nmemb, size, compar);
  819.     }
  820. /******************************************************************************
  821. *
  822. * quick_sort - sort an array of objects.
  823. *
  824. * RETURNS: no value.
  825. * NOMANUAL
  826. */
  827. static void quick_sort
  828.     (
  829.     FAST char *  bot,
  830.     int          nmemb,
  831.     FAST int     size,
  832.     int          (*compar)()
  833.     )
  834.     {
  835.     FAST int    cnt;
  836.     FAST uint_t   ch;
  837.     FAST char *   top;
  838.     FAST char *   mid;
  839.     FAST char *   t1;
  840.     FAST char *   t2;
  841.     FAST int      n1;
  842.     FAST int      n2;
  843.     char *        bsv;
  844.     /* bot and nmemb must already be set. */
  845. partition:
  846.     /* find mid and top elements */
  847.     mid = bot + size * (nmemb >> 1);
  848.     top = bot + (nmemb - 1) * size;
  849.     /*
  850.      * Find the median of the first, last and middle element (see Knuth,
  851.      * Vol. 3, page 123, Eq. 28).  This test order gets the equalities
  852.      * right.
  853.      */
  854.     if (nmemb >= MTHRESH) 
  855. {
  856.      n1 = compar (bot, mid);
  857.      n2 = compar (mid, top);
  858.      if ((n1 < 0) && (n2 > 0))
  859.      t1 = compar (bot, top) < 0 ? top : bot;
  860.      else 
  861.     if ((n1 > 0) && (n2 < 0))
  862.      t1 = compar (bot, top) > 0 ? top : bot;
  863.      else
  864.      t1 = mid;
  865.         /* if mid element not selected, swap selection there */
  866.         if (t1 != mid) 
  867.             {
  868.             SWAP (t1, mid);
  869.             mid -= size;
  870.             }
  871.         }
  872.     /* Standard quicksort, Knuth, Vol. 3, page 116, Algorithm Q. */
  873. #define didswap n1
  874. #define newbot t1
  875. #define replace t2
  876.     didswap = 0;
  877.     bsv = bot;
  878.     FOREVER
  879. {
  880.      while ((bot < mid) && (compar (bot, mid) <= 0))
  881.     {
  882.     bot += size;
  883.     }
  884.      while (top > mid) 
  885.     {
  886.          if (compar (mid, top) <= 0) 
  887. {
  888.           top -= size;
  889.           continue;
  890.              }
  891.          newbot = bot + size; /* value of bot after swap */
  892.          if (bot == mid) /* top <-> mid, mid == top */
  893.           replace = mid = top;
  894.          else 
  895. { /* bot <-> top */
  896.           replace = top;
  897.           top -= size;
  898.              }
  899.          goto swap;
  900.          }
  901.      if (bot == mid)
  902.      break;
  903.      /* bot <-> mid, mid == bot */
  904.      replace = mid;
  905.      newbot = mid = bot; /* value of bot after swap */
  906.      top -= size;
  907. swap: SWAP(bot, replace);
  908.      bot = newbot;
  909.      didswap = 1;
  910.         }
  911.     /*
  912.      * Quicksort behaves badly in the presence of data which is already
  913.      * sorted (see Knuth, Vol. 3, page 119) going from O N lg N to O N^2.
  914.      * To avoid this worst case behavior, if a re-partitioning occurs
  915.      * without swapping any elements, it is not further partitioned and
  916.      * is insert sorted.  This wins big with almost sorted data sets and
  917.      * only loses if the data set is very strangely partitioned.  A fix
  918.      * for those data sets would be to return prematurely if the insertion
  919.      * sort routine is forced to make an excessive number of swaps, and
  920.      * continue the partitioning.
  921.      */
  922.     if (!didswap) 
  923. {
  924.      insertion_sort (bsv, nmemb, size, compar);
  925.      return;
  926.         }
  927.     /*
  928.      * Re-partition or sort as necessary.  Note that the mid element
  929.      * itself is correctly positioned and can be ignored.
  930.      */
  931. #define nlower n1
  932. #define nupper n2
  933.     bot = bsv;
  934.     nlower = (mid - bot) / size; /* size of lower partition */
  935.     mid += size;
  936.     nupper = nmemb - nlower - 1; /* size of upper partition */
  937.     /*
  938.      * If must call recursively, do it on the smaller partition; this
  939.      * bounds the stack to lg N entries.
  940.      */
  941.     if (nlower > nupper) 
  942. {
  943.      if (nupper >= THRESH)
  944.          quick_sort (mid, nupper, size, compar);
  945.      else 
  946.     {
  947.          SORT (mid, nupper);
  948.          if (nlower < THRESH) 
  949. {
  950.           SORT (bot, nlower);
  951.           return;
  952.              }
  953.          }
  954.      nmemb = nlower;
  955.         } 
  956.     else 
  957. {
  958.      if (nlower >= THRESH)
  959.          quick_sort (bot, nlower, size, compar);
  960.      else 
  961.     {
  962.          SORT (bot, nlower);
  963.          if (nupper < THRESH) 
  964. {
  965.      SORT (mid, nupper);
  966.      return;
  967.      }
  968.          }
  969.      bot = mid;
  970.      nmemb = nupper;
  971.         }
  972.     goto partition;
  973.     /* NOTREACHED */
  974.     }
  975. /******************************************************************************
  976. *
  977. * insertion_sort - internal routine
  978. *
  979. * RETURNS: no value.
  980. * NOMANUAL
  981. */
  982. static void insertion_sort
  983.     (
  984.     char *       bot,
  985.     int          nmemb,
  986.     FAST int     size,
  987.     int          (*compar)()
  988.     )
  989.     {
  990.     FAST int     cnt;
  991.     FAST uint_t  ch;
  992.     FAST char *  s1;
  993.     FAST char *  s2;
  994.     FAST char *  t1;
  995.     FAST char *  t2;
  996.     FAST char *  top;
  997.     /*
  998.      * A simple insertion sort (see Knuth, Vol. 3, page 81, Algorithm
  999.      * S).  Insertion sort has the same worst case as most simple sorts
  1000.      * (O N^2).  It gets used here because it is (O N) in the case of
  1001.      * sorted data.
  1002.      */
  1003.     top = bot + nmemb * size;
  1004.     for (t1 = bot + size; t1 < top;) 
  1005. {
  1006.      for (t2 = t1; ((t2 -= size) >= bot) && (compar (t1, t2) < 0);)
  1007.     ;
  1008.      if (t1 != (t2 += size)) 
  1009.     {
  1010.          /* Bubble bytes up through each element. */
  1011.          for (cnt = size; cnt--; ++t1) 
  1012. {
  1013.           ch = *t1;
  1014.           for (s1 = s2 = t1; (s2 -= size) >= t2; s1 = s2)
  1015.     {
  1016.               *s1 = *s2;
  1017.     }
  1018.           *s1 = ch;
  1019.              }
  1020.          } 
  1021.         else
  1022.          t1 += size;
  1023.         }
  1024.     }
  1025. /* rand.c - rand, srand functions for stdlib  */
  1026. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1027. /*
  1028. modification history
  1029. --------------------
  1030. 01c,08feb93,jdi  documentation cleanup for 5.1.
  1031. 01b,20sep92,smb  documentation additions.
  1032. 01a,19jul92,smb  written and documented.
  1033. */
  1034. /*
  1035. DESCRIPTION
  1036. INCLUDE FILES: stdlib.h
  1037. SEE ALSO: American National Standard X3.159-1989
  1038. NOMANUAL
  1039. */
  1040. #include "vxWorks.h"
  1041. #include "stdlib.h"
  1042. ulong_t _Randseed = 1;
  1043. /*******************************************************************************
  1044. *
  1045. * rand - generate a pseudo-random integer between 0 and RAND_MAX  (ANSI)
  1046. *
  1047. * This routine generates a pseudo-random integer between 0 and RAND_MAX.
  1048. * The seed value for rand() can be reset with srand().
  1049. *
  1050. * INCLUDE FILES: stdlib.h 
  1051. *
  1052. * RETURNS: A pseudo-random integer.
  1053. *
  1054. * SEE ALSO: srand()
  1055. */
  1056. int rand (void) 
  1057.     {
  1058.     _Randseed = _Randseed * 1103515245 + 12345;
  1059.     return (uint_t) (_Randseed/65536) % (RAND_MAX + 1);
  1060.     }
  1061. /*******************************************************************************
  1062. *
  1063. * srand - reset the value of the seed used to generate random numbers (ANSI)
  1064. *
  1065. * This routine resets the seed value used by rand().  If srand() is then
  1066. * called with the same seed value, the sequence of pseudo-random numbers is
  1067. * repeated.  If rand() is called before any calls to srand() have been made,
  1068. * the same sequence shall be generated as when srand() is first called with
  1069. * the seed value of 1.
  1070. *
  1071. * INCLUDE FILES: stdlib.h 
  1072. *
  1073. * RETURNS: N/A
  1074. *
  1075. * SEE ALSO: rand()
  1076. */
  1077. void * srand 
  1078.     (
  1079.     uint_t seed /* random number seed */
  1080.     ) 
  1081.     {
  1082.     _Randseed = seed;
  1083.     return (void *)0;
  1084.     }
  1085. /* strtod.c function for stdlib  */
  1086. /* Copyright 1992-1995 Wind River Systems, Inc. */
  1087. /*
  1088. modification history
  1089. --------------------
  1090. 01e,11feb95,jdi  doc fix.
  1091. 01d,16aug93,dvs  fixed value of endptr for strings that start with d, D, e, or E
  1092.  (SPR #2229)
  1093. 01c,08feb93,jdi  documentation cleanup for 5.1.
  1094. 01b,20sep92,smb  documentation additions.
  1095. 01a,19jul92,smb  written  and documented
  1096. */
  1097. /*
  1098. DESCRIPTION
  1099. INCLUDE FILES: stdlib.h, math.h, assert.h, arrno.h
  1100. SEE ALSO: American National Standard X3.159-1989
  1101. NOMANUAL
  1102. */
  1103. #include "vxWorks.h"
  1104. #include "stdlib.h"
  1105. #include "math.h"
  1106. #include "errno.h"
  1107. #define Ise(c)          ((c == 'e') || (c == 'E') || (c == 'd') || (c == 'D'))
  1108. #define Isdigit(c)      ((c <= '9') && (c >= '0'))
  1109. #define Isspace(c)      ((c == ' ') || (c == 't') || (c=='n') || (c=='v') 
  1110.  || (c == 'r') || (c == 'f'))
  1111. #define Issign(c)       ((c == '-') || (c == '+'))
  1112. #define Val(c)          ((c - '0'))
  1113. #define MAXE  308
  1114. #define MINE  (-308)
  1115. static double powtab[] = {1.0,
  1116.           10.0,
  1117.   100.0,
  1118.   1000.0,
  1119.   10000.0};
  1120. /* flags */
  1121. #define SIGN    0x01
  1122. #define ESIGN   0x02
  1123. #define DECP    0x04
  1124. /* locals */
  1125. int             __ten_mul (double *acc, int digit);
  1126. double          __adjust (double *acc, int dexp, int sign);
  1127. double          __exp10 (uint_t x);
  1128. /*****************************************************************************
  1129. *
  1130. * strtod - convert the initial portion of a string to a double (ANSI) 
  1131. *
  1132. * This routine converts the initial portion of a specified string <s> to a
  1133. * double.  First, it decomposes the input string into three parts:  an initial, 
  1134. * possibly empty, sequence of white-space characters (as specified by the 
  1135. * isspace() function); a subject sequence resembling a floating-point
  1136. * constant; and a final string of one or more unrecognized characters, 
  1137. * including the terminating null character of the input string.  Then, it
  1138. * attempts to convert the subject sequence to a floating-point number, and 
  1139. * returns the result.
  1140. *
  1141. * The expected form of the subject sequence is an optional plus or minus
  1142. * decimal-point character, then an optional exponent part but no floating
  1143. * suffix.  The subject sequence is defined as the longest initial
  1144. * subsequence of the input string, starting with the first non-white-space
  1145. * character, that is of the expected form.  The subject sequence contains
  1146. * no characters if the input string is empty or consists entirely of 
  1147. * white space, or if the first non-white-space character is other than a 
  1148. * sign, a digit, or a decimal-point character.
  1149. *
  1150. * If the subject sequence has the expected form, the sequence of characters
  1151. * starting with the first digit or the decimal-point character (whichever
  1152. * occurs first) is interpreted as a floating constant, except that the 
  1153. * decimal-point character is used in place of a period, and that if neither
  1154. * an exponent part nor a decimal-point character appears, a decimal point is
  1155. * assumed to follow the last digit in the string.  If the subject sequence
  1156. * begins with a minus sign, the value resulting form the conversion is negated.
  1157. * A pointer to the final string is stored in the object pointed to by <endptr>,
  1158. * provided that <endptr> is not a null pointer.
  1159. *
  1160. * In other than the "C" locale, additional implementation-defined subject
  1161. * sequence forms may be accepted.  VxWorks supports only the "C" locale.
  1162. *
  1163. * If the subject sequence is empty or does not have the expected form, no
  1164. * conversion is performed; the value of <s> is stored in the object pointed
  1165. * to by <endptr>, provided that <endptr> is not a null pointer.
  1166. *
  1167. * INCLUDE FILES: stdlib.h 
  1168. *
  1169. * RETURNS:
  1170. * The converted value, if any.  If no conversion could be performed, it
  1171. * returns zero.  If the correct value is outside the range of representable
  1172. * values, it returns plus or minus HUGE_VAL (according to the sign of the
  1173. * value), and stores the value of the macro ERANGE in `errno'.  If the
  1174. * correct value would cause underflow, it returns zero and stores the value
  1175. * of the macro ERANGE in `errno'.
  1176. *
  1177. */
  1178. double strtod 
  1179.     (
  1180.     const char * s, /* string to convert */
  1181.     char **      endptr /* ptr to final string */
  1182.     )
  1183.     {
  1184.     /* Note that the point positioning is locale dependant */
  1185.     const char *start     = s;
  1186.     double      accum     = 0.0;
  1187.     int         flags     = 0;
  1188.     int         texp      = 0;
  1189.     int         e         = 0;
  1190.     BOOL        conv_done = FALSE;
  1191.     while (Isspace (*s)) s++;
  1192.     if (*s == EOS)
  1193. {   /* just leading spaces */
  1194. if (endptr != NULL) 
  1195.     *endptr = CHAR_FROM_CONST (start);
  1196. return (0.0);
  1197. }
  1198.     if (Issign (*s))
  1199. {
  1200. if (*s == '-') flags = SIGN;
  1201. if (*++s == EOS)
  1202.     {   /* "+|-" : should be an error ? */
  1203.     if (endptr != NULL) 
  1204. *endptr = CHAR_FROM_CONST (start);
  1205.     return (0.0);
  1206.     }
  1207. }
  1208.     /* added code to fix problem with leading e, E, d, or D */
  1209.     if ( !Isdigit (*s) && (*s != '.'))
  1210. {
  1211. if (endptr != NULL)
  1212.     *endptr = CHAR_FROM_CONST (start);
  1213. return (0.0);
  1214. }
  1215.     for ( ; (Isdigit (*s) || (*s == '.')); s++)
  1216. {
  1217. conv_done = TRUE;
  1218. if (*s == '.')
  1219.     flags |= DECP;
  1220. else
  1221.     {
  1222.     if ( __ten_mul (&accum, Val(*s)) ) 
  1223. texp++;
  1224.     if (flags & DECP) 
  1225. texp--;
  1226.     }
  1227. }
  1228.     if (Ise (*s))
  1229. {
  1230. conv_done = TRUE;
  1231. if (*++s != EOS)             /* skip e|E|d|D */
  1232.     {                         /* ! ([s]xxx[.[yyy]]e)  */
  1233.     while (Isspace (*s)) s++; /* Ansi allows spaces after e */
  1234.     if (*s != EOS)
  1235. {                     /*  ! ([s]xxx[.[yyy]]e[space])  */
  1236. if (Issign (*s))
  1237.     if (*s++ == '-') flags |= ESIGN;
  1238. if (*s != EOS)
  1239.                                       /*  ! ([s]xxx[.[yyy]]e[s])  -- error?? */
  1240.     {                
  1241.     for(; Isdigit (*s); s++)
  1242.                                       /* prevent from grossly overflowing */
  1243. if (e < MAXE) 
  1244.     e = e*10 + Val (*s);
  1245.                       /* dont care what comes after this */
  1246.     if (flags & ESIGN)
  1247. texp -= e;
  1248.     else
  1249. texp += e;
  1250.     }
  1251. }
  1252.     }
  1253. }
  1254.     if (endptr != NULL)
  1255. *endptr = CHAR_FROM_CONST ((conv_done) ? s : start);
  1256.     return (__adjust (&accum, (int) texp, (int) (flags & SIGN)));
  1257.     }
  1258. /*******************************************************************************
  1259. *
  1260. * __ten_mul -
  1261. *
  1262. * multiply 64 bit accumulator by 10 and add digit.
  1263. * The KA/CA way to do this should be to use
  1264. * a 64-bit integer internally and use "adjust" to
  1265. * convert it to float at the end of processing.
  1266. *
  1267. * AUTHOR:
  1268. * Taken from cygnus.
  1269. *
  1270. * RETURNS:
  1271. * NOMANUAL
  1272. */
  1273. LOCAL int __ten_mul 
  1274.     (
  1275.     double *acc,
  1276.     int     digit
  1277.     )
  1278.     {
  1279.     *acc *= 10;
  1280.     *acc += digit;
  1281.     return (0);     /* no overflow */
  1282.     }
  1283. /*******************************************************************************
  1284. *
  1285. * __adjust -
  1286. *
  1287. * return (*acc) scaled by 10**dexp.
  1288. *
  1289. * AUTHOR:
  1290. * Taken from cygnus.
  1291. *
  1292. * RETURNS:
  1293. * NOMANUAL
  1294. */
  1295. LOCAL double __adjust 
  1296.     (
  1297.     double *acc, /* *acc    the 64 bit accumulator */
  1298.     int     dexp,    /* dexp    decimal exponent       */
  1299.     int     sign /* sign    sign flag              */
  1300.     )
  1301.     {
  1302.     double  r;
  1303.     if (dexp > MAXE)
  1304. {
  1305. errno = ERANGE;
  1306. return (sign) ? -HUGE_VAL : HUGE_VAL;
  1307. }
  1308.     else if (dexp < MINE)
  1309. {
  1310. errno = ERANGE;
  1311. return 0.0;
  1312. }
  1313.     r = *acc;
  1314.     if (sign)
  1315. r = -r;
  1316.     if (dexp==0)
  1317. return r;
  1318.     if (dexp < 0)
  1319. return r / __exp10 (abs (dexp));
  1320.     else
  1321. return r * __exp10 (dexp);
  1322.     }
  1323. /*******************************************************************************
  1324. *
  1325. * __exp10 -
  1326. *
  1327. *  compute 10**x by successive squaring.
  1328. *
  1329. * AUTHOR:
  1330. * Taken from cygnus.
  1331. *
  1332. * RETURNS:
  1333. * NOMANUAL
  1334. */
  1335. double __exp10 
  1336.     (
  1337.     uint_t x
  1338.     )
  1339.     {
  1340.     if (x < (sizeof (powtab) / sizeof (double)))
  1341. return (powtab [x]);
  1342.     else if (x & 1)
  1343. return (10.0 * __exp10 (x-1));
  1344.     else
  1345. return (__exp10 (x/2) * __exp10 (x/2));
  1346.     }
  1347. /* strtol.c - strtol file for stdlib  */
  1348. /* Copyright 1992-1995 Wind River Systems, Inc. */
  1349. /*
  1350. modification history
  1351. --------------------
  1352. 01f,11feb95,jdi  doc fix.
  1353. 01e,13oct93,caf  ansi fix: added cast when assigning from a const.
  1354. 01d,08feb93,jdi  documentation cleanup for 5.1.
  1355. 01c,21sep92,smb  tweaks for mg
  1356. 01b,20sep92,smb  documentation additions.
  1357. 01a,10jul92,smb  written and documented.
  1358. */
  1359. /*
  1360. DESCRIPTION
  1361.  * Copyright (c) 1990 The Regents of the University of California.
  1362.  * All rights reserved.
  1363.  *
  1364.  * Redistribution and use in source and binary forms, with or without
  1365.  * modification, are permitted provided that the following conditions
  1366.  * are met:
  1367.  * 1. Redistributions of source code must retain the above copyright
  1368.  *    notice, this list of conditions and the following disclaimer.
  1369.  * 2. Redistributions in binary form must reproduce the above copyright
  1370.  *    notice, this list of conditions and the following disclaimer in the
  1371.  *    documentation and/or other materials provided with the distribution.
  1372.  * 3. All advertising materials mentioning features or use of this software
  1373.  *    must display the following acknowledgement:
  1374.  * This product includes software developed by the University of
  1375.  * California, Berkeley and its contributors.
  1376.  * 4. Neither the name of the University nor the names of its contributors
  1377.  *    may be used to endorse or promote products derived from this software
  1378.  *    without specific prior written permission.
  1379.  *
  1380.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  1381.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  1382.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  1383.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  1384.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  1385.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  1386.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  1387.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  1388.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  1389.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  1390.  * SUCH DAMAGE.
  1391. INCLUDE FILES: stdlib.h, limits.h, ctype.h, errno.h
  1392. SEE ALSO: American National Standard X3.159-1989
  1393. NOMANUAL
  1394. */
  1395. #include "vxWorks.h"
  1396. #include "stdlib.h"
  1397. #include "limits.h"
  1398. #include "ctype.h"
  1399. #include "errno.h"
  1400. /*****************************************************************************
  1401. *
  1402. * strtol - convert a string to a long integer (ANSI)
  1403. *
  1404. * This routine converts the initial portion of a string <nptr> to `long int'
  1405. * representation.  First, it decomposes the input string into three parts:
  1406. * an initial, possibly empty, sequence of white-space characters (as
  1407. * specified by isspace()); a subject sequence resembling an integer
  1408. * represented in some radix determined by the value of <base>; and a final
  1409. * string of one or more unrecognized characters, including the terminating
  1410. * NULL character of the input string.  Then, it attempts to convert the
  1411. * subject sequence to an integer number, and returns the result.
  1412. *
  1413. * If the value of <base> is zero, the expected form of the subject sequence
  1414. * is that of an integer constant, optionally preceded by a plus or minus
  1415. * sign, but not including an integer suffix.  If the value of <base> is
  1416. * between 2 and 36, the expected form of the subject sequence is a sequence
  1417. * of letters and digits representing an integer with the radix specified by
  1418. * <base> optionally preceded by a plus or minus sign, but not including an
  1419. * integer suffix.  The letters from a (or A) through to z (or Z) are
  1420. * ascribed the values 10 to 35; only letters whose ascribed values are less
  1421. * than <base> are premitted.  If the value of <base> is 16, the characters
  1422. * 0x or 0X may optionally precede the sequence of letters and digits,
  1423. * following the sign if present.
  1424. *
  1425. * The subject sequence is defined as the longest initial subsequence of the 
  1426. * input string, starting with the first non-white-space character, that is of 
  1427. * the expected form.  The subject sequence contains no characters if the 
  1428. * input string is empty or consists entirely of white space, or if the first
  1429. * non-white-space character is other than a sign or a permissible letter or
  1430. * digit.
  1431. *
  1432. * If the subject sequence has the expected form and the value of <base> is
  1433. * zero, the sequence of characters starting with the first digit is
  1434. * interpreted as an integer constant.  If the subject sequence has the
  1435. * expected form and the value of <base> is between 2 and 36, it is used as
  1436. * the <base> for conversion, ascribing to each latter its value as given
  1437. * above.  If the subject sequence begins with a minus sign, the value
  1438. * resulting from the conversion is negated.  A pointer to the final string
  1439. * is stored in the object pointed to by <endptr>, provided that <endptr> is
  1440. * not a NULL pointer.
  1441. *
  1442. * In other than the "C" locale, additional implementation-defined subject
  1443. * sequence forms may be accepted.  VxWorks supports only the "C" locale;
  1444. * it assumes that the upper- and lower-case alphabets and digits are
  1445. * each contiguous.
  1446. *
  1447. * If the subject sequence is empty or does not have the expected form, no
  1448. * conversion is performed; the value of <nptr> is stored in the object
  1449. * pointed to by <endptr>, provided that <endptr> is not a NULL pointer.
  1450. *
  1451. * INCLUDE FILES: stdlib.h 
  1452. *
  1453. * RETURNS:
  1454. * The converted value, if any.  If no conversion could be performed, it
  1455. * returns zero.  If the correct value is outside the range of representable
  1456. * values, it returns LONG_MAX or LONG_MIN (according to the sign of the
  1457. * value), and stores the value of the macro ERANGE in `errno'.
  1458. */
  1459. long strtol
  1460.     (
  1461.     const char * nptr, /* string to convert */
  1462.     char **      endptr, /* ptr to final string */
  1463.     FAST int     base /* radix */
  1464.     )
  1465.     {
  1466.     FAST const   char *s = nptr;
  1467.     FAST ulong_t acc;
  1468.     FAST int   c;
  1469.     FAST ulong_t cutoff;
  1470.     FAST int     neg = 0;
  1471.     FAST int     any;
  1472.     FAST int     cutlim;
  1473.     /*
  1474.      * Skip white space and pick up leading +/- sign if any.
  1475.      * If base is 0, allow 0x for hex and 0 for octal, else
  1476.      * assume decimal; if base is already 16, allow 0x.
  1477.      */
  1478.     do 
  1479.         {
  1480.      c = *s++;
  1481.         } while (isspace (c));
  1482.     if (c == '-') 
  1483.         {
  1484.      neg = 1;
  1485.      c = *s++;
  1486.         } 
  1487.     else if (c == '+')
  1488.      c = *s++;
  1489.     if (((base == 0) || (base == 16)) &&
  1490.         (c == '0') && 
  1491.         ((*s == 'x') || (*s == 'X'))) 
  1492.         {
  1493.      c = s[1];
  1494.      s += 2;
  1495.      base = 16;
  1496.         }
  1497.     if (base == 0)
  1498.      base = (c == '0' ? 8 : 10);
  1499.     /*
  1500.      * Compute the cutoff value between legal numbers and illegal
  1501.      * numbers.  That is the largest legal value, divided by the
  1502.      * base.  An input number that is greater than this value, if
  1503.      * followed by a legal input character, is too big.  One that
  1504.      * is equal to this value may be valid or not; the limit
  1505.      * between valid and invalid numbers is then based on the last
  1506.      * digit.  For instance, if the range for longs is
  1507.      * [-2147483648..2147483647] and the input base is 10,
  1508.      * cutoff will be set to 214748364 and cutlim to either
  1509.      * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
  1510.      * a value > 214748364, or equal but the next digit is > 7 (or 8),
  1511.      * the number is too big, and we will return a range error.
  1512.      *
  1513.      * Set any if any `digits' consumed; make it negative to indicate
  1514.      * overflow.
  1515.      */
  1516.     cutoff = (neg ? -(ulong_t) LONG_MIN : LONG_MAX);
  1517.     cutlim = cutoff % (ulong_t) base;
  1518.     cutoff /= (ulong_t) base;
  1519.     for (acc = 0, any = 0;; c = *s++) 
  1520.         {
  1521.      if (isdigit (c))
  1522.          c -= '0';
  1523.      else if (isalpha (c))
  1524.          c -= (isupper(c) ? 'A' - 10 : 'a' - 10);
  1525.      else
  1526.          break;
  1527.      if (c >= base)
  1528.          break;
  1529.      if ((any < 0) || (acc > cutoff) || (acc == cutoff) && (c > cutlim))
  1530.          any = -1;
  1531.      else 
  1532.             {
  1533.          any = 1;
  1534.          acc *= base;
  1535.          acc += c;
  1536.          }
  1537.         }
  1538.     if (any < 0) 
  1539.         {
  1540.      acc = (neg ? LONG_MIN : LONG_MAX);
  1541.      errno = ERANGE;
  1542.         } 
  1543.     else if (neg)
  1544.      acc = -acc;
  1545.     if (endptr != 0)
  1546.      *endptr = (any ? (char *) (s - 1) : (char *) nptr);
  1547.     return (acc);
  1548.     }
  1549. /* strtoul.c - strtoul file for stdlib  */
  1550. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1551. /*
  1552. modification history
  1553. --------------------
  1554. 01d,08feb93,jdi  documentation cleanup for 5.1.
  1555. 01c,21sep92,smb  tweaks for mg
  1556. 01b,20sep92,smb  documentation additions.
  1557. 01a,10jul92,smb  documented.
  1558. */
  1559. /*
  1560. DESCRIPTION
  1561.  * Copyright (c) 1990 Regents of the University of California.
  1562.  * All rights reserved.
  1563.  *
  1564.  * Redistribution and use in source and binary forms, with or without
  1565.  * modification, are permitted provided that the following conditions
  1566.  * are met:
  1567.  * 1. Redistributions of source code must retain the above copyright
  1568.  *    notice, this list of conditions and the following disclaimer.
  1569.  * 2. Redistributions in binary form must reproduce the above copyright
  1570.  *    notice, this list of conditions and the following disclaimer in the
  1571.  *    documentation and/or other materials provided with the distribution.
  1572.  * 3. All advertising materials mentioning features or use of this software
  1573.  *    must display the following acknowledgement:
  1574.  * This product includes software developed by the University of
  1575.  * California, Berkeley and its contributors.
  1576.  * 4. Neither the name of the University nor the names of its contributors
  1577.  *    may be used to endorse or promote products derived from this software
  1578.  *    without specific prior written permission.
  1579.  *
  1580.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  1581.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  1582.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  1583.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  1584.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  1585.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  1586.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  1587.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  1588.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  1589.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  1590.  * SUCH DAMAGE.
  1591. INCLUDE FILES: stdlib.h, limits.h, ctype.h, errno.h
  1592. SEE ALSO: American National Standard X3.159-1989
  1593. NOMANUAL
  1594. */
  1595. #include "vxWorks.h"
  1596. #include "limits.h"
  1597. #include "ctype.h"
  1598. #include "errno.h"
  1599. #include "stdlib.h"
  1600. /*****************************************************************************
  1601. *
  1602. * strtoul - convert a string to an unsigned long integer (ANSI)
  1603. *
  1604. * This routine converts the initial portion of a string <nptr> to
  1605. * `unsigned long int' representation.  First, it decomposes the input
  1606. * string into three parts:  an initial, possibly empty, sequence of
  1607. * white-space characters (as specified by isspace()); a subject sequence
  1608. * resembling an unsigned integer represented in some radix determined by
  1609. * the value <base>; and a final string of one or more unrecognized
  1610. * characters, including the terminating null character of the input string.
  1611. * Then, it attempts to convert the subject sequence to an unsigned integer,
  1612. * and returns the result.
  1613. *
  1614. * If the value of <base> is zero, the expected form of the subject sequence
  1615. * is that of an integer constant, optionally preceded by a plus or minus
  1616. * sign, but not including an integer suffix.  If the value of <base> is
  1617. * between 2 and 36, the expected form of the subject sequence is a sequence
  1618. * of letters and digits representing an integer with the radix specified by
  1619. * letters from a (or A) through z (or Z) which are ascribed the values 10 to
  1620. * 35; only letters whose ascribed values are less than <base> are
  1621. * premitted.  If the value of <base> is 16, the characters 0x or 0X may
  1622. * optionally precede the sequence of letters and digits, following the sign
  1623. * if present.
  1624. *
  1625. * The subject sequence is defined as the longest initial subsequence of the
  1626. * input string, starting with the first non-white-space character, that is
  1627. * of the expected form.  The subject sequence contains no characters if the
  1628. * input string is empty or consists entirely of white space, or if the first
  1629. * non-white-space character is other than a sign or a permissible letter or
  1630. * digit.
  1631. *
  1632. * If the subject sequence has the expected form and the value of <base> is
  1633. * zero, the sequence of characters starting with the first digit is
  1634. * interpreted as an integer constant.  If the subject sequence has the
  1635. * expected form and the value of <base> is between 2 and 36, it is used as
  1636. * the <base> for conversion, ascribing to each letter its value as given
  1637. * above.  If the subject sequence begins with a minus sign, the value
  1638. * resulting from the conversion is negated.  A pointer to the final string
  1639. * is stored in the object pointed to by <endptr>, provided that <endptr> is
  1640. * not a null pointer.
  1641. *
  1642. * In other than the "C" locale, additional implementation-defined subject
  1643. * sequence forms may be accepted.  VxWorks supports only the "C" locale;
  1644. * it assumes that the upper- and lower-case alphabets and digits are
  1645. * each contiguous.
  1646. *
  1647. * If the subject sequence is empty or does not have the expected form, no
  1648. * conversion is performed; the value of <nptr> is stored in the object
  1649. * pointed to by <endptr>, provided that <endptr> is not a null pointer.
  1650. *
  1651. * INCLUDE FILES: stdlib.h 
  1652. *
  1653. * RETURNS:
  1654. * The converted value, if any.  If no conversion could be performed it
  1655. * returns zero.  If the correct value is outside the range of representable
  1656. * values, it returns ULONG_MAX, and stores the value of the macro ERANGE in
  1657. * <errno>.
  1658. */
  1659. ulong_t strtoul
  1660.     (
  1661.     const char *     nptr, /* string to convert */
  1662.     char **          endptr, /* ptr to final string */
  1663.     FAST int         base /* radix */
  1664.     )
  1665.     {
  1666.     FAST const char *s = nptr;
  1667.     FAST ulong_t     acc;
  1668.     FAST int         c;
  1669.     FAST ulong_t     cutoff;
  1670.     FAST int         neg = 0;
  1671.     FAST int       any;
  1672.     FAST int       cutlim;
  1673.     /*
  1674.      * See strtol for comments as to the logic used.
  1675.      */
  1676.     do 
  1677.         {
  1678.      c = *s++;
  1679.         } while (isspace (c));
  1680.     if (c == '-') 
  1681.         {
  1682.      neg = 1;
  1683.      c = *s++;
  1684.         } 
  1685.     else if (c == '+')
  1686.      c = *s++;
  1687.     if (((base == 0) || (base == 16)) &&
  1688.         (c == '0') && 
  1689.         ((*s == 'x') || (*s == 'X'))) 
  1690.         {
  1691.      c = s[1];
  1692.      s += 2;
  1693.      base = 16;
  1694.         }
  1695.     if (base == 0)
  1696.      base = (c == '0' ? 8 : 10);
  1697.     cutoff = (ulong_t)ULONG_MAX / (ulong_t)base;
  1698.     cutlim = (ulong_t)ULONG_MAX % (ulong_t)base;
  1699.     for (acc = 0, any = 0;; c = *s++) 
  1700.         {
  1701.      if (isdigit (c))
  1702.          c -= '0';
  1703.      else if (isalpha (c))
  1704.          c -= (isupper (c) ? 'A' - 10 : 'a' - 10);
  1705.      else
  1706.          break;
  1707.      if (c >= base)
  1708.          break;
  1709.      if ((any < 0) || (acc > cutoff) || (acc == cutoff) && (c > cutlim))
  1710.          any = -1;
  1711.      else 
  1712.             {
  1713.          any = 1;
  1714.          acc *= base;
  1715.          acc += c;
  1716.          }
  1717.         }
  1718.     if (any < 0) 
  1719.         {
  1720.      acc = ULONG_MAX;
  1721.      errno = ERANGE;
  1722.         } 
  1723.     else if (neg)
  1724.      acc = -acc;
  1725.     if (endptr != 0)
  1726.      *endptr = (any ? CHAR_FROM_CONST (s - 1) : CHAR_FROM_CONST (nptr));
  1727.     return (acc);
  1728.     }
  1729. /* system.c - system file for stdlib  */
  1730. /* Copyright 1992-1993 Wind River Systems, Inc. */
  1731. /*
  1732. modification history
  1733. --------------------
  1734. 01c,08feb93,jdi  documentation cleanup for 5.1.
  1735. 01b,20sep92,smb  documentation additions.
  1736. 01a,25mar92,smb  written.
  1737. */
  1738. /*
  1739. DESCRIPTION
  1740. INCLUDE FILES: stdlib.h
  1741. SEE ALSO: American National Standard X3.159-1989
  1742. NOMANUAL
  1743. */
  1744. #include "vxWorks.h"
  1745. #include "stdlib.h"
  1746. /*****************************************************************************
  1747. *
  1748. * system - pass a string to a command processor (Unimplemented) (ANSI)
  1749. *
  1750. * This function is not applicable to VxWorks.
  1751. *
  1752. * INCLUDE FILES: stdlib.h 
  1753. *
  1754. * RETURNS: OK, always.
  1755. */
  1756. int system 
  1757.     (
  1758.     const char * string /* pointer to string */
  1759.     ) 
  1760.     {
  1761.     return (OK);
  1762.     }