Staging
v0.8.1
Revision a970e84e8ad23a740e456fb4191ed61becef8989 authored by Shawn O. Pearce on 28 December 2006, 07:35:24 UTC, committed by Junio C Hamano on 29 December 2006, 03:06:16 UTC
To support wider use cases, such as from within `git am -3`, the
merge-recursive utility needs to accept not just commit-ish but
also tree-ish as arguments on its command line.

If given a tree-ish then merge-recursive will create a virtual commit
wrapping it, with the subject of the commit set to the best name we
can derive for that tree, which is either the command line string
(probably the SHA1), or whatever string appears in GITHEAD_*.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 7ba3c07
Raw File
interpolate.c
/*
 * Copyright 2006 Jon Loeliger
 */

#include "git-compat-util.h"
#include "interpolate.h"


void interp_set_entry(struct interp *table, int slot, const char *value)
{
	char *oldval = table[slot].value;
	char *newval = NULL;

	if (oldval)
		free(oldval);

	if (value)
		newval = xstrdup(value);

	table[slot].value = newval;
}


void interp_clear_table(struct interp *table, int ninterps)
{
	int i;

	for (i = 0; i < ninterps; i++) {
		interp_set_entry(table, i, NULL);
	}
}


/*
 * Convert a NUL-terminated string in buffer orig
 * into the supplied buffer, result, whose length is reslen,
 * performing substitutions on %-named sub-strings from
 * the table, interps, with ninterps entries.
 *
 * Example interps:
 *    {
 *        { "%H", "example.org"},
 *        { "%port", "123"},
 *        { "%%", "%"},
 *    }
 *
 * Returns 1 on a successful substitution pass that fits in result,
 * Returns 0 on a failed or overflowing substitution pass.
 */

int interpolate(char *result, int reslen,
		const char *orig,
		const struct interp *interps, int ninterps)
{
	const char *src = orig;
	char *dest = result;
	int newlen = 0;
	char *name, *value;
	int namelen, valuelen;
	int i;
	char c;

        memset(result, 0, reslen);

	while ((c = *src) && newlen < reslen - 1) {
		if (c == '%') {
			/* Try to match an interpolation string. */
			for (i = 0; i < ninterps; i++) {
				name = interps[i].name;
				namelen = strlen(name);
				if (strncmp(src, name, namelen) == 0) {
					break;
				}
			}

			/* Check for valid interpolation. */
			if (i < ninterps) {
				value = interps[i].value;
				valuelen = strlen(value);

				if (newlen + valuelen < reslen - 1) {
					/* Substitute. */
					strncpy(dest, value, valuelen);
					newlen += valuelen;
					dest += valuelen;
					src += namelen;
				} else {
					/* Something's not fitting. */
					return 0;
				}

			} else {
				/* Skip bogus interpolation. */
				*dest++ = *src++;
				newlen++;
			}

		} else {
			/* Straight copy one non-interpolation character. */
			*dest++ = *src++;
			newlen++;
		}
	}

	return newlen < reslen - 1;
}
back to top