📄 genrccmp.c
字号:
fprintf(itemFiles[METHODI],",\n");
MethodToCode(theEnv,itemFiles[METHODI],imageID,theMethod,
itemArrayVersions[RESTRICTIONI],itemArrayCounts[RESTRICTIONI]);
if (theMethod->restrictionCount > 0)
{
/* ========================================
Make sure that all restrictions for a
particular method go into the same array
======================================== */
itemFiles[RESTRICTIONI] =
OpenFileIfNeeded(theEnv,itemFiles[RESTRICTIONI],fileName,fileID,
imageID,&fileCount,
itemArrayVersions[RESTRICTIONI],headerFP,
"RESTRICTION",RestrictionPrefix(),
itemReopenFlags[RESTRICTIONI],&itemCodeFiles[RESTRICTIONI]);
if (itemFiles[RESTRICTIONI] == NULL)
goto GenericCodeError;
for (j = 0 ; j < (unsigned) theMethod->restrictionCount ; j++)
{
theRestriction = &theMethod->restrictions[j];
if (j > 0)
fprintf(itemFiles[RESTRICTIONI],",\n");
RestrictionToCode(theEnv,itemFiles[RESTRICTIONI],imageID,theRestriction,
itemArrayVersions[TYPEI],itemArrayCounts[TYPEI]);
if (theRestriction->tcnt > 0)
{
/* =========================================
Make sure that all types for a particular
restriction go into the same array
========================================= */
itemFiles[TYPEI] =
OpenFileIfNeeded(theEnv,itemFiles[TYPEI],fileName,fileID,
imageID,&fileCount,
itemArrayVersions[TYPEI],headerFP,
"void *",TypePrefix(),
itemReopenFlags[TYPEI],&itemCodeFiles[TYPEI]);
if (itemFiles[TYPEI] == NULL)
goto GenericCodeError;
for (k = 0 ; k < theRestriction->tcnt ; k++)
{
if (k > 0)
fprintf(itemFiles[TYPEI],",\n");
TypeToCode(theEnv,itemFiles[TYPEI],imageID,
theRestriction->types[k],maxIndices);
}
itemArrayCounts[TYPEI] += (int) theRestriction->tcnt;
itemFiles[TYPEI] =
CloseFileIfNeeded(theEnv,itemFiles[TYPEI],&itemArrayCounts[TYPEI],
&itemArrayVersions[TYPEI],maxIndices,
&itemReopenFlags[TYPEI],&itemCodeFiles[TYPEI]);
}
}
itemArrayCounts[RESTRICTIONI] += theMethod->restrictionCount;
itemFiles[RESTRICTIONI] =
CloseFileIfNeeded(theEnv,itemFiles[RESTRICTIONI],&itemArrayCounts[RESTRICTIONI],
&itemArrayVersions[RESTRICTIONI],maxIndices,
&itemReopenFlags[RESTRICTIONI],&itemCodeFiles[RESTRICTIONI]);
}
}
itemArrayCounts[METHODI] += (int) theDefgeneric->mcnt;
itemFiles[METHODI] =
CloseFileIfNeeded(theEnv,itemFiles[METHODI],&itemArrayCounts[METHODI],
&itemArrayVersions[METHODI],maxIndices,
&itemReopenFlags[METHODI],&itemCodeFiles[METHODI]);
}
theDefgeneric = (DEFGENERIC *) EnvGetNextDefgeneric(theEnv,theDefgeneric);
}
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule);
moduleCount++;
itemArrayCounts[MODULEI]++;
}
CloseDefgenericFiles(theEnv,itemFiles,itemReopenFlags,itemCodeFiles,maxIndices);
return(1);
GenericCodeError:
CloseDefgenericFiles(theEnv,itemFiles,itemReopenFlags,itemCodeFiles,maxIndices);
return(0);
}
/******************************************************
NAME : CloseDefgenericFiles
DESCRIPTION : Closes construct compiler files
for defgeneric structures
INPUTS : 1) An array containing all the
pertinent file pointers
2) An array containing all the
pertinent file reopen flags
3) An array containing all the
pertinent file name/id/version info
4) The maximum number of indices
allowed in an array
RETURNS : Nothing useful
SIDE EFFECTS : Files closed
NOTES : None
*****************************************************/
static void CloseDefgenericFiles(
void *theEnv,
FILE *itemFiles[SAVE_ITEMS],
int itemReopenFlags[SAVE_ITEMS],
struct CodeGeneratorFile itemCodeFiles[SAVE_ITEMS],
int maxIndices)
{
int count = maxIndices;
int arrayVersion = 0;
register int i;
for (i = 0 ; i < SAVE_ITEMS ; i++)
{
count = maxIndices;
itemFiles[i] = CloseFileIfNeeded(theEnv,itemFiles[i],&count,&arrayVersion,
maxIndices,&itemReopenFlags[i],
&itemCodeFiles[i]);
}
}
/***************************************************
NAME : DefgenericModuleToCode
DESCRIPTION : Writes out the C values for a
defgeneric module item
INPUTS : 1) The output file
2) The module for the defgenerics
3) The compile image id
4) The maximum number of elements
in an array
RETURNS : Nothing useful
SIDE EFFECTS : Defgeneric module item written
NOTES : None
***************************************************/
static void DefgenericModuleToCode(
void *theEnv,
FILE *theFile,
struct defmodule *theModule,
int imageID,
int maxIndices)
{
fprintf(theFile,"{");
ConstructModuleToCode(theEnv,theFile,theModule,imageID,maxIndices,
DefgenericData(theEnv)->DefgenericModuleIndex,ConstructPrefix(DefgenericData(theEnv)->DefgenericCodeItem));
fprintf(theFile,"}");
}
/****************************************************************
NAME : SingleDefgenericToCode
DESCRIPTION : Writes out a single defgeneric's
data to the file
INPUTS : 1) The output file
2) The compile image id
3) The maximum number of
elements in an array
4) The defgeneric
5) The module index
6) The partition holding the
generic methods
7) The relative index of the
generics methods in the partition
RETURNS : Nothing useful
SIDE EFFECTS : Defgeneric data written
NOTES : None
***************************************************************/
static void SingleDefgenericToCode(
void *theEnv,
FILE *theFile,
int imageID,
int maxIndices,
DEFGENERIC *theDefgeneric,
int moduleCount,
int methodArrayVersion,
int methodArrayCount)
{
/* ==================
Defgeneric Header
================== */
fprintf(theFile,"{");
ConstructHeaderToCode(theEnv,theFile,&theDefgeneric->header,imageID,maxIndices,moduleCount,
ModulePrefix(DefgenericData(theEnv)->DefgenericCodeItem),
ConstructPrefix(DefgenericData(theEnv)->DefgenericCodeItem));
/* =========================
Defgeneric specific data
========================= */
fprintf(theFile,",0,0,");
if (theDefgeneric->methods == NULL)
fprintf(theFile,"NULL");
else
{
fprintf(theFile,"&%s%d_%d[%d]",MethodPrefix(),imageID,
methodArrayVersion,methodArrayCount);
}
fprintf(theFile,",%u,0}",theDefgeneric->mcnt);
}
/****************************************************************
NAME : MethodToCode
DESCRIPTION : Writes out a single method's
data to the file
INPUTS : 1) The output file
2) The compile image id
3) The method
4) The partition holding the
method restrictions
5) The relative index of the
method restrictions in the partition
RETURNS : Nothing useful
SIDE EFFECTS : Method data written
NOTES : None
***************************************************************/
static void MethodToCode(
void *theEnv,
FILE *theFile,
int imageID,
DEFMETHOD *theMethod,
int restrictionArrayVersion,
int restrictionArrayCount)
{
fprintf(theFile,"{%u,0,%d,%d,%d,%d,%u,0,",
theMethod->index,theMethod->restrictionCount,
theMethod->minRestrictions,theMethod->maxRestrictions,
theMethod->localVarCount,theMethod->system);
if (theMethod->restrictions == NULL)
fprintf(theFile,"NULL,");
else
fprintf(theFile,"&%s%d_%d[%d],",RestrictionPrefix(),imageID,
restrictionArrayVersion,restrictionArrayCount);
ExpressionToCode(theEnv,theFile,theMethod->actions);
fprintf(theFile,",NULL}");
}
/****************************************************************
NAME : RestrictionToCode
DESCRIPTION : Writes out a single restriction's
data to the file
INPUTS : 1) The output file
2) The compile image id
3) The restriction
4) The partition holding the
restriction types
5) The relative index of the
restriction types in the partition
RETURNS : Nothing useful
SIDE EFFECTS : Restriction data written
NOTES : None
***************************************************************/
static void RestrictionToCode(
void *theEnv,
FILE *theFile,
int imageID,
RESTRICTION *theRestriction,
int typeArrayVersion,
int typeArrayCount)
{
fprintf(theFile,"{");
if (theRestriction->types == NULL)
fprintf(theFile,"NULL,");
else
fprintf(theFile,"&%s%d_%d[%d],",TypePrefix(),imageID,
typeArrayVersion,typeArrayCount);
ExpressionToCode(theEnv,theFile,theRestriction->query);
fprintf(theFile,",%u}",theRestriction->tcnt);
}
/****************************************************************
NAME : TypeToCode
DESCRIPTION : Writes out a single type's
data to the file
INPUTS : 1) The output file
2) The compile image id
3) The type
RETURNS : Nothing useful
SIDE EFFECTS : Type data written
NOTES : None
***************************************************************/
static void TypeToCode(
void *theEnv,
FILE *theFile,
int imageID,
void *theType,
int maxIndices)
{
#if OBJECT_SYSTEM
fprintf(theFile,"VS ");
PrintClassReference(theEnv,theFile,(DEFCLASS *) theType,imageID,maxIndices);
#else
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(imageID)
#pragma unused(maxIndices)
#endif
PrintIntegerReference(theEnv,theFile,(INTEGER_HN *) theType);
#endif
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -