annotate lwasm/pragma.c @ 344:55c1f9a321e9

Add S-record output support to lwlink Thanks to a patch from Joachim Ga?ler <achim@diegasslers.de>, lwlink now has output support for S-records. This is output only - it does not add input support for S-record files.
author William Astle <lost@l-w.ca>
date Thu, 09 Apr 2015 12:27:33 -0600
parents 98f3e016cfd8
children c6d2a1f54e0c
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 },
333
507f442dc71e Add support for 6800 compatibility instructions.
William Astle <lost@l-w.ca>
parents: 259
diff changeset
63 { "6800compat", "no6800compat", PRAGMA_6800COMPAT },
343
98f3e016cfd8 Add pragma to turn off forward reference optimization
William Astle <lost@l-w.ca>
parents: 333
diff changeset
64 { "forwardrefmax", "noforwardrefmax", PRAGMA_FORWARDREFMAX },
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
65 { 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
66 };
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
67
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
68 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
69 {
2c24602be78f Initial import from lwtools 3.0.1 version, with new hand built build system and file reorganization
lost@l-w.ca
parents:
diff changeset
70 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
71 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
72 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
73 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
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 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
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 p = lw_token(np, ',', &np);
259
0c4b3e8b4d0b Fix pragma nosymbolcase interaction with -D
William Astle <lost@l-w.ca>
parents: 210
diff changeset
78 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
79 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
80 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
81 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
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 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
84 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
85 }
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
86 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
87 {
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
88 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
89 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
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 }
2c24602be78f 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 /* 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
93 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
94 {
2c24602be78f 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 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
96 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
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 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
99 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
100 }
2c24602be78f 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 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
102 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
103 }
2c24602be78f 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 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
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 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
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 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
110 /* 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
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 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
113 *p = t;
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
114
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
115 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
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 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
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 lwasm_register_error(as, l, "Unrecognized pragma string");
2c24602be78f 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 }
81
428068681cbf Added nolist pragma to suppress listing output of non-code generating lines
Lost Wizard (lost@starbug3)
parents: 56
diff changeset
121 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
122 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
123 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
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
2c24602be78f 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 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
127 {
2c24602be78f 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 char *ps, *t;
85
8fa52c3f2970 Make *pragma work correctly
lost@l-w.ca
parents: 81
diff changeset
129
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 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
131 /* 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
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 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
134 *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
135
56
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
diff changeset
136 l -> len = 0;
337301ddf74a Fixed error with pragma and *pragma directives
lost@l-w.ca
parents: 53
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 // *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
139 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
140 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
141 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
142 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
143 }
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
144
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
145 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
146 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
147 int flag = *((int *)d);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
148 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
149
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
150 if (pse -> flag == flag)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
151 return 1;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
152 return 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
153 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
154
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
155 PARSEFUNC(pseudo_parse_starpragmapop)
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 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
158 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
159 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
160 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
161 struct pragma_stack_entry *pse;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
162
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
163 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
164 /* do nothing */ ;
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 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
167 *p = t;
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 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
170
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
171 // *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
172 np = ps;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
173
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
174 while (np)
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 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
177 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
178 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
179 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
180 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
181 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
182 if (pse)
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
183 {
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
184 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
185 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
186 lw_free(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 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
189 l -> pragmas |= PRAGMA_NOLIST;
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 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
192 lw_free(pp);
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
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
195 lw_free(ps);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
196 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
197
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
198 PARSEFUNC(pseudo_parse_starpragmapush)
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 char *ps, *t;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
201 char *pp;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
202 int i;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
203 const char *np;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
204 struct pragma_stack_entry *pse;
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 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
207 /* do nothing */ ;
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 ps = lw_strndup(*p, t - *p);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
210 *p = t;
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 l -> len = 0;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
213
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
214 // *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
215 np = ps;
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 while (np)
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 pp = lw_token(np, ',', &np);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
220 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
221 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
222 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
223 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
224 /* found set or reset pragma */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
225 /* push pragma state */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
226 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
227 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
228 /* use set string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
229 t = (char *)set_pragmas[i].setstr;
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 else
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
232 {
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
233 /* use reset string */
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
234 t = (char *)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 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
237 pse -> flag = set_pragmas[i].flag;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
238 pse -> magic = 0x42424242;
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
239 strcpy((char *)&(pse -> str), t);
110
38c1537857ce Pragma stack at parse stage now works
lost@l-w.ca
parents: 108
diff changeset
240 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
241
108
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
242 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
243
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
244 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
245 l -> pragmas |= PRAGMA_NOLIST;
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 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
248 lw_free(pp);
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
249 }
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
250
9960e05cbe3a Added *pragmapush and *pragmapop; still seems to be nonfunctional
lost@l-w.ca
parents: 85
diff changeset
251 lw_free(ps);
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