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

📄 cxxconstraints.c

📁 asn to c编译器 源代码
💻 C
字号:
/* JKG -- 7/31/03 --  *//*  ../SNACC/compiler/back-ends/c++-gen/cxxconstraints.c  *//*  This file contains implementations of functions for   *//*  checking constraints and converting .asn1             */   /*  primitives (with constraints) into valid C++ code     *//*  Their respective prototypes are in:                   *//*       'cxxconstraints.h' in the pwd                    */#include "cxxconstraints.h"#include <string.h>/* Prints the default instantiation for a typedefined object */void PrintTypeDefDefault PARAMS((hdr, src, td), FILE* hdr _AND_ FILE* src _AND_ TypeDef* td){  src=src;  fprintf (hdr, "typedef %s %s;\n\n", td->type->cxxTypeRefInfo->className, td->cxxTypeDefInfo->className);}void PrintCxxSetOfSizeConstraint(FILE* hdr, SubtypeValue* sizeConstraint,								 Module* m, Type* type){	long lBound = 0;	long uBound = 0;	int ubExists = 0;	Value* pValue;	switch (sizeConstraint->choiceId)	{	case SUBTYPEVALUE_SINGLEVALUE:		pValue = GetValue(sizeConstraint->a.singleValue);		if (pValue->basicValue->choiceId == BASICTYPE_INTEGER)			lBound = pValue->basicValue->a.integer;		else		{			PrintErrLoc(m->asn1SrcFileName, (long)type->lineNo);			fprintf(errFileG, "ERROR - unsupported value in size constraint\n");			return;		}		break;	case SUBTYPEVALUE_VALUERANGE:		// Get the lower end value		pValue = GetValue(sizeConstraint->a.valueRange->lowerEndValue->endValue);		if (pValue->basicValue->choiceId == BASICTYPE_INTEGER)		{			lBound = pValue->basicValue->a.integer;			if (!sizeConstraint->a.valueRange->lowerEndValue->valueInclusive)				++lBound;		}		else		{			PrintErrLoc(m->asn1SrcFileName, (long)type->lineNo);			fprintf(errFileG, "ERROR - unsupported value in size constraint\n");			return;		}		// Get the upper end value		pValue = GetValue(sizeConstraint->a.valueRange->upperEndValue->endValue);		if (pValue->basicValue->choiceId == BASICTYPE_INTEGER)		{			uBound = pValue->basicValue->a.integer;			if (!sizeConstraint->a.valueRange->upperEndValue->valueInclusive)				--uBound;			ubExists = 1;		}		else if ((pValue->basicValue->choiceId == BASICVALUE_SPECIALINTEGER) &&			(pValue->basicValue->a.specialInteger == MAX_INT))		{			uBound = 0;			ubExists = 2;		}		else		{			PrintErrLoc(m->asn1SrcFileName, (long)type->lineNo);			fprintf(errFileG, "ERROR - unsupported value in size constraint\n");			return;		}		break;	default:		PrintErrLoc(m->asn1SrcFileName, (long)type->lineNo);		fprintf(errFileG, "ERROR - unsupported size constraint\n");		return;	}	// Check that the size constraint is valid	if ((lBound < 0) || ((ubExists == 1) && (lBound > uBound)))	{		PrintErrLoc(m->asn1SrcFileName, (long)type->lineNo);		fprintf(errFileG, "ERROR - invalid size constraint\n");		return;	}	// Print the size constraints	fprintf(hdr, "\tSizeConstraint* SizeConstraints() const {\n");	fprintf(hdr, "\t\tstatic SizeConstraint s = { %ld, %ld, %d }; return &s; }\n",		lBound, uBound, ubExists);}/* Function generates the checkconstraints function for *//*    a setOf or seqOf with size constraints set        */void PrintCxxSetOfSizeValRangeConstraints PARAMS((hdr, src, td), FILE* hdr _AND_ FILE* src _AND_ TypeDef* td){    Subtype* s_type;    long lboundLower = 0;    long lboundUpper = 0;    int ubExists = 2;    hdr=hdr;    src=src;    td=td;    s_type = (Subtype*)td->type->subtypes->a.single->a.sizeConstraint->a.or->last->data;    if(s_type->a.single->a.valueRange->lowerEndValue->endValue->basicValue->choiceId == BASICTYPE_INTEGER)    {        if(s_type->a.single->a.valueRange->lowerEndValue->valueInclusive)        {                    lboundLower = s_type->a.single->a.valueRange->lowerEndValue->endValue->basicValue->a.integer;        }        else        {            lboundLower = s_type->a.single->a.valueRange->lowerEndValue->endValue->basicValue->a.integer+1;        }        if(s_type->a.single->a.valueRange->upperEndValue->endValue->basicValue->choiceId == BASICTYPE_INTEGER)        {            if(s_type->a.single->a.valueRange->upperEndValue->valueInclusive)            {	            lboundUpper = s_type->a.single->a.valueRange->upperEndValue->endValue->basicValue->a.integer;	                ubExists = 1;            }            else            {	            lboundUpper = s_type->a.single->a.valueRange->upperEndValue->endValue->basicValue->a.integer-1;                ubExists = 1;            }        }    }    if(lboundUpper > 65536)    {        ubExists = 2;    }    if(ubExists == 2)    {        lboundUpper = 0;    }   if(lboundLower >= 0 && ((lboundUpper >= 0 && (lboundUpper >= lboundLower)) || ubExists == 2))    {        fprintf (hdr, "     SizeConstraint* SizeConstraints()const{\n");        fprintf (hdr, "         static SizeConstraint s = {%ld, %ld, %d}; SizeConstraint * ps = &s; return ps;}\n", lboundLower, lboundUpper, ubExists);        //fprintf (hdr, "     SizeConstraint* SizeConstraints(){\n");        //fprintf (hdr, "         static SizeConstraint s = {%d, %d, %d}; SizeConstraint * ps = &s; return ps;}\n", lboundLower, lboundUpper, ubExists);        /*        fprintf (hdr, "     AsnLen PEnc(AsnBufBits &b)const;\n");        fprintf (src, "AsnLen %s::PEnc(AsnBufBits &b)const\n", td->definedName);        fprintf (src, "{\n");        fprintf (src, "         AsnLen len = 0;\n");        fprintf (src, "         return len;\n}\n");         fprintf (hdr, "     void PDec(AsnBufBits &b, AsnLen &bitsDecoded);\n");        fprintf (src, "void %s::PDec(AsnBufBits &b, AsnLen &bitsDecoded)\n", td->definedName);        fprintf (src, "{\n");        fprintf (src, "}\n");*/        /*        fprintf(hdr, "   virtual int checkConstraints(ConstraintFailList* pConstraintFails)const;\n");        fprintf(src, "int %s::checkConstraints(ConstraintFailList* pConstraintFails)const\n{\n", td->cxxTypeDefInfo->className);    			            fprintf (src, "  std::string * pTmpError;\n");        if(ubExists == 1)        {            fprintf (src, "  char* ptr = checkSOfValRange(%d, %d);\n\n", lboundLower, lboundUpper);        }        else        {            fprintf (src, "  char* ptr = checkSOfValRange(%d, 65535/\*TBD-fix check to check for unconstrainted UB*//*);\n\n", lboundLower);*//*        }        fprintf (src, "  if(ptr)\n   {\n");        fprintf (src, "     if(pConstraintFails!=NULL)\n     {\n");        fprintf (src, "       pTmpError=pConstraintFails->Append();\n");        fprintf (src, "       *pTmpError += ptr;\n");        fprintf (src, "       *pTmpError += \"In function call:  %s::checkConstraints(...)\\n\";\n", td->cxxTypeDefInfo->className);        fprintf (src, "     }\n");        fprintf (src, "   }\n   else\n   {\n");            fprintf (src, "     return checkListConstraints(pConstraintFails);\n");        fprintf (src, "   }\n\n");        fprintf (src, "   return checkListConstraints(pConstraintFails);\n");        fprintf(src, "\n}\n");    }    else    {              fprintf(hdr, "      int checkConstraints(ConstraintFailList* pConstraintFails)const;\n");        fprintf(src, "int %s::checkConstraints(ConstraintFailList* pConstraintFails)const\n{\n", td->cxxTypeDefInfo->className);        fprintf(src, "   return checkListConstraints(pConstraintFails);\n");            fprintf(src, "}\n\n");        */    }   }void PrintCxxSetOfSizeSingleValConstraints PARAMS((hdr, src, td), FILE* hdr _AND_ FILE* src _AND_ TypeDef* td){    Subtype* s_type;    long lbound = 0;    hdr=hdr;    src=src;    td=td;    s_type = (Subtype*)td->type->subtypes->a.single->a.sizeConstraint->a.or->last->data;    if(s_type->a.single->a.singleValue->basicValue->choiceId == BASICTYPE_INTEGER)    {        lbound = s_type->a.single->a.singleValue->basicValue->a.integer;    }    if(lbound >= 0)    {        fprintf (hdr, "     SizeConstraint* SizeConstraints()const{\n");        fprintf (hdr, "         SizeConstraint s = {%ld, 0, 0}; SizeConstraint * ps = &s; return ps;}\n", lbound);        fprintf (hdr, "     SizeConstraint* SizeConstraints(){\n");        fprintf (hdr, "         SizeConstraint s = {%ld, 0, 0}; SizeConstraint * ps = &s; return ps;}\n", lbound);      /*        fprintf (hdr, "     AsnLen PEnc(AsnBufBits &b)const;\n");        fprintf (src, "AsnLen %s::PEnc(AsnBufBits &b)const\n", td->definedName);        fprintf (src, "{\n");        fprintf (src, "     FUNC(\"%s::PEnc\");\n", td->definedName);        fprintf (src, "     AsnLen len = 0;\n");        fprintf (src, "     typename AsnList<T>::ListElmt *currElmt;\n");        fprintf (src, "     long lbound = %d;\n\n", lbound);        fprintf (src, "     if(Count() == lbound)\n");        fprintf (src, "     {\n");        fprintf (src, "         for (currElmt = first; currElmt != NULL; currElmt = currElmt->next)\n");        fprintf (src, "             len += currElmt->elmt->PEnc (b);\n");        fprintf (src, "     }\n");        fprintf (src, "     else\n");        fprintf (src, "     {\n");        fprintf (src, "         throw (\"%s count does not match singlevalue constraint bound\");\n", td->definedName);        fprintf (src, "     }\n");        fprintf (src, "     return len;\n}\n");         fprintf (hdr, "     void PDec(AsnBufBits &b, AsnLen &bitsDecoded);\n");        fprintf (src, "void %s::PDec(AsnBufBits &b, AsnLen &bitsDecoded)\n", td->definedName);        fprintf (src, "{\n");        fprintf (src, "     T *listElmt;\n");        fprintf (src, "     long lbound = %d;\n", lbound);        fprintf (src, "     while(lbound)\n");        fprintf (src, "     {\n");        fprintf (src, "         listElmt = Append();\n");        fprintf (src, "         listElmt->PDec(b, bitsDecoded);\n");        fprintf (src, "         lbound--;\n");        fprintf (src, "     }\n");        fprintf (src, "}\n");*/        /*        fprintf(hdr, "   virtual int checkConstraints(ConstraintFailList* pConstraintFails)const;\n");        fprintf(src, "int %s::checkConstraints(ConstraintFailList*pConstraintFails)const\n{\n", td->cxxTypeDefInfo->className);    				        fprintf (src, "  std::string * pTmpError;\n");        fprintf (src, "  char* ptr = checkSOfSingleVal(%d);\n\n", lbound);        fprintf (src, "  if(ptr)\n   {\n");        fprintf (src, "     if(pConstraintFails!=NULL)\n     {\n");        fprintf (src, "       pTmpError=pConstraintFails->Append();\n");        fprintf (src, "       *pTmpError += ptr;\n");        fprintf (src, "       *pTmpError += \"In function call:  %s::checkConstraints(...)\\n\";\n", td->cxxTypeDefInfo->className);        fprintf (src, "     }\n");        fprintf (src, "   }\n   else\n   {\n");                fprintf (src, "     return checkListConstraints(pConstraintFails);\n");        fprintf (src, "   }\n\n");        fprintf (src, "   return checkListConstraints(pConstraintFails);\n");        fprintf(src, "\n}\n");        */    }    else    {        /*        fprintf(hdr, "      int checkConstraints(ConstraintFailList* pConstraintFails)const;\n");        fprintf(src, "int %s::checkConstraints(ConstraintFailList* pConstraintFails)const\n{\n", td->cxxTypeDefInfo->className);        fprintf(src, "   return checkListConstraints(pConstraintFails);\n");            fprintf(src, "}\n\n");        */    }}

⌨️ 快捷键说明

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