haproxy/tests/test-arg.c
Willy Tarreau 2ac5718dbd MEDIUM: add a new typed argument list parsing framework
make_arg_list() builds an array of typed arguments with their values,
that the caller describes how to parse. This will be used to support
multiple arguments for ACLs and patterns, which is currently problematic
and prevents ACLs and patterns from being merged. Up to 7 arguments types
may be enumerated in a single 32-bit word, including their number of
mandatory parts.

At the moment, these files are not used yet, they're only built. Note that
the 4-bit encoding for the type has left only one unused type!
2012-05-08 20:57:10 +02:00

45 lines
1.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "proto/arg.h"
int main(int argc, char **argv)
{
int nbargs, err_arg, mask;
struct arg *argp;
char *err_msg = NULL;
const char *err_ptr = NULL;
if (argc < 2) {
printf("Usage: %s arg_list [arg_mask]\n"
" mask defaults to 0x86543290\n"
" eg: %s 10k,+20,Host,1.2.3.4,24,::5.6.7.8,120s\n", *argv, *argv);
return 1;
}
mask = ARG7(0,SIZE,SINT,STR,IPV4,MSK4,IPV6,TIME);
if (argc >= 3)
mask = atoll(argv[2]);
printf("Using mask=0x%08x\n", mask);
nbargs = make_arg_list(argv[1], strlen(argv[1]), mask,
&argp, &err_msg, &err_ptr, &err_arg);
printf("nbargs=%d\n", nbargs);
if (nbargs < 0) {
printf("err_msg=%s\n", err_msg); free(err_msg);
printf("err_ptr=%s (str+%d)\n", err_ptr, err_ptr - argv[1]);
printf("err_arg=%d\n", err_arg);
return 1;
}
if (nbargs > 0) {
int arg;
for (arg = 0; arg < nbargs; arg++)
printf("arg %d: type=%d, int=0x%08x\n",
arg, argp[arg].type, *(int*)&argp[arg].data.uint);
}
return 0;
}