/* 
**
** function.c   
** Created at 2000-05-29        
** Functions for data conversion, tools.
**
*/

#include "../include/includes.h"

/*
** Fill string 'c' into last area of 'str'.
*/

/* duplicate with public module 2006-09-25*/
/*
void 
StringCat(char *str, char *c, int slen)
{
    if (strlen(str) >= slen) return;
    while (strlen(str) < slen)
        strcat(str, c);
    str[slen] = 0;
}
*/
/*
** Cut string while match character c.
*/
/*
void 
StringCut(char *str, int c)
{
	if (toupper(*str) == toupper(c)) *str=0;
	while (str && *str++)
        if (toupper(*str) == toupper(c)) {
            *str = 0;
            break;
        }
}
*/
void Bstr2Hstr(char *cptr)
{
    char s[12] = "";
    unsigned int i, j = 0;

    while (cptr && *cptr && strchr("01", *cptr)) {
           i = *cptr++ - '0';
        j <<= 1;
        j |= (i & 0x01);
    }
    sprintf(s, "%x", j);
    cptr = (char *) s;
}

void bitstring(char *str, long byze, int biz, int strwid)
{
      int i, j;

      j = strwid - (biz + (biz >> 2)- (biz % 4 ? 0 : 1));
      for (i = 0; i < j; i++)
            *str++ = ' ';
      while (--biz >= 0) {
            *str++ = ((byze >> biz) & 1) + '0';
//
//            if (!(biz % 4) && biz)
//                  *str++ = ' ';
//
      }
      *str = '\0';
}
/*
** Binary string convert to int.
*/

unsigned int Bstr2Int(char *cptr)
{
      unsigned int i, j = 0;

      while (cptr && *cptr && strchr("01", *cptr)) {
            i = *cptr++ - '0';
            j <<= 1;
            j |= (i & 0x01);
      }
      return(j);
}

/*
** Hex string convert to int.
*/

unsigned int Hstr2Int(char *cptr)
{
      unsigned int i, j = 0;

      while (cptr && *cptr && isxdigit(*cptr)) {
            i = *cptr++ - '0';
            if (9 < i)
                  i -= 7;
            j <<= 4;
            j |= (i & 0x0f);
      }
      return(j);
}

/* Convert data from ASCII form to left-aligned compact BCD form. */
/*
void  AsciiToBcd (BYTE *bcd_buf, const char *ascii_buf, int len)
{
    int   i;
    char  ch;

    for (i=0; i<len; i++)
    {
        ch = ascii_buf[i];
        if (ch>='a')  ch -= 'a' - 10;
        else if (ch>='A')  ch -= 'A' - 10;
            else ch -= '0';
        if (i & 1)  *(bcd_buf++) |= ch & 0x0f;
        else  *bcd_buf = ch << 4;
    }
}
*/
/* Convert data from left-aligned compact BCD form to ASCII form. */
/*
void  BcdToAscii (char *ascii_buf, const BYTE *bcd_buf, int len)
{
    int   i;
    char  ch;

    for (i=0; i<len; i++) {
        if (i & 1)  ch = *(bcd_buf++) & 0x0f;
        else  ch = *bcd_buf >> 4;
        ascii_buf[i] = ch + ((ch > 9)? 'A'-10 : '0');
    }
    ascii_buf[i] = '\0';
}
*/
/* Convert data from ASCII form to right-aligned compact BCD form. */
/*
void  AsciiToRbcd (BYTE *bcd_buf, const char *ascii_buf, int len)
{
    int   i;
    char  ch;

    if (len > 0)  memset(bcd_buf ,0,len/2);
    for (i=0; i<len; i++) {
        ch = ascii_buf[i];
        if (ch>='a')  ch -= 'a' - 10;
        else if (ch>='A')  ch -= 'A' - 10;
            else ch -= '0';
        if ((len - i) & 1)  *(bcd_buf++) |= ch & 0x0f;
        else  *bcd_buf = ch << 4;
    }
}
*/
/* Convert data from right-aligned compact BCD form to ASCII form. */

void  RbcdToAscii (char *ascii_buf, const BYTE *bcd_buf, int len)
{
    int   i;
    char  ch;

    for (i=0; i<len; i++) {
        if ((len - i) & 1)  ch = *(bcd_buf++) & 0x0f;
        else  ch = *bcd_buf >> 4;
        ascii_buf[i] = ch + ((ch > 9)? 'A'-10 : '0');
    }
    ascii_buf[i] = '\0';
}

/* Convert number to compact BCD, the number must in the range from 0 to 99. */

BYTE  IntToBcd (int n)
{
    return ((n / 10) << 4) | (n % 10);
}

/* Convert number from compact BCD. */

int   BcdToInt (BYTE n)
{
    return (n >> 4) * 10 + (n & 0x0f);
}

/* Copy charaters, then append a null character to array pointed by dst. */

void  CopyToString (char *dst, const char *src, int len)
{
    if (len)  memcpy(dst, src, len);
    dst[len] = '\0';
}

/* duplicate with public module 2006-09-25*/
/*
void gettime(time_buf)
char    *time_buf;
{
    struct tm *t,tt;
    long curr_time;

    t=&tt;
    curr_time=time((long *)0);
    t=localtime(&curr_time);
    sprintf(time_buf,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);
    time_buf[8]=0;
}
*/

const char * getdaytime(char *daytime_buf)
{
    struct tm *t,tt;
    long curr_time;

    t=&tt;
    curr_time=time((long *)0);
    t=localtime(&curr_time);
    sprintf(daytime_buf,"%04d%02d%02d%02d%02d%02d",
            t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour,
            t->tm_min, t->tm_sec);
    daytime_buf[14] = 0;
	return daytime_buf;
}

