* main.c
*
* Copyright (C) 2015 Alexander Andrejevic <theflash AT sdf DOT lonestar DOT org>
- * Copyright (C) 2015, 2019 Jason Self <j@jxself.org>
+ * Copyright (C) 2015, 2019, 2020 Jason Self <j@jxself.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-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 <string>
-#include <list>
-using namespace std;
+//
+//#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_numberOfInstructions; ++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]);
+
+ string file_name = argv[optind];
+ Parsing_Context pc;
+
+#ifdef WIN32
+ char delimeter = '\\';
+#else
+ char delimeter = '/';
+#endif
+
+ if (file_name.rfind(delimeter) == string::npos)
+ {
+ pc.current_directory = "";
+ pc.current_file_name = file_name;
+ }
+ else
+ {
+ pc.current_directory = file_name.substr(0, file_name.rfind(delimeter)+1);
+ pc.current_file_name = file_name.substr(file_name.rfind(delimeter)+1);
+ }
+ g_parsing_contexts.push(pc);
- for (int i = optind; i < argc; i++)
- parse_file (argv[i]);
- 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;
}