betaur

[WIP] A better AUR helper written in C

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
#include <alpm.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "dependency.h"

betaur_dependency_t* betaur_dependency_create(size_t depstring_len, char* depstring) {
	betaur_dependency_t* bdep = (betaur_dependency_t *) malloc(sizeof(betaur_dependency_t));
	char* pos;
	bdep->depstring = depstring;
	bdep->name = depstring;
	bdep->mod = BETAUR_ANY;
	assert(bdep != NULL);
	if (pos = strstr(depstring, "<=")) {

		bdep->mod = BETAUR_LE;
		bdep->name_len = (size_t) (pos - depstring);
		bdep->version = pos + 2;
		bdep->version_len = (size_t) depstring_len - bdep->name_len - 2;
	} else if (pos = strstr(depstring, ">=")) {
		bdep->mod = BETAUR_GE;
		bdep->name_len = (size_t) (pos - depstring);
		bdep->version = pos + 2;
		bdep->version_len = (size_t) depstring_len - bdep->name_len - 2;
	} else {
		for (pos = depstring; pos < (depstring + depstring_len); pos++) {
			switch  (*pos) {
				case '<':
					bdep->mod = BETAUR_LT;
					break;
				case '>':
					bdep->mod = BETAUR_GT;
					break;
				case '=':
					bdep->mod = BETAUR_EQ;
					break;
			}
		}
		if (bdep->mod != BETAUR_ANY) {
			bdep->name_len = (size_t) (pos - depstring);
			bdep->version = pos + 1;
			bdep->version_len = (size_t) depstring_len - bdep->name_len - 1;
		} else {
			bdep->name = depstring;
		}
	}

	return bdep;
}


bool betaur_satisfied_by_version(betaur_dependency_t* bdep, const char* version) {
	// FIXME we may need to make a copy here
	// This will most probably crash when reading input from files
	int vercmp = alpm_pkg_vercmp(version, bdep->version);
	// TODO can't we just return vercmp??? hmmm...
	switch(bdep->mod) {
		case BETAUR_EQ:
			return vercmp == 0;
		case BETAUR_GE:
			return vercmp >= 0;
		case BETAUR_GT:
			return vercmp > 0;
		case BETAUR_LE:
			return vercmp <= 0;
		case BETAUR_LT:
			return vercmp < 0;
		default:
			break;
	}
	return false;
}

bool betaur_satisfied_by(betaur_package_t bpack) {
	return false;
}