\fBShake\fP does not support some features of \fBBake\fP, such as \fB@STOP\fP or \fBbinary files\fP,
please avoid its use.
-Options [Must always be put first, may be merged together]
+Options must always be put first, and may be merged together.
.HP
-.B \-v \-\-version, \-h \-\-help, \-n \-\-dry\-run, \-x \-\-expunge
+\-v \-\-version, \-h \-\-help, \fB\-n \-\-dry\-run\fP, \fB\-x \-\-expunge\fP,
+\fB\-c \-\-color\fP
.PP
Expansions
-These will expand to their counterpart statically first thing.
-These may only be inserted inside of markers.
+These symbols will expand to their counterpart before execution.
.TP
.B @FILENAME, $@
-returns target\-file (abc.x.txt)
+returns target\-file (abc.x.txt)
.TP
.B @SHORT, $*
returns target\-file without suffix (abc.x.txt \-> abc.x)
.PP
Additional Features And Notes
-\fB@{\fPEXPUNGE_THIS_FILE\fB}\fP is a inline block to delete files or directories, non-recursive, only one file per block, removed from left to right. Has no influence on the normal command execution.
+Shell execution may be disabled with the
+.B -n or --dry-run
+option.
-\\SPECIAL_NAME will result in SPECIAL_NAME in the executed shell command. Backslashes are applicable to all symbols used by Bake, they are ignored otherwise.
+\fB@{\fPEXPUNGE_THIS_FILE\fB}\fP is a inline block to delete files or
+directories, non-recursive, only one file per block, removed from left to right.
+Has no influence on the normal command execution. The deletion only occurs if
+you use the
+.B -x or --expunge
+option.
+
+Colors may be disabled with the
+.B -c or --color
+option.
+
+\\SPECIAL_NAME will result in SPECIAL_NAME in the executed shell
+command. Backslashes are applicable to all symbols used by Bake, they are
+ignored otherwise.
.SH EXAMPLE
.\" SRC BEGIN (example.c)
.EX
// example.c
-// @BAKE cc $@ -o $*
+// @BAKE cc -o @{@SHORT} @FILENAME @ARGS
+// or, simply, @BAKE cc -o @{$*} $@ $+
#include <stdio.h>
int main (void) {
- printf("Hello.");
+ puts("Hello.");
+ return 0;
}
.EE
.SH COPYRIGHT
* @BAKE cc -std=c89 -O2 @FILENAME -o @{@SHORT} @ARGS @STOP
*/
+#define _GNU_SOURCE
#define _POSIX_C_SOURCE 200809L
#include <assert.h>
#define HELP \
BOLD "[option] target-file" RESET " [" GREEN "arguments" RESET " ...]\n" \
"Use the format `" BOLD "@BAKE" RESET " cmd ...' within the target-file, this will execute the\n" \
- "rest of line, or if found within the file, until the " BOLD "@STOP" RESET " marker.\n" \
+ "rest of line, or if found within the file, until the " BOLD "@STOP" RESET " marker.\n"
#define DESC \
"Options [Must always be put first, may be merged together]\n" \
"\t" DIM "-v --version" RESET ", " DIM "-h --help" RESET ", " \
- BOLD "-n --dry-run" RESET ", " BOLD "-x --expunge\n" RESET \
+ BOLD "-n --dry-run" RESET ", " BOLD "-x --expunge\n" RESET ", " \
+ BOLD "-c --color" RESET \
"Expansions\n" \
"\t" YELLOW "@FILENAME" RESET " returns target-file (abc.x.txt)\n" \
"\t" YELLOW "@SHORT " RESET " returns target-file without suffix (^-> abc.x)\n" \
typedef string_t map_t;
+/*** nocolor printf ***/
+
+#if ENABLE_COLOR
+# define color_printf(...) color_fprintf(stdout, __VA_ARGS__)
+/* not perfect, too simple, doesn't work with a var, only a literal. */
+# define color_puts(msg) color_fprintf(stdout, msg "\n")
+
+int color = ENABLE_COLOR;
+
+static char * expand(char * buf, char * macro, char * with);
+
+color_fprintf(FILE * fp, char * format, ...) {
+ va_list ap;
+ char * buf;
+ va_start(ap, format);
+ if (!color) {
+
+ vasprintf(&buf, format, ap);
+
+ if (buf) {
+ expand(buf, RED, "");
+ expand(buf, GREEN, "");
+ expand(buf, YELLOW, "");
+ expand(buf, DIM, "");
+ expand(buf, BOLD, "");
+ expand(buf, RESET, "");
+
+ fwrite(buf, strlen(buf), 1, fp);
+ }
+
+ free(buf);
+ } else {
+ vfprintf(fp, format, ap);
+ }
+ va_end(ap);
+
+}
+#else
+# define color_printf(...) fprintf(stdout, __VA_ARGS__)
+# define color_puts(msg) puts(msg)
+#endif
+
/*** root ***/
static void
if (rm & BAKE_EXPUNGE) {
swap(buf + i + (f - i), x);
#if !ENABLE_EXPUNGE_REMOVE
- printf("%s: %sremoving '%s'\n",
- argv0, rm & BAKE_NORUN ? "not " : "", buf + i);
+ color_printf("%s: %sremoving '%s'\n",
+ argv0, rm & BAKE_NORUN ? "not " : "", buf + i);
+
if (!(rm & BAKE_NORUN)) {
remove(buf + i);
}
+
#else
- printf("%s: not removing '%s'\n", argv0, buf + i);
+ color_printf("%s: not removing '%s'\n", argv0, buf + i);
#endif
swap(buf + i + (f - i), x);
}
static int
run(char * buf, char * argv0) {
pid_t pid;
- puts(BOLD GREEN "output" RESET ":\n");
+ color_puts(BOLD GREEN "output" RESET ":\n");
if ((pid = fork()) == 0) {
execl("/bin/sh", "sh", "-c", buf, NULL);
return 0; /* execl overwrites the process anyways */
} else if (pid == -1) {
- fprintf(stderr, BOLD RED "%s" RESET ": %s, %s\n",
- argv0, "Fork Error", strerror(errno));
+ color_fprintf(stderr, BOLD RED "%s" RESET ": %s, %s\n",
+ argv0, "Fork Error", strerror(errno));
return BAKE_ERROR;
} else {
int status;
if (waitpid(pid, &status, 0) < 0) {
- fprintf(stderr, BOLD RED "%s" RESET ": %s, %s\n",
- argv0, "Wait PID Error", strerror(errno));
+ color_fprintf(stderr, BOLD RED "%s" RESET ": %s, %s\n",
+ argv0, "Wait PID Error", strerror(errno));
return BAKE_ERROR;
}
main(int argc, char ** argv) {
int ret = BAKE_RUN;
char * buf = NULL,
- * filename,
- * argv0;
+ * filename,
+ * argv0;
argv0 = argv[0];
ret |= BAKE_EXPUNGE;
} else if (!strcmp(argv[0], "dry-run")) {
ret |= BAKE_NORUN;
+ } else if (!strcmp(argv[0], "color")) {
+#if ENABLE_COLOR
+ color = 0;
+#endif
} else {
- puts("UNKNOWN");
goto help;
}
} else do {
ret |= BAKE_NORUN;
break;
+#if ENABLE_COLOR
+
+ case 'c':
+ color = 0;
+ break;
+#endif
+
case 0 :
goto next;
default :
- puts("UNKNOWN");
+ color_puts("UNKNOWN");
goto help;
}
} while (++(argv[0]));
++argv, --argc;
if (strlen(filename) > FILENAME_LIMIT) {
- fprintf(stderr, BOLD RED "%s" RESET
- ": Filename too long (exceeds %d)\n",
- argv0,
- FILENAME_LIMIT);
+ color_fprintf(stderr, BOLD RED "%s" RESET
+ ": Filename too long (exceeds %d)\n",
+ argv0,
+ FILENAME_LIMIT);
return BAKE_ERROR;
}
error[0] = "File Unrecognized";
error[1] = "Found start without suffix spacing";
- fprintf(stderr, BOLD RED "%s" RESET ": '" BOLD "%s" RESET "' %s.\n",
- argv0, filename, errno ? strerror(errno) : error[bake_errno]);
+ color_fprintf(stderr, BOLD RED "%s" RESET ": '" BOLD "%s" RESET "' %s.\n",
+ argv0, filename, errno ? strerror(errno) : error[bake_errno]);
return BAKE_ERROR;
}
buf = bake_expand(buf, filename, argc, argv);
- printf(BOLD GREEN "%s" RESET ": %s\n", argv0, buf + strip(buf));
+ color_printf(BOLD GREEN "%s" RESET ": %s\n", argv0, buf + strip(buf));
remove_expand(buf, argv0, ret, EXPUNGE_START, EXPUNGE_STOP);
ret = run(buf, argv0);
if (ret) {
- printf(BOLD RED "result" RESET ": " BOLD "%d\n" RESET, ret);
+ color_printf(BOLD RED "result" RESET ": " BOLD "%d\n" RESET, ret);
}
} else { ret = 0; }
free(buf);
return ret;
help:
- fprintf(stderr, YELLOW "%s" RESET ": %s\n", argv0, HELP DESC);
+ color_fprintf(stderr, YELLOW "%s" RESET ": %s\n", argv0, HELP DESC);
return BAKE_ERROR;
version:
- fprintf(stderr,
- YELLOW "%s" RESET ": v" VERSION "\n"
- "Copyright " COPYRIGHT "\n" LICENSE "\n",
- argv0);
+ color_fprintf(stderr,
+ YELLOW "%s" RESET ": v" VERSION "\n"
+ "Copyright " COPYRIGHT "\n" LICENSE "\n",
+ argv0);
return BAKE_ERROR;
}