Fix ?: statements.

Omitting the first branch in ?: is a GNU extension.  Cute,
but not supported by other compilers.  Replaced mostly
by explicit tests.  Calls to getenv() simply are repeated
on non-GNU compilers.

Signed-off-by: Jason Riedy <ejr@cs.berkeley.edu>
diff --git a/apply.c b/apply.c
index 7c1a841..ee59be6 100644
--- a/apply.c
+++ b/apply.c
@@ -1377,7 +1377,7 @@
 
 static int use_patch(struct patch *p)
 {
-	const char *pathname = p->new_name ? : p->old_name;
+	const char *pathname = p->new_name ? p->new_name : p->old_name;
 	struct excludes *x = excludes;
 	while (x) {
 		if (fnmatch(x->path, pathname, 0) == 0)
diff --git a/cache.h b/cache.h
index e7f5a2e..e4f4664 100644
--- a/cache.h
+++ b/cache.h
@@ -58,7 +58,11 @@
  * We accept older names for now but warn.
  */
 extern char *gitenv_bc(const char *);
+#ifdef __GNUC__
 #define gitenv(e) (getenv(e) ? : gitenv_bc(e))
+#else
+#define gitenv(e) (getenv(e) ? getenv(e) : gitenv_bc(e))
+#endif
 
 /*
  * Basic data structures for the directory cache
diff --git a/connect.c b/connect.c
index a6657b1..c0bf869 100644
--- a/connect.c
+++ b/connect.c
@@ -383,8 +383,10 @@
 		close(pipefd[1][0]);
 		close(pipefd[1][1]);
 		if (protocol == PROTO_SSH) {
-			const char *ssh = getenv("GIT_SSH") ? : "ssh";
-			const char *ssh_basename = strrchr(ssh, '/');
+			const char *ssh, *ssh_basename;
+			ssh = getenv("GIT_SSH");
+			if (!ssh) ssh = "ssh";
+			ssh_basename = strrchr(ssh, '/');
 			if (!ssh_basename)
 				ssh_basename = ssh;
 			else
diff --git a/diff.c b/diff.c
index 137d0d0..9015c81 100644
--- a/diff.c
+++ b/diff.c
@@ -19,6 +19,7 @@
 {
 	static const char *external_diff_cmd = NULL;
 	static int done_preparing = 0;
+	const char *env_diff_opts;
 
 	if (done_preparing)
 		return external_diff_cmd;
@@ -31,11 +32,11 @@
 	 *
 	 * GIT_DIFF_OPTS="-c";
 	 */
-	if (gitenv("GIT_EXTERNAL_DIFF"))
-		external_diff_cmd = gitenv("GIT_EXTERNAL_DIFF");
+	external_diff_cmd = gitenv("GIT_EXTERNAL_DIFF");
 
 	/* In case external diff fails... */
-	diff_opts = gitenv("GIT_DIFF_OPTS") ? : diff_opts;
+	env_diff_opts = gitenv("GIT_DIFF_OPTS");
+	if (env_diff_opts) diff_opts = env_diff_opts;
 
 	done_preparing = 1;
 	return external_diff_cmd;
@@ -530,10 +531,12 @@
 	pid_t pid;
 	int status;
 	static int atexit_asked = 0;
+	const char *othername;
 
+	othername = (other? other : name);
 	if (one && two) {
 		prepare_temp_file(name, &temp[0], one);
-		prepare_temp_file(other ? : name, &temp[1], two);
+		prepare_temp_file(othername, &temp[1], two);
 		if (! atexit_asked &&
 		    (temp[0].name == temp[0].tmp_path ||
 		     temp[1].name == temp[1].tmp_path)) {
@@ -574,7 +577,7 @@
 		 * otherwise we use the built-in one.
 		 */
 		if (one && two)
-			builtin_diff(name, other ? : name, temp, xfrm_msg,
+			builtin_diff(name, othername, temp, xfrm_msg,
 				     complete_rewrite);
 		else
 			printf("* Unmerged path %s\n", name);
@@ -889,13 +892,13 @@
 void diff_debug_filespec(struct diff_filespec *s, int x, const char *one)
 {
 	fprintf(stderr, "queue[%d] %s (%s) %s %06o %s\n",
-		x, one ? : "",
+		x, one ? one : "",
 		s->path,
 		DIFF_FILE_VALID(s) ? "valid" : "invalid",
 		s->mode,
 		s->sha1_valid ? sha1_to_hex(s->sha1) : "");
 	fprintf(stderr, "queue[%d] %s size %lu flags %d\n",
-		x, one ? : "",
+		x, one ? one : "",
 		s->size, s->xfrm_flags);
 }
 
@@ -904,7 +907,7 @@
 	diff_debug_filespec(p->one, i, "one");
 	diff_debug_filespec(p->two, i, "two");
 	fprintf(stderr, "score %d, status %c stays %d broken %d\n",
-		p->score, p->status ? : '?',
+		p->score, p->status ? p->status : '?',
 		p->source_stays, p->broken_pair);
 }
 
diff --git a/fsck-cache.c b/fsck-cache.c
index 8091780..ca24a1b 100644
--- a/fsck-cache.c
+++ b/fsck-cache.c
@@ -390,7 +390,10 @@
 	char hex[40];
 	unsigned char sha1[20];
 	static char path[PATH_MAX], link[PATH_MAX];
-	const char *git_dir = gitenv(GIT_DIR_ENVIRONMENT) ? : DEFAULT_GIT_DIR_ENVIRONMENT;
+	const char *git_dir;
+
+	git_dir = gitenv(GIT_DIR_ENVIRONMENT);
+	if (!git_dir) git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
 
 	snprintf(path, sizeof(path), "%s/HEAD", git_dir);
 	if (readlink(path, link, sizeof(link)) < 0)
diff --git a/path.c b/path.c
index b85f087..142e575 100644
--- a/path.c
+++ b/path.c
@@ -41,10 +41,12 @@
 
 char *git_path(const char *fmt, ...)
 {
-	const char *git_dir = gitenv(GIT_DIR_ENVIRONMENT) ? : DEFAULT_GIT_DIR_ENVIRONMENT;
+	const char *git_dir;
 	va_list args;
 	unsigned len;
 
+	git_dir = gitenv(GIT_DIR_ENVIRONMENT);
+	if (!git_dir) git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
 	len = strlen(git_dir);
 	if (len > PATH_MAX-100)
 		return bad_path;
diff --git a/pull.c b/pull.c
index e7bf83b..ff55044 100644
--- a/pull.c
+++ b/pull.c
@@ -156,7 +156,7 @@
 
 		//fprintf(stderr, "fetch %s\n", sha1_to_hex(obj->sha1));
 		
-		if (make_sure_we_have_it(obj->type ?: "object", 
+		if (make_sure_we_have_it(obj->type ? obj->type : "object", 
 					 obj->sha1))
 			return -1;
 		if (!obj->type)
diff --git a/rsh.c b/rsh.c
index bcb1c80..04cbdf7 100644
--- a/rsh.c
+++ b/rsh.c
@@ -56,8 +56,10 @@
 		return error("Couldn't create socket");
 	}
 	if (!fork()) {
-		const char *ssh = getenv("GIT_SSH") ? : "ssh";
-		const char *ssh_basename = strrchr(ssh, '/');
+		const char *ssh, *ssh_basename;
+		ssh = getenv("GIT_SSH");
+		if (!ssh) ssh = "ssh";
+		ssh_basename = strrchr(ssh, '/');
 		if (!ssh_basename)
 			ssh_basename = ssh;
 		else
diff --git a/sha1_file.c b/sha1_file.c
index 7766977..fa37f1e 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -283,7 +283,10 @@
 	char *map;
 	int fd;
 	struct stat st;
-	char *alt = gitenv(ALTERNATE_DB_ENVIRONMENT) ? : "";
+	char *alt;
+
+	alt = gitenv(ALTERNATE_DB_ENVIRONMENT);
+	if (!alt) alt = "";
 
 	sprintf(path, "%s/info/alternates", get_object_directory());
 	if (alt_odb_tail)
diff --git a/ssh-pull.c b/ssh-pull.c
index b7f313b..f1d8e70 100644
--- a/ssh-pull.c
+++ b/ssh-pull.c
@@ -87,7 +87,10 @@
 	char *commit_id;
 	char *url;
 	int arg = 1;
-	const char *prog = getenv("GIT_SSH_PUSH") ? : "git-ssh-push";
+	const char *prog;
+
+	prog = getenv("GIT_SSH_PUSH");
+	if (!prog) prog = "git-ssh-push";
 
 	while (arg < argc && argv[arg][0] == '-') {
 		if (argv[arg][1] == 't') {
diff --git a/ssh-push.c b/ssh-push.c
index ee424a8..5bd4569 100644
--- a/ssh-push.c
+++ b/ssh-push.c
@@ -105,10 +105,12 @@
         char *commit_id;
         char *url;
 	int fd_in, fd_out;
-	const char *prog = getenv("GIT_SSH_PULL") ? : "git-ssh-pull";
+	const char *prog;
 	unsigned char sha1[20];
 	char hex[41];
 
+	prog = getenv("GIT_SSH_PULL");
+	if (!prog) prog = "git-ssh-pull";
 	while (arg < argc && argv[arg][0] == '-') {
 		if (argv[arg][1] == 'w')
 			arg++;