optimize the case with a simple type

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1371 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
1997-03-12 11:34:28 +00:00
parent b2fbd987d2
commit 84d5c4e87d

View File

@@ -239,9 +239,11 @@ encode_type (char *name, Type *t)
fprintf (codefile, fprintf (codefile,
"if(%s)\n", "if(%s)\n",
s); s);
#if 1
fprintf (codefile, "{\n" fprintf (codefile, "{\n"
"int oldret = ret;\n" "int oldret = ret;\n"
"ret = 0;\n"); "ret = 0;\n");
#endif
encode_type (s, m->type); encode_type (s, m->type);
fprintf (codefile, fprintf (codefile,
"l = der_put_length_and_tag (p, len, ret, CONTEXT, CONS, %d);\n" "l = der_put_length_and_tag (p, len, ret, CONTEXT, CONS, %d);\n"
@@ -251,9 +253,11 @@ encode_type (char *name, Type *t)
"len -= l;\n" "len -= l;\n"
"ret += l;\n\n", "ret += l;\n\n",
m->val); m->val);
#if 1
fprintf (codefile, fprintf (codefile,
"ret += oldret;\n" "ret += oldret;\n"
"}\n"); "}\n");
#endif
if (tag == -1) if (tag == -1)
tag = m->val; tag = m->val;
free (s); free (s);
@@ -272,13 +276,19 @@ encode_type (char *name, Type *t)
fprintf (codefile, fprintf (codefile,
"for(i = (%s)->len - 1; i >= 0; --i) {\n" "for(i = (%s)->len - 1; i >= 0; --i) {\n"
#if 1
"int oldret = ret;\n" "int oldret = ret;\n"
"ret = 0;\n", "ret = 0;\n",
#else
,
#endif
name); name);
sprintf (n, "&(%s)->val[i]", name); sprintf (n, "&(%s)->val[i]", name);
encode_type (n, t->subtype); encode_type (n, t->subtype);
fprintf (codefile, fprintf (codefile,
#if 1
"ret += oldret;\n" "ret += oldret;\n"
#endif
"}\n" "}\n"
"l = der_put_length_and_tag (p, len, ret, UNIV, CONS, UT_Sequence);\n" "l = der_put_length_and_tag (p, len, ret, UNIV, CONS, UT_Sequence);\n"
"if(l < 0)\n" "if(l < 0)\n"
@@ -320,14 +330,38 @@ generate_type_encode (Symbol *s)
fprintf (codefile, "int\n" fprintf (codefile, "int\n"
"encode_%s(unsigned char *p, int len, %s *data)\n" "encode_%s(unsigned char *p, int len, %s *data)\n"
"{\n" "{\n",
"int ret = 0;\n"
"int l, i;\n\n",
s->gen_name, s->gen_name); s->gen_name, s->gen_name);
encode_type ("data", s->type); switch (s->type->type) {
fprintf (codefile, "return ret;\n" case TInteger:
"}\n\n"); fprintf (codefile, "return encode_integer (p, len, data);\n");
break;
case TOctetString:
fprintf (codefile, "return encode_octet_string (p, len, data);\n");
break;
case TGeneralizedTime:
fprintf (codefile, "return encode_generalized_time (p, len, data);\n");
break;
case TGeneralString:
fprintf (codefile, "return encode_general_string (p, len, data);\n");
break;
case TBitString:
case TSequence:
case TSequenceOf:
case TApplication:
case TType:
fprintf (codefile,
"int ret = 0;\n"
"int l, i;\n\n");
encode_type ("data", s->type);
fprintf (codefile, "return ret;\n");
break;
default:
abort ();
}
fprintf (codefile, "}\n\n");
} }
static void static void
@@ -563,6 +597,50 @@ decode_type (char *name, Type *t)
} }
} }
static void
generate_type_decode (Symbol *s)
{
fprintf (headerfile,
"int decode_%s(unsigned char *, int, %s *);\n",
s->gen_name, s->gen_name);
fprintf (codefile, "int\n"
"decode_%s(unsigned char *p, int len, %s *data)\n"
"{\n",
s->gen_name, s->gen_name);
switch (s->type->type) {
case TInteger:
fprintf (codefile, "return decode_integer (p, len, data);\n");
break;
case TOctetString:
fprintf (codefile, "return decode_octet_string (p, len, data);\n");
break;
case TGeneralizedTime:
fprintf (codefile, "return decode_generalized_time (p, len, data);\n");
break;
case TGeneralString:
fprintf (codefile, "return decode_general_string (p, len, data);\n");
break;
case TBitString:
case TSequence:
case TSequenceOf:
case TApplication:
case TType:
fprintf (codefile,
"int ret = 0, reallen;\n"
"int l, i;\n\n");
decode_type ("data", s->type);
fprintf (codefile, "return ret;\n");
break;
default:
abort ();
}
fprintf (codefile, "}\n\n");
}
#if 0
static void static void
generate_type_decode (Symbol *s) generate_type_decode (Symbol *s)
{ {
@@ -581,6 +659,7 @@ generate_type_decode (Symbol *s)
fprintf (codefile, "return ret;\n" fprintf (codefile, "return ret;\n"
"}\n\n"); "}\n\n");
} }
#endif
void void
generate_type (Symbol *s) generate_type (Symbol *s)