summaryrefslogtreecommitdiff
path: root/lib/libalpm/delta.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libalpm/delta.c')
-rw-r--r--lib/libalpm/delta.c68
1 files changed, 35 insertions, 33 deletions
diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c
index 6315a851..e3acc666 100644
--- a/lib/libalpm/delta.c
+++ b/lib/libalpm/delta.c
@@ -18,8 +18,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
-
#include <stdlib.h>
#include <string.h>
#include <stdint.h> /* intmax_t */
@@ -266,7 +264,8 @@ static alpm_list_t *find_unused(alpm_list_t *deltas, const char *to, off_t quota
alpm_list_t SYMEXPORT *alpm_pkg_unused_deltas(alpm_pkg_t *pkg)
{
ASSERT(pkg != NULL, return NULL);
- return find_unused(pkg->deltas, pkg->filename, pkg->size * MAX_DELTA_RATIO);
+ return find_unused(pkg->deltas, pkg->filename,
+ pkg->size * pkg->handle->deltaratio);
}
/** @} */
@@ -275,51 +274,54 @@ 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 = line, *tmp2;
- regex_t reg;
-
- regcomp(&reg,
- "^[^[:space:]]* [[:xdigit:]]{32} [[:digit:]]*"
- " [^[:space:]]* [^[:space:]]*$",
- REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
- if(regexec(&reg, line, 0, 0, 0) != 0) {
+ const int num_matches = 6;
+ size_t len;
+ 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;
+ }
+
+ if(regexec(&handle->delta_regex, line, num_matches, pmatch, 0) != 0) {
/* delta line is invalid, return NULL */
- regfree(&reg);
return NULL;
}
- regfree(&reg);
CALLOC(delta, 1, sizeof(alpm_delta_t), return NULL);
- tmp2 = tmp;
- tmp = strchr(tmp, ' ');
- *(tmp++) = '\0';
- STRDUP(delta->delta, tmp2, return NULL);
+ /* start at index 1 -- match 0 is the entire match */
+ len = pmatch[1].rm_eo - pmatch[1].rm_so;
+ STRNDUP(delta->delta, &line[pmatch[1].rm_so], len, return NULL);
- tmp2 = tmp;
- tmp = strchr(tmp, ' ');
- *(tmp++) = '\0';
- STRDUP(delta->delta_md5, tmp2, return NULL);
+ len = pmatch[2].rm_eo - pmatch[2].rm_so;
+ STRNDUP(delta->delta_md5, &line[pmatch[2].rm_so], len, return NULL);
- tmp2 = tmp;
- tmp = strchr(tmp, ' ');
- *(tmp++) = '\0';
- delta->delta_size = _alpm_strtoofft(tmp2);
+ len = pmatch[3].rm_eo - pmatch[3].rm_so;
+ if(len < sizeof(filesize)) {
+ strncpy(filesize, &line[pmatch[3].rm_so], len);
+ filesize[len] = '\0';
+ delta->delta_size = _alpm_strtoofft(filesize);
+ }
- tmp2 = tmp;
- tmp = strchr(tmp, ' ');
- *(tmp++) = '\0';
- STRDUP(delta->from, tmp2, return NULL);
+ len = pmatch[4].rm_eo - pmatch[4].rm_so;
+ STRNDUP(delta->from, &line[pmatch[4].rm_so], len, return NULL);
- tmp2 = tmp;
- STRDUP(delta->to, tmp2, return NULL);
+ len = pmatch[5].rm_eo - pmatch[5].rm_so;
+ STRNDUP(delta->to, &line[pmatch[5].rm_so], len, return NULL);
return delta;
}