Browse Source

Stefan Fiedler:


			
			
				rocklinux
			
			
		
Stefan Fiedler 18 years ago
parent
commit
a6f4231f0f
1 changed files with 91 additions and 38 deletions
  1. +91
    -38
      misc/tools-source/config_helper.c

+ 91
- 38
misc/tools-source/config_helper.c

@ -43,6 +43,8 @@ struct builtin {
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <regex.h>
struct package;
struct package {
@ -155,38 +157,84 @@ int write_pkg_list(const char *file) {
return 0;
}
regex_t * create_pkg_regex(const char* pattern)
{
char fullpattern[512];
snprintf(fullpattern, 512, "[= ]%s ", pattern);
regex_t *preg = malloc(sizeof(regex_t));
int errcode = regcomp(preg, fullpattern,
REG_EXTENDED | REG_ICASE | REG_NOSUB | REG_NEWLINE);
if (errcode)
{
int errbuf_size = regerror(errcode, preg, 0, 0);
char *errbuf = malloc(errbuf_size);
regerror(errcode, preg, errbuf, errbuf_size);
fprintf(stderr, "config_helper: create_pkg_regex(%s): %s\n",
pattern, errbuf);
free(errbuf);
return NULL;
}
return preg;
}
char * create_pkg_line(struct package *pkg)
{
char *line = calloc(1024, sizeof(char));
int i, offset = 0;
offset += snprintf(line+offset, 1024-offset, "%c ",
pkg->status ? 'X' : 'O');
for (i=0; i<10; i++)
offset += snprintf(line+offset, 1024-offset, "%c",
pkg->stages[i] ? pkg->stages[i] : '-');
offset += snprintf(line+offset, 1024-offset, " %s %s %s",
pkg->prio, pkg->repository, pkg->name);
if (strcmp(pkg->name, pkg->alias))
offset += snprintf(line+offset, 1024-offset, "=%s", pkg->alias);
offset += snprintf(line+offset, 1024-offset, " %s %s %s0\n",
pkg->version, pkg->prefix, pkg->flags);
return line;
}
int pkgcheck(const char *pattern, const char *mode)
{
struct package *pkg = package_list;
char *pattern_copy = strdup(pattern);
char *pat_list[10];
int i;
pat_list[0] = strtok(pattern_copy, "|");
for (i=1; i<10; i++)
if ( !(pat_list[i] = strtok(0, "|")) ) break;
char fullpattern[512];
snprintf(fullpattern, 512, "[= ]%s ", pattern);
regex_t *preg = create_pkg_regex(pattern);
if (preg == NULL) return 0;
while (pkg) {
for (i=0; i<10 && pat_list[i]; i++)
if (!strcmp(pkg->alias, pat_list[i]))
switch (mode[0]) {
case 'X':
if (pkg->status) goto found;
break;
case 'O':
if (!pkg->status) goto found;
break;
case '.':
goto found;
}
char *line = create_pkg_line(pkg);
int match = !regexec(preg, line, 0, 0, 0);
free(line);
if (match)
{
switch (mode[0]) {
case 'X':
if (pkg->status) goto found;
break;
case 'O':
if (!pkg->status) goto found;
break;
case '.':
goto found;
}
}
pkg = pkg->next;
}
free(pattern_copy);
regfree(preg);
return 1;
found:
free(pattern_copy);
regfree(preg);
return 0;
}
@ -195,26 +243,31 @@ int pkgswitch(int mode, char **args)
struct package *pkg = package_list;
struct package *last_pkg = 0;
struct package *pkg_tmp = 0;
int i;
regex_t *preg = create_pkg_regex(args[0]);
if (preg == NULL) return 0;
while (pkg) {
for (i=0; *args[i]; i++)
if (!strcmp(pkg->alias, args[i])) {
if ( !mode ) {
*(last_pkg ? &(last_pkg->next) : &package_list) = pkg->next;
free(pkg->prio);
free(pkg->repository);
free(pkg->name);
free(pkg->alias);
free(pkg->version);
free(pkg->prefix);
free(pkg->flags);
pkg = (pkg_tmp=pkg)->next;
free(pkg_tmp);
continue;
} else
pkg->status = mode == 1;
}
char *line = create_pkg_line(pkg);
int match = !regexec(preg, line, 0, 0, 0);
free(line);
if (match) {
if ( !mode ) {
*(last_pkg ? &(last_pkg->next) : &package_list) = pkg->next;
free(pkg->prio);
free(pkg->repository);
free(pkg->name);
free(pkg->alias);
free(pkg->version);
free(pkg->prefix);
free(pkg->flags);
pkg = (pkg_tmp=pkg)->next;
free(pkg_tmp);
continue;
} else
pkg->status = mode == 1;
}
pkg = (last_pkg=pkg)->next;
}

Loading…
Cancel
Save