#ifndef num_strCPP
#define num_strCPP
#include "Funcs.h"
#include "num_str.h"
/*----------------------------------------------------------------------------*/
/* Function */
/*----------------------------------------------------------------------------*/
short byte2str(char b, char* s=NULL) // Hex
{
  char r[2]={num2chr(b>>4),num2chr(b)};
  if(s)p2i(s)=p2i(r); return(r[0]<<8)|r[1];
}
/*----------------------------------------------------------------------------*/
long word2str(short w, char* s=NULL) // Hex
{
  char r[4]={num2chr(w>>12),num2chr(w>>8),num2chr(w>>4),num2chr(w)};
  if(s)p2l(s)=p2l(r); return(r[0]<<24)|(r[1]<<16)|(r[2]<<8)|(r[3]);
}
/*----------------------------------------------------------------------------*/
signed short str2byte(short s) // Hex
{
   signed short r=chr2num(p2pc(&s)[1]);
   if(r&short_Sign) return short_Sign;
   r = ((r)<<4) | chr2num(p2pc(&s)[0]);
   return r;
}
/*----------------------------------------------------------------------------*/
signed long str2word(long s) // Hex
{
   signed short r1, r2;
   r1 = str2byte(p2pi(&s)[1]); if(r1&short_Sign) return long_Sign;
   r2 = str2byte(p2pi(&s)[0]); if(r2&short_Sign) return long_Sign;
   return r2 | (r1<<8);
}
/*----------------------------------------------------------------------------*/
signed short sstr2byte(char* s) // Hex
{
   signed short r=chr2num(s[0]);
   if(r&short_Sign) return short_Sign;
   r = ((r)<<4) | chr2num(s[1]);
   return r;
}
/*----------------------------------------------------------------------------*/
signed long sstr2word(char* s) // Hex
{
   signed short r1, r2;
   r1 = sstr2byte(s);   if(r1&short_Sign) return long_Sign;
   r2 = sstr2byte(s+2); if(r2&short_Sign) return long_Sign;
   return r2 | (r1<<8);
}
/*----------------------------------------------------------------------------*/
unsigned long str2num(char* s, char len=0) // Hex
{
   unsigned long r = 0;
   if(!len) len  = strlen(s);
   if(len>8) len = 8;
   while(len--){ r<<=4; r|=chr2num(*s++); }
   return r;
};
/*----------------------------------------------------------------------------*/
char num2str(long n, char* buf) // Hex
{
  long m = 0xF0000000;
  char c = 7, r;
  while(!(m&n)){m>>=4;c--;}
  buf[c+1] = 0x00;
  r = c;
  do{ buf[c] = num2chr(n); n>>=4; }while(c--);
  return r;
};
/*----------------------------------------------------------------------------*/
TNumFormat str2numf(char *s, long* res, char len=0)
{
   TNumFormat format = N_Hex; // potential decimal number
   char b, e;
   short c;

   len = len?len:strlen(s);
   if(!len || len>11) return N_NaN;
   b = 0;
   e = len-1;
   res[0] = 0;

   switch(s[e])
   {
     case 'h':
     case 'L':
        format |= N_Hex;
        break;
     default:
        format |= N_Dec;
        e++;
   }
   if(s[0]=='0' && s[1]=='x')
   {
      b += 2;
      format |= N_Hex;
      format ^= N_Dec;
   }
   format |= N_NrDigit&(e-b);
   if(format&N_Hex)
   {
     while( (b<e) && !(short_Sign&(c=chr2num(s[b++]))) )
     {
        *res <<= 4;
        *res |= c;
        if(c>9)format &= ~N_Dec;
     }
     if(short_Sign&c) return N_NaN;
     return format;
   }
   else if(format&N_Dec)/*???*/
   {
// Never reaches 
   }
   else return N_NaN;
}
/*----------------------------------------------------------------------------*/
#endif
