#include "sqlite3.h"
-int zpm_parse_package(char *pstr, char *name, char *ver, int *rel) {
- if (name) *name = 0;
- if (ver) *ver = 0;
- if (rel) *rel = 0;
- int havename = 0;
- int havever = 0;
- int haverel = 0;
-
- /* string - ver - rel */
- /* rel is all digits */
- /* possible forms:
- * ^(.+)-([0-9][^-]*)-([\d+])$
- * ^(.+)-([0-9][^-]*)$
- * ^(.+)$
- * The main problem in parsing is that the package name itself
- * can contain a '-', so you can't just split on '-'
- * Also, the version can be just digits.
- */
-
- /* everything up to the first '-' is in the name */
- while (*pstr) {
- if (*pstr == '\'' || !isgraph(*pstr)) {
- return 0;
- }
- if (*pstr == '-' && isdigit(*(pstr+1))) {
- break;
- }
- if (name) {
- *name++ = *pstr;
- }
- pstr++;
- havename = 1;
- }
- if (name) *name = 0;
- if (*pstr == '-') {
- pstr++;
- }
- while (*pstr && *pstr != '-') {
- if (*pstr == '\'' || !isgraph(*pstr)) {
- return 0;
- }
- if (ver) {
- *ver++ = *pstr;
- }
- pstr++;
- havever = 1;
- }
- if (ver) *ver = 0;
- if (*pstr == '-') {
- pstr++;
- }
- /* TODO use strtol */
- if (rel && *pstr) {
- haverel = 1;
- *rel = atoi(pstr);
- }
-
- return havename + havever + haverel;
-}
+#define DMARK fprintf(stderr, "mark %s %s:%d\n", __FILE__, __func__, __LINE__)
/*
* flags 0 = find installed
// char *order = "order by package, version collate vercmp, cast(release as integer)";
sqlite3_str *sql;
sqlite3_stmt *stmt;
- char *query, *pkgid;
+ char *query, *pkgid = 0;
char package[32];
char version[32];
int release;
+ if (pkgstr == NULL) {
+ fprintf(stderr, "trying to parse null string\n");
+ return NULL;
+ }
+
/* null pkgstr find "best" package
* best is shortest complete package if any are complete
* shortest incomplete if any are incomplete