int git__percent_decode(git_buf *decoded_out, const char *input) { int len, hi, lo, i, error = GIT_SUCCESS; assert(decoded_out && input); len = strlen(input); git_buf_clear(decoded_out); for(i = 0; i < len; i++) { char c = input[i]; if (c != '%') goto append; if (i >= len - 2) goto append; hi = git__fromhex(input[i + 1]); lo = git__fromhex(input[i + 2]); if (hi < 0 || lo < 0) goto append; c = (char)(hi << 4 | lo); i += 2; append: error = git_buf_putc(decoded_out, c); if (error < GIT_SUCCESS) return git__rethrow(error, "Failed to percent decode '%s'.", input); } return error; }
int git__percent_decode(git_buf *decoded_out, const char *input) { int len, hi, lo, i; assert(decoded_out && input); len = (int)strlen(input); git_buf_clear(decoded_out); for(i = 0; i < len; i++) { char c = input[i]; if (c != '%') goto append; if (i >= len - 2) goto append; hi = git__fromhex(input[i + 1]); lo = git__fromhex(input[i + 2]); if (hi < 0 || lo < 0) goto append; c = (char)(hi << 4 | lo); i += 2; append: if (git_buf_putc(decoded_out, c) < 0) return -1; } return 0; }
GIT_INLINE(int) filename_to_oid(git_oid *oid, const char *ptr) { int v, i = 0; if (strlen(ptr) != GIT_OID_HEXSZ+1) return -1; if (ptr[2] != '/') { return -1; } v = (git__fromhex(ptr[i]) << 4) | git__fromhex(ptr[i+1]); if (v < 0) return -1; oid->id[0] = (unsigned char) v; ptr += 3; for (i = 0; i < 38; i += 2) { v = (git__fromhex(ptr[i]) << 4) | git__fromhex(ptr[i + 1]); if (v < 0) return -1; oid->id[1 + i/2] = (unsigned char) v; } return 0; }
int git_oid_fromstrn(git_oid *out, const char *str, size_t length) { size_t p; int v; if (length > GIT_OID_HEXSZ) length = GIT_OID_HEXSZ; for (p = 0; p < length - 1; p += 2) { v = (git__fromhex(str[p + 0]) << 4) | git__fromhex(str[p + 1]); if (v < 0) return oid_error_invalid("contains invalid characters"); out->id[p / 2] = (unsigned char)v; } if (length % 2) { v = (git__fromhex(str[p + 0]) << 4); if (v < 0) return oid_error_invalid("contains invalid characters"); out->id[p / 2] = (unsigned char)v; p += 2; } memset(out->id + p / 2, 0, (GIT_OID_HEXSZ - p) / 2); return 0; }
int git_oid_fromstrn(git_oid *out, const char *str, size_t length) { size_t p; int v; assert(out && str); if (!length) return oid_error_invalid("too short"); if (length > GIT_OID_HEXSZ) return oid_error_invalid("too long"); memset(out->id, 0, GIT_OID_RAWSZ); for (p = 0; p < length; p++) { v = git__fromhex(str[p]); if (v < 0) return oid_error_invalid("contains invalid characters"); out->id[p / 2] |= (unsigned char)(v << (p % 2 ? 0 : 4)); } return 0; }
static int process_entry_path( const char* entry_path, const git_oid *note_oid, int (*note_cb)(git_note_data *note_data, void *payload), void *payload) { int error = -1; size_t i = 0, j = 0, len; git_buf buf = GIT_BUF_INIT; git_note_data note_data; if ((error = git_buf_puts(&buf, entry_path)) < 0) goto cleanup; len = git_buf_len(&buf); while (i < len) { if (buf.ptr[i] == '/') { i++; continue; } if (git__fromhex(buf.ptr[i]) < 0) { /* This is not a note entry */ goto cleanup; } if (i != j) buf.ptr[j] = buf.ptr[i]; i++; j++; } buf.ptr[j] = '\0'; buf.size = j; if (j != GIT_OID_HEXSZ) { /* This is not a note entry */ goto cleanup; } if ((error = git_oid_fromstr( ¬e_data.annotated_object_oid, buf.ptr)) < 0) goto cleanup; git_oid_cpy(¬e_data.blob_oid, note_oid); if (note_cb(¬e_data, payload)) error = GIT_EUSER; cleanup: git_buf_free(&buf); return error; }
static int process_entry_path( const char* entry_path, git_oid *annotated_object_id) { int error = 0; size_t i = 0, j = 0, len; git_buf buf = GIT_BUF_INIT; if ((error = git_buf_puts(&buf, entry_path)) < 0) goto cleanup; len = git_buf_len(&buf); while (i < len) { if (buf.ptr[i] == '/') { i++; continue; } if (git__fromhex(buf.ptr[i]) < 0) { /* This is not a note entry */ goto cleanup; } if (i != j) buf.ptr[j] = buf.ptr[i]; i++; j++; } buf.ptr[j] = '\0'; buf.size = j; if (j != GIT_OID_HEXSZ) { /* This is not a note entry */ goto cleanup; } error = git_oid_fromstr(annotated_object_id, buf.ptr); cleanup: git_buf_free(&buf); return error; }