103 lines
1.4 KiB
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);
|
|
}
|
|
|