summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mixlib/mix_parser.c7
-rw-r--r--mixlib/mix_scanner.l43
-rw-r--r--mixlib/xmix_parser.h7
-rw-r--r--po/ca.po20
4 files changed, 54 insertions, 23 deletions
diff --git a/mixlib/mix_parser.c b/mixlib/mix_parser.c
index 82dd692..1b876ad 100644
--- a/mixlib/mix_parser.c
+++ b/mixlib/mix_parser.c
@@ -442,7 +442,8 @@ mix_parser_set_future_ref (mix_parser_t *parser, const gchar *name)
/* Redefine the value of a local symbol as the current loc_count */
void
-mix_parser_manage_local_symbol (mix_parser_t *parser, const gchar *name)
+mix_parser_manage_local_symbol (mix_parser_t *parser, const gchar *name,
+ mix_short_t value)
{
gchar ref[3];
ref[2] = 0;
@@ -459,10 +460,10 @@ mix_parser_manage_local_symbol (mix_parser_t *parser, const gchar *name)
ref[0] = name[0];
ref[1] = 'F';
if ( parser->status == MIX_PERR_NOCOMP )
- update_future_refs_ (parser, ref);
+ update_future_refs_value_ (parser, ref, value);
ref[1] = 'B';
mix_symbol_table_insert (parser->symbol_table, ref,
- mix_short_to_word_fast (parser->loc_count));
+ mix_short_to_word_fast (value));
break;
default:
return;
diff --git a/mixlib/mix_scanner.l b/mixlib/mix_scanner.l
index c6ed5d8..c5529da 100644
--- a/mixlib/mix_scanner.l
+++ b/mixlib/mix_scanner.l
@@ -37,20 +37,28 @@
g_free (symbol); \
symbol = NULL; \
} \
+ if (lsymbol != NULL) \
+ { \
+ g_free (lsymbol); \
+ lsymbol = NULL; \
+ } \
} while (FALSE)
-#define NEXT() \
- do { \
- parser->loc_count++; \
- RESET (); \
- ++lineno; \
- BEGIN (INITIAL); \
+#define NEXT() \
+ do { \
+ if (lsymbol != NULL) \
+ mix_parser_manage_local_symbol (parser,lsymbol, \
+ loc); \
+ parser->loc_count++; \
+ RESET (); \
+ ++lineno; \
+ BEGIN (INITIAL); \
} while (FALSE)
#define ADD_INS() \
do { \
mix_parser_add_ins (parser, &ins, lineno); \
- NEXT (); \
+ NEXT (); \
} while (FALSE)
#define ADD_RAW(value) \
@@ -140,7 +148,8 @@ wexpr {expr}({fpart})?(,{expr}({fpart})?)*
gboolean nof = FALSE, is_fp = FALSE, end = FALSE, lsf = FALSE;
mix_word_t expr_val = MIX_WORD_ZERO, wexpr_val = MIX_WORD_ZERO,
wexpr_val_tmp = MIX_WORD_ZERO;
- gchar *symbol = NULL;
+ gchar *symbol = NULL, *lsymbol = NULL;
+ mix_address_t loc = MIX_SHORT_ZERO;
guint lineno = 1;
mix_ins_fill_from_id (ins, mix_NOP);
ins.address = 0;
@@ -172,9 +181,25 @@ wexpr {expr}({fpart})?(,{expr}({fpart})?)*
<LOC>{
{ws}+ BEGIN (OP); /* LOC field is empty */
{locsymbol} { /* manage local symbol */
- mix_parser_manage_local_symbol (parser,yytext);
+ loc = get_ploc_ (parser);
+ lsymbol = g_strdup (yytext);
+ if ( lsymbol == NULL ) {
+ mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE);
+ return MIX_PERR_INTERNAL;
+ }
BEGIN (OP);
}
+ {locsymbol}/({ws}+EQU) {/* local symbol with value */
+ loc = get_ploc_ (parser);
+ symbol = g_strdup (yytext);
+ lsymbol = g_strdup (yytext);
+ if ( symbol == NULL || lsymbol == NULL) {
+ mix_parser_log_error (parser, MIX_PERR_INTERNAL, lineno, NULL, FALSE);
+ return MIX_PERR_INTERNAL;
+ }
+ symbol[1] = 'B'; /* this will be referred as nB afterwards */
+ BEGIN (OP);
+ }
{flocsymbol}|{blocsymbol} RETURN_ERROR (MIX_PERR_UNEX_LOC, yytext);
{symbol}/({ws}+EQU) { /* store symbol name for future definition */
symbol = g_strdup (yytext);
diff --git a/mixlib/xmix_parser.h b/mixlib/xmix_parser.h
index bbcd108..2584be7 100644
--- a/mixlib/xmix_parser.h
+++ b/mixlib/xmix_parser.h
@@ -56,6 +56,10 @@ typedef struct ins_node_
/* functions to manipulate mix_parser_t during compilation */
+
+/* access loc counter */
+#define get_ploc_(parser) ((parser)->loc_count)
+
/* symbol table */
/* Define a new symbol with given value
* and update previously set refs to this symbol
@@ -76,7 +80,8 @@ mix_parser_set_future_ref(mix_parser_t *parser, const gchar *name);
/* Redefine the value of a local symbol as the current loc_count */
extern void
-mix_parser_manage_local_symbol(mix_parser_t *parser, const gchar *name);
+mix_parser_manage_local_symbol(mix_parser_t *parser, const gchar *name,
+ mix_short_t value);
/* Literal strings symbols */
extern void
diff --git a/po/ca.po b/po/ca.po
index 1f787a7..72d0581 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -4,7 +4,7 @@
msgid ""
msgstr ""
"Project-Id-Version: mdk 0.1\n"
-"POT-Creation-Date: 2000-11-02 00:16+0100\n"
+"POT-Creation-Date: 2000-11-13 23:11+0100\n"
"PO-Revision-Date: 2000-02-28 01:37+01:00\n"
"Last-Translator: jose antonio ortega ruiz <jaortega@retemail.es>\n"
"Language-Team: jose antonio ortega ruiz <jaortega@retemail.es>\n"
@@ -440,12 +440,12 @@ msgstr ""
msgid "No system resources"
msgstr "no hi ha recursos al sistema"
-#: mixlib/mix_parser.c:324
+#: mixlib/mix_parser.c:333
#, c-format
msgid "\t%s\t(line %d)\n"
msgstr " %s (línia %d)\n"
-#: mixlib/mix_parser.c:343
+#: mixlib/mix_parser.c:352
#, c-format
msgid ""
"*** %s%s: compilation summary ***\n"
@@ -454,11 +454,11 @@ msgstr ""
"*** %s%s: resum de la compilació\n"
"\n"
-#: mixlib/mix_parser.c:346
+#: mixlib/mix_parser.c:355
msgid "*** Address / Compiled word / Symbolic rep / Source file line\n"
msgstr "*** Adreça / Paraula compilada / Repr. simbólica / Núm. línia\n"
-#: mixlib/mix_parser.c:350
+#: mixlib/mix_parser.c:359
#, c-format
msgid ""
"\n"
@@ -467,7 +467,7 @@ msgstr ""
"\n"
"*** Adreça d'inici: %d\n"
-#: mixlib/mix_parser.c:352
+#: mixlib/mix_parser.c:361
msgid ""
"\n"
"*** Symbol table\n"
@@ -475,7 +475,7 @@ msgstr ""
"\n"
"*** Taula de símbols\n"
-#: mixlib/mix_parser.c:354
+#: mixlib/mix_parser.c:363
msgid ""
"\n"
"*** End of summary ***\n"
@@ -483,15 +483,15 @@ msgstr ""
"\n"
"*** Fi del resum ***\n"
-#: mixlib/mix_parser.c:484
+#: mixlib/mix_parser.c:499
msgid "Unable to allocate memory"
msgstr "Memòria dinàmica insuficient"
-#: mixlib/mix_parser.c:512
+#: mixlib/mix_parser.c:527
msgid "warning"
msgstr "advertència"
-#: mixlib/mix_parser.c:512
+#: mixlib/mix_parser.c:527
msgid "error"
msgstr "error"