X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=lib%2Fparse.c;fp=lib%2Fparse.c;h=5009c01bff3decc5964459457dcd795d3bb6aed8;hb=38b4e690c9910cde05ff97b7ebb32d5590328894;hp=0000000000000000000000000000000000000000;hpb=4a6ff66a5868ab54ec03f240d8160b7c87dd23f7;p=zpackage diff --git a/lib/parse.c b/lib/parse.c new file mode 100644 index 0000000..5009c01 --- /dev/null +++ b/lib/parse.c @@ -0,0 +1,72 @@ +#define _POSIX_C_SOURCE 200809L + +#include +#include +#include +#include + +#include "zpm.h" + +#include "sqlite3.h" + +#define DMARK fprintf(stderr, "mark %s %s:%d\n", __FILE__, __func__, __LINE__) + +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; +}