+illegal:
+ error(_("Illegal datestamp expression %s"),dateexp);
+ /*NOTREACHED*/
+}
+
+
+int
+match_level(
+ const char * levelexp,
+ const char * level)
+{
+ char *dash;
+ long int low, hi, level_i;
+ char mylevelexp[100];
+ int match_exact;
+
+ if(strlen(levelexp) >= 100 || strlen(levelexp) < 1) {
+ error(_("Illegal level expression %s"),levelexp);
+ /*NOTREACHED*/
+ }
+
+ if(levelexp[0] == '^') {
+ strncpy(mylevelexp, levelexp+1, strlen(levelexp)-1);
+ mylevelexp[strlen(levelexp)-1] = '\0';
+ }
+ else {
+ strncpy(mylevelexp, levelexp, strlen(levelexp));
+ mylevelexp[strlen(levelexp)] = '\0';
+ }
+
+ if(mylevelexp[strlen(mylevelexp)-1] == '$') {
+ match_exact = 1;
+ mylevelexp[strlen(mylevelexp)-1] = '\0';
+ }
+ else
+ match_exact = 0;
+
+ if((dash = strchr(mylevelexp,'-'))) {
+ if(match_exact == 1) {
+ goto illegal;
+ }
+
+ *dash = '\0';
+ if (!alldigits(mylevelexp) || !alldigits(dash+1)) goto illegal;
+
+ errno = 0;
+ low = strtol(mylevelexp, (char **) NULL, 10);
+ if (errno) goto illegal;
+ hi = strtol(dash+1, (char **) NULL, 10);
+ if (errno) goto illegal;
+ level_i = strtol(level, (char **) NULL, 10);
+ if (errno) goto illegal;
+
+ return ((level_i >= low) && (level_i <= hi));
+ }
+ else {
+ if (!alldigits(mylevelexp)) goto illegal;
+ if(match_exact == 1) {
+ return (strcmp(level, mylevelexp) == 0);
+ }
+ else {
+ return (strncmp(level, mylevelexp, strlen(mylevelexp)) == 0);
+ }
+ }
+illegal:
+ error(_("Illegal level expression %s"),levelexp);
+ /*NOTREACHED*/