|
|
|
|
|
|
|
|
void *start; |
|
|
void *start; |
|
|
size_t length; |
|
|
size_t length; |
|
|
int group3_ix; |
|
|
int group3_ix; |
|
|
|
|
|
int index; |
|
|
} RGROUP; |
|
|
} RGROUP; |
|
|
|
|
|
|
|
|
typedef enum |
|
|
typedef enum |
|
|
|
|
|
|
|
|
if (ix != 0) return ix; |
|
|
if (ix != 0) return ix; |
|
|
ix = strcmp(a->name, b->name); |
|
|
ix = strcmp(a->name, b->name); |
|
|
if (ix != 0) return ix; |
|
|
if (ix != 0) return ix; |
|
|
return (uintptr_t)a->start - (uintptr_t)b->start; |
|
|
|
|
|
|
|
|
return a->index - b->index; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void* output_rule_group(int n_rules, char **rules, char *name, size_t *outsize) |
|
|
static void* output_rule_group(int n_rules, char **rules, char *name, size_t *outsize) |
|
|
|
|
|
|
|
|
strcpy(rgroup[n_rgroups].name, ctx->group_name); |
|
|
strcpy(rgroup[n_rgroups].name, ctx->group_name); |
|
|
rgroup[n_rgroups].group3_ix = ctx->group3_ix; |
|
|
rgroup[n_rgroups].group3_ix = ctx->group3_ix; |
|
|
rgroup[n_rgroups].start = output_rule_group(n_rules, rules, ctx->group_name, &rgroup[n_rgroups].length); |
|
|
rgroup[n_rgroups].start = output_rule_group(n_rules, rules, ctx->group_name, &rgroup[n_rgroups].length); |
|
|
|
|
|
rgroup[n_rgroups].index = n_rgroups; |
|
|
n_rgroups++; |
|
|
n_rgroups++; |
|
|
|
|
|
|
|
|
count += n_rules; |
|
|
count += n_rules; |