00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "setup.h"
00027
00028 #if DEFINSTANCES_CONSTRUCT && CONSTRUCT_COMPILER && (! RUN_TIME)
00029
00030 #include "conscomp.h"
00031 #include "envrnmnt.h"
00032 #include "defins.h"
00033
00034 #define _DFINSCMP_SOURCE_
00035 #include "dfinscmp.h"
00036
00037
00038
00039
00040
00041
00042
00043 static void ReadyDefinstancesForCode(void *);
00044 static int DefinstancesToCode(void *,char *,char *,char *,int,FILE *,int,int);
00045 static void CloseDefinstancesFiles(void *,FILE *,FILE *,int);
00046 static void DefinstancesModuleToCode(void *,FILE *,struct defmodule *,int,int);
00047 static void SingleDefinstancesToCode(void *,FILE *,DEFINSTANCES *,int,int,int);
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 globle void SetupDefinstancesCompiler(
00065 void *theEnv)
00066 {
00067 DefinstancesData(theEnv)->DefinstancesCodeItem = AddCodeGeneratorItem(theEnv,"definstances",0,ReadyDefinstancesForCode,
00068 NULL,DefinstancesToCode,2);
00069 }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 globle void DefinstancesCModuleReference(
00086 void *theEnv,
00087 FILE *theFile,
00088 int count,
00089 int imageID,
00090 int maxIndices)
00091 {
00092 fprintf(theFile,"MIHS &%s%d_%d[%d]",
00093 ModulePrefix(DefinstancesData(theEnv)->DefinstancesCodeItem),
00094 imageID,
00095 (count / maxIndices) + 1,
00096 (count % maxIndices));
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 static void ReadyDefinstancesForCode(
00115 void *theEnv)
00116 {
00117 MarkConstructBsaveIDs(theEnv,DefinstancesData(theEnv)->DefinstancesModuleIndex);
00118 }
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 static int DefinstancesToCode(
00136 void *theEnv,
00137 char *fileName,
00138 char *pathName,
00139 char *fileNameBuffer,
00140 int fileID,
00141 FILE *headerFP,
00142 int imageID,
00143 int maxIndices)
00144 {
00145 int fileCount = 1;
00146 struct defmodule *theModule;
00147 DEFINSTANCES *theDefinstances;
00148 int moduleCount = 0, moduleArrayCount = 0, moduleArrayVersion = 1;
00149 int definstancesArrayCount = 0, definstancesArrayVersion = 1;
00150 FILE *moduleFile = NULL, *definstancesFile = NULL;
00151
00152
00153
00154
00155 fprintf(headerFP,"#include \"defins.h\"\n");
00156
00157
00158
00159
00160
00161 theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
00162
00163 while (theModule != NULL)
00164 {
00165 EnvSetCurrentModule(theEnv,(void *) theModule);
00166
00167 moduleFile = OpenFileIfNeeded(theEnv,moduleFile,fileName,pathName,fileNameBuffer,fileID,imageID,&fileCount,
00168 moduleArrayVersion,headerFP,
00169 "DEFINSTANCES_MODULE",ModulePrefix(DefinstancesData(theEnv)->DefinstancesCodeItem),
00170 FALSE,NULL);
00171
00172 if (moduleFile == NULL)
00173 {
00174 CloseDefinstancesFiles(theEnv,moduleFile,definstancesFile,maxIndices);
00175 return(0);
00176 }
00177
00178 DefinstancesModuleToCode(theEnv,moduleFile,theModule,imageID,maxIndices);
00179 moduleFile = CloseFileIfNeeded(theEnv,moduleFile,&moduleArrayCount,&moduleArrayVersion,
00180 maxIndices,NULL,NULL);
00181
00182 theDefinstances = (DEFINSTANCES *) EnvGetNextDefinstances(theEnv,NULL);
00183
00184 while (theDefinstances != NULL)
00185 {
00186 definstancesFile = OpenFileIfNeeded(theEnv,definstancesFile,fileName,pathName,fileNameBuffer,fileID,imageID,&fileCount,
00187 definstancesArrayVersion,headerFP,
00188 "DEFINSTANCES",ConstructPrefix(DefinstancesData(theEnv)->DefinstancesCodeItem),
00189 FALSE,NULL);
00190 if (definstancesFile == NULL)
00191 {
00192 CloseDefinstancesFiles(theEnv,moduleFile,definstancesFile,maxIndices);
00193 return(0);
00194 }
00195
00196 SingleDefinstancesToCode(theEnv,definstancesFile,theDefinstances,imageID,
00197 maxIndices,moduleCount);
00198 definstancesArrayCount++;
00199 definstancesFile = CloseFileIfNeeded(theEnv,definstancesFile,&definstancesArrayCount,
00200 &definstancesArrayVersion,maxIndices,NULL,NULL);
00201
00202 theDefinstances = (DEFINSTANCES *) EnvGetNextDefinstances(theEnv,theDefinstances);
00203 }
00204
00205 theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule);
00206 moduleCount++;
00207 moduleArrayCount++;
00208 }
00209
00210 CloseDefinstancesFiles(theEnv,moduleFile,definstancesFile,maxIndices);
00211
00212 return(1);
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 static void CloseDefinstancesFiles(
00228 void *theEnv,
00229 FILE *moduleFile,
00230 FILE *definstancesFile,
00231 int maxIndices)
00232 {
00233 int count = maxIndices;
00234 int arrayVersion = 0;
00235
00236 if (definstancesFile != NULL)
00237 {
00238 count = maxIndices;
00239 CloseFileIfNeeded(theEnv,definstancesFile,&count,&arrayVersion,
00240 maxIndices,NULL,NULL);
00241 }
00242
00243 if (moduleFile != NULL)
00244 {
00245 count = maxIndices;
00246 CloseFileIfNeeded(theEnv,moduleFile,&count,&arrayVersion,maxIndices,NULL,NULL);
00247 }
00248 }
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 static void DefinstancesModuleToCode(
00264 void *theEnv,
00265 FILE *theFile,
00266 struct defmodule *theModule,
00267 int imageID,
00268 int maxIndices)
00269 {
00270 fprintf(theFile,"{");
00271 ConstructModuleToCode(theEnv,theFile,theModule,imageID,maxIndices,
00272 DefinstancesData(theEnv)->DefinstancesModuleIndex,ConstructPrefix(DefinstancesData(theEnv)->DefinstancesCodeItem));
00273 fprintf(theFile,"}");
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 static void SingleDefinstancesToCode(
00291 void *theEnv,
00292 FILE *theFile,
00293 DEFINSTANCES *theDefinstances,
00294 int imageID,
00295 int maxIndices,
00296 int moduleCount)
00297 {
00298
00299
00300
00301
00302 fprintf(theFile,"{");
00303 ConstructHeaderToCode(theEnv,theFile,&theDefinstances->header,imageID,maxIndices,moduleCount,
00304 ModulePrefix(DefinstancesData(theEnv)->DefinstancesCodeItem),
00305 ConstructPrefix(DefinstancesData(theEnv)->DefinstancesCodeItem));
00306
00307
00308
00309
00310 fprintf(theFile,",0,");
00311 ExpressionToCode(theEnv,theFile,theDefinstances->mkinstance);
00312 fprintf(theFile,"}");
00313 }
00314
00315 #endif