diff options
-rw-r--r-- | lib/libalpm/be_sync.c | 3 | ||||
-rw-r--r-- | lib/libalpm/delta.c | 33 | ||||
-rw-r--r-- | lib/libalpm/delta.h | 2 | ||||
-rw-r--r-- | lib/libalpm/handle.c | 3 | ||||
-rw-r--r-- | lib/libalpm/handle.h | 5 |
5 files changed, 30 insertions, 16 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index abc4a997..da2260e8 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -598,7 +598,8 @@ static int sync_db_read(alpm_db_t *db, struct archive *archive, while(1) { READ_NEXT(); if(strlen(line) == 0) break; - pkg->deltas = alpm_list_add(pkg->deltas, _alpm_delta_parse(line)); + pkg->deltas = alpm_list_add(pkg->deltas, + _alpm_delta_parse(db->handle, line)); } } } diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c index 165cdef4..726f03c0 100644 --- a/lib/libalpm/delta.c +++ b/lib/libalpm/delta.c @@ -273,29 +273,32 @@ alpm_list_t SYMEXPORT *alpm_pkg_unused_deltas(alpm_pkg_t *pkg) * This function assumes that the string is in the correct format. * This format is as follows: * $deltafile $deltamd5 $deltasize $oldfile $newfile + * @param handle the context handle * @param line the string to parse * @return A pointer to the new alpm_delta_t object */ -/* TODO this does not really belong here, but in a parsing lib */ -alpm_delta_t *_alpm_delta_parse(char *line) +alpm_delta_t *_alpm_delta_parse(alpm_handle_t *handle, const char *line) { alpm_delta_t *delta; - char *tmp; const int num_matches = 6; size_t len; - regex_t reg; regmatch_t pmatch[num_matches]; + char filesize[32]; + + /* this is so we only have to compile the pattern once */ + if(!handle->delta_regex_compiled) { + /* $deltafile $deltamd5 $deltasize $oldfile $newfile*/ + regcomp(&handle->delta_regex, + "^([^[:space:]]+) ([[:xdigit:]]{32}) ([[:digit:]]+)" + " ([^[:space:]]+) ([^[:space:]]+)$", + REG_EXTENDED | REG_NEWLINE); + handle->delta_regex_compiled = 1; + } - regcomp(®, - "^([^[:space:]]*) ([[:xdigit:]]{32}) ([[:digit:]]*)" - " ([^[:space:]]*) ([^[:space:]]*)$", - REG_EXTENDED | REG_NEWLINE); - if(regexec(®, line, num_matches, pmatch, 0) != 0) { + if(regexec(&handle->delta_regex, line, num_matches, pmatch, 0) != 0) { /* delta line is invalid, return NULL */ - regfree(®); return NULL; } - regfree(®); CALLOC(delta, 1, sizeof(alpm_delta_t), return NULL); @@ -307,9 +310,11 @@ alpm_delta_t *_alpm_delta_parse(char *line) STRNDUP(delta->delta_md5, &line[pmatch[2].rm_so], len, return NULL); len = pmatch[3].rm_eo - pmatch[3].rm_so; - STRNDUP(tmp, &line[pmatch[3].rm_so], len, return NULL); - delta->delta_size = _alpm_strtoofft(tmp); - free(tmp); + if(len < sizeof(filesize)) { + strncpy(filesize, &line[pmatch[3].rm_so], len); + filesize[len] = '\0'; + delta->delta_size = _alpm_strtoofft(filesize); + } len = pmatch[4].rm_eo - pmatch[4].rm_so; STRNDUP(delta->from, &line[pmatch[4].rm_so], len, return NULL); diff --git a/lib/libalpm/delta.h b/lib/libalpm/delta.h index 42353f5f..1173ddfe 100644 --- a/lib/libalpm/delta.h +++ b/lib/libalpm/delta.h @@ -24,7 +24,7 @@ #include "alpm.h" -alpm_delta_t *_alpm_delta_parse(char *line); +alpm_delta_t *_alpm_delta_parse(alpm_handle_t *handle, const char *line); void _alpm_delta_free(alpm_delta_t *delta); alpm_delta_t *_alpm_delta_dup(const alpm_delta_t *delta); off_t _alpm_shortest_delta_path(alpm_handle_t *handle, alpm_list_t *deltas, diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c index 6518b7d5..8e2e3c73 100644 --- a/lib/libalpm/handle.c +++ b/lib/libalpm/handle.c @@ -34,6 +34,7 @@ #include "alpm_list.h" #include "util.h" #include "log.h" +#include "delta.h" #include "trans.h" #include "alpm.h" @@ -67,6 +68,8 @@ void _alpm_handle_free(alpm_handle_t *handle) curl_easy_cleanup(handle->curl); #endif + regfree(&handle->delta_regex); + /* free memory */ _alpm_trans_free(handle->trans); FREE(handle->root); diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h index 1f147d6e..a64c5c9e 100644 --- a/lib/libalpm/handle.h +++ b/lib/libalpm/handle.h @@ -22,6 +22,7 @@ #include <stdio.h> #include <sys/types.h> +#include <regex.h> #include "alpm_list.h" #include "alpm.h" @@ -94,6 +95,10 @@ struct __alpm_handle_t { /* error code */ alpm_errno_t pm_errno; + + /* for delta parsing efficiency */ + int delta_regex_compiled; + regex_t delta_regex; }; alpm_handle_t *_alpm_handle_new(void); |