// CHAR_AUX.C
// Auxiliary string functions
// © 2021 Peter J. Meyer
#include "iss.h"
static char *sltoa_intl(long x, char *str, char sep);
static char *ultoa_intl(unsigned long x, char *str, char sep);
// This moves the pointer at *p to the first character past the last space.
// Tab characters are treated as spaces.
/*-----------------------*/
void skip_spaces(char** pp) // a pointer to a pointer to a char
{
while ( **pp == ' ' || **pp == TAB )
(*pp)++;
}
/*---------------------------------*/
void remove_leading_spaces(char *str)
{
char *start = str;
skip_spaces(&str);
move_str_left(start,str);
}
// Copy bytes at str1 to str until 0 byte is copied.
/*-------------------------------------*/
void move_str_left(char *str1, char *str2)
{
if ( str1 > str2 )
return;
while ( true )
{
if ( !( *(str1++) = *(str2++) ) )
break;
}
}
// This treats tab characters as spaces.
/*----------------------------------*/
void remove_trailing_spaces(char *str)
{
char *ptr = str;
while ( *ptr )
ptr++;
while ( ptr-- > str )
{
if ( ( *ptr != SPACE ) && ( *ptr != TAB ) )
break;
*ptr = 0;
}
}
/*-------------------------------*/
void remove_outer_spaces(char *str)
{
remove_trailing_spaces(str);
remove_leading_spaces(str);
}
/*------------------*/
void spaces(char *str,
int num_spaces)
{
if ( num_spaces < 0 )
return;
str[num_spaces] = 0;
while ( --num_spaces >= 0 )
str[num_spaces] = SPACE;
}
// This removes all trailing zeros from the end of number
// except for a zero following a decimal point.
/*-------------------------------------*/
void remove_trailing_zeros(char *num_str)
{
char *ptr = num_str;
while ( *ptr )
ptr++;
while ( ptr-- > num_str )
{
if ( *ptr != '0' )
break;
*ptr = 0;
}
while ( *ptr )
ptr++;
if ( *(ptr-1) == '.' )
{
*(ptr++) = '0';
*ptr = 0;
}
}
// Call with format = 0 for ISO date format,
// 1 for European date format, 2 for U.S. date format.
/*-----------------------------*/
char *system_date(char *date_str,
int format)
{
int day, month, year;
_strdate(date_str); // "mm/dd/yy" in date_str
month = atoi(date_str);
day = atoi(&date_str[3]);
year = atoi(&date_str[6]);
year += ( year < 80 ? 2000 : 1900 );
switch ( format )
{
case ISO:
sprintf(date_str,"%04d-%02d-%02d",year,month,day);
break;
case EUR:
sprintf(date_str,"%04d/%02d/%02d",day,month,year);
break;
case US:
sprintf(date_str,"%04d/%02d/%02d",month,day,year);
break;
}
return ( date_str );
}
// Call with seconds = true to include seconds.
/*-----------------------------*/
char *system_time(char *time_str,
int seconds)
{
_strtime(time_str); // "hh:mm:ss" in time_str
if ( !seconds )
time_str[5] = 0;
return ( time_str );
}
/*----------------------*/
char *sltoa_commas(long x,
char *str)
{
return ( sltoa_intl(x,str,',') );
}
/*---------------------------*/
static char *sltoa_intl(long x,
char *str,
char sep)
{
if ( x < 0 )
{
strcpy(str,"-");
x = labs(x);
ultoa_intl(x,str+1,sep);
}
else
ultoa_intl(x,str,sep);
return ( str );
}
/*-------------------------------*/
char *ultoa_commas(unsigned long x,
char *str)
{
return ( ultoa_intl(x,str,',') );
}
/*------------------------------------*/
static char *ultoa_intl(unsigned long x,
char *str,
char sep)
{
int i;
char thousands[4][4];
char scratch6[6], sep_str[2];
sep_str[0] = sep;
sep_str[1] = 0;
*str = 0;
i = 0;
while ( x >= 1000 )
{
sprintf(thousands[i++],"%03d",x%1000);
x /= 1000;
}
itoa((int)x,scratch6,10);
strcat(str,scratch6);
while ( --i >= 0 )
{
strcat(str,sep_str);
strcat(str,thousands[i]);
}
return ( str );
}
// Converts a number of seconds to days, hours, minutes, seconds.
/*------------------------------------------------*/
char *seconds_to_time_str(unsigned long num_seconds,
char *time_str)
{
int days, hours, minutes, seconds;
char tempstr[16];
*time_str = 0;
if ( num_seconds >= 0 )
{
days = num_seconds/86400L;
num_seconds %= 86400;
hours = num_seconds/3600;
num_seconds %= 3600;
minutes = num_seconds/60;
seconds = num_seconds%60;
if ( days )
sprintf(time_str,"%d day%s, ",days,(days==1?"":"s"));
if ( hours )
{
sprintf(tempstr,"%d hour%s, ",hours,(hours==1?"":"s"));
strcat(time_str,tempstr);
}
if ( minutes )
{
sprintf(tempstr,"%d minute%s, ",minutes,(minutes==1?"":"s"));
strcat(time_str,tempstr);
}
if ( seconds )
{
sprintf(tempstr,"%d second%s, ",seconds,(seconds==1?"":"s"));
strcat(time_str,tempstr);
}
if ( days || hours || minutes || seconds )
*strrchr(time_str,',') = 0;
else
strcpy(time_str,"0 seconds");
}
return ( time_str );
}