home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / GCC / GERLIB_USR08B.LHA / gerlib / examples / add / baserel / ltostr.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-12  |  2.7 KB  |  150 lines

  1. /*-- Rev Header - do NOT edit!
  2.  *
  3.  *  Filename : CED_Support.c
  4.  *  Purpose  : Einige Hilfsroutinen für CED
  5.  *
  6.  *  Program  : -
  7.  *  Author   : Gerhard Müller
  8.  *  Copyright: (c) by Gerhard Müller
  9.  *  Creation : Fri Sep 10 00:41:01 1993
  10.  *
  11.  *  compile  : makefile
  12.  *
  13.  *  Compile version  : 0.1
  14.  *  Ext. Version     : 0.1
  15.  *
  16.  *  REVISION HISTORY
  17.  *
  18.  *  Date                     Comment
  19.  *  ------------------------ -------------------------------------------------
  20.  *  Fri Sep 17 00:51:36 1993 seems to work
  21.  *
  22.  *
  23.  *
  24.  *-- REV_END --
  25.  */
  26.  
  27. extern "C" {
  28. #include <exec/types.h>
  29. }
  30.     /*
  31.      * Diese Funktion wandelt eine Zahl in einen ascii-String.
  32.      * Besonderheiten:
  33.      *
  34.      * 1) nur ganze Zahlen (bis LONG/ULONG)
  35.      * 2) beliebige Basis (2-36)
  36.      * 3) Länge des Buffers
  37.      * 4) signed/unsigned
  38.      * 5) groß/kleinbuchstaben
  39.      *
  40.      *
  41.      * Ergebnis: Zeiger auf Buffer (ok) oder 0 bei Fehler (Bufferüberlauf etc.)
  42.      *
  43.      */
  44.  
  45.  
  46.     /*
  47.      * This function makes an ascii-string out of a long.
  48.      * Some things to mention
  49.      *
  50.      * 1) only LONG/ULONGs are supported (yet)
  51.      * 2) basis is selectable from 2 to 36
  52.      * 3) length of buffer is noticed
  53.      * 4) signed/unsigned
  54.      * 5) upper/down case letters
  55.      *
  56.      *
  57.      * Result: pointer to buffer (ok) or 0 if any error occurred (buffer-overflow etc.)
  58.      *
  59.      */
  60.  
  61. //           Your LONG   Buffer      Buffer-len    default=down         default base=10   default signed
  62. char *ltostr(LONG tzahl, char *dest, ULONG BufLen, BOOL Uppercase=FALSE,ULONG base=10, BOOL unsigned_zahl=FALSE)
  63. {
  64.     BOOL ok=TRUE;
  65.     char *s=dest;
  66.     ULONG digit;
  67.     ULONG zahl;
  68.     BOOL minus=FALSE;
  69.  
  70.     /* Lower-case digits.  */
  71.     static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
  72.     /* Upper-case digits.  */
  73.     static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  74.     /* Base-36 digits for numbers.  */
  75.  
  76.     const char *digits;
  77.  
  78.     if(Uppercase)
  79.         digits = upper_digits;
  80.     else
  81.         digits = lower_digits;
  82.  
  83.  
  84.     // test arguements
  85.  
  86.     if(base<2 || base >36) return NULL;
  87.     if(BufLen < 2) return NULL;
  88.     if(dest==NULL) return NULL;
  89.  
  90.  
  91.     // Minus ?
  92.  
  93.     if(unsigned_zahl)
  94.     {
  95.         zahl=tzahl;
  96.     }
  97.     else
  98.     {
  99.         if(tzahl < 0)
  100.         {
  101.             minus=TRUE;
  102.             zahl=-tzahl;
  103.         }
  104.         else
  105.             zahl=tzahl;
  106.     }
  107.  
  108.     if(zahl==0) { *s='0'; s++; *s=0; return dest;}
  109.     else
  110.     {
  111.         while(zahl && ok)
  112.         {
  113.             digit=zahl%base;
  114.             *s++=digits[digit];
  115.             zahl/=base;
  116.  
  117.             if( (s-dest) >= (BufLen-1) ) ok=FALSE;    // string nicht zu lang werden lassen
  118.         }
  119.     }
  120.  
  121.     if(ok)
  122.     {
  123.  
  124.         if(minus) *s++='-';
  125.         if( (s-dest) <= (BufLen-1) )
  126.         {
  127.             *s=0;    // String 0 terminieren
  128.  
  129.             int len=s-dest;
  130.             s--;
  131.  
  132.             // string umdrehen
  133.             char temp;
  134.             int x;
  135.  
  136.             for(x = 0 ; x < (len/2); x++)
  137.             {
  138.                 temp=dest[x];
  139.                 dest[x]=s[-x];
  140.                 s[-x]=temp;
  141.             }
  142.         }
  143.         else return NULL;
  144.     }
  145.     else return NULL;
  146.  
  147.     // alles ok
  148.     return(dest);
  149. }
  150.