*
* 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'},
};
-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)
void
-CMain::wrong_arg (const char *err, ...)
+CCompiler::wrong_arg (const char *err, ...)
{
if (err)
{
void
-CMain::print_version ()
+CCompiler::print_version ()
{
printf (PACKAGE_STRING "\n"
"License AGPLv3+: GNU AGPL version 3 or later\n"
void
-CMain::print_usage (int failed)
+CCompiler::print_usage (int failed)
{
printf ("Usage: " PACKAGE_NAME " [OPTION...] [FILES...]\n"
"\n"
}
void
-CMain::fill_zserial (void)
+CCompiler::fill_zserial (void)
{
time_t t;
struct tm *timeinfo;
void
-CMain::fill_config (void)
+CCompiler::fill_config (void)
{
bzero (&Config, sizeof (Config));
Config.zversion = DEFAULT_ZVERSION;
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)
void
-CMain::parse_zserial (void)
+CCompiler::parse_zserial (void)
{
if (!optarg)
{
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);
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. */
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]);
}
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;
}