⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gen.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	break;    case TBoolean:	fprintf (headerfile, "BOOLEAN");	break;    case TOctetString:	fprintf (headerfile, "OCTET STRING");	break;    case TEnumerated :    case TBitString: {	Member *m;	space(level);	if(t->type == TBitString)	    fprintf (headerfile, "BIT STRING {\n");	else	    fprintf (headerfile, "ENUMERATED {\n");	ASN1_TAILQ_FOREACH(m, t->members, members) {	    space(level + 1);	    fprintf (headerfile, "%s(%d)%s\n", m->name, m->val, 		     last_member_p(m));	}	space(level);	fprintf (headerfile, "}");	break;    }    case TChoice:    case TSet:    case TSequence: {	Member *m;	int max_width = 0;	if(t->type == TChoice)	    fprintf(headerfile, "CHOICE {\n");	else if(t->type == TSet)	    fprintf(headerfile, "SET {\n");	else	    fprintf(headerfile, "SEQUENCE {\n");	ASN1_TAILQ_FOREACH(m, t->members, members) {	    if(strlen(m->name) > max_width)		max_width = strlen(m->name);	}	max_width += 3;	if(max_width < 16) max_width = 16;	ASN1_TAILQ_FOREACH(m, t->members, members) {	    int width = max_width;	    space(level + 1);	    if (m->ellipsis) {		fprintf (headerfile, "...");	    } else {		width -= fprintf(headerfile, "%s", m->name);		fprintf(headerfile, "%*s", width, "");		define_asn1(level + 1, m->type);		if(m->optional)		    fprintf(headerfile, " OPTIONAL");	    }	    if(last_member_p(m))		fprintf (headerfile, ",");	    fprintf (headerfile, "\n");	}	space(level);	fprintf (headerfile, "}");	break;    }    case TSequenceOf:	fprintf (headerfile, "SEQUENCE OF ");	define_asn1 (0, t->subtype);	break;    case TSetOf:	fprintf (headerfile, "SET OF ");	define_asn1 (0, t->subtype);	break;    case TGeneralizedTime:	fprintf (headerfile, "GeneralizedTime");	break;    case TGeneralString:	fprintf (headerfile, "GeneralString");	break;    case TTag: {	const char *classnames[] = { "UNIVERSAL ", "APPLICATION ", 				     "" /* CONTEXT */, "PRIVATE " };	if(t->tag.tagclass != ASN1_C_UNIV)	    fprintf (headerfile, "[%s%d] ", 		     classnames[t->tag.tagclass],		     t->tag.tagvalue);	if(t->tag.tagenv == TE_IMPLICIT)	    fprintf (headerfile, "IMPLICIT ");	define_asn1 (level, t->subtype);	break;    }    case TUTCTime:	fprintf (headerfile, "UTCTime");	break;    case TUTF8String:	space(level);	fprintf (headerfile, "UTF8String");	break;    case TPrintableString:	space(level);	fprintf (headerfile, "PrintableString");	break;    case TIA5String:	space(level);	fprintf (headerfile, "IA5String");	break;    case TBMPString:	space(level);	fprintf (headerfile, "BMPString");	break;    case TUniversalString:	space(level);	fprintf (headerfile, "UniversalString");	break;    case TVisibleString:	space(level);	fprintf (headerfile, "VisibleString");	break;    case TOID :	space(level);	fprintf(headerfile, "OBJECT IDENTIFIER");	break;    case TNull:	space(level);	fprintf (headerfile, "NULL");	break;    default:	abort ();    }}static voiddefine_type (int level, const char *name, Type *t, int typedefp, int preservep){    switch (t->type) {    case TType:	space(level);	fprintf (headerfile, "%s %s;\n", t->symbol->gen_name, name);	break;    case TInteger:	space(level);	if(t->members) {            Member *m;            fprintf (headerfile, "enum %s {\n", typedefp ? name : "");	    ASN1_TAILQ_FOREACH(m, t->members, members) {                space (level + 1);                fprintf(headerfile, "%s = %d%s\n", m->gen_name, m->val,                         last_member_p(m));            }            fprintf (headerfile, "} %s;\n", name);	} else if (t->range == NULL) {	    fprintf (headerfile, "heim_integer %s;\n", name);	} else if (t->range->min == INT_MIN && t->range->max == INT_MAX) {	    fprintf (headerfile, "int %s;\n", name);	} else if (t->range->min == 0 && t->range->max == UINT_MAX) {	    fprintf (headerfile, "unsigned int %s;\n", name);	} else if (t->range->min == 0 && t->range->max == INT_MAX) {	    fprintf (headerfile, "unsigned int %s;\n", name);	} else	    errx(1, "%s: unsupported range %d -> %d", 		 name, t->range->min, t->range->max);	break;    case TBoolean:	space(level);	fprintf (headerfile, "int %s;\n", name);	break;    case TOctetString:	space(level);	fprintf (headerfile, "heim_octet_string %s;\n", name);	break;    case TBitString: {	Member *m;	Type i;	struct range range = { 0, INT_MAX };	i.type = TInteger;	i.range = &range;	i.members = NULL;	i.constraint = NULL;	space(level);	if(ASN1_TAILQ_EMPTY(t->members)) 	    fprintf (headerfile, "heim_bit_string %s;\n", name);	else {	    fprintf (headerfile, "struct %s {\n", typedefp ? name : "");	    ASN1_TAILQ_FOREACH(m, t->members, members) {		char *n;				asprintf (&n, "%s:1", m->gen_name);		if (n == NULL)		    errx(1, "malloc");		define_type (level + 1, n, &i, FALSE, FALSE);		free (n);	    }	    space(level);	    fprintf (headerfile, "} %s;\n\n", name);	}	break;    }    case TEnumerated: {	Member *m;	space(level);	fprintf (headerfile, "enum %s {\n", typedefp ? name : "");	ASN1_TAILQ_FOREACH(m, t->members, members) {	    space(level + 1);	    if (m->ellipsis)		fprintf (headerfile, "/* ... */\n");	    else		fprintf (headerfile, "%s = %d%s\n", m->gen_name, m->val,			 last_member_p(m));	}	space(level);	fprintf (headerfile, "} %s;\n\n", name);	break;    }    case TSet:    case TSequence: {	Member *m;	space(level);	fprintf (headerfile, "struct %s {\n", typedefp ? name : "");	if (t->type == TSequence && preservep) {	    space(level + 1);	    fprintf(headerfile, "heim_octet_string _save;\n");	}	ASN1_TAILQ_FOREACH(m, t->members, members) {	    if (m->ellipsis) {		;	    } else if (m->optional) {		char *n;		asprintf (&n, "*%s", m->gen_name);		if (n == NULL)		    errx(1, "malloc");		define_type (level + 1, n, m->type, FALSE, FALSE);		free (n);	    } else		define_type (level + 1, m->gen_name, m->type, FALSE, FALSE);	}	space(level);	fprintf (headerfile, "} %s;\n", name);	break;    }    case TSetOf:    case TSequenceOf: {	Type i;	struct range range = { 0, INT_MAX };	i.type = TInteger;	i.range = &range;	i.members = NULL;	i.constraint = NULL;	space(level);	fprintf (headerfile, "struct %s {\n", typedefp ? name : "");	define_type (level + 1, "len", &i, FALSE, FALSE);	define_type (level + 1, "*val", t->subtype, FALSE, FALSE);	space(level);	fprintf (headerfile, "} %s;\n", name);	break;    }    case TGeneralizedTime:	space(level);	fprintf (headerfile, "time_t %s;\n", name);	break;    case TGeneralString:	space(level);	fprintf (headerfile, "heim_general_string %s;\n", name);	break;    case TTag:	define_type (level, name, t->subtype, typedefp, preservep);	break;    case TChoice: {	int first = 1;	Member *m;	space(level);	fprintf (headerfile, "struct %s {\n", typedefp ? name : "");	if (preservep) {	    space(level + 1);	    fprintf(headerfile, "heim_octet_string _save;\n");	}	space(level + 1);	fprintf (headerfile, "enum {\n");	m = have_ellipsis(t);	if (m) {	    space(level + 2);	    fprintf (headerfile, "%s = 0,\n", m->label); 	    first = 0;	}	ASN1_TAILQ_FOREACH(m, t->members, members) {	    space(level + 2);	    if (m->ellipsis)		fprintf (headerfile, "/* ... */\n");	    else		fprintf (headerfile, "%s%s%s\n", m->label, 			 first ? " = 1" : "", 			 last_member_p(m));	    first = 0;	}	space(level + 1);	fprintf (headerfile, "} element;\n");	space(level + 1);	fprintf (headerfile, "union {\n");	ASN1_TAILQ_FOREACH(m, t->members, members) {	    if (m->ellipsis) {		space(level + 2);		fprintf(headerfile, "heim_octet_string asn1_ellipsis;\n");	    } else if (m->optional) {		char *n;		asprintf (&n, "*%s", m->gen_name);		if (n == NULL)		    errx(1, "malloc");		define_type (level + 2, n, m->type, FALSE, FALSE);		free (n);	    } else		define_type (level + 2, m->gen_name, m->type, FALSE, FALSE);	}	space(level + 1);	fprintf (headerfile, "} u;\n");	space(level);	fprintf (headerfile, "} %s;\n", name);	break;    }    case TUTCTime:	space(level);	fprintf (headerfile, "time_t %s;\n", name);	break;    case TUTF8String:	space(level);	fprintf (headerfile, "heim_utf8_string %s;\n", name);	break;    case TPrintableString:	space(level);	fprintf (headerfile, "heim_printable_string %s;\n", name);	break;    case TIA5String:	space(level);	fprintf (headerfile, "heim_ia5_string %s;\n", name);	break;    case TBMPString:	space(level);	fprintf (headerfile, "heim_bmp_string %s;\n", name);	break;    case TUniversalString:	space(level);	fprintf (headerfile, "heim_universal_string %s;\n", name);	break;    case TVisibleString:	space(level);	fprintf (headerfile, "heim_visible_string %s;\n", name);	break;    case TOID :	space(level);	fprintf (headerfile, "heim_oid %s;\n", name);	break;    case TNull:	space(level);	fprintf (headerfile, "int %s;\n", name);	break;    default:	abort ();    }}static voidgenerate_type_header (const Symbol *s){    int preservep = preserve_type(s->name) ? TRUE : FALSE;    fprintf (headerfile, "/*\n");    fprintf (headerfile, "%s ::= ", s->name);    define_asn1 (0, s->type);    fprintf (headerfile, "\n*/\n\n");    fprintf (headerfile, "typedef ");    define_type (0, s->gen_name, s->type, TRUE, preservep);    fprintf (headerfile, "\n");}voidgenerate_type (const Symbol *s){    generate_header_of_codefile(s->gen_name);    generate_type_header (s);    generate_type_encode (s);    generate_type_decode (s);    generate_type_free (s);    generate_type_length (s);    generate_type_copy (s);    generate_type_seq (s);    generate_glue (s->type, s->gen_name);    fprintf(headerfile, "\n\n");    close_codefile();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -