#define _GNU_SOURCE #include #include int strverscmp(const char *l, const char *r) { const char *ln=(isdigit(*l) ? l : NULL), *rn=(isdigit(*r) ? r : NULL); while (*l==*r) { if (!*l) return 0; if (isdigit(*l)) { if (ln == NULL) { ln = l; rn = r; } } else { ln = NULL; rn = NULL; } l++; r++; } if ((*l != '\0' && !isdigit(*l)) || (*r != '\0' && !isdigit(*r))) { ln = NULL; rn = NULL; } if (ln != NULL) { int intl=(*ln != '0' || !isdigit(*(ln + 1))); int intr=(*rn != '0' || !isdigit(*(rn + 1))); if (intl ^ intr) { return intl ? 1 : -1; } else if (intl) { size_t lenl=0, lenr=0; while (isdigit(l[lenl])) lenl++; while (isdigit(r[lenr])) lenr++; if (lenl==lenr) { return ((unsigned char)*l - (unsigned char)*r); } else if (lenl>lenr) { return 1; } else { return -1; } } else { size_t zl=0, zr=0; while (ln[zl]=='0') zl++; while (rn[zr]=='0') zr++; if (zl>zr) { return -1; } else if (zl