Commit 23d1dbe91963b70fbf05ce504d8d143c5e5ec568

Boris Egorov 2015-02-06T11:43:12

describe example: function to add commits to opts Add safe function to (a,rea)llocate memory which terminate example on memory allocation failure. Move code to allocate commits to its own function.

diff --git a/examples/describe.c b/examples/describe.c
index 72d9811..f7b4b1c 100644
--- a/examples/describe.c
+++ b/examples/describe.c
@@ -13,6 +13,7 @@
  */
 
 #include "common.h"
+#include <assert.h>
 
 /**
  * The following example partially reimplements the `git describe` command
@@ -46,6 +47,27 @@ typedef struct {
 
 typedef struct args_info args_info;
 
+static void *xrealloc(void *oldp, size_t newsz)
+{
+	void *p = realloc(oldp, newsz);
+	if (p == NULL) {
+		fprintf(stderr, "Cannot allocate memory, exiting.\n");
+		exit(1);
+	}
+	return p;
+}
+
+static void opts_add_commit(describe_options *opts, const char *commit)
+{
+	size_t sz;
+
+	assert(opts != NULL);
+
+	sz = ++opts->commit_count * sizeof(opts->commits[0]);
+	opts->commits = xrealloc(opts->commits, sz);
+	opts->commits[opts->commit_count - 1] = commit;
+}
+
 static void do_describe_single(git_repository *repo, describe_options *opts, const char *rev)
 {
 	git_object *commit;
@@ -96,9 +118,7 @@ static void parse_options(describe_options *opts, int argc, char **argv)
 		const char *curr = argv[args.pos];
 
 		if (curr[0] != '-') {
-			size_t newsz = ++opts->commit_count * sizeof(opts->commits[0]);
-			opts->commits = (const char **)realloc((void *)opts->commits, newsz);
-			opts->commits[opts->commit_count - 1] = curr;
+			opts_add_commit(opts, curr);
 		} else if (!strcmp(curr, "--all")) {
 			opts->describe_options.describe_strategy = GIT_DESCRIBE_ALL;
 		} else if (!strcmp(curr, "--tags")) {
@@ -124,9 +144,7 @@ static void parse_options(describe_options *opts, int argc, char **argv)
 	}
 	else {
 		if (!opts->format_options.dirty_suffix || !opts->format_options.dirty_suffix[0]) {
-			size_t sz = ++opts->commit_count * sizeof(opts->commits[0]);
-			opts->commits = (const char **)malloc(sz);
-			opts->commits[0] = "HEAD";
+			opts_add_commit(opts, "HEAD");
 		}
 	}
 }