Added ability to define multiple functions (without parameters) and
[zilutils.git] / zilasm / main.cpp
index 68846b03da7fb491cf82c6861d67baf59a8bdc8b..e7bd734b755f1906d51f1f1c05b49c13417903db 100644 (file)
  *
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <string>
-#include <list>
-#include <stack>
-using namespace std;
-
-
-extern "C"
-{
-#include <strings.h>
-}
-#include <getopt.h>
-#include <time.h>
-#include <ctype.h>
-#include "config.h"
-#include "header.h"
-extern "C"
-{
-#include "opcodes.h"
-}
-#include "parser.h"
-
-
+//
+//#include <stdio.h>
+//#include <stdlib.h>
+//#include <stdarg.h>
+//#include <string.h>
+//#include <string>
+//#include <list>
+//#include <stack>
+//#include <list>
+//#include <vector>
+//using namespace std;
+//
+//
+//extern "C"
+//{
+//#include <strings.h>
+//}
+//#include <getopt.h>
+//#include <time.h>
+//#include <ctype.h>
+//#include "config.h"
+//#include "header.h"
+//extern "C"
+//{
+//#include "opcodes.h"
+//}
+//#include "directives.h"
+//#include "parser.h"
+//#include "compiler.h"
+
+
+#include "include_all.h"
 
 const int DEFAULT_ZVERSION = 6;
 
 enum
 { ZVERSION = 11, ZORKID, ZSERIAL };
 
-enum
-{ FAIL = -1, OK = 0, NEED_RESTART = 1 };
+
 
 static struct option const long_options[] = {
   {"help", no_argument, NULL, 'h'},
@@ -66,152 +70,24 @@ static struct option const long_options[] = {
 };
 
 
-typedef struct
-{
-  int todo;
-} Opcode_dict;
 
 
-struct
-{
-  int zversion;                        /* 0 - 8     */
-  int zorkid;                  /* 0 - 65535 */
-  char zserial[7];             /* YYMMDD    */
-  Opcode_dict *opcode_dict;
-} Config;
 
 
-struct String_Table_Elem
-{
-  string value;                        // value in ASCII format
-  int index;
-};
 
 
-class CMain
-{
-public:
-  CMain ();
-  int assembly ();
-  void fill_config (void);
-  void get_arguments (int argc, char *argv[], char *envp[]);
-
-  char *get_output_file_name ();
-private:
-  char *m_output_file;
-    list < String_Table_Elem > m_string_table;
-  int m_code_size;
-
-
-  char *build_output_filename (const char basename[], const char *suffix);
-  void fill_zserial (void);
-  void new_file_suffix (char *result, size_t maxlen, const char *src,
-                       const char *newsuffix);
-
-  void output_code_section ();
-
-  void parse_intarg (int *dest, const char name[], int min, int max,
-                    int defval);
-  void parse_zserial (void);
-  void print_usage (int failed);
-  void print_version ();
-  void wrong_arg (const char *err, ...);
-
-};
-
-
-CMain::CMain ():m_output_file (NULL)
-{
-}
-
-int
-CMain::assembly ()
-{
-  FILE *file = fopen (m_output_file, "wb");
-  if (file)
-    {
-      program_header_reset (6);
-      int size = sizeof (Program_header);
 
-      Program_header.mode = 0;
-      Program_header.release = 1;      // game version
 
-      int code_start_offset = 64;
-      Program_header.startPC = code_start_offset >> 2;
-
-      m_code_size = 0;
-      ZMemblock *zmem_code = zmem_init (65536);
-
-      /// write zero number of local variables
-      zmem_putbyte (zmem_code, 0);     // number of local variables
-      ++m_code_size;
-
-      // write instructions' codes
-      for (int i = 0; i < g_number_of_instructions; ++i)
-       {
-         for (int j = 0; j < g_codes[i]->used_size; ++j)
-           {
-             zmem_putbyte (zmem_code, g_codes[i]->contents[j]);
-             ++m_code_size;
-           }
-       }
-
-      if (m_code_size & 7)
-       m_code_size += 8 - (m_code_size & 7);
-
-      Program_header.dynamic_size = 8;
-
-      //Program_header.h_file_size = 33;  //sizeof(Program_header) + zmb->used_size;
-
-      //m_code_size = 8;
-
-      Word stringTableOffset = m_code_size;
-      Program_header.H_STRINGS_OFFSET = (64 + stringTableOffset) >> 3;
-
-      int stringTableSize = 64;
-      Program_header.h_file_size =
-       (code_start_offset + m_code_size + stringTableSize) >> 3;
-      ZMemblock *zmb = zmem_init (Program_header.h_file_size * 8);
-
-      for (int i = 0; i < m_code_size; ++i)
-       zmem_putbyte (zmb, zmem_code->contents[i]);
-
-      zmem_destroy (zmem_code);
-
-      //zmem_putbyte(zmb, 0); // number of local variables
-      //zmem_putbyte(zmb, 141); // print addr command
-
-      //Word offset = 0;
-      //zmem_putbyte(zmb, (offset >> 8) & 255);
-      //zmem_putbyte(zmb, offset & 255);
-
-      //zmem_putbyte(zmb, 186); // quit command
-
-      // output zeros until string table begins
-      while (zmb->used_size < stringTableOffset)
-       zmem_putbyte (zmb, 0);
-      //
-      //// fill string table with one string
-      //add_string_to_string_table("Hello, World!", zmb);
-
-      outputToFile (&Program_header, file);
-      fwrite (zmb->contents, zmb->allocated_size, 1, file);
-      fclose (file);
-    }
-
-  return OK;
-}
-
-
-char *
-CMain::get_output_file_name ()
+struct
 {
-  return m_output_file;
-}
-
+       int zversion;                   /* 0 - 8     */
+       int zorkid;                     /* 0 - 65535 */
+       char zserial[7];                /* YYMMDD    */
+       Opcode_dict *opcode_dict;
+} Config;
 
 void
