From d10b5ecfc4b3a37e67c2ee43450adf944a8c4941 Mon Sep 17 00:00:00 2001
From: Lionel Debroux <lionel_debroux@yahoo.fr>
Date: Sun, 28 Dec 2008 18:04:04 +0100
Subject: tprbuilder: under *nix, escape shell metacharacters in command lines.
This way, a data variable named "a\a" in the TPR works properly (previously, "a\\a" had to be used instead).
---
trunk/tigcc/tprbuilder/src/tprbuilder.c | 54 +++++++++++++++++++++++++++++++
1 files changed, 54 insertions(+), 0 deletions(-)
diff --git a/trunk/tigcc/tprbuilder/src/tprbuilder.c b/trunk/tigcc/tprbuilder/src/tprbuilder.c
index 5de76fe..81cb8d3 100644
|
a
|
b
|
int delete(char *filename) |
| 371 | 371 | return 0; |
| 372 | 372 | } |
| 373 | 373 | |
| | 374 | #ifndef __WIN32__ |
| | 375 | /* |
| | 376 | Escape command line. |
| | 377 | */ |
| | 378 | static inline void escape_arg(char *escaped_arg, const char *unescaped_arg) |
| | 379 | { |
| | 380 | char *p; |
| | 381 | strcpy(escaped_arg,unescaped_arg); |
| | 382 | for (p=escaped_arg; *p; p++) { |
| | 383 | switch (*p) { |
| | 384 | /* The following characters are shell characters and need to be escaped! */ |
| | 385 | case '\\': |
| | 386 | case '\"': |
| | 387 | case '\'': |
| | 388 | case '$': |
| | 389 | case '!': |
| | 390 | case '^': |
| | 391 | case '&': |
| | 392 | case '*': |
| | 393 | case '(': |
| | 394 | case ')': |
| | 395 | case '~': |
| | 396 | case '[': |
| | 397 | case ']': |
| | 398 | case '|': |
| | 399 | case '{': |
| | 400 | case '}': |
| | 401 | case ';': |
| | 402 | case '<': |
| | 403 | case '>': |
| | 404 | case '?': |
| | 405 | memmove(p+1,p,strlen(p)+1); |
| | 406 | *(p++)='\\'; |
| | 407 | default: |
| | 408 | break; |
| | 409 | } |
| | 410 | } |
| | 411 | } |
| | 412 | #endif |
| | 413 | |
| 374 | 414 | /* |
| 375 | 415 | Execute a program by calling the shell |
| 376 | 416 | */ |
| … |
… |
int execute(char *cmdline) |
| 380 | 420 | fprintf(stderr, "tprbuilder: %s\n", cmdline); |
| 381 | 421 | } |
| 382 | 422 | |
| | 423 | #ifndef __WIN32__ |
| | 424 | /* Under *nix, we need to escape shell metacharacters. */ |
| | 425 | char escapedcmdline[((strlen(cmdline))<<1)+1]; |
| | 426 | escape_arg(escapedcmdline,cmdline); |
| | 427 | if (!quiet) { |
| | 428 | fprintf(stderr, "tprbuilder: %s\n", escapedcmdline); |
| | 429 | } |
| | 430 | |
| | 431 | if(system(escapedcmdline) != 0) { |
| | 432 | exit(0); |
| | 433 | } |
| | 434 | #else |
| 383 | 435 | if(system(cmdline) != 0) { |
| 384 | 436 | exit(0); |
| 385 | 437 | } |
| | 438 | #endif |
| 386 | 439 | |
| 387 | 440 | return 0; |
| 388 | 441 | } |
| … |
… |
char* strip(char *str) |
| 426 | 479 | return str; |
| 427 | 480 | } |
| 428 | 481 | |
| | 482 | |
| 429 | 483 | /* |
| 430 | 484 | Print an error msg |
| 431 | 485 | */ |