Added ability to define multiple functions (without parameters) and
[zilutils.git] / zilasm / directives.cpp
index d15ba894ca7b90237735282d1b02676f7e3fbdbd..94c39f982313c9c1c9707e7a36a05992394c0ab6 100644 (file)
  * SPDX-License-Identifier: AGPL-3.0-or-later
  */
 
-#include <stdlib.h>            /* bsearch */
-#include <string.h>            /* strcmp */
-#include <stdio.h>
-#include <stack>
-#include <string>
-using namespace std;
-
-#include "header.h"
-#include "parser.h"
-#include "directives.h"
+#include "include_all.h"
 
 #define ARRAY_SIZE(x)  ((sizeof(x)) / (sizeof(x[0])))
 
@@ -38,63 +29,65 @@ stack<FILE*> g_fileHandlers;
 
 
 static int
-byte_handler (const char *args)
+byte_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-end_handler (const char *args)
+end_handler (const char *args, CParser* parser)
 {
        g_stopParsing = 1;
        return 0;
 }
 
 static int
-endi_handler (const char *args)
+endi_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-endt_handler (const char *args)
+endt_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-fstr_handler (const char *args)
+fstr_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-funct_handler (const char *args)
+funct_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
-  return 0;
+  
+       parser->add_function(args);
+       return 0;
 }
 
 static int
-gstr_handler (const char *args)
+gstr_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-gvar_handler (const char *args)
+gvar_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-insert_handler (const char *args)
+insert_handler (const char *args, CParser* parser)
 {
        string file_name;
        char *p = (char*)args;
@@ -146,113 +139,90 @@ insert_handler (const char *args)
        //pc.current_file_name = s;
        g_parsing_contexts.push(pc);
        
-       
-       unsigned saveLineNumber = g_currentLineNumber;
-       parse_file(); //s.c_str());
-       g_currentLineNumber = saveLineNumber;
+       unsigned saveLineNumber = parser->m_current_line_number;
+       parser->parse_file(); //s.c_str());
+       parser->m_current_line_number = saveLineNumber;
        return strlen(args);
 }
 
 static int
-len_handler (const char *args)
+len_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-newdirective_handler (const char *args)
+newdirective_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-object_handler (const char *args)
+object_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-prop_handler (const char *args)
+prop_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-str_handler (const char *args)
+str_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-strl_handler (const char *args)
+strl_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-table_handler (const char *args)
+table_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-vocbeg_handler (const char *args)
+vocbeg_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-vocend_handler (const char *args)
+vocend_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-word_handler (const char *args)
+word_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
 static int
-zword_handler (const char *args)
+zword_handler (const char *args, CParser* parser)
 {
   /* !!! TODO !!! */
   return 0;
 }
 
-// Sorted array
-static Directive Directives[] = {
-  "BYTE", byte_handler,
-  "END", end_handler,
-  "ENDI", endi_handler,
-  "ENDT", endt_handler,
-  "FSTR", fstr_handler,
-  "FUNCT", funct_handler,
-  "GSTR", gstr_handler,
-  "GVAR", gvar_handler,
-  "INSERT", insert_handler,
-  "LEN", len_handler,
-  "NEW", newdirective_handler,
-  "OBJECT", object_handler,
-  "PROP", prop_handler,
-  "STR", str_handler,
-  "STRL", strl_handler,
-  "TABLE", table_handler,
-  "VOCBEG", vocbeg_handler,
-  "VOCEND", vocend_handler,
-  "WORD", word_handler,
-  "ZWORD", zword_handler
-};
+
 
 typedef struct
 {
@@ -274,11 +244,40 @@ namecmp (const void *key, const void *elem)
 }
 
 Directive_handler
-directive_lookup (const char *name, unsigned namelen)
+CDirectives::directive_lookup (const char *name, unsigned namelen)
 {
-  Name n = { name, namelen };
+       // Sorted array
+       static Directive Directives[] = {
+               "BYTE", byte_handler,
+               "END", end_handler,
+               "ENDI", endi_handler,
+               "ENDT", endt_handler,
+               "FSTR", fstr_handler,
+               "FUNCT", funct_handler,
+               "GSTR", gstr_handler,
+               "GVAR", gvar_handler,
+               "INSERT", insert_handler,
+               "LEN", len_handler,
+               "NEW", newdirective_handler,
+               "OBJECT", object_handler,
+               "PROP", prop_handler,
+               "STR", str_handler,
+               "STRL", strl_handler,
+               "TABLE", table_handler,
+               "VOCBEG", vocbeg_handler,
+               "VOCEND", vocend_handler,
+               "WORD", word_handler,
+               "ZWORD", zword_handler
+       };
+       
+       Name n = { name, namelen };
   Directive *p =
     (Directive *) bsearch (&n, Directives, ARRAY_SIZE (Directives),
                           sizeof (Directive), namecmp);
   return p ? p->handler : NULL;
 }
+
+
+CDirectives::CDirectives(CParser *parser) :m_parser(parser)
+{
+}
\ No newline at end of file