aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/fish_indent.cpp
diff options
context:
space:
mode:
authorGravatar Camille Scholtz <onodera@openmailbox.org>2016-05-18 17:37:13 +0200
committerGravatar Kurtis Rader <krader@skepticism.us>2016-05-22 20:00:23 -0700
commit2606cfe72db59735e8ab685f778968a1cf8c10be (patch)
tree4e030e9a3bc2ff07cf5e12bdc1ef8fcc67ad6117 /src/fish_indent.cpp
parent85e701f42212fb51ba260d98555dc2763360ed83 (diff)
add option to modify script being restyled
This change allows the user to specify the script name on the CLI in addition to being redirected from stdin. It also adds a `-w` flag to write the modified script to the original file.
Diffstat (limited to 'src/fish_indent.cpp')
-rw-r--r--src/fish_indent.cpp74
1 files changed, 57 insertions, 17 deletions
diff --git a/src/fish_indent.cpp b/src/fish_indent.cpp
index 7e68e310..a1479f47 100644
--- a/src/fish_indent.cpp
+++ b/src/fish_indent.cpp
@@ -18,12 +18,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#include "config.h" // IWYU pragma: keep
#include <assert.h>
+#include <errno.h>
#include <getopt.h>
#include <locale.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <wchar.h>
#include <wctype.h>
#include <memory>
@@ -164,10 +166,9 @@ static void prettify_node_recursive(const wcstring &source, const parse_node_tre
// Entry point for prettification.
static wcstring prettify(const wcstring &src, bool do_indent) {
parse_node_tree_t tree;
- if (!parse_tree_from_string(src,
- parse_flag_continue_after_error | parse_flag_include_comments |
- parse_flag_leave_unterminated | parse_flag_show_blank_lines,
- &tree, NULL /* errors */)) {
+ int parse_flags = (parse_flag_continue_after_error | parse_flag_include_comments |
+ parse_flag_leave_unterminated | parse_flag_show_blank_lines);
+ if (!parse_tree_from_string(src, parse_flags, &tree, NULL)) {
// We return the initial string on failure.
return src;
}
@@ -339,26 +340,27 @@ int main(int argc, char *argv[]) {
// Types of output we support.
enum {
output_type_plain_text,
+ output_type_file,
output_type_ansi,
output_type_html
} output_type = output_type_plain_text;
+ const char *output_location;
bool do_indent = true;
- const char *short_opts = "+dhvi";
- const struct option long_opts[] = {{"dump", no_argument, NULL, 'd'},
- {"no-indent", no_argument, NULL, 'i'},
- {"help", no_argument, NULL, 'h'},
- {"version", no_argument, NULL, 'v'},
- {"html", no_argument, NULL, 1},
- {"ansi", no_argument, NULL, 2},
- {NULL, 0, NULL, 0}};
+ const char *short_opts = "+dhvwi";
+ const struct option long_opts[] = {
+ {"dump", no_argument, NULL, 'd'}, {"no-indent", no_argument, NULL, 'i'},
+ {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'v'},
+ {"write", no_argument, NULL, 'w'}, {"html", no_argument, NULL, 1},
+ {"ansi", no_argument, NULL, 2}, {NULL, 0, NULL, 0}};
int opt;
while ((opt = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) {
switch (opt) {
case 0: {
fwprintf(stderr, _(L"getopt_long() unexpectedly returned zero\n"));
- exit_without_destructors(127);
+ exit(127);
+ break;
}
case 'd': {
dump_parse_tree = true;
@@ -366,12 +368,16 @@ int main(int argc, char *argv[]) {
}
case 'h': {
print_help("fish_indent", 1);
- exit_without_destructors(0);
+ exit(0);
+ break;
}
case 'v': {
fwprintf(stderr, _(L"%ls, version %s\n"), program_name, get_fish_version());
exit(0);
- assert(0 && "Unreachable code reached");
+ break;
+ }
+ case 'w': {
+ output_type = output_type_file;
break;
}
case 'i': {
@@ -388,12 +394,33 @@ int main(int argc, char *argv[]) {
}
default: {
// We assume getopt_long() has already emitted a diagnostic msg.
- exit_without_destructors(1);
+ exit(1);
+ break;
}
}
}
- const wcstring src = read_file(stdin);
+ argc -= optind;
+ argv += optind;
+
+ wcstring src;
+ if (argc == 0) {
+ src = read_file(stdin);
+ } else if (argc == 1) {
+ FILE *fh = fopen(*argv, "r");
+ if (fh) {
+ src = read_file(fh);
+ fclose(fh);
+ output_location = *argv;
+ } else {
+ fwprintf(stderr, _(L"Opening \"%s\" failed: %s\n"), *argv, strerror(errno));
+ exit(1);
+ }
+ } else {
+ fwprintf(stderr, _(L"Too many arguments\n"));
+ exit(1);
+ }
+
const wcstring output_wtext = prettify(src, do_indent);
// Maybe colorize.
@@ -409,6 +436,19 @@ int main(int argc, char *argv[]) {
colored_output = no_colorize(output_wtext);
break;
}
+ case output_type_file: {
+ FILE *fh = fopen(output_location, "w");
+ if (fh) {
+ fputs(wcs2str(output_wtext), fh);
+ fclose(fh);
+ exit(0);
+ } else {
+ fwprintf(stderr, _(L"Opening \"%s\" failed: %s\n"), output_location,
+ strerror(errno));
+ exit(1);
+ }
+ break;
+ }
case output_type_ansi: {
colored_output = ansi_colorize(output_wtext, colors);
break;