annotate lwasm/pragma.c @ 377:67373a053c49

Add ?rts target for branch instructions Add a ?rts target for branch instructions, which brances to the nearest RTS or inverts the branch logic to branch around a generated RTS. Activated by a pragma "qrts". Thanks to Erik G <erik@6809.org> for the patch.
author William Astle <lost@l-w.ca>
date Mon, 13 Jul 2015 20:50:02 -0600
parents 35d4213e6657
children d791d47afc48
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 },
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
72 { 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
73 };
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 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
76 {
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 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
78 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
79 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
80 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
81
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 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
83 {
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 p = lw_token(np, ',', &np);
259
0c4b3e8b4d0b Fix pragma nosymbolcase interaction with -D
William Astle <lost@l-w.ca>
parents: 210
diff changeset
85 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
86 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
87 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
88 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
89 {
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 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
91 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
92 }
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
93 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
94 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
95 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
96 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
97 }
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 /* 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
100 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
101 {
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 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
103 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
104 }
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 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
106 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
107 }
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 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
109 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
110 }
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 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
113 {
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 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
115
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 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
117 /* 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
118
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 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
120 *p = t;
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
121
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
122 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
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 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
125 {
370
8764142b3192 Convert internal error/warning handling framework to a new unified system
William Astle <lost@l-w.ca>
parents: 367
diff changeset
126 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
127 }
81
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 56
diff changeset
128 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
129 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
130 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
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
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 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
134 {
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 char *ps, *t;
85
8fa52c3f2970 Make *pragma work correctly
lost@l-w.ca
parents: 81
diff changeset
136
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
137 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
138 /* 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
139
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 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
141 *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
142
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
143 l -> len = 0;
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
144
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
145 // *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
146 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
147 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
148 l -> pragmas |= PRAGMA_NOLIST;
376
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
149 if (as->pragmas & PRAGMA_CC)
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
150 {
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
151 l->pragmas |= PRAGMA_CC;
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
152 as->pragmas &= ~PRAGMA_CC;
35d4213e6657 Add cycle counting to listing
William Astle <lost@l-w.ca>
parents: 375
diff changeset
153 }
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
154 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
155 }
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
156
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
157 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
158 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
159 int flag = *((int *)d);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
160 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
161
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
162 if (pse -> flag == flag)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
163 return 1;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
164 return 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
165 }
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 PARSEFUNC(pseudo_parse_starpragmapop)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
168 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
169 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
170 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
171 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
172 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
173 struct pragma_stack_entry *pse;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
174
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
175 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
176 /* do nothing */ ;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
177
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
178 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
179 *p = t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
180
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
181 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
182
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
183 // *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
184 np = ps;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
185
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
186 while (np)
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 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
189 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
190 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
191 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
192 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
193 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
194 if (pse)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
195 {
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
196 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
197 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
198 lw_free(pse);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
199 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
200 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
201 l -> pragmas |= PRAGMA_NOLIST;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
202 }
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 lw_free(pp);
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
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
207 lw_free(ps);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
208 }
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 PARSEFUNC(pseudo_parse_starpragmapush)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
211 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
212 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
213 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
214 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
215 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
216 struct pragma_stack_entry *pse;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
217
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
218 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
219 /* do nothing */ ;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
220
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
221 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
222 *p = t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
223
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
224 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
225
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
226 // *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
227 np = ps;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
228
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
229 while (np)
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 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
232 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
233 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
234 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
235 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
236 /* found set or reset pragma */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
237 /* push pragma state */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
238 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
239 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
240 /* use set string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
241 t = (char *)set_pragmas[i].setstr;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
242 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
243 else
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
244 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
245 /* use reset string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
246 t = (char *)set_pragmas[i].resetstr;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
247 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
248 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
249 pse -> flag = set_pragmas[i].flag;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
250 pse -> magic = 0x42424242;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
251 strcpy((char *)&(pse -> str), t);
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
252 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
253
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
254 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
255
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
256 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
257 l -> pragmas |= PRAGMA_NOLIST;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
258 }
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 lw_free(pp);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
261 }
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 lw_free(ps);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
264 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
265