/*
** basis.c  Sammelbecken fuer gemeinsame routinen
*/
#include "basis.h"


#ifdef BA_EHEX
/****************************************************************
** unsigned int hexadezimal aufbereiten
** anz  = Anzahl der Zeichen 1 - 8
** wert = ...
** ziel = Ergebnis Pointer
*/
void edit_hex( unsigned char anz, unsigned long wert, char *ziel )
{
   unsigned char n, x, i;

   n = 4 * (anz-1);
   for (i=0; i < anz ; i++)
   {
      x = (unsigned char)( wert >> n ) & 0x0F ;
      if ( x > 9 )
         x += 0x37;
      else
         x += 0x30;
      ziel[i] = x;
      n -= 4;
   }
}
#endif

#ifdef BA_ATOI
/*****************************************************************************
**  ascii to int
*/
long a_to_i( char *quelle, unsigned char anzahl)
{
   long x=0;
   unsigned char n;

   for ( n=0; n < anzahl; n++)
   {
      x *= 10;
      x += *quelle & 0x0F;
      quelle++;
   }
   return x;
}
#endif

#ifdef BA_E99
/*************************************************************************************
** Aufbereitung Dezimalzahl mit fuehrender Null
** stellen von 2 bis 11, auch negative Zahlen
*/
void edit99( long wert, char *ziel, unsigned char stellen )
{
   unsigned char n;
   unsigned char negativ = 0;

   if ( wert < 0 )
   {
      wert = wert * -1;
      negativ = 1;
   }

   if ( stellen > 1 && stellen < 11 )
   {
      for( n = stellen-1; n > 0; n-- )
      {
         ziel[n] = (wert % 10) + 0x30 ;
         wert /= 10 ;
      }
      if ( wert < 10 )
      {
         ziel[0] = wert + 0x30 ;
         if ( negativ )
         {
            if ( wert == 0 )
               ziel[0] = '-' ;
            else
               ziel[0] = 'N';
         }
      }
      else
         ziel[0] = 'F';
   }
   else
      ziel[0] = 'E';
}
#endif

#ifdef BA_PRUEF
/*****************************************************************************
** Berechnung der Pruefzahl
** 11.09.2009  Einfacherer Berechnung mit dem Gewicht 2 3 4 ...
** 16.09.2009  Verbesserung wenn viele 0 Zeichen
**
** Code        : 2  9  1  2  0  9  1
** n+1           3 10  2  3  1 10  2
** Gewichtung  : 2  3  4  5  6  7  8
** Produkte    : 6 30  8 15  6 70 16
** Summe       : 151
** Modulo 64   : 151 / 64 = 2 Rest 23
** Pruefzahl   : Differenz zu 64 = 64 - 23 = 41
** Prüfzeichen = pz + 0x30 ergibt ASCII Code 0x30 bis 0x6F  0x29 +0x30 = 0x59  = ';'
*/
unsigned char berechne_PZ( char *s, unsigned char len )
{
   unsigned char i,n;
   unsigned char w = 2;          // start mit 2
   int summe = 0;

   for ( i=0; i < len; i++ )
   {
      n = *s++ & 0x0F ;          // ASCII zahlen 0-9
      summe += (n+1) * w ;       // 16.09.2009 n+1
      w++;                       // 2 3 4 usw.
   }
   return( 64 - (summe % 64));
}
#endif