#include "sh.h"
void p2dig_ull(unsigned long long);
void p2dig_int(int);
void flush(void);
void Putchar(tchar);
void
psecs_ull(unsigned long long l)
{
unsigned long long i;
i = l / 3600;
if (i) {
printf("%llu:", i);
i = l % 3600;
p2dig_ull(i / 60);
goto minsec;
}
i = l;
printf("%llu", i / 60);
minsec:
i %= 60;
printf(":");
p2dig_ull(i);
}
void
psecs_int(int l)
{
int i;
i = l / 3600;
if (i) {
printf("%d:", i);
i = l % 3600;
p2dig_int(i / 60);
goto minsec;
}
i = l;
printf("%d", i / 60);
minsec:
i %= 60;
printf(":");
p2dig_int(i);
}
void
p2dig_ull(unsigned long long i)
{
printf("%llu%llu", i / 10, i % 10);
}
void
p2dig_int(int i)
{
printf("%d%d", i / 10, i % 10);
}
char linbuf[128];
char *linp = linbuf;
#ifdef MBCHAR
void
putbyte(int c)
{
if ((c & QUOTE) == 0 && (c == 0177 || c < ' ' && c != '\t' &&
c != '\n')) {
putbyte('^');
if (c == 0177) {
c = '?';
} else {
c |= 'A' - 1;
}
}
c &= TRIM;
*linp++ = c;
if (c == '\n' || linp >= &linbuf[sizeof (linbuf) - 1 - MB_CUR_MAX]) {
flush();
}
}
void
Putchar(tchar tc)
{
int n;
if (isascii(tc&TRIM)) {
putbyte((int)tc);
return;
}
tc &= TRIM;
n = wctomb(linp, tc);
if (n == -1) {
return;
}
linp += n;
if (linp >= &linbuf[sizeof (linbuf) - 1 - MB_CUR_MAX]) {
flush();
}
}
#else
void
putbyte(int c)
{
if ((c & QUOTE) == 0 && (c == 0177 || c < ' ' && c != '\t' &&
c != '\n')) {
putbyte('^');
if (c == 0177) {
c = '?';
} else {
c |= 'A' - 1;
}
}
c &= TRIM;
*linp++ = c;
if (c == '\n' || linp >= &linbuf[sizeof (linbuf) - 2]) {
flush();
}
}
void
Putchar(tchar tc)
{
putbyte((int)tc);
}
#endif
void
draino(void)
{
linp = linbuf;
}
void
flush(void)
{
int unit;
int lmode;
if (linp == linbuf) {
return;
}
if (haderr) {
unit = didfds ? 2 : SHDIAG;
} else {
unit = didfds ? 1 : SHOUT;
}
#ifdef TIOCLGET
if (didfds == 0 && ioctl(unit, TIOCLGET, (char *)&lmode) == 0 &&
lmode&LFLUSHO) {
lmode = LFLUSHO;
(void) ioctl(unit, TIOCLBIC, (char *)&lmode);
(void) write(unit, "\n", 1);
}
#endif
(void) write(unit, linbuf, linp - linbuf);
linp = linbuf;
}
void
write_string(char *s)
{
int unit;
flush();
if (haderr) {
unit = didfds ? 2 : SHDIAG;
} else {
unit = didfds ? 1 : SHOUT;
}
(void) write(unit, s, strlen(s));
}