annotate lwasm/pragma.c @ 399:6153cb49403c

Initial commit of pragma newsource pragma newsource enables a source code variant as follows: 1. no line numbers 2. no implied comments at the end of lines 3. all comments must be introduced by a comment character 4. spaces are allowed in operands (4) is not quite complete. This commit handles "operandless" instructions (anything where the parser calls skip_operand()) and expression parsing.
author William Astle <lost@l-w.ca>
date Tue, 13 Oct 2015 23:38:02 -0600
parents 4fd16faa4d93
children c501b3ce39c8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
1 /*
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
2 pragma.c
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
3
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
4 Copyright © 2010 William Astle
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
5
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
6 This file is part of LWTOOLS.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
7
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
9 terms of the GNU General Public License as published by the Free Software
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
10 Foundation, either version 3 of the License, or (at your option) any later
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
11 version.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
12
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
13 This program is distributed in the hope that it will be useful, but WITHOUT
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
16 more details.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
17
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along with
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
19 this program. If not, see <http://www.gnu.org/licenses/>.
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
20 */
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
21
2
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
22 #include <string.h>
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
23 #include <ctype.h>
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
24
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
25 #include <lw_string.h>
2
7317fbe024af Clean up insane number of compiler warnings under -Wall
lost@l-w.ca
parents: 0
diff changeset
26 #include <lw_alloc.h>
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
27
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
28 #include "lwasm.h"
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
29 #include "instab.h"
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
30 #include "input.h"
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
31
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
32 struct pragma_list
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
33 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
34 const char *setstr;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
35 const char *resetstr;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
36 int flag;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
37 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
38
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
39 struct pragma_stack_entry
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
40 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
41 int magic; // must always be at the start of any input stack entry
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
42 int flag; // the pragma flag bit
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
43 char str[1]; // magic number - this will be allocated bigger
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
44 // string will be what's needed to re-instate a pragma
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
45 };
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
46
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
47 static const struct pragma_list set_pragmas[] =
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
48 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
49 { "dollarnotlocal", "nodollarnotlocal", PRAGMA_DOLLARNOTLOCAL },
118
b6b8c2645f5c Add back the dollarlocal and nodollarlocal pragma strings for compatibility with the documentation.
lost@l-w.ca
parents: 115
diff changeset
50 { "nodollarlocal", "dollarlocal", PRAGMA_DOLLARNOTLOCAL },
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
51 { "noindex0tonone", "index0tonone", PRAGMA_NOINDEX0TONONE },
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
52 { "undefextern", "noundefextern", PRAGMA_UNDEFEXTERN },
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
53 { "cescapes", "nocescapes", PRAGMA_CESCAPES },
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
54 { "importundefexport", "noimportundefexport", PRAGMA_IMPORTUNDEFEXPORT },
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
55 { "pcaspcr", "nopcaspcr", PRAGMA_PCASPCR },
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
56 { "shadow", "noshadow", PRAGMA_SHADOW },
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
57 { "nolist", "list", PRAGMA_NOLIST },
115
344cfc25afec Added initial infrastructure for pragma autobranchlength (suggested by Ebonhand on irc)
lost@l-w.ca
parents: 110
diff changeset
58 { "autobranchlength", "noautobranchlength", PRAGMA_AUTOBRANCHLENGTH },
206
080bb67d84f2 Add export pragma
William Astle <lost@l-w.ca>
parents: 118
diff changeset
59 { "export", "noexport", PRAGMA_EXPORT },
207
07e1fac76321 Added pragma to allow non case sensitive symbols
William Astle <lost@l-w.ca>
parents: 206
diff changeset
60 { "symbolnocase", "nosymbolnocase", PRAGMA_SYMBOLNOCASE },
07e1fac76321 Added pragma to allow non case sensitive symbols
William Astle <lost@l-w.ca>
parents: 206
diff changeset
61 { "nosymbolcase", "symbolcase", PRAGMA_SYMBOLNOCASE },
210
5d969517db74 Added condundefzero pragma
William Astle <lost@l-w.ca>
parents: 207
diff changeset
62 { "condundefzero", "nocondundefzero", PRAGMA_CONDUNDEFZERO },
367
c6d2a1f54e0c Change processor target variations to pragmas.
William Astle <lost@l-w.ca>
parents: 343
diff changeset
63 { "6809", "6309", PRAGMA_6809 },
333
507f442dc71e Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents: 259
diff changeset
64 { "6800compat", "no6800compat", PRAGMA_6800COMPAT },
343
98f3e016cfd8 Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents: 333
diff changeset
65 { "forwardrefmax", "noforwardrefmax", PRAGMA_FORWARDREFMAX },
375
71f507f404f1 Add "testmode" pragma
William Astle <lost@l-w.ca>
parents: 370
diff changeset
66 { "testmode", "notestmode", PRAGMA_TESTMODE },
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
67 { "c", "noc", PRAGMA_C },
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
68 { "cc", "nocc", PRAGMA_CC },
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
69 { "cd", "nocd", PRAGMA_CD },
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
70 { "ct", "noct", PRAGMA_CT },
377
67373a053c49 Add ?rts target for branch instructions
William Astle <lost@l-w.ca>
parents: 376
diff changeset
71 { "qrts", "noqrts", PRAGMA_QRTS },
379
d791d47afc48 Add m80ext pragma for Macro-80C compatibility and ignore END in includes
William Astle <lost@l-w.ca>
parents: 377
diff changeset
72 { "m80ext", "nom80ext", PRAGMA_M80EXT },
385
4fd16faa4d93 Add various "convenience" ops
William Astle <lost@l-w.ca>
parents: 384
diff changeset
73 { "6809conv", "no6809conv", PRAGMA_6809CONV },
4fd16faa4d93 Add various "convenience" ops
William Astle <lost@l-w.ca>
parents: 384
diff changeset
74 { "6309conv", "no6309conv", PRAGMA_6309CONV },
399
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 385
diff changeset
75 { "newsource", "nonewsource", PRAGMA_NEWSOURCE },
6153cb49403c Initial commit of pragma newsource
William Astle <lost@l-w.ca>
parents: 385
diff changeset
76 { "nooldsource", "oldsource", PRAGMA_NEWSOURCE },
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
77 { 0, 0, 0 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
78 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
79
384
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
80 int parse_pragma_helper(char *p)
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
81 {
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
82 int i;
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
83
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
84 for (i = 0; set_pragmas[i].setstr; i++)
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
85 {
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
86 if (!strcasecmp(p, set_pragmas[i].setstr))
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
87 {
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
88 return set_pragmas[i].flag;
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
89 return 1;
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
90 }
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
91 if (!strcasecmp(p, set_pragmas[i].resetstr))
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
92 {
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
93 return set_pragmas[i].flag | PRAGMA_CLEARBIT;
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
94 return 2;
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
95 }
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
96 }
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
97
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
98 return 0;
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
99 }
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
100
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
101 int parse_pragma_string(asmstate_t *as, char *str, int ignoreerr)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
102 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
103 char *p;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
104 const char *np = str;
384
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
105 int pragma;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
106
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
107 while (np)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
108 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
109 p = lw_token(np, ',', &np);
384
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
110 debug_message(as, 200, "Setting/resetting pragma %s", p);
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
111 pragma = parse_pragma_helper(p);
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
112 lw_free(p);
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
113
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
114 if (pragma == 0 && !ignoreerr)
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
115 return 0;
384
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
116
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
117 if (pragma & PRAGMA_CLEARBIT)
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
118 as->pragmas &= ~pragma;
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
119 else
6ee9c67a0f8d Add conditional for testing if a pragma is in effect
William Astle <lost@l-w.ca>
parents: 379
diff changeset
120 as->pragmas |= pragma;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
121 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
122 return 1;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
123 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
124
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
125 PARSEFUNC(pseudo_parse_pragma)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
126 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
127 char *ps, *t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
128
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
129 for (t = *p; *t && !isspace(*t); t++)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
130 /* do nothing */ ;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
131
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
132 ps = lw_strndup(*p, t - *p);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
133 *p = t;
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
134
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
135 l -> len = 0;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
136
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
137 if (parse_pragma_string(as, ps, 0) == 0)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
138 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
139 lwasm_register_error(as, l, E_PRAGMA_UNRECOGNIZED);
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
140 }
81
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 56
diff changeset
141 if (as -> pragmas & PRAGMA_NOLIST)
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 56
diff changeset
142 l -> pragmas |= PRAGMA_NOLIST;
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
143 lw_free(ps);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
144 }
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
145
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
146 PARSEFUNC(pseudo_parse_starpragma)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
147 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
148 char *ps, *t;
85
8fa52c3f2970 Make *pragma work correctly
lost@l-w.ca
parents: 81
diff changeset
149
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
150 for (t = *p; *t && !isspace(*t); t++)
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
151 /* do nothing */ ;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
152
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
153 ps = lw_strndup(*p, t - *p);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
154 *p = t;
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
155
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
156 l -> len = 0;
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
157
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
158 // *pragma must NEVER throw an error
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
159 parse_pragma_string(as, ps, 1);
81
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 56
diff changeset
160 if (as -> pragmas & PRAGMA_NOLIST)
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 56
diff changeset
161 l -> pragmas |= PRAGMA_NOLIST;
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
162 if (as->pragmas & PRAGMA_CC)
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
163 {
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
164 l->pragmas |= PRAGMA_CC;
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
165 as->pragmas &= ~PRAGMA_CC;
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
166 }
0
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
167 lw_free(ps);
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
168 }
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
169
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
170 static int pragma_stack_compare(input_stack_entry *e, void *d)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
171 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
172 int flag = *((int *)d);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
173 struct pragma_stack_entry *pse = (struct pragma_stack_entry *)e;
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
174
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
175 if (pse -> flag == flag)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
176 return 1;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
177 return 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
178 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
179
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
180 PARSEFUNC(pseudo_parse_starpragmapop)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
181 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
182 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
183 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
184 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
185 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
186 struct pragma_stack_entry *pse;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
187
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
188 for (t = *p; *t && !isspace(*t); t++)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
189 /* do nothing */ ;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
190
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
191 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
192 *p = t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
193
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
194 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
195
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
196 // *pragma stuff must never throw an error
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
197 np = ps;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
198
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
199 while (np)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
200 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
201 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
202 for (i = 0; set_pragmas[i].setstr; i++)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
203 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
204 if (!strcasecmp(pp, set_pragmas[i].setstr) || !strcasecmp(pp, set_pragmas[i].resetstr))
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
205 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
206 pse = (struct pragma_stack_entry *)input_stack_pop(as, 0x42424242, pragma_stack_compare, (void *)&(set_pragmas[i].flag));
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
207 if (pse)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
208 {
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
209 debug_message(as, 100, "Popped pragma string %s", pse->str);
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
210 parse_pragma_string(as, (char *)&(pse->str), 1);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
211 lw_free(pse);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
212 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
213 if (set_pragmas[i].flag == PRAGMA_NOLIST)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
214 l -> pragmas |= PRAGMA_NOLIST;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
215 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
216 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
217 lw_free(pp);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
218 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
219
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
220 lw_free(ps);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
221 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
222
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
223 PARSEFUNC(pseudo_parse_starpragmapush)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
224 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
225 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
226 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
227 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
228 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
229 struct pragma_stack_entry *pse;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
230
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
231 for (t = *p; *t && !isspace(*t); t++)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
232 /* do nothing */ ;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
233
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
234 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
235 *p = t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
236
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
237 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
238
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
239 // *pragma stuff must never throw an error
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
240 np = ps;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
241
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
242 while (np)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
243 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
244 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
245 for (i = 0; set_pragmas[i].setstr; i++)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
246 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
247 if (!strcasecmp(pp, set_pragmas[i].setstr) || !strcasecmp(pp, set_pragmas[i].resetstr))
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
248 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
249 /* found set or reset pragma */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
250 /* push pragma state */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
251 if (as -> pragmas & (set_pragmas[i].flag))
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
252 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
253 /* use set string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
254 t = (char *)set_pragmas[i].setstr;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
255 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
256 else
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
257 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
258 /* use reset string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
259 t = (char *)set_pragmas[i].resetstr;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
260 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
261 pse = lw_alloc(sizeof(struct pragma_stack_entry) + strlen(t));
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
262 pse -> flag = set_pragmas[i].flag;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
263 pse -> magic = 0x42424242;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
264 strcpy((char *)&(pse -> str), t);
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
265 debug_message(as, 100, "Pushed pragma string %s", pse->str);
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
266
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
267 input_stack_push(as, (input_stack_entry *)pse);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
268
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
269 if (set_pragmas[i].flag == PRAGMA_NOLIST)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
270 l -> pragmas |= PRAGMA_NOLIST;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
271 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
272 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
273 lw_free(pp);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
274 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
275
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
276 lw_free(ps);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
277 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
278