* WGs marked with an * asterisk has had at least one new draft made available during the last 5 days

Changeset 2749


Ignore:
Timestamp:
2016-01-03 05:28:50 (6 weeks ago)
Author:
julian.reschke@gmx.de
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.