fixed echo, xargs
This commit is contained in:
parent
2a90ce246c
commit
c705f3b30b
5 changed files with 131 additions and 64 deletions
73
libmu/parse_escape.c
Normal file
73
libmu/parse_escape.c
Normal file
|
@ -0,0 +1,73 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
char *mu_parse_escape(const char *prog_name, const char *src) {
|
||||
size_t size = 0;
|
||||
size_t src_len = strlen(src);
|
||||
|
||||
for (size_t i = 0; i < src_len; i++) {
|
||||
size++;
|
||||
size -= (src[i] == '\\');
|
||||
}
|
||||
|
||||
char *buf = malloc(size + 1);
|
||||
if (buf == NULL) {
|
||||
if (prog_name)
|
||||
fprintf(stderr, "%s: malloc: %s\n", prog_name, strerror(errno));
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size = 0;
|
||||
for (size_t i = 0; i < src_len; i++) {
|
||||
char c = src[i];
|
||||
if (c == '\\' && i < src_len) {
|
||||
switch (src[i + 1]) {
|
||||
case 'n':
|
||||
c = '\n';
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
c = '\a';
|
||||
break;
|
||||
|
||||
case 't':
|
||||
c = '\t';
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
c = '\b';
|
||||
break;
|
||||
|
||||
case 'e':
|
||||
c = '\033';
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
c = '\r';
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
c = '\f';
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
c = '\v';
|
||||
break;
|
||||
|
||||
default:
|
||||
c = '\\';
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
buf[size] = c;
|
||||
size++;
|
||||
}
|
||||
|
||||
buf[size + 1] = '\0';
|
||||
return buf;
|
||||
}
|
5
libmu/parse_escape.h
Normal file
5
libmu/parse_escape.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#ifndef PARSE_ESCAPE_H
|
||||
#define PARSE_ESCAPE_H
|
||||
|
||||
char *mu_parse_escape(const char *prog_name, const char *src);
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue