annotate lwasm/pragma.c @ 379:d791d47afc48

Add m80ext pragma for Macro-80C compatibility and ignore END in includes For compatibility with Macro-80C source, add pragma for it. Also implement ignoring END in include files rather than treating it as the total end of assembly. Thanks to Erik G <erik@6809.org> for the patch.
author William Astle <lost@l-w.ca>
date Mon, 13 Jul 2015 20:59:02 -0600
parents 67373a053c49
children 6ee9c67a0f8d
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 },
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
73 { 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
74 };
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
75
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
76 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
77 {
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 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
79 int i;
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
80 const char *np = str;
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
81 int pragmas = as -> 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
82
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
83 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
84 {
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
85 p = lw_token(np, ',', &np);
259
0c4b3e8b4d0b Fix pragma nosymbolcase interaction with -D
William Astle <lost@l-w.ca>
parents: 210
diff changeset
86 debug_message(as, 200, "Setting pragma %s", p);
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
87 for (i = 0; set_pragmas[i].setstr; i++)
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
88 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
89 if (!strcasecmp(p, set_pragmas[i].setstr))
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
90 {
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
91 pragmas |= set_pragmas[i].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
92 goto out;
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
93 }
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
94 if (!strcasecmp(p, set_pragmas[i].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
95 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
96 pragmas &= ~(set_pragmas[i].flag);
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
97 goto out;
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
98 }
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
99 }
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
100 /* unrecognized pragma here */
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 if (!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 lw_free(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 return 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
105 }
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 out:
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 lw_free(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
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 as -> pragmas = 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
110 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
111 }
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
112
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
113 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
114 {
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 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
116
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
117 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
118 /* 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
119
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
120 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
121 *p = t;
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
122
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
123 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
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 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
126 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
127 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
128 }
81
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 56
diff changeset
129 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
130 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
131 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
132 }
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
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
134 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
135 {
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 char *ps, *t;
85
8fa52c3f2970 Make *pragma work correctly
lost@l-w.ca
parents: 81
diff changeset
137
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 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
139 /* 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
140
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
141 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
142 *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
143
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
144 l -> len = 0;
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
145
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
146 // *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
147 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
148 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
149 l -> pragmas |= PRAGMA_NOLIST;
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
150 if (as->pragmas & PRAGMA_CC)
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
151 {
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
152 l->pragmas |= PRAGMA_CC;
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
153 as->pragmas &= ~PRAGMA_CC;
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
154 }
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
155 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
156 }
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
157
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
158 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
159 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
160 int flag = *((int *)d);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
161 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
162
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
163 if (pse -> flag == flag)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
164 return 1;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
165 return 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
166 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
167
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
168 PARSEFUNC(pseudo_parse_starpragmapop)
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 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
171 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
172 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
173 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
174 struct pragma_stack_entry *pse;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
175
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
176 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
177 /* do nothing */ ;
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 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
180 *p = t;
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 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
183
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
184 // *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
185 np = ps;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
186
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
187 while (np)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
188 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
189 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
190 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
191 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
192 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
193 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
194 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
195 if (pse)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
196 {
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
197 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
198 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
199 lw_free(pse);
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 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
202 l -> pragmas |= PRAGMA_NOLIST;
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 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
205 lw_free(pp);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
206 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
207
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
208 lw_free(ps);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
209 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
210
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
211 PARSEFUNC(pseudo_parse_starpragmapush)
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 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
214 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
215 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
216 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
217 struct pragma_stack_entry *pse;
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 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
220 /* do nothing */ ;
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 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
223 *p = t;
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 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
226
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
227 // *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
228 np = ps;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
229
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
230 while (np)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
231 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
232 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
233 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
234 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
235 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
236 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
237 /* found set or reset pragma */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
238 /* push pragma state */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
239 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
240 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
241 /* use set string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
242 t = (char *)set_pragmas[i].setstr;
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 else
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
245 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
246 /* use reset string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
247 t = (char *)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 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
250 pse -> flag = set_pragmas[i].flag;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
251 pse -> magic = 0x42424242;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
252 strcpy((char *)&(pse -> str), t);
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
253 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
254
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
255 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
256
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
257 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
258 l -> pragmas |= PRAGMA_NOLIST;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
259 }
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 lw_free(pp);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
262 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
263
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
264 lw_free(ps);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
265 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
266