tUse suckless arg.h script for handling command-line options - ve - a minimal t… | |
git clone git://src.adamsgaard.dk/ve | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 5a9f61927211165c1e0da5706c60d333fff846a2 | |
parent dc3d4c4dbb62543b349bd8a6f47e6a8f734efea3 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Sun, 11 Aug 2019 21:01:24 +0200 | |
Use suckless arg.h script for handling command-line options | |
Diffstat: | |
A arg.h | 51 +++++++++++++++++++++++++++++… | |
M ve.c | 58 ++++++++++++++++++++++++-----… | |
2 files changed, 96 insertions(+), 13 deletions(-) | |
--- | |
diff --git a/arg.h b/arg.h | |
t@@ -0,0 +1,50 @@ | |
+/* | |
+ * ISC-License | |
+ * | |
+ * Copyright 2004-2017 Christoph Lohmann <[email protected]> | |
+ * Copyright 2017-2018 Laslo Hunhold <[email protected]> | |
+ * | |
+ * Permission to use, copy, modify, and/or distribute this software for any | |
+ * purpose with or without fee is hereby granted, provided that the above | |
+ * copyright notice and this permission notice appear in all copies. | |
+ * | |
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+ */ | |
+#ifndef ARG_H | |
+#define ARG_H | |
+ | |
+extern char *argv0; | |
+ | |
+/* int main(int argc, char *argv[]) */ | |
+#define ARGBEGIN for (argv0 = *argv, *argv ? (argc--, argv++) : ((void *)0); … | |
+ *argv && (*argv)[0] == '-' && (*argv)[1]; argc--, argv++… | |
+ int i_, argused_; … | |
+ if ((*argv)[1] == '-' && !(*argv)[2]) { … | |
+ argc--, argv++; … | |
+ break; … | |
+ } … | |
+ for (i_ = 1, argused_ = 0; (*argv)[i_]; i_++) { … | |
+ switch((*argv)[i_]) | |
+#define ARGEND if (argused_) { … | |
+ if ((*argv)[i_ + 1]) { … | |
+ break; … | |
+ } else { … | |
+ argc--, argv++; … | |
+ break; … | |
+ } … | |
+ } … | |
+ } … | |
+ } | |
+#define ARGC() ((*argv)[i_]) | |
+#define ARGF_(x) (((*argv)[i_ + 1]) ? (argused_ = 1, &((*argv)[i_ + 1])) : … | |
+ (*(argv + 1)) ? (argused_ = 1, *(argv + 1)) : (x)) | |
+#define EARGF(x) ARGF_(((x), exit(1), (char *)0)) | |
+#define ARGF() ARGF_((char *)0) | |
+ | |
+#endif | |
+\ No newline at end of file | |
diff --git a/ve.c b/ve.c | |
t@@ -15,6 +15,7 @@ | |
#include <time.h> | |
#include <unistd.h> | |
+#include "arg.h" | |
/* MACROS */ | |
#define ABUF_INIT {NULL, 0} | |
t@@ -68,7 +69,7 @@ void editor_set_status_message(const char *fmt, ...); | |
/* GLOBAL VARIABLES */ | |
struct editor_config E; | |
- | |
+char *argv0; | |
/* FUNCTION DEFINITIONS */ | |
t@@ -415,6 +416,7 @@ editor_concatenate_rows(int *buflen) | |
/** FILE IO **/ | |
+/* open file and read lines into memory */ | |
void | |
file_open(char *filename) | |
{ | |
t@@ -940,13 +942,14 @@ editor_process_keypress() | |
break; | |
case 'q': | |
if (E.file_changed) { | |
- editor_set_status_mess… | |
- … | |
- … | |
+ editor_set_status_mess… | |
+ "error: file h… | |
+ "Press :q! to … | |
break; | |
} else { | |
- /*write(STDOUT_FILENO,… | |
- /* write(STDOUT_FILENO… | |
+ /* clear screen */ | |
+ write(STDOUT_FILENO, "… | |
+ write(STDOUT_FILENO, "… | |
exit(0); | |
break; | |
} | |
t@@ -1083,7 +1086,8 @@ deinit_editor() { | |
/* set editor state variables, make room for status */ | |
void | |
-init_editor() { | |
+init_editor() | |
+{ | |
E.cursor_x = 0; | |
E.cursor_y = 0; | |
E.cursor_rx = 0; | |
t@@ -1101,21 +1105,49 @@ init_editor() { | |
E.find_query = NULL; | |
} | |
+void | |
+usage() | |
+{ | |
+ printf("%s: %s [OPTIONS] [FILES]\n" | |
+ "\nOptional arguments:\n" | |
+ " -h show this message\n" | |
+ " -v show version information\n", | |
+ __func__, PROGNAME); | |
+} | |
+ | |
+void | |
+version() | |
+{ | |
+ printf("%s version %s\n" | |
+ "Licensed under the GNU Public License, v3+\n" | |
+ "written by Anders Damsgaard, [email protected]\n" | |
+ "https://gitlab.com/admesg/ve\n", | |
+ PROGNAME, VERSION); | |
+} | |
/** MAIN **/ | |
int | |
-main(int argc, char* argv[]) | |
+main(int argc, char *argv[]) | |
{ | |
+ ARGBEGIN { | |
+ case 'h': | |
+ usage(); | |
+ return 0; | |
+ case 'v': | |
+ version(); | |
+ return 0; | |
+ default: | |
+ usage(); | |
+ } ARGEND; | |
+ | |
enable_raw_mode(); | |
init_editor(); | |
- /* TODO: proper argument handling */ | |
- if (argc >= 2) { | |
- file_open(argv[1]); | |
- } | |
- | |
editor_set_status_message("%s %s", PROGNAME, VERSION); | |
+ if (argv[0]) | |
+ file_open(argv[0]); | |
+ | |
while (1) { | |
editor_update_screen_size(); | |
editor_refresh_screen(); |