diff options
author | Dan McGee <dan@archlinux.org> | 2010-12-15 05:09:43 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2010-12-21 01:02:47 +0100 |
commit | 8ac7f7e6e557fe32dc36fce173db000b83611559 (patch) | |
tree | 9d902d7d5b548a7547ae905ddbfbb2d7b53f8184 /lib | |
parent | 45146dccbb94f14fb56df2999131851ff15e46b9 (diff) | |
download | pacman-8ac7f7e6e557fe32dc36fce173db000b83611559.tar.gz pacman-8ac7f7e6e557fe32dc36fce173db000b83611559.tar.xz |
Use macros in sync DB parsing
This simplifies a lot of the repetative code and makes it obvious where the
tricky or different ones are (e.g. depends, dates). It also makes it
significantly easier to change the way this code works in the future.
There should be no functional change with this patch.
Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libalpm/be_sync.c | 151 |
1 files changed, 52 insertions, 99 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 72caa507..137fc1b2 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -218,6 +218,24 @@ static int sync_db_populate(pmdb_t *db) return(count); } +#define READ_NEXT(s) do { \ + if(_alpm_archive_fgets(s, sizeof(s), archive) == NULL) goto error; \ + _alpm_strtrim(s); \ +} while(0) + +#define READ_AND_STORE(f) do { \ + READ_NEXT(line); \ + STRDUP(f, line, goto error); \ +} while(0) + +#define READ_AND_STORE_ALL(f) do { \ + char *linedup; \ + READ_NEXT(line); \ + if(strlen(line) == 0) break; \ + STRDUP(linedup, line, goto error); \ + f = alpm_list_add(f, linedup); \ +} while(1) /* note the while(1) and not (0) */ + static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entry *entry) { char line[1024]; @@ -264,63 +282,35 @@ static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entr while(_alpm_archive_fgets(line, sizeof(line), archive) != NULL) { _alpm_strtrim(line); if(strcmp(line, "%NAME%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - if(strcmp(_alpm_strtrim(line), pkg->name) != 0) { + READ_NEXT(line); + if(strcmp(line, pkg->name) != 0) { _alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: name " "mismatch on package %s\n"), db->treename, pkg->name); } } else if(strcmp(line, "%VERSION%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - if(strcmp(_alpm_strtrim(line), pkg->version) != 0) { + READ_NEXT(line); + if(strcmp(line, pkg->version) != 0) { _alpm_log(PM_LOG_ERROR, _("%s database is inconsistent: version " "mismatch on package %s\n"), db->treename, pkg->name); } } else if(strcmp(line, "%FILENAME%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->filename, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->filename); } else if(strcmp(line, "%DESC%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->desc, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->desc); } else if(strcmp(line, "%GROUPS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->groups = alpm_list_add(pkg->groups, linedup); - } + READ_AND_STORE_ALL(pkg->groups); } else if(strcmp(line, "%URL%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->url, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->url); } else if(strcmp(line, "%LICENSE%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->licenses = alpm_list_add(pkg->licenses, linedup); - } + READ_AND_STORE_ALL(pkg->licenses); } else if(strcmp(line, "%ARCH%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->arch, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->arch); } else if(strcmp(line, "%BUILDDATE%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - _alpm_strtrim(line); - + READ_NEXT(line); char first = tolower((unsigned char)line[0]); if(first > 'a' && first < 'z') { - struct tm tmp_tm = {0}; /* initialize to null in case of failure */ + /* initialize to null in case of failure */ + struct tm tmp_tm = {0}; setlocale(LC_TIME, "C"); strptime(line, "%a %b %e %H:%M:%S %Y", &tmp_tm); pkg->builddate = mktime(&tmp_tm); @@ -329,46 +319,28 @@ static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entr pkg->builddate = atol(line); } } else if(strcmp(line, "%PACKAGER%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->packager, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->packager); } else if(strcmp(line, "%CSIZE%") == 0) { - /* NOTE: the CSIZE and SIZE fields both share the "size" field - * in the pkginfo_t struct. This can be done b/c CSIZE - * is currently only used in sync databases, and SIZE is - * only used in local databases. + /* Note: the CSIZE and SIZE fields both share the "size" field in the + * pkginfo_t struct. This can be done b/c CSIZE is currently only used + * in sync databases, and SIZE is only used in local databases. */ - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - pkg->size = atol(_alpm_strtrim(line)); + READ_NEXT(line); + pkg->size = atol(line); /* also store this value to isize if isize is unset */ if(pkg->isize == 0) { pkg->isize = pkg->size; } } else if(strcmp(line, "%ISIZE%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - pkg->isize = atol(_alpm_strtrim(line)); + READ_NEXT(line); + pkg->isize = atol(line); } else if(strcmp(line, "%MD5SUM%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - STRDUP(pkg->md5sum, _alpm_strtrim(line), goto error); + READ_AND_STORE(pkg->md5sum); } else if(strcmp(line, "%REPLACES%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->replaces = alpm_list_add(pkg->replaces, linedup); - } + READ_AND_STORE_ALL(pkg->replaces); } else if(strcmp(line, "%EPOCH%") == 0) { - if(_alpm_archive_fgets(line, sizeof(line), archive) == NULL) { - goto error; - } - pkg->epoch = atoi(_alpm_strtrim(line)); + READ_NEXT(line); + pkg->epoch = atoi(line); } else if(strcmp(line, "%FORCE%") == 0) { /* For backward compatibility, treat force as a non-zero epoch * but only if we didn't already have a known epoch value. */ @@ -376,39 +348,20 @@ static int sync_db_read(pmdb_t *db, struct archive *archive, struct archive_entr pkg->epoch = 1; } } else if(strcmp(line, "%DEPENDS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - pmdepend_t *dep = _alpm_splitdep(_alpm_strtrim(line)); - pkg->depends = alpm_list_add(pkg->depends, dep); + /* Different than the rest because of the _alpm_splitdep call. */ + while(1) { + READ_NEXT(line); + if(strlen(line) == 0) break; + pkg->depends = alpm_list_add(pkg->depends, _alpm_splitdep(line)); } } else if(strcmp(line, "%OPTDEPENDS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->optdepends = alpm_list_add(pkg->optdepends, linedup); - } + READ_AND_STORE_ALL(pkg->optdepends); } else if(strcmp(line, "%CONFLICTS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->conflicts = alpm_list_add(pkg->conflicts, linedup); - } + READ_AND_STORE_ALL(pkg->conflicts); } else if(strcmp(line, "%PROVIDES%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && - strlen(_alpm_strtrim(line))) { - char *linedup; - STRDUP(linedup, _alpm_strtrim(line), goto error); - pkg->provides = alpm_list_add(pkg->provides, linedup); - } + READ_AND_STORE_ALL(pkg->provides); } else if(strcmp(line, "%DELTAS%") == 0) { - while(_alpm_archive_fgets(line, sizeof(line), archive) && strlen(_alpm_strtrim(line))) { - pmdelta_t *delta = _alpm_delta_parse(line); - if(delta) { - pkg->deltas = alpm_list_add(pkg->deltas, delta); - } - } + READ_AND_STORE_ALL(pkg->deltas); } } } else { |