home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / disk / misc / dcmp / source / source.lha / xtoy.c < prev    next >
C/C++ Source or Header  |  1992-10-02  |  2KB  |  118 lines

  1. /*
  2. **  $RCSfile: xtoy.c,v $
  3. **  $Release$
  4. **  $Revision: 1.3 $
  5. **  $Date: 92/11/11 18:09:53 $
  6. **  $Author: tf $
  7. **  $State: Exp $
  8. **
  9. **  Support functions for data type conversion
  10. **
  11. **  (c) Copyright 1990,91 Tobias Ferber.  All Rights Reserved.
  12. */
  13.  
  14. #include "xtoy.h"
  15.  
  16. static char rcs_id[] = "$Id: xtoy.c,v 1.3 92/11/11 18:09:53 tf Exp $";
  17.  
  18. char *strupr(char *s)
  19. {    char c;
  20.     while(c=*s)
  21.     {    if('a'<=c && c<='z')
  22.             *s=c-('a'-'A');
  23.         ++s;
  24.     }
  25.     return(s);
  26. }
  27.  
  28. char *strlower(char *s)
  29. {    char c;
  30.     while(c=*s)
  31.     {    if('A'<=c && c<='Z')
  32.             *s=c+('a'-'A');
  33.         ++s;
  34.     }
  35.     return(s);
  36. }
  37.  
  38. /* decimal to long conversion */
  39.  
  40. long dectol(char *str)
  41. {    long val=0;
  42.     char c;
  43.     while(isdigit(c=*str))
  44.     {    val = (((val<<2)+val)<<1) + c-'0';
  45.         str++;
  46.     }
  47.     return(val);
  48. }
  49.  
  50. /* hex to long conversion */
  51.  
  52. long hextol(char *s)
  53. { long t=0;
  54.   char c;
  55.   while(ishexdigit(c=*s))
  56.   { if('0'<=*s && *s<='9')
  57.      t= t*0x10 +(c-'0');
  58.     else if('A'<=c && c<='F')
  59.      t= t*0x10 +(c-'A'+0x0A);
  60.     else if('a'<=c && c<='f')
  61.      t= t*0x10 +(c-'a'+0x0A);
  62.     s++;
  63.   }
  64.   return(t);
  65. }
  66.  
  67. char *binstr(long n, int numdigits)
  68. { static char s[33];
  69.   int d;
  70.   unsigned long mask= (1L<<(((numdigits>32)?(numdigits=32):   /* this is C ! */
  71.                              ((numdigits<1)?(numdigits=1):numdigits))-1));
  72.   for (d=0; d<numdigits; d++)
  73.     s[d]= (n & (mask>>d))?'1':'0';
  74.   s[numdigits]='\0';
  75.   return(s);
  76. }
  77.  
  78. /*
  79.  *
  80.  * FUNCTION
  81.  *
  82.  *   itor      convert integer to roman digits string
  83.  *
  84.  * SYNOPSIS
  85.  *
  86.  *   eos = itor(arabic, roman)
  87.  *   char *eos;     * pointer to the end of string
  88.  *   int  arabic;   * integer (must be > 0)
  89.  *   char *roman;   * destination string
  90.  *
  91.  * DESCRIPTION
  92.  *
  93.  *   Well, try it!
  94.  *
  95.  * KNOWN BUGS
  96.  *
  97.  *   The conversion from arabic to roman digits only works for values > 0.
  98.  *
  99.  */
  100.  
  101. char *itor(int n, char *s)
  102. {    while(n>=1000) { *s++='M'; n-=1000; }
  103.     if(n>=900) { *s++='C'; *s++='M'; n-=900; }
  104.     if(n>=500) { *s++='D'; n-=500; }
  105.     if(n>=400) { *s++='C'; *s++='D'; n-=400; }
  106.     while(n>=100) { *s++='C'; n-=100; }
  107.     if(n>=90) { *s++='X'; *s++='C'; n-=90; }
  108.     if(n>=50) { *s++='L'; n-=50; }
  109.     if(n>=40) { *s++='X'; *s++='L'; n-=40; }
  110.     while(n>=10) { *s++='X'; n-=10; }
  111.     if(n>=9) { *s++='I'; *s++='X'; n-=9; }
  112.     if(n>=5) { *s++='V'; n-=5; }
  113.     if(n>=4) { *s++='I'; *s++='V'; n-=4; }
  114.     while(n>=1) { *s++='I'; n--; }
  115.     *s='\000';
  116.     return(s);
  117. }
  118.