Changeset 2749


Ignore:
Timestamp:
Jan 3, 2016, 5:28:50 AM (4 years ago)
Author:
julian.reschke@…
Message:

bap: experimental support for RFC 7405

Location:
abnfparser/bap
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • abnfparser/bap/main.c

    r2747 r2749  
    110110int tflag = 0;          /* print type info */
    111111int permissive = 1;     /* Be permissive (e.g. accept '|') */
     112int rfc7405 = 0;        /* Support RFC 7405 (%s/%i) */
    112113int qflag = 0;          /* quiet */
    113114int canon = 1;          /* canonify */
     
    121122{
    122123  fprintf(stderr, "Bill's ABNF Parser version %s\n", versionstring);
    123   fprintf(stderr, "usage: bap [-cknqtx][-i rules][-l num][-S name][file]\n");
     124  fprintf(stderr, " (with extensions from <https://svn.tools.ietf.org/svn/wg/httpbis/abnfparser/bap/>)\n", versionstring);
     125  fprintf(stderr, "usage: bap [-cknqtx][-i rules][-l num][-S name][-X ext][file]\n");
    124126  fprintf(stderr, " parse ABNF grammar from file or stdin\n");
    125127  fprintf(stderr, " Input options:\n");
     
    127129  fprintf(stderr, "  -i file  read predefined rules from \"file\"\n");
    128130  fprintf(stderr, "  -S name  name rule as production start\n");
     131  fprintf(stderr, "  -X ext   comma-separated list of allowed extensions\n");
     132  fprintf(stderr, "           (only value currently supported is rfc7405)\n");
    129133  fprintf(stderr, " Output options:\n");
    130134  fprintf(stderr, "  -k       add comments for printable characters specified as %%x\n");
     
    152156  hcreate(MAXRULE);
    153157
    154   while ((ch = getopt(argc, argv, "cdi:kntqS:xl:")) != -1) {
     158  while ((ch = getopt(argc, argv, "cdi:kntqS:xl:X:")) != -1) {
    155159    switch (ch) {
    156160    case 'c':
     
    198202      break;
    199203     
     204    case 'X': {
     205        char *x = strtok(optarg, ",");
     206        while (x != NULL) {
     207          if (0 == strcmp(x, "rfc7405")) {
     208            rfc7405 = 1;
     209          }
     210          else {
     211            fprintf(stderr, "unknown extension: %s\n", x);
     212            exit(2);
     213          }
     214          x = strtok(NULL, ",");
     215        }
     216      }
     217      break;
     218
    200219    case 'x':
    201220      asxml = 1;
  • abnfparser/bap/parser.y

    r2747 r2749  
    7171}
    7272
    73 %token <string> CHARVAL PROSEVAL BINVAL DECVAL HEXVAL RULENAME
     73%token <string> CHARVAL CHARVALCS PROSEVAL BINVAL DECVAL HEXVAL RULENAME
    7474%token <range> BINVALRANGE DECVALRANGE HEXVALRANGE REPEAT LIST
    7575%token CWSP EQSLASH CRLF
     
    322322                                $$->u.e.e.termstr.flags = 0;
    323323                                }
     324        | CHARVALCS             {
     325                                char *p = $1;
     326                                if (*$1)
     327                                        p += strlen($1) - 1;
     328                                if (*p == '\n' || *p == '\r') {
     329                                        mywarn(MYERROR, "unterminated quoted-string");
     330                                        YYERROR;
     331                                }
     332                                $$ = newobj(T_TERMSTR);
     333                                $$->u.e.e.termstr.str = $1;
     334                                $$->u.e.e.termstr.flags = F_CASESENSITIVE;
     335                                }
    324336        | numval                {
    325337                                $$ = newobj(T_TERMSTR);
  • abnfparser/bap/scanner.l

    r2747 r2749  
    4343int yyerrors = 0;
    4444extern int permissive;
     45extern int rfc7405;
    4546int indent = -1;
    4647
     
    9394                                mywarn(MYWARNING, "zero-length char-val");
    9495                        return CHARVAL;
     96                        }
     97\%i\"{charval}["\r\n]   {
     98      if (!rfc7405) {
     99                                mywarn(MYERROR, "need to enable support for RFC 7405 using -Xrfc7405");
     100        badchar = yytext[0];
     101        BEGIN(SKIP);
     102      }
     103                        char *p;
     104                        yycolumn += strlen(yytext);
     105                        yylval.string = strdup(yytext + 3);
     106                        p = &yylval.string[strlen(yylval.string) - 1];
     107                        if (*p != '"') {
     108                                mywarn(MYERROR, "unterminated char-val");
     109                                unput(*p);      /* put the cr or lf back */
     110                        }
     111                        *p = '\0';
     112                        if (*yylval.string == '\0')
     113                                mywarn(MYWARNING, "zero-length char-val");
     114                        return CHARVAL;
     115                        }
     116\%s\"{charval}["\r\n]   {
     117      if (!rfc7405) {
     118                                mywarn(MYERROR, "need to enable support for RFC 7405 using -Xrfc7405");
     119        badchar = yytext[0];
     120        BEGIN(SKIP);
     121      }
     122                        char *p;
     123                        yycolumn += strlen(yytext);
     124                        yylval.string = strdup(yytext + 3);
     125                        p = &yylval.string[strlen(yylval.string) - 1];
     126                        if (*p != '"') {
     127                                mywarn(MYERROR, "unterminated char-val");
     128                                unput(*p);      /* put the cr or lf back */
     129                        }
     130                        *p = '\0';
     131                        if (*yylval.string == '\0')
     132                                mywarn(MYWARNING, "zero-length char-val");
     133                        return CHARVALCS;
    95134                        }
    96135\<{proseval}[>\r\n]     {
Note: See TracChangeset for help on using the changeset viewer.