/************************************************/
/*                                              */
/* File        : userconv.h                     */
/* Description : tl compiler definitions        */
/*                                              */
/* Command     : conv                           */
/* Comment     : Convert varius formats         */
/*                                              */
/* Author: Sfiligoi Igor                        */
/*                                              */
/* Last modified: 12.05.1997                    */
/*                                              */
/************************************************/

#include <string.h>
#include <tlforms.h>
#include "userconv.h"

/* conv real2breal data function*/
/* return TL_OK iff no error */
int freal2breal(t_real2breal *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv real2freal data function*/
/* return TL_OK iff no error */
int freal2freal(t_real2freal *data)
{
 if (!(data->maxint_present))
   data->maxint = -1;
 if (!(data->maxfract_present))
   data->maxfract=-1;

 data->result = (char *) malloc(1024);  /* worstest case */
 freal2str(data->indata,data->maxint,data->maxfract,data->result);

 return TL_OK;
}

/* conv real2real data function*/
/* return TL_OK iff no error */
int freal2real(t_real2real *data)
{
 if (!(data->maxfract_present))
   data->maxfract=-1;

 data->result = (char *) malloc(1024); /* worstest case */
 real2str(data->indata,data->maxfract,data->result);

 return TL_OK;
}

/* conv bool2cbool data function*/
/* return TL_OK iff no error */
int fbool2cbool(t_bool2cbool *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv bool2nbool data function*/
/* return TL_OK iff no error */
int fbool2nbool(t_bool2nbool *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv bool2bool data function*/
/* return TL_OK iff no error */
int fbool2bool(t_bool2bool *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv compact2nat data function*/
/* return TL_OK iff no error */
int fcompact2nat(t_compact2nat *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv octal2nat data function*/
/* return TL_OK iff no error */
int foctal2nat(t_octal2nat *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv binary2nat data function*/
/* return TL_OK iff no error */
int fbinary2nat(t_binary2nat *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv hex2nat data function*/
/* return TL_OK iff no error */
int fhex2nat(t_hex2nat *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv nat2compact data function*/
/* return TL_OK iff no error */
int fnat2compact(t_nat2compact *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv nat2binary data function*/
/* return TL_OK iff no error */
int fnat2binary(t_nat2binary *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv nat2octal data function*/
/* return TL_OK iff no error */
int fnat2octal(t_nat2octal *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv nat2hex data function*/
/* return TL_OK iff no error */
int fnat2hex(t_nat2hex *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv nat2nat data function*/
/* return TL_OK iff no error */
int fnat2nat(t_nat2nat *data)
{
 data->result = data->indata; /* copy in to out */

 return TL_OK;
}

/* conv expand data function*/
/* return TL_OK iff no error */
int fexpand(t_expand *data)
{
 char fillch; /* filling char */
 int format;
 unsigned int inlength;

 inlength = strlen(data->indata);

 if (data->length<inlength)
   { /* copy in to out and exit*/
    data->result = (char *) malloc(inlength+1);
    strcpy(data->result,data->indata);

    return TL_OK;
   }


 if (data->fillchar_present)
   fillch = data->fillchar;
 else
   fillch = ' ';

 if (data->format_present)
   format = data->format.nr;
 else
   format = cef_right;

 data->result = (char *) malloc(data->length+1);
 memset(data->result,fillch,data->length); /* preventively fill with fillch */

 switch (format) 
 {
  case cef_left:
    memcpy(&(data->result[0]),data->indata,inlength);
    break;
  case cef_right:
    memcpy(&(data->result[data->length-inlength]),data->indata,inlength);
    break;
  case cef_center:
    memcpy(&(data->result[(data->length-inlength)/2]),data->indata,inlength);
    break;
 }
 data->result[data->length] = 0;  /* terminate string */

 return TL_OK; 
}