mp-utils/src/echo.c

103 lines
1.4 KiB
C

/* echo -- version two */
/* program to print argument vector to stdout while escaping BEL, tab, backspace and others */
/* mostly SUS compliant */
#include <stdlib.h>
#include <stdio.h>
#include "support.h"
void escape(char c)
{
switch(c)
{
case 'a':
fputc('\a', stdout);
break;
case 'b':
fputc('\b', stdout);
break;
case 'c':
exit(EXIT_SUCCESS);
break;
case 'f':
fputc('\f', stdout);
break;
case 'n':
fputc('\n', stdout);
break;
case 'r':
fputc('\r', stdout);
break;
case 't':
fputc('\t', stdout);
break;
case 'v':
fputc('\v', stdout);
break;
case '\\':
fputc('\\', stdout);
break;
case '0':
break;
default:
fputc('\\', stdout);
fputc(c, stdout);
break;
}
}
int main(int argc, char **argv)
{
char esc_state;
int i, i2;
esc_state = 0;
i = 1;
i2 = 0;
for(; i < argc; i++)
{
for(i2 = 0; argv[i][i2] != '\0'; i2++)
{
if(!esc_state && '\\' == argv[i][i2])
{
esc_state = 1;
}
else if(esc_state)
{
esc_state = 0;
escape(argv[i][i2]);
}
else
{
fputc(argv[i][i2], stdout);
}
}
if(esc_state)
{
esc_state = 0;
fputc('\\', stdout);
}
if((i + 1) != argc)
{
fputc(' ', stdout);
}
}
fputc('\n', stdout);
exit(EXIT_SUCCESS);
}