-CMain::get_arguments (int argc, char *argv[], char *envp[])
+CCompiler::get_arguments (int argc, char *argv[], char *envp[])
 {
   int opt = 0;
   while ((opt = getopt_long (argc, argv, "hVo:", long_options, NULL)) != -1)
@@ -265,7 +141,7 @@ CMain::get_arguments (int argc, char *argv[], char *envp[])
 
 
 void
-CMain::wrong_arg (const char *err, ...)
+CCompiler::wrong_arg (const char *err, ...)
 {
   if (err)
     {
@@ -280,7 +156,7 @@ CMain::wrong_arg (const char *err, ...)
 
 
 void
-CMain::print_version ()
+CCompiler::print_version ()
 {
   printf (PACKAGE_STRING "\n"
          "License AGPLv3+: GNU AGPL version 3 or later\n"
@@ -292,7 +168,7 @@ CMain::print_version ()
 
 
 void
-CMain::print_usage (int failed)
+CCompiler::print_usage (int failed)
 {
   printf ("Usage: " PACKAGE_NAME " [OPTION...] [FILES...]\n"
          "\n"
@@ -308,7 +184,7 @@ CMain::print_usage (int failed)
 }
 
 void
-CMain::fill_zserial (void)
+CCompiler::fill_zserial (void)
 {
   time_t t;
   struct tm *timeinfo;
@@ -319,7 +195,7 @@ CMain::fill_zserial (void)
 
 
 void
-CMain::fill_config (void)
+CCompiler::fill_config (void)
 {
   bzero (&Config, sizeof (Config));
   Config.zversion = DEFAULT_ZVERSION;
@@ -328,7 +204,7 @@ CMain::fill_config (void)
 
 
 void
-CMain::parse_intarg (int *dest, const char name[], int min, int max,
+CCompiler::parse_intarg (int *dest, const char name[], int min, int max,
                     int defval)
 {
   if (!optarg)
@@ -348,7 +224,7 @@ CMain::parse_intarg (int *dest, const char name[], int min, int max,
 
 
 void
-CMain::parse_zserial (void)
+CCompiler::parse_zserial (void)
 {
   if (!optarg)
     {
@@ -372,7 +248,7 @@ CMain::parse_zserial (void)
 
 
 void
-CMain::new_file_suffix (char *result, size_t maxlen, const char *src,
+CCompiler::new_file_suffix (char *result, size_t maxlen, const char *src,
                        const char *newsuffix)
 {
   strncpy (result, src, maxlen);
@@ -392,7 +268,7 @@ CMain::new_file_suffix (char *result, size_t maxlen, const char *src,
 
 
 char *
-CMain::build_output_filename (const char basename[], const char *suffix)
+CCompiler::build_output_filename (const char basename[], const char *suffix)
 {
   int n = strlen (basename) + strlen (suffix);
   char *ofile = (char *) malloc (n + 1);       /* todo!!! check for NULL. free. */
@@ -410,24 +286,22 @@ init_assembly (void)
 
 
 void
-CMain::output_code_section ()
+CCompiler::output_code_section ()
 {
 
 }
 
 
-
 int
 main (int argc, char *argv[], char *envp[])
 {
-  CMain main;
+  CCompiler compiler;
 
-  main.fill_config ();
-  main.get_arguments (argc, argv, envp);
+  compiler.fill_config ();
+  compiler.get_arguments (argc, argv, envp);
   init_opcodes (Config.zversion, 0);
 
-  init_parser ();
-
+  
        //for (int i = optind; i < argc; i++)
        //      parse_file(argv[i]);
   
@@ -452,12 +326,12 @@ main (int argc, char *argv[], char *envp[])
   }
   g_parsing_contexts.push(pc);
 
-  parse_file();// argv[optind]);
-  if ( !g_haveErrors )
-       main.assembly ();
+  compiler.parser.parse_file();// argv[optind]);
+  if ( !compiler.parser.have_errors())
+       compiler.assembly ();
 
   /* TODO! List global symbols */
   /* TODO! Find abbreviations */
-  relase_parser ();
+  //relase_parser ();
   return 0;
 }