[Redbutton-devel] SF.net SVN: redbutton: [451] redbutton-author/trunk
Brought to you by:
skilvington
|
From: <ski...@us...> - 2007-10-19 11:06:52
|
Revision: 451
http://redbutton.svn.sourceforge.net/redbutton/?rev=451&view=rev
Author: skilvington
Date: 2007-10-19 04:06:49 -0700 (Fri, 19 Oct 2007)
Log Message:
-----------
don't eat synthetic tags in CHOICE types
Modified Paths:
--------------
redbutton-author/trunk/asn1tag.h
redbutton-author/trunk/ccc.y
redbutton-author/trunk/der_decode.c
Modified: redbutton-author/trunk/asn1tag.h
===================================================================
--- redbutton-author/trunk/asn1tag.h 2007-10-18 16:20:22 UTC (rev 450)
+++ redbutton-author/trunk/asn1tag.h 2007-10-19 11:06:49 UTC (rev 451)
@@ -763,14 +763,14 @@
#define ASN1TAGCLASS_ContentBody FIXME
#define ASN1TAGCLASS_DefaultAttribute FIXME
#define ASN1TAGCLASS_ElementaryAction FIXME
-#define ASN1TAGCLASS_EventDataBody FIXME
+#define ASN1TAGCLASS_EventDataBody ASN1TAG_CHOICE
#define ASN1TAGCLASS_EventTypeEnum ASN1TAGCLASS_ENUMERATED
#define ASN1TAGCLASS_FontBody FIXME
-#define ASN1TAGCLASS_GenericBoolean FIXME
-#define ASN1TAGCLASS_GenericContentReference FIXME
-#define ASN1TAGCLASS_GenericInteger FIXME
-#define ASN1TAGCLASS_GenericObjectReference FIXME
-#define ASN1TAGCLASS_GenericOctetString FIXME
+#define ASN1TAGCLASS_GenericBoolean ASN1TAG_CHOICE
+#define ASN1TAGCLASS_GenericContentReference ASN1TAG_CHOICE
+#define ASN1TAGCLASS_GenericInteger ASN1TAG_CHOICE
+#define ASN1TAGCLASS_GenericObjectReference ASN1TAG_CHOICE
+#define ASN1TAGCLASS_GenericOctetString ASN1TAG_CHOICE
#define ASN1TAGCLASS_GroupItem ASN1TAG_CHOICE
#define ASN1TAGCLASS_InputTypeEnum ASN1TAGCLASS_ENUMERATED
#define ASN1TAGCLASS_JustificationEnum ASN1TAGCLASS_ENUMERATED
Modified: redbutton-author/trunk/ccc.y
===================================================================
--- redbutton-author/trunk/ccc.y 2007-10-18 16:20:22 UTC (rev 450)
+++ redbutton-author/trunk/ccc.y 2007-10-19 11:06:49 UTC (rev 451)
@@ -849,7 +849,7 @@
/* assert */
if(item->type != IT_LITERAL)
fatal("Trailing non-literal");
- buf_append(&state.decode_fns, "\tfprintf(out, %s);\n\n", item->name);
+ buf_append(&state.decode_fns, "\tfprintf(out, \"%%s \", %s);\n\n", item->name);
item = item->next;
}
}
@@ -997,6 +997,7 @@
{
/* a CHOICE type */
buf_append(&state.decode_fns, "\t/* CHOICE */\n");
+ buf_append(&state.decode_fns, "\tlong pretag = ftell(der);\n");
buf_append(&state.decode_fns, "\tif((sublen = der_decode_Tag(der, &tag)) < 0)\n");
buf_append(&state.decode_fns, "\t\treturn der_error(\"%s\");\n", name);
buf_append(&state.decode_fns, "\tleft -= sublen;\n\n");
@@ -1018,11 +1019,18 @@
buf_append(&state.decode_fns, "\t");
else
buf_append(&state.decode_fns, "\telse ");
-/* TODO: does GenericObjectReference_direct_reference need a fseek(pretag) */
buf_append(&state.decode_fns, "if(is_%s(tag.class, tag.number))\n\t{\n", item->name);
- buf_append(&state.decode_fns, "\t\tif((sublen = asn1decode_%s(der, out, tag.length)) < 0)\n", item->name);
- buf_append(&state.decode_fns, "\t\t\treturn der_error(\"%s\");\n", name);
- buf_append(&state.decode_fns, "\t\tleft -= sublen;\n");
+ /* if it is a synthetic or primitive type, we still need the current tag */
+ buf_append(&state.decode_fns, "\t\tif(keep_tag(ASN1TAGCLASS_%s))\n", item->name);
+ buf_append(&state.decode_fns, "\t\t{\n");
+ buf_append(&state.decode_fns, "\t\t\tfseek(der, pretag, SEEK_SET);\n");
+ buf_append(&state.decode_fns, "\t\t\tasn1decode_%s(der, out, sublen + tag.length);\n", item->name);
+ buf_append(&state.decode_fns, "\t\t}\n");
+ buf_append(&state.decode_fns, "\t\telse\n");
+ buf_append(&state.decode_fns, "\t\t{\n");
+ buf_append(&state.decode_fns, "\t\t\tasn1decode_%s(der, out, tag.length);\n", item->name);
+ buf_append(&state.decode_fns, "\t\t}\n");
+ buf_append(&state.decode_fns, "\t\tleft -= tag.length;\n");
buf_append(&state.decode_fns, "\t}\n");
}
buf_append(&state.decode_fns, "\telse\n");
@@ -1030,7 +1038,8 @@
}
/* end decode_Xxx() function */
- buf_append(&state.decode_fns, "\tfprintf(out, \"\\n\");\n\n");
+ buf_append(&state.decode_fns, "\tif(!is_synthetic(ASN1TAGCLASS_%s))\n", name);
+ buf_append(&state.decode_fns, "\t\tfprintf(out, \"\\n\");\n\n");
buf_append(&state.decode_fns, "\tif(left != 0)\n");
buf_append(&state.decode_fns, "\t\treturn der_error(\"%s: %%d bytes left\", left);\n\n", name);
buf_append(&state.decode_fns, "\tverbose(\"</%s>\\n\");\n\n", name);
Modified: redbutton-author/trunk/der_decode.c
===================================================================
--- redbutton-author/trunk/der_decode.c 2007-10-18 16:20:22 UTC (rev 450)
+++ redbutton-author/trunk/der_decode.c 2007-10-19 11:06:49 UTC (rev 451)
@@ -95,7 +95,7 @@
verbose("<Boolean value=\"%s\"/>\n", val ? "true" : "false");
- fprintf(out, "%s", val ? "true" : "false");
+ fprintf(out, "%s ", val ? "true" : "false");
return length;
}
@@ -107,7 +107,7 @@
verbose("<Integer value=\"%d\"/>\n", val);
- fprintf(out, "%d", val);
+ fprintf(out, "%d ", val);
return length;
}
@@ -134,7 +134,7 @@
fprintf(out, "=%02x", byte);
left --;
}
- fprintf(out, "'");
+ fprintf(out, "' ");
verbose("</OctetString>\n");
@@ -162,7 +162,7 @@
verbose("<Enumerated value=\"%d\"/>\n", val);
- fprintf(out, "%s", names[val - 1]);
+ fprintf(out, "%s ", names[val - 1]);
return length;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|