mirror of
https://github.com/adulau/ssldump.git
synced 2024-11-24 10:27:05 +00:00
241 lines
4 KiB
Text
241 lines
4 KiB
Text
/**
|
|
ssl.y
|
|
|
|
Copyright (C) 1998, RTFM, Inc.
|
|
All Rights Reserved.
|
|
|
|
ekr@rtfm.com Fri Dec 25 20:33:47 1998
|
|
*/
|
|
|
|
|
|
%{
|
|
|
|
typedef struct select_st_ {
|
|
char *name;
|
|
char *code;
|
|
int val;
|
|
struct select_st_ *next;
|
|
} select_st;
|
|
|
|
|
|
select_st *select_base;
|
|
select_st *select_ptr;
|
|
|
|
select_st *constant_base;
|
|
select_st *constant_ptr;
|
|
|
|
#include <stdio.h>
|
|
|
|
extern FILE *dotc;
|
|
extern FILE *doth;
|
|
|
|
%}
|
|
%union {
|
|
int val;
|
|
unsigned char str[8192];
|
|
}
|
|
|
|
|
|
/*These tokens have attributes*/
|
|
%token <str> NAME_
|
|
%token <val> NUM_
|
|
|
|
/*Tokens*/
|
|
%token <val> DOT_DOT_
|
|
%token <val> STRUCT_
|
|
%token <val> SELECT_
|
|
%token <str> OPAQUE_
|
|
%token <val> SELECT_
|
|
%token <val> ENUM_
|
|
%token <val> DIGITALLY_SIGNED_
|
|
%token <val> COMMENT_START_
|
|
%token <str> CODE_
|
|
%token <val> COMMENT_END_
|
|
%token <val> CASE_
|
|
%token <val> CONSTANT_
|
|
/*Types for nonterminals*/
|
|
%type <val> module
|
|
%type <val> typelist
|
|
%type <val> definition
|
|
%type <val> selecttype
|
|
%type <val> constant_type
|
|
%type <val> selecterateds
|
|
%type <val> selectmax
|
|
%type <val> constval
|
|
/*%type <val> selecterated*/
|
|
%%
|
|
module: typelist
|
|
|
|
typelist: {$$=1};
|
|
| definition typelist
|
|
{
|
|
$$=1;
|
|
}
|
|
;
|
|
|
|
definition: selecttype
|
|
| constant_type
|
|
;
|
|
|
|
selecttype: SELECT_ '{' selecterateds ',' selectmax '}' NAME_ ';'
|
|
{
|
|
select_st *en;
|
|
char filename[100];
|
|
|
|
for(en=select_base;en;en=en->next){
|
|
fprintf(dotc,"static int decode_%s_%s(ssl,dir,seg,data)\n",
|
|
$7,en->name);
|
|
fprintf(dotc," ssl_obj *ssl;\n");
|
|
fprintf(dotc," int dir;\n");
|
|
fprintf(dotc," segment *seg;\n");
|
|
fprintf(dotc," Data *data;\n");
|
|
fprintf(dotc," {\n");
|
|
if(en->code){
|
|
en->code+=2;
|
|
en->code[strlen(en->code)-2]=0;
|
|
fprintf(dotc,"\n%s\n",en->code);
|
|
}
|
|
else{
|
|
/* fprintf(dotc," fprintf(dotc,\"Decoding %s...%cn\");\n",en->name,'\\');*/
|
|
fprintf(dotc," return(0);\n");
|
|
}
|
|
fprintf(dotc," }\n");
|
|
}
|
|
|
|
fprintf(dotc,"decoder %s_decoder[]={\n",$7);
|
|
fprintf(doth,"extern decoder %s_decoder[];\n",$7);
|
|
for(en=select_base;en;en=en->next){
|
|
fprintf(dotc," {\n");
|
|
fprintf(dotc," %d,\n",en->val);
|
|
fprintf(dotc," \"%s\",\n",en->name);
|
|
fprintf(dotc," decode_%s_%s\n",$7,en->name);
|
|
fprintf(dotc," },\n");
|
|
}
|
|
|
|
fprintf(dotc,"{-1}\n");
|
|
fprintf(dotc,"};\n\n");
|
|
|
|
|
|
|
|
select_base=0;
|
|
}
|
|
;
|
|
|
|
selecterateds: selecterateds ',' selecterated
|
|
| selecterated
|
|
{;
|
|
}
|
|
;
|
|
|
|
selectmax: '(' NUM_ ')'
|
|
{$$=1;};
|
|
|
|
selecterated: selecterated_no_code
|
|
| selecterated_code
|
|
;
|
|
|
|
|
|
selecterated_code: NAME_ '(' NUM_ ')' CODE_
|
|
{
|
|
select_st *en;
|
|
|
|
en=malloc(sizeof(select_st));
|
|
|
|
en->next=0;
|
|
en->val=$3;
|
|
en->name=strdup($1);
|
|
en->code=strdup($5);
|
|
|
|
if(!select_base){
|
|
select_base=en;
|
|
select_ptr=en;
|
|
}
|
|
else{
|
|
select_ptr->next=en;
|
|
select_ptr=en;
|
|
}
|
|
};
|
|
|
|
|
|
selecterated_no_code: NAME_ '(' NUM_ ')'
|
|
{
|
|
select_st *en;
|
|
|
|
en=malloc(sizeof(select_st));
|
|
|
|
en->next=0;
|
|
en->val=$3;
|
|
en->name=strdup($1);
|
|
en->code=0;
|
|
|
|
if(!select_base){
|
|
select_base=en;
|
|
select_ptr=en;
|
|
}
|
|
else{
|
|
select_ptr->next=en;
|
|
select_ptr=en;
|
|
}
|
|
};
|
|
|
|
constant_type: CONSTANT_ '{' constants '}' NAME_ ';'
|
|
{
|
|
select_st *en;
|
|
|
|
fprintf(dotc,"decoder %s_decoder[]={\n",$5);
|
|
fprintf(doth,"extern decoder %s_decoder[];\n",$5);
|
|
|
|
for(en=constant_base;en;en=en->next){
|
|
fprintf(dotc," {\n");
|
|
fprintf(dotc," %d,\n",en->val);
|
|
fprintf(dotc," \"%s\",\n",en->name);
|
|
fprintf(dotc," 0");
|
|
fprintf(dotc," },\n");
|
|
}
|
|
|
|
fprintf(dotc,"{-1}\n");
|
|
fprintf(dotc,"};\n\n");
|
|
constant_ptr=0;
|
|
constant_base=0;
|
|
}
|
|
|
|
constants: constants constant
|
|
| constant
|
|
{;
|
|
}
|
|
;
|
|
|
|
constant: NAME_ NAME_ '=' '{' constval '}' ';'
|
|
{
|
|
select_st *en;
|
|
|
|
en=malloc(sizeof(select_st));
|
|
|
|
en->next=0;
|
|
en->val=$5;
|
|
en->name=strdup($2);
|
|
|
|
if(!constant_base){
|
|
constant_base=en;
|
|
constant_ptr=en;
|
|
}
|
|
else{
|
|
constant_ptr->next=en;
|
|
constant_ptr=en;
|
|
}
|
|
};
|
|
|
|
constval: NUM_ ',' NUM_ ',' NUM_
|
|
{
|
|
$$=($1 << 16) | ($3 << 8) | $5;
|
|
}
|
|
| NUM_ ',' NUM_
|
|
{
|
|
$$=($1 << 8) | $3;
|
|
}
|
|
| NUM_
|
|
{
|
|
$$=$1;
|
|
}
|
|
;
|
|
|