builtin-mktree.c: use a helper function to handle one line of input
authorJunio C Hamano <gitster@pobox.com>
Sun, 10 May 2009 17:41:22 +0000 (10:41 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 10 May 2009 19:41:35 +0000 (12:41 -0700)
The main() function used to do the whole thing; this moves the handling of
a single input line to a separate function to make it easier to read.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-mktree.c

index 2b3145bc725bc8c7948cc2229441130b8fe4027c..133ab4b0f88aac70a78bd0f3382672236a1bd174 100644 (file)
@@ -67,10 +67,48 @@ static const char *mktree_usage[] = {
        NULL
 };
 
+static void mktree_line(char *buf, size_t len, int line_termination)
+{
+       char *ptr, *ntr;
+       unsigned mode;
+       enum object_type type;
+       char *path;
+       unsigned char sha1[20];
+
+       ptr = buf;
+       /*
+        * Read non-recursive ls-tree output format:
+        *     mode SP type SP sha1 TAB name
+        */
+       mode = strtoul(ptr, &ntr, 8);
+       if (ptr == ntr || !ntr || *ntr != ' ')
+               die("input format error: %s", buf);
+       ptr = ntr + 1; /* type */
+       ntr = strchr(ptr, ' ');
+       if (!ntr || buf + len <= ntr + 40 ||
+           ntr[41] != '\t' ||
+           get_sha1_hex(ntr + 1, sha1))
+               die("input format error: %s", buf);
+       type = sha1_object_info(sha1, NULL);
+       if (type < 0)
+               die("object %s unavailable", sha1_to_hex(sha1));
+       *ntr++ = 0; /* now at the beginning of SHA1 */
+       if (type != type_from_string(ptr))
+               die("object type %s mismatch (%s)", ptr, typename(type));
+
+       path = ntr + 41;  /* at the beginning of name */
+       if (line_termination && path[0] == '"') {
+               struct strbuf p_uq = STRBUF_INIT;
+               if (unquote_c_style(&p_uq, path, NULL))
+                       die("invalid quoting");
+               path = strbuf_detach(&p_uq, NULL);
+       }
+       append_to_tree(mode, sha1, path);
+}
+
 int cmd_mktree(int ac, const char **av, const char *prefix)
 {
        struct strbuf sb = STRBUF_INIT;
-       struct strbuf p_uq = STRBUF_INIT;
        unsigned char sha1[20];
        int line_termination = '\n';
        const struct option option[] = {
@@ -80,45 +118,9 @@ int cmd_mktree(int ac, const char **av, const char *prefix)
 
        ac = parse_options(ac, av, option, mktree_usage, 0);
 
-       while (strbuf_getline(&sb, stdin, line_termination) != EOF) {
-               char *ptr, *ntr;
-               unsigned mode;
-               enum object_type type;
-               char *path;
-
-               ptr = sb.buf;
-               /*
-                * Read non-recursive ls-tree output format:
-                *     mode SP type SP sha1 TAB name
-                */
-               mode = strtoul(ptr, &ntr, 8);
-               if (ptr == ntr || !ntr || *ntr != ' ')
-                       die("input format error: %s", sb.buf);
-               ptr = ntr + 1; /* type */
-               ntr = strchr(ptr, ' ');
-               if (!ntr || sb.buf + sb.len <= ntr + 40 ||
-                   ntr[41] != '\t' ||
-                   get_sha1_hex(ntr + 1, sha1))
-                       die("input format error: %s", sb.buf);
-               type = sha1_object_info(sha1, NULL);
-               if (type < 0)
-                       die("object %s unavailable", sha1_to_hex(sha1));
-               *ntr++ = 0; /* now at the beginning of SHA1 */
-               if (type != type_from_string(ptr))
-                       die("object type %s mismatch (%s)", ptr, typename(type));
-
-               path = ntr + 41;  /* at the beginning of name */
-               if (line_termination && path[0] == '"') {
-                       strbuf_reset(&p_uq);
-                       if (unquote_c_style(&p_uq, path, NULL)) {
-                               die("invalid quoting");
-                       }
-                       path = p_uq.buf;
-               }
-
-               append_to_tree(mode, sha1, path);
-       }
-       strbuf_release(&p_uq);
+       while (strbuf_getline(&sb, stdin, line_termination) != EOF)
+               mktree_line(sb.buf, sb.len, line_termination);
+
        strbuf_release(&sb);
 
        write_tree(sha1);