+ if (label_sq != name_sq)
+ free(label_sq);
+ free(name_sq);
+ free(cmd);
+}
+
+static void show_diff_empty(struct cache_entry *ce)
+{
+ char *old;
+ unsigned long int size;
+ unsigned char type[20];
+
+ old = read_sha1_file(ce->sha1, type, &size);
+ if (! old) {
+ error("unable to read blob object for %s (%s)", ce->name,
+ sha1_to_hex(ce->sha1));
+ return;
+ }
+ show_differences("/dev/null", ce->name, old, size);
+}
+
+static const char *show_diff_usage = "show-diff [-q] [-s] [-z] [paths...]";
+
+static int matches_pathspec(struct cache_entry *ce, char **spec, int cnt)
+{
+ int i;
+ int namelen = ce_namelen(ce);
+ for (i = 0; i < cnt; i++) {
+ int speclen = strlen(spec[i]);
+ if (! strncmp(spec[i], ce->name, speclen) &&
+ speclen <= namelen &&
+ (ce->name[speclen] == 0 ||
+ ce->name[speclen] == '/'))
+ return 1;
+ }
+ return 0;