shell-scape: Échappe des caractères spéciaux

main
Clément FRÉVILLE 2 years ago
parent 27eafc7b9c
commit d1d8771348

@ -0,0 +1,25 @@
CC := gcc
CFLAGS := -Wall -Wextra
CPPFLAGS := -isystemthird-party
all: test
test: testEscape
./testEscape
testEscape: build/escape.o build/testEscape.o ../static-string-builder/build/builder.o
$(CC) -o $@ $^
build/escape.o: src/escape.c src/escape.h | build
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
build/testEscape.o: test/testEscape.c src/escape.h | build
$(CC) $(CPPFLAGS) $(CFLAGS) -Isrc/ -c $< -o $@
build:
mkdir build
clean:
rm -rf testEscape build
.PHONY: all test clean

@ -0,0 +1,8 @@
[package]
name = "shell-escape"
version = "0.1.0"
description = "Escape shell characters"
license = "MIT"
[dependencies]
static-string-builder = "^0.1"

@ -0,0 +1,45 @@
#include "escape.h"
#include <static-string-builder/builder.h>
#include <ctype.h>
#include <stdbool.h>
#include <string.h>
bool isShellSafe(char ch) {
return strchr("@%+=:,./-_", ch) != NULL || isalnum(ch);
}
bool isSafeShellStr(const char *str) {
for (; *str; str++) {
if (!isShellSafe(*str)) {
return false;
}
}
return true;
}
const char *shellEscape(const char *str) {
if (isSafeShellStr(str)) {
return str;
}
char *result = tmp_end();
tmp_append_char('\'');
while (str) {
char *end = strchr(str, '\'');
if (end) {
tmp_append_sized(str, end - str);
tmp_append_cstr("'\"'\"'");
str = end + 1;
} else {
tmp_append_cstr(str);
str = NULL;
}
}
tmp_append_char('\'');
tmp_append_char('\0');
return result;
}

@ -0,0 +1,6 @@
#ifndef SHELL_ESCAPE_H
#define SHELL_ESCAPE_H
const char *shellEscape(const char *str);
#endif // SHELL_ESCAPE_H

@ -0,0 +1,15 @@
#include "escape.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
int main(void) {
assert(strcmp("aa", shellEscape("aa")) == 0);
assert(strcmp("'aa bb'", shellEscape("aa bb")) == 0);
assert(strcmp("'a(b)'", shellEscape("a(b)")) == 0);
assert(strcmp("'aa && bb'", shellEscape("aa && bb")) == 0);
assert(strcmp("'echo aa '\"'\"'s'\"'\"''", shellEscape("echo aa 's'")) == 0);
return 0;
}

@ -0,0 +1 @@
../../static-string-builder/src/

@ -22,6 +22,8 @@ char *tmp_end(void);
*/
char *tmp_append_char(char c);
char *tmp_append_sized(const char *buffer, size_t buffer_sz);
char *tmp_append_cstr(const char *cstr);
void tmp_clean();

Loading…
Cancel
Save