summaryrefslogtreecommitdiffabout
path: root/parsing.c
Unidiff
Diffstat (limited to 'parsing.c') (more/less context) (ignore whitespace changes)
-rw-r--r--parsing.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/parsing.c b/parsing.c
index be471b5..4d5cc74 100644
--- a/parsing.c
+++ b/parsing.c
@@ -90,71 +90,79 @@ int cgit_parse_query(char *txt, configfn fn)
90 90
91 while((c=*t) != '\0') { 91 while((c=*t) != '\0') {
92 if (c=='=') { 92 if (c=='=') {
93 *t = '\0'; 93 *t = '\0';
94 value = t+1; 94 value = t+1;
95 } else if (c=='&') { 95 } else if (c=='&') {
96 *t = '\0'; 96 *t = '\0';
97 (*fn)(txt, value); 97 (*fn)(txt, value);
98 txt = t+1; 98 txt = t+1;
99 value = NULL; 99 value = NULL;
100 } 100 }
101 t++; 101 t++;
102 } 102 }
103 if (t!=txt) 103 if (t!=txt)
104 (*fn)(txt, value); 104 (*fn)(txt, value);
105 return 0; 105 return 0;
106} 106}
107 107
108char *substr(const char *head, const char *tail) 108char *substr(const char *head, const char *tail)
109{ 109{
110 char *buf; 110 char *buf;
111 111
112 buf = xmalloc(tail - head + 1); 112 buf = xmalloc(tail - head + 1);
113 strncpy(buf, head, tail - head); 113 strncpy(buf, head, tail - head);
114 buf[tail - head] = '\0'; 114 buf[tail - head] = '\0';
115 return buf; 115 return buf;
116} 116}
117 117
118struct commitinfo *cgit_parse_commit(struct commit *commit) 118struct commitinfo *cgit_parse_commit(struct commit *commit)
119{ 119{
120 struct commitinfo *ret; 120 struct commitinfo *ret;
121 char *p = commit->buffer, *t = commit->buffer; 121 char *p = commit->buffer, *t = commit->buffer;
122 122
123 ret = xmalloc(sizeof(*ret)); 123 ret = xmalloc(sizeof(*ret));
124 ret->commit = commit; 124 ret->commit = commit;
125 125
126 if (strncmp(p, "tree ", 5)) 126 if (strncmp(p, "tree ", 5))
127 die("Bad commit: %s", sha1_to_hex(commit->object.sha1)); 127 die("Bad commit: %s", sha1_to_hex(commit->object.sha1));
128 else 128 else
129 p += 46; // "tree " + hex[40] + "\n" 129 p += 46; // "tree " + hex[40] + "\n"
130 130
131 while (!strncmp(p, "parent ", 7)) 131 while (!strncmp(p, "parent ", 7))
132 p += 48; // "parent " + hex[40] + "\n" 132 p += 48; // "parent " + hex[40] + "\n"
133 133
134 if (!strncmp(p, "author ", 7)) { 134 if (!strncmp(p, "author ", 7)) {
135 p += 7; 135 p += 7;
136 t = strchr(p, '<') - 1; 136 t = strchr(p, '<') - 1;
137 ret->author = substr(p, t); 137 ret->author = substr(p, t);
138 p = strchr(p, '\n') + 1; 138 p = t;
139 t = strchr(t, '>') + 1;
140 ret->author_email = substr(p, t);
141 ret->author_date = atol(++t);
142 p = strchr(t, '\n') + 1;
139 } 143 }
140 144
141 if (!strncmp(p, "committer ", 9)) { 145 if (!strncmp(p, "committer ", 9)) {
142 p += 9; 146 p += 9;
143 t = strchr(p, '<') - 1; 147 t = strchr(p, '<') - 1;
144 ret->committer = substr(p, t); 148 ret->committer = substr(p, t);
145 p = strchr(p, '\n') + 1; 149 p = t;
150 t = strchr(t, '>') + 1;
151 ret->committer_email = substr(p, t);
152 ret->committer_date = atol(++t);
153 p = strchr(t, '\n') + 1;
146 } 154 }
147 155
148 while (*p == '\n') 156 while (*p == '\n')
149 p = strchr(p, '\n') + 1; 157 p = strchr(p, '\n') + 1;
150 158
151 t = strchr(p, '\n'); 159 t = strchr(p, '\n');
152 ret->subject = substr(p, t); 160 ret->subject = substr(p, t);
153 p = t + 1; 161 p = t + 1;
154 162
155 while (*p == '\n') 163 while (*p == '\n')
156 p = strchr(p, '\n') + 1; 164 p = strchr(p, '\n') + 1;
157 ret->msg = p; 165 ret->msg = p;
158 166
159 return ret; 167 return ret;
160} 168}