home *** CD-ROM | disk | FTP | other *** search
/ ftptest.leeds.ac.uk / 2015.02.ftptest.leeds.ac.uk.tar / ftptest.leeds.ac.uk / bionet / CAE-GROUP / SCL-WIN3x / FED_PLUS.EXE / CLASSESW.C < prev    next >
C/C++ Source or Header  |  1994-12-14  |  22KB  |  634 lines

  1. #include "classes.h"
  2. /*******************************************************************
  3. ** FedEx parser output module for generating C++  class definitions
  4. ** December  5, 1989
  5. ** release 2 17-Feb-1992
  6. ** release 3 March 1993
  7. ** release 4 December 1993
  8. ** K. C. Morris
  9. **
  10. ** Development of FedEx was funded by the United States Government,
  11. ** and is not subject to copyright.
  12.  
  13. *******************************************************************
  14. The conventions used in this binding follow the proposed specification
  15. for the STEP Standard Data Access Interface as defined in document
  16. N350 ( August 31, 1993 ) of ISO 10303 TC184/SC4/WG7.
  17. *******************************************************************/
  18.  
  19. /******************************************************************
  20. ***   The functions in this file drive the processing of an     **
  21. ***   EXPRESS file.                                             **
  22.  **                                **/
  23.  
  24.  
  25. void use_ref(Schema,Express,FILES *);
  26.  
  27. void
  28. create_builtin_type_decl(FILES *files,char *name)
  29. {
  30.     fprintf(files->incall,"extern TypeDescriptor *%s%s_TYPE;\n",
  31.         TD_PREFIX,name);
  32. /*    fprintf(files->initall,"TypeDescriptor *%s%s_TYPE;\n",*/
  33. /*        TD_PREFIX,name);*/
  34. }    
  35.  
  36. void
  37. create_builtin_type_defn(FILES *files,char *name)
  38. {
  39.     fprintf(files->initall,"\t%s%s_TYPE = new TypeDescriptor (",
  40.         TD_PREFIX,name);
  41.     fprintf(files->initall,"\"%s\", %s_TYPE, \"%s\");\n",
  42.          PrettyTmpName (name), StrToUpper (name), StrToLower (name));
  43. }    
  44.  
  45. /******************************************************************
  46.  ** Procedure:    print_file_header
  47.  ** Parameters:    const Schema schema    - top-level schema being printed
  48.  **        FILE*        file    - file on which to print header
  49.  ** Returns:  
  50.  ** Description:  handles file related tasks that need to be done once
  51.  **    at the beginning of processing.
  52.  **    In this case the files make_schema and schema.h are initiated
  53.  ** Side Effects:  prints opening line of make_schema file
  54.  ** Status:  ok 1/15/91
  55.  ******************************************************************/
  56.  
  57. /*ARGSUSED*/
  58. void
  59. print_file_header(Express express, FILES* files)
  60. {
  61.     /*  open file to record schema source files in to be used in makefile  */
  62.     if (((files -> make) = fopen ("make_schema", "w")) == NULL) {
  63.     printf ("**Error in print_file_header:  unable to open file make_schema ** \n");
  64.     return;
  65.     }
  66.     fprintf (files -> make, "OFILES =  schema.o ");
  67.  
  68.     
  69.     /*  open file which unifies all schema specific header files
  70.     of input Express source */
  71.     files -> incall = FILEcreate ("s_schema.h");
  72.  
  73.     /* prevent RCS from expanding this! */
  74.     fprintf (files ->incall, "/* %cId$ */\n",'$');
  75.     fprintf(files->incall,"#ifdef __O3DB__\n");
  76.     fprintf(files->incall,"#include <OpenOODB.h>\n");
  77.     fprintf(files->incall,"#endif\n\n");
  78.     fprintf(files->incall,"#include <sdai.h>\n\n");
  79.     fprintf(files->incall,"\n#include <Registry.h>\n");
  80.     fprintf(files->incall,"\n#include <aggregat.h>\n");
  81.     fprintf(files->incall,"\n#include <sentity.h>\n");
  82.     fprintf(files->incall,"\n#include <undefine.h>\n");
  83.     fprintf(files->incall, "extern void SchemaInit (Registry &);\n");
  84.  
  85.     files -> initall = FILEcreate ("s_schema.cpp");
  86.     fprintf (files ->initall, "/* %cId$  */ \n",'\044');
  87. /*    fprintf (files ->initall, "#include <schema.h>\n");*/
  88.     fprintf (files -> initall, "class Registry;\n");
  89.     
  90.     fprintf (files ->initall, "\nvoid \nSchemaInit (Registry & reg)\n{\n");
  91.  
  92.     /* create built-in types */
  93. /*  no need to generate
  94.     create_builtin_type_decl(files,"INTEGER");
  95.     create_builtin_type_decl(files,"REAL");
  96.     create_builtin_type_decl(files,"STRING");
  97.     create_builtin_type_decl(files,"BINARY");
  98.     create_builtin_type_decl(files,"BOOLEAN");
  99.     create_builtin_type_decl(files,"LOGICAL");
  100.     create_builtin_type_decl(files,"NUMBER");
  101.     create_builtin_type_decl(files,"GENERIC");
  102. */
  103.     /* create built-in types */
  104. /*  no need to generate
  105.     create_builtin_type_defn(files,"INTEGER");
  106.     create_builtin_type_defn(files,"REAL");
  107.     create_builtin_type_defn(files,"STRING");
  108.     create_builtin_type_defn(files,"BINARY");
  109.     create_builtin_type_defn(files,"BOOLEAN");
  110.     create_builtin_type_defn(files,"LOGICAL");
  111.     create_builtin_type_defn(files,"NUMBER");
  112.     create_builtin_type_defn(files,"GENERIC");
  113. */
  114.  
  115. }
  116.  
  117. /******************************************************************
  118.  ** Procedure:    print_file_trailer
  119.  ** Parameters:    const Schema schema    - top-level schema printed
  120.  **        FILE*        file    - file on which to print trailer
  121.  ** Returns:  
  122.  ** Description:  handles cleaning up things at end of processing
  123.  ** Side Effects:  closes make_schema file
  124.  ** Status:  ok 1/15/91
  125.  ******************************************************************/
  126.  
  127. /*ARGSUSED*/
  128. void
  129. print_file_trailer(Express express, FILES* files)
  130. {
  131.   fprintf (files->make, "\n");
  132.   fclose(files->make);
  133.   FILEclose(files->incall);
  134.  
  135.   fprintf(files->initall,"\n}\n");
  136.   FILEclose(files->initall);
  137. }
  138.  
  139. /******************************************************************
  140.  **  SCHEMA SECTION                         **/
  141.  
  142. /******************************************************************
  143.  ** Procedure:    SCOPEPrint
  144.  ** Parameters:    const Scope scope    - scope to print
  145.  **        FILE*       file    - file on which to print
  146.  ** Returns:  
  147.  ** Description:  cycles through the scopes of the input Express schema
  148.  ** Side Effects:  calls functions for processing entities and types
  149.  ** Status:  working 1/15/91
  150.  **    --  it's still not clear how include files should be organized
  151.  **    and what the relationship is between this organization and the
  152.  **    organization of the schemas in the input Express
  153.  ******************************************************************/
  154.  
  155. void
  156. SCOPEPrint(Scope scope, FILES* files,Schema schema,Express model)
  157. {    
  158.     
  159.     Linked_List list;
  160.     char nm[BUFSIZ];
  161.     void ENTITYprint_new(Entity entity,FILES *files, Schema schema);
  162.  
  163.     DictionaryEntry de;
  164.     
  165.      
  166.      
  167.     fprintf (files -> inc, "\n/*\t**************  TYPES  \t*/\n");
  168.     fprintf (files -> lib, "\n/*\t**************  TYPES  \t*/\n");
  169.     fprintf (files -> init, "\n/*\t**************  TYPES  \t*/\n");
  170.     
  171.     /* do \'new\'s for types descriptors  */
  172.     SCOPEdo_types(scope,t,de)
  173.       TYPEprint_new (t, files,schema);
  174.     SCOPEod;
  175.     
  176.     
  177.     /* do \'new\'s for entity descriptors  */
  178.     list = SCOPEget_entities_superclass_order (scope);
  179.     fprintf (files->init, "\n\t//\t*****  Describe the Entities\n");
  180.     fprintf (files->inc, "\n//\t***** Describe the Entities  \t\n");
  181.     LISTdo (list, e, Entity);
  182.       ENTITYput_superclass (e);  /*  find supertype to use for single inheritance */
  183.       ENTITYprint_new(e, files, schema);
  184.     LISTod; 
  185.     
  186.     fprintf(files->init,"\n\tDescribeOtherTypes(reg);\n");
  187.     fprintf(files->init,"\n\tDoEntities(reg);\n"); 
  188.     fprintf(files->init,"\n\tDoSelects(reg);\n"); 
  189.     fprintf (files->init, "\n}\n"); 
  190.     
  191.     /*  fill in the values for the type descriptors */
  192.     /*  and print the enumerations  */
  193.     fprintf (files->inc, "\n//\t***** Describe the Other Types  \t\n"); 
  194.     fprintf(files->init,"Registry& DescribeOtherTypes(Registry& reg){\n");
  195.     SCOPEdo_types(scope,t,de)
  196.       TYPEprint_descriptions (t, files, schema);
  197.       if  (TYPEis_select (t) ) {
  198.     /*   do the select aggregates here  */
  199.     strncpy (nm, SelectName (TYPEget_name (t)), BUFSIZ);
  200.     fprintf (files -> inc, "class %ss;\n"
  201.          "typedef %ss * %ssH;\n",
  202.          nm,nm,nm);
  203.       }
  204.     SCOPEod;
  205.  
  206.     /*  build the typedefs  */
  207.     SCOPEdo_types(scope,t,de)
  208.       if( ! (TYPEis_select(t) ))
  209.     TYPEprint_typedefs (t, files ->inc);
  210.     SCOPEod;
  211.     fprintf(files->init,"return reg;\n}\n");
  212.     
  213.     /*  do the select definitions next, since they depend on the others  */
  214.     fprintf (files->inc, "\n//\t***** Build the SELECT Types  \t\n");
  215.     fprintf (files->init, "\n//\t***** Add the TypeDescriptor's to the SELECT Types  \t\n");
  216.     fprintf(files->init,"Registry& DoSelects(Registry& reg){\n");
  217.     SCOPEdo_types(scope,t,de)
  218.       if( TYPEis_select(t) )
  219.     TYPEselect_print (t, files, schema);
  220.     SCOPEod;
  221.     fprintf(files->init,"return reg;\n}\n");
  222.     fprintf (files -> inc, "\n/*\t**************  ENTITIES  \t*/\n");
  223.     fprintf (files -> lib, "\n/*\t**************  ENTITIES  \t*/\n");
  224.     fprintf(files->init,"Registry& DoEntities(Registry& reg){\n");
  225.     fprintf (files->inc, "\n//\t***** Print Entity Classes  \t\n");
  226.     
  227.     LISTdo (list, e, Entity);  
  228.     fprintf(files->init,"Registry& init%s(Registry& reg);\n",(char*)SCOPEget_name(e));
  229.     fprintf(files->init,"init%s(reg);\n",(char*)SCOPEget_name(e));
  230.     LISTod;
  231.     fprintf(files->init,"return reg;\n}\n"); 
  232.     
  233.     files->initent=fopen("ent_init.cpp","w"); 
  234.  
  235.     fprintf (files ->initent, "/* %cId$ */\n",'$');
  236.     fprintf(files->initent,"#ifndef  ENT_INIT_CPP\n");
  237.     fprintf(files->initent,"#define  ENT_INIT_CPP\n");
  238.     fprintf(files->initent,"#ifndef  S_SCHEMA_H \n\n");
  239.     fprintf(files->initent,"#include <s_schema.h> \n\n");
  240.     fprintf(files->initent,"\n#endif\n");
  241.     fprintf(files->initent,"\n#include <Registry.h>\n");
  242.     
  243.     LISTdo (list, e, Entity);
  244.     fprintf(files->initent,"Registry& init%s(Registry& reg){\n",(char*)SCOPEget_name(e));
  245.     ENTITYPrint(e, files,schema);
  246.     fprintf(files->initent,"return reg;\n}\n");
  247.     LISTod;
  248.     LISTfree(list);
  249.     fprintf(files->initent,"#endif\n\n");
  250.     
  251. #if following_should_be_done_in_caller
  252.     list = SCOPEget_schemata(scope);
  253.     fprintf (files -> inc, "\n/*\t**************  SCOPE  \t*/\n");
  254.     fprintf (files -> lib, "\n/*\t**************  SCOPE  \t*/\n");
  255.     
  256.     LISTdo (list, s, Schema)
  257.     sprintf(nm,"%s%s",SCHEMA_PREFIX,SCHEMAget_name(s));
  258.     fprintf(files->inc,"//    \t include definitions for %s \n", nm);
  259.         fprintf(files->inc,"#include <%s.h> \n", nm);
  260. #if 0
  261.         l = SCOPEget_imports(s);
  262.         fprintf (files -> inc, "/*  the following are *assumed* in the express schema  */\n");
  263.         LISTdo (l, s, Schema)
  264.         fprintf (files -> inc, "/*  include definitions for %s  */\n", 
  265.          nm = ClassName (SCHEMAget_name (s)));
  266. /*            fprintf (files -> inc, "#include <%s.h> \n", nm);*/
  267.         LISTod;
  268. #endif
  269.  
  270.     LISTod;
  271. #endif
  272.  
  273. #if 0
  274.     use_ref(schema,model,files);
  275. #endif  
  276.  
  277. }
  278.  
  279. #if 0
  280. /* simulate USE/REFERENCE by creating links */
  281. /* assignments have to be done after all initializations above */
  282. void
  283. use_ref(Schema schema,Express model,FILES *files)
  284. {
  285.     DictionaryEntry de;
  286.     Rename *r;
  287.  
  288.     DICTdo_init(schema->u.schema->usedict,&de);
  289.     while (0 != (r = (Rename *)DICTdo(&de))) {
  290.  
  291.     }
  292.  
  293.     DICTdo_init(schema->u.schema->refdict,&de);
  294.     while (0 != (r = (Rename *)DICTdo(&de))) {
  295.  
  296.     }
  297.  
  298.     LISTdo(schema->u.schema->uselist,r,Rename *)
  299.     LISTod
  300.  
  301.     LISTdo(schema->u.schema->reflist,r,Rename *)
  302.     LISTod
  303. }
  304. #endif
  305.  
  306. /******************************************************************
  307.  ** Procedure:    SCHEMAprint
  308.  ** Parameters:    const Schema schema    - schema to print
  309.  **        FILE*        file    - file on which to print
  310.  ** Returns:  
  311.  ** Description:  handles initialization of files specific to schemas
  312.  ** Side Effects:  
  313.  ** Status:  
  314.  ******************************************************************/
  315.  
  316. void
  317. SCHEMAPrint (Schema schema, FILES* files,Express model)
  318. {
  319.     char fnm [MAX_LEN], *np;
  320.     char schnm[MAX_LEN];
  321.     FILE* libfile;
  322.     FILE* incfile;
  323.     FILE* schemafile = files -> incall;
  324.     FILE* schemainit = files -> initall;
  325.     FILE* makefile = files -> make;
  326.     FILE *initfile;    
  327.     
  328.     /**********  create files based on name of schema    ***********/
  329.     /*  return if failure            */
  330.     /*  1.  header file                */
  331.     sprintf(schnm,"%s%s", SCHEMA_FILE_PREFIX, StrToUpper (SCHEMAget_name(schema)));
  332.     sprintf(fnm,"%s.h",schnm);
  333.  
  334.     if (! (incfile = (files -> inc) = FILEcreate (fnm)))  return;
  335.     fprintf (incfile, "/* %cId$  */ \n",'\044');
  336.     fprintf (incfile,"#ifdef __O3DB__\n");
  337.     fprintf (incfile,"#include <OpenOODB.h>\n");
  338.     fprintf (incfile,"#endif\n\n");
  339.     fprintf (incfile, 
  340.          "#ifndef  S_SCHEMA_H \n"
  341.          "#include <s_schema.h> \n"
  342.          "#endif \n");
  343.  
  344. /*    Generate local to SCHEMA.init.cc file  */
  345. /*    fprintf(incfile,"SchemaDescriptor *%s%s;\n",*/
  346. /*        SCHEMA_PREFIX,SCHEMAget_name(schema));*/
  347.  
  348. /*    fprintf (incfile, "extern void %sInit (Registry & r);\n", schnm);*/
  349. /*    fprintf (incfile, "extern void SchemaInit (Registry & r);\n");*/
  350.  
  351.     np = fnm + strlen (fnm) -1;    /*  point to end of constant part of string  */
  352.     
  353.    /*  2.  class source file            */
  354.     sprintf (np, "cpp");
  355.     if (! (libfile = (files -> lib) = FILEcreate (fnm)))  return;
  356.     fprintf (libfile, "/* %cId$  */ \n",'$');
  357. #ifdef SCHEMA_HANDLING
  358.     sprintf (np, "h");
  359.     fprintf (libfile, "#ifndef  %s\n", StrToConstant (fnm));
  360.     fprintf (libfile, "#include <%s.h> \n", schnm);
  361.     fprintf (libfile, "#endif");
  362. #else
  363.     fprintf (libfile, 
  364.          "#ifndef  S_SCHEMA_H \n"
  365.          "#include <s_schema.h> \n"
  366.          "#endif \n");
  367. #endif
  368.  
  369.     /*  3.  source code to initialize entity registry    */
  370.     /*  prints header of file for input function    */
  371.  
  372.     sprintf (np, "cpp");
  373.     if (! (initfile = (files -> init) = FILEcreate ("sdai_ini.cpp")))  return;
  374.     /* prevent RCS from expanding this! */
  375.     fprintf (initfile, "/* $Id%c */\n",'$');
  376. #ifdef SCHEMA_HANDLING
  377.     fprintf (initfile, "#include <%s.h> \n", schnm);
  378. #else
  379.     fprintf (initfile, 
  380.          "#ifndef  S_SCHEMA_H \n"
  381.          "#include <s_schema.h> \n"
  382.          "#endif \n");
  383. #endif
  384.     fprintf (initfile,"#include <Registry.h>\n");
  385.     fprintf(initfile,"Registry& DescribeOtherTypes(Registry& reg);\n\n");
  386.     fprintf(initfile,"Registry& DoEntities(Registry& reg);\n\n"); 
  387.     fprintf(initfile,"Registry& DoSelects(Registry& reg);\n\n");  
  388.     
  389.     fprintf (initfile,"void \n%sInit (Registry& reg)\n{\n", schnm);
  390.     fprintf(initfile,"\tSchemaDescriptor *  %s%s = new SchemaDescriptor(\"%s\");\n",
  391.         SCHEMA_PREFIX,SCHEMAget_name(schema),
  392.         PrettyTmpName (SCHEMAget_name(schema)));
  393.  
  394.     fprintf(initfile,"\treg.AddSchema (*%s%s);\n",
  395.         SCHEMA_PREFIX,SCHEMAget_name(schema));
  396.      
  397.     
  398.     
  399.     /**********  record in files relating to entire input     ***********/
  400.  
  401.     /*    add source files to list for makefile    */
  402.     fprintf (makefile, "\\\n\t%s.o ",schnm);
  403.     fprintf (makefile, "\\\n\t%s.init.o ",schnm);
  404.  
  405.     /*  add to schema's include and initialization file    */
  406.     fprintf (schemafile, "#include <%s.h> \n",schnm);
  407.     fprintf (schemafile, "extern void %sInit (Registry & r);\n", schnm);
  408.     fprintf (schemainit, "\t extern void %sInit (Registry & r);\n", schnm);
  409.     fprintf (schemainit, "\t %sInit (reg); \n",schnm);
  410.     
  411.     /**********  make an explicit makefile rule for the schema    ***********/
  412.     /*  replaced by list of source files (above) used with a general rule
  413.     in the makefile.  the code is here in case it is needed later    */
  414.  
  415. /*    fprintf (makefile, " \n%s.o:  %s.cc\n", schnm);
  416. //    fprintf (makefile, "\techo  \"compiling %s.cc\" \n", schnm);
  417. //    fprintf (makefile, "\tCC -I$(INCLUDE) -c %s.cc -L$(LIBS)\n", schnm);
  418. //    fclose (makefile);
  419. //    if ((makefile = fopen ("makefull", "a")) == NULL) {
  420. //    printf ("**Error in SCHEMAprint:  unable to open file sources ** \n");
  421. //    return;
  422. //    }
  423. */
  424.     
  425.     /**********  do the schemas    ***********/
  426.  
  427.     /* really, create calls for entity constructors */
  428.     SCOPEPrint(schema, files,schema,model);
  429.  
  430. #if 0
  431.     /* create calls for connecting sub/supertypes */
  432.     STypePrint(schema,files,schema);
  433. #endif
  434.  
  435.     /**********  close the files    ***********/
  436.     FILEclose (libfile);
  437.     FILEclose (incfile);
  438.     FILEclose (initfile);
  439.     
  440. }
  441.  
  442.  
  443. /******************************************************************
  444.  ** Procedure:  EXPRESSPrint
  445.  ** Parameters:  
  446.        Express express -- in memory representation of an express model
  447.        FIELS* files  -- set of output files to print to
  448.  ** Returns:  
  449.  ** Description:  drives functions to generate code for all the schemas
  450.  **    in an Express model into one set of files  -- works with 
  451.  **     print_schemas_combined
  452.  ** Side Effects:  generates code
  453.  ** Status:  24-Feb-1992 new -kcm
  454.  ******************************************************************/
  455. void
  456. EXPRESSPrint(Express express, FILES* files)
  457. {
  458.     char fnm [MAX_LEN], *np;
  459.     const char *  schnm;  /* schnm is really "express name" */
  460.     FILE* libfile;
  461.     FILE* incfile;
  462.     FILE* schemafile = files -> incall;
  463.     FILE* schemainit = files -> initall;
  464.     FILE* makefile = files -> make;
  465.     FILE *initfile;    
  466.     /* new */
  467.     Schema schema;
  468.     DictionaryEntry de;
  469.  
  470.     
  471.     /**********  create files based on name of schema    ***********/
  472.     /*  return if failure            */
  473.     /*  1.  header file                */
  474.     sprintf (fnm, "%s.h", schnm = ClassName (EXPRESSget_basename(express)));
  475.     if (! (incfile = (files -> inc) = FILEcreate (fnm)))  return;
  476.     fprintf (incfile, "/* %cId$ */\n",'$');
  477.     fprintf (incfile,"#ifdef __O3DB__\n");
  478.     fprintf (incfile,"#include <OpenOODB.h>\n");
  479.     fprintf (incfile,"#endif\n\n");
  480.     fprintf (incfile, "#include <sdai.h> \n");
  481. /*    fprintf (incfile, "#include <schema.h> \n");*/
  482. /*    fprintf (incfile, "extern void %sInit (Registry & r);\n", schnm);*/
  483.     
  484.     np = fnm + strlen (fnm) -1;    /*  point to end of constant part of string  */
  485.     
  486.    /*  2.  class source file            */
  487.     sprintf (np, "cpp");
  488.     if (! (libfile = (files -> lib) = FILEcreate (fnm)))  return;
  489.     fprintf (libfile, "/* %cId$ */\n",'$');
  490.     fprintf (libfile, "#include <%s.h> n", schnm);
  491.  
  492.     /*  3.  source code to initialize entity registry    */
  493.     /*  prints header of file for input function    */
  494.  
  495.     sprintf (np, "cpp");
  496.     if (! (initfile = (files -> init) = FILEcreate ("sdai_ini")))  return;
  497.     fprintf (initfile, "/* $Id%d */\n",'$');
  498.     fprintf (initfile, "#include <%s.h>\n\n", schnm);
  499.     fprintf (initfile, "void \n%sInit (Registry& reg)\n{\n", schnm);
  500.    
  501.     /**********  record in files relating to entire input     ***********/
  502.  
  503.     /*    add soruce files to list for makefile    */
  504.     fprintf (makefile, "\\\n    %s.o   ", schnm);
  505.     fprintf (makefile, "\\\n    %s.init.o   ", schnm);
  506.  
  507.     /*  add to schema's include and initialization file    */
  508.     fprintf (schemafile, "#include <%s.h>\n\n", schnm);
  509.     fprintf (schemafile, "extern void %sInit (Registry & r);\n", schnm);
  510.     fprintf (schemainit, "\t extern void %sInit (Registry & r);\n", schnm);
  511.     fprintf (schemainit, "\t %sInit (reg);\n", schnm);
  512.     
  513.     /**********  make an explicit makefile rule for the schema    ***********/
  514.     /*  replaced by list of source files (above) used with a general rule
  515.     in the makefile.  the code is here in case it is needed later    */
  516.  
  517. /*    fprintf (makefile, " \n%s.o:  %s.cc\n", schnm, schnm);
  518. //    fprintf (makefile, "\techo  \"compiling %s.cc\" \n", schnm);
  519. //    fprintf (makefile, "\tCC -I$(INCLUDE) -c %s.cc -L$(LIBS)\n", schnm);
  520. //    fclose (makefile);
  521. //    if ((makefile = fopen ("makefull", "a")) == NULL) {
  522. //    printf ("**Error in SCHEMAprint:  unable to open file sources ** \n");
  523. //    return;
  524. //    }
  525. */
  526.     
  527.     /**********  do all schemas    ***********/
  528.     DICTdo_init(express->symbol_table,&de);
  529.     while (0 != (schema = (Scope)DICTdo(&de))) {
  530.         SCOPEPrint(schema, files,schema,express);
  531.     }
  532.  
  533.  
  534.     /**********  close the files    ***********/
  535.     FILEclose (libfile);
  536.     FILEclose (incfile);
  537.     fprintf (initfile, "\n}\n");
  538.     FILEclose (initfile);
  539.     
  540. }
  541.  
  542. /******************************************************************
  543.  ** Procedure:  print_schemas_separate
  544.  ** Parameters:  
  545.        Express express -- in memory representation of an express model
  546.        FIELS* files  -- set of output files to print to
  547.  ** Returns:  
  548.  ** Description:  drives functions to generate code for all the schemas
  549.  **    in an Express model into separate sets of files - works with
  550.  **    SCHEMAPrint
  551.  ** Side Effects:  generates code
  552.  ** Status:  24-Feb-1992 new -kcm
  553.  ******************************************************************/
  554. void
  555. print_schemas_separate (Express express, FILES* files)  {
  556.     
  557.     DictionaryEntry de;
  558.     Schema schema;
  559.     
  560.     /**********  do all schemas    ***********/
  561.     DICTdo_init(express->symbol_table,&de);
  562.     while (0 != (schema = (Scope)DICTdo(&de))) {
  563.         SCHEMAPrint(schema, files,express);    
  564.     }
  565. }
  566.  
  567. /******************************************************************
  568.  ** Procedure:  print_schemas_combined
  569.  ** Parameters:  
  570.        Express express -- in memory representation of an express model
  571.        FIELS* files  -- set of output files to print to
  572.  ** Returns:  
  573.  ** Description:  drives functions to generate code for all the schemas
  574.  **    in an Express model into one set of files  -- works with EXPRESSPrint
  575.  ** Side Effects:  generates code
  576.  ** Status:  24-Feb-1992 new -kcm
  577.  ******************************************************************/
  578.  
  579. void
  580. print_schemas_combined (Express express, FILES* files)  {
  581.     
  582.     EXPRESSPrint(express, files);
  583. }
  584.  
  585. /*
  586. ** Procedure:    print_file
  587. ** Parameters:    const Schema schema    - top-level schema to print
  588. **        FILE*        file    - file on which to print
  589. ** Returns:    void
  590. ** Description:  this function calls one of two different functions 
  591. **    depending on whether the output should be combined into a single 
  592. **    set of files or a set separate set for each schema
  593. **
  594. */
  595.  
  596. void
  597. print_file(Express express)
  598. {
  599.     extern void RESOLUTIONsucceed(void);
  600.     int separate_schemas = 1;
  601.  
  602.     File_holder  files;
  603.  
  604.     resolution_success();
  605.     
  606.     print_file_header(express, &files);    
  607.     if (separate_schemas) {
  608.         print_schemas_separate (express, &files);
  609.     } else {
  610.         print_schemas_combined (express, &files);
  611.     }
  612.     print_file_trailer(express, &files);  
  613. }    
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.