home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ioctlapi.zip / appsrc.zip / asciinum.c next >
C/C++ Source or Header  |  1999-11-16  |  2KB  |  87 lines

  1. //-----------------------------------------------------------------------------
  2. // Freeware.  This file may be used freely to promote the ioctl90 mixer API.
  3. //-----------------------------------------------------------------------------
  4. // asciinum.c
  5. //
  6. // Convert ASCII strings into numbers
  7. //
  8. // Modification history:
  9. // 09/25/95 - Joe Nord - Create
  10. //-----------------------------------------------------------------------------
  11.  
  12. #include <stdio.h>
  13. #include <string.h>                     // memchr
  14.  
  15. #include <os2.h>                        // typedefs
  16.  
  17. #include "data.h"
  18. #include "asciinum.h"
  19.  
  20.  
  21. // This function converts an ascii string representing a
  22. // number of the given base to an unsigned long integer.
  23. // String token must be only digits of the indicated base and
  24. // must be terminated by space character or nul.
  25. //
  26. // The parameter 'srcP' is a pointer to the ascii string.
  27. // The function returns the converted value in the parameter 'numP'.
  28. //
  29. // RETURNS
  30. //    0 - Successful conversion
  31. //   -1 - String does not represent a number
  32. //
  33. static char Digits[] = {"0123456789ABCDEF"};
  34.  
  35. int AsciiToUlong (char *srcP, ULONG *numP, USHORT usBase)
  36. {
  37.    ULONG x;
  38.    char *chrP;
  39.  
  40.    *numP = 0;
  41.    if (usBase > 16)
  42.       return (-1);
  43.  
  44.    // skip leading spaces
  45.    while (*srcP != '\0' && *srcP <= ' ')
  46.       srcP++;
  47.  
  48.    if ( *srcP == '\0')          // Passed empty string?
  49.       return (-1);
  50.  
  51.    // skip leading zeros
  52.    while (*srcP == '0')
  53.       srcP++;
  54.  
  55.    // accumulate digits - return error if unexpected character encountered
  56.    x = 0;
  57.    while (*srcP > ' ')
  58.       {
  59.       if ((chrP = (char *)memchr(Digits, *srcP, usBase)) == NULL)
  60.          return (-1);
  61.       x = (x * usBase) + (chrP - Digits);
  62.       srcP++;
  63.       }
  64.    *numP = x;
  65.  
  66.    // return successful
  67.    return (0);
  68. }
  69.  
  70.  
  71. int AsciiToUshort (char *srcP, USHORT *numP, USHORT usBase)
  72. {
  73.    ULONG x;
  74.    int   iRC;
  75.  
  76.    iRC = AsciiToUlong (srcP, &x, usBase);
  77.    if ( iRC == 0 )
  78.    {
  79.       if ( x & 0xFFFF0000 )
  80.          iRC = 1; // Fail for numbers too big
  81.       else
  82.          *numP = x;
  83.    }
  84.  
  85.    return (iRC);
  86. }
  87.