git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 4/5] implement error_errno and warning_errno

From
Luke Dashjr <luke-jr+git@utopios.org>
Date
Aug 13, 2009, 03:20 UTC
Message-ID
<1250133624-2272-4-git-send-email-luke-jr+git@utopios.org>
In-Reply-To
<1250133624-2272-3-git-send-email-luke-jr+git@utopios.org>

This allows for easier conversion of code that currently does a (fatal) die_errno to a safer error (which can be ignored), or perhaps even warning status.

Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
---
 git-compat-util.h |    2 +
 usage.c           |   66 ++++++++++++++++++++++++-----------------------------
 2 files changed, 32 insertions(+), 36 deletions(-)
diff --git a/git-compat-util.h b/git-compat-util.h
index 9f941e4..25d4c1e 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -181,7 +181,9 @@ extern void usage(const char *err) NORETURN;
 extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
 extern void die_errno(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
 extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
+extern int error_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
+extern void warning_errno(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
 extern void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN);
 
diff --git a/usage.c b/usage.c
index b6aea45..dce90dc 100644
--- a/usage.c
+++ b/usage.c
@@ -39,7 +39,7 @@ static void warn_builtin(const char *warn, va_list params)
 static void (*usage_routine)(const char *err) NORETURN = usage_builtin;
 static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
 static void (*error_routine)(const char *err, va_list params) = error_builtin;
-static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
+static void (*warning_routine)(const char *err, va_list params) = warn_builtin;
 
 void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
 {
@@ -51,19 +51,8 @@ void usage(const char *err)
 	usage_routine(err);
 }
 
-void die(const char *err, ...)
+static void _e_errno(const char *fmt, char *fmt_with_err, size_t sizeof_fmt_with_err)
 {
-	va_list params;
-
-	va_start(params, err);
-	die_routine(err, params);
-	va_end(params);
-}
-
-void die_errno(const char *fmt, ...)
-{
-	va_list params;
-	char fmt_with_err[1024];
 	char str_error[256], *err;
 	int i, j;
 
@@ -81,28 +70,33 @@ void die_errno(const char *fmt, ...)
 		}
 	}
 	str_error[j] = 0;
-	snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);
-
-	va_start(params, fmt);
-	die_routine(fmt_with_err, params);
-	va_end(params);
-}
-
-int error(const char *err, ...)
-{
-	va_list params;
-
-	va_start(params, err);
-	error_routine(err, params);
-	va_end(params);
-	return -1;
+	snprintf(fmt_with_err, sizeof_fmt_with_err, "%s: %s", fmt, str_error);
 }
 
-void warning(const char *warn, ...)
-{
-	va_list params;
-
-	va_start(params, warn);
-	warn_routine(warn, params);
-	va_end(params);
-}
+#define BUILD_E(RTYPE, NAME, CODE)  \
+RTYPE NAME(const char *err, ...)  \
+{  \
+	va_list params;  \
+  \
+	va_start(params, err);  \
+	NAME ## _routine(err, params);  \
+	va_end(params);  \
+	CODE  \
+}  \
+  \
+RTYPE NAME ## _errno(const char *fmt, ...)  \
+{  \
+	va_list params;  \
+	static char fmt_with_err[1024];  \
+  \
+	va_start(params, fmt);  \
+	_e_errno(fmt, fmt_with_err, sizeof(fmt_with_err));  \
+	NAME ## _routine(fmt_with_err, params);  \
+	va_end(params);  \
+	CODE  \
+}  \
+// END OF BUILD_E MACRO
+
+BUILD_E(void, die, )
+BUILD_E(int, error, return -1;)
+BUILD_E(void, warning, )
-- 
1.6.3.3
Previous: Luke DashjrNext: Luke Dashjr
Message 6 of 21 in “For review: git add --ignore-unmatch”
  1. Luke-JrAug 12, 2009
  2. Thomas RastAug 12, 2009
  3. 1/5 port --ignore-unmatch to "git add"Luke Dashjr, Aug 13, 2009
  4. 2/5 fix "git add --ignore-errors" to ignore pathspec errorsLuke Dashjr, Aug 13, 2009
  5. 3/5 Document --ignore-unmatch in git-add.txtLuke Dashjr, Aug 13, 2009
  6. 4/5 implement error_errno and warning_errnoLuke Dashjr, Aug 13, 2009
  7. 5/5 Convert add_file_to_index's lstat failure from a die to an errorLuke Dashjr, Aug 13, 2009
  8. Junio C HamanoAug 13, 2009
  9. Luke-JrAug 13, 2009
  10. port --ignore-unmatch to "git add"Luke Dashjr, Aug 13, 2009
  11. Document --ignore-unmatch in git-add.txtLuke Dashjr, Aug 13, 2009
  12. Junio C HamanoAug 13, 2009
  13. Luke-JrAug 13, 2009
  14. Alex RiesenAug 13, 2009
  15. Thomas RastAug 13, 2009
  16. Junio C HamanoAug 14, 2009
  17. Luke-JrAug 14, 2009
  18. Luke-JrAug 14, 2009
  19. Nanako ShiraishiAug 14, 2009
  20. Luke-JrAug 14, 2009
  21. Luke-JrOct 10, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.